AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Help for [ZP]Reward menu (https://forums.alliedmods.net/showthread.php?t=313744)

Abiss32 01-20-2019 19:01

Help for [ZP]Reward menu
 
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

}


eat1k 01-21-2019 10:33

Re: Help for [ZP]Reward menu
 
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.

Abiss32 01-22-2019 12:49

Re: Help for [ZP]Reward menu
 
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)


eat1k 01-22-2019 13:21

Re: Help for [ZP]Reward menu
 
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.

Abiss32 01-22-2019 17:31

Re: Help for [ZP]Reward menu
 
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!

eat1k 01-22-2019 17:44

Re: Help for [ZP]Reward menu
 
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.

Abiss32 01-22-2019 18:19

Re: Help for [ZP]Reward menu
 
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.

eat1k 01-23-2019 02:14

Re: Help for [ZP]Reward menu
 
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).

Fuck For Fun 01-23-2019 03:42

Re: Help for [ZP]Reward menu
 
Quote:

Originally Posted by Abiss32 (Post 2636104)
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


All times are GMT -4. The time now is 07:31.

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