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

OciXCrom's Custom Shop + API


Post New Thread Reply   
 
Thread Tools Display Modes
vAx
Junior Member
Join Date: Oct 2011
Location: Hungary
Old 12-10-2016 , 07:39   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #61

Quote:
Originally Posted by Craxor View Post
vax - wich kind of save you use, per name , ip or steamId ?

Because i believe is not saving at all the points for you - i think you running a non-steam server and if the oxi plugin have the save as default per steam is normaly to do not work.
Im using only save with name, cuz we have registration system too which saving a password for a currently used name.

CustomShop.ini:

;0 = Name | 1 = IP | 2 = SteamID
CSHOP_SAVE_TYPE = 0

Last edited by vAx; 12-10-2016 at 07:40.
vAx is offline
Send a message via MSN to vAx
Craxor
Veteran Member
Join Date: Jan 2016
Location: Romania
Old 12-10-2016 , 07:53   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #62

Can you attach the vault file? I want to check something.
__________________
Project: Among Us
Craxor is offline
Send a message via ICQ to Craxor
vAx
Junior Member
Join Date: Oct 2011
Location: Hungary
Old 12-10-2016 , 08:02   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #63

Quote:
Originally Posted by Craxor View Post
Can you attach the vault file? I want to check something.
I've did it already.
vAx is offline
Send a message via MSN to vAx
Craxor
Veteran Member
Join Date: Jan 2016
Location: Romania
Old 12-10-2016 , 08:51   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #64

You're meaning the .dat file is the vault ... ok i downloaded and openned, most of the people have the data as '0' .

I didn't check the code but OxiCrom can you say why it is saving as .dat and not as .vault ?

The code is very bigger and the good guy to do the changes will be Oxicrom, but the problem may be from here:
PHP Code:
case 1:    g_iPoints[id] = nvault_get(g_iVaultszInfoszPointscharsmax(szPoints)) ? str_to_num(szPoints) : 
nvault_get already return as an integer so you do not need to use str_to_num or szPoints

Should be like that:

case 1: g_iPoints[id] = nvault_get( g_iVault, szInfo );


PHP Code:
nvault_read(idiTypeszInfo[])
{
    if(!
g_eSettings[stgSavePoints])
        return
    

    
// I'm assuming iType is for Save the points or not save.
       // It may be also because szPoints[20] .. you inserting g_iPoints[id] of user wich it is not retrieveid YET. ( at connecting ) .. so will be zero.        
    
if( iType )
        
g_iPointsid ] = nvault_getg_iVault szInfo );


However the whole code should work better with Nvault Utility.
__________________
Project: Among Us

Last edited by Craxor; 12-10-2016 at 09:00.
Craxor is offline
Send a message via ICQ to Craxor
vAx
Junior Member
Join Date: Oct 2011
Location: Hungary
Old 12-10-2016 , 09:25   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #65

Quote:
Originally Posted by Craxor View Post
You're meaning the .dat file is the vault ... ok i downloaded and openned, most of the people have the data as '0' .

I didn't check the code but OxiCrom can you say why it is saving as .dat and not as .vault ?

The code is very bigger and the good guy to do the changes will be Oxicrom, but the problem may be from here:
PHP Code:
case 1:    g_iPoints[id] = nvault_get(g_iVaultszInfoszPointscharsmax(szPoints)) ? str_to_num(szPoints) : 
nvault_get already return as an integer so you do not need to use str_to_num or szPoints

Should be like that:

case 1: g_iPoints[id] = nvault_get( g_iVault, szInfo );


PHP Code:
nvault_read(idiTypeszInfo[])
{
    if(!
g_eSettings[stgSavePoints])
        return
    

    
// I'm assuming iType is for Save the points or not save.
       // It may be also because szPoints[20] .. you inserting g_iPoints[id] of user wich it is not retrieveid YET. ( at connecting ) .. so will be zero.        
    
if( iType )
        
g_iPointsid ] = nvault_getg_iVault szInfo );

However the whole code should work better with Nvault Utility.
Quote:
Originally Posted by Craxor View Post
You're meaning the .dat file is the vault ... ok i downloaded and openned, most of the people have the data as '0' .

I didn't check the code but OxiCrom can you say why it is saving as .dat and not as .vault ?

The code is very bigger and the good guy to do the changes will be Oxicrom, but the problem may be from here:
PHP Code:
case 1:    g_iPoints[id] = nvault_get(g_iVaultszInfoszPoints,  charsmax(szPoints)) ? str_to_num(szPoints) : 
nvault_get already return as an integer so you do not need to use str_to_num or szPoints

Should be like that:

case 1: g_iPoints[id] = nvault_get( g_iVault, szInfo );


PHP Code:
nvault_read(idiTypeszInfo[])
{
    if(!
g_eSettings[stgSavePoints])
        return
    

    
// I'm assuming iType is for Save the points or not save.
       // It may be also because szPoints[20] .. you inserting  g_iPoints[id] of user wich it is not retrieveid YET. ( at connecting )  .. so will be zero.        
    
if( iType )
        
g_iPointsid ] = nvault_getg_iVault szInfo );

However the whole code should work better with Nvault Utility.
No! I renamed it to .dat, cuz I couldn't attached here as a .vault! There was an error message: "Invalid file" as I tried to upload the .vault file.
vAx is offline
Send a message via MSN to vAx
Craxor
Veteran Member
Join Date: Jan 2016
Location: Romania
Old 12-10-2016 , 09:34   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #66

Don't quote two times my reply.

Yes, you're right.
__________________
Project: Among Us

Last edited by Craxor; 12-10-2016 at 09:35.
Craxor is offline
Send a message via ICQ to Craxor
OciXCrom
Veteran Member
Join Date: Oct 2013
Location: Macedonia
Old 12-10-2016 , 09:49   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #67

@Craxor - please read more carefully. He renamed the .vault to .dat because he can't upload a .vault file here. I don't why I used str_to_num, guess I didn't read the API carefully, but it shouldn't make a difference in saving/loading, since it gets the info as a string and then transforms it into an integer, which is the same.

@vAx - this is what the uploaded vault file looks like: http://i.imgur.com/0ZqUtXq.jpg
... which means that it's saving the points correctly, but it doesn't load them. Maybe the login system you're using causes some sort of a delay which prevents the nVault file from loading. Try using the modified code:

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cshop_settings>
#include <fun>
#include <hamsandwich>
#include <nvault>

#define PLUGIN_VERSION "3.4.1"
#define TASK_HUDBAR 388838
#define LOG_ENABLED
#define mtop(%1) floatround(float(%1) / 10.0, floatround_floor)

#if defined LOG_ENABLED
    #define LOG_FILE "CustomShop.log"
#endif

enum _:Items
{
    
iId[32],
    
iName[64],
    
iPrice,
    
iLimit,
    
iSound[128],
    
Float:iDuration,
    
iTeam,
    
iFlag[2],
    
bool:iDisabled
}

enum _:Settings
{
    
stgPrefix[32],
    
stgTitle[128],
    
stgTitlePage[128],
    
stgSoundError[128],
    
stgSoundExpire[128],
    
stgSoundOpen[128],
    
stgBuySoundType,
    
stgExpireSoundType,
    
stgOpenSoundType,
    
stgPrevPage[32],
    
stgNextPage[32],
    
stgMenuExit[32],
    
stgPerPage,
    
stgFlag[2],
    
stgTeam,
    
stgPointsEnable,
    
stgMoneyName[32],
    
stgMoneyNameUC[32],
    
stgCurrency[16],
    
stgSavePoints,
    
stgSaveType,
    
stgShowTeamed,
    
stgItemTeamed[32],
    
stgShowFlagged,
    
stgItemFlagged[32],
    
stgLimitType,
    
stgHideLimited,
    
stgOpenAtSpawn,
    
stgRewardNormal,
    
stgRewardHeadshot,
    
stgRewardKnife,
    
stgRewardVip,
    
stgVipFlag[2],
    
stgTeamKill,
    
stgKillMessage,
    
stgHudEnable,
    
stgHudRed,
    
stgHudGreen,
    
stgHudBlue,
    
Float:stgHudX,
    
Float:stgHudY
}

