←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Wyświetlanie nicków kilku ofiar

  • +
  • -
psilocybe - zdjęcie psilocybe 08.11.2014

Może to jest banalne a może nie ale sam do tego nie mogę dojść.

 

Będę pisał w skrócie bo każdy chyba rozumie o co chodzi:

 

W DeathMsg przy zabiciu granatem mam warunek np.:

if(Killer != Victim && Fragi == 2)
{
set_task(0.05,"doubleNade",id)
}

public doubleNade(id)
{
new Killer = read_data(1);
new Victim = read_data(2);

new Kname[32], Vname[32];
get_user_name(Killer,Kname,charsmax(Kname));
get_user_name(Victim,Vname,charsmax(Vname));

show_hudmessage(0, "Gracz %s zabil graczy %s i %s granatem!", Kname, Vname, Vname2)
}

Fragi mi liczy i resetuje set_task i działa prawidłowo więc pomijam oczywiste rzeczy, chodzi mi tylko o to jak pobrać i wyświetlić więcej niż jeden nick, w tym przypadku nicki dwóch ofiar.

 

Jak pobrać "Vname2" ?


Użytkownik psilocybe edytował ten post 08.11.2014 11:38
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 08.11.2014

Może to jest banalne a może nie ale sam do tego nie mogę dojść.

 

Będę pisał w skrócie bo każdy chyba rozumie o co chodzi:

 

W DeathMsg przy zabiciu granatem mam warunek np.:

if(Killer != Victim && Fragi == 2)
{
set_task(0.05,"doubleNade",id)
}

public doubleNade(id)
{
new Killer = read_data(1);
new Victim = read_data(2);

new Kname[32], Vname[32];
get_user_name(Killer,Kname,charsmax(Kname));
get_user_name(Victim,Vname,charsmax(Vname));

show_hudmessage(0, "Gracz %s zabil graczy %s i %s granatem!", Kname, Vname, Vname2)
}

Fragi mi liczy i resetuje set_task i działa prawidłowo więc pomijam oczywiste rzeczy, chodzi mi tylko o to jak pobrać i wyświetlić więcej niż jeden nick, w tym przypadku nicki dwóch ofiar.

 

Jak pobrać "Vname2" ?

 

 

Podbijam i piszę jeszcze prościej, przy zabiciu więcej niż jednego gracza granatem wyświetlam na czacie info (foto niżej)

 

cstrike.jpg
 

To jest w DeathMsg więc dla każdego zabicia wyświetla nowe info - ja chcę przykładowo te 4 ofiary wyświetlić w jednej linijce tekstu czyli np. "Gracz X zabił graczy A, B, C i D jednym granatem!"

 

Proszę o pomoc.

Odpowiedz

  • +
  • -
Engi - zdjęcie Engi 09.11.2014

Coś ucina z tel połowę kodu więc muszę dać w wklejce

Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 09.11.2014

Zamysł miałem taki sam, lecz nie potrafię zapisać nicków kilku ofiar w tablicy globalnej a później w tasku nie potrafię ich pobrać.

 

Gdybyś mógł napisać nieco jaśniej, był bym wdzięczny. Nie musisz testować, byle bym zrozumiał jak zapisać i pobrać nicki kilku ofiar.

Odpowiedz

  • +
  • -
Engi - zdjęcie Engi 09.11.2014

http://amxx.pl/topic...miczne-tablice/

Ewentualnie zobacz czy coś takiego działa albo zrób sobie na wzór tego

Spoiler


Nie testowane
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 10.11.2014

Przeczytałem temat R3X'a o tablicach dynamicznych, później z powyższego kodu wyciągnąłem wszystko co potrzebne i plugin się kompiluje bez problemów ale nie działa.

 

Wyświetla prawidłowo jedną linijkę na czacie lecz wiadomość wygląda tak:

Gracz [ zabił graczy M granatem!

Nie mam pojęcia jak to ogarnąć, co lepsze nawet nicka zabójcy nie wyświetla poprawnie i skąd to "[" i "M"?

 

Uciąża mi strasznie ta kwestia bo chciałem koniecznie to mieć a nie znając podstaw to ja sobie mogę dynamicznie zapomnieć o tym :)

 

Patrzyłem nawet w kod pliku statsx.sma bo tam jest przecież wyświetlanie wielu nicków jednocześnie ale nic rozsądnego tam nie znalazłem, czarna magia.

 

 

Edit: w tym przypadku trzeba będzie jeszcze wyczyścić tą tablicę po wyświetleniu nicków o ile do tego dojdę ale odkryłem że to "M" to pierwsza litera nicku pierwszej ofiary i do póki nie wyczyściłem tablicy (reset serwera) to było "M", później inna literka a jako zabójca jest zawsze "[" lub "]", liczę na waszą pomoc.


Użytkownik psilocybe edytował ten post 10.11.2014 02:35
Odpowiedz

  • +
  • -
Engi - zdjęcie Engi 10.11.2014

Przeczytałem temat R3X'a o tablicach dynamicznych

Edit: w tym przypadku trzeba będzie jeszcze wyczyścić tą tablicę po wyświetleniu nicków o ile do tego dojdę ale odkryłem że to "M" to pierwsza litera nicku pierwszej ofiary i do póki nie wyczyściłem tablicy (reset serwera) to było "M"


