Raised This Month: $ Target: $400
 0% 

Solved Data storage


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 07-25-2018 , 19:08   Re: Data storage
Reply With Quote #1

Quote:
Originally Posted by KliPPy View Post
Sure, this will set you up easily for what you need to do, only a small change was needed. Can change max items with a cvar or other means now as well. This makes it easy to create new item types with an API even.
PHP Code:
#include <amxmodx>
#include <fakemeta>
#include <engine>

#pragma semicolon true

new const PLUGIN[]  = "Entity Item PUBG Stuff idk idc";
new const 
AUTHOR[]  = "K";
new const 
VERSION[] = "Two";

new const 
ITEM_CLASSNAME[] = "info_pubg_item";
const 
MAX_ITEMS_CARRIED 3;

enum {
    
ItemType_Poulet,
    
ItemType_Snack,
    
    
ItemType_ItemCount
};

// You can use this to match with names from .ini as well
new const itemNames[ItemType_ItemCount][] = {
    
"item_poulet",
    
"item_snack"
};

new const 
itemModels[ItemType_ItemCount][] = {
    
"models/w_medkit.mdl",
    
"models/can.mdl"
};

new 
playerItems[MAX_PLAYERS 1][ItemType_ItemCount];


public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR);
    
    
register_clcmd("say /spawnitems""@ClCmd_SpawnItems");
    
register_clcmd("say /removeitems""@ClCmd_RemoveItems");
    
register_clcmd("say /clearbackpack""@ClCmd_ClearBackPack");
    
register_clcmd("say /backpack""@ClCmd_BackPack");
    
    
register_touch("player"ITEM_CLASSNAME"@ItemTouched");
}

public 
plugin_precache() {
    for(new 
0ItemType_ItemCounti++) {
        
precache_model(itemModels[i]);
    }
}

public 
client_putinserver(id) {
    
ClearBackPack(id);
}

@
ItemTouched(playerIditemId) {
    new const 
itemType pev(itemIdpev_iuser1);
    if(
AddItemToPlayer(playerIditemType)) {
        
set_pev(itemIdpev_flagspev(itemIdpev_flags) | FL_KILLME);
        
client_print_color(playerIdplayerId"^4%s ^1was added to your inventory."itemNames[itemType]);
    }
    
    return 
PLUGIN_CONTINUE;
}

@
ClCmd_SpawnItems(id) {
    for(new 
03i++) {
        
SpawnItemAroundPlayer(idrandom(ItemType_ItemCount));
    }
}

@
ClCmd_RemoveItems(id) {
    new 
entityId MaxClients;
    while((
entityId engfunc(EngFunc_FindEntityByStringentityId"classname"ITEM_CLASSNAME)) > 0) {
        
set_pev(entityIdpev_flagspev(entityIdpev_flags) | FL_KILLME);
    }
}

@
ClCmd_BackPack(id) {
    
client_print_color(idid"^4Your backpack:");
    for(new 
0sizeof playerItems[]; i++) {
        new const 
itemCount playerItems[id][i];
        if(
itemCount == 0) continue;
        
        
client_print_color(idid"^4%s^1: ^4%d"itemNames[i], itemCount);
    }
}

@
ClCmd_ClearBackPack(id) {
    
ClearBackPack(id);
    
client_print_color(idid"^4Backpack cleared.");
}

AddItemToPlayer(iditemType) {
    if(
playerItems[id][itemType] >= MAX_ITEMS_CARRIED) return false;
    
    
playerItems[id][itemType]++;
    return 
true;
}

ClearBackPack(id) {
    for(new 
0sizeof playerItems[]; i++) {
        
playerItems[id][i] = 0;
    }
}

GetRandomizedOrigin(idFloat:origin[3]) {
    
pev(idpev_originorigin);
    
origin[0] += random_float(-256.0256.0);
    
origin[1] += random_float(-256.0256.0);
}

