←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Do TT po zrobieniu reconnecta

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 20.01.2016

Witam.

Próbuję napisać plugin, który za zadanie ma przenoszenie do terrorystów gdy osoba w ciągu 60 sekund zrobi reconnect.

Jednak ten plugin mi nie chce działać a ja bez radny nie wiem dlaczego.

#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#define PLUGIN "Anty Reconnect"
#define VERSION "1.0"
#define AUTHOR "rst"

new bool:wyszedl[33]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
		
	return PLUGIN_CONTINUE
}

public client_putinserver(id) 
{
	if ((is_user_bot(id)) || ( get_user_flags(id) & ADMIN_IMMUNITY))
	return PLUGIN_HANDLED

	if( wyszedl[id] == true && get_user_team(id) == 2)
	{
	przenies(id)
	}

	return PLUGIN_HANDLED;
}

public client_disconnect(id) 
{
	if ((is_user_bot(id)) || (get_user_flags(id) & ADMIN_IMMUNITY))
	return PLUGIN_HANDLED

	wyszedl[id] = true

	set_task( 60.0, "Koniec", id)

	return PLUGIN_HANDLED;
}


public Koniec(id) 
{
	wyszedl[id] = false
}

public przenies(id) 
{
	if( wyszedl[id] == true)
	{
	cs_set_user_team(id, CS_TEAM_T, CS_T_TERROR)
	client_cmd(id, "say Zrobiles reconnect. Zostales przeniesiony do tt")
	}
}


Użytkownik wonsz żeczny edytował ten post 20.01.2016 15:00
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 20.01.2016

Szanowny panie "bez radny"- bezradny piszemy razem, to jest jedno słowo.

Co do Twojego problemu:

1. Nie możesz wewnątrz funkcji client_disconnect(id) sprawdzać czy gracz jest adminem, w zasadzie nie możesz nic tam sprawdzać, bo w momencie wykonania się tej funkcji gracza nie ma już na serwerze. Jeśli potrzebujesz tam informacji o graczu to musisz je wczytać do zmiennej globalnej kiedy gracz wejdzie na serwer, w przypadku informacji czy jest adminem nalezy zrobic to w fukncji client_authorized(id) (nie w client_connect, bo tam gracz jeszcze nie ma przydzielonych flag admina).

2. Nie możesz bazować na numerze id, ponieważ jak gracz wyjdzie i w jego miejsce wejdzie inny gracz to dostanie jego id i wg Twojego pluginu zostanie wzięty jako ten co wyszedł mimo, że to całkiem kto inny. Z resztą, nawet jak gracz da recconecta to niue ma pewności, że dostanie ten sam numer id.

Żeby w miarę dobrze identyfikować graczy musisz na wejsciu (client_authorized) pobierać ich SID/IP do zmiennej globalnej a na wyjściu (client_disconnect) je sprawdzać i zapisywać do zmiennej "wyszedł". Teraz jak gracz wchodzi to porównujesz jego SID/IP z całą tabelą zapisanych SID/IP graczy co wyszli i wtedy wiesz czy był on na serwerze przez ostatnią minutę.

Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 21.01.2016

Dzięki wielkie za wspaniałe wytłumaczenie.

Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 23.01.2016

Zrobiłem teraz korzystając z pluginu "No retry" lecz nadal nie działa.

#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#define PLUGIN "Anty Reconnect"
#define VERSION "1.0"
#define AUTHOR "rst"

#define MAX_PLAYERS 33

new pID[MAX_PLAYERS][22]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
		
	return PLUGIN_CONTINUE
}

public client_putinserver(id) 
{
	if ((is_user_bot(id)) || ( get_user_flags(id) & ADMIN_IMMUNITY))
	return PLUGIN_HANDLED

	new ip[22]
	get_user_ip(id,ip,21)

	for(new i = 1; i < MAX_PLAYERS; i++) 
	{
		if (equal(ip, pID[i], 21)) 
		{

			new uID[1]
			uID[0] = get_user_userid(id)

			set_task(1.0,"przenies",77,uID,1)


		}
			
		break
	}
	
	return PLUGIN_HANDLED;
}

