25/01/2019, 01:48 PM
(Última modificación: 25/01/2019, 03:32 PM por wavee. Edited 3 times in total.)
TUT: https://amxmodx-es.com/Thread-TUT-crear-...s-y-Zombie
- Al subirle la vida al zombie al máximo, cuando me transformo en zombie, se bugea el personaje. Es decir:
. Conservo las bombas transformándose en HIELO/FLASH - LUZ/SMOKE - FUEGO/INFECCIÓN
. Conservo el chaleco humano anti infección
. Conservo el cuchillo humano hasta realizar presión en cualquier numero
PD: Solo bugea el personaje la vida del zombie, las demas habilidades al subirlas "MAX", funcionan correctamente sin bugs.
---------
- Al subirle la vida al zombie al máximo, cuando me transformo en zombie, se bugea el personaje. Es decir:
. Conservo las bombas transformándose en HIELO/FLASH - LUZ/SMOKE - FUEGO/INFECCIÓN
. Conservo el chaleco humano anti infección
. Conservo el cuchillo humano hasta realizar presión en cualquier numero
PD: Solo bugea el personaje la vida del zombie, las demas habilidades al subirlas "MAX", funcionan correctamente sin bugs.
Código PHP:
// First zombie
g_firstzombie[id] = true
// Set health
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id] + ammount_zhealth(g_habilidad[id][1][1])))
//-------------------
// Infected by someone
// Set health
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id] + ammount_zhealth(g_habilidad[id][1][1])))
//-------------------
// Silent mode, no HUD messages, no infection sounds
// Set health
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id] + ammount_zhealth(g_habilidad[id][1][1])))
Código PHP:
// Zombie Me Function (player id, infector, turn into a nemesis, silent mode, deathmsg and rewards)
zombieme(id, infector, nemesis, assassin, silentmode, rewards)
{
// User infect attempt forward
ExecuteForward(g_fwUserInfect_attempt, g_fwDummyResult, id, infector, nemesis)
// One or more plugins blocked the infection. Only allow this after making sure it's
// not going to leave us with no zombies. Take into account a last player leaving case.
// BUGFIX: only allow after a mode has started, to prevent blocking first zombie e.g.
if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && g_modestarted && fnGetZombies() > g_lastplayerleaving)
return;
// Pre user infect forward
ExecuteForward(g_fwUserInfected_pre, g_fwDummyResult, id, infector, nemesis)
// Show zombie class menu if they haven't chosen any (e.g. just connected)
if (g_zombieclassnext[id] == ZCLASS_NONE && get_pcvar_num(cvar_zclasses))
set_task(0.2, "show_menu_zclass", id)
// Set selected zombie class
g_zombieclass[id] = g_zombieclassnext[id]
// If no class selected yet, use the first (default) one
if (g_zombieclass[id] == ZCLASS_NONE) g_zombieclass[id] = 0
// Way to go...
g_zombie[id] = true
g_nemesis[id] = false
g_assassin[id] = false
g_survivor[id] = false
g_sniper[id] = false
g_firstzombie[id] = false
// Remove survivor's aura (bugfix)
set_pev(id, pev_effects, pev(id, pev_effects) &~ EF_BRIGHTLIGHT)
// Remove spawn protection (bugfix)
g_nodamage[id] = false
set_pev(id, pev_effects, pev(id, pev_effects) &~ EF_NODRAW)
// Reset burning duration counter (bugfix)
g_burning_duration[id] = 0
// Show deathmsg and reward infector?
if (rewards && infector)
{
// Send death notice and fix the "dead" attrib on scoreboard
SendDeathMsg(infector, id)
FixDeadAttrib(id)
// Reward frags, deaths, health, and ammo packs
UpdateFrags(infector, id, get_pcvar_num(cvar_fragsinfect), 1, 1)
g_ammopacks[infector] += get_pcvar_num(cvar_ammoinfect)
fm_set_user_health(infector, pev(infector, pev_health) + get_pcvar_num(cvar_zombiebonushp))
}
// Cache speed, knockback, and name for player's class
g_zombie_spd[id] = float(ArrayGetCell(g_zclass_spd, g_zombieclass[id]))
g_zombie_knockback[id] = Float:ArrayGetCell(g_zclass_kb, g_zombieclass[id])
ArrayGetString(g_zclass_name, g_zombieclass[id], g_zombie_classname[id], charsmax(g_zombie_classname[]))
// Set zombie attributes based on the mode
static sound[64]
if (!silentmode)
{
if (nemesis)
{
// Nemesis
g_nemesis[id] = true
// Set health [0 = auto]
if (get_pcvar_num(cvar_nemhp) == 0)
{
if (get_pcvar_num(cvar_nembasehp) == 0)
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, 0) * fnGetAlive())
else
fm_set_user_health(id, get_pcvar_num(cvar_nembasehp) * fnGetAlive())
}
else
fm_set_user_health(id, get_pcvar_num(cvar_nemhp))
// Set gravity, if frozen set the restore gravity value instead
if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_nemgravity))
else g_frozen_gravity[id] = get_pcvar_float(cvar_nemgravity)
// Set nemesis maxspeed
ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
}
else if (assassin)
{
// Assassin
g_assassin[id] = true
// Set health [0 = auto]
if (get_pcvar_num(cvar_assahp) == 0)
{
if (get_pcvar_num(cvar_assabasehp) == 0)
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, 0) * fnGetAlive())
else
fm_set_user_health(id, get_pcvar_num(cvar_assabasehp) * fnGetAlive())
}
else
fm_set_user_health(id, get_pcvar_num(cvar_assahp))
// Set gravity, if frozen set the restore gravity value instead
if (!g_frozen[id]) set_pev(id, pev_gravity, get_pcvar_float(cvar_assagravity))
else g_frozen_gravity[id] = get_pcvar_float(cvar_assagravity)
// Set assassin maxspeed
ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
}
else if (fnGetZombies() == 1)
{
// First zombie
g_firstzombie[id] = true
// Set health
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id] + ammount_zhealth(g_habilidad[id][1][1])))
// Set gravity, if frozen set the restore gravity value instead
if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id]) - ammount_zgravity(g_habilidad[id][1][3]))
else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
// Set zombie maxspeed
ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
// Infection sound
ArrayGetString(zombie_infect, random_num(0, ArraySize(zombie_infect) - 1), sound, charsmax(sound))
emit_sound(id, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
else
{
// Infected by someone
// Set health
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id] + ammount_zhealth(g_habilidad[id][1][1])))
// Set gravity, if frozen set the restore gravity value instead
if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id]) - ammount_zgravity(g_habilidad[id][1][3]))
else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
// Set zombie maxspeed
ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
// Infection sound
ArrayGetString(zombie_infect, random_num(0, ArraySize(zombie_infect) - 1), sound, charsmax(sound))
emit_sound(id, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
// Show Infection HUD notice
set_hudmessage(255, 0, 0, HUD_INFECT_X, HUD_INFECT_Y, 0, 0.0, 5.0, 1.0, 1.0, -1)
if (infector) // infected by someone?
ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_INFECT2", g_playername[id], g_playername[infector])
else
ShowSyncHudMsg(0, g_MsgSync, "%L", LANG_PLAYER, "NOTICE_INFECT", g_playername[id])
}
}
else
{
// Silent mode, no HUD messages, no infection sounds
// Set health
fm_set_user_health(id, ArrayGetCell(g_zclass_hp, g_zombieclass[id] + ammount_zhealth(g_habilidad[id][1][1])))
// Set gravity, if frozen set the restore gravity value instead
if (!g_frozen[id]) set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id]) - ammount_zgravity(g_habilidad[id][1][3]))
else g_frozen_gravity[id] = Float:ArrayGetCell(g_zclass_grav, g_zombieclass[id])
// Set zombie maxspeed
ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
}
// Remove previous tasks
remove_task(id+TASK_MODEL)
remove_task(id+TASK_BLOOD)
remove_task(id+TASK_AURA)
remove_task(id+TASK_BURN)
// Switch to T
if (fm_cs_get_user_team(id) != FM_CS_TEAM_T) // need to change team?
{
remove_task(id+TASK_TEAM)
fm_cs_set_user_team(id, FM_CS_TEAM_T)
fm_user_team_update(id)
}
// Custom models stuff
static currentmodel[32], tempmodel[32], already_has_model, i, iRand, size
already_has_model = false
if (g_handle_models_on_separate_ent)
{
// Set the right model
if (g_nemesis[id])
{
iRand = random_num(0, ArraySize(model_nemesis) - 1)
ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand))
}
else if (g_assassin[id])
{
iRand = random_num(0, ArraySize(model_assassin) - 1)
ArrayGetString(model_assassin, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_assassin, iRand))
}
else
{
if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
iRand = random_num(0, ArraySize(model_admin_zombie) - 1)
ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand))
}
else
{
iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand))
}
}
// Set model on player model entity
fm_set_playermodel_ent(id)
// Nemesis glow / remove glow on player model entity, unless frozen
if (!g_frozen[id])
{
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 250, 0 , 0, kRenderNormal, 25)
else if (g_nemesis[id] && !(get_pcvar_num(cvar_nemglow)))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0 , 0, kRenderNormal, 25)
else if (g_assassin[id] && get_pcvar_num(cvar_assaglow))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 25)
else
fm_set_rendering(g_ent_playermodel[id])
}
}
else
{
// Get current model for comparing it with the current one
fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it
if (g_nemesis[id])
{
size = ArraySize(model_nemesis)
for (i = 0; i < size; i++)
{
ArrayGetString(model_nemesis, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand))
}
}
else if (g_assassin[id])
{
size = ArraySize(model_assassin)
for (i = 0; i < size; i++)
{
ArrayGetString(model_assassin, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_assassin, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_assassin, iRand))
}
}
else
{
if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
size = ArraySize(model_admin_zombie)
for (i = 0; i < size; i++)
{
ArrayGetString(model_admin_zombie, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand))
}
}
else
{
for (i = ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]); i < ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]); i++)
{
ArrayGetString(g_zclass_playermodel, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand))
}
}
}
// Need to change the model?
if (!already_has_model)
{
// An additional delay is offset at round start
// since SVC_BAD is more likely to be triggered there
if (g_newround)
set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
else
fm_user_model_update(id+TASK_MODEL)
}
// Nemesis glow / remove glow, unless frozen
if (!g_frozen[id])
{
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 25)
else if (g_nemesis[id] && !(get_pcvar_num(cvar_nemglow)))
fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 25)
if (g_assassin[id] && get_pcvar_num(cvar_assaglow))
fm_set_rendering(id, kRenderFxGlowShell, 255, 255, 0, kRenderNormal, 25)
else if (!g_assassin[id] && !g_nemesis[id])
fm_set_rendering(id)
}
}
// Remove any zoom (bugfix)
cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
// Remove armor
cs_set_user_armor(id, 0, CS_ARMOR_NONE)
// Drop weapons when infected
drop_weapons(id, 1)
drop_weapons(id, 2)
// Strip zombies from guns and give them a knife
fm_strip_user_weapons(id)
fm_give_item(id, "weapon_knife")
// Fancy effects
infection_effects(id)
// Nemesis aura task
if (g_nemesis[id] && get_pcvar_num(cvar_nemaura))
set_task(0.1, "zombie_aura", id+TASK_AURA, _, _, "b")
// Assassin aura task
if (g_assassin[id] && get_pcvar_num(cvar_assaaura))
set_task(0.1, "zombie_aura", id+TASK_AURA, _, _, "b")
// Remove CS nightvision if player owns one (bugfix)
if (cs_get_user_nvg(id))
{
cs_set_user_nvg(id, 0)
if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
}
// Give Zombies Night Vision?
if (get_pcvar_num(cvar_nvggive))
{
g_nvision[id] = true
if (!g_isbot[id])
{
// Turn on Night Vision automatically?
if (get_pcvar_num(cvar_nvggive) == 1)
{
g_nvisionenabled[id] = true
// Custom nvg?
if (get_pcvar_num(cvar_customnvg))
{
remove_task(id+TASK_NVISION)
set_task(0.1, "set_user_nvision", id+TASK_NVISION, _, _, "b")
}
else
set_user_gnvision(id, 1)
}
// Turn off nightvision when infected (bugfix)
else if (g_nvisionenabled[id])
{
if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
else set_user_gnvision(id, 0)
g_nvisionenabled[id] = false
}
}
else
cs_set_user_nvg(id, 1); // turn on NVG for bots
}
// Disable nightvision when infected (bugfix)
else if (g_nvision[id])
{
if (get_pcvar_num(cvar_customnvg)) remove_task(id+TASK_NVISION)
else if (g_nvisionenabled[id]) set_user_gnvision(id, 0)
g_nvision[id] = false
g_nvisionenabled[id] = false
}
// Set custom FOV?
if (get_pcvar_num(cvar_zombiefov) != 90 && get_pcvar_num(cvar_zombiefov) != 0)
{
message_begin(MSG_ONE, g_msgSetFOV, _, id)
write_byte(get_pcvar_num(cvar_zombiefov)) // fov angle
message_end()
}
// Call the bloody task
if (!g_nemesis[id] && !g_nemesis[id] && get_pcvar_num(cvar_zombiebleeding))
set_task(0.7, "make_blood", id+TASK_BLOOD, _, _, "b")
// Idle sounds task
if (!g_nemesis[id] && !g_assassin[id])
set_task(random_float(50.0, 70.0), "zombie_play_idle", id+TASK_BLOOD, _, _, "b")
// Turn off zombie's flashlight
turn_off_flashlight(id)
// Post user infect forward
ExecuteForward(g_fwUserInfected_post, g_fwDummyResult, id, infector, nemesis)
// Last Zombie Check
fnCheckLastZombie()
}