|
Member
|

12-23-2016
, 09:31
Warning and Symbol is never used!
|
#1
|
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <cstrike>
#include <fun>
#include <jailbreak_fg>
#include <colour_print>
#define m_iLastHitGroup 75
new const m_rgpPlayerItems[ 6 ] = { 367, 368, ... }
#define ADMIN_ITEM ADMIN_RCON
/*
<^> Models.
*/
enum
{
v_model,
p_model
}
new const g_szMdlCrowbar[][] =
{
"models/v_crowbar.mdl",
"models/p_crowbar.mdl"
}
/*
<^> Arrays.
*/
new Array: g_aItemsMarket, Array: g_aItemsPlayer[ 33 ], Array:g_aItemData, Array:g_aShopItems;
/*
<^> Setup structures for player item data and market item data.
*/
enum _:ItemsShop
{
_iSHOP_INDEX,
_szSHOP_NAME[ 32 ],
_iSHOP_COST,
_iSHOP_STOCK
}
enum _:ItemsMarket
{
_iMARKET_INDEX,
_iMARKET_COST,
_iMARKET_OWNER,
_iMARKET_DURABILITY
}
enum _:ItemsPlayer
{
_iITEMS_INDEX,
_IITEMS_QUANTITY,
_iITEMS_DURABILITY,
bool:_bITEMS_EQUIPPED
}
/*
<^> Default item data.
*/
enum _:ItemData
{
_szDATA_NAME[ 32 ],
_iDATA_DURABILITY,
_iDATA_CHANCE,
bool:_bDATA_EQUIP,
_szDATA_INFO[ 128 ]
}
enum
{
ITEM_PAINKILLERS,
ITEM_STEROIDS,
ITEM_SMOKENADE,
ITEM_HENADE,
ITEM_FLASHBANG,
ITEM_HELMET,
ITEM_GRAVBOOTS,
ITEM_LOCKPICK,
ITEM_MEDKIT,
ITEM_GLOCK,
ITEM_CROWBAR,
ITEM_DISGUISE
};
new const g_mItemData[][ ItemData ] =
{
{ "[Analgesico]", -1, 1, false, "Devuelve una pequeña cantidad de HP cuando estas lesionado !g[Solo para uso]" }, //DONE
{ "[Esteroides]", -1, 1, false, "Correras un %%50 mas rapido por corta duracion !g[Solo para uso]" }, //DONE
{ "[Granada de Humo]", 4, -1, false, "Recibes una granada de humo !g[Solo para uso]" }, //DONE
{ "[Granada HE]", -1, 4, false, "Recibiras una Granada HE !g[Solo para uso]" }, //DONE
{ "[Granada Flash]", -1, 7, false, "Recibiras una flashbang !g[Solo para uso]" }, //DONE
{ "[Casco]", 20, 10, true, "Casco que previene daño de Headshot !g[Te lo equipas]" },
{ "[Botas Anti-gravedad]", 10, 8, true, "Botas anti-gravitatorias que te permiten saltar alto !g[Te lo equipas]" }, //DONE
{ "[Candado]", -1, 8, false, "Abre una celda bloqueada !g[Solo para uso]" }, //DONE
{ "[Kit medico]", -1, 2, false, "Recupera tu HP al maximo !g[Solo para uso]" },
{ "[Glock mortal]", -1, 9, false, "Glock 18 con una bala letal !g[Solo para uso]" }, //DONE
{ "[Garrote]", 5, 10, true, "Arma cuerpo a cuerpo que causa grandes daños !g[Te lo equipas]" },
{ "[Disfraz]", -1, 7, false, "Te permita disfrazarte de guardia !g[Te lo equipas]" }
}
#define MAX_STANDARD_ITEMS sizeof g_mItemData
/*
<^> Tasks.
*/
enum( += 32 )
{
TASK_STEROIDS = 2000
}
/*
<^> Cvar setup.
*/
#define MAX_PCVAR 22
enum _:_pCvar
{
CurrencyPreFix,
CurrencyPostFix,
EnableInventory,
EnableMarket,
EnableMegaShop,
EnableDataSaving,
CrowbarDamageX,
InventoryWhileDead,
MarketWhileDead,
ShopWhileDead,
MarketSellMin,
MarketSellMax,
MarketSellNum,
PainkillersHealth,
MarketBuyTime,
ShopBuyTime,
MarketBeforeOpen,
ShopBeforeOpen,
ItemUseInstantly,
CurrencyPerKill,
CurrencyPerRebel,
ChanceItemPerKill
}
new g_pCvar[ _pCvar ], g_pValue[ _pCvar ];
/*
<^> Ham forward pointers.
*/
new HamHook:_CBasePlayer_TakeDamage;
/*
<^> Custom forward pointers.
*/
new ForwardHandle_UseItem, ForwardHandle_ResetMaxSpeed, ForwardHandle_ItemInteraction;
/*
<^> Vars.
*/
new g_szAuthId[ 33 ][ 34 ];
new g_iPlayerCash[ 33 ], g_iTargetItem[ 33 ] = -1, g_iEquipData[ 33 ][ sizeof g_mItemData ];
new g_iMaxPlayers, g_iMenuMarket, g_iMenuSell, g_iMenuCallBack;
new bool:g_bCellsOpened, g_iMsgScreenFade;
#define SPEED_STANDARD 300.0
new Float: g_flPlayer_MaxSpeed[ 33 ], Float:g_flRoundStart;
/*
<^> Let's get started!
*/
public plugin_precache()
{
/*
<^> Precache models.
*/
precache_model( g_szMdlCrowbar[ v_model ] );
precache_model( g_szMdlCrowbar[ p_model ] );
}
public plugin_init()
{
register_plugin( "JailBreak FG : Items + Market + MegaShop", "0.0.1", "hornet" );
register_dictionary( "jailbreak_fg.txt" );
g_iMaxPlayers = get_maxplayers();
g_aItemData = ArrayCreate( ItemData );
g_aItemsMarket = ArrayCreate( ItemsMarket );
g_aItemData = ArrayCreate( ItemData );
g_aShopItems = ArrayCreate( ItemsShop );
for( new i = 1 ; i < g_iMaxPlayers ; i ++ )
g_aItemsPlayer[ i ] = ArrayCreate( ItemsPlayer );
g_iMenuMarket = menu_create( "\yObjetos en el mercado negro:", "MenuHandle_Market" );
g_pCvar[ CurrencyPreFix ] = register_cvar( "hjb_currency_prefix", "" );
g_pCvar[ CurrencyPostFix ] = register_cvar( "hjb_currency_postfix", "Jail Credits" );
g_pCvar[ EnableInventory ] = register_cvar( "hjb_enable_inventory", "1" );
g_pCvar[ EnableMarket ] = register_cvar( "hjb_enable_market", "0" );
g_pCvar[ EnableMegaShop ] = register_cvar( "hjb_enable_megashop", "1" );
g_pCvar[ EnableDataSaving ] = register_cvar( "hjb_data_saving", "0" );
g_pCvar[ CrowbarDamageX ] = register_cvar( "hjb_crowbar_dmg_x", "1.3" );
g_pCvar[ InventoryWhileDead ] = register_cvar( "hjb_inv_while_dead", "0" );
g_pCvar[ MarketWhileDead ] = register_cvar( "hjb_market_while_dead", "0" );
g_pCvar[ ShopWhileDead ] = register_cvar( "hjb_shop_while_dead", "0" );
g_pCvar[ MarketSellMin ] = register_cvar( "hjb_market_sell_min", "100" );
g_pCvar[ MarketSellMax ] = register_cvar( "hjb_market_sell_max", "10000" );
g_pCvar[ MarketSellNum ] = register_cvar( "hjb_market_sell_num", "20" );
g_pCvar[ PainkillersHealth ] = register_cvar( "hjb_painkillers_health", "25" );
g_pCvar[ MarketBuyTime ] = register_cvar( "hjb_market_buy_time", "0" );
g_pCvar[ ShopBuyTime ] = register_cvar( "hjb_shop_buy_time", "0" );
g_pCvar[ MarketBeforeOpen ] = register_cvar( "hjb_market_before_open", "0" );
g_pCvar[ ShopBeforeOpen ] = register_cvar( "hjb_shop_before_open", "1" );
g_pCvar[ ItemUseInstantly ] = register_cvar( "hjb_item_use_instantly", "0" );
g_pCvar[ CurrencyPerKill ] = register_cvar( "hjb_currency_per_kill", "100" );
g_pCvar[ CurrencyPerRebel ] = register_cvar( "hjb_currency_per_rebel", "25" );
g_pCvar[ ChanceItemPerKill ] = register_cvar( "hjb_item_chance_kill", "5" );
OnHJB_CvarsUpdated();
RegisterHam( Ham_CS_Player_ResetMaxSpeed, "player", "CBasePlayer_ResetMaxSpeed", 1 );
_CBasePlayer_TakeDamage = RegisterHam( Ham_TakeDamage, "player", "CBasePlayer_TakeDamage" );
register_concmd( "hjb_giveitem", "ConsoleCommand_GiveItem" );
register_concmd( "hjb_givecash", "ConsoleCommand_GiveCash" );
//register_clcmd( "say /menu", "ClientCommand_Menu" );
register_clcmd( "say /market", "ClientCommand_Market" );
register_clcmd( "say /shop", "ClientCommand_MegaShop" );
register_clcmd( "say /inv", "ClientCommand_Inventory" );
g_iMsgScreenFade= get_user_msgid( "ScreenFade" );
g_iMenuCallBack = menu_makecallback( "Menu_CallBack" );
register_impulse( 100, "ClientCommand_Menu" );
ForwardHandle_UseItem = CreateMultiForward( "OnHJB_UseItem", ET_STOP, FP_CELL );
ForwardHandle_ResetMaxSpeed = CreateMultiForward( "OnHJB_ResetMaxSpeed", ET_STOP, FP_CELL );
ForwardHandle_ItemInteraction = CreateMultiForward( "OnHJB_ItemInteraction", ET_STOP, FP_CELL );
set_task( 2.0, "ConfigureMegaShop" );
//set_task( 3.0, "ConfigureMarket" );
//set_task( 4.0, "BuildMarket" );
BuildMenuSell();
server_cmd( "mp_flashlight 0" );
server_cmd( "sv_maxspeed 400" );
}
public ConfigureMegaShop()
{
/*
<^> Reads the MegaShop configuration file.
*/
new szFile[ 64 ];
get_configsdir( szFile, charsmax( szFile ) );
formatex( szFile, charsmax( szFile ), "%s/JailBreak FG/MegaShop.cfg", szFile );
new iFile = fopen( szFile, "r" );
if( !iFile )
{
log_amx( "Failed to find file 'configs/JailBreak FG/MegaShop.cfg'" );
return;
}
const MAX_SHOP_FIELDS = 2;
new ArrayData[ ItemsShop ], ArrayData2[ ItemData ];
new szText[ 32 ], szField[ 8 ], szValue[ 8 ];
new iCount, iSize, iSize2;
//ArrayPushArray( g_aShopItems, ArrayData );
while( !feof( iFile ) )
{
fgets( iFile, szText, charsmax( szText ) );
trim( szText );
if( szText[ 0 ] == ';' || szText[ 0 ] == '/' || !strlen( szText ) )
continue;
if( iCount >= MAX_SHOP_FIELDS )
{
/*
<^> This section matches the item names with the corresponding data
and adds them to the shop menu accordingly.
*/
/*
<^> First loop checks the standard items.
*/
iSize = ArraySize( g_aShopItems );
for( new i ; i < MAX_STANDARD_ITEMS ; i ++ )
{
if( equal( ArrayData[ _szSHOP_NAME ], g_mItemData[ i ][ _szDATA_NAME ] ) )
{
ArrayData[ _iSHOP_INDEX ] = i;
ArrayInsertArrayAfter( g_aShopItems, iSize - 1, ArrayData );
goto Next;
}
}
/*
<^> Second loop checks any items that are added from 3rd party
plugins.
*/
iSize = ArraySize( g_aItemData );
iSize2 = ArraySize( g_aShopItems ) - 1;
for( new i ; i < iSize2 ; i ++ )
{
ArrayGetArray( g_aItemData, i, ArrayData2 );
if( equal( ArrayData[ _szSHOP_NAME ], ArrayData2[ _szDATA_NAME ] ) )
{
ArrayData[ _iSHOP_INDEX ] = i + MAX_STANDARD_ITEMS;
ArrayInsertArrayAfter( g_aShopItems, iSize, ArrayData );
goto Next;
}
}
log_amx( "Failed to add item %s to MegaShop", ArrayData[ _szSHOP_NAME ] );
Next:
{
//
}
iCount = 0;
}
if( szText[ 0 ] == '[' )
{
/*
<^> Obtain the item name.
*/
replace( szText, charsmax( szText ), "[", "" );
replace( szText, charsmax( szText ), "]", "" );
copy( ArrayData[ _szSHOP_NAME ], charsmax( ArrayData[ _szSHOP_NAME ] ), szText );
}
else
{
/*
<^> Read all fields such as cost and stocks.
*/
parse( szText, szField, charsmax( szField ), szValue, charsmax( szValue ) );
if( equal( szField, "cost" ) )
{
ArrayData[ _iSHOP_COST ] = str_to_num( szValue );
}
else if( equal( szField, "stock" ) )
{
ArrayData[ _iSHOP_STOCK ] = str_to_num( szValue );
}
else log_amx( "Failed to load field for item %s", ArrayData[ _szSHOP_NAME ] );
iCount ++;
}
}
fclose( iFile );
}
public ConfigureMarket()
{
/*
<^> Reads the Market configuration file.
*/
new szFile[ 64 ];
get_configsdir( szFile, charsmax( szFile ) );
formatex( szFile, charsmax( szFile ), "%s/JailBreak FG/Market.cfg", szFile );
new iFile = fopen( szFile, "r" );
if( !iFile )
{
log_amx( "Failed to find file 'configs/JailBreak FG/Market.cfg'" );
return;
}
const MAX_SHOP_FIELDS = 2;
new ArrayData[ ItemsShop ], ArrayData2[ ItemData ];
new szText[ 32 ], szField[ 8 ], szValue[ 8 ];
new iCount, iSize, iSize2;
//ArrayPushArray( g_aShopItems, ArrayData );
while( !feof( iFile ) )
{
fgets( iFile, szText, charsmax( szText ) );
trim( szText );
if( szText[ 0 ] == ';' || szText[ 0 ] == '/' || !strlen( szText ) )
continue;
}
}
public BuildMarket()
{
if( !g_pValue[ EnableMarket ] || g_pValue[ ItemUseInstantly ] )
return;
/*
<^> This section will put a random amount of items on the market and set
them up with a reasonably random price.
*/
/*
This section is to be revised.
*/
new iCount, iRand, Items[ 14 ];
if( !random_num( 0, 3 ) )
{
while( iCount < 10 )
{
iRand = random_num( 0, sizeof g_mItemData - 1 );
if( g_mItemData[ iRand ][ _bDATA_EQUIP ] )
{
Items[ iCount ] = iRand;
iCount ++;
}
}
AddToMarket( -1, Items[ random_num( 0, sizeof Items - 1 ) ], 5000 );
}
new iPrices[] = { 55, 60, 65, 70, 75 };
iCount = 0;
while( iCount < 10 )
{
iRand = random_num( 0, sizeof g_mItemData - 1 );
if( g_mItemData[ iRand ][ _iDATA_DURABILITY ] == -1 )
{
Items[ iCount ] = iRand;
iCount ++;
}
}
for( new i ; i < sizeof Items - 1 ; i ++ )
if( random_num( 0, 1 ) )
AddToMarket( 0, Items[ i ], g_mItemData[ Items[ i ] ][ _iDATA_CHANCE ] * iPrices[ random_num( 0, sizeof iPrices - 1 ) ] );
}
BuildMenuSell()
{
if( !g_pValue[ EnableMarket ] || g_pValue[ ItemUseInstantly ] )
return;
/*
<^> Builds the item sell menu.
*/
new szMenu[ 64 ];
formatex( szMenu, charsmax( szMenu ), "\y%L", LANG_SERVER, "MENU_SELL_FOR" );
g_iMenuSell = menu_create( szMenu, "MenuHandle_SellItem" );
/*
<^> The system is set so there will be half low options and half high options,
divided in the middle between mins and maxs.
*/
new Float:flMin = get_pcvar_float( g_pCvar[ MarketSellMin ] );
new Float:flMax = get_pcvar_float( g_pCvar[ MarketSellMax ] );
new Float:flNum = get_pcvar_float( g_pCvar[ MarketSellNum ] );
new Float:iIncrement = flMax / ( flNum / 2 ) / ( flNum / 2 );
new iMid = floatround( flNum / 2, floatround_floor );
new szNum[ 16 ], szInfo[ 32 ];
for( new i ; i < iMid ; i ++ )
{
num_to_str( floatround( i * iIncrement + flMin ), szNum, charsmax( szNum ) );
formatex( szInfo, charsmax( szInfo ), "%s%i %s", GetCvarString( CurrencyPreFix ), floatround( i * iIncrement + flMin ), GetCvarString( CurrencyPostFix ) );
menu_additem( g_iMenuSell, szNum, szInfo );
}
iIncrement = flMax / ( flNum / 2 );
iMid = floatround( flNum / 2, floatround_ceil );
for( new i = iMid + 1 ; i < flNum ; i ++ )
{
num_to_str( floatround( ( ( i + 1 ) - iMid ) * ( iIncrement ) ), szNum, charsmax( szNum ) );
formatex( szInfo, charsmax( szInfo ), "%s%i %s", GetCvarString( CurrencyPreFix ), floatround( ( ( i + 1 ) - iMid ) * ( iIncrement ) ), GetCvarString( CurrencyPostFix ) );
menu_additem( g_iMenuSell, szNum, szInfo );
}
}
/*---------------------------------|
| Connection |
|---------------------------------*/
public client_putinserver( id )
{
/*
<^> Bots are no good at this game. They tend to freekill :|
And when you kick them they just come back ...
*/
if( is_user_bot( id ) )
return;
/*
<^> Load the players data.
*/
if( g_pValue[ EnableDataSaving ] )
{
get_user_authid( id, g_szAuthId[ id ], charsmax( g_szAuthId[] ) );
LoadData( id );
}
/*
<^> Reset player's max speed.
*/
g_flPlayer_MaxSpeed[ id ] = SPEED_STANDARD;
}
public client_disconnect( id )
{
if( is_user_bot( id ) )
return;
remove_task( id + TASK_STEROIDS );
/*
<^> Save the player's data and then return all their items to them if they
had any on the market. Market menu must also be rebuilt.
*/
if( !g_pValue[ EnableDataSaving ] || g_pValue[ ItemUseInstantly ] || cs_get_user_team( id ) != CS_TEAM_T )
return;
new iSize = ArraySize( g_aItemsMarket );
new ArrayData[ ItemsMarket ], ArrayData2[ ItemsPlayer ], iItem;
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsMarket, i, ArrayData );
if( ArrayData[ _iMARKET_OWNER ] == id )
{
iItem = HJB_GiveUserItem( id, ArrayData[ _iMARKET_INDEX ] );
ArrayGetArray( g_aItemsPlayer[ id ], iItem, ArrayData2 );
ArrayData2[ _iITEMS_DURABILITY ] = ArrayData[ _iMARKET_DURABILITY ];
ArraySetArray( g_aItemsPlayer[ id ], iItem, ArrayData2 );
}
}
SaveData( id );
MenuRebuild( g_iMenuMarket );
ArrayClear( g_aItemsPlayer[ id ] );
for( new i ; i < sizeof g_mItemData ; i ++ )
{
g_iEquipData[ id ][ i ] = 0;
}
}
public plugin_end()
{
/*
<^> Save the player's data and then return all their items to them if they
had any on the market.
*/
if( !g_pValue[ EnableDataSaving ] )
return;
new iSize = ArraySize( g_aItemsMarket );
new ArrayData[ ItemsMarket ];
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsMarket, i, ArrayData );
HJB_GiveUserItem( ArrayData[ _iMARKET_OWNER ], ArrayData[ _iMARKET_INDEX ] );
}
new Players[ 32 ], iNum;
get_players( Players, iNum, "eh", "TERRORIST" );
for( new i ; i < iNum ; i ++ )
SaveData( Players[ i ] );
/*
<^> Destroy arrays.
*/
//ArrayDestroy( g_aItemData );
//ArrayDestroy( g_aItemsMarket );
//ArrayDestroy( g_aItemData );
//ArrayDestroy( g_aShopItems );
}
/*---------------------------------|
| HJB Forwards |
|---------------------------------*/
public OnHJB_CvarsUpdated()
{
/*
<^> Retrieve all our cvar values now so we can cache them and dont have to call
the native again later.
*/
/*
<^> int x is the amount of cvars that are actually strings.
*/
/*
<^> Method requires some reworking. It's a stupid idea ....
*/
new x = 2;
for( new i = x ; i < MAX_PCVAR ; i ++ )
g_pValue[ i ] = get_pcvar_num( g_pCvar[ i ] );
/*
<^> Called at roundstart.
*/
g_flRoundStart = get_gametime();
}
public OnHJB_PlayerSpawn( id )
{
/*
<^> Called when player spawns.
*/
UTIL_ScreenFade( id, 1<<12, 1<<6, 0x0000, 0, 0, 0, 255 );
if( cs_get_user_team( id ) != CS_TEAM_T )
return;
/*
<^> Damages player's items.
*/
new ArrayData[ ItemsPlayer ], iSize = ArraySize( g_aItemsPlayer[ id ] );
for( new i ; i < iSize - 1 ; i ++ )
{
ArrayGetArray( g_aItemsPlayer[ id ], i, ArrayData );
if( g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _bDATA_EQUIP ] && ArrayData[ _bITEMS_EQUIPPED ] )
{
ArrayData[ _iITEMS_DURABILITY ] -= random_num( 0, 2 );
ArraySetArray( g_aItemsPlayer[ id ], i, ArrayData );
if( ArrayData[ _iITEMS_DURABILITY ] < 1 )
{
ArrayDeleteItem( g_aItemsPlayer[ id ], i );
Print( id, true, "Your !g%s !nwas destroyed!", g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _szDATA_NAME ] );
}
}
}
/*
<^> Setup any items that will be used automatically if they are equipped.
*/
new iItemIndex;
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsPlayer[ id ], i, ArrayData );
iItemIndex = ArrayData[ _iITEMS_INDEX ];
if( iItemIndex == ITEM_GRAVBOOTS )
HandleItem( id, iItemIndex );
}
}
public OnHJB_DeployKnife( id )
{
/*
<^> Called when a player draws his knife.
*/
if( HJB_IsItemEquipped( id, ITEM_CROWBAR ) )
{
/*
<^> Here we will set the player's crowbar model if he is using one.
*/
set_pev( id, pev_viewmodel2, g_szMdlCrowbar[ v_model ] );
set_pev( id, pev_weaponmodel2, g_szMdlCrowbar[ p_model ] );
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public OnHJB_PlayerKilled( id, iKiller )
{
/*
<^> Handles users wearing a disguise.
*/
switch( get_user_team( id ) )
{
case CS_TEAM_T:
{
cs_reset_user_model( id );
}
case CS_TEAM_CT:
{
if( ( 1 <= iKiller <= g_iMaxPlayers ) && cs_get_user_team( iKiller ) == CS_TEAM_T )
{
/*
<^> Cash reward for killing Guards.
*/
new iAmount = g_pValue[ CurrencyPerKill ];
if( iAmount )
HJB_GiveUserCurrency( iKiller, iAmount );
/*
<^> Item reward.
*/
if( !g_pValue[ ItemUseInstantly ] )
{
iAmount = g_pValue[ ChanceItemPerKill ];
if( iAmount )
{
if( random_num( 1, iAmount ) == 1 )
HJB_GiveUserItem( iKiller, -1, true );
}
}
}
}
}
}
public OnHJB_PlayerRebelled( id )
{
new iAmount = g_pValue[ CurrencyPerRebel ];
if( iAmount )
HJB_GiveUserCurrency( id, iAmount );
}
public OnHJB_MainMenuBuild( id )
{
if( is_user_connected( id ) )
{
HJB_SendMenuItem( id, "MENU_INVENTORY", MENU_INVENTORY, !g_pValue[ ItemUseInstantly ] && cs_get_user_team( id ) == CS_TEAM_T ? true : false );
HJB_SendMenuItem( id, "MENU_MEGASHOP_MAIN", MENU_SHOP, g_pValue[ EnableMegaShop ] && cs_get_user_team( id ) == CS_TEAM_T ? true : false );
HJB_SendMenuItem( id, "MENU_MARKET_MAIN", MENU_MARKET, g_pValue[ EnableMarket ] && cs_get_user_team( id ) == CS_TEAM_T ? true : false );
}
}
public OnHJB_MainMenuOpen( id, iIndex )
{
if( is_user_connected( id ) )
{
switch( iIndex )
{
case MENU_INVENTORY:
{
ClientCommand_Inventory( id );
}
case MENU_SHOP:
{
ClientCommand_MegaShop( id );
}
case MENU_MARKET:
{
ClientCommand_Market( id );
}
}
}
}
/*
<^> These forwards are only required if your running Last Request.
*/
public OnHJB_LastRequestStart()
{
DisableHamForward( _CBasePlayer_TakeDamage );
}
public OnHJB_LastRequestEnd()
{
EnableHamForward( _CBasePlayer_TakeDamage );
}
/*
<^> These forwards are only required if your running Day Events.
*/
public OnHJB_DayEventStart()
{
DisableHamForward( _CBasePlayer_TakeDamage );
}
public OnHJB_DayEventEnd()
{
EnableHamForward( _CBasePlayer_TakeDamage );
}
public OnHJB_CellsOpened()
{
/*
<^> Will be called from Cell Opener plugin. If your not using it and no other
plugins calls this forward then the functionality will be useless.
*/
g_bCellsOpened = true;
}
/*---------------------------------|
| Ham Forwards |
|---------------------------------*/
public CBasePlayer_ResetMaxSpeed( id )
{
if( !is_user_alive( id ) )
return HAM_IGNORED;
/*
<^> This plugin can change a player's maxspeed with an item or other things.
When this occurs then the plugin must send this info via a forward
and give other plugins such as Last Request or Game Events the chance
to supercede the player's speed from changing.
*/
new iReturn;
ExecuteForward( ForwardHandle_ResetMaxSpeed, iReturn, id );
/*
<^> If PLUGIN_HANDLED wasn't returned then change speed!
*/
if( !iReturn )
{
set_user_maxspeed( id, g_flPlayer_MaxSpeed[ id ] );
}
return HAM_IGNORED;
}
public CBasePlayer_TakeDamage( iVictim, iEnt, iAttacker, Float:flDamage, Bits )
{
if( 1 <= iAttacker <= g_iMaxPlayers )
{
/*
<^> Check if player is using a crowbar and add extra damage for it.
*/
if( cs_get_user_team( iAttacker ) == CS_TEAM_T && HJB_IsItemEquipped( iAttacker, ITEM_CROWBAR ) )
SetHamParamFloat( 4, flDamage * get_pcvar_float( g_pCvar[ CrowbarDamageX ] ) );
/*
<^> Check if a player is wearing a helmet and remove damage.
*/
if( get_pdata_int( iAttacker, m_iLastHitGroup ) == HIT_HEAD && HJB_IsItemEquipped( iAttacker, ITEM_HELMET ) )
{
emit_sound( iVictim, CHAN_VOICE, "weapons/ric_metal-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM );
SetHamParamFloat( 4, 0.0 );
}
}
}
/*---------------------------------|
| Tasks |
|---------------------------------*/
public Task_Steroids( id )
{
id -= TASK_STEROIDS;
g_flPlayer_MaxSpeed[ id ] = get_user_maxspeed( id );
if( is_user_connected( id ) )
{
ExecuteHam( Ham_CS_Player_ResetMaxSpeed, id );
UTIL_ScreenFade( id, 3<<12, 1<<6, 0x0000, 255, 0, 0, 200 );
}
}
/*---------------------------------|
| Admin Commands |
|---------------------------------*/
public ConsoleCommand_GiveItem( id )
{
/*
<^> This is the admin command to give a player an item.
*/
if( access( id, ADMIN_ITEM ) )
{
new szArg[ 2 ][ 32 ];
read_argv( 1, szArg[ 0 ], charsmax( szArg[] ) );
read_argv( 2, szArg[ 1 ], charsmax( szArg[] ) );
new iTarget = cmd_target( id, szArg[ 0 ], CMDTARGET_ALLOW_SELF );
new iItemIndex = str_to_num( szArg[ 1 ] );
static szName[ 2 ][ 32 ], szAction[ 128 ];
get_user_name( id, szName[ 0 ], charsmax( szName[] ) );
get_user_name( iTarget, szName[ 1 ], charsmax( szName[] ) );
HJB_GiveUserItem( iTarget, iItemIndex );
format( szAction, charsmax( szAction ), "%L", LANG_SERVER, "ADMIN_GIVE_ITEM", szName[ 0 ], g_mItemData[ iItemIndex ][ _szDATA_NAME ], szName[ 1 ] );
client_print( 0, print_chat, szAction );
log_amx( szAction );
}
else
{
console_print( id, "%L", LANG_SERVER, "CMD_NO_ACCESS" );
return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
}
public ConsoleCommand_GiveCash( id )
{
/*
<^> This is the admin command to give currency to players.
*/
if( access( id, ADMIN_ITEM ) )
{
new szArg[ 2 ][ 32 ];
read_argv( 1, szArg[ 0 ], charsmax( szArg[] ) );
read_argv( 2, szArg[ 1 ], charsmax( szArg[] ) );
new iTarget = cmd_target( id, szArg[ 0 ], CMDTARGET_ALLOW_SELF );
new iAmount = str_to_num( szArg[ 1 ] );
static szName[ 2 ][ 32 ], szAction[ 128 ];
get_user_name( id, szName[ 0 ], charsmax( szName[] ) );
get_user_name( iTarget, szName[ 1 ], charsmax( szName[] ) );
HJB_GiveUserCurrency( iTarget, iAmount );
format( szAction, charsmax( szAction ), "%L", LANG_SERVER, "ADMIN_GIVE_CURRENCY", szName[ 0 ], GetCvarString( CurrencyPreFix ), iAmount, GetCvarString( CurrencyPostFix ), szName[ 1 ] );
client_print( 0, print_chat, szAction );
log_amx( szAction );
}
else
{
console_print( id, "%L", LANG_SERVER, "CMD_NO_ACCESS" );
return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
}
/*---------------------------------|
| Client Commands |
|---------------------------------*/
public Menu_CallBack()
{
return ITEM_DISABLED;
}
public ClientCommand_Menu( id )
{
if( cs_get_user_team( id ) != CS_TEAM_T )
return PLUGIN_HANDLED;
/*
<^> Allow other plugins to prevent the Market from being opened.
*/
new iReturn;
ExecuteForward( ForwardHandle_ItemInteraction, iReturn, id );
if( iReturn )
{
Print( id, RED, "!g%L", id, "MENU_UNAVAILABLE" );
return PLUGIN_HANDLED;
}
new szMenu[ 128 ];
formatex( szMenu, charsmax( szMenu ), "\y%s%L", MENU_TITLE, id, "MENU_PLAYER" );
/*
<^> Search for player's inventory items and display them.
*/
new iMenu = menu_create( szMenu, "MenuHandle_PlayerMenu" );
formatex( szMenu, charsmax( szMenu ), "%L", id, "PLAYERMENU_INVENTORY" );
menu_additem( iMenu, szMenu, _, _, g_pValue[ EnableInventory ] && g_pValue[ ItemUseInstantly ] ? g_iMenuCallBack : -1 );
formatex( szMenu, charsmax( szMenu ), "%L", id, "PLAYERMENU_MEGASHOP" );
menu_additem( iMenu, szMenu, _, ( g_pValue[ ShopBeforeOpen ] && g_bCellsOpened ) || ( g_pValue[ ShopBuyTime ] && GetRoundTime() > g_pValue[ ShopBuyTime ] ) ? g_iMenuCallBack : -1 );
formatex( szMenu, charsmax( szMenu ), "%L", id, "PLAYERMENU_MARKET" );
menu_additem( iMenu, szMenu, _, _, ( g_pValue[ MarketBeforeOpen ] && g_bCellsOpened ) || ( g_pValue[ MarketBuyTime ] && GetRoundTime() > g_pValue[ MarketBuyTime ] ) ? g_iMenuCallBack : -1 );
menu_display( id, iMenu );
return PLUGIN_HANDLED;
}
public ClientCommand_Market( id )
{
/*
<^> Brings up the market menu if it's not disabled.
Controllable via cvar.
*/
if( !g_pValue[ EnableMarket ] /*|| g_pValue[ ItemUseInstantly ]*/ )
{
Print( id, RED, "%L", id, "MARKET_DISABLED" );
return;
}
/*
<^> Allow other plugins to prevent the Market from being opened.
*/
new iReturn;
ExecuteForward( ForwardHandle_ItemInteraction, iReturn, id );
if( iReturn || ( !g_pValue[ MarketWhileDead ] && !is_user_alive( id ) ) )
{
Print( id, RED, "!g%L", id, "MENU_UNAVAILABLE" );
return;
}
if( ( g_pValue[ MarketBeforeOpen ] && g_bCellsOpened ) || ( g_pValue[ MarketBuyTime ] && GetRoundTime() > g_pValue[ MarketBuyTime ] ) )
{
Print( id, RED, "%L", id, "MARKET_CLOSED" );
return;
}
Print( id, BLUE, "%L", id, "CURRENCY_YOU_HAVE", GetCvarString( CurrencyPreFix ), g_iPlayerCash[ id ], GetCvarString( CurrencyPostFix ) );
new iSize = ArraySize( g_aItemsMarket );
if( !iSize )
{
Print( id, RED, "%L", id, "MARKET_NO_ITEMS" );
return;
}
menu_display( id, g_iMenuMarket );
}
public ClientCommand_MegaShop( id )
{
if( cs_get_user_team( id ) != CS_TEAM_T )
return;
/*
<^> Command to bring up the megashop.
*/
/*
<^> Allow other plugins to prevent from being opened.
*/
new iReturn;
ExecuteForward( ForwardHandle_ItemInteraction, iReturn, id );
if( iReturn )
{
Print( id, RED, "!g%L", id, "MENU_UNAVAILABLE" );
return;
}
if( ( g_pValue[ ShopBeforeOpen ] && g_bCellsOpened ) || ( g_pValue[ ShopBuyTime ] && GetRoundTime() > g_pValue[ ShopBuyTime ] ) )
{
Print( id, RED, "%L", id, "MEGASHOP_CLOSED" );
return;
}
if( g_pValue[ EnableMegaShop ] )
{
new szMenu[ 256 ];
formatex( szMenu, charsmax( szMenu ), "\y%s%L", MENU_TITLE, id, "MENU_MEGASHOP", GetCvarString( CurrencyPreFix ), g_iPlayerCash[ id ], GetCvarString( CurrencyPostFix ) );
new iMenu = menu_create( szMenu, "MenuHandle_MegaShop" );
new ArrayData[ ItemsShop ], szInfo[ 128 ], szStock[ 16 ];
new iSize = ArraySize( g_aShopItems ), iStock
const ITEMS_PER_PAGE = 3;
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aShopItems, i, ArrayData );
iStock = ArrayData[ _iSHOP_STOCK ];
if( iStock == -1 )
szStock = "Unlimited";
else if( iStock == 0 )
szStock = "Out Of Stock";
else num_to_str( iStock, szStock, charsmax( szStock ) );
formatex( szInfo, charsmax( szInfo ), "%s^n \yCost: %i^n \yStock: %s^n", ArrayData[ _szSHOP_NAME ], ArrayData[ _iSHOP_COST ], szStock );
menu_additem( iMenu, szInfo );
/*
<^> This part is the key to making items appear nicely on the menu.
*/
if( !( ( i + 1 ) % ITEMS_PER_PAGE ) )
{
for( new j = ITEMS_PER_PAGE ; j < MPROP_ORDER ; j ++ )
menu_addblank2( iMenu );
}
}
//menu_setprop( iMenu, MPROP_PERPAGE, ITEMS_PER_PAGE );
menu_display( id, iMenu );
}
else
{
Print( id, RED, "%L", id, "MEGASHOP_DISABLED" );
}
}
public ClientCommand_Inventory( id )
{
/*
<^> Only Prisoners may use this menu.
*/
if( cs_get_user_team( id ) != CS_TEAM_T || !g_pValue[ EnableInventory ] )
return;
if( g_pValue[ ItemUseInstantly ] || ( !g_pValue[ InventoryWhileDead ] && !is_user_alive( id ) ) )
return;
/*
<^> Send this forward so other plugins know that the player is trying to open
his inventory. This gives them the chance to prevent this, just in case
Last Request is running or Day Event is running.
*/
new iReturn;
ExecuteForward( ForwardHandle_ItemInteraction, iReturn, id );
if( iReturn )
return;
/*
<^> Otherwise continue on.
*/
new iSize = ArraySize( g_aItemsPlayer[ id ] );
if( !iSize )
{
Print( id, RED, "%L", id, "ITEMS_HAVE_NONE" );
Print( id, RED, "%L", id, "CURRENCY_YOU_HAVE", GetCvarString( CurrencyPreFix ), g_iPlayerCash[ id ], GetCvarString( CurrencyPostFix ) );
return;
}
new szMenu[ 256 ];
formatex( szMenu, charsmax( szMenu ), "\y%s%L", MENU_TITLE, id, "MENU_ITEM_SELECT", GetCvarString( CurrencyPreFix ), g_iPlayerCash[ id ], GetCvarString( CurrencyPostFix ) );
/*
<^> Search for player's inventory items and display them.
*/
new iMenu = menu_create( szMenu, "MenuHandle_Inventory" );
new szItem[ 64 ], ArrayData[ ItemsPlayer ];
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsPlayer[ id ], i , ArrayData );
if( g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _bDATA_EQUIP ] )
{
formatex( szItem, charsmax( szItem ), "%s%s \y[ \w%%%i Durability \y]", ArrayData[ _bITEMS_EQUIPPED ] ? "\y" : "", g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _szDATA_NAME ], floatround( Float:ArrayData[ _iITEMS_DURABILITY ] / Float:g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _iDATA_DURABILITY ] * 100.0 ) );
}
else
{
formatex( szItem, charsmax( szItem ), "%s \R \rx%i", g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _szDATA_NAME ], ArrayData[ _IITEMS_QUANTITY ] );
}
menu_additem( iMenu, szItem );
}
menu_display( id, iMenu );
}
/*---------------------------------|
| Menus and Handlers |
|---------------------------------*/
public MenuHandle_PlayerMenu( id, iMenu, iItem )
{
menu_destroy( iMenu );
switch( iItem )
{
case MENU_EXIT:
{
return;
}
case 0:
{
ClientCommand_Inventory( id );
}
case 1:
{
ClientCommand_MegaShop( id );
}
case 2:
{
ClientCommand_Market( id );
}
}
}
public MenuHandle_Market( id, iMenu, iItem )
{
/*
<^> A player has clicked on a market item.
*/
if( iItem == MENU_EXIT )
{
return;
}
new ArrayData[ ItemsMarket ];
ArrayGetArray( g_aItemsMarket, iItem, ArrayData );
new iCost = ArrayData[ _iMARKET_COST ];
if( g_iPlayerCash[ id ] >= iCost )
{
/*
<^> The player bought the item.
Remove the item from the array and give it to the player, and also
rebuild the market menu.
*/
new szName[ 32 ];
get_user_name( id, szName, charsmax( szName ) );
g_iPlayerCash[ id ] -= iCost;
if( ArrayData[ _iMARKET_OWNER ] > 0 )
{
g_iPlayerCash[ ArrayData[ _iMARKET_OWNER ] ] += iCost;
if( ArrayData[ _iMARKET_INDEX ] > 0 )
Print( ArrayData[ _iMARKET_OWNER ], BLUE, "!g%s !tBOUGHT !nyour !g%s !nfor !g$%i", szName, g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _szDATA_NAME ], iCost );
}
Print( id, BLUE, "!tBOUGHT ITEM !g%s !nfor !g$%i", g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _szDATA_NAME ], iCost );
new iSize = ArraySize( g_aItemsPlayer[ id ] ), ArrayData2[ ItemsPlayer ];
/*
<^> Determine whether the player should get another one by quantity or a
whole new item. If item is equippable he will get a new array index
for it.
*/
if( !g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _bDATA_EQUIP ] )
{
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsPlayer[ id ], i, ArrayData2 );
if( ArrayData2[ _iITEMS_INDEX ] == ArrayData[ _iMARKET_INDEX ] )
{
ArrayData2[ _IITEMS_QUANTITY ] ++;
ArraySetArray( g_aItemsPlayer[ id ], i, ArrayData2 );
ArrayDeleteItem( g_aItemsMarket, iItem );
MenuRebuild( g_iMenuMarket );
return;
}
}
}
/*
<^> Add to player array.
*/
ArrayData2[ _iITEMS_INDEX ] = ArrayData[ _iMARKET_INDEX ];
ArrayData2[ _IITEMS_QUANTITY ] = 1;
ArrayData2[ _iITEMS_DURABILITY ] = g_mItemData[ ArrayData2[ _iITEMS_INDEX ] ][ _iDATA_DURABILITY ];
ArrayData2[ _bITEMS_EQUIPPED ] = false;
ArrayPushArray( g_aItemsPlayer[ id ], ArrayData2 );
ArrayDeleteItem( g_aItemsMarket, iItem );
MenuRebuild( g_iMenuMarket );
}
else
{
Print( id, RED, "%L", id, "CURRENCY_NOT_ENOUGH", GetCvarString( CurrencyPreFix ), GetCvarString( CurrencyPostFix ) );
ClientCommand_Market( id );
}
}
public MenuHandle_MegaShop( id, iMenu, iItem )
{
if( iItem == MENU_EXIT )
{
menu_destroy( iMenu );
return;
}
/*
<^> Prisoners only.
*/
if( cs_get_user_team( id ) != CS_TEAM_T && iItem >= 0 )
return;
//quick fix due to really bad brainhurt
if( iItem > 9 )
{
iItem -= 8;
}
else if( iItem > 2 )
{
iItem -= 4;
}
//iItem -= 2 * ( floatround( ( Float:iItem ) / ( Float:3 ), floatround_floor ) );
new ArrayData[ ItemsShop ];
ArrayGetArray( g_aShopItems, iItem, ArrayData );
/*
<^> Check for stock supply.
*/
new iStock = ArrayData[ _iSHOP_STOCK ];
if( iStock )
{
/*
<^> Check for currency.
*/
new iCost = ArrayData[ _iSHOP_COST ];
if( iCost <= g_iPlayerCash[ id ] )
{
/*
<^> Player bought the item!
*/
g_iPlayerCash[ id ] -= iCost;
HJB_GiveUserItem( id, ArrayData[ _iSHOP_INDEX ], true );
if( iStock > 0 )
{
/*
<^> Update the stock count in the array.
*/
ArrayData[ _iSHOP_STOCK ] --;
ArraySetArray( g_aShopItems, iItem, ArrayData );
}
Print( id, BLUE, "%L", id, "ITEMS_BOUGHT" );
/*
<^> Rebuild the menu.
*/
menu_destroy( iMenu );
}
else Print( id, RED, "%L", id, "CURRENCY_NOT_ENOUGH", GetCvarString( CurrencyPreFix ), GetCvarString( CurrencyPostFix ) );
}
else Print( id, RED, "%L", id, "SHOP_OUT_OF_STOCK" );
//new iTemp, iPage;
//player_menu_info( id, iTemp, iTemp, iPage );
ClientCommand_MegaShop( id );
//menu_display( id, iMenu/*, iPage*/ );
}
public MenuHandle_Inventory( id, iMenu, iItem )
{
/*
<^> A player selected an item in his inventory.
*/
if( iItem == MENU_EXIT )
{
menu_destroy( iMenu );
return;
}
g_iTargetItem[ id ] = iItem;
/*
<^> Set up the next menu for item options.
*/
Menu_Item( id, iItem );
}
public Menu_Item( id, iIndex )
{
/*
<^> Item options menu.
*/
new ArrayData[ ItemsPlayer ];
ArrayGetArray( g_aItemsPlayer[ id ], iIndex, ArrayData );
new szMenu[ 64 ];
formatex( szMenu, charsmax( szMenu ), "\y%s%L", MENU_TITLE, id, "ITEM_OPTION", g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _szDATA_NAME ] );
new iMenu = menu_create( szMenu, "HandleMenu_Item" );
if( g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _bDATA_EQUIP ] )
{
if( !ArrayData[ _bITEMS_EQUIPPED ] )
menu_additem( iMenu, "Equip Item" );
else menu_additem( iMenu, "Unequip Item" );
}
else menu_additem( iMenu, "Use item" );
menu_additem( iMenu, "Show Item Info" );
if( g_pValue[ EnableMarket ] && !g_pValue[ ItemUseInstantly ] )
menu_additem( iMenu, "Put On Market" );
menu_setprop( iMenu, MPROP_EXITNAME, "Previous" );
menu_display( id, iMenu );
}
public HandleMenu_Item( id, iMenu, iKey )
{
if( iKey == MENU_EXIT )
{
menu_destroy( iMenu );
ClientCommand_Inventory( id );
return;
}
new iSelected = g_iTargetItem[ id ];
new ArrayData[ ItemsPlayer ];
ArrayGetArray( g_aItemsPlayer[ id ], iSelected, ArrayData );
switch( iKey )
{
case 0:
{
/*
<^> Players cannot use items while they are dead.
*/
if( !is_user_alive( id ) )
{
Print( id, RED, "%L", id, "ITEM_USE_DEAD" );
ClientCommand_Inventory( id );
return;
}
if( !g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _bDATA_EQUIP ] )
{
ArrayData[ _IITEMS_QUANTITY ] --;
if( ArrayData[ _IITEMS_QUANTITY ] < 1 )
ArrayDeleteItem( g_aItemsPlayer[ id ], iSelected );
else ArraySetArray( g_aItemsPlayer[ id ], iSelected, ArrayData );
ClientCommand_Inventory( id );
}
else
{
if( ArrayData[ _bITEMS_EQUIPPED ] )
{
ArrayData[ _bITEMS_EQUIPPED ] = false;
g_iEquipData[ id ][ ArrayData[ _iITEMS_INDEX ] ] --;
}
else
{
ArrayData[ _bITEMS_EQUIPPED ] = true;
g_iEquipData[ id ][ ArrayData[ _iITEMS_INDEX ] ] ++;
}
ArraySetArray( g_aItemsPlayer[ id ], g_iTargetItem[ id ], ArrayData );
Menu_Item( id, iSelected );
}
HandleItem( id, ArrayData[ _iITEMS_INDEX ] );
}
case 1:
{
/*
<^> Make sure that data for externally added items is
available aswell.
*/
if( iSelected >= MAX_STANDARD_ITEMS )
{
new ArrayData2[ ItemData ];
ArrayGetArray( g_aItemData, iSelected, ArrayData2 );
Print( id, RED, ArrayData2[ _szDATA_INFO ] );
}
else Print( id, RED, g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _szDATA_INFO ] );
menu_destroy( iMenu );
Menu_Item( id, g_iTargetItem[ id ] );
}
case 2:
{
menu_display( id, g_iMenuSell );
}
}
}
public MenuHandle_SellItem( id, iMenu, iItem )
{
if( iItem == MENU_EXIT )
{
Menu_Item( id, g_iTargetItem[ id ] );
return;
}
new _access, _callback;
new szInfo[ 8 ];
menu_item_getinfo( iMenu, iItem, _access, szInfo, charsmax( szInfo ), _, _, _callback );
new iCost = str_to_num( szInfo );
AddToMarket( id, -1, iCost );
menu_destroy( iMenu );
new ArrayData[ ItemsPlayer ];
ArrayGetArray( g_aItemsPlayer[ id ], g_iTargetItem[ id ], ArrayData );
Print( id, true, "Added item !t%s !nto the !gMarket !nfor !t$%i", g_mItemData[ ArrayData[ _szDATA_NAME ] ], iCost );
ClientCommand_Inventory( id );
}
public HandleItem( id, iItemIndex )
{
/*
<^> "Uses" the item for the player.
*/
static szName[ 32 ], szMsg[ 256 ];
get_user_name( id, szName, charsmax( szName ) );
new bool:bUsed = true;
/*
<^> Send a forward to allow other plugins to handle their custom items
if they have one. Other plugins should return PLUGIN_HANDLED
if the player should not be allowed to use the item for whatever
reason may be.
*/
if( !IsItemStandardSet( iItemIndex ) )
{
new iReturn;
ExecuteForward( ForwardHandle_UseItem, iReturn, id, iItemIndex );
goto Message;
}
/*
<^> Handles all default items.
*/
switch( iItemIndex )
{
case ITEM_PAINKILLERS:
{
new iHealth = get_user_health( id );
if( iHealth < 100 )
{
iHealth += g_pValue[ PainkillersHealth ];
if( iHealth > 100 )
iHealth = 100;
set_user_health( id, iHealth );
UTIL_ScreenFade( id, 1<<12, 1<<6, 0x0000, 0, 255, 0, 255 );
}
else
{
format( szMsg, charsmax( szMsg ), "%L", id, "ITEM_FULL_HEALTH" );
bUsed = false;
HJB_GiveUserItem( id, ITEM_PAINKILLERS, false );
}
}
case ITEM_STEROIDS:
{
if( g_flPlayer_MaxSpeed[ id ] > SPEED_STANDARD )
{
format( szMsg, charsmax( szMsg ), "%L", id, "ITEM_STEROID_STILL_GOING" );
bUsed = false;
HJB_GiveUserItem( id, ITEM_STEROIDS, false );
}
else
{
g_flPlayer_MaxSpeed[ id ] += 150.0
set_user_maxspeed( id, g_flPlayer_MaxSpeed[ id ] );
UTIL_ScreenFade( id, 5<<12, 1<<6, 0x0000, 0, 50, 255, 200 );
set_task( 10.0, "Task_Steroids", id + TASK_STEROIDS );
}
}
case ITEM_SMOKENADE:
{
give_item( id, "weapon_smokegrenade" );
}
case ITEM_HENADE:
{
give_item( id, "weapon_hegrenade" );
}
case ITEM_FLASHBANG:
{
give_item( id, "weapon_flashbang" );
}
case ITEM_HELMET:
{
//
}
case ITEM_GRAVBOOTS:
{
if( HJB_IsItemEquipped( id, iItemIndex ) )
set_user_gravity( id, 0.625 );
else set_user_gravity( id, 1.0 );
}
case ITEM_LOCKPICK:
{
new iTarget, _body;
get_user_aiming( id, iTarget, _body, 100 );
if( iTarget > g_iMaxPlayers )
{
new szClass[ 32 ];
pev( iTarget, pev_classname, szClass, charsmax( szClass ) );
if( equal( szClass, "func_door" ) )
{
new szInfo[ 4 ];
num_to_str( iTarget, szInfo, charsmax( szInfo ) );
dllfunc( DLLFunc_Use, iTarget, 1 );
emit_sound( iTarget, CHAN_VOICE, "weapons/ric_metal-1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM );
return;
}
}
bUsed = false;
format( szMsg, charsmax( szMsg ), "%L", id, "ITEM_USE_FAILED" );
HJB_GiveUserItem( id, ITEM_LOCKPICK, false );
}
case ITEM_MEDKIT:
{
set_user_health( id, 120 );
}
case ITEM_GLOCK:
{
cs_set_weapon_ammo( give_item( id, "weapon_glock18" ), 1 );
engclient_cmd( id, "weapon_knife" );
}
case ITEM_CROWBAR:
{
if( HJB_IsItemEquipped( id, ITEM_CROWBAR ) )
OnHJB_DeployKnife( id );
ExecuteHamB( Ham_Item_Deploy, get_pdata_cbase( id, m_rgpPlayerItems[ 3 ] ) );
}
case ITEM_DISGUISE:
{
cs_set_user_model( id, "gsg9" );
}
}
Message:
if( !bUsed )
Print( id, false, szMsg );
}
public MenuRebuild( iMenu )
{
menu_destroy( iMenu );
g_iMenuMarket = g_iMenuMarket = menu_create( "\yItems on the market:", "MenuHandle_Market" );
new iSize = ArraySize( g_aItemsMarket );
new szName[ 32 ], szItem[ 128 ], ArrayData[ ItemsMarket ], iOwner;
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsMarket, i, ArrayData );
iOwner = ArrayData[ _iMARKET_OWNER ];
if( iOwner > 0 )
get_user_name( iOwner, szName, charsmax( szName ) );
else szName = "Market";
if( g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _bDATA_EQUIP ] )
{
if( iOwner > 0 )
formatex( szItem, charsmax( szItem ), "%s \y[ \w%%%i \rD/ \y] [ %s ] \R \r$%i", g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _szDATA_NAME ], floatround( Float:ArrayData[ _iMARKET_DURABILITY ] / Float:g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _iDATA_DURABILITY ] * 100.0 ), szName, ArrayData[ _iMARKET_COST ] );
else formatex( szItem, charsmax( szItem ), "%s \y[ \w%%100 \rD/ \y] [ %s ] \R \r$%i", g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _szDATA_NAME ], szName, ArrayData[ _iMARKET_COST ] );
}
else
{
formatex( szItem, charsmax( szItem ), "%s \y[ %s ] \R \r$%i", g_mItemData[ ArrayData[ _iMARKET_INDEX ] ][ _szDATA_NAME ], szName, ArrayData[ _iMARKET_COST ] );
}
menu_additem( g_iMenuMarket, szItem );
}
}
/*---------------------------------|
| Data |
|---------------------------------*/
public SaveData( id )
{
if( !g_pValue[ EnableDataSaving ] )
return;
/* ITEM DATA */
new szKey[ 64 ], szData[ 512 ];
formatex( szKey, charsmax( szKey ), "%s-DATA", g_szAuthId[ id ] );
new iSize = ArraySize( g_aItemsPlayer[ id ] ), ArrayData[ ItemsPlayer ];
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsPlayer[ id ], i, ArrayData );
if( g_mItemData[ ArrayData[ _iITEMS_INDEX ] ][ _bDATA_EQUIP ] )
{
formatex( szData, charsmax( szData ), "%s%i-%i-%i ", szData, ArrayData[ _iITEMS_INDEX ], ArrayData[ _bITEMS_EQUIPPED ] ? 1 : 0, ArrayData[ _iITEMS_DURABILITY ] );
}
else
{
formatex( szData, charsmax( szData ), "%s%i-%i ", szData, ArrayData[ _iITEMS_INDEX ], ArrayData[ _IITEMS_QUANTITY ] );
}
}
set_vaultdata( szKey, szData );
formatex( szKey, charsmax( szKey ), "%s-CASH", g_szAuthId[ id ] );
formatex( szData, charsmax( szData ), "%i", g_iPlayerCash[ id ] );
HJB_LogAction( id, "Saved $%i", g_iPlayerCash[ id ] );
set_vaultdata( szKey, szData );
}
public LoadData( id )
{
new szKey[ 64 ], szData[ 512 ];
/* ITEM DATA */
//CASH
formatex( szKey, charsmax( szKey ), "%s-CASH", g_szAuthId[ id ] );
//formatex( szData, charsmax( szData ), "%i", g_iPlayerCash[ id ] );
get_vaultdata( szKey, szData, charsmax( szData ) );
g_iPlayerCash[ id ] = str_to_num( szData );
HJB_LogAction( id, "Loaded $%i", g_iPlayerCash[ id ] );
//ITEMS
formatex( szKey, charsmax( szKey ), "%s-DATA", g_szAuthId[ id ] );
get_vaultdata( szKey, szData, charsmax( szData ) );
new szPiece[ 32 ], szSec[ 3 ][ 24 ];
new iItemIndex, iDurability, iQuantity, bool: bEquipped, ArrayData[ ItemsPlayer ];
while( contain( szData, " " ) >= 0 )
{
strtok( szData, szPiece, charsmax( szPiece ), szData, charsmax( szData ), ' ' ) ;
replace_all( szPiece, charsmax( szPiece ), "-", " " );
parse( szPiece, szSec[ 0 ], charsmax( szSec[] ), szSec[ 1 ], charsmax( szSec[] ), szSec[ 2 ], charsmax( szSec[] ) );
iItemIndex = str_to_num( szSec[ 0 ] );
ArrayData[ _iITEMS_INDEX ] = iItemIndex;
if( g_mItemData[ iItemIndex ][ _bDATA_EQUIP ] )
{
bEquipped = bool:str_to_num( szSec[ 1 ] );
iDurability = str_to_num( szSec[ 2 ] );
ArrayData[ _bITEMS_EQUIPPED ] = bEquipped;
ArrayData[ _iITEMS_DURABILITY ] = iDurability;
ArrayData[ _IITEMS_QUANTITY ] = 1;
if( bEquipped )
g_iEquipData[ id ][ ArrayData[ _iITEMS_INDEX ] ] ++;
}
else
{
iQuantity = str_to_num( szSec[ 1 ] );
ArrayData[ _IITEMS_QUANTITY ] = iQuantity;
}
HJB_LogAction( id, "Loaded Item %i", iItemIndex );
ArrayPushArray( g_aItemsPlayer[ id ], ArrayData );
}
}
//
public _ResetPlayerItems( id )
{
ArrayClear( g_aItemsPlayer[ id ] );
g_iPlayerCash[ id ] = 0;
SaveData( id );
}
/*---------------------------------|
| Stocks |
|---------------------------------*/
AddToMarket( id, iItemIndex, iCost )
{
/*
<^> Adds an item to the market.
*/
new ArrayData[ ItemsMarket ], ArrayData2[ ItemsPlayer ];
new szName[ 32 ], szItem[ 128 ];
get_user_name( id, szName, charsmax( szName ) );
ArrayData[ _iMARKET_COST ] = iCost;
ArrayData[ _iMARKET_INDEX ] = iItemIndex;
ArrayData[ _iMARKET_OWNER ] = id;
if( id < 1 )
{
/*
<^> Item added by the game itself.
*/
szName = "Market";
new szInfo[ 64 ];
if( id == 0 )
copy( szInfo, charsmax( szInfo ), g_mItemData[ iItemIndex ][ _szDATA_NAME ] );
else formatex( szInfo, charsmax( szInfo ), "\rMARKET GAMBLE SPECIAL" );
/*
<^> Setup item info - the item might have durability or not.
*/
if( g_mItemData[ iItemIndex ][ _bDATA_EQUIP ] )
{
ArrayData[ _iMARKET_DURABILITY ] = 100;
//formatex( szItem, charsmax( szItem ), "%s \y[ \w%%100 \rD/ \y] [ %s ] \R \r$%i", g_mItemData[ iItemIndex ][ _szDATA_NAME ], szName, iCost );
formatex( szItem, charsmax( szItem ), "%s \y[ %s ] \R \r$%i", szInfo, szName, iCost );
}
else
{
formatex( szItem, charsmax( szItem ), "%s \y[ %s ] \R \r$%i", g_mItemData[ iItemIndex ][ _szDATA_NAME ], szName, iCost );
}
}
else
{
/*
<^> Item added by a player.
*/
ArrayGetArray( g_aItemsPlayer[ id ], g_iTargetItem[ id ], ArrayData2 );
ArrayData[ _iMARKET_INDEX ] = ArrayData2[ _iITEMS_INDEX ];
if( g_mItemData[ ArrayData2[ _iITEMS_INDEX ] ][ _bDATA_EQUIP ] )
{
ArrayData[ _iMARKET_DURABILITY ] = ArrayData2[ _iITEMS_DURABILITY ];
formatex( szItem, charsmax( szItem ), "%s \y[ \w%%%i \rD/ \y] [ %s ] \R \r$%i", g_mItemData[ ArrayData2[ _iITEMS_INDEX ] ][ _szDATA_NAME ], floatround( ArrayData2[ _iITEMS_DURABILITY ] / g_mItemData[ ArrayData2[ _iITEMS_INDEX ] ][ _iDATA_DURABILITY ] * 100.0 ), szName, iCost );
}
else
{
formatex( szItem, charsmax( szItem ), "%s \y[ %s ] \R \r$%i", g_mItemData[ ArrayData2[ _iITEMS_INDEX ] ][ _szDATA_NAME ], szName, iCost );
}
}
/*
<^> Put the new data into the market array and Aad the item to the market menu.
*/
ArrayInsertArrayAfter( g_aItemsMarket, ArraySize( g_aItemsMarket ) - 1, ArrayData );
menu_additem( g_iMenuMarket, szItem );
if( id > 0 )
{
ArrayData2[ _IITEMS_QUANTITY ] --;
if( id )
{
if( ArrayData2[ _IITEMS_QUANTITY ] < 1 )
ArrayDeleteItem( g_aItemsPlayer[ id ], g_iTargetItem[ id ] );
else ArraySetArray( g_aItemsPlayer[ id ], g_iTargetItem[ id ], ArrayData2 );
}
}
}
GetCvarString( pCvar )
{
/*
<^> An easy way to return a cvar string without creating string arrays
all over the place.
*/
static szValue[ 32 ];
get_pcvar_string( g_pCvar[ pCvar ], szValue, charsmax( szValue ) );
return szValue;
}
Float:GetRoundTime()
{
return get_gametime() - g_flRoundStart;
}
HJB_LogAction( const id, const szInput[], any:... )
{
/*
<^> This is used to log certain actions such as a player buying an item,
selling an item, using an item or anything else that an a server
operator might like to log.
Essentially this is useful if a player is claiming that an item
has gone missing or something of the like.
*/
static file[ 64 ], ftime[ 16 ], name[ 32 ], auth[ 32 ];
format_time( ftime, charsmax( ftime ), "%m%d%Y");
format( file, charsmax( file ), "addons/amxmodx/logs/jailbreak_%s.log", ftime );
get_user_name( id, name, charsmax( name ) )
get_user_authid( id, auth, charsmax( auth ) );
static log[ 512 ];
vformat( log, charsmax( log ), szInput, 3 );
format( log, charsmax( log ), "%s [ %s ] :: %s", name, auth, log );
log_to_file( file, log );
}
bool:IsItemStandardSet( iItemIndex )
{
if( iItemIndex >= MAX_STANDARD_ITEMS )
return false;
return true;
}
UTIL_ScreenFade( id, iDuration, iHold, Flags, iRed, iGreen, iBlue, iAlpha )
{
message_begin( MSG_ONE_UNRELIABLE, g_iMsgScreenFade,{ 0, 0, 0 }, id );
write_short( iDuration );
write_short( iHold );
write_short( Flags );
write_byte( iRed );
write_byte( iGreen );
write_byte( iBlue );
write_byte( iAlpha );
message_end();
}
/*---------------------------------|
| Natives |
|---------------------------------*/
public plugin_natives()
{
register_native( "HJB_GiveUserItem", "_HJB_GiveUserItem", 1 );
register_native( "HJB_GiveUserCurrency", "_HJB_GiveUserCurrency", 1 );
register_native( "HJB_IsItemEquipped", "_HJB_IsItemEquipped", 1 );
register_native( "HJB_RegisterItem", "_HJB_RegisterItem" );
register_native( "ResetPlayerItems", "_ResetPlayerItems", 1 );
}
public _HJB_GiveUserCurrency( id, iAmount )
{
g_iPlayerCash[ id ] += iAmount;
Print( id, BLUE, "!t%L", id, "CURRENCY_RECEIVED", GetCvarString( CurrencyPreFix ), iAmount, GetCvarString( CurrencyPostFix ) );
SaveData( id );
}
public _HJB_GiveUserItem( id, iItemIndex, bool:Message )
{
/*
<^> This native gives a player an item.
*/
if( id <= 0 )
return PLUGIN_HANDLED;
if( iItemIndex == -1 )
{
/*
<^> This functionality of random item is not accessible if items are used
when purchased.
*/
if( g_pValue[ ItemUseInstantly ] )
return PLUGIN_HANDLED;
/*
<^> This determines the chance of what item you will get.
*/
new iChance = random_num( 1, 10 ), iItems[ sizeof g_mItemData - 1 ], iCount;
/*
<^> This first loop will check for items that have the certain grade
of chance from the standard set of item data.
*/
for( new i ; i < sizeof g_mItemData - 1 ; i ++ )
{
if( iChance >= g_mItemData[ i ][ _iDATA_CHANCE ] )
{
iItems[ iCount ] = i;
iCount ++;
}
}
/*
<^> The second loop will check for items that have the certain grade
of chance from the externally registered items from other plugins.
*/
new iSize = ArraySize( g_aItemData );
new ArrayData[ ItemData ];
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemData, i, ArrayData );
if( iChance >= ArrayData[ _iDATA_CHANCE ] )
{
iItems[ iCount ] = i + MAX_STANDARD_ITEMS;
iCount ++;
}
}
iItemIndex = iItems[ random_num( 0, iCount ) ];
}
if( Message )
Print( id, WHITE, "!t%L", id, "ITEM_RECEIVED", g_mItemData[ iItemIndex ][ _szDATA_NAME ] );
HJB_LogAction( id, "Received a %s", g_mItemData[ iItemIndex ][ _szDATA_NAME ] );
new ArrayData[ ItemsPlayer ], iSize = ArraySize( g_aItemsPlayer[ id ] );
/*
<^> Push the item into the player's item array.
*/
/*
<^> If item is equipable, give them another one.
*/
if( g_mItemData[ iItemIndex ][ _bDATA_EQUIP ] )
{
ArrayData[ _iITEMS_DURABILITY ] = g_mItemData[ iItemIndex ][ _iDATA_DURABILITY ];
ArrayData[ _iITEMS_INDEX ] = iItemIndex;
ArrayData[ _IITEMS_QUANTITY ] = 1;
ArrayData[ _bITEMS_EQUIPPED ] = false;
ArrayPushArray( g_aItemsPlayer[ id ], ArrayData );
SaveData( id );
/*
<^> Use the item instantly according to cvar.
*/
if( g_pValue[ ItemUseInstantly ] )
HandleItem( id, iItemIndex );
return 0;
}
/*
<^> If the item is use only, then add to the current quantity.
*/
for( new i ; i < iSize ; i ++ )
{
ArrayGetArray( g_aItemsPlayer[ id ], i, ArrayData );
if( ArrayData[ _iITEMS_INDEX ] == iItemIndex )
{
ArrayData[ _IITEMS_QUANTITY ] ++;
ArraySetArray( g_aItemsPlayer[ id ], i, ArrayData );
return -1;
}
}
ArrayData[ _iITEMS_INDEX ] = iItemIndex;
ArrayData[ _IITEMS_QUANTITY ] = 1;
ArrayData[ _iITEMS_DURABILITY ] = -1;
ArrayData[ _bITEMS_EQUIPPED ] = false;
ArrayPushArray( g_aItemsPlayer[ id ], ArrayData );
SaveData( id );
/*
<^> Use the item instantly according to cvar.
*/
if( g_pValue[ ItemUseInstantly ] )
HandleItem( id, iItemIndex );
return -1;
}
public _HJB_IsItemEquipped( id, iItem )
{
return g_iEquipData[ id ][ iItem ] ? true : false;
}
public _HJB_RegisterItem()
{
new ArrayData[ ItemData ];
get_string( 1, ArrayData[ _szDATA_NAME ], charsmax( ArrayData[ _szDATA_NAME ] ) );
ArrayData[ _iDATA_DURABILITY ] = get_param( 2 );
ArrayData[ _iDATA_CHANCE ] = get_param( 3 );
ArrayData[ _bDATA_EQUIP ] = bool:get_param( 4 );
get_string( 5, ArrayData[ _szDATA_INFO ], charsmax( ArrayData[ _szDATA_INFO ] ) );
new iSize = ArraySize( g_aItemData );
ArrayInsertArrayAfter( g_aItemData, iSize - 1, ArrayData );
return iSize;
}
Errors:
PHP Code:
AMX Mod X Compiler 1.8.3-dev+4968
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2013 AMX Mod X Team
Warning: Symbol is never used: "iSize2" on line 428
Warning: Symbol is never used: "iSize" on line 428
Warning: Symbol is never used: "iCount" on line 428
Warning: Symbol is assigned a value that is never used: "szValue" on line 427
Warning: Symbol is assigned a value that is never used: "szField" on line 427
Warning: Symbol is assigned a value that is never used: "ArrayData2" on line 426
Warning: Symbol is assigned a value that is never used: "ArrayData" on line 426
Warning: Symbol is never used: "MAX_SHOP_FIELDS" on line 424
Warning: Symbol "client_disconnect" is marked as deprecated: Use client_disconnected() instead. on line 578
Header size: 4108 bytes
Code size: 51820 bytes
Data size: 36000 bytes
Stack/heap size: 16384 bytes
Total requirements: 108312 bytes
9 Warnings.
Done.
Thats the code, I have tested many ways to solve the problem but i have not, if some1 can help me, amazing!
|
|