SpawnItemAroundPlayer(iditemType) {
    new 
Float:fOrigin[3];
    
GetRandomizedOrigin(idfOrigin);
    
    new 
iEntity engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"));
    
    
set_pev(iEntitypev_classnameITEM_CLASSNAME);
    
engfunc(EngFunc_SetModeliEntityitemModels[itemType]);
    
dllfunc(DLLFunc_SpawniEntity);
    
engfunc(EngFunc_SetSizeiEntityFloat:{ -3.0, -3.0, -3.0 }, Float:{ 3.03.03.0 });
    
    
engfunc(EngFunc_SetOriginiEntityfOrigin);
    
    
set_pev(iEntitypev_solidSOLID_TRIGGER);
    
set_pev(iEntitypev_movetypeMOVETYPE_NONE);
    
    
engfunc(EngFunc_DropToFlooriEntity);
    
    
// Crucial to all this
    
set_pev(iEntitypev_iuser1itemType);
    
    return 
iEntity;

edit: I removed the FL_KILLME check, the engine does that already.
Thanks a lot! I'll try to expand your code tomorrow.
__________________
edon1337 is offline
klippy
AlliedModders Donor
Join Date: May 2013
Location: Serbia
Old 07-25-2018 , 19:12   Re: Data storage
Reply With Quote #2

Keep your data normalized (flat), it's much easier to work with it. When you think you have to nest data so deep, take a step back and re-think it. Here's a great read on that, though it's JavaScript: https://redux.js.org/recipes/structu...ng-state-shape
__________________
klippy is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 07-26-2018 , 06:37   Re: Data storage
Reply With Quote #3

Quote:
Originally Posted by KliPPy View Post
Keep your data normalized (flat), it's much easier to work with it. When you think you have to nest data so deep, take a step back and re-think it. Here's a great read on that, though it's JavaScript: https://redux.js.org/recipes/structu...ng-state-shape
Very informational read! I'll go back to read it each time I'll have no clue how to flatten my data. Thanks.
__________________
edon1337 is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 07-26-2018 , 08:27   Re: Data storage
Reply With Quote #4

@KliPPY

How do I get the entity index of the entity I'm going to use so I can pass it in menu handler?
Code:
@BackPack( id ) {     new iMenu = menu_create( "Your Inventory:", "@BackPack_Handler" );         for( new i; i < sizeof g_iPlayerItems[ ]; i++ )     {         new iItemCount = g_iPlayerItems[ id ][ i ];         if( iItemCount == 0 ) continue;                 menu_additem( iMenu, g_szItemNames[ i ] );     }         menu_display( id, iMenu, 0 ); } @BackPack_Handler( id, iMenu, iItem ) {     menu_destroy( iMenu );             new iItemType = pev( ENTITY_INDEX, pev_iuser1 ); // here we need the entity index         new iPlayerHealth = pev( id, pev_health );         if( iItemType == ItemType_Poulet )     {         if( iPlayerHealth >= 100.0 )         {             client_print( id, print_chat, "You can't eat a Poulet when your HP is above 100" );             return PLUGIN_HANDLED;         }                 else         {             set_pev( id, pev_health, 100.0 );                         g_iPlayerItems[ id ][ ItemType_Poulet ]--         }     }         else if( iItemType == ItemType_Snack )     {         if( iPlayerHealth >= 75.0 )         {             client_print( id, print_chat, "You can't eat a Snack when your HP is above 75" );             return PLUGIN_HANDLED;         }                 else         {             set_pev( id, pev_health, iPlayerHealth + 25.0 );                         g_iPlayerItems[ id ][ ItemType_Snack ]--         }     }         return PLUGIN_CONTINUE; }

Full code:
PHP Code:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < engine >
#include < rog >

#define MAX_PLAYERS 32
#define MAX_ORIGINS 100

new const g_szItemClass[ ] = "item_heal";

const 
MAX_ITEMS_CARRIED 3;

enum
{
    
ItemType_Poulet,
    
ItemType_Snack,
    
    
ItemType_ItemCount
};

new const 
g_szTypes[ ][ ] =
{
    
"ItemType_Poulet",
    
"ItemType_Snack"
}

new const 
g_iTypes[ ] =
{
    
ItemType_Poulet,
    
ItemType_Snack
}

enum _:OriginDimensions
{
    
Float:ORIGIN]
}

new const 
g_szItemNamesItemType_ItemCount ][ ] =
{
    
"item_poulet",
    
"item_snack"
};

new const 
g_szItemModelsItemType_ItemCount ][ ] =
{
    
"models/w_medkit.mdl",
    
"models/can.mdl"
};

new 
g_iPlayerItemsMAX_PLAYERS ][ ItemType_ItemCount ];

new const 
g_szCustomEntitiesFile[ ] = "GameEntities.ini";

new 
g_iMaxPlayers;

new Array:
g_aOrigins;
new 
Trie:g_tType;

public 
plugin_init( )
{
    
register_plugin"CS Battle Royale BackPack""1.0""DoNii" );
    
    
InitializeOriginGenerator( );
    
DumpOriginData( );
    
    
register_clcmd"say /backpack""@BackPack");
    
    
register_touch"player"g_szItemClass"@Touch" );
    
    
RegisterHamHam_Spawn"player""@HamSpawn_Post");
    
    
g_iMaxPlayers get_maxplayers( );
}

public 
plugin_precache( )
{
    
g_aOrigins ArrayCreateOriginDimensions );
    
g_tType TrieCreate( );
    
    static 
i;
    for( 
i=0sizeof g_szTypesi++ )
    {
        
TrieSetCellg_tTypeg_szTypes], g_iTypes] );
    }
    
    for( 
i=0ItemType_ItemCounti++ )
    {
        
precache_modelg_szItemModels] );
    }
}

public 
client_disconnectid )
{
    
ClearBackPackid );
}

public @
HamSpawn_Postid )
{
    
ClearBackPackid );
}

public 
RoundStarted( )
{
    
ArrayClearg_aOrigins );
    
InitializeOriginGenerator( );

    
RetrieveOrigins( );
    
ReadCustomEntities( );
}

@
TouchidiItem )
{
    if( 
peviItempev_effects ) & EF_NODRAW )
    return 
PLUGIN_HANDLED;

    new 
iItemType peviItempev_iuser1 );
    
    if( 
AddItemToPlayeridiItemType ) )
    {
        
set_peviItempev_effectspeviItempev_effects ) | EF_NODRAW );
        
set_peviItempev_solidSOLID_NOT );
        
        
client_printidprint_chat"%s was added to your inventory."g_szItemNamesiItemType ] );
    }
    
    return 
PLUGIN_CONTINUE;
}

@
RemoveItemsid )
{
    new 
iEntId g_iMaxPlayers;
    while( ( 
iEntId engfuncEngFunc_FindEntityByStringiEntId"classname"g_szItemClass ) ) > 0)
    {
        
set_peviEntIdpev_flagspeviEntIdpev_flags ) | FL_KILLME );
    }
}

@
BackPackid )
{
    new 
iMenu menu_create"Your Inventory:""@BackPack_Handler" );
    
    for( new 
isizeof g_iPlayerItems[ ]; i++ )
    {
        new 
iItemCount g_iPlayerItemsid ][ ];
        if( 
iItemCount == ) continue;
        
        
menu_additemiMenug_szItemNames] );
    }
    
    
menu_displayidiMenu);
}

@
BackPack_HandleridiMenuiItem )
{
    
menu_destroyiMenu );
        
    new 
iItemType pevENTITY_INDEXpev_iuser1 ); // here we need the entity index
    
    
new iPlayerHealth pevidpev_health );
    
    if( 
iItemType == ItemType_Poulet )
    {
        if( 
iPlayerHealth >= 100.0 )
        {
            
client_printidprint_chat"You can't eat a Poulet when your HP is above 100" );
            return 
PLUGIN_HANDLED;
        }
        
        else
        {
            
set_pevidpev_health100.0 );
            
            
g_iPlayerItemsid ][ ItemType_Poulet ]--
        }
    }
    
    else if( 
iItemType == ItemType_Snack )
    {
        if( 
iPlayerHealth >= 75.0 )
        {
            
client_printidprint_chat"You can't eat a Snack when your HP is above 75" );
            return 
PLUGIN_HANDLED;
        }
        
        else
        {
            
set_pevidpev_healthiPlayerHealth 25.0 );
            
            
g_iPlayerItemsid ][ ItemType_Snack ]--
        }
    }
    
    return 
PLUGIN_CONTINUE;
}

AddItemToPlayeridiItemType )
{
    if( 
g_iPlayerItemsid ][ iItemType ] >= MAX_ITEMS_CARRIED ) return false;
    
    
g_iPlayerItemsid ][ iItemType ]++;
    return 
true;
}

ClearBackPackid )
{
    for( new 
isizeof g_iPlayerItems[ ]; i++ )
    {
        
g_iPlayerItemsid ][ ] = 0;
    }
}

RetrieveOrigins( )
{
    new 
Float:fOrigin];
    
    for( new 
i=1<= MAX_ORIGINSi++ )
    {
        
GetRandomOriginfOrigin );
        
SaveOriginfOrigin );
    }
}

SaveOriginFloat:fOrigin] )
{
    new 
eDataOriginDimensions ];

    
eDataORIGIN ][ ] = _:fOrigin];
    
eDataORIGIN ][ ] = _:fOrigin];
    
eDataORIGIN ][ ] = _:fOrigin];
    
    
ArrayPushArrayg_aOriginseData );
}

GetRandomizedOriginFloat:fOrigin] )
{
    new 
eDataOriginDimensions ];

    new 
iArraySize ArraySizeg_aOrigins );
    
    new 
iRandomEntry random_num0iArraySize );
    
    if( 
iArraySize )
    
iArraySize 0;
    
    
ArrayGetArrayg_aOriginsiRandomEntryeData );

    
fOrigin] = eDataORIGIN ][ ];
    
fOrigin] = eDataORIGIN ][ ];
    
fOrigin] = eDataORIGIN ][ ];
    
    
ArrayDeleteItemg_aOriginsiRandomEntry );
}

ReadCustomEntities( )
{
    new 
szConfigsName256 ], szFilename512 ];
    
get_configsdirszConfigsNamecharsmaxszConfigsName ) );
    
    
formatexszFilenamecharsmaxszFilename ), "%s/%s"szConfigsNameg_szCustomEntitiesFile );
    
    new 
iFile fopenszFilename"r" );
    
    if( 
iFile )
    {
        new 
szData128 ];
        
        while( ! 
feofiFile ) )
        {
            
fgetsiFileszDatacharsmaxszData ) );
            
trimszData );
            
            switch( 
szData] )
            {
            case 
EOS'#'';'
                continue;
                
            default:
                {
                    new 
szEntityType32 ]
                    
                    if( 
parseszDataszEntityTypecharsmaxszEntityType ) ) != )
                    continue;
                    
                    new 
iType;
                    if( 
TrieGetCellg_tTypeszEntityTypeiType ) )
                    {
                        
CreateCustomEntityiType );
                    }
                }
            }
        }
    }
    
fcloseiFile );
}

CreateCustomEntity( const iType )
{
    new 
Float:fOrigin];
    
GetRandomizedOriginfOrigin );

    new 
iEntity engfuncEngFunc_CreateNamedEntityengfuncEngFunc_AllocString"info_target" ) );
    
    
set_peviEntitypev_classnameg_szItemClass );
    
engfuncEngFunc_SetModeliEntityg_szItemModelsiType ] );
    
dllfuncDLLFunc_SpawniEntity );
    
engfuncEngFunc_SetSizeiEntityFloat:{ -3.0, -3.0, -3.0 }, Float:{ 3.03.03.0 } );
    
    
engfuncEngFunc_SetOriginiEntityfOrigin );
    
    
set_peviEntitypev_solidSOLID_BBOX );
    
set_peviEntitypev_movetypeMOVETYPE_NONE );
    
    
engfuncEngFunc_DropToFlooriEntity );
    
    
set_peviEntitypev_iuser1iType );
}

get_configsdirszName[ ], iLen )
{
    return 
get_localinfo"amxx_configsdir"szNameiLen );

__________________

Last edited by edon1337; 07-26-2018 at 08:27.
edon1337 is offline
klippy
AlliedModders Donor
Join Date: May 2013
Location: Serbia
Old 07-26-2018 , 09:14   Re: Data storage
Reply With Quote #5

You don't need it, you can freely remove the entity like in my code instead of hiding it. In your loop in @BackPack, i is the item type actually. It's iterating over item types. Pass it as menu item info I guess.
Also there's no need for that get_configsdir function, don't do that, include amxmisc.
__________________

Last edited by klippy; 07-26-2018 at 09:40.
klippy is offline
edon1337
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
Old 07-26-2018 , 10:23   Re: Data storage
Reply With Quote #6

Quote:
Originally Posted by KliPPy View Post
You don't need it, you can freely remove the entity like in my code instead of hiding it. In your loop in @BackPack, i is the item type actually. It's iterating over item types. Pass it as menu item info I guess.
Also there's no need for that get_configsdir function, don't do that, include amxmisc.
This time I picked up 3 item_snacks and 1 item_poulet, opened backpack and found 1 item_poulet and item_snack, also whatever I used it gave me 100 HP (max). Also I can pick up unlimited entities of each type

I'll do some debugging to see what's going on
PHP Code:
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < engine >
#include < rog >

#define MAX_PLAYERS 32
#define MAX_ORIGINS 100

new const g_szItemClass[ ] = "item_heal";

const 
MAX_ITEMS_CARRIED 3;

enum
{
    
ItemType_Poulet,
    
ItemType_Snack,
    
    
ItemType_ItemCount
};

new const 
g_szTypes[ ][ ] =
{
    
"ItemType_Poulet",
    
"ItemType_Snack"
}

new const 
g_iTypes[ ] =
{
    
ItemType_Poulet,
    
ItemType_Snack
}

enum _:OriginDimensions
{
Float:ORIGIN]
}

new const 
g_szItemNamesItemType_ItemCount ][ ] =
{
    
"item_poulet",
    
"item_snack"
};

new const 
g_szItemModelsItemType_ItemCount ][ ] =
{
    
"models/w_medkit.mdl",
    
"models/can.mdl"
};

new 
g_iPlayerItemsMAX_PLAYERS ][ ItemType_ItemCount ];

new const 
g_szCustomEntitiesFile[ ] = "GameEntities.ini";

new 
g_iMaxPlayers;

new Array:
g_aOrigins;
new 
Trie:g_tType;

public 
plugin_init( )
{
    
register_plugin"CS Battle Royale BackPack""1.0""DoNii" );
    
    
InitializeOriginGenerator( );
    
DumpOriginData( );
    
    
register_clcmd"say /backpack""@BackPack");
    
    
register_touch"player"g_szItemClass"@Touch" );
    
    
RegisterHamHam_Spawn"player""@HamSpawn_Post");
    
    
g_iMaxPlayers get_maxplayers( );
}

public 
plugin_precache( )
{
    
g_aOrigins ArrayCreateOriginDimensions );
    
g_tType TrieCreate( );
    
    static 
i;
    for( 
i=0sizeof g_szTypesi++ )
    {
        
TrieSetCellg_tTypeg_szTypes], g_iTypes] );
    }
    
    for( 
i=0ItemType_ItemCounti++ )
    {
        
precache_modelg_szItemModels] );
    }
}

public 
client_disconnectid )
{
    
ClearBackPackid );
}

public @
HamSpawn_Postid )
{
    
ClearBackPackid );
}

public 
RoundStarted( )
{
    
ArrayClearg_aOrigins );
    
InitializeOriginGenerator( );

    
RetrieveOrigins( );
    
ReadCustomEntities( );
}

@
TouchidiItem )
{
    new 
iItemType peviItempev_iuser1 );
    
    if( 
AddItemToPlayeridiItemType ) )
    {
        
set_peviItempev_flagspeviItempev_flags) | FL_KILLME ); 
        
        
client_printidprint_chat"%s was added to your inventory."g_szItemNamesiItemType ] );
    }
    
    return 
PLUGIN_CONTINUE;
}

@
RemoveItemsid )
{
    new 
iEntId g_iMaxPlayers;
    while( ( 
iEntId engfuncEngFunc_FindEntityByStringiEntId"classname"g_szItemClass ) ) > 0)
    {
        
set_peviEntIdpev_flagspeviEntIdpev_flags ) | FL_KILLME );
    }
}

@
BackPackid )
{
    new 
iMenu menu_create"Your Inventory:""@BackPack_Handler" );
    
    new 
szItemId];
    for( new 
isizeof g_iPlayerItems[ ]; i++ )
    {
        new 
iItemCount g_iPlayerItemsid ][ ];
        if( 
iItemCount == ) continue;
        
        
num_to_striszItemIdcharsmaxszItemId ) );
        
menu_additemiMenug_szItemNames], szItemId );
    }
    
    
menu_displayidiMenu);
}

@
BackPack_HandleridiMenuiItem )
{
    new 
iAccessszItemId], iCallback;
    
menu_item_getinfoiMenuiItemiAccessszItemIdcharsmaxszItemId ), __iCallback );
    
menu_destroyiMenu );
    
    new 
iItemId str_to_numszItemId );
    new 
iItemType peviItemIdpev_iuser1 );
    
    new 
iPlayerHealth pevidpev_health );
    
    if( 
iItemType == ItemType_Poulet )
    {
        if( 
iPlayerHealth >= 100.0 )
        {
            
client_printidprint_chat"You can't eat a Poulet when your HP is above 100" );
            return 
PLUGIN_HANDLED;
        }
        
        else
        {
            
set_pevidpev_health100.0 );
            
            
g_iPlayerItemsid ][ ItemType_Poulet ]--
        }
    }
    
    else if( 
iItemType == ItemType_Snack )
    {
        if( 
iPlayerHealth >= 75.0 )
        {
            
client_printidprint_chat"You can't eat a Snack when your HP is above 75" );
            return 
PLUGIN_HANDLED;
        }
        
        else
        {
            
set_pevidpev_healthiPlayerHealth 25.0 );
            
            
g_iPlayerItemsid ][ ItemType_Snack ]--
        }
    }
    
    return 
PLUGIN_CONTINUE;
}

AddItemToPlayeridiItemType )
{
    if( 
g_iPlayerItemsid ][ iItemType ] >= MAX_ITEMS_CARRIED ) return false;
    
    
g_iPlayerItemsid ][ iItemType ]++;
    return 
true;
}

ClearBackPackid )
{
    for( new 
isizeof g_iPlayerItems[ ]; i++ )
    {
        
g_iPlayerItemsid ][ ] = 0;
    }
}

RetrieveOrigins( )
{
    new 
Float:fOrigin];
    
    for( new 
i=1<= MAX_ORIGINSi++ )
    {
        
GetRandomOriginfOrigin );
        
SaveOriginfOrigin );
    }
}

SaveOriginFloat:fOrigin] )
{
    new 
eDataOriginDimensions ];

    
eDataORIGIN ][ ] = _:fOrigin];
    
eDataORIGIN ][ ] = _:fOrigin];
    
eDataORIGIN ][ ] = _:fOrigin];
    
    
ArrayPushArrayg_aOriginseData );
}

GetRandomizedOriginFloat:fOrigin] )
{
    new 
eDataOriginDimensions ];

    new 
iArraySize ArraySizeg_aOrigins );
    
    new 
iRandomEntry random_num0iArraySize );
    
    if( 
iArraySize )
    
iArraySize 0;
    
    
ArrayGetArrayg_aOriginsiRandomEntryeData );

    
fOrigin] = eDataORIGIN ][ ];
    
fOrigin] = eDataORIGIN ][ ];
    
fOrigin] = eDataORIGIN ][ ];
    
    
ArrayDeleteItemg_aOriginsiRandomEntry );
}

ReadCustomEntities( )
{
    new 
szConfigsName256 ], szFilename512 ];
    
get_configsdirszConfigsNamecharsmaxszConfigsName ) );
    
    
formatexszFilenamecharsmaxszFilename ), "%s/%s"szConfigsNameg_szCustomEntitiesFile );
    
    new 
iFile fopenszFilename"r" );
    
    if( 
iFile )
    {
        new 
szData128 ];
        
        while( ! 
feofiFile ) )
        {
            
fgetsiFileszDatacharsmaxszData ) );
            
trimszData );
            
            switch( 
szData] )
            {
            case 
EOS'#'';'
                continue;
                
            default:
                {
                    new 
szEntityType32 ]
                    
                    if( 
parseszDataszEntityTypecharsmaxszEntityType ) ) != )
                    continue;
                    
                    new 
iType;
                    if( 
TrieGetCellg_tTypeszEntityTypeiType ) )
                    {
                        
CreateCustomEntityiType );
                    }
                }
            }
        }
    }
    
fcloseiFile );
}

CreateCustomEntity( const iType )
{
    new 
Float:fOrigin];
    
GetRandomizedOriginfOrigin );

    new 
iEntity engfuncEngFunc_CreateNamedEntityengfuncEngFunc_AllocString"info_target" ) );
    
    
set_peviEntitypev_classnameg_szItemClass );
    
engfuncEngFunc_SetModeliEntityg_szItemModelsiType ] );
    
dllfuncDLLFunc_SpawniEntity );
    
engfuncEngFunc_SetSizeiEntityFloat:{ -3.0, -3.0, -3.0 }, Float:{ 3.03.03.0 } );
    
    
engfuncEngFunc_SetOriginiEntityfOrigin );
    
    
set_peviEntitypev_solidSOLID_BBOX );
    
set_peviEntitypev_movetypeMOVETYPE_NONE );
    
    
engfuncEngFunc_DropToFlooriEntity );
    
    
set_peviEntitypev_iuser1iType );
}

get_configsdirszName[ ], iLen )
{
    return 
get_localinfo"amxx_configsdir"szNameiLen );

EDIT:
Debugged code:

It seems like i from the loop isn't the entity id, and I think we shouldn't kill the entity but just hide it.
PHP Code:
#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < engine >
#include < rog >

#define MAX_PLAYERS 32
#define MAX_ORIGINS 100

new const g_szItemClass[ ] = "item_heal";

const 
MAX_ITEMS_CARRIED 3;

enum
{
    
ItemType_Poulet,
    
ItemType_Snack,
    
    
ItemType_ItemCount
};

new const 
g_szTypes[ ][ ] =
{
    
"ItemType_Poulet",
    
"ItemType_Snack"
}

new const 
g_iTypes[ ] =
{
    
ItemType_Poulet,
    
ItemType_Snack
}

enum _:OriginDimensions
{
Float:ORIGIN]
}

new const 
g_szItemNamesItemType_ItemCount ][ ] =
{
    
"item_poulet",
    
"item_snack"
};

new const 
g_szItemModelsItemType_ItemCount ][ ] =
{
    
"models/w_medkit.mdl",
    
"models/can.mdl"
};

new 
g_iPlayerItemsMAX_PLAYERS ][ ItemType_ItemCount ];

new const 
g_szCustomEntitiesFile[ ] = "GameEntities.ini";

new 
g_iMaxPlayers;

new Array:
g_aOrigins;
new 
Trie:g_tType;

public 
plugin_init( )
{
    
register_plugin"CS Battle Royale BackPack""1.0""DoNii" );
    
    
InitializeOriginGenerator( );
    
DumpOriginData( );
    
    
register_clcmd"say /backpack""@BackPack");
    
    
register_touch"player"g_szItemClass"@Touch" );
    
    
RegisterHamHam_Spawn"player""@HamSpawn_Post");
    
    
g_iMaxPlayers get_maxplayers( );
}

public 
plugin_precache( )
{
    
g_aOrigins ArrayCreateOriginDimensions );
    
g_tType TrieCreate( );
    
    static 
i;
    for( 
i=0sizeof g_szTypesi++ )
    {
        
TrieSetCellg_tTypeg_szTypes], g_iTypes] );
    }
    
    for( 
i=0ItemType_ItemCounti++ )
    {
        
precache_modelg_szItemModels] );
    }
}

public 
client_disconnectid )
{
    
ClearBackPackid );
}

public @
HamSpawn_Postid )
{
    
ClearBackPackid );
}

public 
RoundStarted( )
{
    
ArrayClearg_aOrigins );
    
InitializeOriginGenerator( );

    
RetrieveOrigins( );
    
ReadCustomEntities( );
}

@
TouchidiItem )
{
    new 
iItemType peviItempev_iuser1 );
    
    if( 
AddItemToPlayeridiItemType ) )
    {
        
set_peviItempev_flagspeviItempev_flags) | FL_KILLME ); 
        
        
client_printidprint_chat"%s was added to your inventory."g_szItemNamesiItemType ] );
    }
    
    return 
PLUGIN_CONTINUE;
}

@
RemoveItemsid )
{
    new 
iEntId g_iMaxPlayers;
    while( ( 
iEntId engfuncEngFunc_FindEntityByStringiEntId"classname"g_szItemClass ) ) > 0)
    {
        
set_peviEntIdpev_flagspeviEntIdpev_flags ) | FL_KILLME );
    }
}

@
BackPackid )
{
    new 
iMenu menu_create"Your Inventory:""@BackPack_Handler" );
    
    new 
szItemId];
    for( new 
isizeof g_iPlayerItems[ ]; i++ )
    {
        new 
iItemCount g_iPlayerItemsid ][ ];
        if( 
iItemCount == ) continue;
        
        
num_to_striszItemIdcharsmaxszItemId ) );
        
menu_additemiMenug_szItemNames], szItemId );
        
        
log_to_file"debugging.txt""#1 Name: %s | i: %d | iItemCount: %d"g_szItemNames], iiItemCount );
    }
    
    
menu_displayidiMenu);
}

@
BackPack_HandleridiMenuiItem )
{
    new 
iAccessszItemId], iCallback;
    
menu_item_getinfoiMenuiItemiAccessszItemIdcharsmaxszItemId ), __iCallback );
    
menu_destroyiMenu );
    
    new 
iItemId str_to_numszItemId );
    new 
iItemType peviItemIdpev_iuser1 );
    
    
log_to_file"debugging.txt""#2 iItemId: %d | iItemType: %d"iItemIdiItemType );
    
    new 
iPlayerHealth pevidpev_health );
    
    if( 
iItemType == ItemType_Poulet )
    {
        if( 
iPlayerHealth >= 100.0 )
        {
            
client_printidprint_chat"You can't eat a Poulet when your HP is above 100" );
            return 
PLUGIN_HANDLED;
        }
        
        else
        {
            
set_pevidpev_health100.0 );
            
            
g_iPlayerItemsid ][ ItemType_Poulet ]--
        }
    }
    
    else if( 
iItemType == ItemType_Snack )
    {
        if( 
iPlayerHealth >= 75.0 )
        {
            
client_printidprint_chat"You can't eat a Snack when your HP is above 75" );
            return 
PLUGIN_HANDLED;
        }
        
        else
        {
            
set_pevidpev_healthiPlayerHealth 25.0 );
            
            
g_iPlayerItemsid ][ ItemType_Snack ]--
        }
    }
    
    return 
PLUGIN_CONTINUE;
}

AddItemToPlayeridiItemType )
{
    if( 
g_iPlayerItemsid ][ iItemType ] >= MAX_ITEMS_CARRIED ) return false;
    
    
g_iPlayerItemsid ][ iItemType ]++;
    return 
true;
}

ClearBackPackid )
{
    for( new 
isizeof g_iPlayerItems[ ]; i++ )
    {
        
g_iPlayerItemsid ][ ] = 0;
    }
}

RetrieveOrigins( )
{
    new 
Float:fOrigin];
    
    for( new 
i=1<= MAX_ORIGINSi++ )
    {
        
GetRandomOriginfOrigin );
        
SaveOriginfOrigin );
    }
}

SaveOriginFloat:fOrigin] )
{
    new 
eDataOriginDimensions ];

    
eDataORIGIN ][ ] = _:fOrigin];
    
eDataORIGIN ][ ] = _:fOrigin];
    
eDataORIGIN ][ ] = _:fOrigin];
    
    
ArrayPushArrayg_aOriginseData );
}

GetRandomizedOriginFloat:fOrigin] )
{
    new 
eDataOriginDimensions ];

    new 
iArraySize ArraySizeg_aOrigins );
    
    new 
iRandomEntry random_num0iArraySize );
    
    if( 
iArraySize )
    
iArraySize 0;
    
    
ArrayGetArrayg_aOriginsiRandomEntryeData );

    
fOrigin] = eDataORIGIN ][ ];
    
fOrigin] = eDataORIGIN ][ ];
    
fOrigin] = eDataORIGIN ][ ];
    
    
ArrayDeleteItemg_aOriginsiRandomEntry );
}

ReadCustomEntities( )
{
    new 
szConfigsName256 ], szFilename512 ];
    
get_configsdirszConfigsNamecharsmaxszConfigsName ) );
    
    
formatexszFilenamecharsmaxszFilename ), "%s/%s"szConfigsNameg_szCustomEntitiesFile );
    
    new 
iFile fopenszFilename"r" );
    
    if( 
iFile )
    {
        new 
szData128 ];
        
        while( ! 
feofiFile ) )
        {
            
fgetsiFileszDatacharsmaxszData ) );
            
trimszData );
            
            switch( 
szData] )
            {
            case 
EOS'#'';'
                continue;
                
            default:
                {
                    new 
szEntityType32 ]
                    
                    if( 
parseszDataszEntityTypecharsmaxszEntityType ) ) != )
                    continue;
                    
                    new 
iType;
                    if( 
TrieGetCellg_tTypeszEntityTypeiType ) )
                    {
                        
CreateCustomEntityiType );
                    }
                }
            }
        }
    }
    
fcloseiFile );
}

CreateCustomEntity( const iType )
{
    new 
Float:fOrigin];
    
GetRandomizedOriginfOrigin );

    new 
iEntity engfuncEngFunc_CreateNamedEntityengfuncEngFunc_AllocString"info_target" ) );
    
    
set_peviEntitypev_classnameg_szItemClass );
    
engfuncEngFunc_SetModeliEntityg_szItemModelsiType ] );
    
dllfuncDLLFunc_SpawniEntity );
    
engfuncEngFunc_SetSizeiEntityFloat:{ -3.0, -3.0, -3.0 }, Float:{ 3.03.03.0 } );
    
    
engfuncEngFunc_SetOriginiEntityfOrigin );
    
    
set_peviEntitypev_solidSOLID_BBOX );
    
set_peviEntitypev_movetypeMOVETYPE_NONE );
    
    
engfuncEngFunc_DropToFlooriEntity );
    
    
set_peviEntitypev_iuser1iType );

Debug:
PHP Code:
L 07/26/2018 16:34:46#1 Name: item_poulet | i: 0 | iItemCount: 1
L 07/26/2018 16:34:46#1 Name: item_snack | i: 1 | iItemCount: 2
L 07/26/2018 16:35:22#2 iItemId: 0 | iItemType: 0
L 07/26/2018 16:36:03#1 Name: item_poulet | i: 0 | iItemCount: 3
L 07/26/2018 16:36:03#1 Name: item_snack | i: 1 | iItemCount: 2
L 07/26/2018 16:36:47#2 iItemId: 0 | iItemType: 0 
__________________

Last edited by edon1337; 07-26-2018 at 11:24.
edon1337 is offline
CrAzY MaN
Senior Member
Join Date: Mar 2017
Location: India
Old 07-26-2018 , 12:15   Re: Data storage
Reply With Quote #7

If this is not solved, you can remove SOLVED prefix
__________________
CrAzY MaN is offline
Natsheh
Veteran Member
Join Date: Sep 2012
Old 07-26-2018 , 12:35   Re: Data storage
Reply With Quote #8

@BackPack_Handler why this isnt a public function.


Try chaning num_to_str with szItemId[0] = i

enum Info
{
ItemType_Poulet,
ItemType_Snack,

ItemType_ItemCount
};


new g_iPlayerItems[ MAX_PLAYERS + 1 ][ Info];

iItemCount = g_iPlayerItems[ id ][ ItemType_ItemCount]
__________________
@Jailbreak Main Mod v2.7.0 100%
@User Tag Prefix 100% done !
@Mystery Box 100% done !
@VIP System 100% done !

Natsheh is offline
Send a message via MSN to Natsheh Send a message via Skype™ to Natsheh
klippy
AlliedModders Donor
Join Date: May 2013
Location: Serbia
Old 07-26-2018 , 12:38   Re: Data storage
Reply With Quote #9

I never said it's the entity id. Entities are there just to display items in the world, you don't need the entity anymore once the item it "contains" (which is just ItemType_*) is picked up. i is the item type when you are looping in @BackPack, you can name it appropriately, maybe it will help you.
__________________

Last edited by klippy; 07-26-2018 at 12:40.
klippy is offline
Old 07-26-2018, 12:52
edon1337
This message has been deleted by edon1337. Reason: oops fixed
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 12:23.


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