Zaprzeczasz sam sobie, tam jest napisane jak wyczyścić tą tablicę (a mi zapomniało się dopisać tego czyszczenia wink.png )

Dopisz pod wyświetleniem info w doubleNade
ArrayClear(nicki);
W doubleNade trzeba "przepisać" tablicę "wnick" na zwykłego stringa albo inaczej odwołać się do "wnick" w show_hudmessage, a nie mam pojęcia jak zrobić (bo jak dalej "wnick" będzie tablicą to będzie jedną literkę wyświetlało, bynajmniej tak mi się wydaje), prostsze byłoby użycie foreach od DarkGL'a ale nie mam pojęcia jak to w amxx napisać haha.gif
Brakuje mi w tych tablicach prostej funkcji która wywali wszystkie z niej dane do jakiegoś stringa, w PHP to jest proste bo wystarczy foreach($a as $ B) $s .= $b; dziękuję dobranoc, a tutaj trzeba podać index takiej tablicy ;_;
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 10.11.2014

Nie ogarnę tego sam, patrzyłem też w kod pluginu admin_check.sma, tam wyświetlane są na say'u nicki wszystkich adminów ale nic nie potrafię wyciągnąć z tego kodu.

 

Zobacz w *.sma tego pluginu może coś wymyślisz?

Załączone pliki

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 10.11.2014

A czy zamiast przechowywać wszystkie dane o graczu jak nick, kolor skóry, nuber buta, filuta długość i średnice nie prościej samo id? A później pobierać to sobie w wygodnym momencie.

I skąd na miłość boską mania używania tasków. 

Dodatkowo nikt nigdzie nie sprawdził czy śmierć następuje w wyniku zabójstwa granatem. Przecież równie szybko jedna po drugiej może nastąpić śmierć w wyniku przestrzelenia dwóch graczy w jednej linii z awp.

 

 

Nie testowałem, bo nie mam jak. Wiadomość powinna się pokazać w ciągu kilku sekund od śmierci.

#include <amxmodx>
new Float:last_kill[33],ofiary[33][10]//zakładam, że więcej niż 10 nie zabije:D 
public plugin_init() 
{
	register_plugin("grenade multikill","0.1","grankee");
	register_event("DeathMsg", "DeathMsg", "a");
	register_event("ClCorpse", "hook_corpse", "a", "12>0")
}

public DeathMsg()
{
	new Killer = read_data(1);
	new Victim = read_data(2);
	
	if(!Killer || Killer==Victim)
		return PLUGIN_CONTINUE
	new weapon[64]		
	read_data(4,weapon,63)
	if(!equali(weapon,"HEGRENADE"))	
		return PLUGIN_CONTINUE
		
	
	
	if(last_kill[Killer]+0.2>get_gametime())
	{
		for(new i=1;i<10;i++)
		{
			if(ofiary[Killer][i]==0)
			{
				ofiary[Killer][i]=Victim
			}
		}
	}
	else
	{
		for(new i=1;i<10;i++)
		{
			ofiary[Killer][i]=0			
		}//Czyszczenie tablicy ofiar, tak dla pewności
		ofiary[Killer][0]=Victim
	}
	last_kill[Killer]=get_gametime()
	
}

public hook_corpse()
{
	new id = read_data(12)
	for(new i=0;i<33;i++)
	{
		if(ofiary[i][0]==id)
		{
			new text[256],name[32]
			get_user_name(i,name,31)
			format(text,255,"%s zabil graczy",name)
			get_user_name(ofiary[Killer][0],name,31)
			format(text,255,"%s: %s",text,name)
			for(new a=1;ofiary[Killer][a]>0;a++)
			{
				get_user_name(ofiary[Killer][a])
				ofiary[Killer][a]=0
				format(text,255,"%s, %s",text,name)
			}
			format(text,255," %s granatem.",text,name)
			break
		}
	}
}
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 10.11.2014

Drobna podpowiedź: przy DeathMsg przy zabiciu z granata otrzymujemy ID bytu granata, co może się przydać do wykrycia czy gracze zostali zabici z tego samego granata na pewno :)

Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 10.11.2014

Powyższy kod się nawet nie kompiluje :(

 

1. Ja już mam zrobiony warunek przy zabiciu z granata i nie "HEGRENADE" tylko "grenade" chyba powinno być bo tak się nazywa rzucony granat :)

 

2. Nawet nie wiedziałem o tym evencie "ClCorpse" a tym bardziej że 12 argument to ID trupa :D

 

Nie bardzo rozumiem to wszystko, pętle, tablice to mnie przerasta a nie chcę w swoim pluginie czegoś czego nie rozumiem więc sobię odpuszczę chyba. Zostanę chyba przy tej opcji co mam bo są już policzone fragi więc wyświetlam "Gracz Killer zabił X graczy jednym he" gdzie X to fragi.

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 11.11.2014

Skoro nie rozumiesz pętli i tablic to może postaraj się zrozumieć to... Twoje rozwiązanie nie działa prawidłowo i będzie dużo trudniej je naprawić, niż zrozumieć jak działa (lub powinno działać) to co zaproponował 1045

Odpowiedz