public client_disconnect(id) 
{
	new ip[22]
	get_user_ip(id,ip,21)
	new found = 0;

	for(new i = 1; i < MAX_PLAYERS; i++) 
	{
		if (equal(ip, pID[i], 21)) 
		{
			found = 1
			break
		}
	}

	if (found == 0)
	{
		for(new i = 1; i < MAX_PLAYERS; i++)
		{
			if (pID[i][0] == 0)
			{
				get_user_ip(id, pID[i], 21)
				new aID[1]
				aID[0] = i
				set_task( 60.0, "cleanID", (id + MAX_PLAYERS),aID,1)
	
				break
			}
		}
	}

	return PLUGIN_HANDLED;
}

public cleanID(i[])
{
	pID[i[0]][0] = 0
}

public przenies(id[]) 
{
	cs_set_user_team(id[0], CS_TEAM_T, CS_T_TERROR)
	cs_user_spawn(id[0])
	cs_user_spawn(id[0])
	client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")
}

Napis z tego

     client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")

Nie wyświetla się.

Odpowiedz

  • +
  • -
vanillah - zdjęcie vanillah 23.01.2016

zamiast 

client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")

spróbuj

client_print(id[0], print_chat, "Zrobiles reconnect. Zostales przeniesiony do tt");


Użytkownik Trikolos edytował ten post 23.01.2016 13:17
Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 23.01.2016

Chodzi o to, że nie przerzuca do tt a z tym napisem chodzi, że plugin nie dochodzi do momentu public przenies(id[])

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 23.01.2016

dodałem Ci kilka komentarzy co źle robisz


#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#define PLUGIN "Anty Reconnect"
#define VERSION "1.0"
#define AUTHOR "rst"

#define MAX_PLAYERS 33

new pID[MAX_PLAYERS][22]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
		
	return PLUGIN_CONTINUE
}

public client_putinserver(id) 
{
	if ((is_user_bot(id)) || ( get_user_flags(id) & ADMIN_IMMUNITY))
	return PLUGIN_HANDLED

	new ip[22]
	get_user_ip(id,ip,21)//pobnierasz IP gracza

	for(new i = 1; i < MAX_PLAYERS; i++) 
	{
		if (equal(ip, pID[i], 21)) //porównujesz IP z UID, nigdy nie będzie takie samo. Musisz albo używać IP albo UID
		{

			new uID[1]
			uID[0] = get_user_userid(id)//nie potrzebne Ci tutaj userid tylko authid (STEAM_costam)

			set_task(1.0,"przenies",77,uID,1)


		}
			
		break
	}
	
	return PLUGIN_HANDLED;
}

public client_disconnect(id) 
{
	new ip[22]
	get_user_ip(id,ip,21)//pisałem już wcześniej, nie możesz tutaj pobrać zadnych danych gracza, bo go juz nie ma na serwie
	new found = 0;

	for(new i = 1; i < MAX_PLAYERS; i++) 
	{
		if (equal(ip, pID[i], 21)) 
		{
			found = 1
			break
		}
	}

	if (found == 0)
	{
		for(new i = 1; i < MAX_PLAYERS; i++)
		{
			if (pID[i][0] == 0)
			{
				get_user_ip(id, pID[i], 21)
				new aID[1]
				aID[0] = i
				set_task( 60.0, "cleanID", (id + MAX_PLAYERS),aID,1)
	
				break
			}
		}
	}

	return PLUGIN_HANDLED;
}

public cleanID(i[])
{
	pID[i[0]][0] = 0
}

public przenies(id[]) 
{
	cs_set_user_team(id[0], CS_TEAM_T, CS_T_TERROR)
	cs_user_spawn(id[0])
	cs_user_spawn(id[0])
	client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")
}

W ogóle to nie radzę używać pluginu jako bazy jeśli robisz coś więcej niż bardzo drobna modyfikacja, bo więcej stracisz czasu na przerabianie niż napisanie od nowa.

 

 

Ogólny zarys:


new gOstatniaMinuta[60][22]//60 to ilosc elementow tablicy, sadze, ze wiecej osob w ciagu minuty nie bedzie sie laczylo, 22 to UID/IP, zmienisz sobie co bedziesz chcial
new gPlayersId[33][22]//tu bedzie zapisywal authid gracZy na wejsciu
public client_authorized(id)
{
	
	-pobierasz authid do zmiennej gPlayersId[id]
	-porownujesz funkcja contain w pętli z każdym elementem tablicy gOstatniaMinuta, pamiętaj, że jak funkcja contain zwróci 0 to znaczy, że porównnane elementy są takie same, jak są inne to zwraca -1.
		-jeśli znaleziono to przerzucasz do terro, 
		-jeśli nie znaleziono to szukasz pętlą pierwszego wolnego  miejsca w tablicy gOstatniaMinuta i wpisujesz tam UID(szukania dokonujesz sprawdzając wartość pierwszego elementu tablicy czyli gOstatniaMinuta[i][0], dalej w kodzie bedziesz go ustawial na 0
	-szukasz petla pierwszego wolnego miejsca w tablicy gOstatniaMinuta i zapisujesz tam UID
}
public client_disconnect(id)
{
	-szukasz petla pierwszego wolnego miejsca w tablicy gOstatniaMinuta i zapisujesz tam gPlayersId[id]
	-robisz taska na minute, który ustawi na 0 pierwszy znak w tej tablicy (gOstatniaMinuta[numer_miejsca_jakiego_uzyles][0]=0)
}

Użytkownik grankee edytował ten post 23.01.2016 15:52
Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 23.01.2016

#include <amxmodx>
#include <amxmisc>
#include <cstrike>

#define PLUGIN "Anty Reconnect"
#define VERSION "1.0"
#define AUTHOR "rst"

#define MAX_PLAYERS 33

new gOstatniaMinuta[60][22]

new gPlayersId[33][22]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
}

public client_authorized(id) 
{
	if ( get_user_flags(id) & ADMIN_IMMUNITY )
	return PLUGIN_HANDLED

	// jak to sprawdzic :/

	get_user_authid( gPlayersId[id] )
	// tak tez nie zbyt

	get_user_authid(id, gPlayersId[id] )

	for(new i = 1; i < MAX_PLAYERS; i++) 
	{
		if (contain( gPlayersId[i][], gOstatniaMinuta[i]) ) 
		{
			set_task(1.0, "przenies", gPlayersId[i])

		} else {

			// dobrze szukam?

			for( gOstatniaMinuta[i][0], OstatniaMinuta[i] < 60, OstatniaMinuta[i]++ )
			{
				new uID[i]
				
				uID[i] = 0
			}
		}
	}
	
}

public client_disconnect(id) 
{
	// dobrze szukam?

	for( gOstatniaMinuta[i][0], OstatniaMinuta[i] < 60, OstatniaMinuta[i]++ )
	{

	// jak zapisac ? hmm

	gPlayersId[i] = 1

	// tutaj tez sie zabugilem

	set_task(60.0, gOstatniaMinuta[i][0] = 0)
	}
}

public przenies(id[]) 
{
	cs_set_user_team(id[0], CS_TEAM_T, CS_T_TERROR)
	cs_user_spawn(id[0])
	cs_user_spawn(id[0])
	client_cmd(id[0], "say Zrobiles reconnect. Zostales przeniesiony do tt")
}

Takich rzeczy jeszcze nie ogarniam, kilka wskazówek by się przydało :/

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 23.01.2016


#include <amxmodx>
#include <amxmisc>
#include <cstrike>





new gOstatniaMinuta[60][22]

new gPlayersId[33][22]
new gDoTerro[33]
public plugin_init() 
{
	register_plugin("Force tt after retry","0.1","grankee")
	register_event("TeamInfo","team_assign","a")
}

