Skocz do zawartości
jigsaw

[Rozwiązane] Jedno użycie komendy na rundę

Rekomendowane odpowiedzi

Cześć, mam plugin vipmenu który na początku rundy pokazuje vipmenu. W pluginie nie ma opcji żeby była na komendę więc zrobiłem to.

Ale mam problem z tym żeby można ją było użyć tylko raz jeśli żadna funkcja z vipmenu nie była wcześniej użyta.

W jaki sposób mogę to zrobić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
//zmienna globalna
bool is_used[65];

//po użyciu
is_used[client] = true;

//przy starcie rundy
for(int i = 0; i < 65; i++)
  is_udes[i] = false;

 

Przez MAGNET,

Tutaj bym tylko zmienił 65 na MAXPLAYERS - niby nie robi to większej różnicy, ale zwiększa się przejrzystość kodu (no i ta wartość może się zmienić w przyszłości)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W 37 linijce zmień is_udes = false; na is_used = false;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <sdkhooks>
#pragma newdecls required
//ConVar g_cvFlag;
const int VIP_FLAG = ADMFLAG_RESERVATION;

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart);
	HookEvent("player_death", Event_PlayerDeath);
	RegAdminCmd("sm_vipmenu", BonusMenu);
}

public Action _________________________________________________() {  }
public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
{
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsClientInGame(i) && !IsFakeClient(i) && (GetUserFlagBits(i) & VIP_FLAG || GetUserFlagBits(i) & ADMFLAG_ROOT))
		{
			if (GetClientTeam(i) == CS_TEAM_CT)
			{
				BonusMenu(i, 0);
				for(int i = 0; i < 65; i++)
				is_used = false;
			}
		}
	}
}
public Action ________________________________________________() {  }
public void Event_PlayerDeath(Handle event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	ClientCommand(client, "firstperson");
	ServerCommand("sm_drug #%i 0", GetClientUserId(client));
}
public Action __________________________________________() {  }
public Action BonusMenu(int client, int args)
{
	Handle menu = CreateMenu(Handler);
	SetMenuTitle(menu, "Bonusy VIP");
	AddMenuItem(menu, "1", "+50 HP");
	AddMenuItem(menu, "2", "+40% do prędkości");
	AddMenuItem(menu, "3", "-40% do grawitacji");
	AddMenuItem(menu, "4", "Slow Motion");
	AddMenuItem(menu, "5", "Dopalacze");
	
	DisplayMenu(menu, client, 20);
	return Plugin_Handled;
}
public Action ____________________________________________() {  }
public int Handler(Handle classhandle, MenuAction action, int client, int Position)
{
	if (action == MenuAction_Select)
	{
		char Item[32];
		is_used[client] = true;
		GetMenuItem(classhandle, Position, Item, sizeof(Item));
		
		if (StrEqual(Item, "1"))
		{
			SetEntityHealth(client, GetEntProp(client, Prop_Send, "m_iHealth") + 50);

		}
		else if (StrEqual(Item, "2"))
		{
			SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.4);

		}
		else if (StrEqual(Item, "3"))
		{
			SetEntityGravity(client, 0.6);

		}
		else if (StrEqual(Item, "4"))
		{
			SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 0.5);
			SetEntityGravity(client, 0.5);

		}
		else if (StrEqual(Item, "5"))
		{
			//ClientCommand(client, "sm_drug");
			ServerCommand("sm_drug #%i 1", GetClientUserId(client));

		}
	}
	else if (action == MenuAction_End)
		CloseHandle(classhandle);
}
public Action ________________________________________() {  }
stock bool IsValidPlayer(int client) {
	if (client >= 1 && client <= MaxClients && IsClientConnected(client) && !IsFakeClient(client) && IsClientInGame(client))
		return true;
	return false;
} 

tu jest kod, może wy zauważycie co źle zrobiłem.

Edytowane przez jigsaw

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@jigsaw Spróbuj tego 

Spoiler

#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <sdkhooks>
#pragma newdecls required
//ConVar g_cvFlag;
const int VIP_FLAG = ADMFLAG_RESERVATION;

bool is_used[MAXPLAYERS + 1];

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart);
	HookEvent("player_death", Event_PlayerDeath);
	RegAdminCmd("sm_vipmenu", BonusMenu, ADMFLAG_RESERVATION);
}

public Action Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
{
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsClientInGame(i) && !IsFakeClient(i) && (GetUserFlagBits(i) & VIP_FLAG || GetUserFlagBits(i) & ADMFLAG_ROOT))
		{
			if (GetClientTeam(i) == CS_TEAM_CT)
			{
				BonusMenu(i, 0);
				for (int y = 0; y < 65; y++)
				is_used[y] = false;
			}
		}
	}
}

public Action Event_PlayerDeath(Handle event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	ClientCommand(client, "firstperson");
	ServerCommand("sm_drug #%i 0", GetClientUserId(client));
}

