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] Jak zignorowac HLTV?



Najlepsza odpowiedź Gość_21977_* , 24.08.2013 14:55

1.
Jeśli ma to być co piąta runda, to dzielimy rundę modulo na 5 i jeśli wynik jest równy 0, to oznacza, że runda ≡ 0 (mod 5), innymi słowy, jest wielokrotnością 5.
 
Zamiast tego switcha, użyj prostego:

if(!(runda%5))

2.
Fragmenty:

new zwyciezca=gracze[random(liczbaGraczy)];
nagrodzeni[zwyciezca]=true;

mogą być poza switchem, DRY.
 
3.
Pętla FOR nie uwzględnia żadnych warunków.
Skoro zamierzasz dać graczowi nagrodę, wypadałoby sprawdzić, czy dany gracz:

  • jest na serwerze (nie możesz dać nagrody komuś, kogo nie ma):
    is_user_connected(id)
  • nie jest botem (po co botom nagroda):
    !is_user_bot(id)
  • nie jest HLTV (sedno problemu):
    !is_user_hltv(id)

Ostatecznie uzyskując postać:

for (new id=1; id<=maxPlayers; ++id){
	if(
			is_user_connected(id)
		&&	!is_user_bot(id)
		&&	!is_user_hltv(id)
	){
		gracze[liczbaGraczy]=id;
		++liczbaGraczy;
	}
}

4.

Jeśli nie znalazłeś graczy, którzy są na serwerze, czyt. liczbaGraczy wynosi 0,

to nie losuj nagrody, gdyż nie masz komu jej dać, np. przy pustym serwerze.

 

5.

Rejestrowałeś cvar dobrze:

cvar_rebkasa = register_cvar("random_event_bonus_money", "8000");

cvar_rebkasa to zmienna, przechowująca pointer na cvar, pobieramy go natomiast funkcją get_pcvar_ z końcówką zgodną z typem cvara,

w Twoim wypadku funkcją get_pcvar_num, przykład użycia w Twoim kodzie:

add_user_money(zwyciezca, get_pcvar_num(cvar_rebkasa));
Przejdź do postu


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

#1 Hagis

    Początkujący

  • Użytkownik

Reputacja: -2
Nowy

  • Postów:13
  • Imię:Ryszard
  • Lokalizacja:Dom
Offline

Napisano 24.08.2013 14:23

Witam, jestem młodym programistą amxx i mam drobny problem

z napisanym przeze mnie pluginem na podstawie poradnika na tym forum.

 

W skrócie plugin ten co 5 rund na początku rundy losuje jednego gracza i daje mu bonus pod

postacią dolarów, monet lub expa. Warto też zaznaczyć, że napisałem go na Cod mod.

Jaki jest problem?

Zdarza się, że zamiast potencjalnego gracza wylosowane zostaje HLTV, przez co nagroda jest

tracona.

W związku z tym, mam 3 pytania:

1.Czy dobrym rozwiązaniem jest dodanie 1 if, który sprawdzał by, czy gracz ma wybraną klasę?

Jednak nie koniecznie zwykły gracz musi akurat w tej chwili mieć klasę, może właśnie wszedł?

 

2.Czy jest jakaś komenda, która "cofała by kod", tak, aby w przypadku wylosowania gracza o

nicku HLTV cały kod poleciał od początku, aż do natrafienia na innego gracza?

Niby można wsadzić cały kod w pętlę..

 

3.Czy jest po prostu inny sposób, na wylosowanie gracza pomijając HLTV?

Jak powiedziałem jestem młodym programistą i nie znam wszystkich komend i rozwiązań.

 

Jeśli jeden z moich pomysłów jest trafny to wskażcie mi go, jeśli znacie lepsze rozwiązanie,

proszę o podzielenie się nim :)

#include <amxmodx>
#include <cstrike>
#include <codmod>

native cod_set_user_coins(id, wartosc);
native cod_get_user_coins(id);

#define add_user_money(%1,%2) cs_set_user_money(%1,cs_get_user_money(%1)+%2)
#define add_user_coins(%1,%2) cod_set_user_coins(%1,cod_get_user_coins(%1)+%2)
#define add_user_xp(%1,%2) cod_set_user_xp(%1, cod_get_user_xp(%1)+%2)

//zmienne zawierające - raczej latwe
new runda, maxPlayers,bool:nagrodzeni[33];

new cvar_rebkasa = 8000;
new cvar_rebmonety = 15;
new cvar_rebxp = 1000;

public plugin_init() {
	register_plugin("Randomb Event Bonus", "0.2", "Hagis");

	register_event("HLTV", "newRound", "a", "1=0", "2=0");
    register_logevent("roundStart", 2, "1=Round_Start");
    register_logevent("GameCommencing", 2, "1=Game_Commencing");
	
	/*
	* cvar_rebkasa = register_cvar("random_event_bonus_money", "8000");
	* cvar_rebmonety = register_cvar("random_event_bonus_coins", "10");
	* cvar_rebxp = register_cvar("random_event_bonus_experience", "1000");
	* Nie umiem tego do konca uzywac i dzieja sie dziwne rzeczy..
	*/
}

//pobieranie maxPlayers
public plugin_cfg(){
	maxPlayers=get_maxplayers();
}

//nowa runda
public newRound(){
	++runda;
}

//podwójny reset na poczatku każdej mapy
public GameCommencing(){
	runda=0;
}


public roundStart(){
	new name[32];
	switch(runda){
		case 5, 10, 15, 20, 25, 30:{ //Więcej nie powinno być
		//client_print(0, print_chat, "Losowanie wypalilo w rundzie %d", runda); //
		new gracze[32];
		new liczbaGraczy;
			for (new id=1; id<=maxPlayers; ++id){
				gracze[liczbaGraczy]=id;
				++liczbaGraczy;
			}
	
			
			switch(random(3))	//PAMIĘTAJ, ŻE MA BYĆ O 1 WIĘCEJ
			{ 	case 0:	{
			if(liczbaGraczy){ //nagroda w dolarach
				new zwyciezca=gracze[random(liczbaGraczy)];
				add_user_money(zwyciezca, cvar_rebkasa);
				client_print(zwyciezca, print_chat, "To twoj szczesliwy dzien! Dostales %d dolarow!",cvar_rebkasa);
				get_user_info(zwyciezca, "name", name, 31);
				client_print(0, print_chat, "%s dostal bonus w tej rundzie.", name );
				nagrodzeni[zwyciezca]=true;
			} 			}
			
				case 1:	{
			if(liczbaGraczy){ //nagroda w monetach
				new zwyciezca=gracze[random(liczbaGraczy)];
				add_user_coins(zwyciezca, cvar_rebmonety);
				client_print(zwyciezca, print_chat, "To twoj szczesliwy dzien! Dostales %d monet!", cvar_rebmonety);
				get_user_info(zwyciezca, "name", name, 31);
				client_print(0, print_chat, "%s dostal bonus w tej rundzie.", name );
				nagrodzeni[zwyciezca]=true;
			} 			} 
			
				case 2:	{
			if(liczbaGraczy){ //nagroda w expie
				new zwyciezca=gracze[random(liczbaGraczy)];
				add_user_xp(zwyciezca, cvar_rebxp);
				client_print(zwyciezca, print_chat, "To twoj szczesliwy dzien! Dostales dodatkowe %d expa!", cvar_rebxp);
				get_user_info(zwyciezca, "name", name, 31);
				client_print(0, print_chat, "%s dostal bonus w tej rundzie.", name );
				nagrodzeni[zwyciezca]=true;
				
				
			} 			}
			
			}
			
		}
	}
}

public client_putinserver(id){
	nagrodzeni[id]=false;
}

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/

Jak widać próbowałem w kodzie umieścić cvary. Próbowałem, to dobre słowo.

Nie umiem tego do końca robić, w chwili wrzucania tego na serwer nie wiedziałem,

że cvary trzeba również umieścić w configach i 2 graczy dostało 6-cyfrową liczbę monet...

Jakby ktoś miał link do odpowiedniego tutorialu co do cvarów, to bardzo chętnie go przegryzę ;)


  • +
  • -
  • 0

#2 .K3K

    Ja tu tylko sprzątam :s

  • Zbanowany

Reputacja: 46
Pomocny

  • Postów:263
  • Imię:Karol
  • Lokalizacja:Poznań
Offline

Napisano 24.08.2013 14:30

z ingorowaniem hltv chyba musiał byś nadać ignore na daną flagę? albo na immunited nie lossowało by adminów ale hltv też.
b_350_20_18CE03_051005_FFFFFF_111111.png

#3 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 24.08.2013 14:55   Najlepsza odpowiedź

1.
Jeśli ma to być co piąta runda, to dzielimy rundę modulo na 5 i jeśli wynik jest równy 0, to oznacza, że runda ≡ 0 (mod 5), innymi słowy, jest wielokrotnością 5.
 
Zamiast tego switcha, użyj prostego:

if(!(runda%5))

2.
Fragmenty:

new zwyciezca=gracze[random(liczbaGraczy)];
nagrodzeni[zwyciezca]=true;

mogą być poza switchem, DRY.
 
3.
Pętla FOR nie uwzględnia żadnych warunków.
Skoro zamierzasz dać graczowi nagrodę, wypadałoby sprawdzić, czy dany gracz:

  • jest na serwerze (nie możesz dać nagrody komuś, kogo nie ma):
    is_user_connected(id)
  • nie jest botem (po co botom nagroda):
    !is_user_bot(id)
  • nie jest HLTV (sedno problemu):
    !is_user_hltv(id)

Ostatecznie uzyskując postać:

for (new id=1; id<=maxPlayers; ++id){
	if(
			is_user_connected(id)
		&&	!is_user_bot(id)
		&&	!is_user_hltv(id)
	){
		gracze[liczbaGraczy]=id;
		++liczbaGraczy;
	}
}

4.

Jeśli nie znalazłeś graczy, którzy są na serwerze, czyt. liczbaGraczy wynosi 0,

to nie losuj nagrody, gdyż nie masz komu jej dać, np. przy pustym serwerze.

 

5.

Rejestrowałeś cvar dobrze:

cvar_rebkasa = register_cvar("random_event_bonus_money", "8000");

cvar_rebkasa to zmienna, przechowująca pointer na cvar, pobieramy go natomiast funkcją get_pcvar_ z końcówką zgodną z typem cvara,

w Twoim wypadku funkcją get_pcvar_num, przykład użycia w Twoim kodzie:

add_user_money(zwyciezca, get_pcvar_num(cvar_rebkasa));


#4 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 24.08.2013 14:56

Automatyczna wiadomość


Ten temat został przeniesiony z forum

AMX Mod XProblemy z pluginami

do

Scripting AMXXProblemy

#5 Hagis

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: -2
Nowy

  • Postów:13
  • Imię:Ryszard
  • Lokalizacja:Dom
Offline

Napisano 24.08.2013 15:08

Dziękuję. Wrzuciłem plugin, nie testowałem go, ale nie wydaje mi się, że mogło by coś pójść nie tak. Nie zrobiłem cvarów, więc nie ma się co zepsuć :)


  • +
  • -
  • 0

#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 24.08.2013 20:30

Zamiast tylu warunków i obrotów pętli nie lepiej zrobić pętle z get_players()
  • +
  • -
  • 0

DarkGL to mój autorytet.

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






Również z jednym lub większą ilością słów kluczowych:

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

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