Raised This Month: $51 Target: $400
 12% 

Help for [ZP]Reward menu


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Abiss32
Junior Member
Join Date: Dec 2018
Old 01-20-2019 , 19:01   Help for [ZP]Reward menu
Reply With Quote #1

Hello!

I am a new in scripting and i need help to make a Reward Menu that gives a certain rewards for a certain amounts of kills i have made the menu but the functions are hard for me to set.
Code:
#include <amxmodx>
#include <amxmisc>
#include <zombieplague>
#include <zp_buymenu>

#define PLUGIN "[ZP]Sub-menu"
#define VERSION "1.0"
#define AUTHOR "real<Abiss>"
enum _:PlayerData

{

	g_szName[32],

	g_szSteamID[32],

	g_iOption,

	g_iPlayer,

	g_iChoosen

}



new g_PlayerInfo[33][PlayerData]

new const g_szrewardsMenuItems[][] =
{

	"\y[5 Kills][+3 Exp]",

	"\y[7 Kills][+5 Exp]",

	"\y[10 Kills][+35000$]^n",

	"\y[20 Kills][+20 Gold]"
}
public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_concmd("Reward_Menu", "rewards")
}
public rewards(id)
{

	new iMenuID = menu_create("\rRewards Menu \w:", "rewardsMenuHandle")

	for(new i=0; i<sizeof(g_szrewardsMenuItems); i++) menu_additem(iMenuID, g_szrewardsMenuItems[i])

	menu_display(id, iMenuID)

}
public rewardsMenuHandle(id, iMenuID, iItem)
{
	g_PlayerInfo[id][g_iChoosen] = g_PlayerInfo[iItem][g_iPlayer]
	
	switch(iItem)
	{
		case 0:
		{
			new iNum = 5
			if(get_user_frags(id) && iNum)
			{
				new current = zp_get_user_exp(g_PlayerInfo[id][g_iChoosen])
				zp_set_user_exp(g_PlayerInfo[id][g_iChoosen], current+3)
			}
			if(get_user_frags(id) > iNum)
			{
				new current = zp_get_user_exp(id)	
				zp_set_user_exp(g_PlayerInfo[id][g_iChoosen], current+3)
			}
		}
		case 1:
		{
			new iNum2 = 7
			new current = zp_get_user_exp(g_PlayerInfo[id][g_iChoosen])
			if(get_user_frags(id) && iNum2)
			{
				zp_set_user_exp(g_PlayerInfo[id][g_iChoosen], current+5)
			}
			if(get_user_frags(id) > iNum2)
			{
				zp_set_user_exp(g_PlayerInfo[id][g_iChoosen], current+5)
			}
		}
		case 2: 
		{
			new iNum3 = 10
			new current2 = zp_cs_get_user_money(id)
			if(get_user_frags(id) && iNum3)
			{
				zp_cs_set_user_money(g_PlayerInfo[id][g_iChoosen], current2+35000)
			}
			if(get_user_frags(id) > iNum3)
			{
				zp_cs_set_user_money(g_PlayerInfo[id][g_iChoosen], current2+35000)
			}
		}
		case 3:
		{
			new iNum4 = 20
			new current3 = zp_get_user_ammo_packs(id)
			if(get_user_frags(id) && iNum4)
			{
				zp_set_user_ammo_packs(g_PlayerInfo[id][g_iChoosen], current3+20)
			}
			if(get_user_frags(id) > iNum4)
			{
				zp_set_user_ammo_packs(g_PlayerInfo[id][g_iChoosen], current3+20)
			}
		}
	}
	return PLUGIN_HANDLED

}
Abiss32 is offline
eat1k
Senior Member
Join Date: Apr 2018
Old 01-21-2019 , 10:33   Re: Help for [ZP]Reward menu
Reply With Quote #2

1. Don't hardcode numbers.
g_szName[32] -> g_szName[MAX_NAME_LENGTH]
g_szSteamID[32] -> g_szSteamID[MAX_AUTHID_LENGTH]
new g_PlayerInfo[33][PlayerData] -> new g_PlayerInfo[MAX_PLAYERS+1][PlayerData]

