|
Penguin Enthusiast
Join Date: Jun 2016
Location: Macedonia
|

07-26-2018
, 10:23
Re: Data storage
|
#6
|
Quote:
Originally Posted by KliPPy
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[ 3 ] }
new const g_szItemNames[ ItemType_ItemCount ][ ] = { "item_poulet", "item_snack" };
new const g_szItemModels[ ItemType_ItemCount ][ ] = { "models/w_medkit.mdl", "models/can.mdl" };
new g_iPlayerItems[ MAX_PLAYERS + 1 ][ 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" ); RegisterHam( Ham_Spawn, "player", "@HamSpawn_Post", 1 ); g_iMaxPlayers = get_maxplayers( ); }
public plugin_precache( ) { g_aOrigins = ArrayCreate( OriginDimensions ); g_tType = TrieCreate( ); static i; for( i=0; i < sizeof g_szTypes; i++ ) { TrieSetCell( g_tType, g_szTypes[ i ], g_iTypes[ i ] ); } for( i=0; i < ItemType_ItemCount; i++ ) { precache_model( g_szItemModels[ i ] ); } }
public client_disconnect( id ) { ClearBackPack( id ); }
public @HamSpawn_Post( id ) { ClearBackPack( id ); }
public RoundStarted( ) { ArrayClear( g_aOrigins ); InitializeOriginGenerator( );
RetrieveOrigins( ); ReadCustomEntities( ); }
@Touch( id, iItem ) { new iItemType = pev( iItem, pev_iuser1 ); if( AddItemToPlayer( id, iItemType ) ) { set_pev( iItem, pev_flags, pev( iItem, pev_flags) | FL_KILLME ); client_print( id, print_chat, "%s was added to your inventory.", g_szItemNames[ iItemType ] ); } return PLUGIN_CONTINUE; }
@RemoveItems( id ) { new iEntId = g_iMaxPlayers; while( ( iEntId = engfunc( EngFunc_FindEntityByString, iEntId, "classname", g_szItemClass ) ) > 0) { set_pev( iEntId, pev_flags, pev( iEntId, pev_flags ) | FL_KILLME ); } }
@BackPack( id ) { new iMenu = menu_create( "Your Inventory:", "@BackPack_Handler" ); new szItemId[ 2 ]; for( new i; i < sizeof g_iPlayerItems[ ]; i++ ) { new iItemCount = g_iPlayerItems[ id ][ i ]; if( iItemCount == 0 ) continue; num_to_str( i, szItemId, charsmax( szItemId ) ); menu_additem( iMenu, g_szItemNames[ i ], szItemId ); } menu_display( id, iMenu, 0 ); }
@BackPack_Handler( id, iMenu, iItem ) { new iAccess, szItemId[ 2 ], iCallback; menu_item_getinfo( iMenu, iItem, iAccess, szItemId, charsmax( szItemId ), _, _, iCallback ); menu_destroy( iMenu ); new iItemId = str_to_num( szItemId ); new iItemType = pev( iItemId, pev_iuser1 ); 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; }
AddItemToPlayer( id, iItemType ) { if( g_iPlayerItems[ id ][ iItemType ] >= MAX_ITEMS_CARRIED ) return false; g_iPlayerItems[ id ][ iItemType ]++; return true; }
ClearBackPack( id ) { for( new i; i < sizeof g_iPlayerItems[ ]; i++ ) { g_iPlayerItems[ id ][ i ] = 0; } }
RetrieveOrigins( ) { new Float:fOrigin[ 3 ]; for( new i=1; i <= MAX_ORIGINS; i++ ) { GetRandomOrigin( fOrigin ); SaveOrigin( fOrigin ); } }
SaveOrigin( Float:fOrigin[ 3 ] ) { new eData[ OriginDimensions ];
eData[ ORIGIN ][ 0 ] = _:fOrigin[ 0 ]; eData[ ORIGIN ][ 1 ] = _:fOrigin[ 1 ]; eData[ ORIGIN ][ 2 ] = _:fOrigin[ 2 ]; ArrayPushArray( g_aOrigins, eData ); }
GetRandomizedOrigin( Float:fOrigin[ 3 ] ) { new eData[ OriginDimensions ];
new iArraySize = ArraySize( g_aOrigins ); new iRandomEntry = random_num( 0, iArraySize - 1 ); if( iArraySize < 0 ) iArraySize = 0; ArrayGetArray( g_aOrigins, iRandomEntry, eData );
fOrigin[ 0 ] = eData[ ORIGIN ][ 0 ]; fOrigin[ 1 ] = eData[ ORIGIN ][ 1 ]; fOrigin[ 2 ] = eData[ ORIGIN ][ 2 ]; ArrayDeleteItem( g_aOrigins, iRandomEntry ); }
ReadCustomEntities( ) { new szConfigsName[ 256 ], szFilename[ 512 ]; get_configsdir( szConfigsName, charsmax( szConfigsName ) ); formatex( szFilename, charsmax( szFilename ), "%s/%s", szConfigsName, g_szCustomEntitiesFile ); new iFile = fopen( szFilename, "r" ); if( iFile ) { new szData[ 128 ]; while( ! feof( iFile ) ) { fgets( iFile, szData, charsmax( szData ) ); trim( szData ); switch( szData[ 0 ] ) { case EOS, '#', ';': continue; default: { new szEntityType[ 32 ] if( parse( szData, szEntityType, charsmax( szEntityType ) ) != 1 ) continue; new iType; if( TrieGetCell( g_tType, szEntityType, iType ) ) { CreateCustomEntity( iType ); } } } } } fclose( iFile ); }
CreateCustomEntity( const iType ) { new Float:fOrigin[ 3 ]; GetRandomizedOrigin( fOrigin );
new iEntity = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) ); set_pev( iEntity, pev_classname, g_szItemClass ); engfunc( EngFunc_SetModel, iEntity, g_szItemModels[ iType ] ); dllfunc( DLLFunc_Spawn, iEntity ); engfunc( EngFunc_SetSize, iEntity, Float:{ -3.0, -3.0, -3.0 }, Float:{ 3.0, 3.0, 3.0 } ); engfunc( EngFunc_SetOrigin, iEntity, fOrigin ); set_pev( iEntity, pev_solid, SOLID_BBOX ); set_pev( iEntity, pev_movetype, MOVETYPE_NONE ); engfunc( EngFunc_DropToFloor, iEntity ); set_pev( iEntity, pev_iuser1, iType ); }
get_configsdir( szName[ ], iLen ) { return get_localinfo( "amxx_configsdir", szName, iLen ); }
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[ 3 ] }
new const g_szItemNames[ ItemType_ItemCount ][ ] = { "item_poulet", "item_snack" };
new const g_szItemModels[ ItemType_ItemCount ][ ] = { "models/w_medkit.mdl", "models/can.mdl" };
new g_iPlayerItems[ MAX_PLAYERS + 1 ][ 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" ); RegisterHam( Ham_Spawn, "player", "@HamSpawn_Post", 1 ); g_iMaxPlayers = get_maxplayers( ); }
public plugin_precache( ) { g_aOrigins = ArrayCreate( OriginDimensions ); g_tType = TrieCreate( ); static i; for( i=0; i < sizeof g_szTypes; i++ ) { TrieSetCell( g_tType, g_szTypes[ i ], g_iTypes[ i ] ); } for( i=0; i < ItemType_ItemCount; i++ ) { precache_model( g_szItemModels[ i ] ); } }
public client_disconnect( id ) { ClearBackPack( id ); }
public @HamSpawn_Post( id ) { ClearBackPack( id ); }
public RoundStarted( ) { ArrayClear( g_aOrigins ); InitializeOriginGenerator( );
RetrieveOrigins( ); ReadCustomEntities( ); }
@Touch( id, iItem ) { new iItemType = pev( iItem, pev_iuser1 ); if( AddItemToPlayer( id, iItemType ) ) { set_pev( iItem, pev_flags, pev( iItem, pev_flags) | FL_KILLME ); client_print( id, print_chat, "%s was added to your inventory.", g_szItemNames[ iItemType ] ); } return PLUGIN_CONTINUE; }
@RemoveItems( id ) { new iEntId = g_iMaxPlayers; while( ( iEntId = engfunc( EngFunc_FindEntityByString, iEntId, "classname", g_szItemClass ) ) > 0) { set_pev( iEntId, pev_flags, pev( iEntId, pev_flags ) | FL_KILLME ); } }
@BackPack( id ) { new iMenu = menu_create( "Your Inventory:", "@BackPack_Handler" ); new szItemId[ 2 ]; for( new i; i < sizeof g_iPlayerItems[ ]; i++ ) { new iItemCount = g_iPlayerItems[ id ][ i ]; if( iItemCount == 0 ) continue; num_to_str( i, szItemId, charsmax( szItemId ) ); menu_additem( iMenu, g_szItemNames[ i ], szItemId ); log_to_file( "debugging.txt", "#1 Name: %s | i: %d | iItemCount: %d", g_szItemNames[ i ], i, iItemCount ); } menu_display( id, iMenu, 0 ); }
@BackPack_Handler( id, iMenu, iItem ) { new iAccess, szItemId[ 2 ], iCallback; menu_item_getinfo( iMenu, iItem, iAccess, szItemId, charsmax( szItemId ), _, _, iCallback ); menu_destroy( iMenu ); new iItemId = str_to_num( szItemId ); new iItemType = pev( iItemId, pev_iuser1 ); log_to_file( "debugging.txt", "#2 iItemId: %d | iItemType: %d", iItemId, iItemType ); 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; }
AddItemToPlayer( id, iItemType ) { if( g_iPlayerItems[ id ][ iItemType ] >= MAX_ITEMS_CARRIED ) return false; g_iPlayerItems[ id ][ iItemType ]++; return true; }
ClearBackPack( id ) { for( new i; i < sizeof g_iPlayerItems[ ]; i++ ) { g_iPlayerItems[ id ][ i ] = 0; } }
RetrieveOrigins( ) { new Float:fOrigin[ 3 ]; for( new i=1; i <= MAX_ORIGINS; i++ ) { GetRandomOrigin( fOrigin ); SaveOrigin( fOrigin ); } }
SaveOrigin( Float:fOrigin[ 3 ] ) { new eData[ OriginDimensions ];
eData[ ORIGIN ][ 0 ] = _:fOrigin[ 0 ]; eData[ ORIGIN ][ 1 ] = _:fOrigin[ 1 ]; eData[ ORIGIN ][ 2 ] = _:fOrigin[ 2 ]; ArrayPushArray( g_aOrigins, eData ); }
GetRandomizedOrigin( Float:fOrigin[ 3 ] ) { new eData[ OriginDimensions ];
new iArraySize = ArraySize( g_aOrigins ); new iRandomEntry = random_num( 0, iArraySize - 1 ); if( iArraySize < 0 ) iArraySize = 0; ArrayGetArray( g_aOrigins, iRandomEntry, eData );
fOrigin[ 0 ] = eData[ ORIGIN ][ 0 ]; fOrigin[ 1 ] = eData[ ORIGIN ][ 1 ]; fOrigin[ 2 ] = eData[ ORIGIN ][ 2 ]; ArrayDeleteItem( g_aOrigins, iRandomEntry ); }
ReadCustomEntities( ) { new szConfigsName[ 256 ], szFilename[ 512 ]; get_configsdir( szConfigsName, charsmax( szConfigsName ) ); formatex( szFilename, charsmax( szFilename ), "%s/%s", szConfigsName, g_szCustomEntitiesFile ); new iFile = fopen( szFilename, "r" ); if( iFile ) { new szData[ 128 ]; while( ! feof( iFile ) ) { fgets( iFile, szData, charsmax( szData ) ); trim( szData ); switch( szData[ 0 ] ) { case EOS, '#', ';': continue; default: { new szEntityType[ 32 ] if( parse( szData, szEntityType, charsmax( szEntityType ) ) != 1 ) continue; new iType; if( TrieGetCell( g_tType, szEntityType, iType ) ) { CreateCustomEntity( iType ); } } } } } fclose( iFile ); }
CreateCustomEntity( const iType ) { new Float:fOrigin[ 3 ]; GetRandomizedOrigin( fOrigin );
new iEntity = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "info_target" ) ); set_pev( iEntity, pev_classname, g_szItemClass ); engfunc( EngFunc_SetModel, iEntity, g_szItemModels[ iType ] ); dllfunc( DLLFunc_Spawn, iEntity ); engfunc( EngFunc_SetSize, iEntity, Float:{ -3.0, -3.0, -3.0 }, Float:{ 3.0, 3.0, 3.0 } ); engfunc( EngFunc_SetOrigin, iEntity, fOrigin ); set_pev( iEntity, pev_solid, SOLID_BBOX ); set_pev( iEntity, pev_movetype, MOVETYPE_NONE ); engfunc( EngFunc_DropToFloor, iEntity ); set_pev( iEntity, pev_iuser1, iType ); }
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.
|
|