- Ошибка
-
multi_jump.sma(483) : error 017: undefined symbol "g_iJumps"
multi_jump.sma(483) : warning 215: expression has no effect
multi_jump.sma(483) : error 001: expected token: ";", but found "]"
multi_jump.sma(483) : error 029: invalid expression, assumed zero
multi_jump.sma(483) : fatal error 107: too many error messages on one line
- Компилятор
- Локальный
- Amx Mod X
- 1.9.0
- Исходный код
-
#include <amxmodx>
#include <reapi>
#define PLUGIN_NAME "Multi Jump"
#define PLUGIN_DATE "21.04.2018"
#define PLUGIN_AUTHOR "w0w"
#if AMXX_VERSION_NUM < 183
#include <colorchat>
const MAX_NAME_LENGTH = 32
#endif
#define rg_get_user_team(%0) TeamName:get_member(%0, m_iTeam)
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
// Флаг доступа. Если закомментировано - для всех если нет покупки.
// Default: не закомментировано & ADMIN_LEVEL_H
#define ACCESS_FLAG ADMIN_LEVEL_H
// Автоматический двойной прыжок, то есть, после прыжка вы подпрыгнете еще раз.
// Default: закомментировано.
//#define AUTO_DOUBLE_JUMP
#if defined AUTO_DOUBLE_JUMP
// Сила прыжка.
// Default value: "350.0"
#define ADJ_VELOCITY 350.0
#endif
// Количество дополнительных прыжков.
// Default value: "1"
#define ADDITIONAL_JUMPS 1
// Выдача дополнительных прыжков через консольную команду. Если закомментировано - не работает.
// Default: не закомментировано.
//#define MJ_CONSOLE_CMD
#if defined MJ_CONSOLE_CMD
// Консольная команда для выдачи дополнительных прыжков.
// Default value: "amx_mjgive"
new const g_szGiveCmd[] = "amx_mjgive"
// Флаг доступа к команде выдачи дополнительных прыжков.
// Default value: "ADMIN_RCON"
#define GIVE_ACCESS_FLAG ADMIN_RCON
// Если у игрока нет прав и он ввёл команду.
// 0 - игроку будет выводиться "Unknown command: amx_mjgive"; вместо amx_mjgive команда что у вас указана в g_szGiveCmd.
// 1 - игроку будет видно только то что он ввёл команду.
// 2 - игроку будет написано "У вас недостаточно прав для использования этой команде"; см. NO_ACC_COM в "data/lang/common.txt".
// Default value: "0"
#define MJ_ACCESS_DENY_MODE 0
// Выводить сообщения в чат или нет. Закомментировать если не нужно выводить сообщения.
// Default: не закомментировано.
#define MJ_MESSAGES
#if defined MJ_MESSAGES
// Отображение сообщения воскрешения.
// 0 - отображать только себе и тому кого воскресили.
// 1 - отображать всему серверу.
// Default value: "0"
#define MJ_MODE_MSG 0
#endif
// Логирование выдачи дополнительных прыжков. Если закомментировано - нет.
// Default: закомментировано.
//#define MJ_LOGS
#if defined MJ_LOGS
// Путь к лог файлу.
// Default: "addons/amxmodx/logs/multi_jump.log"
new const g_szLogFile[] = "addons/amxmodx/logs/multi_jump.log"
#endif
#endif
// Возможность покупки мультипрыжков. Если закомментировано - нет покупки.
// Default: закомментировано.
//#define MJ_BUY
#if defined MJ_BUY
// Команда для покупки мультипрыжков.
// Default value: "mj"
new const g_szBuyCmd[] = "mj"
// Режим покупки.
// 0 - покупать могут все игроки.
// 1 - покупать могут только игроки без флага ACCESS_FLAG (ACCESS_FLAG должен быть раскомментирован).
// 2 - покупать могут только игроки с флагом ACCESS_FLAG (ACCESS_FLAG должен быть раскомментирован).
// Default value: "0"
#define MJ_BUY_MODE 0
// Цена покупки ADDITIONAL_BUY_JUMPS прыжков.
// Default value: "30"
const MJ_PRICE = 30
// Количество дополнительных покупных прыжков.
// Default value: "1"
#define ADDITIONAL_BUY_JUMPS 1
// Нужно ли сбрасывать количество прыжков при респавне.
// Default: не закомментировано.
#define MJ_RESET_SPAWN
#endif
#if defined MJ_CONSOLE_CMD
#include <amxmisc>
#endif
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
new bool:g_bAlive[MAX_CLIENTS + 1]
new g_iJumpsDone[MAX_CLIENTS + 1]
#if defined MJ_BUY || defined MJ_CONSOLE_CMD
new g_iJumps[MAX_CLIENTS + 1]
#endif
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_DATE, PLUGIN_AUTHOR)
register_dictionary("multi_jump.txt")
#if defined MJ_BUY
register_saycmd(g_szBuyCmd, "func_CmdBuyMJ")
#endif
#if defined MJ_CONSOLE_CMD
register_clcmd(g_szGiveCmd, "func_ConsoleCmdGive", GIVE_ACCESS_FLAG)
#endif
RegisterHookChain(RG_CBasePlayer_Spawn, "refwd_PlayerSpawn_Post", true)
RegisterHookChain(RG_CBasePlayer_Killed, "refwd_PlayerKilled_Post", true)
RegisterHookChain(RG_CBasePlayer_Jump, "refwd_PlayerJump_Pre")
}
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
#if defined MJ_BUY
public func_CmdBuyMJ(id)
{
if(!func_CanBuyMJ(id)) return PLUGIN_HANDLED
g_iJumps[id] = ADDITIONAL_BUY_JUMPS
rg_add_account(id, -MJ_PRICE)
client_print_color(id, print_team_default, "%L", id, "MJ_BOUGHT", ADDITIONAL_BUY_JUMPS)
return PLUGIN_HANDLED
}
bool:func_CanBuyMJ(id)
{
if(!g_bAlive[id])
{
client_print_color(id, print_team_default, "%L", id, "MJ_ERROR_BUY_DEAD")
return false
}
#if (MJ_BUY_MODE == 1 || MJ_BUY_MODE == 2) && defined ACCESS_FLAG
#if MJ_BUY_MODE == 1
if(get_user_flags(id) & ACCESS_FLAG)
#endif
#if MJ_BUY_MODE == 2
if(~get_user_flags(id) & ACCESS_FLAG)
#endif
{
client_print_color(id, print_team_default, "%L", id, "MJ_ERROR_BUY_ACCESS")
return false
}
#endif
if(get_member(id, m_iAccount) < MJ_PRICE)
{
client_print_color(id, print_team_default, "%L", id, "MJ_ERROR_BUY_MONEY", MJ_PRICE)
return false
}
return true
}
#endif
#if defined MJ_CONSOLE_CMD
public func_ConsoleCmdGive(id, lvl, cid)
{
#if MJ_ACCESS_DENY_MODE == 0
if(!cmd_access(id, lvl, cid, 0, true))
return PLUGIN_CONTINUE
#endif
#if MJ_ACCESS_DENY_MODE == 1
if(!cmd_access(id, lvl, cid, 0, true))
return PLUGIN_HANDLED
#endif
#if MJ_ACCESS_DENY_MODE == 2
if(!cmd_access(id, lvl, cid, 0))
return PLUGIN_HANDLED
#endif
new iArg[MAX_NAME_LENGTH]; read_argv(1, iArg, charsmax(iArg))
new szArgJumps[10]; read_argv(2, szArgJumps, charsmax(szArgJumps))
if(!iArg[0] || szArgJumps[0] && (!is_digit_arg(szArgJumps) || szArgJumps[0] < '1'))
{
client_print(id, print_console, "%L", id, "MJ_ERROR_USAGE", g_szGiveCmd)
return PLUGIN_HANDLED
}
new iJumps = szArgJumps[0] ? str_to_num(szArgJumps) : 1
new szArgTime[5]; read_argv(3, szArgTime, charsmax(szArgTime))
new iTime
if(szArgTime[0])
{
if(!is_digit_arg(szArgTime))
{
client_print(id, print_console, "%L", id, "MJ_ERROR_USAGE", g_szGiveCmd)
return PLUGIN_HANDLED
}
iTime = str_to_num(szArgTime)
}
new szTime[32], szTotalJumps[64]
if(iTime) formatex(szTime, charsmax(szTime), " %L", LANG_PLAYER, "MJ_FOR_TIME", iTime)
else formatex(szTime, charsmax(szTime), "")
new iPlayers[MAX_CLIENTS], iPlayerCount, i, iPlayer
get_players(iPlayers, iPlayerCount, "ach")
new szName[MAX_NAME_LENGTH]; get_user_name(id, szName, charsmax(szName))
new szTeam[64]
if(equali(iArg, "T"))
{
new iCount
for(i = 0; i < iPlayerCount; i++)
{
iPlayer = iPlayers[i]
if(rg_get_user_team(iPlayer) != TEAM_TERRORIST)
continue
iCount++
g_iJumps[iPlayer] += iJumps
if(iTime) set_task(float(iTime), "func_JumpsEndTime", iPlayer)
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
if(iPlayer != id)
{
if(g_iJumps[iPlayer] > iJumps)
formatex(szTotalJumps, charsmax(szTotalJumps), "%s%L", iTime ? " " : ". ", iPlayer, "MJ_TOTAL_JUMPS", g_iJumps[iPlayer])
else formatex(szTotalJumps, charsmax(szTotalJumps), "")
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "MJ_GIVEN_PLAYER_TARGET", szName, iJumps, szTime, szTotalJumps)
}
#endif
#endif
}
if(!iCount)
{
client_print(id, print_console, "%L", id, "MJ_ERROR_NOPLAYERS")
return PLUGIN_HANDLED
}
formatex(szTeam, charsmax(szTeam), "%L", LANG_PLAYER, "MJ_MSG_T")
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
client_print_color(id, print_team_red, "%L", id, "MJ_GIVEN_MSG", iJumps, szTime, szTeam)
#endif
#if MJ_MODE_MSG == 1
client_print_color(0, print_team_red, "%L", LANG_PLAYER, "MJ_GIVEN_MSG_ALL", szName, iJumps, szTime, szTeam)
#endif
#endif
#if defined MJ_LOGS
new szAuthID[24]; get_user_authid(id, szAuthID, charsmax(szAuthID))
new szIP[16]; get_user_ip(id, szIP, charsmax(szIP), 1)
log_to_file(g_szLogFile, "%L", LANG_PLAYER, "MJ_GIVEN_TEAM_LOG", szName, szAuthID, szIP, iJumps, szTeam)
#endif
return PLUGIN_HANDLED
}
else if(equali(iArg, "CT"))
{
new iCount
for(i = 0; i < iPlayerCount; i++)
{
iPlayer = iPlayers[i]
if(rg_get_user_team(iPlayer) != TEAM_CT)
continue
iCount++
g_iJumps[iPlayer] += iJumps
if(iTime)
{
set_task(float(iTime), "func_JumpsEndTime", iPlayer)
}
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
if(iPlayer != id)
{
if(g_iJumps[iPlayer] > iJumps)
formatex(szTotalJumps, charsmax(szTotalJumps), "%s%L", iTime ? " " : ". ", iPlayer, "MJ_TOTAL_JUMPS", g_iJumps[iPlayer])
else formatex(szTotalJumps, charsmax(szTotalJumps), "")
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "MJ_GIVEN_PLAYER_TARGET", szName, iJumps, szTime, szTotalJumps)
}
#endif
#endif
}
if(!iCount)
{
client_print(id, print_console, "%L", id, "MJ_ERROR_NOPLAYERS")
return PLUGIN_HANDLED
}
formatex(szTeam, charsmax(szTeam), "%L", LANG_PLAYER, "MJ_MSG_CT")
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
client_print_color(id, print_team_blue, "%L", id, "MJ_GIVEN_MSG", iJumps, szTime, szTeam)
#endif
#if MJ_MODE_MSG == 1
client_print_color(0, print_team_red, "%L", LANG_PLAYER, "MJ_GIVEN_MSG_ALL", szName, iJumps, szTime, szTeam)
#endif
#endif
#if defined MJ_LOGS
new szAuthID[24]; get_user_authid(id, szAuthID, charsmax(szAuthID))
new szIP[16]; get_user_ip(id, szIP, charsmax(szIP), 1)
log_to_file(g_szLogFile, "%L", LANG_PLAYER, "MJ_GIVEN_TEAM_LOG", szName, szAuthID, szIP, iJumps, szTeam)
#endif
return PLUGIN_HANDLED
}
else if(equali(iArg, "ALL"))
{
new iCount
for(i = 0; i < iPlayerCount; i++)
{
iPlayer = iPlayers[i]
if(rg_get_user_team(iPlayer) == TEAM_SPECTATOR)
continue
iCount++
g_iJumps[iPlayer] += iJumps
if(iTime) set_task(float(iTime), "func_JumpsEndTime", iPlayer)
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
if(iPlayer != id)
{
if(g_iJumps[iPlayer] > iJumps)
formatex(szTotalJumps, charsmax(szTotalJumps), "%s%L", iTime ? " " : ". ", iPlayer, "MJ_TOTAL_JUMPS", g_iJumps[iPlayer])
else formatex(szTotalJumps, charsmax(szTotalJumps), "")
client_print_color(iPlayer, print_team_default, "%L", iPlayer, "MJ_GIVEN_PLAYER_TARGET", szName, iJumps, szTime, szTotalJumps)
}
#endif
#endif
}
if(!iCount)
{
client_print(id, print_console, "%L", id, "MJ_ERROR_NOPLAYERS")
return PLUGIN_HANDLED
}
formatex(szTeam, charsmax(szTeam), "%L", LANG_PLAYER, "MJ_MSG_ALL")
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
client_print_color(id, print_team_grey, "%L", id, "MJ_GIVEN_MSG", iJumps, szTime, szTeam)
#endif
#if MJ_MODE_MSG == 1
client_print_color(0, print_team_red, "%L", LANG_PLAYER, "MJ_GIVEN_MSG_ALL", szName, iJumps, szTime, szTeam)
#endif
#endif
#if defined MJ_LOGS
new szAuthID[24]; get_user_authid(id, szAuthID, charsmax(szAuthID))
new szIP[16]; get_user_ip(id, szIP, charsmax(szIP), 1)
log_to_file(g_szLogFile, "%L", LANG_PLAYER, "MJ_GIVEN_TEAM_LOG", szName, szAuthID, szIP, iJumps, szTeam)
#endif
return PLUGIN_HANDLED
}
else
{
new iTarget = cmd_target(id, iArg, CMDTARGET_ALLOW_SELF)
if(!iTarget) return PLUGIN_HANDLED
if(!is_user_alive(iTarget))
{
client_print(id, print_console, "%L", id, "MJ_ERROR_DEAD")
return PLUGIN_HANDLED
}
if(rg_get_user_team(iTarget) != TEAM_TERRORIST && rg_get_user_team(iTarget) != TEAM_CT)
{
client_print(id, print_console, "%L", id, "MJ_ERROR_TEAM")
return PLUGIN_HANDLED
}
g_iJumps[iTarget] += iJumps
if(iTime) set_task(float(iTime), "func_JumpsEndTime", iTarget)
new szTargetName[MAX_NAME_LENGTH]; get_user_name(iTarget, szTargetName, charsmax(szTargetName))
#if defined MJ_MESSAGES
#if MJ_MODE_MSG == 0
client_print_color(id, iTarget, "%L", id, "MJ_GIVEN_MSG", iJumps, szTime, szTargetName)
if(iTarget != id)
{
if(g_iJumps[iTarget] > iJumps)
formatex(szTotalJumps, charsmax(szTotalJumps), "%s%L", iTime ? " " : ". ", iTarget, "MJ_TOTAL_JUMPS", g_iJumps[iTarget])
else formatex(szTotalJumps, charsmax(szTotalJumps), "")
client_print_color(iTarget, print_team_default, "%L", iTarget, "MJ_GIVEN_PLAYER_TARGET", szName, iJumps, szTime, szTotalJumps)
}
#endif
#if MJ_MODE_MSG == 1
client_print_color(0, iTarget, "%L", LANG_PLAYER, "MJ_GIVEN_MSG_ALL", szName, iJumps, szTime, szTargetName)
#endif
#endif
#if defined MJ_LOGS
new szAuthID[24]; get_user_authid(id, szAuthID, charsmax(szAuthID))
new szIP[16]; get_user_ip(id, szIP, charsmax(szIP), 1)
new szTargetAuthID[24]; get_user_authid(iTarget, szTargetAuthID, charsmax(szTargetAuthID))
new szTargetIP[16]; get_user_ip(iTarget, szTargetIP, charsmax(szTargetIP), 1)
log_to_file(g_szLogFile, "%L", LANG_PLAYER, "MJ_GIVEN_ONE_LOG",
szName, szAuthID, szIP,
iJumps,
szTargetName, szTargetAuthID, szTargetIP)
#endif
}
return PLUGIN_HANDLED
}
public func_JumpsEndTime(id)
{
if(!g_bAlive[id] || !g_iJumps[id]) return PLUGIN_HANDLED
g_iJumps[id] = 0
client_print_color(id, print_team_default, "%L", id, "MJ_TIME_ENDED")
return PLUGIN_HANDLED
}
#endif
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
/** ---------------------------------------------------------------------------------------- */
public refwd_PlayerSpawn_Post(id)
{
if(!is_user_alive(id)) return HC_CONTINUE
g_bAlive[id] = true
g_iJumpsDone[id] = 0
#if (defined MJ_BUY || defined MJ_CONSOLE_CMD) && defined MJ_RESET_SPAWN
g_iJumps[id] = 0
#endif
return HC_CONTINUE
}
public refwd_PlayerKilled_Post(iVictim) g_bAlive[iVictim] = false
public refwd_PlayerJump_Pre(id)
{
if(g_bAlive[id])
{
#if defined ACCESS_FLAG
#if defined AUTO_DOUBLE_JUMP
if(~get_user_flags(id) & ACCESS_FLAG)
#else
if(~get_user_flags(id) & ACCESS_FLAG && !g_iJumps[id])
#endif
return HC_CONTINUE
#endif
new iFlags = get_entvar(id, var_flags)
#if defined AUTO_DOUBLE_JUMP
if((~get_entvar(id, var_oldbuttons) & IN_JUMP) && iFlags & FL_ONGROUND)
{
new Float:flVelocity[3]; get_entvar(id, var_velocity, flVelocity)
flVelocity[2] = ADJ_VELOCITY
set_entvar(id, var_velocity, flVelocity)
}
#endif
static Float:flJumpTime[MAX_CLIENTS + 1]
if(g_iJumpsDone[id] && (iFlags & FL_ONGROUND))
{
g_iJumpsDone[id] = 0
flJumpTime[id] = get_gametime()
return HC_CONTINUE
}
static Float:flGameTime
if((get_entvar(id, var_oldbuttons) & IN_JUMP || iFlags & FL_ONGROUND) || g_iJumpsDone[id] >= ADDITIONAL_JUMPS && !g_iJumps[id]
|| ((flGameTime = get_gametime()) - flJumpTime[id]) < 0.2)
return HC_CONTINUE
flJumpTime[id] = flGameTime
new Float:flVelocity[3]; get_entvar(id, var_velocity, flVelocity)
flVelocity[2] = random_float(265.0, 285.0)
set_entvar(id, var_velocity, flVelocity)
g_iJumpsDone[id]++
if(g_iJumps[id] && g_iJumpsDone[id] > ADDITIONAL_JUMPS)
g_iJumps[id]--
}
return HC_CONTINUE
}
public client_disconnected(id)
{
g_bAlive[id] = false
g_iJumpsDone[id] = 0
#if defined MJ_BUY || defined MJ_CONSOLE_CMD
g_iJumps[id] = 0
#endif
}
// thx mx?!
stock register_saycmd(const szSayCmd[], szFunc[])
{
new const szPrefix[][] = { "say /", "say_team /", "say .", "say_team ." }
for(new i, szTemp[MAX_NAME_LENGTH]; i < sizeof(szPrefix); i++)
{
formatex(szTemp, charsmax(szTemp), "%s%s", szPrefix[i], szSayCmd)
register_clcmd(szTemp, szFunc)
}
}
stock is_digit_arg(szArg[])
{
new bool:bIsDigit = true
for(new iCharacter, iLen = strlen(szArg); iCharacter < iLen; iCharacter++)
{
if(!isdigit(szArg[iCharacter]))
{
bIsDigit = false
break
}
}
return bIsDigit
}
Брал от с этой темы https://dev-cs.ru/threads/2572/
В этой теме было размещено решение! Перейти к решению.