enum _:Fields
{
    
FIELD_TEAM,
    
FIELD_MONEY,
    
FIELD_CURRENCY,
    
FIELD_NEWLINE,
    
FIELD_PAGE
}

enum _:Options
{
    
OPTION_NAME,
    
OPTION_PRICE,
    
OPTION_LIMIT,
    
OPTION_SOUND,
    
OPTION_DURATION,
    
OPTION_TEAM,
    
OPTION_FLAG
}

enum _:Editor
{
    
EDIT_STATUS,
    
EDIT_NAME,
    
EDIT_PRICE,
    
EDIT_LIMIT,
    
EDIT_SOUND,
    
EDIT_DURATION,
    
EDIT_TEAM,
    
EDIT_FLAG,
    
EDIT_BACK,
    
EDIT_EXIT
}

new const 
g_szVaults[][] = { "CustomShop""CustomShopIP""CustomShopSI" }
new const 
g_szColorReplace[][] = { "!g""^4""!t""^3""!n""^1" }
new const 
g_szHideChat[][] = { "\r""\y""\w""\d""\R" }

new Array:
g_aItems
new Trie:g_tItemIds
new g_eSettings[Settings]
new 
g_szFields[Fields][16] = { "%team%""%money%""%currency%""%newline%""%page%" }
new 
g_szOptionsL[Options][16] = { "CSHOP_NAME""CSHOP_PRICE""CSHOP_LIMIT""CSHOP_SOUND""CSHOP_DURATION""CSHOP_TEAM""CSHOP_FLAG" }
new 
g_szOptions[Options][16]
new 
g_szStatus[2][16]

new Array:
g_aSounds
new g_iTotalItems
new g_msgSayText
new g_iLimit[33][MAX_ITEMS]
new 
g_iItemTeamLimit[4][MAX_ITEMS]
new 
g_iItemLimit[MAX_ITEMS]
new 
bool:g_blHasItem[33][MAX_ITEMS]
new 
bool:g_blAllowCmd[33]
new 
bool:g_blUnsaved
new g_szTeams[4][32]
new 
g_szInfo[33][35]
new 
g_szConfigsName[256]
new 
g_szItemsFile[256]
new 
g_szItemsLoaded[192]
new 
g_iEditItem[33]
new 
g_iEditChoice[33]
new 
g_eEditArray[33][Items]
new 
g_iPoints[33]
new 
g_fwdSelectItem
new g_fwdRemoveItem
new g_iVault
new g_iHUD

public plugin_init()
{
    
register_plugin("Custom Shop"PLUGIN_VERSION"OciXCrom")
    
register_cvar("CustomShop"PLUGIN_VERSIONFCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
    
register_dictionary("CustomShop.txt")
    
register_logevent("eventRoundStart"2"0=World triggered""1=Round_Start")
    
RegisterHam(Ham_Spawn"player""eventPlayerSpawn"1)
    
register_event("DeathMsg""eventPlayerKilled""a")
    
register_concmd("cshop_points""cmdGivePoints"FLAG_ADMIN"<nick|#userid> <points to give/take>")
    
register_concmd("cshop_items""cmdListItems"FLAG_ADMIN"-- lists all loaded items")
    
register_clcmd("cshop_edit""menuEditor")
    
register_clcmd("cshop_edit_item""cmdEdit")
    
g_fwdSelectItem CreateMultiForward("cshopItemBought"ET_STOPFP_CELLFP_CELL)
    
g_fwdRemoveItem CreateMultiForward("cshopItemRemoved"ET_IGNOREFP_CELLFP_CELL)
    
formatex(g_szItemsFilecharsmax(g_szItemsFile), "%s/CustomShopItems.ini"g_szConfigsName)
    
formatex(g_szStatus[0], charsmax(g_szStatus[]), "%L"LANG_SERVER"CSHOP_DISABLED")
    
formatex(g_szStatus[1], charsmax(g_szStatus[]), "%L"LANG_SERVER"CSHOP_ENABLED")
    
g_msgSayText get_user_msgid("SayText")
    
g_iVault nvault_open(g_szVaults[g_eSettings[stgSaveType]])
    
g_iHUD CreateHudSyncObj()
    
    for(new 
isizeof(g_szOptions); i++)
        
formatex(g_szOptions[i], charsmax(g_szOptions[]), "%L"LANG_SERVERg_szOptionsL[i])
    
    
loadItems(0)
    
formStuff()
}

formStuff()
{
    new 
szTemp[128]
    
formatex(g_szItemsLoadedcharsmax(g_szItemsLoaded), "%L"LANG_TYPE"CSHOP_ITEMS_LOADED"g_iTotalItems)
    
    if(
contain(g_eSettings[stgTitle], g_szFields[FIELD_CURRENCY]) != -1)
        
replace_all(g_eSettings[stgTitle], charsmax(g_eSettings[stgTitle]), g_szFields[FIELD_CURRENCY], g_eSettings[stgMoneyNameUC])
        
    if(
contain(g_eSettings[stgTitle], g_szFields[FIELD_NEWLINE]) != -1)
        
replace_all(g_eSettings[stgTitle], charsmax(g_eSettings[stgTitle]), g_szFields[FIELD_NEWLINE], "^n")
    
    if(
contain(g_eSettings[stgTitlePage], g_szFields[FIELD_NEWLINE]) != -1)
        
replace_all(g_eSettings[stgTitlePage], charsmax(g_eSettings[stgTitlePage]), g_szFields[FIELD_NEWLINE], "^n")
        
    if(
contain(g_eSettings[stgTitlePage], g_szFields[FIELD_PAGE]) != -1)
    {
        
formatex(szTempcharsmax(szTemp), "%L"LANG_TYPE"CSHOP_PAGE")
        
replace_all(g_eSettings[stgTitlePage], charsmax(g_eSettings[stgTitlePage]), g_szFields[FIELD_PAGE], szTemp)
    }
}

public 
plugin_precache()
{
    
get_configsdir(g_szConfigsNamecharsmax(g_szConfigsName))
    
g_aItems ArrayCreate(Items)
    
g_aSounds ArrayCreate(1281)
    
g_tItemIds TrieCreate()
    
readSettings()
}

public 
plugin_end()
{
    
loadItems(0)
    
loadItems(1)
    
ArrayDestroy(g_aItems)
    
ArrayDestroy(g_aSounds)
    
TrieDestroy(g_tItemIds)
}

loadItems(iWrite)
{
    new 
iFilePointer
    
    
switch(iWrite)
    {
        case 
0:
        {
            
iFilePointer fopen(g_szItemsFile"rt")
            
            if(
iFilePointer)
            {
                new 
szData[192], szValue[160], szKey[32], szItemId[32], szStatus[16]
                new 
eItem[Items], iItem = -1
                
                
while(!feof(iFilePointer))
                {
                    
fgets(iFilePointerszDatacharsmax(szData))
                    
trim(szData)
                    
                    switch(
szData[0])
                    {
                        case 
EOS';''/': continue
                        case 
'[':
                        {                                
                            if(
szData[strlen(szData) - 1] == ']')
                            {
                                if(
iItem >= 0)
                                    
ArraySetArray(g_aItemsiItemeItem)
                                
                                
replace(szDatacharsmax(szData), "[""")
                                
replace(szDatacharsmax(szData), "]""")
                                
trim(szData)
                                
                                
iItem++
                                
parse(szDataszItemIdcharsmax(szItemId), szStatuscharsmax(szStatus))
                                
TrieGetCell(g_tItemIdsszItemIdiItem)
                                
ArrayGetArray(g_aItemsiItemeItem)
                                
eItem[iDisabled] = szStatus[0] == g_szStatus[0][0]
                            }
                            else continue
                        }
                        default:
                        {
                            
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), ':')
                            
trim(szKey); trim(szValue)
                            
                            if(
is_blank(szValue))
                                continue
                                
                            if(
equal(szKeyg_szOptions[OPTION_NAME]))
                                
copy(eItem[iName], charsmax(eItem[iName]), szValue)
                            else if(
equal(szKeyg_szOptions[OPTION_PRICE]))
                                
eItem[iPrice] = str_to_num(szValue)
                            else if(
equal(szKeyg_szOptions[OPTION_LIMIT]))
                                
eItem[iLimit] = str_to_num(szValue)
                            else if(
equal(szKeyg_szOptions[OPTION_SOUND]))
                                
copy(eItem[iSound], charsmax(eItem[iSound]), szValue)
                            else if(
equal(szKeyg_szOptions[OPTION_DURATION]))
                                
eItem[iDuration] = _:str_to_float(szValue)
                            else if(
equal(szKeyg_szOptions[OPTION_TEAM]))
                                
eItem[iTeam] = str_to_num(szValue)
                            else if(
equal(szKeyg_szOptions[OPTION_FLAG]))
                                
copy(eItem[iFlag], charsmax(eItem[iFlag]), szValue)
                        }
                    }                    
                }
                
                
fclose(iFilePointer)
            }
        }
        case 
1:
        {
            
delete_file(g_szItemsFile)
            
iFilePointer fopen(g_szItemsFile"wt")
            
            if(
iFilePointer)
            {
                new 
eItem[Items]
                
                for(new 
ig_iTotalItemsi++)
                {
                    
ArrayGetArray(g_aItemsieItem)
                    
                    if(
eItem[iDisabled])
                    {
                        
fprintf(iFilePointer"%s[%s %s]"== "" "^n^n"eItem[iId], g_szStatus[0])
                        continue
                    }
                    else
                        
fprintf(iFilePointer"%s[%s %s]"== "" "^n^n"eItem[iId], g_szStatus[1])
                        
                    
fprintf(iFilePointer"^n%s: %s"g_szOptions[OPTION_NAME], eItem[iName])
                    
fprintf(iFilePointer"^n%s: %i"g_szOptions[OPTION_PRICE], eItem[iPrice])
                    
                    if(
eItem[iLimit])
                        
fprintf(iFilePointer"^n%s: %i"g_szOptions[OPTION_LIMIT], eItem[iLimit])
                        
                    if(!
equal(eItem[iSound], DEFAULT_SOUND))
                        
fprintf(iFilePointer"^n%s: %s"g_szOptions[OPTION_SOUND], eItem[iSound])
                        
                    if(
eItem[iDuration])
                        
fprintf(iFilePointer"^n%s: %.1f"g_szOptions[OPTION_DURATION], eItem[iDuration])
                        
                    if(
eItem[iTeam])
                        
fprintf(iFilePointer"^n%s: %i"g_szOptions[OPTION_TEAM], eItem[iTeam])
                        
                    if(!
is_blank(eItem[iFlag]))
                        
fprintf(iFilePointer"^n%s: %s"g_szOptions[OPTION_FLAG], eItem[iFlag])
                }
                
                
fclose(iFilePointer)
            }
        }
    }
}    
    
