Скриптинг курилка

Такая проблема:
Мне нужно вызвать функцию через CallRemoteFunction, у которой один из аргументов типа "&argument" (возвращает значение прямо в указанную на его месте переменную). Скажем, для наглядности, этой функцией будет SetVehicleZAngle. Тогда вопрос: Как мне это сделать? Ведь указав её аргументы без "&", при выполнении кода будет краш, укажу - ошибка компилятора. Вот опять-же для наглядности код:

pawn Код:
fpublic: my_SetVehicleZAngle(vehicleid, &Float:z_angle) //fpublic = forward + public
{
    //...
    return SetVehicleZAngle(vehicleid, z_angle);
}

stock hook_SetVehicleZAngle(vehicleid, &Float:z_angle) return CallRemoteFunction("my_SetVehicleZAngle", "if", vehicleid, z_angle); //Вот здесь ошибка..

#if defined _ALS_SetVehicleZAngle
    #undef SetVehicleZAngle
#else
    #define _ALS_SetVehicleZAngle
#endif
#define SetVehicleZAngle hook_SetVehicleZAngle
Reply

Quote:
Originally Posted by OstGot
Посмотреть сообщение
Такая проблема:
Мне нужно вызвать функцию через CallRemoteFunction, у которой один из аргументов типа "&argument" (возвращает значение прямо в указанную на его месте переменную). Скажем, для наглядности, этой функцией будет SetVehicleZAngle. Тогда вопрос: Как мне это сделать? Ведь указав её аргументы без "&", при выполнении кода будет краш, укажу - ошибка компилятора. Вот опять-же для наглядности код:

pawn Код:
fpublic: my_SetVehicleZAngle(vehicleid, &Float:z_angle) //fpublic = forward + public
{
    //...
    return SetVehicleZAngle(vehicleid, z_angle);
}

stock hook_SetVehicleZAngle(vehicleid, &Float:z_angle) return CallRemoteFunction("my_SetVehicleZAngle", "if", vehicleid, z_angle); //Вот здесь ошибка..

#if defined _ALS_SetVehicleZAngle
    #undef SetVehicleZAngle
#else
    #define _ALS_SetVehicleZAngle
#endif
#define SetVehicleZAngle hook_SetVehicleZAngle
Во-первых, какая ошибка, у меня твой код прекрасно компилируется?!
Во-вторых, на кой черт тут ретурны если данные функции ни чего не возвращают?
В-третьих, только быдлокодеры пренебрегают фигурными скобками!
Reply

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Во-первых, какая ошибка, у меня твой код прекрасно компилируется?!
Во-вторых, на кой черт тут ретурны если данные функции ни чего не возвращают?
В-третьих, только быдлокодеры пренебрегают фигурными скобками!
Да-да-да)
Всё это понятно, и к конечному коду таких претензий нет (это что-то типо примера было), но факт остаётся фактом - при выполнении кода, то есть вызове функции сервер крашится, крашдетект пишет на неё и на CallRemoteFunction , и даже ошибка мне ясна. А вот как её исправить - я не знаю.
Чтобы вообще наглядно было - вот:

pawn Код:
fpublic: my_SetVehicleZAngle(vehicleid, &Float:z_angle) //fpublic = forward + public
{
    SetVehicleZAngle(vehicleid, z_angle);
    //Код...
    return 0;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    CallRemoteFunction("my_SetVehicleZAngle", "if", vehicleid, z_angle); //Код компилится - при выполнении краш.
    return 1;
}
Конкретнее даже: Как сделать так, что CallRemoteFunction могла вызвать my_SetVehicleZAngle с параметром "&z_angle", а не "z_angle".
Reply

& даёт ссылку на переменную, в которую должно записаться значение. Она обычно используется в функциях типа Get. И что мешает вообще сделать так:
pawn Код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
    my_SetVehicleZAngle(vehicleid, z_angle);
    return 1;
}
Reply

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
& даёт ссылку на переменную, в которую должно записаться значение. Она обычно используется в функциях типа Get. И что мешает вообще сделать так:
pawn Код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
    my_SetVehicleZAngle(vehicleid, z_angle);
    return 1;
}
Возможно то что my_SetVehicleZAngle находится в филтрскрипте, а вызов в гейммоде.
Reply

Есть строка, такого типа "32|213", как можно данные до знака | извлечь в одну переменную, а после - в другую?
Reply

Не пойму.
PHP код:
switch(id)
{
case 
0:
{
new 
mes[128];
new 
team_name[6][2] = {"d","o","v","e","z","f"}; // если убрать данную переменную, то всё впорядке
format(messizeof(mes),"%s"team_name[random(6)]);
SendClientMessage(playerid, -1mes);
}
case 
1:
{
new 
mes[128]; // если team_name определена, то выводит: "Символ "mes" уже определен".
}

Reply

Quote:
Originally Posted by vampir9763
Посмотреть сообщение
Есть строка, такого типа "32|213", как можно данные до знака | извлечь в одну переменную, а после - в другую?
Используй sscanf.

PHP код:
new temp[6] = "45|32"ab;
sscanf(temp"p<|>ii"ab); 
Reply

Quote:
Originally Posted by Dembel
Посмотреть сообщение
Не пойму.
PHP код:
switch(id)
{
case 
0:
{
new 
mes[128];
new 
team_name[6][2] = {"d","o","v","e","z","f"}; // если убрать данную переменную, то всё впорядке
format(messizeof(mes),"%s"team_name[random(6)]);
SendClientMessage(playerid, -1mes);
}
case 
1:
{
new 
mes[128]; // если team_name определена, то выводит: "Символ "mes" уже определен".
}

Это одна область видимости переменных.
Reply

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Это одна область видимости переменных.
Как же так, если team_name не определена, то и error пропадает.
Reply

Quote:
Originally Posted by Makar007
Посмотреть сообщение
Ткните пожалуйста почему павно ругается на код, похоже я ослеп.
PHP код:
        if (!strcmp(type"coordinates"true))
        {
            static
                
float:x,
                
float:y,
                
float:z;
            
            if (
sscanf(string"fff"xyz)) return SendSyntaxMessage(playerid"/goto [coordinates] [coordinates]");
            
SetPlayerPos(playeridxyz); // Ругается на эту строку.
            
return SendServerMessage(playerid"сообщение наверно - {800000}%f, %f, %f."xyz);
        } 
А да забыл, warning 213: tag mismatch
Потому что float с маленькой буквы написан.

UPD: Опередили...
Reply

Часть mysql_log.txt:
Код:
[15:59:55] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
Что означает - понятно, но как узнать в каком месте кода? Вызовов cache_get_field_content() в коде - несколько сотен. Визуальный осмотр не выявил ничего подозрительного, где такое может быть (а все места, где и могло быть - исправлены). OnQueryError() не вызывается (почему?). Плагин - MYSQL от BlueG 39-2
Reply

Quote:
Originally Posted by Bombo
Посмотреть сообщение
Часть mysql_log.txt:
Код:
[15:59:55] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
Что означает - понятно, но как узнать в каком месте кода? Вызовов cache_get_field_content() в коде - несколько сотен. Визуальный осмотр не выявил ничего подозрительного, где такое может быть (а все места, где и могло быть - исправлены). OnQueryError() не вызывается (почему?). Плагин - MYSQL от BlueG 39-2
Можно попробовать так:

pawn Код:
stock _cache_get_field_content_int(row, const field_name[], connectionHandle = 1)
{
    printf("cache_get_field_content_int debug: row - %d, field_name - %s", row, field_name);
   
    return cache_get_field_content_int(row, field_name, connectionHandle);
}
#define cache_get_field_content_int(%0) _cache_get_field_content_int(%0)
И потом по времени сверить.
Reply

Quote:
Originally Posted by Bombo
Посмотреть сообщение
Часть mysql_log.txt:
Код:
[15:59:55] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
[16:00:14] [ERROR] cache_get_field_content_int - invalid datatype
[16:00:14] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')
Что означает - понятно, но как узнать в каком месте кода? Вызовов cache_get_field_content() в коде - несколько сотен. Визуальный осмотр не выявил ничего подозрительного, где такое может быть (а все места, где и могло быть - исправлены). OnQueryError() не вызывается (почему?). Плагин - MYSQL от BlueG 39-2
По поводу invalid row index ('0') - циклы есть? У меня такое было когда использовал циклы.

А cache_get_field_content_int - invalid datatype, не то что-то пытаешся узнать. Либо Float либо string, смотри внимательнее все cache_get_field_content_int.

OnQueryError() не вызывается потому, что ошибки в запросе то и нет, ты не правильно получаешь данные из кеша.
Reply

Quote:
Originally Posted by stabker
Посмотреть сообщение
Можно попробовать так:

pawn Код:
stock _cache_get_field_content_int(row, const field_name[], connectionHandle = 1)
{
    printf("cache_get_field_content_int debug: row - %d, field_name - %s", row, field_name);
   
    return cache_get_field_content_int(row, field_name, connectionHandle);
}
#define cache_get_field_content_int(%0) _cache_get_field_content_int(%0)
И потом по времени сверить.
Спасибо огромное! Помогло!


Quote:
Originally Posted by lost13
Посмотреть сообщение
По поводу invalid row index ('0') - циклы есть? У меня такое было когда использовал циклы.

А cache_get_field_content_int - invalid datatype, не то что-то пытаешся узнать. Либо Float либо string, смотри внимательнее все cache_get_field_content_int.

OnQueryError() не вызывается потому, что ошибки в запросе то и нет, ты не правильно получаешь данные из кеша.
Quote:
Originally Posted by Bombo
Посмотреть сообщение
Что означает - понятно
Для тех, кто не знает смысл этих сообщений об ошибках:
[ERROR] cache_get_field_content_int - invalid datatype : скорее всего значение запрашиваемого поля NULL
[ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0') : такое часто происходит при смене кэша результата. Для избежания необходимо запоминать кэш:
Код:
new Cache:result;
...
result = mysql_query(gMysql, "SELECT id FROM tab LIMIT 1");
а непосредственно перед выводом значения поля - восстанавливать:
Код:
new id;
...
cache_set_active(result, gMysql);
id = cache_get_field_content_int(0, "id", gMysql);
Reply

Кто нить тестил защиту от спуфа коннектами? Как это работает? Какой предел ложных подключений в секунду? По идее серверу где то нужно хранить ип адреса пока они не ответили серверу
Reply

Quote:
Originally Posted by Jon_De
Посмотреть сообщение
Кто нить тестил защиту от спуфа коннектами? Как это работает? Какой предел ложных подключений в секунду? По идее серверу где то нужно хранить ип адреса пока они не ответили серверу
Пробовал. Не получилось)
Всё просто: программка-флудер пишет, мол, версия сервера и её версия не совпадают (она для 0.3z), а попытаться хотя бы быстро реконнектнуться - соб не обновили, клео на пашут(крашатся)..

Встречный вопрос)
Начну с описания ситуации: у меня есть много дефайнов типа

pawn Код:
#define Warning_1 "текст предупреждения"
#define Warning_2 "текст предупреждения"
//и т.д.
Возможно ли хоть как-то узнать, добавлен ли "Warning_/*[любое число]*/"?
Ну тоесть, по ситуации у меня есть куча задефайненных варнингов. В коде мне нужно проверить, если любой номер варнинга задефайнен - выводим сообщение. Варнинги у меня добавляются по такому принципу:

pawn Код:
#if defined //бла-бла-бла, тут у нас причина 1 варнинга
#define Warning_1 "текст предупреждения"
#elseif defined //бла-бла-бла, тут у нас причина 2 варнинга
#define Warning_2 "текст предупреждения"
#endif
//Т.е. если условие подойдёт, например, под первый - второй уже не задефайнится
Тут есть ещё два варианта реализации: задефайнить "общую" константу этих варнингов (дефайнить её с каждым варнингом), и второй вариант - делать кучу проверок в конечном коде на задефайненность каждого варнинга, что-то типо того:

pawn Код:
#if defined Warning_1
print(Warning_1);
#elseif defined Warning_2
print(Warning_1);
//и т.д.
и загвоздка в том, что мне они не очень подходят
В обоих вариантах очень много лишнего кода, либо он много раз повторяется. Вот именно поэтому возник вопрос про реализацию описанного в самом начале.
P.s. Если так сделать нельзя, напишите, мне просто интересно)
Reply

Quote:

Пробовал. Не получилось)
Всё просто: программка-флудер пишет, мол, версия сервера и её версия не совпадают (она для 0.3z), а попытаться хотя бы быстро реконнектнуться - соб не обновили, клео на пашут(крашатся).

прога ничего и не должна писать. она должна отсылать пакет коннекта. мне интересна реакция сервера, если ему прислать 50к пакетов коннекта в секунду. вы чем то не тем пробовали видимо
Reply

Quote:
Originally Posted by Jon_De
Посмотреть сообщение
прога ничего и не должна писать. она должна отсылать пакет коннекта. мне интересна реакция сервера, если ему прислать 50к пакетов коннекта в секунду. вы чем то не тем пробовали видимо
Возможно, в любом случае,к релизу будет всё известно)
Reply

Как определить есть ли на заданных координатах x,y,z машина?
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)