←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Funkcja na 4 losowych graczach...

Locked

  • +
  • -
Harsay's Photo Harsay 25.05.2010

Mam pytanie.
Jak napisać funkcję która wybiera 4 losowych graczy i wykonuje na nich np. przeniesienie do CT a reszta co nie została wybrana żeby przeszła do TT.

Czekam na odpowiedź!
Quote

  • +
  • -
mgr inż. Pavulon's Photo mgr inż. Pavulon 25.05.2010

Ja bym to zrobił na tablicach dynamicznych.
Najpierw pobranie listy graczy. get_players
Następnie pętla na nich wszystkich ze sprawdzaniem jakiegoś warunku(np. team) oraz dokładaniem do tablicy dynamicznej. ArrayPushCell
A na koniec losowanie oraz pobieranie i usuwanie wylosowanych graczy z tablicy dynamicznej. ArrayGetCell, ArrayDeleteItem
Quote

  • +
  • -
byCZUS's Photo byCZUS 25.05.2010


public costutaj()
{
new players[32], num
new bool: wylosowany[33]
get_players(players, num)

if(num > 1)
{
for(new i = 0; i < num; i++) wylosowany[players[i]] = false

new i = 0
while(i < 5)
{
wylosowany[players[random_num(0, num-1)]] = true
i++
}

for(new i = 0; i < num; i++)
{
if(wylosowany[players[i]])
{
// tutaj co chcesz zrobic z wylosowanymi id - players[i]
}
else
{
// z reszta
}
}
}
}
Quote

  • +
  • -
Harsay's Photo Harsay 25.05.2010

Pavulon i byQQ, wielkie dzięki.

Pavulon - Fajnie że napisałeś z czego mam to zrobić i dzięki temu ruszyłem głową do obmyślania jak to złożyć. + leci!
byQQ - Dzięki za podanie całego kodu! + leci!
Quote

  • +
  • -
mgr inż. Pavulon's Photo mgr inż. Pavulon 25.05.2010

byQQ a co jak dany gracz zostanie wylosowany więcej niż 1 raz ? :P
Quote

  • +
  • -
byCZUS's Photo byCZUS 25.05.2010

Można to zrobić to tak


while(i < 5)
{
new losowy = players[random_num(0, num-1)]

if(!wylosowany[losowy])
{
wylosowany[losowy] = true
i++
}
}

Edited by byQQ, 25.05.2010 15:15.
Quote

  • +
  • -
Harsay's Photo Harsay 25.05.2010

A czy ta funkcja wykonywana jest też na botach?

@edit
Bo akurat jak testuje na botach to nie działa.
Edited by Harsay, 25.05.2010 15:19.
Quote

  • +
  • -
byCZUS's Photo byCZUS 25.05.2010

tak na botach również jest wykonywana. Jeśli tego nie chcesz get_players powinien wyglądać tak
get_players(players, num, "c")
Quote

  • +
  • -
Harsay's Photo Harsay 25.05.2010

Dobra ale to wtedy jest dziwne bo akurat normalnie nie losuje bez flagi "c" a chcę aby uzwględniało boty.
Edited by Harsay, 25.05.2010 19:34.
Quote

  • +
  • -
byCZUS's Photo byCZUS 25.05.2010

A umiesz użyć tego co Ci podałem ;> ^^
Quote

  • +
  • -
Harsay's Photo Harsay 26.05.2010

Oto okrojony kodzik:

public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        register_logevent("poczatek", 2, "1=Round_Start")
        ...
}

public poczatek() {
        for(new i=1;i<33;i++){
                if (!is_user_alive(i)) continue
                ...
	       set_task(1.0, "losowanie", i)
                ...
             }
}
public losowanie()
{
	new players[32], num
	new bool: wylosowany[33]
	get_players(players, num)
        
	if(num > 1)
	{
		for(new i = 0; i < num; i++) wylosowany[players[i]] = false
                                
		new i = 0
		while(i < 5)
		{
			new losowy = players[random_num(0, num-1)]
			
			if(!wylosowany[losowy])
			{
				wylosowany[losowy] = true       
				i++
				}               
			for(new i = 0; i < num; i++)
			{
				if(wylosowany[players[i]])
				{
                                  /// KOD którego nie ujawniam.					
				}
				else 
				{
                                /// kod którego nie ujawniam
					{
						case 1:
						{
							// jak wyżej
						}
 
						case 2:
						{
							// jak wyżej
						}
 
						case 3:
						{
							// jak wyżej
						}  
					}	
				}
			}
		}
	}
}

Coś jest źle?
Quote

  • +
  • -
byCZUS's Photo byCZUS 26.05.2010

nie wiem po co do set_taska nadajesz id, do tego używasz case ale nie widzę switch.
Quote

  • +
  • -
Harsay's Photo Harsay 26.05.2010

Dobra cały kod:
public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        register_logevent("poczatek", 2, "1=Round_Start")
        register_logevent("koniec", 2, "1=Round_End") 
        register_event("DeathMsg", "DeathMsg", "b")
        RegisterHam(Ham_Touch, "weaponbox", "fw_TouchWeapon")
        RegisterHam(Ham_Touch, "armoury_entity", "fw_TouchWeapon")
        RegisterHam(Ham_Touch, "weapon_shield", "fw_TouchWeapon")
        set_lights("b")	
        
}

public poczatek() {
        for(new i=1;i<33;i++){
                if (!is_user_alive(i)) continue
	       strip_user_weapons(i);
	       cs_set_user_money(i, 0);
	       set_task(1.0, "losowanie", i)	
                set_task(10.0, "reklama",i)
                set_hudmessage(i, 255, 0, 0.18, 0.24, 0, 6.0, 12.0)
                show_hudmessage(i, "Ludzie musza przetrwac 5 minut!")
                ColorChat(0, GREEN,"[ZOMGies] Ludzie musza przetrwac 5 minut!")
	} 		 
}

public losowanie()
{
	new players[32], num
	new bool: wylosowany[33]
	get_players(players, num)
        
	if(num > 1)
	{
		for(new i = 0; i < num; i++) wylosowany[players[i]] = false
                                
		new i = 0
		while(i < 5)
		{
			new losowy = players[random_num(0, num-1)]
			
			if(!wylosowany[losowy])
			{
				wylosowany[losowy] = true       
				i++
				}               
			for(new i = 0; i < num; i++)
			{
				if(wylosowany[players[i]])
				{
					cs_set_user_team(i, CS_TEAM_CT)
					cs_set_user_model(i, "vip") 		
					set_user_health(i, 200) 
					set_user_armor(i, 100) 
					give_item (i, "weapon_m4a1") 
					give_item (i, "weapon_deagle")
					give_item (i, "ammo_556nato") 
					give_item (i, "ammo_50ae")
					give_item (i, "ammo_556nato") 
					give_item (i, "ammo_50ae")
					give_item (i, "ammo_556nato") 
					give_item (i, "ammo_50ae")
					give_item (i, "he_grenade")  					
				}
				else 
				{
					cs_set_user_team(i, CS_TEAM_T)
					set_user_gravity(i, 0.40)      
					set_user_health(i, 90) 
					give_item(i, "weapon_knife")
					set_user_maxspeed (i, 720.0)
					switch ( random_num( 1, 3 ) )
					{
						case 1:
						{
							cs_set_user_model(i, "zombie_guerilla")
						}
 
						case 2:
						{
							cs_set_user_model(i, "zombie_gign")
						}
 
						case 3:
						{
							cs_set_user_model(i, "zombie_source")
						}  
					}	
				}
			}
		}
	}
}

public koniec(id) {	
        ColorChat(id, GREEN,"[ZOMGies] Koniec walki!")
        client_cmd(id, "spk ZOMGies/koniec_walki.wav")	
}

public reklama(id) {
        ColorChat(id, GREEN,"***********SERWER UZYWA***********") 
        ColorChat(id, GREEN,"ZOMGies MOD by Harsay")
        ColorChat(id, GREEN,"Wersja: v0.3a")
        ColorChat(id, GREEN,"Strona autora: www.harsay.rfv.pl")
        ColorChat(id, GREEN,"Pomoc przy tworzeniu: [H]ARD[B]OT, DarkGL, [G]o[Q], Pavulon, byQQ, DeLL")
}

public DeathMsg(id) {	
	if(cs_get_user_team(id) == CS_TEAM_T) 
	ExecuteHamB(Ham_CS_RoundRespawn, id)

}

public fw_TouchWeapon(weapon,id)
{
        if (!is_user_connected(id))
                return HAM_IGNORED;
        
        if(get_user_team(id) == 1)
                return HAM_SUPERCEDE;
        
        return HAM_IGNORED;
}

public plugin_precache() {
	precache_sound("ZOMGies/koniec_walki.wav")
	precache_model("models/player/zombie_guerilla/zombie_guerilla.mdl")
	precache_model("models/player/zombie_gign/zombie_gign.mdl")
	precache_model("models/player/zombie_source/zombie_source.mdl")
}
Quote

  • +
  • -
R3X's Photo R3X 26.05.2010

Używasz zmiennej i np. tu
cs_set_user_team(i, CS_TEAM_CT)
gdy id gracza jest tak naprawdę w players[i]

give_item (i, "he_grenade")
ten fragment nie powoduje errorlogów?
Quote

  • +
  • -
Harsay's Photo Harsay 27.05.2010

Rozumiem że zamiast:
cs_set_user_team(i, CS_TEAM_CT)

Mam dać
cs_set_user_team( CS_TEAM_CT )

@zrobiłem tak i same errory przy kompilacji wywala
Edited by Harsay, 27.05.2010 09:35.
Quote

  • +
  • -
kyku's Photo kyku 27.05.2010

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("poczatek", 2, "1=Round_Start")
register_logevent("koniec", 2, "1=Round_End")
register_event("DeathMsg", "DeathMsg", "b")
RegisterHam(Ham_Touch, "weaponbox", "fw_TouchWeapon")
RegisterHam(Ham_Touch, "armoury_entity", "fw_TouchWeapon")
RegisterHam(Ham_Touch, "weapon_shield", "fw_TouchWeapon")
set_lights("b")

}

public poczatek() {

strip_user_weapons(0);
cs_set_user_money(0, 0);
set_task(1.0, "losowanie")
set_task(10.0, "reklama")
set_hudmessage(0, 255, 0, 0.18, 0.24, 0, 6.0, 12.0)
show_hudmessage(0, "Ludzie musza przetrwac 5 minut!")
ColorChat(0, GREEN,"[ZOMGies] Ludzie musza przetrwac 5 minut!")

}

public losowanie()
{
new ilu_losowac = 5 // jak chcesz to zmien (ile osob ma miec wylosowany[id] = true;)

new players[32], num, jest
new bool: wylosowany[33]
get_players(players, num, "a" ) // tylko zywi

if(num >= ilu_losowac)
{

while(jest<ilu_losowac){
new id = players[random_num(0, num)]
if(is_user_connected(id) && is_user_alive(id)){
wylosowany[id] = true;
jest++;
}
}

for(new id=0; id<num; id++){
new i = players[id];

if(wylosowany[i]){

if(get_user_team(i) != CS_TEAM_CT) cs_set_user_team(i, CS_TEAM_CT) // po co przenosic skoro jest w tym teamie?
cs_set_user_model(i, "vip")
set_user_health(i, 200)
set_user_armor(i, 100)
give_item (i, "weapon_m4a1")
give_item (i, "weapon_deagle")
give_item (i, "ammo_556nato")
give_item (i, "ammo_50ae")
give_item (i, "ammo_556nato")
give_item (i, "ammo_50ae")
give_item (i, "ammo_556nato")
give_item (i, "ammo_50ae")
give_item (i, "he_grenade")

} else {

if(get_user_team(i) != CS_TEAM_T) cs_set_user_team(i, CS_TEAM_T)
set_user_gravity(i, 0.40)
set_user_health(i, 90)
give_item(i, "weapon_knife")
set_user_maxspeed (i, 720.0)
switch ( random_num( 1, 3 ) )
{
case 1:
{
cs_set_user_model(i, "zombie_guerilla")
}

case 2:
{
cs_set_user_model(i, "zombie_gign")
}

case 3:
{
cs_set_user_model(i, "zombie_source")
}
}

}

}

}
else
client_print(0, print_chat, "Nie ma na serwerze %i osob!", ilu_losowac);



}

public koniec() { // koniec nie ma parametru ID!
ColorChat(0, GREEN,"[ZOMGies] Koniec walki!")
client_cmd(0, "spk ZOMGies/koniec_walki.wav")
}

public reklama() {
ColorChat(0, GREEN,"***********SERWER UZYWA***********")
ColorChat(0, GREEN,"ZOMGies MOD by Harsay")
ColorChat(0, GREEN,"Wersja: v0.3a")
ColorChat(0, GREEN,"Strona autora: www.harsay.rfv.pl")
ColorChat(0, GREEN,"Pomoc przy tworzeniu: [H]ARD[B]OT, DarkGL, [G]o[Q], Pavulon, byQQ, DeLL")
}

public DeathMsg() { //DeathMsg nie ma parametru ID!
new id = read_data(2)
if(cs_get_user_team(id) == CS_TEAM_T)
ExecuteHamB(Ham_CS_RoundRespawn, id) // pasowalo by to w tasku zrobic lub przynajmnniej zablokowac komende "kill"

}

public fw_TouchWeapon(weapon,id)
{
if (!is_user_connected(id))
return HAM_IGNORED;

if(get_user_team(id) == 1)
return HAM_SUPERCEDE;

return HAM_IGNORED;
}

public plugin_precache() {
precache_sound("ZOMGies/koniec_walki.wav")
precache_model("models/player/zombie_guerilla/zombie_guerilla.mdl")
precache_model("models/player/zombie_gign/zombie_gign.mdl")
precache_model("models/player/zombie_source/zombie_source.mdl")
}

Co powiesz na to? funkcje losujaca zrobilem od poczatku

27 maj 2010 - 11:42:
tylko z tego co widze to wylosowanych 5 osob bedzie jako ludzie a nie wydaje mi sie by o to Ci chodzilo.
Jak cos to zmien
if(wylosowany[i]){
na
if(!wylosowany[i]){

Edited by kyku, 27.05.2010 10:48.
Quote

  • +
  • -
Harsay's Photo Harsay 27.05.2010

Dobra już sprawdzam.

@EDIT
Tylko jak ktoś jest w CT i go nie wylosuje to zmienia mu team na TT? Tak?
Edited by Harsay, 27.05.2010 10:49.
Quote

  • +
  • -
kyku's Photo kyku 27.05.2010

a i dodam, ze poprawilem Ci wiekszosc bugow :P
@ UP
tak
Edited by kyku, 27.05.2010 10:50.
Quote

  • +
  • -
Harsay's Photo Harsay 27.05.2010

Dobra akurat trochę zmieniłem plany to możesz zmienić losowanie na takie:
Że losowane jest tylko zmiana teamu (żadne dawanie broni itp.)
Edited by Harsay, 27.05.2010 10:56.
Quote

  • +
  • -
kyku's Photo kyku 27.05.2010

Spoiler
Quote
Locked