public Action BonusMenu(int client, int args)
{
	Menu menu = new Menu(Handler);
	menu.SetTitle("Bonusy VIP");
	menu.AddItem("1", "+50 HP");
	menu.AddItem("2", "+40% do prędkości");
	menu.AddItem("3", "-40% do grawitacji");
	menu.AddItem("4", "Slow Motion");
	menu.AddItem("5", "Dopalacze");
	menu.Display(client, 20);
	return Plugin_Handled;
}

public int Handler(Menu menu, MenuAction action, int client, int item)
{
	if (client == 0)return;
	if (action == MenuAction_Select)
	{
		char info[32];
		GetMenuItem(menu, item, info, sizeof(info));
		is_used[client] = true;
		if (StrEqual(info, "1"))
		{
			SetEntityHealth(client, GetEntProp(client, Prop_Send, "m_iHealth") + 50);
			
		}
		else if (StrEqual(info, "2"))
		{
			SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.4);
			
		}
		else if (StrEqual(info, "3"))
		{
			SetEntityGravity(client, 0.6);
			
		}
		else if (StrEqual(info, "4"))
		{
			SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 0.5);
			SetEntityGravity(client, 0.5);
			
		}
		else if (StrEqual(info, "5"))
		{
			//ClientCommand(client, "sm_drug");
			ServerCommand("sm_drug #%i 1", GetClientUserId(client));
			
		}
	}
	else if (action == MenuAction_End)delete menu;
}

stock bool IsValidPlayer(int client) {
	if (client >= 1 && client <= MaxClients && IsClientConnected(client) && !IsFakeClient(client) && IsClientInGame(client))
		return true;
	return false;
} 

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

skompilowało się ale nic sie nie zmienilo, dalej moge brac tyle ile chce razy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Spoiler

#include <sourcemod>
#include <sdktools>
#include <cstrike>
#include <sdkhooks>
#pragma newdecls required
//ConVar g_cvFlag;
const int VIP_FLAG = ADMFLAG_RESERVATION;

bool is_used[65];

public void OnPluginStart()
{
	HookEvent("round_start", Event_RoundStart);
	HookEvent("player_death", Event_PlayerDeath);
	RegAdminCmd("sm_vipmenu", BonusMenu, ADMFLAG_RESERVATION);
	resetMenuHistory();
}

public Action Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
{
	resetMenuHistory();
	for (int i = 1; i < MaxClients; i++)
	{
		if (IsValidPlayer(i) && (GetUserFlagBits(i) & VIP_FLAG || GetUserFlagBits(i) & ADMFLAG_ROOT))
		{
			if (GetClientTeam(i) == CS_TEAM_CT)
			{
				BonusMenu(i, 0);
			}
		}
	}
}

public Action Event_PlayerDeath(Handle event, const char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	ClientCommand(client, "firstperson");
	ServerCommand("sm_drug #%i 0", GetClientUserId(client));
}

public Action BonusMenu(int client, int args)
{
	if(!IsValidPlayer(client))
		return Plugin_Continue;
	if(is_used[client]) {
		//print sth
		return Plugin_Continue;
	}
	Menu menu = new Menu(Handler);
	menu.SetTitle("Bonusy VIP");
	menu.AddItem("1", "+50 HP");
	menu.AddItem("2", "+40% do prędkości");
	menu.AddItem("3", "-40% do grawitacji");
	menu.AddItem("4", "Slow Motion");
	menu.AddItem("5", "Dopalacze");
	menu.Display(client, 20);
	return Plugin_Handled;
}

public int Handler(Menu menu, MenuAction action, int client, int item)
{
	if (!IsValidPlayer(client)) return;
	if (action == MenuAction_Select)
	{
		is_used[client] = true;
		char info[32];
		GetMenuItem(menu, item, info, sizeof(info));
		is_used[client] = true;
		if (StrEqual(info, "1"))
		{
			SetEntityHealth(client, GetEntProp(client, Prop_Send, "m_iHealth") + 50);
			
		}
		else if (StrEqual(info, "2"))
		{
			SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.4);
			
		}
		else if (StrEqual(info, "3"))
		{
			SetEntityGravity(client, 0.6);
			
		}
		else if (StrEqual(info, "4"))
		{
			SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 0.5);
			SetEntityGravity(client, 0.5);
			
		}
		else if (StrEqual(info, "5"))
		{
			//ClientCommand(client, "sm_drug");
			ServerCommand("sm_drug #%i 1", GetClientUserId(client));
			
		}
	}
	else if (action == MenuAction_End)delete menu;
}

stock bool IsValidPlayer(int client) {
	if (client >= 1 && client <= MaxClients && IsClientConnected(client) && !IsFakeClient(client) && IsClientInGame(client))
		return true;
	return false;
}

stock void resetMenuHistory() {
	for(int i = 0; i < 65; i++)
		is_used[i] = false;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dobra działa ? 

 

Dziękuje wszystkim

Edytowane przez jigsaw

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...