Skocz do zawartości
Brum Brum

[Poradnik] Danger Zone podnoszenie siekiery, młotka, klucza oraz dawanie pięści

Rekomendowane odpowiedzi

Źródło https://forums.alliedmods.net/showthread.php?t=312551
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

 

1. Hookujemy SDKHook_WeaponCanUse przy wejściu gracza na serwer.

 

public void OnClientPutInServer(int client)
{
	SDKHook(client, SDKHook_WeaponCanUse, Hook_WeaponCanUse);
}

2. Następnie tworzymy funkcję do hooka Hook_WeaponCanUse

public Action Hook_WeaponCanUse(int client, int weapon)
{
	char classname[64];
	GetEntityClassname(weapon, classname, sizeof classname);
	
	if (StrEqual(classname, "weapon_melee") || StrEqual(classname, "weapon_knife"))
		EquipPlayerWeapon(client, weapon);
}

3. Teraz wystarczy dać graczowi broń. (Przykładowy plugin)

Spoiler

#include <sdktools>
#include <sdkhooks>

public void OnPluginStart()
{
	RegConsoleCmd("sm_bronie", CMD_Bronie);
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsValidClient(i))
		{
			OnClientPutInServer(i);
		}
	}
}

public void OnClientPutInServer(int client)
{
	SDKHook(client, SDKHook_WeaponCanUse, Hook_WeaponCanUse);
}

public Action Hook_WeaponCanUse(int client, int weapon)
{
	char classname[64];
	GetEntityClassname(weapon, classname, sizeof classname);
	
	if (StrEqual(classname, "weapon_melee") || StrEqual(classname, "weapon_knife"))
		EquipPlayerWeapon(client, weapon);
}

public Action CMD_Bronie(int client, int args)
{
	Menu menu = new Menu(Menu_Handler)
	menu.SetTitle("Wybierz broń");
	menu.AddItem("axe", "Siekiera");
	menu.AddItem("hammer", "Młotek");
	menu.AddItem("spanner", "Klucz");
	menu.ExitButton = true;
	menu.Display(client, MENU_TIME_FOREVER);
}

public int Menu_Handler(Menu menu, MenuAction action, int client, int itemNum)
{
	if (client == 0)return;
	char info[32];
	GetMenuItem(menu, itemNum, info, sizeof(info));
	if (!strcmp(info, "axe"))
	{
		GivePlayerItem(client, "weapon_axe");
	}
	else if (!strcmp(info, "hammer"))
	{
		GivePlayerItem(client, "weapon_hammer");
	}
	else if (!strcmp(info, "spanner"))
	{
		GivePlayerItem(client, "weapon_spanner");
	}
	if (action == MenuAction_End)
	{
		delete menu;
	}
}

public bool IsValidClient(int client)
{
	if (!(1 <= client <= MaxClients) || !IsClientInGame(client) || !IsClientConnected(client))
		return false;
	
	return true;
} 

 

4. Pięści możemy dać graczowi takim sposobem.

public void GiveFists(int client)
{
	int fists = GivePlayerItem(client, "weapon_fists");
	EquipPlayerWeapon(client, fists);
} 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
W dniu 17.12.2018 o 17:50, Brum Brum napisał:

if (client == 0)return;

Sprawdzanie klienta powinno być przed stworzeniem menu, w handlerze jest to niepotrzebne w twoim przykładowym kodzie.

 

W dniu 17.12.2018 o 17:50, Brum Brum napisał:

if (action == MenuAction_End) { delete menu; }

ten warunek powinien zostać usunięty, bo usuwasz tylko menu gdy je zamykasz, a po wybraniu pozycji z menu już go nie usuwasz...

 

delete menu powinno zostać dodane zaraz po GetMenuItem(...) wtedy menu od razu usunie się po wybraniu dowolnej pozycji oraz po wyjściu z menu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Godzinę temu, naXe napisał:

Sprawdzanie klienta powinno być przed stworzeniem menu, w handlerze jest to niepotrzebne w twoim przykładowym kodzie.

 

ten warunek powinien zostać usunięty, bo usuwasz tylko menu gdy je zamykasz, a po wybraniu pozycji z menu już go nie usuwasz...

 

delete menu powinno zostać dodane zaraz po GetMenuItem(...) wtedy menu od razu usunie się po wybraniu dowolnej pozycji oraz po wyjściu z menu.

 

Poczytaj dokumentację, a potem zacznij sugerować co powinno być usunięte, a co powinno zostać.

MenuAction_End wywołuje się wtedy, gdy:

1. Czas "display' a" dobiegnie końca.

2. Ktoś wybierze coś w menu (MenuAction_Select)

3. Ktoś anuluje menu (MenuAction_Cancel)

Możesz o tym poczytać tutaj: https://wiki.alliedmods.net/Menu_API_(SourceMod)
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...