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

Blokowanie shotgunów w zależności od ilości graczyBlokowanie shotgunów na ZombieMod


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

#1 Sooldierr

    Zaawansowany

  • Użytkownik

Reputacja: 3
Nowy

  • Postów:94
  • Lokalizacja:Turek
Offline

Napisano 03.12.2014 16:40

Witam. 

 

Staram się zrobić plugin blokujący shotguny, jeśli graczy spodnie poniżej wartości określonej cvarem.

Plugin sprawdza co rundę na jej początku ilość graczy (nie licząc spektatorów) i jeśli jest niższa niż wymagana to:

 

  • nie można kupić shotguna
  • jeśli gracz zachował shotguna z poprzedniej rundy to go traci
  • jeśli na ziemi leży shotgun, to nie można go podnieść

 

Mam problem, aby zrobić by plugin odpowiednio blokował lub nie robił nic. Prawdopodobnie żle zwracam wartości returnami, ale właściwie to się na tym, nie znam i prosiłbym o edukacyjny temat, link lub własne wyjaśnienie :F

 

O to mój kod:

#include <amxmodx>
#include <amxmisc>
#include <StripWeapons>
#include <hamsandwich>
#include <fun>
#include <cstrike>

#define PLUGIN "Shotguns Limited"
#define VERSION "0.1"
#define AUTHOR "$OLDIER"

#define IsPlayer(%1) (1<=%1<=maxPlayers)

new pys_num, enabled, Players[32], Num, maxPlayers, rounds=0;
//new Nums, Num2;
//new Players2[32];

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_event("HLTV", "round_start", "a", "1=0", "2=0")
	register_cvar("shotgunsblock_enabled", "1")
	register_cvar("shotguns_players", "8")
	
	register_logevent("round_end", 2, "1=Round_End") 
	register_event("TextMsg","restart_roundsnum","a","2&#Game_C"/*,"2&#Game_w"*/)
 
	register_clcmd("m3","block");
	register_clcmd("xm1014","block");
	
	RegisterHam( Ham_Touch, "weaponbox", "HamTouchPre", 0 )
	
	pys_num = get_cvar_num("shotguns_players")
	enabled = get_cvar_num("shotgunsblock_enabled")
}
public plugin_cfg()
{
	maxPlayers=get_maxplayers();
}
public round_start()
{
	get_players(Players, Num, "a");
	
	client_print(0, print_chat, "%d", Num) // tutaj sobie dodałem w celu sprawdzenia jak liczy graczy
	
	if(enabled == 1 && rounds != 0)
	{
		if (Num<pys_num)
		{
			for(new i=0; i < Num; i++)
			{
				new id=Players[i];
				if(user_has_weapon(id, CSW_M3) || user_has_weapon(id, CSW_XM1014))
				{
					StripWeapons(id, Primary);
					client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");
				}
			}
		}
	}
	return true
}

public round_end()
{
	rounds++;
}
public restart_roundsnum()
{
	rounds = 0;
}
public block(id)	
{
	if(enabled == 1  && rounds !=0)
	{
		if (Num<pys_num)
		{
			client_print(id, print_chat, "Nie mozesz kupic tej broni, gdy respi sie tylko jedna matka Zombie");
			return PLUGIN_CONTINUE
		}
	}
	return PLUGIN_HANDLED
}
public HamTouchPre( weapon, id )
{
	if(enabled == 1 && rounds !=0)
	{
		if (Num<pys_num)
		{
			if(!pev_valid(weapon) || !IsPlayer(id) || !is_user_alive(id))
			{
				return HAM_IGNORED;
			}
			new name[20];
			pev(weapon, pev_model, name, 19);
			if(containi(name, "w_m3")!=-1)
			{
			client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
			return HAM_SUPERCEDE;
			}
			
			new name2[20];
			pev(weapon, pev_model, name2, 19);
			if(containi(name, "w_xm1014")!=-1)
			{
			client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
			return HAM_SUPERCEDE;
			}
		}
	}
	return PLUGIN_CONTINUE
}


  • +
  • -
  • 0

#2 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

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

Napisano 03.12.2014 18:50

#include <amxmodx>
#include <amxmisc>
#include <StripWeapons>
#include <hamsandwich>
#include <fun>
#include <cstrike>

#define PLUGIN "Shotguns Limited"
#define VERSION "0.1"
#define AUTHOR "$OLDIER"

#define IsPlayer(%1) (1<=%1<=maxPlayers)