P.S. I wrote this taking into account that you aren't using AMXX 1.8.2. In the case you're using it, just add:
PHP Code:
#if !defined MAX_NAME_LENGTH
    #define MAX_NAME_LENGTH 32
#endif

#if !defined MAX_AUTHID_LENGTH
    #define MAX_AUTHID_LENGTH 64
#endif 
2. What is this?
PHP Code:
if(get_user_frags(id) && iNum
If you want to check that the number of frags is equal to iNum you need to change "&&" to "==".

3. If you use more than once a native so save it to a variable.
PHP Code:
new iFrags get_user_frags(id); 
4. new iNum/2/3/4. Why don't you use new iNum? I mean, you don't need to have a different name for each variable because they're in different cases.
__________________

Last edited by eat1k; 01-21-2019 at 10:46.
eat1k is offline
Abiss32
Junior Member
Join Date: Dec 2018
Old 01-22-2019 , 12:49   Re: Help for [ZP]Reward menu
Reply With Quote #3

Ok i have changed the code but still it doesnt work properly and i also want to make the rewards not spammable...

Code:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <zombieplague>
#include <zp_buymenu>

#define PLUGIN "[ZP]Sub-menu"
#define VERSION "1.0"
#define AUTHOR "real<Abiss>"

#if !defined MAX_NAME_LENGTH
    #define MAX_NAME_LENGTH 32
#endif

#if !defined MAX_AUTHID_LENGTH
    #define MAX_AUTHID_LENGTH 64
#endif

#if !defined MAX_PLAYERS
	#define MAX_PLAYERS 32
#endif

enum _:PlayerData

{

	g_szName[MAX_NAME_LENGTH],

	g_szSteamID[MAX_AUTHID_LENGTH],

	g_iPlayer

}



new g_PlayerInfo[MAX_PLAYERS+1][PlayerData]

new const g_szrewardsMenuItems[][] =
{

	"\y[5 Kills][+3 Exp]",

	"\y[7 Kills][+5 Exp]",

	"\y[10 Kills][+35000$]^n",

	"\y[20 Kills][+20 Gold]"
}
public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_concmd("Reward_Menu", "rewards")
}
public client_authorized(id)

{

	get_user_name(id, g_PlayerInfo[id][g_szName], charsmax(g_PlayerInfo[][g_szName]))

	get_user_authid(id, g_PlayerInfo[id][g_szSteamID], charsmax(g_PlayerInfo[][g_szSteamID]))

}
public rewards(id)
{

	new iMenuID = menu_create("\rRewards Menu \w:", "rewardsMenuHandle")

	for(new i=0; i<sizeof(g_szrewardsMenuItems); i++) menu_additem(iMenuID, g_szrewardsMenuItems[i])

	menu_display(id, iMenuID)

}
public rewardsMenuHandle(id, iMenuID, iItem)
{
	g_PlayerInfo[id] = g_PlayerInfo[iItem][g_iPlayer]
	
	switch(iItem)
	{
		case 0:
		{
			new iNum = 5
			new iFrags = get_user_frags(id);
			new iPlayer = get_user_name(id, g_PlayerInfo[id][g_szName], charsmax(g_PlayerInfo[][g_szName]))
			if(iFrags == iNum)
			{
				new current = zp_get_user_exp(id)
				zp_set_user_exp(iPlayer, current+3)
			}
			if(iFrags > iNum)
			{
				new current = zp_get_user_exp(id)	
				zp_set_user_exp(iPlayer, current+3)
			}
		}
		case 1:
		{
			new iNum = 7
			new iFrags = get_user_frags(id);
			new current = zp_get_user_exp(id)
			new iPlayer = get_user_name(id, g_PlayerInfo[id][g_szName], charsmax(g_PlayerInfo[][g_szName]))
			if(iFrags == iNum)
			{
				zp_set_user_exp(iPlayer, current+5)
			}
			if(iFrags > iNum)
			{
				zp_set_user_exp(iPlayer, current+5)
			}
		}
		case 2: 
		{
			new iNum = 10
			new iFrags = get_user_frags(id);
			new current = zp_cs_get_user_money(id)
			new iPlayer = get_user_name(id, g_PlayerInfo[id][g_szName], charsmax(g_PlayerInfo[][g_szName]))
			if(iFrags == iNum)
			{
				zp_cs_set_user_money(iPlayer, current+35000)
			}
			if(iFrags > iNum)
			{
				zp_cs_set_user_money(iPlayer, current+35000)
			}
		}
		case 3:
		{
			new iNum = 20
			new iFrags = get_user_frags(id);
			new current = zp_get_user_ammo_packs(id)
			new iPlayer = get_user_name(id, g_PlayerInfo[id][g_szName], charsmax(g_PlayerInfo[][g_szName]))
			if(iFrags == iNum)
			{
				zp_set_user_ammo_packs(iPlayer, current+20)
			}
			if(iFrags > iNum)
			{
				zp_set_user_ammo_packs(iPlayer, current+20)
			}
		}
	}
	return PLUGIN_HANDLED

}
Here is also the buy_menu natives ....
Code:
/*Возвращает деньги игрока*/

native zp_cs_get_user_money(id)

/*Устанавливает деньги игрока*/

native zp_cs_set_user_money(id, value)

/*Возвращает level игрока*/

native zp_get_user_level(id)

/*Устанавливает level игрока*/

native zp_set_user_level(id, value)

/*Возвращает exp игрока*/

native zp_get_user_exp(id)

/*Устанавливает exp игрока*/

native zp_set_user_exp(id, value)

/*Возвращает сколько ехр надо набрать игроку для следующего левела*/

native zp_get_exp_current(id)

Last edited by Abiss32; 01-22-2019 at 12:51.
Abiss32 is offline
eat1k
Senior Member
Join Date: Apr 2018
Old 01-22-2019 , 13:21   Re: Help for [ZP]Reward menu
Reply With Quote #4

What is this?
new iPlayer = get_user_name(id, g_PlayerInfo[id][g_szName], charsmax(g_PlayerInfo[][g_szName]))

PHP Code:
native zp_set_user_exp(idvalue
The first argument is the id of player.

So you don't need to do what you're doing. Remove that code and change "iPlayer" IN "zp_set_user_exp(iPlayer..." to "id".
If you want to do the players take the reward only once you can use trie/array.
__________________

Last edited by eat1k; 01-22-2019 at 13:22.
eat1k is offline
Abiss32
Junior Member
Join Date: Dec 2018
Old 01-22-2019 , 17:31   Re: Help for [ZP]Reward menu
Reply With Quote #5

Ok it actually works but I don't know how to set the reward to be taken only once and the 2nd thing is the i put a messages if have the requirements and if you don't have them... but if you have 0 kills left the both messages pop up how to prevent the false trigger to happen?

Code:
#include <amxmodx>
#include <amxmisc>
#include <colorchat>
#include <zombieplague>
#include <zp_buymenu>

#define PLUGIN "[ZP]Mission Rewards"
#define VERSION "1.0"
#define AUTHOR "real<Abiss>"


new const g_szrewardsMenuItems[][] =
{

	"\y[5 Kills][+3 Exp]",

	"\y[7 Kills][+5 Exp]",

	"\y[10 Kills][+35000$]^n",

	"\y[20 Kills][+20 Gold]"
}
public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	register_concmd("Reward_Menu", "rewards")
}

