Из беглого просмотра кода наткнулся на пару небольших опечаток
stock WP_SetPlayerWeaponAmmo(id, wp_weapon, wp_ammo)
{
if(wp_weapon < 0 || wp_weapon > 46 || wp_weapon == 39 || wp_weapon == 40) return printf("[ERROR Weapon PLUS] INVALID WEAPON ID \"%i\"", wp_weapon);
if(wp_weapon < 0) return printf("[ERROR Weapon PLUS] INVALID AMMO AMOUNT \"%i\"", wp_ammo); //Здесь (wp_ammo < 0)
wp[id][ammo][GetWeaponSlot(wp_weapon)] += wp_ammo;
return 1;
}
stock WP_SetPlayerWeaponMag(id, wp_weapon, wp_ammo)
{
if(wp_weapon < 0 || wp_weapon > 46 || wp_weapon == 39 || wp_weapon == 40) return printf("[ERROR Weapon PLUS] INVALID WEAPON ID \"%i\"", wp_weapon);
if(wp_weapon < 0) return printf("[ERROR Weapon PLUS] INVALID AMMO AMOUNT \"%i\"", wp_ammo); //И здесь
wp[id][mag][GetWeaponSlot(wp_weapon)] += wp_ammo;
return 1;
}
//И ещё в некоторых похожих функциях ниже
SooBad (17 Апрель 2018 - 14:56) писал:
С макросами прокатывает абсолютно то же самое. Правда, придётся писать чуть больше кода.
Практический пример (если я правильно тебя понял):
Скрытый текст [Показать]
#define TEST_MACROS 30
main()
{
new playerid = 1;
CallLocalFunction("OnPlayerCommandText", "ds", playerid, "/test");
//console: result - 40 (если не понял - мы просто банально сымитировали вызов команды)
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/test", true))
{
#if defined TEST_MACROS
#if TEST_MACROS == 30
#undef TEST_MACROS
#define TEST_MACROS 40
#else
#undef TEST_MACROS
#define TEST_MACROS 30
#endif
#endif
printf("%d", TEST_MACROS);
return 1;
}
return 0;
}
Не прокатит, потому что работают они совершенно иначе: изменённое значение макроса распространяется только на код, который идёт дальше этого изменения, и более того, изменения произойдёт независимо от обычных "runtime-условий" в коде.
Вот как пример два простых куска кода, которые ломают весь алгоритм с твоим редефайном вместо нормальной переменной:
1) Выведем значения макроса ещё раз до его фактического изменения, но после выполнения функции, в которой он изменяется:
Скрытый текст [Показать]
#define TEST_MACROS 30
main()
{
new playerid = 1;
CallLocalFunction("OnPlayerCommandText", "ds", playerid, "/test");
printf("2: %d", TEST_MACROS); //Вот что мы добавили
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/test", true))
{
#if defined TEST_MACROS
#if TEST_MACROS == 30
#undef TEST_MACROS
#define TEST_MACROS 40
#else
#undef TEST_MACROS
#define TEST_MACROS 30
#endif
#endif
printf("1: %d", TEST_MACROS);
return 1;
}
return 0;
}
Результаты:
1: 40
2: 30
2) Вызовем вообще совершенно другую команду, чтобы никакие обычные условия для редефайна не сработали:
Скрытый текст [Показать]
#define TEST_MACROS 30
main()
{
new playerid = 1;
CallLocalFunction("OnPlayerCommandText", "ds", playerid, "/ghkdfhg");
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/test", true))
{
#if defined TEST_MACROS
#if TEST_MACROS == 30
#undef TEST_MACROS
#define TEST_MACROS 40
#else
#undef TEST_MACROS
#define TEST_MACROS 30
#endif
#endif
return 1;
}
printf("%d", TEST_MACROS); //Переместили вывод сюда, чтобы вывело итог для любой команды
return 0;
}
Результаты:
40
Сообщение отредактировал Nexius: 17 Апрель 2018 - 21:14