OciXCrom's Rank System for Zombie Panic

OciXCrom's Rank System for Zombie Panic 1.0.1

Нет прав для скачивания
Код:
#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;
}
Назад
Верх