public rewards(id)
{

	new iMenuID = menu_create("\rRewards Menu \w:", "rewardsMenuHandle")

	for(new i=0; i<sizeof(g_szrewardsMenuItems); i++) menu_additem(iMenuID, g_szrewardsMenuItems[i])

	menu_display(id, iMenuID)

}
public rewardsMenuHandle(id, iMenuID, iItem)
{
	switch(iItem)
	{
		case 0:
		{
			new iNum = 5
			new iFrags = get_user_frags(id);
			if(iFrags == iNum)
			{
				new current = zp_get_user_exp(id)
				zp_set_user_exp(id, current+3)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			if(iFrags > iNum)
			{
				new current = zp_get_user_exp(id)	
				zp_set_user_exp(id, current+3)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			else
			{
				new iFragsLeft = iFrags-iNum;
				ColorChat(id, TEAM_COLOR, "Mission requierments not faced %i kills left!", iFragsLeft)
			}
		}
		case 1:
		{
			new iNum = 7
			new iFrags = get_user_frags(id);
			new current = zp_get_user_exp(id)
			if(iFrags == iNum)
			{
				zp_set_user_exp(id, current+5)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			if(iFrags > iNum)
			{
				zp_set_user_exp(id, current+5)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			else
			{
				new iFragsLeft = iFrags-iNum;
				ColorChat(id, TEAM_COLOR, "Mission requierments not faced %i kills left!", iFragsLeft)
			}
		}
		case 2: 
		{
			new iNum = 10
			new iFrags = get_user_frags(id);
			new current = zp_cs_get_user_money(id)
			if(iFrags == iNum)
			{
				zp_cs_set_user_money(id, current+35000)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			if(iFrags > iNum)
			{
				zp_cs_set_user_money(id, current+35000)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			else
			{
				new iFragsLeft = iFrags-iNum;
				ColorChat(id, TEAM_COLOR, "Mission requierments not faced %i kills left!", iFragsLeft)
			}
		}
		case 3:
		{
			new iNum = 20
			new iFrags = get_user_frags(id);
			new current = zp_get_user_ammo_packs(id)
			if(iFrags == iNum)
			{
				zp_set_user_ammo_packs(id, current+20)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			if(iFrags > iNum)
			{
				zp_set_user_ammo_packs(id, current+20)
				ColorChat(id, TEAM_COLOR, "Mission Completed!")
			}
			else
			{
				new iFragsLeft = iFrags-iNum;
				ColorChat(id, TEAM_COLOR, "Mission requierments not faced %i kills left!", iFragsLeft)
			}
		}
	}
	return PLUGIN_HANDLED

}
And also thanks for helping!

Last edited by Abiss32; 01-22-2019 at 17:33.
Abiss32 is offline
eat1k
Senior Member
Join Date: Apr 2018
Old 01-22-2019 , 17:44   Re: Help for [ZP]Reward menu
Reply With Quote #6

Because you need to use else if instead of the second if because you don't need to check the same twice.

PHP Code:
new iNum 5;
new 
iFrags get_user_frags(id);

if(
iFrags == iNum)
{
    new 
current zp_get_user_exp(id);
    
zp_set_user_exp(idcurrent 3);
    
ColorChat(idTEAM_COLOR"Mission Completed!");
}
else if(
iFrags iNum)
{
    new 
current zp_get_user_exp(id);
    
zp_set_user_exp(idcurrent 3);
    
ColorChat(idTEAM_COLOR"Mission Completed!");
}
else
{
    new 
iFragsLeft iFrags iNum;
    
ColorChat(idTEAM_COLOR"Mission requierments not faced %i kills left!"iFragsLeft);

About not taking the reward more than once, check celltrie.inc and cellarray.inc.
__________________
eat1k is offline
Abiss32
Junior Member
Join Date: Dec 2018
Old 01-22-2019 , 18:19   Re: Help for [ZP]Reward menu
Reply With Quote #7

I don't really know how to make a code for this but i think that the best native for the job will be this
Code:
TrieSetString(Trie:handle, const key[], const value[])
although i don't know how to use it.
Abiss32 is offline
eat1k
Senior Member
Join Date: Apr 2018
Old 01-23-2019 , 02:14   Re: Help for [ZP]Reward menu
Reply With Quote #8

There is a lot of examples here and in other forums. That can be useful if you want to do taking only one reward (per map for example).
__________________
eat1k is offline
Fuck For Fun
Veteran Member
Join Date: Nov 2013
Old 01-23-2019 , 03:42   Re: Help for [ZP]Reward menu
Reply With Quote #9

Quote:
Originally Posted by Abiss32 View Post
I don't really know how to make a code for this but i think that the best native for the job will be this
Code:
TrieSetString(Trie:handle, const key[], const value[])
although i don't know how to use it.
He has already given you a tip (no need to use the same thing twice)
Quote:
else if instead of the second
Fuck For Fun is offline
Send a message via Skype™ to Fuck For Fun
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 03:02.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode