I want to add several human and zombie classes to my server, and i want the abilities of the classses to not affect on neme/surv etc.
But instead of adding all the libraries and natives in every class source, i would like to register all of them into one native, something like:
zp_class_mode_get == zp_class_assassin_get() || zp_class_nemesis_get() || zp_class_survivor_get() || zp_class_sniper_get()
but i realy dont know how to modify properly the red colored line from the code, anyone can help me?
Code:
#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <amx_settings_api>
#include <cs_maxspeed_api>
#include <cs_player_models_api>
#include <cs_weap_models_api>
#include <cs_ham_bots_api>
#include <zp50_core>
etc
#define PLAYERMODEL_MAX_LENGTH 32
#define MODEL_MAX_LENGTH 64
#define flag_get(%1,%2) (%1 & (1 << (%2 & 31)))
#define flag_get_boolean(%1,%2) (flag_get(%1,%2) ? true : false)
#define flag_set(%1,%2) %1 |= (1 << (%2 & 31))
#define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))
new g_MaxPlayers
new g_IsMode
public plugin_init()
{
register_plugin("[ZP] Class: Sky Terror", ZP_VERSION_STRING, "ZP Dev Team")
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
RegisterHamBots(Ham_TakeDamage, "fw_TakeDamage")
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHamBots(Ham_Killed, "fw_PlayerKilled")
register_forward(FM_ClientDisconnect, "fw_ClientDisconnect_Post", 1)
g_MaxPlayers = get_maxplayers()
g_IsMode = zp_class_assassin_get() || zp_class_nemesis_get() || zp_class_survivor_get() || zp_class_sniper_get() || zp_class_hive_get() || zp_class_terro_get()
}
public plugin_natives()
{
register_library("zp50_class_mode")
register_native("zp_class_mode_get", "native_class_mode_get")
set_module_filter("module_filter")
set_native_filter("native_filter")
}
public native_filter(const name[], index, trap)
{
if (!trap)
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public fw_ClientDisconnect_Post(id)
{
// Reset flags AFTER disconnect (to allow checking if the player was nemesis before disconnecting)
flag_unset(g_IsMode, id)
}
public zp_fw_core_spawn_post(id)
{
if (flag_get(g_IsMode, id))
{
// Remove nemesis flag
flag_unset(g_IsMode, id)
}
}
public zp_fw_core_cure(id, attacker)
{
if (flag_get(g_IsMode, id))
{
// Remove nemesis flag
flag_unset(g_IsMode, id)
}
}
public zp_fw_core_infect_post(id, attacker)
{
// Apply Nemesis attributes?
if (!flag_get(g_IsTerror, id))
return;
// Health
if (get_pcvar_num(cvar_terror_health) == 0)
set_user_health(id, get_pcvar_num(cvar_terror_base_health) * GetAliveCount())
else
set_user_health(id, get_pcvar_num(cvar_terror_health))
// Gravity
set_user_gravity(id, get_pcvar_float(cvar_terror_gravity))
// Speed
cs_set_player_maxspeed_auto(id, get_pcvar_float(cvar_terror_speed))
// Apply nemesis player model
new player_model[PLAYERMODEL_MAX_LENGTH]
ArrayGetString(g_models_terror_player, random_num(0, ArraySize(g_models_terror_player) - 1), player_model, charsmax(player_model))
cs_set_player_model(id, player_model)
// Apply nemesis claw model
new model[MODEL_MAX_LENGTH]
ArrayGetString(g_models_terror_claw, random_num(0, ArraySize(g_models_terror_claw) - 1), model, charsmax(model))
cs_set_player_view_model(id, CSW_KNIFE, model)
// Nemesis glow
if (get_pcvar_num(cvar_terror_glow))
set_user_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
// Nemesis aura task
if (get_pcvar_num(cvar_terror_aura))
set_task(0.1, "terror_aura", id+TASK_AURA, _, _, "b")
}
public native_class_mode_get(plugin_id, num_params)
{
new id = get_param(1)
if (!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
return -1;
}
return flag_get_boolean(g_IsMode, id);
}
public native_class_mode_set(plugin_id, num_params)
{
new id = get_param(1)
if (!is_user_alive(id))
{
log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
return false;
}
if (flag_get(g_IsTerror, id))
{
log_error(AMX_ERR_NATIVE, "[ZP] Player already a sky terror (%d)", id)
return false;
}
flag_set(g_IsMode, id)
zp_core_force_infect(id)
return true;
}
// Get Nemesis Count -returns alive nemesis number-
GetTerrorCount()
{
new iMode, id
for (id = 1; id <= g_MaxPlayers; id++)
{
if (is_user_alive(id) && flag_get(g_IsMode, id))
iMode++
}
return iMode;
}