readSettings()
{
    new 
szFilename[256]
    
formatex(szFilenamecharsmax(szFilename), "%s/CustomShop.ini"g_szConfigsName)
    new 
iFilePointer fopen(szFilename"rt")
    
    if(
iFilePointer)
    {
        new 
szData[160], szKey[32], szValue[128]
        
        while(!
feof(iFilePointer))
        {
            
fgets(iFilePointerszDatacharsmax(szData))
            
trim(szData)
            
            switch(
szData[0])
            {
                case 
EOS';''/': continue
                default:
                {
                    
strtok(szDataszKeycharsmax(szKey), szValuecharsmax(szValue), '=')
                    
trim(szKey); trim(szValue)
                    
                    if(
is_blank(szValue))
                        continue
                    
                    if(
equal(szKey"CSHOP_PREFIX"))
                        
copy(g_eSettings[stgPrefix], charsmax(g_eSettings[stgPrefix]), szValue)
                    else if(
equal(szKey"CSHOP_TITLE"))
                        
copy(g_eSettings[stgTitle], charsmax(g_eSettings[stgTitle]), szValue)
                    else if(
equal(szKey"CSHOP_TITLE_PAGE"))
                        
copy(g_eSettings[stgTitlePage], charsmax(g_eSettings[stgTitlePage]), szValue)
                    else if(
equal(szKey"CSHOP_TEAM_NAMES"))
                    {
                        for(new 
i4i++)
                        {
                            
strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ',')
                            
trim(szKey); trim(szValue)
                            
copy(g_szTeams[i], charsmax(g_szTeams[]), szKey)
                        }
                    }
                    else if(
equal(szKey"CSHOP_SOUND_ERROR"))
                    {
                        
copy(g_eSettings[stgSoundError], charsmax(g_eSettings[stgSoundError]), szValue)
                        
precache_sound(szValue)
                    }
                    else if(
equal(szKey"CSHOP_SOUND_EXPIRE"))
                    {
                        
copy(g_eSettings[stgSoundExpire], charsmax(g_eSettings[stgSoundExpire]), szValue)
                        
precache_sound(szValue)
                    }
                    else if(
equal(szKey"CSHOP_SOUND_OPEN"))
                    {
                        
copy(g_eSettings[stgSoundOpen], charsmax(g_eSettings[stgSoundOpen]), szValue)
                        
precache_sound(szValue)
                    }
                    else if(
equal(szKey"CSHOP_BUYSOUND_TYPE"))
                        
g_eSettings[stgBuySoundType] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_EXPIRESOUND_TYPE"))
                        
g_eSettings[stgExpireSoundType] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_OPENSOUND_TYPE"))
                        
g_eSettings[stgOpenSoundType] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_PREVPAGE"))
                        
copy(g_eSettings[stgPrevPage], charsmax(g_eSettings[stgPrevPage]), szValue)
                    else if(
equal(szKey"CSHOP_NEXTPAGE"))
                        
copy(g_eSettings[stgNextPage], charsmax(g_eSettings[stgNextPage]), szValue)
                    else if(
equal(szKey"CSHOP_EXITMENU"))
                        
copy(g_eSettings[stgMenuExit], charsmax(g_eSettings[stgMenuExit]), szValue)
                    else if(
equal(szKey"CSHOP_PERPAGE"))
                        
g_eSettings[stgPerPage] = clamp(str_to_num(szValue), 07)
                    else if(
equal(szKey"CSHOP_COMMANDS"))
                    {
                        while(
szValue[0] != && strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ','))
                        {
                            
trim(szKey); trim(szValue)
                            
register_clcmd(szKey"menuShop")
                        }
                    }
                    else if(
equal(szKey"CSHOP_FLAG"))
                        
copy(g_eSettings[stgFlag], charsmax(g_eSettings[stgFlag]), szValue)
                    else if(
equal(szKey"CSHOP_TEAM"))
                        
g_eSettings[stgTeam] = clamp(str_to_num(szValue), 03)
                    else if(
equal(szKey"CSHOP_POINTS_ENABLE"))
                        
g_eSettings[stgPointsEnable] = clamp(str_to_num(szValue), 01)
                    else if((
g_eSettings[stgPointsEnable] && equal(szKey"CSHOP_POINTS_NAME")) || (!g_eSettings[stgPointsEnable] && equal(szKey"CSHOP_MONEY_NAME")))
                    {
                        
copy(g_eSettings[stgMoneyName], charsmax(g_eSettings[stgMoneyName]), szValue)
                        
copy(g_eSettings[stgMoneyNameUC], charsmax(g_eSettings[stgMoneyNameUC]), szValue)
                        
ucfirst(g_eSettings[stgMoneyNameUC])
                    }
                    else if((
g_eSettings[stgPointsEnable] && equal(szKey"CSHOP_POINTS_CURRENCY")) || (!g_eSettings[stgPointsEnable] && equal(szKey"CSHOP_MONEY_CURRENCY")))
                        
copy(g_eSettings[stgCurrency], charsmax(g_eSettings[stgCurrency]), szValue)
                    else if(
equal(szKey"CSHOP_POINTS_SAVE"))
                        
g_eSettings[stgSavePoints] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_SAVE_TYPE"))
                        
g_eSettings[stgSaveType] = clamp(str_to_num(szValue), 02)
                    else if(
equal(szKey"CSHOP_POINTS_COMMANDS"))
                    {
                        while(
szValue[0] != && strtok(szValueszKeycharsmax(szKey), szValuecharsmax(szValue), ','))
                        {
                            
trim(szKey); trim(szValue)
                            
register_clcmd(szKey"cmdPoints")
                        }
                    }
                    else if(
equal(szKey"CSHOP_SHOW_TEAMED"))
                        
g_eSettings[stgShowTeamed] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_ITEM_TEAMED"))
                        
copy(g_eSettings[stgItemTeamed], charsmax(g_eSettings[stgItemTeamed]), szValue)
                    else if(
equal(szKey"CSHOP_SHOW_FLAGGED"))
                        
g_eSettings[stgShowFlagged] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_ITEM_FLAGGED"))
                        
copy(g_eSettings[stgItemFlagged], charsmax(g_eSettings[stgItemFlagged]), szValue)
                    else if(
equal(szKey"CSHOP_LIMIT_TYPE"))
                        
g_eSettings[stgLimitType] = clamp(str_to_num(szValue), 02)
                    else if(
equal(szKey"CSHOP_HIDE_LIMITED"))
                        
g_eSettings[stgHideLimited] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_OPEN_AT_SPAWN"))
                        
g_eSettings[stgOpenAtSpawn] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_REWARD_NORMAL"))
                        
g_eSettings[stgRewardNormal] = str_to_num(szValue)
                    else if(
equal(szKey"CSHOP_REWARD_HEADSHOT"))
                        
g_eSettings[stgRewardHeadshot] = str_to_num(szValue)
                    else if(
equal(szKey"CSHOP_REWARD_KNIFE"))
                        
g_eSettings[stgRewardKnife] = str_to_num(szValue)
                    else if(
equal(szKey"CSHOP_REWARD_VIP"))
                        
g_eSettings[stgRewardVip] = str_to_num(szValue)
                    else if(
equal(szKey"CSHOP_VIP_FLAG"))
                        
copy(g_eSettings[stgVipFlag], charsmax(g_eSettings[stgVipFlag]), szValue)
                    else if(
equal(szKey"CSHOP_POINTS_TEAMKILL"))
                        
g_eSettings[stgTeamKill] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_KILL_MESSAGE"))
                        
g_eSettings[stgKillMessage] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_HUD_ENABLED"))
                        
g_eSettings[stgHudEnable] = clamp(str_to_num(szValue), 01)
                    else if(
equal(szKey"CSHOP_HUD_RED"))
                        
g_eSettings[stgHudRed] = clamp(str_to_num(szValue), 0255)
                    else if(
equal(szKey"CSHOP_HUD_GREEN"))
                        
g_eSettings[stgHudGreen] = clamp(str_to_num(szValue), 0255)
                    else if(
equal(szKey"CSHOP_HUD_BLUE"))
                        
g_eSettings[stgHudBlue] = clamp(str_to_num(szValue), 0255)
                    else if(
equal(szKey"CSHOP_HUD_X"))
                        
g_eSettings[stgHudX] = _:floatclamp(str_to_float(szValue), -1.01.0)
                    else if(
equal(szKey"CSHOP_HUD_Y"))
                        
g_eSettings[stgHudY] = _:floatclamp(str_to_float(szValue), -1.01.0)
                }
            }    
        }
        
        
