I'm writing a plugin for Zombie Plague Mod that adds a shield as extra item for zombies. Shield is being given for certain amount of time (8 secs default) and then taken away. So far I've faced a problem I can't solve myself:
When giving player a shield, I change his viewmodel to my one. And after shield's time runs out and it is taken away, I must restore player's viewmodel back to which he had before buying shield. But viewmodels can be different depending on server's settings for different zombie classes. So how can I find out which viewmodel belongs to current player's zombie class?
Code - what I have for now.
Code:
#include <amxmodx>
#include <amxmisc>
#include <zombieplague>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
new const g_item_name[] = { "Shield" }
new cvar_shield_cost, cvar_shield_duration, g_itemid_shield, g_item_cost, shield_duration
new const model_shield[] = { "models/zombie_plague/v_zp_extra_shield.mdl" }
new const p_model_shield[] = { "models/zombie_plague/p_zp_extra_shield.mdl" }
new const model_claws[] = { "models/zombie_plague/v_knife_zombie.mdl" }
new const zscv[] = { "zp_shield_cost" }
public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, model_shield)
engfunc(EngFunc_PrecacheModel, p_model_shield)
engfunc(EngFunc_PrecacheModel, model_claws)
}
public plugin_init()
{
register_plugin("[ZP] Extra item :: Zombie Shield", "1.0", "Lord Canistra")
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
new cfgdir[32]
get_configsdir(cfgdir, sizeof cfgdir-1)
cvar_shield_cost = register_cvar("zp_shield_cost", "8")
cvar_shield_duration = register_cvar("zp_shield_duration", "8")
if(cvar_exists(zscv) == 0)
{
server_cmd("exec %s/zp_extra_shield.cfg", cfgdir)
}
g_item_cost = get_pcvar_num(cvar_shield_cost)
shield_duration = get_pcvar_num(cvar_shield_duration)
g_itemid_shield = zp_register_extra_item(g_item_name, g_item_cost, ZP_TEAM_ZOMBIE)
}
public zp_extra_item_selected(player, itemid)
{
if(itemid == g_itemid_shield)
{
fm_strip_user_weapons(player)
fm_give_item(player, "weapon_knife")
set_task(0.1, "EquipShield", player)
set_task(float(shield_duration), "StripShield", player)
message_begin( MSG_ONE, 108, {0,0,0}, player );
write_byte(shield_duration);
write_byte(0);
message_end();
}
}
public fw_PlayerKilled(victim)
{
set_task(0.0001, "RemoveShields")
remove_task(victim)
}
public RemoveShields()
{
static sent
while(sent = engfunc(EngFunc_FindEntityByString, sent, "classname", "weapon_shield"))
{
engfunc(EngFunc_SetOrigin, sent, Float:{8192.0,8192.0,8192.0})
}
}
public StripShield(player)
{
fm_strip_user_weapons(player)
set_task(0.1, "Equip", player)
}
public Equip(player)
{
fm_give_item(player, "weapon_knife")
set_pev(player, pev_viewmodel2, model_claws)
set_pev(player, pev_weaponmodel2, "")
}
public EquipShield(player)
{
fm_give_item(player, "weapon_shield")
set_pev(player, pev_viewmodel2, model_shield)
set_pev(player, pev_weaponmodel2, p_model_shield)
}
PS forgive me any mistakes in this code or in my english, because this is my first Pawn coding experience and english isn't my native language.