public EV_DeathMsg()
{
new iVictim = read_data (2)
if (!is_user_connected(iVictim))
return;
if(!zp_get_user_zombie(iVictim))
return
remove_grenade_icon(iVictim)
ham_strip_weapon(iVictim,"weapon_smokegrenade")
WeaponList_Change(iVictim,false)
g_ZombieBomb[iVictim] = 0
}
Nic dziwnego, skoro odbierasz granat martwemu graczowi. Jeśli on już nie żyje, to i granat nie istnieje, wykonujesz zatem operacje na nieistniejącym obiekcie.
Co dzieje się dalej:
new wEnt
while((wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon)) && pev(wEnt,pev_owner) != id) {}
w ten sposób szukasz smoka, a co jeśli żaden smoke nie istnieje w danej chwili?
pętla while pracuje tak długo jak długo spełniany jest warunek, no i przy pierwszym sprawdzeniu pętla się powinna skończyć, ale:
skonstruowana jest tak, aby szukała takiego smoka, którego ownerem jest gracz o numerze id, jeśli jednak
wEnt = engfunc(EngFunc_FindEntityByString,wEnt,"classname",weapon
nie znajdzie zadnego smoka, wtedy wEnt=-1, pev zatem sprawdza pev_owner bytu o numerze -1, a to jak mnie pamięć nie zawodzi crashuje serwer.
Jeśli jednak źle pamiętam to idziemy dalej:
if(!wEnt)
return 0;
ten warunek się nie spełni nigdy, jeśli EngFunc_FindEntityByString nie znajdzie niczego to zwróci -1 a nie 0
if(get_user_weapon(id) == wId) ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);
no i tutaj wykonujemy executehamb na nieznanym obiekcie, co na pewno crashuje serwer
Użytkownik grankee edytował ten post 13.11.2015 17:45