fclose(iFilePointer)
    }
}

public 
client_disconnect(id)
    
nvault_read(id0g_szInfo[id])
        
public 
client_connect(id)
{    
    switch(
g_eSettings[stgSaveType])
    {
        case 
0get_user_name(idg_szInfo[id], charsmax(g_szInfo[]))
        case 
1get_user_ip(idg_szInfo[id], charsmax(g_szInfo[]), 1)
        case 
2get_user_authid(idg_szInfo[id], charsmax(g_szInfo[]))
    }
    
    
nvault_read(id1g_szInfo[id])
        
    
arrayset(g_iLimit[id], 0sizeof(g_iLimit[]))
    
arrayset(g_blHasItem[id], falsesizeof(g_blHasItem[]))
}

public 
client_putinserver(id)
    if(
g_eSettings[stgPointsEnable] && g_eSettings[stgHudEnable])
        
set_task(1.0"showHUD"id TASK_HUDBAR__"b")

public 
client_infochanged(id)
{
    if(
g_eSettings[stgSaveType] > 0)
        return
        
    new 
szNewName[32], szOldName[32]
    
get_user_info(id"name"szNewNamecharsmax(szNewName))
    
get_user_name(idszOldNamecharsmax(szOldName))
    
    if(!
equal(szNewNameszOldName))
    {
        
nvault_read(id0szOldName)
        
nvault_read(id1szNewName)
    }
}

nvault_read(idiTypeszInfo[])
{
    if(!
g_eSettings[stgSavePoints])
        return
    
    switch(
iType)
    {
        case 
0:
        {
            new 
szPoints[20]
            
num_to_str(g_iPoints[id], szPointscharsmax(szPoints))
            
nvault_set(g_iVaultszInfoszPoints)
            
            
#if defined LOG_ENABLED
                
log_to_file(LOG_FILE"Saved %i points for %s"g_iPoints[id], szInfo)
            
#endif
        
}
        case 
1:
        {
            
g_iPoints[id] = nvault_get(g_iVaultszInfo)
            
            
#if defined LOG_ENABLED
                
log_to_file(LOG_FILE"Loaded %i points for %s"g_iPoints[id], szInfo)
            
#endif
        
}
    }
}

public 
showHUD(id)
{
    
id -= TASK_HUDBAR
    
    
if(!is_user_connected(id))
    {
        
remove_task(id TASK_HUDBAR)
        return
    }
    
    
set_hudmessage(g_eSettings[stgHudRed], g_eSettings[stgHudGreen], g_eSettings[stgHudBlue], g_eSettings[stgHudX], g_eSettings[stgHudY], 01.01.5)
    
ShowSyncHudMsg(idg_iHUD"%s: %i"g_eSettings[stgMoneyNameUC], g_iPoints[id])
}

public 
eventRoundStart()
{
    switch(
g_eSettings[stgLimitType])
    {
        case 
1:
        {
            for(new 
i4i++)
                
arrayset(g_iItemTeamLimit[i], 0sizeof(g_iItemTeamLimit[]))
        }
        case 
2:    arrayset(g_iItemLimit0sizeof(g_iItemLimit))
    }
}

public 
eventPlayerSpawn(id)
{
    if(!
g_eSettings[stgLimitType])
    {
        
arrayset(g_iLimit[id], 0sizeof(g_iLimit[]))
        
        for(new 
ig_iTotalItemsi++)
            if(
g_blHasItem[id][i])
                
removeItem(idi)
    }
    
    if(
g_eSettings[stgOpenAtSpawn])
        if(
has_access_flag(id))
            if(
has_access_team(id))
                if(
is_user_alive(id))
                    
menuShop(id)
}

