Witam. Chciałbym poprosić o podpowiedź w sprawie zrobienia funkcji, dzięki której gracz o danym ID nie zadaje obrażeń CT. Z góry dziękuję za pomoc.
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] Gracz o danym ID nie zadaje obrażeń CT
Najlepsza odpowiedź Droso , 22.08.2013 19:08
Rozwiązanie już chyba poszło PW, kod podany jest dobry tylko norbi, go trochę umieścił w złym miejscu.
Norbi - potwierdź moje przewidywania najlepszą odpowiedzią, którą podałem wyżej
Przejdź do postu#1
Napisano 13.08.2013 17:58
#2
Napisano 13.08.2013 18:37
Gdzieś u góry dodaj zmienną globalną:
new HamHook:Uchwyt[33]
W miejscu w którym "łapiesz" id gracza rejestrujesz zdarzenie
Uchwyt[id] = RegisterHamFromEntity(Ham_TakeDamage, id, "Damage", 1);
id - index gracza
i dodajesz gdzieś pod kodem dodajesz:
public Damage(this,idinflictor,idattacker, Float:damage, damagebits) { if(get_user_team(this) == 2) return HAM_SUPERCEDE }
Teraz gdy chcesz aby gracz mógł znowu atakować przeciwny team używasz tej funkcji:
DisableHamForward(Uchwyt[id]);
Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!
Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują
#3
Napisano 13.08.2013 19:03
Jak jużGdzieś u góry dodaj zmienną globalną:
new HamHook:Uchwyt[33]W miejscu w którym "łapiesz" id gracza rejestrujesz zdarzenieUchwyt[id] = RegisterHamFromEntity(Ham_TakeDamage, id, "Damage", 1);id - index gracza
i dodajesz gdzieś pod kodem dodajesz:public Damage(this,idinflictor,idattacker, Float:damage, damagebits) { if(get_user_team(this) == 2) return HAM_SUPERCEDE }Teraz gdy chcesz aby gracz mógł znowu atakować przeciwny team używasz tej funkcji:DisableHamForward(Uchwyt[id]);
if(Uchwyt[id]) EnableHamForward(Uchwyt[id]); else Uchwyt[id] = RegisterHamFromEntity(Ham_TakeDamage, id, "Damage", 0); (...) public Damage(this,idinflictor,idattacker, Float:damage, damagebits) { if(get_user_team(this) == 2) return HAM_SUPERCEDE; return HAM_IGNORED; }a wyłączać lepiej jednak tak
if(Uchwyt[id]) DisableHamForward(Uchwyt[id]);na wszelki wypadek. I nie wiem czy ta funkcja wykona się tylko gdy zostanie trafiony gracz, bo jeśli nie, to przy bardziej skomplikowanych działaniach na graczu, wypadało by sprawdzić czy "this" jest id gracza.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#4
Napisano 13.08.2013 20:47
DarkGL to mój autorytet.
skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować
#5
Napisano 13.08.2013 21:06
Najprościej byłoby zapisać dane id do zmiennej globalnej zarejestrować Ham_TakeDamage jako pre (post = 0) i sprawdzać czy id osoby zadającej obrażenia jest równy zapisanemu wcześniej id, dodatkowo sprawdzić czy ofiara jest członkiem grupy ct, jeśli z założenia warunki będą prawdziwe powinniśmy zwrócić HAM_SUPERCEDE
W ten sposób event "Ham_TakeDamage" będzie wykonywał się u każdego gracza za każdym razem jak zada obrażenia. Może to by było prostsze ale czy bardziej optymalne no nie wydaje mi się.
Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!
Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują
#6
Napisano 14.08.2013 05:25
DarkGL to mój autorytet.
skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować
#7
Napisano 14.08.2013 05:36
Ale jako osoba pisząca programy zawsze musisz pamiętać że nie każdy ma super komputer. Dlatego powinno się zawsze myśleć o optymalności podczas pisania programów.
Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!
Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują
#8
Napisano 14.08.2013 09:32
Już tak z optymalnością nie przesadzajmy, akurat w tym przypadku dużej różnicy by nie było. Jeśli chodzi o pluginy, to sam staram się zawsze rejestrować jak najmniej forwardów (a już na pewno staram się nie podwajać tego samego), a jak coś rejestruję, to przeważnie na czas działania jakiejś rzeczy (tak jak to zrobiłeś tutaj), ale na pewno nie trzeba się aż tak rozdrabniać, żeby każdy forward był tylko dla jednego gracza, to trochę jak popadanie w skrajność.Ale jako osoba pisząca programy zawsze musisz pamiętać że nie każdy ma super komputer. Dlatego powinno się zawsze myśleć o optymalności podczas pisania programów.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#9
Napisano 14.08.2013 11:39
Jak jużGdzieś u góry dodaj zmienną globalną:
new HamHook:Uchwyt[33]W miejscu w którym "łapiesz" id gracza rejestrujesz zdarzenieUchwyt[id] = RegisterHamFromEntity(Ham_TakeDamage, id, "Damage", 1);id - index gracza
i dodajesz gdzieś pod kodem dodajesz:public Damage(this,idinflictor,idattacker, Float:damage, damagebits) { if(get_user_team(this) == 2) return HAM_SUPERCEDE }Teraz gdy chcesz aby gracz mógł znowu atakować przeciwny team używasz tej funkcji:DisableHamForward(Uchwyt[id]);if(Uchwyt[id]) EnableHamForward(Uchwyt[id]); else Uchwyt[id] = RegisterHamFromEntity(Ham_TakeDamage, id, "Damage", 0); (...) public Damage(this,idinflictor,idattacker, Float:damage, damagebits) { if(get_user_team(this) == 2) return HAM_SUPERCEDE; return HAM_IGNORED; }a wyłączać lepiej jednak takif(Uchwyt[id]) DisableHamForward(Uchwyt[id]);na wszelki wypadek. I nie wiem czy ta funkcja wykona się tylko gdy zostanie trafiony gracz, bo jeśli nie, to przy bardziej skomplikowanych działaniach na graczu, wypadało by sprawdzić czy "this" jest id gracza.
Na koniec rundy robię pętlę, wyłączam tak jak napisałeś i w następnej rundzie, jak gracz już nie ma FD to nadal nie może mnie zabić.
#10
Napisano 14.08.2013 11:46
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#11
Napisano 14.08.2013 12:01
public round_end() { czasfd = -1; remove_task(124); //wylacza dzien na hud server_cmd("jb_unblock_weapons"); g_PlayerFreeday = 0 g_PlayerLast = 0 killday1 = false; licz = 0 g_Simon = 0 g_SimonAllowed = 0 g_RoundStarted = 0 g_LastDenied = 0 rundy++; new Ent = -1 while((Ent = find_ent_by_class(Ent, "rpg_off"))) { remove_entity(Ent) } g_Freeday = 0 g_RoundEnd = 1 g_Duel = 0 g_Fonarik = 0 remove_task(TASK_STATUS); remove_task(TASK_FREEDAY); remove_task(TASK_FREEEND); remove_task(TASK_ROUND); remove_task(TASK_GIVEITEMS); for(new i = 0; i < sizeof(g_HudSync); i++) ClearSyncHud(0, g_HudSync[i][_hudsync]) if (g_GameMode > 1) { set_lights("#OFF"); fog(false); new Players[32], playerCount, i; get_players(Players, playerCount, "c"); for (i=0; i<playerCount; i++) { if (is_user_connected(Players[i])) { if(get_bit(g_BackToCT, Players[i])) cs_set_user_team2(Players[i], CS_TEAM_CT) client_infochanged(Players[i]); set_user_maxspeed(Players[i], 250.0); menu_cancel(Players[i]); player_strip_weapons(Players[i]); if(get_user_team(Players[i]) == 2) { set_user_maxspeed(Players[i], 0.0); } if(get_user_team(Players[i]) == 1) { set_user_godmode(Players[i], 0); } if(UchwytFreeDayGracz[Players[i]]) DisableHamForward(UchwytFreeDayGracz[Players[i]]); } } remove_task(7447); remove_task(666); g_BackToCT = 0 } g_GameMode = 1 }
#12
Napisano 14.08.2013 12:55
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 14.08.2013 13:29
W innej funkcji. Wrzuciłem ten kod co podałeś i działa, tylko się nie wyłącza i w następnej rundzie też nie zadaje się DMG.
Użytkownik norbi1952 edytował ten post 14.08.2013 13:30
#14
Napisano 22.08.2013 18:19
W tym przypadku będzie łatwiej użyć Ham_TakeDamage, jak dajesz gościowi FD to ustawiaj jakąś zmienną na TRUE;, a na koniec rundy ustawiaj wszystkim na FALSE;
public plugin_ini(){
(...)
RegisterHam(Ham_TakeDamage, "player", "TakeDamage", 0);
(...)
}
(...)
public TakeDamage(this, inf, attacker, Float:damage){ if(is_user_connected(attacker) && FreeDay[attacker] && is_user_alive(this) && get_user_team(this) == 1) return HAM_SUPERCEDE; return HAM_HANDLED; }
Użytkownik HubertTM edytował ten post 22.08.2013 18:20
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
#15
Napisano 22.08.2013 18:52
RegisterHam(Ham_TakeDamage, "player", "player_damage");
public player_damage(victim, ent, attacker, Float:damage, bits) { if (victim == attacker || !is_user_connected(attacker)) return HAM_IGNORED; if(get_user_team(victim) == 2 && FreeDayGracz[attacker]) { return HAM_SUPERCEDE; } if ((g_GameMode == 5)&& (g_Simon == attacker)) { set_user_rendering(attacker, kRenderFxNone, 0, 0, 0, kRenderNormal, 0) remove_task(7447) set_task(3.1, "task_inviz",7447); } switch(g_Duel) { case(0): { if(attacker == ent && get_user_weapon(attacker) == CSW_KNIFE && get_bit(g_PlayerCrowbar, attacker)) { SetHamParamFloat(4, damage * gc_CrowbarMul) return HAM_OVERRIDE; } } case(2): { if(attacker != g_PlayerLast) return HAM_SUPERCEDE; } default: { if((victim == g_DuelA && attacker == g_DuelB) || (victim == g_DuelB && attacker == g_DuelA)) return HAM_IGNORED; return HAM_SUPERCEDE; } } return HAM_IGNORED; }A na koniec rundy:
for(new i=1; i<=get_maxplayers(); i++) { if(is_user_connected(i)) { if(get_user_team(i) == 2) { set_user_maxspeed(i, 250.0); } if(get_user_team(i) == 1) { set_user_godmode(i, 0); } if(FreeDayGracz[i]) { FreeDayGracz[i] = false; } } }W następnej rundzie nadal nie zadaje obrażeń.
Oczywiście takie oczywiste rzeczy jak tworzenie zmiennej czy zmiana na true pominąłem.
#16
Napisano 22.08.2013 18:58
Jak jest zarejestrowany koniec rundy?
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
#17
Napisano 22.08.2013 18:59
register_logevent("round_end", 2, "1=Round_End");
#18
Napisano 22.08.2013 19:02
Jak możesz wyślij .sma tutaj lub PW, sam zajrzę i naprawię
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
#19
Napisano 22.08.2013 19:03
Poszło na PW.
#20
Napisano 22.08.2013 19:08 Najlepsza odpowiedź
Rozwiązanie już chyba poszło PW, kod podany jest dobry tylko norbi, go trochę umieścił w złym miejscu.
Norbi - potwierdź moje przewidywania najlepszą odpowiedzią, którą podałem wyżej
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych