Multi Jump

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
45
Реакции
-3
Ошибка
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
}
В этой теме было размещено решение! Перейти к решению.
Сообщения
496
Реакции
618
Помог
16 раз(а)
ВЫ точно не 182 компилировали?
Потому что я только что скачанный ресурс скомпилил без проблем.
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
elf01, недочёт в плагине, в оф. теме релизну обновление завтра/после завтра, пока что решение раскомментить дефайн MJ_CONSOLE_CMD либо MJ_BUY.
 
Сообщения
45
Реакции
-3
w0w, Понял. Подожду.
Gudaus, оставьте так же как у меня define нужные
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
elf01, уже можете скачать новую версию где это исправлено. reapi - Multi Jump
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу