#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <crxranks>
#include <reapi>
#include <zombiepanic>
#include <zombiepanic_utils>
#include <api_rounds>
#include <api_custom_weapons>
#pragma semicolon 1
#define PLUGIN "[OciXCrom's Rank System] Zombie Panic"
#define VERSION "1.0.1"
#define AUTHOR "Hedgehog Fog"
#define XPREWARD_KILL "kill"
#define XPREWARD_TEAMKILL "teamkill"
#define XPREWARD_INFECT "zp_infect"
#define XPREWARD_KILLED_INFECTED "zp_killed_infected"
#define XPREWARD_TRANSFORMED "zp_transformed"
#define XPREWARD_SURVIVE "zp_survive"
#define XPREWARD_ZOMBIE_LEADER "zp_zombie_leader"
#define XPREWARD_OBJECTIVE "zp_objective"
#define XPREWARD_CROWBAR "zp_crowbar"
new bool:g_bPlayerFirstZombie[MAX_PLAYERS + 1];
new bool:g_bPlayerSurvive[MAX_PLAYERS + 1];
new g_pPlayerButton[MAX_PLAYERS + 1];
new g_pKillerItem = -1;
new CW:g_iCwCrowbarHandler;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
RegisterHam(Ham_TakeDamage, "player", "OnPlayerTakeDamage", .Post = 0);
RegisterHam(Ham_TakeDamage, "player", "OnPlayerTakeDamage_Post", .Post = 1);
RegisterHam(Ham_Killed, "player", "OnPlayerKilled_Post", .Post = 1);
RegisterHam(Ham_Use, "func_button", "OnButtonUse", .Post = 0);
RegisterHam(Ham_Use, "func_button", "OnButtonUse_Post", .Post = 1);
RegisterHookChain(RG_CSGameRules_RestartRound, "OnRestartRound", false);
g_iCwCrowbarHandler = CW_GetHandler(ZP_WEAPON_CROWBAR);
}
public OnPlayerTakeDamage(pPlayer, pInflictor, pAttacker) {
if (pAttacker && ExecuteHam(Ham_IsPlayer, pAttacker) && pInflictor == pAttacker) {
g_pKillerItem = get_member(pAttacker, m_pActiveItem);
} else {
g_pKillerItem = pInflictor;
}
}
public OnPlayerTakeDamage_Post() {
g_pKillerItem = -1;
}
public OnPlayerKilled_Post(pPlayer, pKiller) {
g_bPlayerSurvive[pPlayer] = false;
if (!UTIL_IsPlayer(pKiller)) {
return HAM_IGNORED;
}
new iKillerXp = 0;
// fix for custom DeathMsg implementation
if (get_member(pPlayer, m_iTeam) == get_member(pKiller, m_iTeam)) {
iKillerXp += GetReward(pKiller, XPREWARD_TEAMKILL);
} else {
iKillerXp += GetReward(pKiller, XPREWARD_KILL);
}
if (g_pKillerItem != -1 && CW_GetHandlerByEntity(g_pKillerItem) == g_iCwCrowbarHandler) {
iKillerXp += GetReward(pKiller, XPREWARD_CROWBAR, 3);
}
if (ZP_Player_IsInfected(pPlayer)) {
if (!ZP_Player_IsZombie(pKiller)) {
iKillerXp += GetReward(pKiller, XPREWARD_KILLED_INFECTED, 8);
}
}
crxranks_give_user_xp(pKiller, iKillerXp, _, CRXRANKS_XPS_REWARD);
return HAM_HANDLED;
}
public OnButtonUse(pButton, pToucher) {
if (!UTIL_IsPlayer(pToucher)) {
return HAM_IGNORED;
}
if (get_ent_data(pButton, "CBaseToggle", "m_toggle_state") != TS_AT_BOTTOM) {
return HAM_IGNORED;
}
if (~pev(pButton, pev_spawnflags) & ZP_BUTTON_FLAG_HUMAN_ONLY) {
return HAM_IGNORED;
}
g_pPlayerButton[pToucher] = pButton;
log_amx("Set button");
return HAM_HANDLED;
}
public OnButtonUse_Post(pButton, pToucher) {
if (!UTIL_IsPlayer(pToucher)) {
return HAM_IGNORED;
}
if (get_ent_data(pButton, "CBaseToggle", "m_toggle_state") == TS_AT_BOTTOM) {
return HAM_IGNORED;
}
if (g_pPlayerButton[pToucher] == pButton) {
g_pPlayerButton[pToucher] = -1;
GiveReward(pToucher, XPREWARD_OBJECTIVE, 5);
return HAM_HANDLED;
}
return HAM_HANDLED;
}
public OnRestartRound() {
new WinStatus:iStatus = get_member_game(m_iRoundWinStatus);
if (iStatus == WINSTATUS_CTS) {
for (new pPlayer = 1; pPlayer <= MaxClients; ++pPlayer) {
if (!is_user_connected(pPlayer)) {
continue;
}
if (g_bPlayerSurvive[pPlayer]) {
GiveReward(pPlayer, XPREWARD_SURVIVE, 20);
}
}
} else if (iStatus == WINSTATUS_TERRORISTS) {
for (new pPlayer = 1; pPlayer <= MaxClients; ++pPlayer) {
if (!is_user_connected(pPlayer)) {
continue;
}
if (g_bPlayerFirstZombie[pPlayer]) {
GiveReward(pPlayer, XPREWARD_ZOMBIE_LEADER, 15);
}
}
}
return HC_CONTINUE;
}
public ZP_Fw_PlayerInfected(pPlayer, pInfector) {
GiveReward(pInfector, XPREWARD_INFECT, 5);
}
public ZP_Fw_PlayerTransformed(pPlayer) {
GiveReward(pPlayer, XPREWARD_TRANSFORMED, 5);
}
public Round_Fw_RoundStart() {
set_task(0.1, "Task_ProcessRoundStart");
}
public Task_ProcessRoundStart() {
ProcessRoundStart();
}
ProcessRoundStart() {
for (new pPlayer = 1; pPlayer <= MaxClients; ++pPlayer) {
if (!is_user_connected(pPlayer)) {
continue;
}
new bool:bIsZombie = ZP_Player_IsZombie(pPlayer);
g_bPlayerFirstZombie[pPlayer] = bIsZombie;
g_bPlayerSurvive[pPlayer] = !bIsZombie;
}
}
GiveReward(pPlayer, szReward[], iDefaultAmount = 0) {
new iXp = GetReward(pPlayer, szReward, iDefaultAmount);
crxranks_give_user_xp(pPlayer, iXp, _, CRXRANKS_XPS_REWARD);
}
GetReward(pPlayer, szReward[], iDefaultValue = 0) {
return crxranks_xp_reward_is_set(szReward)
? crxranks_get_xp_reward(pPlayer, szReward)
: iDefaultValue;
}