PDA

View Full Version : Tutorial invizibilitate in biohazard



daniel_San
08-08-2013, 11:07 PM
Lucrand la pluginul de zombie am trecut prin niste constatari foarte neplacute. In primul rand, dupa cum bine stiti, in momentul in care setati rendering-ul unui zombie pe alpha, se suprapun modelul original cu cel de zombie.

Cercetand mai atent sursa de la biohazard am descoperit cauza: In functia set_zombie_attributes

set_pev(index, pev_rendermode, kRenderTransTexture)

fm_set_user_armortype(index, CS_ARMOR_NONE)
fm_set_user_nvg(index)

if(get_pcvar_num(cvar_autonvg))
engclient_cmd(index, "nightvision")

if(!pev_valid(g_modelent[index]))
{
static ent
ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
if(pev_valid(ent))
{
engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
set_pev(ent, pev_classname, MODEL_CLASSNAME)
set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
set_pev(ent, pev_aiment, index)
set_pev(ent, pev_owner, index)

g_modelent[index] = ent
}

}
else
{
engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
fm_set_entity_visibility(g_modelent[index], 1)
}


Dupa cum vedeti, modelul original este setat ca TransTexture. Mai mult, modelul de zombie nu e chiar model. Se creeaza o entitate cu modelul dorit care se lipest de jucator. Mai exact, acelasi principiu ca pluginul de Hats. Practic, in loc sa schimbe modelul juatorului, doar "il acopera cu o haina". De asta, in momentul in care crestem vizibilitatea modelului original, se suprapune peste "haina". Ce avem de facut sa facem un zombie invizibil: Pai in principiu sa corectam aceasta tampenie.

Ii scoatem haina, corectam modul de randare, setam modelul zombie si modificam vizibilitatea.
Scoaterea "hainei" e destul de complicata, deoarece e nevoie de o stergere de entitate. "Haina" pentru fiecare jucator e pastrata intr-un vector in pluginul biohazard: g_modelent. Nu putem apela din alt plugin acest vector.

Solutia construita de mine consta in:
Crearea unei functii in interiorul biohazard.sma:


public deleteCover(index)
{
if(pev_valid(g_modelent[index]))
fm_set_entity_visibility(g_modelent[index], 0)
}


Aceasta functie urmeaza sa fie apelata din pluginul nostru prin:


callfunc_begin("deleteCover","biohazard.amxx");
callfunc_push_int(id);
callfunc_end();


In acest moment, am sters "cover-ul"

Urmeaza restul:


fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha,get_cvar_num("invzm_alpha"));
cs_set_user_model(id,MODEL);


Problema in urma acestui cod: Resetarea modelului omului este facuta de biohazard prin simpla stergere a acelei "haine". In momentul in care schimbam modelul zombie-ului efectiv, si mai apoi acel jucator este respawnat(runda noua,antidot) ramane cu modelul de zombie. Asta s-a intamplat in poza postata de Dark. Deci trebuie sa schimbam inapoi in om. Modificam functia "reset_user_model" din biohazard in

stock reset_user_model(index)
{
set_pev(index, pev_rendermode, kRenderNormal)
set_pev(index, pev_renderamt, 0.0)

cs_set_user_model(index,HUMAN_MODEL);

if(pev_valid(g_modelent[index]))
fm_set_entity_visibility(g_modelent[index], 0)
}


Observati realocarea modelului. Si gata. Avem tot ce ne trebuie pentru a face un zombie invizibil fara erori de randare.