Skocz do zawartości
PepeKOZAK

[Rozwiązane] Menu Wyboru Granatów

Rekomendowane odpowiedzi

Witam!

Chciałem zrobić menu wyboru granatów, czyli np. gracz wybiera z menu he, 2xflashbang oraz smoke, a na początku rundy dostaje te cztery granaty. Mój kod wygląda następująco:

Spoiler
/* << Define >> */
 
/* << Pragma >> */
#pragma newdecls required
#pragma semicolon 1
 
/* << Macro >> */
    
/* << ConVary >> */
 
/* << Inty >> */
int g_iUsages[MAXPLAYERS + 1];
 
/* << Chary >> */
char client_granaty[MAXPLAYERS + 1][256];
 
/* << Boole >> */
 
public void OnPluginStart() {
    RegConsoleCmd("sm_granaty", Grenades_Command);
    HookEvent("player_spawn", Event_PlayerSpawn);
    HookEvent("player_spawn", Event_Granaty);
}
 
public Action Grenades_Command(int client, int args) {
    Menu menu = new Menu(Grenades_Handler);
    menu.SetTitle("VIP : Wybierz granat");
    menu.AddItem("weapon_hegrenade""HE");
    menu.AddItem("weapon_flashbang""Flash");
    menu.AddItem("weapon_molotov""Molotov");
    menu.AddItem("weapon_smokegrenade""Smoke");
    menu.ExitButton = true;
    menu.Display(client, 15);
}
 
public int Grenades_Handler(Menu menu, MenuAction action, int client, int itemNum) {
    switch (action) {
        case MenuAction_Select: {
            char granat[32];
            GetMenuItem(menu, itemNum, granat, sizeof(granat));
            client_granaty[client] = granat;
 
            g_iUsages[client]--;
            if (g_iUsages[client] > 0)
                Grenades_Command(client, 0);
        }
        case MenuAction_End:delete menu;
    }
}
 
public Action Event_PlayerSpawn(Event event, const char[] sName, bool bDontBroadcast) {
    int client = GetClientOfUserId(event.GetInt("userid"));
 
    g_iUsages[client] = 4;
}
 
public Action Event_Granaty(Event e, const char[] n, bool b) {
    GivePlayerItem(GetClientOfUserId(GetEventInt(e, "userid")), client_granaty[GetClientOfUserId(GetEventInt(e, "userid"))]);

Po wgraniu pluginu na serwer dostaje tylko jeden granat, a nie cztery.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Spróbuj użyć tego kodu, na szybko przerobiłem:

Spoiler
/* << Define >> */

/* << Pragma >> */
#pragma newdecls required
#pragma semicolon 1

/* << Macro >> */

/* << ConVary >> */

/* << Inty >> */
int g_iUsages[MAXPLAYERS + 1];

/* << Chary >> */
char client_granaty[MAXPLAYERS + 1][256];

/* << Boole >> */

public void OnPluginStart() {
	RegConsoleCmd("sm_granaty", Grenades_Command);
	HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action Grenades_Command(int client, int args) {
	Menu menu = new Menu(Grenades_Handler);
	menu.SetTitle("VIP : Wybierz granat");
	menu.AddItem("weapon_hegrenade", "HE");
	menu.AddItem("weapon_flashbang", "Flash");
	menu.AddItem("weapon_molotov", "Molotov");
	menu.AddItem("weapon_smokegrenade", "Smoke");
	menu.ExitButton = true;
	menu.Display(client, 15);
}

public int Grenades_Handler(Menu menu, MenuAction action, int client, int itemNum) {
	switch (action) {
		case MenuAction_Select: {
			char granat[32], sBuffer[256];
			GetMenuItem(menu, itemNum, granat, sizeof(granat));
			Format(sBuffer, sizeof(sBuffer), "%s|%s", sBuffer, granat);
			client_granaty[client] = sBuffer;
			
			g_iUsages[client]--;
			if (g_iUsages[client] > 0)
				Grenades_Command(client, 0);
		}
		case MenuAction_End:delete menu;
	}
}

public Action Event_PlayerSpawn(Event event, const char[] sName, bool bDontBroadcast) {
	int client = GetClientOfUserId(event.GetInt("userid"));
	g_iUsages[client] = 4;
	
	char sString[5][64], 
	ExplodeString(client_granaty, "|", sString, sizeof(sString), sizeof(sString[]));
	for (int i = 0; i < 5; i++)
	if (StrContains(sString[i], "weapon_") != -1)
		GivePlayerItem(client, sString[i]);
	
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

\Desktop\scripting\granaty2.sp(66) : warning 219: local variable "ExplodeString" shadows a variable at a preceding level
\Desktop\scripting\granaty2.sp(66) : error 001: expected token: ";", but found "("
\Desktop\scripting\granaty2.sp(66) : warning 215: expression has no effect
\Desktop\scripting\granaty2.sp(66) : warning 203: symbol is never used: "ExplodeString"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
	char sString[5][64], 
	char sString[5][64];

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

\Desktop\scripting\granaty2.sp(66) : error 048: array (s do not match

 

Chciałem jeszcze, że po wybraniu np. smoke napis zmienił się na szaro. Trzeba to chyba zrobić przez ITEMDRAW_DISABLED, ale nie wiem do końca jak.

Edytowane przez PepeKOZAK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Spoiler
#include <sourcemod>
#include <sdktools>

/* << Pragma >> */
#pragma newdecls required
#pragma semicolon 1

/* << Macro >> */

/* << ConVary >> */

/* << Inty >> */
int g_iUsages[MAXPLAYERS + 1];

/* << Chary >> */
char client_granaty[MAXPLAYERS + 1][256];

public void OnPluginStart() {
	RegConsoleCmd("sm_granaty", Grenades_Command);
	HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action Grenades_Command(int client, int args) {
	Menu menu = new Menu(Grenades_Handler);
	menu.SetTitle("VIP : Wybierz granat");
	menu.AddItem("weapon_hegrenade|", "HE");
	menu.AddItem("weapon_flashbang|", "Flash");
	menu.AddItem("weapon_molotov|", "Molotov");
	menu.AddItem("weapon_smokegrenade|", "Smoke");
	menu.ExitButton = true;
	menu.Display(client, 15);
}

public int Grenades_Handler(Menu menu, MenuAction action, int client, int position) {
	switch (action) {
		case MenuAction_Select: {
			char sItem[32], sBuffer[256];
			menu.GetItem(position, sItem, sizeof(sItem));
			if (g_iUsages[client] == 4)
				client_granaty[client] = "";
			Format(sBuffer, sizeof(sBuffer), "%s%s", client_granaty[client], sItem);
			client_granaty[client] = sBuffer;
			
			g_iUsages[client]--;
			if (g_iUsages[client] > 0)
				Grenades_Command(client, 0);
		}
		case MenuAction_End:delete menu;
	}
}

public Action Event_PlayerSpawn(Event event, const char[] sName, bool bDontBroadcast) {
	int client = GetClientOfUserId(event.GetInt("userid"));
	g_iUsages[client] = 4;
	CreateTimer(0.1, Timer_GiveNades, client, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_GiveNades(Handle hTimer, int userid) {
	int client = GetClientOfUserId(userid);
	if (client) {
		char sString[5][64];
		ExplodeString(client_granaty[client], "|", sString, 5, 64);
		for (int i = 0; i < 5; i++)
		if (StrContains(sString[i], "weapon_") != -1)
			GivePlayerItem(client, sString[i]);
	}
} 

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na moim serwerze działa. Wyrzuciłem timer i dodałem jedno zabezpieczenie jeszcze.

Spoiler
#include <sourcemod>
#include <sdktools>

/* << Pragma >> */
#pragma newdecls required
#pragma semicolon 1

/* << Macro >> */

/* << ConVary >> */

/* << Inty >> */
int g_iUsages[MAXPLAYERS + 1];

/* << Chary >> */
char client_granaty[MAXPLAYERS + 1][256];

public void OnPluginStart() {
	RegConsoleCmd("sm_granaty", Grenades_Command);
	HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action Grenades_Command(int client, int args) {
	if (g_iUsages[client] <= 0)
		return Plugin_Handled;
	Menu menu = new Menu(Grenades_Handler);
	menu.SetTitle("VIP : Wybierz granat");
	menu.AddItem("weapon_hegrenade|", "HE");
	menu.AddItem("weapon_flashbang|", "Flash");
	menu.AddItem("weapon_molotov|", "Molotov");
	menu.AddItem("weapon_smokegrenade|", "Smoke");
	menu.ExitButton = true;
	menu.Display(client, 15);
	return Plugin_Handled;
}

public int Grenades_Handler(Menu menu, MenuAction action, int client, int position) {
	switch (action) {
		case MenuAction_Select: {
			char sItem[32], sBuffer[256];
			menu.GetItem(position, sItem, sizeof(sItem));
			if (g_iUsages[client] == 4)
				client_granaty[client] = "";
			Format(sBuffer, sizeof(sBuffer), "%s%s", client_granaty[client], sItem);
			client_granaty[client] = sBuffer;
			
			g_iUsages[client]--;
			if (g_iUsages[client] > 0)
				Grenades_Command(client, 0);
		}
		case MenuAction_End:delete menu;
	}
}

public Action Event_PlayerSpawn(Event event, const char[] sName, bool bDontBroadcast) {
	int client = GetClientOfUserId(event.GetInt("userid"));
	g_iUsages[client] = 4;
	char sString[5][64];
	ExplodeString(client_granaty[client], "|", sString, 5, 64);
	for (int i = 0; i < 5; i++)
	if (StrContains(sString[i], "weapon_") != -1)
		GivePlayerItem(client, sString[i]);
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Problem został rozwiązany

Jeżeli się z tym nie zgadzasz, raportuj ten post

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ę...