public 
eventPlayerKilled()
{
    if(!
g_eSettings[stgPointsEnable])
        return
        
    new 
iAttacker read_data(1)
    new 
iVictim read_data(2)
    
    if(!
is_user_connected(iAttacker) || !is_user_connected(iVictim) || iAttacker == iVictim)
        return
    
    if(!
has_access_flag(iAttacker))
        return
        
    if(
get_user_team(iAttacker) == get_user_team(iVictim))
        if(!
g_eSettings[stgTeamKill])
            return
    
    new 
iReward
    
    iReward 
+= g_eSettings[stgRewardNormal]
    
    if(
read_data(3))
        
iReward += g_eSettings[stgRewardHeadshot]
    
    new 
szWeapon[16]
    
read_data(4szWeaponcharsmax(szWeapon))
    
    if(
equal(szWeapon"knife"))
        
iReward += g_eSettings[stgRewardKnife]
        
    if(
g_eSettings[stgRewardVip] && get_user_flags(iAttacker) & g_eSettings[stgVipFlag])
        
iReward += g_eSettings[stgRewardVip]
        
    
g_iPoints[iAttacker] += iReward
    
    
if(g_eSettings[stgKillMessage])
    {
        new 
szName[32]
        
get_user_name(iVictimszNamecharsmax(szName))
        
ColorChat(iAttacker"%L"iAttacker"CSHOP_KILL"iRewardg_eSettings[stgCurrency], szName)
    }
}

public 
cmdPoints(id)
{
    if(
g_eSettings[stgPointsEnable])
        
ColorChat(id"%L"id"CSHOP_POINTS"g_iPoints[id], g_eSettings[stgCurrency])
    else
        
ColorChat(id"%L"id"CSHOP_POINTS_DISABLED")
        
    return 
PLUGIN_HANDLED
}

public 
cmdGivePoints(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid3))
        return 
PLUGIN_HANDLED
        
    
if(!g_eSettings[stgPointsEnable])
    {
        
ColorChat(id"%L"id"CSHOP_POINTS_DISABLED")
        return 
PLUGIN_HANDLED
    
}

    new 
szPlayer[32]
    
read_argv(1szPlayercharsmax(szPlayer))
    
    new 
iPlayer cmd_target(idszPlayer0)
    
    if(!
iPlayer)
        return 
PLUGIN_HANDLED
    
    
new szAmount[10]
    
read_argv(2szAmountcharsmax(szAmount))
    
    new 
iAmount str_to_num(szAmount)
    new 
bool:blGive szAmount[0] == '-' false true
    
    g_iPoints
[iPlayer] += iAmount
    
    
if(!blGive)
        
iAmount *= -1
    
    
if(is_user_connected(id))
    {
        new 
szMessage[192], szName[32], szName2[32]
        
get_user_name(idszNamecharsmax(szName))
        
get_user_name(iPlayerszName2charsmax(szName2))
        
formatex(szMessagecharsmax(szMessage), "%L"LANG_TYPEblGive "CSHOP_CMD_GIVE" "CSHOP_CMD_TAKE"szNameiAmountg_eSettings[stgCurrency], szName2)
        
ColorChat(0szMessage)
        
        for(new 
isizeof(g_szColorReplace); += 2)
            
replace_all(szMessagecharsmax(szMessage), g_szColorReplace[i], "")
        
        
log_amx(szMessage)
    }
    
    return 
PLUGIN_HANDLED
}

public 
cmdListItems(idiLeveliCid)
{
    if(!
cmd_access(idiLeveliCid1))
        return 
PLUGIN_HANDLED
        
    client_print
(idprint_consoleg_szItemsLoaded)
    
    new 
szItem[192], eItem[Items]
    
    for(new 
ig_iTotalItemsi++)
    {
        
ArrayGetArray(g_aItemsieItem)
        
        if(
eItem[iDisabled])
            continue
            
        
formatex(szItemcharsmax(szItem), "#%i: %s [ %L: %i%s"1eItem[iName], id"CSHOP_PRICE"eItem[iPrice], g_eSettings[stgCurrency])
        
        if(
eItem[iLimit])
            
format(szItemcharsmax(szItem), "%s | %L: %i"szItemid"CSHOP_LIMIT"eItem[iLimit])
            
        if(
eItem[iDuration])
            
format(szItemcharsmax(szItem), "%s | %L: %.1f"szItemid"CSHOP_DURATION"eItem[iDuration])
            
        if(
eItem[iTeam])
            
format(szItemcharsmax(szItem), "%s | %L: %i"szItemid"CSHOP_TEAM"eItem[iTeam])
            
        if(
eItem[iFlag])
            
format(szItemcharsmax(szItem), "%s | %L: %s"szItemid"CSHOP_FLAG"eItem[iFlag])
            
        
add(szItemcharsmax(szItem), " ]")
        
client_print(idprint_consoleszItem)
    }
    
    
client_print(idprint_consoleg_szItemsLoaded)
    return 
PLUGIN_HANDLED
}

public 
menuShop(id)
{
    if(!
has_access_flag(id))
    {
        
ColorChat(id"%L"id"CSHOP_NOTALLOWED_FLAG")
        
errorSound(id)
        return 
PLUGIN_HANDLED
    
}
    
    new 
iUserTeam get_user_team(id)
    
    if(!
has_access_team(id))
    {
        
ColorChat(id"%L"id"CSHOP_NOTALLOWED_TEAM")
        
errorSound(id)
        return 
PLUGIN_HANDLED
    
}
    
    if(!
is_user_alive(id))
    {
        
ColorChat(id"%L"id"CSHOP_NOTALLOWED_DEAD")
        
errorSound(id)
        return 
PLUGIN_HANDLED
    
}
    
    if(!
is_blank(g_eSettings[stgSoundOpen]))
    {
        switch(
g_eSettings[stgOpenSoundType])
        {
            case 
0emitSound(idg_eSettings[stgSoundOpen])
            case 
1speakSound(idg_eSettings[stgSoundOpen])
        }
    }
    
    new 
szTitle[256], szItem[128], szKey[5], eItem[Items], iUserLimit
    
new iMoney g_eSettings[stgPointsEnable] ? g_iPoints[id] : get_user_money(id)
    new 
iFlags get_user_flags(id)
    
    
copy(szTitlecharsmax(szTitle), g_eSettings[stgTitle])
    
    if(
contain(szTitleg_szFields[FIELD_TEAM]) != -1)
        
replace_all(szTitlecharsmax(szTitle), g_szFields[FIELD_TEAM], g_szTeams[iUserTeam])
    
    if(
contain(szTitleg_szFields[FIELD_MONEY]) != -1)
    {
        new 
szMoney[16]
        
num_to_str(iMoneyszMoneycharsmax(szMoney))
        
replace_all(szTitlecharsmax(szTitle), g_szFields[FIELD_MONEY], szMoney)
    }
        
    new 
iMenu menu_create(szTitle"handlerShop")
    
    for(new 
ig_iTotalItemsi++)
    {
        
ArrayGetArray(g_aItemsieItem)
        
        if(
eItem[iDisabled])
            continue
        
        if(
eItem[iTeam] && eItem[iTeam] != iUserTeam)
        {
            if(
g_eSettings[stgShowTeamed])
            {
                
formatex(szItemcharsmax(szItem), "\d%s %s"eItem[iName], g_eSettings[stgItemTeamed])
                goto 
cpAddItem
            
}
            
            continue
        }
        
        if(!
is_blank(eItem[iFlag]) && !(iFlags read_flags(eItem[iFlag])))
        {
            if(
g_eSettings[stgShowFlagged])
            {
                
formatex(szItemcharsmax(szItem), "\d%s %s"eItem[iName], g_eSettings[stgItemFlagged])
                goto 
cpAddItem
            
}
                
            continue
        }
        
        
iUserLimit get_user_limit(idi)
        
        if(
g_eSettings[stgHideLimited] && (eItem[iLimit] && iUserLimit == eItem[iLimit]))
            continue
        
        if(
eItem[iLimit])
            
formatex(szItemcharsmax(szItem), "%s%s \r[\y%i%s\r] [\y%i\r/\y%i\r]"
            (
iMoney >= eItem[iPrice] && iUserLimit eItem[iLimit]) ? "" "\d"eItem[iName], eItem[iPrice], g_eSettings[stgCurrency], iUserLimiteItem[iLimit])
        else
            
formatex(szItemcharsmax(szItem), "%s%s \r[\y%i%s\r]"
            (
iMoney >= eItem[iPrice]) ? "" "\d"eItem[iName], eItem[iPrice], g_eSettings[stgCurrency])
        
        
cpAddItem:
        
num_to_str(iszKeycharsmax(szKey))
        
menu_additem(iMenuszItemszKey)
    }
    
    new 
iPages menu_pages(iMenu)
    
    if(!
iPages)
    {
        
ColorChat(id"%L"id"CSHOP_NOITEMS")
        
errorSound(id)
    }
    else
    {
        if(
iPages 1)
        {
            
add(szTitlecharsmax(szTitle), g_eSettings[stgTitlePage])
            
menu_setprop(iMenuMPROP_TITLEszTitle)
        }
            
        
menu_setprop(iMenuMPROP_BACKNAMEg_eSettings[stgPrevPage])
        
menu_setprop(iMenuMPROP_NEXTNAMEg_eSettings[stgNextPage])
        
menu_setprop(iMenuMPROP_EXITNAMEg_eSettings[stgMenuExit])
        
menu_setprop(iMenuMPROP_PERPAGEg_eSettings[stgPerPage])
        
menu_display(idiMenu0)
    }
    
    return 
PLUGIN_HANDLED
}

public 
handlerShop(idiMenuiItem)
{
    if(
iItem == MENU_EXIT || !is_user_alive(id))
    {
        
menu_destroy(iMenu)
        return 
PLUGIN_HANDLED
    
}
    
    new 
szName[64], szData[6], accesscallback
    menu_item_getinfo
(iMenuiItemaccessszDatacharsmax(szData), szNamecharsmax(szName), callback)
    new 
iKey str_to_num(szData)
    
    new 
eItem[Items]
    
ArrayGetArray(g_aItemsiKeyeItem)
    new 
iMoney g_eSettings[stgPointsEnable] ? g_iPoints[id] : get_user_money(id)
    new 
iUserLimit get_user_limit(idiKey)
    
    if(
eItem[iTeam] && eItem[iTeam] != get_user_team(id))
    {
        
ColorChat(id"%L"id"CSHOP_NOT_TEAM")
        
errorSound(id)
    }
    else if(!
is_blank(eItem[iFlag]) && !(get_user_flags(id) & read_flags(eItem[iFlag])))
    {
        
ColorChat(id"%L"id"CSHOP_NOT_FLAG")
        
errorSound(id)
    }
    else if(
iMoney eItem[iPrice])
    {
        
ColorChat(id"%L"id"CSHOP_NOT_MONEY"g_eSettings[stgMoneyName], iMoneyeItem[iPrice], g_eSettings[stgCurrency])
        
errorSound(id)
    }
    else if(
eItem[iLimit] && (iUserLimit == eItem[iLimit]))
    {
        
ColorChat(id"%L"id"CSHOP_NOT_LIMIT"iUserLimiteItem[iLimit])
        
errorSound(id)
    }
    else if(
eItem[iDuration] && g_blHasItem[id][iKey])
    {
        
ColorChat(id"%L"id"CSHOP_NOT_DELAY"eItem[iDuration])
        
errorSound(id)
    }
    else 
buyItem(idiKey)
    
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
menuEditor(id)
{
    if(!(
get_user_flags(id) & FLAG_ADMIN))
        return 
PLUGIN_HANDLED
        
    
new szTitle[128]
    
formatex(szTitlecharsmax(szTitle), "%L"id"CSHOP_EDITOR_TITLE")
    
    new 
iMenu menu_create(szTitle"handlerEditor")
    new 
szItem[34], eItem[Items]
    
    
formatex(szItemcharsmax(szItem), "%s%L"g_blUnsaved "\y" "\d"id"CSHOP_EDITOR_SAVE")
    
menu_additem(iMenuszItem"#save")
    
menu_addblank(iMenu0)
    
    for(new 
ig_iTotalItemsi++)
    {
        
ArrayGetArray(g_aItemsieItem)
        
copy(szItemcharsmax(szItem), eItem[iId])
        
format(szItemcharsmax(szItem), "%s%s"eItem[iDisabled] ? "\r" ""szItem)
        
menu_additem(iMenuszItem)
    }
    
    
menu_setprop(iMenuMPROP_BACKNAMEg_eSettings[stgPrevPage])
    
menu_setprop(iMenuMPROP_NEXTNAMEg_eSettings[stgNextPage])
    
menu_setprop(iMenuMPROP_EXITNAMEg_eSettings[stgMenuExit])
    
menu_setprop(iMenuMPROP_PERPAGEg_eSettings[stgPerPage])
    
menu_display(idiMenu0)
    return 
PLUGIN_HANDLED
}

public 
handlerEditor(idiMenuiItem)
{
    if(
iItem != MENU_EXIT)
    {
        new 
szName[64], szData[2], accesscallback
        menu_item_getinfo
(iMenuiItemaccessszDatacharsmax(szData), szNamecharsmax(szName), callback)
        
        if(
szData[0] == '#')
        {
            if(
g_blUnsaved)
            {
                
loadItems(1)
                
ColorChat(id"%L"id"CSHOP_EDITOR_SAVED")
                
g_blUnsaved false
            
}
            else
                
ColorChat(id"%L"id"CSHOP_EDITOR_CANTSAVE")
        }
        else
        {
            
g_iEditItem[id] = iItem 1
            ArrayGetArray
(g_aItemsg_iEditItem[id], g_eEditArray[id])
            
menuEditItem(id)
        }
    }
        
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
menuEditItem(id)
{
    new 
szTitle[128]
    
formatex(szTitlecharsmax(szTitle), "%L^n%L"id"CSHOP_EDITOR_TITLE"id"CSHOP_EDITOR_CURRENT"g_eEditArray[id][iId])
    
    new 
iMenu menu_create(szTitle"handlerEditItem")
    
    new 
szItem[128]
    
    if(
g_eEditArray[id][iDisabled])
        
formatex(szItemcharsmax(szItem), "%L: \r%L"id"CSHOP_EDITOR_STATUS"id"CSHOP_DISABLED")
    else
        
formatex(szItemcharsmax(szItem), "%L: \y%L"id"CSHOP_EDITOR_STATUS"id"CSHOP_ENABLED")
        
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%s"id"CSHOP_NAME"g_eEditArray[id][iName])
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%i"id"CSHOP_PRICE"g_eEditArray[id][iPrice])
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%i"id"CSHOP_LIMIT"g_eEditArray[id][iLimit])
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%s"id"CSHOP_SOUND"g_eEditArray[id][iSound])
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%.1f"id"CSHOP_DURATION"g_eEditArray[id][iDuration])
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%i"id"CSHOP_TEAM"g_eEditArray[id][iTeam])
    
menu_additem(iMenuszItem)
    
    
formatex(szItemcharsmax(szItem), "%L: \d%s"id"CSHOP_FLAG"g_eEditArray[id][iFlag])
    
menu_additem(iMenuszItem)
    
    
menu_addblank(iMenu0)
    
menu_additem(iMenug_eSettings[stgPrevPage])
    
menu_additem(iMenug_eSettings[stgMenuExit], "MENU_EXIT")
    
    
menu_setprop(iMenuMPROP_PERPAGE0)
    
menu_display(idiMenu0)
    return 
PLUGIN_HANDLED
}

public 
handlerEditItem(idiMenuiItem)
{
    switch(
iItem)
    {
        case 
MENU_EXITEDIT_EXIT:
            goto 
cpDestroy
        
case EDIT_SOUND:
        {
            
ColorChat(id"%L"id"CSHOP_EDITOR_SOUND")
            goto 
cpDestroy
        
}
        case 
EDIT_STATUS:
        {
            new 
szName[32]
            
get_user_name(idszNamecharsmax(szName))
            
g_eEditArray[id][iDisabled] = g_eEditArray[id][iDisabled] ? 1
            ArraySetArray
(g_aItemsg_iEditItem[id], g_eEditArray[id])
            
log_amx("%L"LANG_SERVER"CSHOP_EDITOR_TOGGLE"szNameg_eEditArray[id][iId])
            
g_blUnsaved true
            menu_destroy
(iMenu)
            
menuEditItem(id)
            return 
PLUGIN_HANDLED
        
}
        case 
EDIT_BACK:
        {
            
menu_destroy(iMenu)
            
menuEditor(id)
            return 
PLUGIN_HANDLED
        
}
    }
    
    
g_blAllowCmd[id] = true
    g_iEditChoice
[id] = iItem
    client_cmd
(id"messagemode cshop_edit_item")
    
    
cpDestroy:
    
menu_destroy(iMenu)
    return 
PLUGIN_HANDLED
}

public 
cmdEdit(id)
{
    if(!
g_blAllowCmd[id])
        return 
PLUGIN_HANDLED
    
    
new szArgs[128]
    
read_args(szArgscharsmax(szArgs))
    
remove_quotes(szArgs)
    
    switch(
g_iEditChoice[id])
    {
        case 
EDIT_NAMEcopy(g_eEditArray[id][iName], charsmax(g_eEditArray[][iName]), szArgs)
        case 
EDIT_PRICEg_eEditArray[id][iPrice] = str_to_num(szArgs)
        case 
EDIT_LIMITg_eEditArray[id][iLimit] = str_to_num(szArgs)
        case 
EDIT_DURATIONg_eEditArray[id][iDuration] = _:str_to_float(szArgs)
        case 
EDIT_TEAMg_eEditArray[id][iTeam] = str_to_num(szArgs)
        case 
EDIT_FLAGcopy(g_eEditArray[id][iFlag], charsmax(g_eEditArray[][iFlag]), szArgs)
    }
    
    
ArraySetArray(g_aItemsg_iEditItem[id], g_eEditArray[id])
    
g_blUnsaved true
    
    
new szMessage[192]
    
formatex(szMessagecharsmax(szMessage), "%L"id"CSHOP_EDITOR_SET"g_eEditArray[id][iId], szArgs)
    
ColorChat(idszMessage)
    
    new 
szName[32]
    
get_user_name(idszNamecharsmax(szName))
    
log_amx("%s > %s"szNameszMessage)
    
    
g_blAllowCmd[id] = false
    menuEditItem
(id)
    return 
PLUGIN_HANDLED
}

buyItem(idiItem)
{
    new 
iReturn
    ExecuteForward
(g_fwdSelectItemiReturnidiItem)
    
    if(
iReturn)
        return 
iReturn
        
    
new eItem[Items]
    
ArrayGetArray(g_aItemsiItemeItem)
    
    if(
g_eSettings[stgPointsEnable])
        
g_iPoints[id] -= eItem[iPrice]
    else
        
take_user_money(ideItem[iPrice])
        
    
ColorChat(id"%L"id"CSHOP_ITEM_BOUGHT"eItem[iName], eItem[iPrice], g_eSettings[stgCurrency])
    
    switch(
g_eSettings[stgBuySoundType])
    {
        case 
0emitSound(ideItem[iSound])
        case 
1speakSound(ideItem[iSound])
    }
    
    switch(
g_eSettings[stgLimitType])
    {
        case 
0g_iLimit[id][iItem]++
        case 
1g_iItemTeamLimit[get_user_team(id)][iItem]++
        case 
2g_iItemLimit[iItem]++
    }
    
    
g_blHasItem[id][iItem] = true
    
    
if(eItem[iDuration])
    {
        new 
iArray[2]
        
iArray[0] = id
        iArray
[1] = iItem
        set_task
(eItem[iDuration], "autoRemoveItem"0iArray2)
    }
    
    return 
PLUGIN_HANDLED
}

public 
autoRemoveItem(iArray[2])
{
    new 
id iArray[0], iItem iArray[1], eItem[Items]
    
ArrayGetArray(g_aItemsiItemeItem)
    
removeItem(idiItem)
    
    if(
is_user_alive(id))
    {
        
ColorChat(id"%L"id"CSHOP_ITEM_EXPIRED"eItem[iDuration], eItem[iName])
        
        switch(
g_eSettings[stgExpireSoundType])
        {
            case 
0:    emitSound(idg_eSettings[stgSoundExpire])
            case 
1:    speakSound(idg_eSettings[stgSoundExpire])
        }
    }
}

get_user_limit(idiItem)
{
    switch(
g_eSettings[stgLimitType])
    {
        case 
0: return g_iLimit[id][iItem]
        case 
1: return g_iItemTeamLimit[get_user_team(id)][iItem]
        case 
2: return g_iItemLimit[iItem]
    }
    
    return 
0
}

removeItem(idiItem)
{
    new 
iReturn
    g_blHasItem
[id][iItem] = false
    ExecuteForward
(g_fwdRemoveItemiReturnidiItem)
}
    
speakSound(idszSound[])
    
client_cmd(id"spk %s"szSound)
    
emitSound(idszSound[])
    
emit_sound(idCHAN_ITEMszSound1.0ATTN_NORM0PITCH_NORM)
    
errorSound(id)
    
speakSound(idg_eSettings[stgSoundError])
    
bool:has_access_flag(id)
    return (
equal(g_eSettings[stgFlag], "!") || get_user_flags(id) & read_flags(g_eSettings[stgFlag])) ? true false
    
bool
:has_access_team(id)
    return (!
g_eSettings[stgTeam] || get_user_team(id) == g_eSettings[stgTeam]) ? true false
    
bool
:is_blank(szString[])
    return 
szString[0] == EOS true false
    
public plugin_natives()
{
    
register_library("CustomShop")
    
register_native("cshopRegisterItem""_cshopRegisterItem")
    
register_native("cshopHasItem""_cshopHasItem")
    
register_native("cshopPointsEnabled""_cshopPointsEnabled")
    
register_native("cshopGetLimit""_cshopGetLimit")
    
register_native("cshopRemoveItem""_cshopRemoveItem")
    
register_native("cshopErrorSound""_cshopErrorSound")
    
register_native("cshopTotalItems""_cshopTotalItems")
    
register_native("cshopGivePoints""_cshopGivePoints")
    
register_native("ColorChat""_ColorChat")
}

public 
_cshopRegisterItem(iPluginiParams)
{
    new 
szSound[128], eItem[Items], bool:blPrecache true
    get_string
(1eItem[iId], charsmax(eItem[iId]))
    
get_string(2eItem[iName], charsmax(eItem[iName]))
    
    if(
g_eSettings[stgPointsEnable])
    {
        new 
iPoints get_param(7)
        
eItem[iPrice] = iPoints iPoints mtop(get_param(3))
    }
    else 
eItem[iPrice] = get_param(3)
    
    
eItem[iLimit] = get_param(4)
    
get_string(5eItem[iSound], charsmax(eItem[iSound]))
    
eItem[iDuration] = get_param(6)
    
eItem[iTeam] = get_param(8)
    
get_string(9eItem[iFlag], charsmax(eItem[iFlag]))
    
ArrayPushArray(g_aItemseItem)
    
g_iTotalItems++
    
    for(new 
iArraySize(g_aSounds); i++)
    {
        
ArrayGetString(g_aSoundsiszSoundcharsmax(szSound))
        
        if(
equal(szSoundeItem[iSound]))
        {
            
blPrecache false
            
break
        }
    }
    
    if(
blPrecache)
    {
        
precache_sound(eItem[iSound])
        
ArrayPushString(g_aSoundseItem[iSound])
    }
    
    new 
id g_iTotalItems 1
    TrieSetCell
(g_tItemIdseItem[iId], id)
    return 
id
}

public 
bool:_cshopHasItem(iPluginiParams)
    return 
g_blHasItem[get_param(1)][get_param(2)] ? true false
    
public bool:_cshopPointsEnabled(iPluginiParams)
    return 
g_eSettings[stgPointsEnable] ? true false
    
public _cshopGetLimit(iPluginiParams)
    return 
get_user_limit(get_param(1), get_param(2))
    
public 
_cshopRemoveItem(iPluginiParams)
    
removeItem(get_param(1), get_param(2))

public 
_cshopErrorSound(iPluginiParams)
    
speakSound(get_param(1), g_eSettings[stgSoundError])
    
public 
_cshopTotalItems(iPluginiParams)
    return 
g_iTotalItems
    
public _cshopGivePoints(iPluginiParams)
    
g_iPoints[get_param(1)] += get_param(2)
    
public 
_ColorChat(iPluginiParams)
{
    new 
szMessage[191]
    
vdformat(szMessagecharsmax(szMessage), 23)
    
ColorChat(get_param(1), szMessage)
}
    
ColorChat(const id, const szInput[], any:...)
{
    new 
iPlayers[32], iCount 1
    
static szMessage[191]
    
vformat(szMessagecharsmax(szMessage), szInput3)
    
format(szMessage[0], charsmax(szMessage), "%s %s"g_eSettings[stgPrefix], szMessage)
    
    for(new 
isizeof(g_szColorReplace); += 2)
        
replace_all(szMessagecharsmax(szMessage), g_szColorReplace[i], g_szColorReplace[1])
        
    for(new 
isizeof(g_szHideChat); i++)
        
replace_all(szMessagecharsmax(szMessage), g_szHideChat[i], "")
    
    if(
id)
        
iPlayers[0] = id
    
else
        
get_players(iPlayersiCount"ch")
    
    for(new 
iiCounti++)
    {
        if(
is_user_connected(iPlayers[i]))
        {
            
message_begin(MSG_ONE_UNRELIABLEg_msgSayText_iPlayers[i])
            
write_byte(iPlayers[i])
            
write_string(szMessage)
            
message_end()
        }
    }

... I added some logs in it, so whenever a player connects/disconnects, it will be logged in logs/CustomShop.log + it will show whether the points have been saved. If it still doesn't save them, upload the log file here.
__________________
OciXCrom is offline
Send a message via Skype™ to OciXCrom
vAx
Junior Member
Join Date: Oct 2011
Location: Hungary
Old 12-10-2016 , 22:31   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #68

Hungarian translation:

Quote:
[hu]
CSHOP_NOTALLOWED_FLAG = !gNincs hozzaferesed !na !gBolt !nhasznalatahoz!
CSHOP_NOTALLOWED_TEAM = A !tcsapatodnak !gnincs hozzaferese !na !gBolt !nhasznalatahoz!
CSHOP_NOTALLOWED_DEAD = !tHalottak !gNEM hasznalhatjak !na !gBolt!not!
CSHOP_NOITEMS = A !gBolt !njelenleg !gNEM tartalmaz !ncuccot!
CSHOP_NOT_TEAM = Ez a cucc !gNEM elerheto !na !tcsapatod !nszamara!
CSHOP_NOT_FLAG = !gNincs hozzaferesed !nahhoz, hogy megvedd ezt a cuccot!
CSHOP_NOT_MONEY = !gNincs !neleg !g%s!nod ahhoz, hogy megvedd ezt a cuccot (!t%i!n/!g%i%s!n)
CSHOP_NOT_LIMIT = Elerted a !gmaximum !tvasarlasi limitet !nennel a !gcucc!nnal (!t%i!n/!g%i!n)
CSHOP_NOT_DELAY = Ezt a cuccot csak !g%.1f masodpercenkent !nveheted meg.
CSHOP_ITEM_BOUGHT = Megvetted ezt: !g%s !n(ennyi !g%i%s!nert)
CSHOP_ITEM_EXPIRED = A kovetkezo item hasznalata lejart !g%.1f masodperc!nutan: !t%s!n.
CSHOP_KILL = Kaptal !g%i %s!not azert, mert megolted !t%s !njatekost.
CSHOP_POINTS = !g%i %sod van.
CSHOP_POINTS_DISABLED = A !gpontozas !njelenleg !gkikapcsolva!n.
CSHOP_CMD_GIVE = ADMIN (!t%s!n) adott !g%i %sot !nneki: !t%s
CSHOP_CMD_TAKE = ADMIN (!t%s!n) elvett !g%i %sot!ntole: !t%s
CSHOP_ITEMS_LOADED = ----- Bolt: %i cucc betoltve -----
CSHOP_NAME = Nev
CSHOP_PRICE = Ar
CSHOP_LIMIT = Maximum
CSHOP_SOUND = Hang
CSHOP_DURATION = Idotartam
CSHOP_TEAM = Csapat
CSHOP_FLAG = Jelzes
CSHOP_PAGE = Oldal
CSHOP_ENABLED = bekapcsolva
CSHOP_DISABLED = kikapcsolva
CSHOP_EDITOR_TITLE = \yOciXCrom \rBolt \ySzerkesztoje\d
CSHOP_EDITOR_CURRENT = \yJelenlegi cucc: \r%s
CSHOP_EDITOR_STATUS = Allapot
CSHOP_EDITOR_SOUND = A !ghang !ncsak a !t.ini !nfajlban !gmodosithato!n.
CSHOP_EDITOR_SET = A(z) !g%s !nerteke megvaltozott ennyire: !t%s!n.
CSHOP_EDITOR_TOGGLE = !g%s !natallitotta a(z) !g%s allapotat
CSHOP_EDITOR_SAVE = Beallitasok mentese
CSHOP_EDITOR_SAVED = Valtozasok mentve.
CSHOP_EDITOR_CANTSAVE = Nincs menteni valo valtozas.
vAx is offline
Send a message via MSN to vAx
ish12321
Veteran Member
Join Date: May 2016
Old 12-14-2016 , 06:38   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #69

Hello isn't registering cVars then using exec the cfg file not better than the complete readSettings ?

Also can there be added few small things like : cs_get_user_points(id) & cs_set_user_points(id) ?
__________________
['O|s|G'] | Death Wins a.k.a Ish Chhabra was here

Last edited by ish12321; 12-14-2016 at 06:40.
ish12321 is offline
Craxor
Veteran Member
Join Date: Jan 2016
Location: Romania
Old 12-14-2016 , 08:10   Re: OciXCrom's Custom Shop 3.4 + API
Reply With Quote #70

Oxi , it is the same, put you can avoid calling str_to_num() so do it
__________________
Project: Among Us
Craxor is offline
Send a message via ICQ to Craxor
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 14:29.


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