←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Przenoszenie do TT FUNCKAJ

Pawlik4Ver - zdjęcie Pawlik4Ver 08.02.2019

Witam, chciałbym się spytać czy ta funkcja niżej jest dobrze skonstruowana:

Napisałem kod który po wejściu na serwer przenosi do TT, i działa dopiero jeżeli jest minimum 1 budowniczy, i jeżeli nie ma czasu budowania i przygotowania to przenosi do TT.

 

Może ktoś luknąć?

https://pastebin.com/68xJSi2Z

 


Użytkownik Pawlik4Ver edytował ten post 08.02.2019 19:05
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 08.02.2019

Odpowiedz sobie na jedno, ale to jedno za***iście ważne pytanie... "Dlaczego sam tego nie przetestuje?", a potem sam przetestuj.

 

Ludzie niedługo wam trzeba będzie tyłki podcierać.... troche samodzielnosci

 

 

A co do kodu - wygląda jak krowie z gardła wyciągnięty. proszę dbać o tabulacje, bo tutejsi forumowicze niechętnie patrzą na takie wstawki.

 

Also, pozmieniałbym kolejność warunków itp, jeden nawet zbędny jest

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 08.02.2019

Wersja z możliwością rozszyfrowania kodu:

PrzeniesDoTT(index)
{
	const minplayers = 1;

	for(new i = 1; i <= 32; i++)
	{
		if(!is_user_connected(i))
			continue;
		
		new team = get_user_team(i);

		if(team != get_user_team(index) || team != 2)
			continue;
	
		if(get_playersnum() < minplayers)
			continue;

		if(g_boolCanBuild || g_boolPrepTime)
			continue;

		engclient_cmd(index, "jointeam", "1");

		break;
	}
}

Fun fact: nie wiem po co robisz to w ten sposób.

 

Tworzysz pętlę, która wykonuje się (przykładowo) 32 razy, i za każdym razem, kiedy spełni się każdy z warunków, to przenosisz gracza do TT, po czym lecisz pętlę dalej.

Najlepiej opisz nam, jak ma działać ta funkcja.

Dodatkowo, pomyśl sam - jak przebiega proces tejże funkcji:

  • Wywołanie (przy connect'cie, tak jak napisałeś wyżej),
  • Deklaracja zmiennej,
  • Pętla dla (przykładowo) 32 graczy, a w niej:
  1. Sprawdzenie teamu graczy, które prowadzi do niczego.
  2. Sprawdzenie z każdą iteracją, czy get_playersnum() >= playersnum.
  3. Sprawdzenie z każdą iteracją, czy zmienne g_boolCanBuild oraz g_boolPrepTime mają wartość 1.
  4. Wykonanie komendy na graczu, jeśli przejdzie przez wszystkie ify.
  5. Powtórzenie iteracji.

 

Możesz zrobić tak:

PrzeniesDoTT(index)
{
	if(!is_user_connected(index))
		return;

	if(get_user_team(index) == 1)
		return;

	if(g_boolCanBuild || g_boolPrepTime)
		return;

	const minPlayers = 1;

	if(get_playersnum() < minPlayers)
		return;

	const minBuilders = 1;

	if(getBuildersCount() < minBuilders)
		return;

	engclient_cmd(index, "jointeam", "1");
}

getBuildersCount()
{
	new counter;

	for(new i = 1; i <= 32; i++)
		if(is_user_connected(i) && get_user_team(i) == 2 && is_user_alive(i))
			counter++;

	return counter;
}
Odpowiedz

Pawlik4Ver - zdjęcie Pawlik4Ver 08.02.2019

 

Wersja z możliwością rozszyfrowania kodu:

PrzeniesDoTT(index)
{
	const minplayers = 1;

	for(new i = 1; i <= 32; i++)
	{
		if(!is_user_connected(i))
			continue;
		
		new team = get_user_team(i);

		if(team != get_user_team(index) || team != 2)
			continue;
	
		if(get_playersnum() < minplayers)
			continue;

		if(g_boolCanBuild || g_boolPrepTime)
			continue;

		engclient_cmd(index, "jointeam", "1");

		break;
	}
}

Fun fact: nie wiem po co robisz to w ten sposób.

 

Tworzysz pętlę, która wykonuje się (przykładowo) 32 razy, i za każdym razem, kiedy spełni się każdy z warunków, to przenosisz gracza do TT, po czym lecisz pętlę dalej.

Najlepiej opisz nam, jak ma działać ta funkcja.

Dodatkowo, pomyśl sam - jak przebiega proces tejże funkcji:

  • Wywołanie (przy connect'cie, tak jak napisałeś wyżej),
  • Deklaracja zmiennej,
  • Pętla dla (przykładowo) 32 graczy, a w niej:
  1. Sprawdzenie teamu graczy, które prowadzi do niczego.
  2. Sprawdzenie z każdą iteracją, czy get_playersnum() >= playersnum.
  3. Sprawdzenie z każdą iteracją, czy zmienne g_boolCanBuild oraz g_boolPrepTime mają wartość 1.
  4. Wykonanie komendy na graczu, jeśli przejdzie przez wszystkie ify.
  5. Powtórzenie iteracji.

 

Możesz zrobić tak:

PrzeniesDoTT(index)
{
	if(!is_user_connected(index))
		return;

	if(get_user_team(index) == 1)
		return;

	if(g_boolCanBuild || g_boolPrepTime)
		return;

	const minPlayers = 1;

	if(get_playersnum() < minPlayers)
		return;

	const minBuilders = 1;

	if(getBuildersCount() < minBuilders)
		return;

	engclient_cmd(index, "jointeam", "1");
}

getBuildersCount()
{
	new counter;

	for(new i = 1; i <= 32; i++)
		if(is_user_connected(i) && get_user_team(i) == 2 && is_user_alive(i))
			counter++;

	return counter;
}

czy zamiast engclient_cmd(index, "jointeam", "1"); moge zastosować cs_set_user_team(idCS_TEAM_CT)?

 

 

 

chodzi mi o:

aby gdy gracz wejdzie na serwer po czasie budowania czyli g_boolCanBuild , to przerzuca go do TT


Użytkownik Pawlik4Ver edytował ten post 08.02.2019 19:44
Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 08.02.2019

Jak dobrze pamiętam, to był jakiś problem z cs_set_user_team, że to nie działało zgodnie z nazwą (bądź w nieoczekiwany sposóB), ale na 100% nie wiem. Możesz spróbować, ewentualnie posiłkować się tym, ale zaczerpnąłem to z zp 4.3, więc nie wiem jak zadziała na nowszych AMXXach.

const OFFSET_CSTEAMS = 114;
const OFFSET_LINUX = 5;
const TASK_TEAMUPDATE = 1337;

switchTeam(index, team, bool:update)
{
	set_pdata_int(index, OFFSET_CSTEAMS, team, OFFSET_LINUX);

	if(update)
		set_task(0.1, "updateTeam", index + TASK_TEAMUPDATE);
}

public updateTeam(taskIndex)
{
	new index = taskIndex - TASK_TEAMUPDATE;

	if(!is_user_connected(index))
		return;

	static messageTeamInfo;

	if(!messageTeamInfo)
		messageTeamInfo = get_user_msgid("TeamInfo");

	new const teamNames[][] =
	{
		"UNASSIGNED",
		"TERRORIST",
		"CT",
		"SPECTATOR"
	};

	emessage_begin(MSG_ALL, messageTeamInfo);
	ewrite_byte(index);
	ewrite_string(teamNames[get_pdata_int(index, OFFSET_CSTEAMS, OFFSET_LINUX)]);
	emessage_end();
}
Odpowiedz

  • +
  • -
Albertd - zdjęcie Albertd 12.02.2019

Czytając twoją sygnę można by się spodziewać że takiego rzeczy potrafisz robić.

Tworze strony Internetowe/WWW (HTML5/CSS, PHP), oraz robię paczki do cs1.6( pisze pluginy też ) na zamówienie.

SPRZEDAM PACZKĘ BASEBUILDER DNKS, mod doskonalony paczka możliwa do zobaczenia przed zakupem, więcej na priv lub GG: 62653757

Skontaktować możesz się zemną przez GG:62653757

A twoje rozwiązanie to: putinserver można by zamienić na faktyczne dołączenie do drużyny ale już powinieneś wiedzieć jak to zrobić.

public client_putinserver(id){	
	
	if( task_exists(id+581222) )
		remove_task(id+581222)
	set_task(5.0, "checkTeam", id+581222)
}
public checkTeam(id){
	id -= 581222
	
	if(g_boolCanBuild)
		return
	
	if( get_user_team(id) == 1 )
		return
	
	cs_set_user_team(id, 1)
}

Użytkownik Albertd edytował ten post 12.02.2019 22:03
Odpowiedz

Pawlik4Ver - zdjęcie Pawlik4Ver 24.02.2019

A dziękuję :) 

No niestety Albertd nie miałem pomysłu, stwierdzam lenia. Ale dzięki.

Odpowiedz