new ghave[33]; public TakeDamage(ent, idinflictor, attacker, Float:damage, damagebits) { if(!pev_valid(ent)) { gMonsterAlive--; if(gMonsterAlive < 0) gMonsterAlive=0 if(gMonsterAlive <= 0 && gWave && gStart && gGame) EndRound() remove_entity(pev(ent, pev_ent_health)); remove_entity(ent) return PLUGIN_CONTINUE } new classname[32]; entity_get_string(ent, EV_SZ_classname, classname, 31); if(equal(classname, "monster")) { new hp = floatround(entity_get_float(ent, EV_FL_health)) /* Pokazuje zadane obrazenia */ new id = 0 if(is_turret(attacker)) { id = get_sentry_owner_by_ent_id(attacker) if(gPlayerDamage[id]) damage+=float(gPlayerNewDamage[id]) } if(is_turret(attacker)) { new sentryid = get_sentry_id_by_ent(id, attacker) if(damagebits & DMG_SLASH && sentryid == 0) { set_hudmessage(100, 255, 0, 0.81, 0.27, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync9, "W 1: %d", floatround(damage)) } if(damagebits & DMG_BLAST && sentryid == 1) { set_hudmessage(100, 255, 0, 0.81, 0.32, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync10, "W 2: %d", floatround(damage)) } if(damagebits & DMG_BURN && sentryid == 2) { set_hudmessage(100, 255, 0, 0.81, 0.37, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync11, "W 3: %d", floatround(damage)) } if(damagebits & DMG_DROWN && sentryid == 3) { set_hudmessage(100, 255, 0, 0.81, 0.42, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync12, "W 4: %d", floatround(damage)) } if(MAX_SENTRY > 4 && sentryid >= 4) { set_hudmessage(100, 0, 255, 0.81, 0.47, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync13, "O: %d", floatround(damage)) } } else { ghave[attacker]++ if(ghave[attacker] == 1) { set_hudmessage(0, 255, 0, 0.55, 0.465, 0, 0.0, 1.0, 0.0, 0.2, 1) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 2) { set_hudmessage(0, 255, 0, 0.55, 0.5, 0, 0.0, 1.0, 0.0, 0.2, 2) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 3) { set_hudmessage(0, 255, 0, 0.55, 0.535, 0, 0.0, 1.0, 0.0, 0.2, 3) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 4) { set_hudmessage(0, 255, 0, 0.55, 0.57, 0, 0.0, 1.0, 0.0, 0.2, 4) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 5) { set_hudmessage(0, 255, 0, 0.55, 0.605, 0, 0.0, 1.0, 0.0, 0.2, 1) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) ghave[attacker] = 0 } } /* -- */ static Float:fOrigin[3] static Origin[3] pev(ent, pev_origin, fOrigin) Origin[0] = floatround(fOrigin[0]) Origin[1] = floatround(fOrigin[1]) Origin[2] = floatround(fOrigin[2]) static Color[33][3] ; Color[id?id:attacker][0] = gPlayerAttackColorValue[id?id:attacker][0] Color[id?id:attacker][1] = gPlayerAttackColorValue[id?id:attacker][1] Color[id?id:attacker][2] = gPlayerAttackColorValue[id?id:attacker][2] msg_dlight(Origin, 10, Color[id?id:attacker], 3, 1) if(hp <= floatround(damage) && pev_valid(ent)) { gMonsterAlive--; if(gMonsterAlive < 0) gMonsterAlive=0 if(gMonsterAlive <= 0 && gWave && gStart && gGame) EndRound() if(pev_valid(ent)) remove_entity(pev(ent, pev_ent_health)); if(is_user_alive(id?id:attacker)) { gPlayerPoints[id?id:attacker]+=get_pcvar_num(cvar_points_kill) cs_set_user_money(id?id:attacker, cs_get_user_money(id?id:attacker)+450) GiveAmmo(id?id:attacker, 20) set_user_frags(id?id:attacker, get_user_frags(id?id:attacker)+1) refreshFrags(id?id:attacker) } } } SetHamParamFloat(4, damage) return PLUGIN_CONTINUE }Proszę o pomoc w znalezieniu jego i o optymalizacje kodu. Jak jest to zły dział to przepraszam, lecz nie widzę innego. Jeśli chcecie, mogę dać inne funkcje.
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
[ROZWIĄZANE] Problem z crashem gdzieś w tym thinku
Najlepsza odpowiedź GT Team , 08.05.2013 19:15
A JEDNAK Działa! Rozłożyłem TakeDamage, bo sądziłem, że wykonuje się za dużo w 1 i oto co zrobiłem:
public TakeDamage(ent, idinflictor, attacker, Float:damage, damagebits) { static classname[32]; entity_get_string(ent, EV_SZ_classname, classname, 31); if(equal(classname, "monster")) { new hp = floatround(entity_get_float(ent, EV_FL_health)) /* Pokazuje zadane obrazenia */ new id = 0 if(is_turret(attacker)) { id = SentryOwner(attacker) if(gPlayerDamage[id]) damage+=float(gPlayerNewDamage[id]) } if(is_turret(attacker)) { new sentryid = SentryId(ent) if(damagebits & DMG_SLASH && sentryid == 0) { set_hudmessage(100, 255, 0, 0.81, 0.27, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync9, "W 1: %d", floatround(damage)) } if(damagebits & DMG_BLAST && sentryid == 1) { set_hudmessage(100, 255, 0, 0.81, 0.32, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync10, "W 2: %d", floatround(damage)) } if(damagebits & DMG_BURN && sentryid == 2) { set_hudmessage(100, 255, 0, 0.81, 0.37, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync11, "W 3: %d", floatround(damage)) } if(damagebits & DMG_DROWN && sentryid == 3) { set_hudmessage(100, 255, 0, 0.81, 0.42, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync12, "W 4: %d", floatround(damage)) } if(MAX_SENTRY > 4 && sentryid >= 4) { set_hudmessage(100, 0, 255, 0.81, 0.47, 0, 6.0, 1.0) ShowSyncHudMsg(id, gSync13, "O: %d", floatround(damage)) } } else { ghave[attacker]++ if(ghave[attacker] == 1) { set_hudmessage(0, 255, 0, 0.55, 0.465, 0, 0.0, 1.0, 0.0, 0.2, 1) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 2) { set_hudmessage(0, 255, 0, 0.55, 0.5, 0, 0.0, 1.0, 0.0, 0.2, 2) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 3) { set_hudmessage(0, 255, 0, 0.55, 0.535, 0, 0.0, 1.0, 0.0, 0.2, 3) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 4) { set_hudmessage(0, 255, 0, 0.55, 0.57, 0, 0.0, 1.0, 0.0, 0.2, 4) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) } if(ghave[attacker] == 5) { set_hudmessage(0, 255, 0, 0.55, 0.605, 0, 0.0, 1.0, 0.0, 0.2, 1) ShowSyncHudMsg(attacker, gSync5, "%d", floatround(damage)) ghave[attacker] = 0 } } /* -- */ static Float:fOrigin[3] static Origin[3] pev(ent, pev_origin, fOrigin) FVecIVec(Origin, fOrigin) static Color[33][3] ; Color[id?id:attacker][0] = gPlayerAttackColorValue[id?id:attacker][0] Color[id?id:attacker][1] = gPlayerAttackColorValue[id?id:attacker][1] Color[id?id:attacker][2] = gPlayerAttackColorValue[id?id:attacker][2] msg_dlight(Origin, 10, Color[id?id:attacker], 3, 1) if(hp <= floatround(damage)) { new data[1] data[0] = id?id:attacker set_task(0.1, "TakeDamage2", ent, data, 1) if(is_valid_ent(pev(ent, pev_ent_health))) remove_entity(pev(ent, pev_ent_health)) } } if(!is_valid_ent(ent)) { client_print(0, 3, "take damage !pev vaild") gMonsterAlive--; if(gMonsterAlive < 0) gMonsterAlive=0 if(gMonsterAlive <= 0 && gWave && gStart && gGame) EndRound() return HAM_IGNORED } SetHamParamFloat(4, damage) return HAM_IGNORED } public TakeDamage2(Params[], ent) { new id = Params[0] gMonsterAlive--; if(gMonsterAlive < 0) gMonsterAlive=0 if(gMonsterAlive <= 0 && gWave && gStart && gGame) EndRound() if(is_user_connected(id)) { set_hudmessage(255, 255, 255, -1.0, 0.6, 0, 0.0, 1.0, 0.0, 0.3) ShowSyncHudMsg(id, gSync3, "KILL!") gPlayerPoints[id]+=get_pcvar_num(cvar_points_kill) cs_set_user_money(id, cs_get_user_money(id)+450) if(is_user_alive(id)) GiveAmmo(id, 20) set_user_frags(id, get_user_frags(id)+1) refreshFrags(id) } }Do zamknięcia! Przejdź do postu
#1
Napisano 05.05.2013 12:44
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#2
Napisano 05.05.2013 12:53
O co chodzi w tym, że tak powiem?
id?id:attacker
Sprawdzasz czy id jest większe, równe od 1 i jeżeli tak to nadajesz id=1, a jeżeli warunek jest niespełniony (id=0 - id serwera) to ?
Sell - System Klanów (wojny, top15 etc)
Kontakt GG: 7285018
#3
Napisano 05.05.2013 13:03
new id = 0 if(is_turret(attacker)) { id = get_sentry_owner_by_ent_id(attacker)
Id jest wtedy, gdy jest to właściciel wieżyczki ( gracz ), attacker jest wtedy kiedy jest to atakujący ( gracz ). Bo przecież nie mogę dać fragów wieżyczce
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#4
Napisano 05.05.2013 13:05
Sory, nie zauważyłem
Sell - System Klanów (wojny, top15 etc)
Kontakt GG: 7285018
#5
Napisano 05.05.2013 13:22
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#6
Napisano 05.05.2013 23:38
Polecam debug "na diodę" albo jak kto woli: na dziel i rządź.
Dodajesz po kolei console print, albo log z różnymi wartościami co każdy znaczący fragment kodu. Przy crashu patrzysz który z printów, czy tam logów zdążył się wypisać, a który nie. Pomiędzy masz swój błąd, szatkujesz więc ten kawałek na drobniejsze kawałki logami i jeszcze raz operacja taka
Użytkownik GwynBleidD edytował ten post 05.05.2013 23:39
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#7
Napisano 06.05.2013 07:25
if(is_user_alive(id?id:attacker)) { gPlayerPoints[id?id:attacker]+=get_pcvar_num(cvar_points_kill) cs_set_user_money(id?id:attacker, cs_get_user_money(id?id:attacker)+450) GiveAmmo(id?id:attacker, 20) set_user_frags(id?id:attacker, get_user_frags(id?id:attacker)+1) refreshFrags(id?id:attacker) } client_print(0, 3,"kill") }Nie wiem czy lepiej dać częśc kodu w post bo ten aktualny jest w pre
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#9
Napisano 06.05.2013 13:18
if(pev_valid(ent)) remove_entity(pev(ent, pev_ent_health)); - TUTAJ
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#10
Napisano 06.05.2013 14:28
To pokaż co po tym kill się wykonuje.
Co do invalid entity, sprawdź czy ent zwracany przez pev(ent, pev_ent_health) jest prawidłowy.
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#11
Napisano 06.05.2013 14:33
if(hp <= floatround(damage) && pev_valid(ent)) { gMonsterAlive--; if(gMonsterAlive < 0) gMonsterAlive=0 if(gMonsterAlive <= 0 && gWave && gStart && gGame) EndRound() if(pev_valid(ent)) remove_entity(pev(ent, pev_ent_health)); if(is_user_alive(id?id:attacker)) { gPlayerPoints[id?id:attacker]+=get_pcvar_num(cvar_points_kill) cs_set_user_money(id?id:attacker, cs_get_user_money(id?id:attacker)+450) GiveAmmo(id?id:attacker, 20) set_user_frags(id?id:attacker, get_user_frags(id?id:attacker)+1) refreshFrags(id?id:attacker) } client_print(0, 3,"kill") } } SetHamParamFloat(4, damage) return PLUGIN_CONTINUE }2. Dawałem i invalid entity pokazywało w tym ifie
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#12
Napisano 06.05.2013 15:01
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#13
Napisano 06.05.2013 17:24
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#14
Napisano 06.05.2013 18:32
if(pev_valid(ent))
remove_entity(pev(ent, pev_ent_health));
Sprawdzasz, czy istnieje "ent", a potem usuwasz coś co znajduje się pod "pev(ent, pev_ent_health)".
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#15
Napisano 06.05.2013 18:57
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#16
Napisano 06.05.2013 19:05
Ale to, co zwraca pev(ent, pev_ent_health) niekoniecznie musi istnieć...
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#17
Napisano 06.05.2013 19:20
pev(ent, pev_ent_health)Jest to id Ent'a healthbara tego potwora
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#18
Napisano 07.05.2013 06:36
#19
Napisano 07.05.2013 12:12
if(pev_valid(pev(ent, pev_ent_health))) remove_entity(pev(ent, pev_ent_health))
Wywala błąd na ifie, Invalid entity
Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości
#20
Napisano 07.05.2013 13:30
if(pev_valid(ent)) if(pev_valid(pev(ent, pev_ent_health))) remove_entity(pev(ent, pev_ent_health))
Musisz wszak sprawdzać, czy oba enty są prawidłowe
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych