Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[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


  • Zamknięty Temat jest zamknięty
19 odpowiedzi w tym temacie

#1 szelbi

    Hero

  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 13.08.2013 17:58

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.


  • +
  • -
  • 0

#2 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

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]);

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

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 Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#3 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 13.08.2013 19:03

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]);

Jak już
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.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#4 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 13.08.2013 20:47

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
  • +
  • -
  • 1

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#5 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

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ę. 


  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

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 Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#6 K!113r

    Teraz to chyba Sławek kek

  • Power User

Reputacja: 387
Wszechpomocny

  • Postów:868
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 14.08.2013 05:25

Napisałem prościej, nic nie pisałem o optymalności.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#7 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

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.


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

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 Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#8 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 14.08.2013 09:32

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.

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ść.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#9 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 14.08.2013 11:39

 

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]);
Jak już
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.

 

 

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ć.


  • +
  • -
  • 0

#10 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 14.08.2013 11:46

Bez większej ilości kodu ja nic nie poradzę, wróżką nie jestem.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#11 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

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
}

  • +
  • -
  • 0

#12 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 14.08.2013 12:55

Czyli to jest jb? A gdzie rejestrujesz te obrażenia?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#13 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

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

  • +
  • -
  • 0

#14 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1 291
Godlike

  • Postów:2 371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Wrocław
Offline

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;
}

Droso (22.08.2013 18:20):
Nie wiem po co się męczyć z uchwytami, jak pewnie twój silnik UJBM już używa Ham_TakeDamage

Użytkownik HubertTM edytował ten post 22.08.2013 18:20

  • +
  • -
  • 1

Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!

Na zlecenie i bez zlecenia zresztą też!


#15 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

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.
  • +
  • -
  • 0

#16 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1 291
Godlike

  • Postów:2 371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Wrocław
Offline

Napisano 22.08.2013 18:58

Jak jest zarejestrowany koniec rundy?


  • +
  • -
  • 0

Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!

Na zlecenie i bez zlecenia zresztą też!


#17 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 22.08.2013 18:59

register_logevent("round_end", 2, "1=Round_End");

  • +
  • -
  • 0

#18 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1 291
Godlike

  • Postów:2 371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Wrocław
Offline

Napisano 22.08.2013 19:02

Jak możesz wyślij .sma tutaj lub PW, sam zajrzę i naprawię ;)


  • +
  • -
  • 0

Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!

Na zlecenie i bez zlecenia zresztą też!


#19 szelbi

    Hero

  • Autor tematu
  • Power User

Reputacja: 373
Wszechpomocny

  • Postów:1 032
  • Steam:steam
  • Imię:Norbert
  • Lokalizacja:Częstochowa
Offline

Napisano 22.08.2013 19:03

Poszło na PW.


  • +
  • -
  • 0

#20 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1 291
Godlike

  • Postów:2 371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Wrocław
Offline

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 ;)


  • +
  • -
  • 0

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