new pys_num, enabled, Players[32], Num, maxPlayers, rounds=0;
//new Nums, Num2;
//new Players2[32];

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_event("HLTV", "round_start", "a", "1=0", "2=0")
	register_cvar("shotgunsblock_enabled", "1")
	register_cvar("shotguns_players", "8")
	
	register_logevent("round_end", 2, "1=Round_End") 
	register_event("TextMsg","restart_roundsnum","a","2&#Game_C"/*,"2&#Game_w"*/)
 
	register_clcmd("m3","block");
	register_clcmd("xm1014","block");
	
	RegisterHam( Ham_Touch, "weaponbox", "HamTouchPre", 0 )
	
	pys_num = get_cvar_num("shotguns_players")
	enabled = get_cvar_num("shotgunsblock_enabled")
}
public plugin_cfg()
{
	maxPlayers=get_maxplayers();
}
public round_start()
{
	get_players(Players, Num, "a");
	
	client_print(0, print_chat, "%d", Num) // tutaj sobie dodałem w celu sprawdzenia jak liczy graczy
	
	if(enabled == 1 && rounds != 0)
	{
		if (Num<pys_num)
		{
			for(new i=0; i < Num; i++)
			{
				new id=Players[i];
				if(user_has_weapon(id, CSW_M3) || user_has_weapon(id, CSW_XM1014))
				{
					StripWeapons(id, Primary);
					client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");
				}
			}
		}
	}
	return true
}

public round_end()
{
	rounds++;
}
public restart_roundsnum()
{
	rounds = 0;
}
public block(id)	
{
	if(enabled == 1  && rounds !=0)
	{
		if (Num<pys_num)
		{
			client_print(id, print_chat, "Nie mozesz kupic tej broni, gdy respi sie tylko jedna matka Zombie");
			return PLUGIN_CONTINUE//zwracając PLUGIN_CONTINUE pozwalasz na wykonanie tej komendy, a w tym miejscu powinieneś ją blokować czyli return PLUGIN_HANDLED
		}
	}
	return PLUGIN_HANDLED//blokujesz, a powinieneś pozwolić czyli return PLUGIN_CONTINUE
}
public HamTouchPre( weapon, id )
{
	if(enabled == 1 && rounds !=0)
	{
		if (Num<pys_num)//możesz dorzucić ten warunek do ifa wyżej, wydaje mi się, że niepotrzebnie tworzysz drugiego ifa
		{
			if(!pev_valid(weapon) || !IsPlayer(id) || !is_user_alive(id))//IsPlayer niepotrzebne, jeśli to nie będzie gracz to funkcja is_user_alive(id) zwróci 0 nie powodując błędu.
			//w dodatku na 99% pev_valid(weapon) zawsze zwróci 1, bo gdyby byt nie istniał to by nie wywołał toucha.
			{
				return HAM_IGNORED;
			}
			//od tego miejsca
			new name[20];
			pev(weapon, pev_model, name, 19);
			if(containi(name, "w_m3")!=-1)
			{
			client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
			return HAM_SUPERCEDE;
			}
			
			new name2[20];//niepotrzebnie tworzysz nową zmienną, zmienna "name" utworzona kilka linijek wyżej już nie jest Ci potrzebna, użyj jej też tutaj.
			pev(weapon, pev_model, name2, 19);//analogicznie niepotrzebnie pobierasz jeszcze raz tą samą wartość, masz już ja w zmiennej name
			if(containi(name, "w_xm1014")!=-1)
			{
			client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
			return HAM_SUPERCEDE;
			//do tego miejsca
			
			
			//Od tego miejsca do tego miejsca kod mógłby wyglądać tak:
			/*
			new name[20]
			pev(weapon, pev_model, name, 19);
			if((containi(name, "w_m3")!=-1)||(containi(name, "w_xm1014")!=-1))
			{
				client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
				return HAM_SUPERCEDE;
			}
			*/
		}
	}
	return PLUGIN_CONTINUE//W funkcji z hamsandwicha zawsze zwracaj jakąś z wartości HAM_ , w tym wypadku HAM_IGNORED
}


/* wartości zwracane w funkcji HAMa:
HAM_IGNORED- nie blokuje wydarzenia, pozwala wykonać się dalej
HAM_HANDLED- nie blokuje wydarzenia, ale blokuje jego alarmowanie w kolejnych pluginach
HAM_OVERRIDE- nie blokuje wydarzenia, ale zmienia jego parametry ustawione funkcjami SetHamParam...
HAM_SUPERCEDE- blokuje wykonanie się wydarzenia

\

 

 

Wyjaśniłem trochę dodając komentarze, zrób z tym porządek i sprawdź jak działa.  W razie dalszych problemów wal śmiało, ale opisz co dokładnie jest źle.

Ponadto większość map posiadających bronie leżące na ziemi to byty armoury_entity, a nie weaponbox. Musiałbyś to wyłapać w touchu tak jak weaponbox i w zasadzie możesz podpiąć tą samą funkcję co od weaponboxa.


Użytkownik grankee edytował ten post 03.12.2014 18:51

  • +
  • -
  • 0

#3 Sooldierr

    Zaawansowany

  • Autor tematu
  • Użytkownik

Reputacja: 3
Nowy

  • Postów:94
  • Lokalizacja:Turek
Offline

Napisano 14.12.2014 14:49

#include <amxmodx>
#include <amxmisc>
#include <StripWeapons>
#include <hamsandwich>
#include <fun>
#include <cstrike>

#define PLUGIN "Shotguns Limited"
#define VERSION "0.1"
#define AUTHOR "$OLDIER"

#define IsPlayer(%1) (1<=%1<=maxPlayers)

new pys_num, enabled, Players[32], Num, maxPlayers, rounds=0;
//new Num1, Num2;
//new Players2[32];

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	register_event("HLTV", "round_start", "a", "1=0", "2=0")
	register_cvar("shotgunsblock_enabled", "1")
	register_cvar("shotguns_players", "8")
	
	register_logevent("round_end", 2, "1=Round_End") 
	register_event("TextMsg","restart_roundsnum","a","2&#Game_C","2&#Game_w")
 
	register_clcmd("m3","block");
	register_clcmd("xm1014","block");
	
	RegisterHam( Ham_Touch, "weaponbox", "HamTouchPre", 0 )
	
	pys_num = get_cvar_num("shotguns_players")
	enabled = get_cvar_num("shotgunsblock_enabled")
}
public plugin_cfg()
{
	maxPlayers=get_maxplayers();
}
public round_start()
{
	client_print(0, print_chat, "runda = %d", rounds) // tutaj sobie dodałem w celu sprawdzenia jak liczy graczy
	set_task(1.0, "shots")
}
public shots()
{
	get_players(Players, Num, "a");

	
	//Num = Num1 + Num2;
	
	client_print(0, print_chat, "graczy = %d", Num) // tutaj sobie dodałem w celu sprawdzenia jak liczy graczy
	
	if(enabled == 1 && !(rounds ==1))
	{
		if (Num<pys_num)
		{
			for(new i=0; i < Num; i++)
			{
				new id=Players[i];
				if(user_has_weapon(id, CSW_M3) || user_has_weapon(id, CSW_XM1014))
				{
					StripWeapons(id, Primary);
					client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");
				}
			}
		}
	}
	return PLUGIN_CONTINUE
}

public round_end()
{
	rounds++;
}
public restart_roundsnum()
{
	rounds = 0;
}
public block(id)	
{
	if(enabled == 1 && !(rounds ==1))
	{
		if (Num<pys_num)
		{
			client_print(id, print_chat, "Nie mozesz kupic tej broni, gdy respi sie tylko jedna matka Zombie");
			return PLUGIN_HANDLED //zwracając PLUGIN_CONTINUE pozwalasz na wykonanie tej komendy, a w tym miejscu powinieneś ją blokować czyli return PLUGIN_HANDLED
		}
	}
	return PLUGIN_CONTINUE //blokujesz, a powinieneś pozwolić czyli return PLUGIN_CONTINUE
}
public HamTouchPre( weapon, id )
{
	if(enabled == 1 && !(rounds ==1) && Num<pys_num)
	{
			if(!pev_valid(weapon) || !IsPlayer(id) || !is_user_alive(id))//IsPlayer niepotrzebne, jeśli to nie będzie gracz to funkcja is_user_alive(id) zwróci 0 nie powodując błędu.
			//w dodatku na 99% pev_valid(weapon) zawsze zwróci 1, bo gdyby byt nie istniał to by nie wywołał toucha.
			{
				return HAM_IGNORED;
			}
			/*od tego miejsca
			new name[20];
			pev(weapon, pev_model, name, 19);
			if(containi(name, "w_m3")!=-1)
			{
			client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
			return HAM_SUPERCEDE;
			}
			
			new name2[20];//niepotrzebnie tworzysz nową zmienną, zmienna "name" utworzona kilka linijek wyżej już nie jest Ci potrzebna, użyj jej też tutaj.
			pev(weapon, pev_model, name2, 19);//analogicznie niepotrzebnie pobierasz jeszcze raz tą samą wartość, masz już ja w zmiennej name
			if(containi(name, "w_xm1014")!=-1)
			{
			client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
			return HAM_SUPERCEDE;*/
			//do tego miejsca
			
			
			//Od tego miejsca do tego miejsca kod mógłby wyglądać tak:
			
			new name[20]
			pev(weapon, pev_model, name, 19);
			if((containi(name, "w_m3")!=-1)||(containi(name, "w_xm1014")!=-1))
			{
				//client_print(id, print_chat, "Nie mozesz posiadac Shotguna, kiedy respi sie jedna matka Zombie");	
				return HAM_SUPERCEDE;
			}
	}
	return HAM_IGNORED //W funkcji z hamsandwicha zawsze zwracaj jakąś z wartości HAM_ , w tym wypadku HAM_IGNORED
}

Taki mam ostateczny kod pluginu.

Jednak musiałem zastosować weaponbox a nie armoury_entity

Bronie leżące na mapie to te które wyrzucają gracze, bo tych co są wbudowane w mape to mod je usuwa i tak. Pewnie One są tym drugim typem.


  • +
  • -
  • 0




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

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