public client_authorized(id) 
{
	if ( get_user_flags(id) & ADMIN_IMMUNITY )
		return PLUGIN_CONTINUE
	gDoTerro[id]=0
	
	
	get_user_authid(id,gPlayersId[id],21 )//authid jest pobierane jako ciąg znaków, zwykły "wyraz"
	
	
	for(new i = 1; i < /*MAX_PLAYERS*/60/*tu musi byc 60, bo szukamy wsrod 60-elementowej tablicy*/; i++) 
	{
		if (contain( gPlayersId[id], gOstatniaMinuta[i]) ==0) //pisałem Ci: 0 oznacza, że są takie same!
		{
			//set_task(1.0, "przenies", gPlayersId[i])//przenoszenie od razu bedzie robiło bugi, bo gracz nie dołączył jeszcze do drużyny, trzeba zapisac jego id jako przypisane do wymuszenia druzyny i forsowac to w evencie jointeam
			gDoTerro[id]=1
			gOstatniaMinuta[i][0]=0//zwalniamy miejsce w tablicy
			
		}
	}
	return PLUGIN_CONTINUE
}

public client_disconnect(id) 
{
	// dobrze szukam?
	
	for( new a=0;a<60;a++)
	{
		if(gOstatniaMinuta[a][0]==0)//wolne miejsce w tablicy
		{
			copy(gOstatniaMinuta[a],21,gPlayersId[id])//kopiujemy tutaj SID osoby opuszczającej serwer
			set_task(60.0,"usun_minute",a)//robimy taska, co ma sie usunac za minute
			return PLUGIN_CONTINUE
		}
	}
	log_amx("Tablica gOstatniaMinuta okazala sie za mala, zwieksz ja!")//na wypadek jak w praktyce okaze sie, ze jest za mala, sprawdzaj logi i jak znajdziesz ten napis to zwieksz
	return PLUGIN_CONTINUE
}
public usun_minute(id)
{
	gOstatniaMinuta[id][0]=0
}
public team_assign()
{
	static old_team[33]
	new tid
	new id = read_data(1)
	new Team[32]
	read_data(2,Team,31)	//UNASSIGNED
				//TERRORIST
				//CT
				//SPECTATOR
	if(equal(Team,"UNASSIGNED")) tid = 0
	else if(equal(Team,"TERRORIST")) tid = 1
	else if(equal(Team,"CT")) tid = 2
	else if(equal(Team,"SPECTATOR")) tid = 3
	
	if(old_team[id]==tid) return PLUGIN_CONTINUE	//jesli druzyna sie nie zmienila to przerywamy event
	
	old_team[id] = tid				//zapisujemy nowy team
	
	if(gDoTerro[id]==1) 
        {
              cs_set_user_team(id,CS_TEAM_T)
              gDoTerro[id]=0
        }
	return PLUGIN_CONTINUE 		// skoro juz uzylismy returna to musimy tez na koniec go dac
}

Tylko w tej wersji gracz przylapany na retry nie bedzie mogl wejsc do tt juz do konca mapy


Użytkownik grankee edytował ten post 25.01.2016 21:31
Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 24.01.2016

Próbowałem tak ale kompilator wywalał errory więc sobie odpuściłem :D

	get_user_authid(id,gPlayersId[id],21 )

A o co chodzi z tym?

Tylko w tej wersji gracz przylapany na retry nie bedzie mogl wejsc do tt juz do konca mapy

Czy że do ct nie będzie mógł?

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 25.01.2016

znaczy do ct, bedzie go wrzucalo juz do konca mapy do tt

 

 

  get_user_authid(id,gPlayersId[id],21 )

A o co chodzi z tym?

 

Standardowe pobranie ciągu znaków do tablicy zmiennych


Użytkownik grankee edytował ten post 25.01.2016 13:20
Odpowiedz

  • +
  • -
wonsz żeczny - zdjęcie wonsz żeczny 25.01.2016

A można by zrobić aby mógł potem do tego tt, np. gdy drużyny są nie równe to aby mogło go przerzucić.

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 25.01.2016

tak, już zedytowałem treść pluginu, teraz po dołączzeniu odblokuje się wejście do terro, ale musisz zadbać, aby ptb blokowało samodzielne zmienianie drużyn, będzie bowiem ciężko zablokować graczowi zmianę drużyny a jednocześnie umożliwić to PTB (czy jakiego tam balancera uzywasz). Trzebaby natywy robić i edytować także ptb

Odpowiedz