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

Do TT po zrobieniu reconnecta


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 wonsz żeczny

    Wszechwidzący

  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 20.01.2016 14:57

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

  • +
  • -
  • 0

#2 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 20.01.2016 20:10

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


  • +
  • -
  • 1

#3 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 21.01.2016 19:06

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


  • +
  • -
  • 0

#4 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 23.01.2016 12:45

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


  • +
  • -
  • 0

#5 vanillah

    nie wiem

  • Użytkownik

Reputacja: 125
Zaawansowany

  • Postów:324
  • GG:
  • Lokalizacja:Polska
Offline

Napisano 23.01.2016 13:16

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

  • +
  • -
  • 0

Wykonam pluginy, paczki (amxx) kontakt GG: 32263742, Steam: https://steamcommuni...om/id/vankillah

Multi-Head.pl


#6 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 23.01.2016 13:41

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


  • +
  • -
  • 0

#7 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 23.01.2016 15:51

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

  • +
  • -
  • 1

#8 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 23.01.2016 17:29

#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 :/


  • +
  • -
  • 0

#9 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 23.01.2016 20:01


#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

  • +
  • -
  • 1

#10 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 24.01.2016 01:10

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ł?


  • +
  • -
  • 0

#11 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 25.01.2016 13:18

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

  • +
  • -
  • 0

#12 wonsz żeczny

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 82
Zaawansowany

  • Postów:254
  • Imię:Wonsz
  • Lokalizacja:Żeka
Offline

Napisano 25.01.2016 20:47

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


  • +
  • -
  • 0

#13 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 25.01.2016 21:33

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


  • +
  • -
  • 1




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych