#pragma semicolon 1
#include <sourcemod>
#include <cstrike>
#define PLUGIN_VERSION "1.0"
#define ITEM_MAX_SIZE 128
enum ClassType
{
Speed = 0,
Gravity = 1,
Health = 2,
Color = 3
}
enum ItemType
{
Price,
Value,
Name
}
new String:szThingName[ClassType][128] = {
"speed",
"gravity",
"health",
"color"
};
new Handle:g_hDataBase = INVALID_HANDLE;
new Handle:g_hThingsContainer[ClassType][ItemType];
new String:szConfigPath[1024];
public Plugin:myinfo =
{
name = "Deathrun Shop",
author = "Push",
description = "Deathrun Bonuses Shop",
version = PLUGIN_VERSION,
url = "http://css-quad.ru"
};
public OnPluginStart()
{
for( new i = 0; i < any:(ClassType); i++ )
{
for( new j = 0; j < any:(ItemType); j++ )
{
g_hThingsContainer[i][j] = CreateArray();
}
}
BuildPath(Path_SM, szConfigPath, PLATFORM_MAX_PATH, "configs/drshop_menu.cfg");
LoadTranslations("drshop.phrases");
RegConsoleCmd("sm_drshop", BuyThings);
RegAdminCmd("sm_setpoints", SetPoints, ADMFLAG_ROOT);
decl String:szError[1024];
g_hDataBase = SQL_Connect("clientprefs", true, szError, sizeof(szError));
if( g_hDataBase != INVALID_HANDLE )
{
SQL_Query(g_hDataBase, "CREATE TABLE IF NOT EXISTS drshop ( steamid VARCHAR(64), value INT )");
}
else
{
LogError( szError );
}
UpdateCofig();
}
public OnPluginEnd()
{
CloseHandle( g_hDataBase );
for( new i = 0; i < any:(ClassType); i++ )
{
for( new j = 0; j < any:(ItemType); j++ )
{
CloseHandle( g_hThingsContainer[i][j] );
}
}
}
public Action:SetPoints(client, args)
{
if( args == 2 )
{
new String:szCmdArgs[256], String:szTargets[256], String:szAmount[32], index, amount;
GetCmdArg( 1, szCmdArgs, sizeof(szCmdArgs) );
GetCmdArg( 2, szAmount, sizeof(szAmount) );
BreakString( szCmdArgs, szTargets, sizeof(szTargets) );
amount = StringToInt( szAmount );
if (szTargets[0] == '"')
{
index = 1;
if (szTargets[strlen(szTargets)-1] == '"')
{
szTargets[strlen(szTargets)-1] = 0;
}
}
new targets[MaxClients];
new String:notUsed[2], bool:notUsedToo;
new count = ProcessTargetString( szTargets[index], client, targets, MaxClients, 0, notUsed, 1, notUsedToo );
if (count < 1)
{
ReplyToCommand(client, "No target found.");
return Plugin_Handled;
}
for( new i = 0; i < count; i++ )
{
SetPlayerPoints( targets[i], amount, true );
}
}
return Plugin_Handled;
}
public Action:BuyThings(client, args)
{
new Handle:hMenu = CreateMenu( SelectBonusType );
new String:szMenuName[128];
Format( szMenuName, sizeof( szMenuName ), "DeathRun Shop v%s", PLUGIN_VERSION );
SetMenuTitle( hMenu, szMenuName );
for( new i = 0; i < any:(ClassType); i++ )
{
decl String:szMenuItem[128], String:szItemId[8];
Format( szMenuItem, sizeof( szMenuItem ), "%t", szThingName[i] );
IntToString( i, szItemId, sizeof( szItemId ) );
AddMenuItem( hMenu, szItemId, szMenuItem );
}
SetMenuExitButton( hMenu, true );
DisplayMenu( hMenu, client, 10 );
return Plugin_Handled;
}
public SelectBonusType(Handle:hMenu, MenuAction:Msg, lParam, wParam)
{
decl String:szCommand[128];
switch( Msg )
{
case MenuAction_Select:
{
if( GetMenuItem( hMenu, wParam, szCommand, sizeof( szCommand ) ) )
{
new thingId = StringToInt(szCommand);
new Handle:hLocalMenu = CreateMenu( SelectBonusId );
new String:szMenuName[128];
Format( szMenuName, sizeof( szMenuName ), "%t", szThingName[thingId] );
SetMenuTitle( hLocalMenu, szMenuName );
for( new i = 0; i < GetArraySize( g_hThingsContainer[thingId][0] ); i++ )
{
new String:szName[ITEM_MAX_SIZE], itemType;
itemType = _:ItemType:Name;
GetArrayString( g_hThingsContainer[thingId][itemType], i , szName, sizeof( szName ) );
decl String:szMsg[32], String:szNameToBeDisp[128], String:szPrice[64];
Format( szMsg, sizeof(szMsg), "%d_%d", thingId, i );
itemType = _:ItemType:Price;
Format( szPrice, sizeof( szPrice ), "%t", "price", GetArrayCell( g_hThingsContainer[thingId][itemType], i ) );
Format( szNameToBeDisp, sizeof( szNameToBeDisp ), "%s, %s", szName, szPrice );
AddMenuItem( hLocalMenu,
szMsg,
szNameToBeDisp );
}
SetMenuExitButton( hLocalMenu, true );
DisplayMenu( hLocalMenu, lParam, MENU_TIME_FOREVER );
}
}
case MenuAction_End:
{
CloseHandle( hMenu );
}
}
}
public SelectBonusId(Handle:hMenu, MenuAction:Msg, lParam, wParam)
{
decl String:szCommand[128];
switch( Msg )
{
case MenuAction_Select:
{
if( GetMenuItem( hMenu, wParam, szCommand, sizeof( szCommand ) ) )
{
decl String:szInfoOfItem[2][16];
new String:szItemName[ITEM_MAX_SIZE], String:szItemValue[ITEM_MAX_SIZE];
ExplodeString( szCommand, "_", szInfoOfItem, 2, 16 );
new classType = StringToInt( szInfoOfItem[0] );
new itemId = StringToInt( szInfoOfItem[1] );
new itemType = _:ItemType:Name;
GetArrayString( g_hThingsContainer[classType][itemType], itemId, szItemName, sizeof( szItemName ) );
itemType = _:ItemType:Value;
GetArrayString( g_hThingsContainer[classType][itemType], itemId, szItemValue, sizeof( szItemName ) );
if( classType == _:ClassType:Speed )
{
SetPlayerSpeed( lParam, StringToFloat( szItemValue ) );
}
else if( classType == _:ClassType:Gravity )
{
SetPlayerGravity( lParam, StringToFloat( szItemValue ) );
}
else if( classType == _:ClassType:Health )
{
AddPlayerHealth( lParam, StringToInt( szItemValue ) );
}
else if( classType == _:ClassType:Color )
{
decl String:szRGBA[4][16];
ExplodeString( szItemValue, " ", szRGBA, 4, 16 );
SetPlayerColor( lParam, StringToInt( szRGBA[0] ), StringToInt( szRGBA[1] ), StringToInt( szRGBA[2] ), StringToInt( szRGBA[3] ) );
}
}
DisplayMenuAtItem( hMenu, lParam, GetMenuSelectionPosition(), MENU_TIME_FOREVER );
}
case MenuAction_End:
{
if( lParam != MenuEnd_Selected )
{
CloseHandle( hMenu );
}
}
}
}
stock UpdateCofig()
{
new Handle:kv = CreateKeyValues("Things");
FileToKeyValues(kv, szConfigPath);
if(!KvGotoFirstSubKey(kv))
{
SetFailState("Error in key values");
}
new String:szBonusType[128];
do
{
KvGetSectionName(kv, szBonusType, sizeof(szBonusType));
if(!KvGotoFirstSubKey(kv))
{
SetFailState("Error in key values");
}
new String:szBonusID[ITEM_MAX_SIZE];
do
{
decl String:szValue[ITEM_MAX_SIZE], String:szName[ITEM_MAX_SIZE], priceOfItem, typeOfClass;
KvGetSectionName( kv, szBonusID, sizeof( szBonusID ) );
if( StrEqual( szBonusType, szThingName[ClassType:Speed] ) )
{
if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
{
KvGetString( kv, "value", szValue, sizeof( szValue ) );
strcopy( szName, ITEM_MAX_SIZE, szBonusID );
priceOfItem = KvGetNum( kv, "price" );
typeOfClass = _:ClassType:Speed;
}
else
{
SetFailState( "Check your config." );
}
}
else if( StrEqual( szBonusType, szThingName[ClassType:Gravity] ) )
{
if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
{
KvGetString( kv, "value", szValue, sizeof( szValue ) );
strcopy( szName, ITEM_MAX_SIZE, szBonusID );
priceOfItem = KvGetNum( kv, "price" );
typeOfClass = _:ClassType:Gravity;
}
else
{
SetFailState( "Check your config." );
}
}
else if( StrEqual( szBonusType, szThingName[ClassType:Health] ) )
{
if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
{
KvGetString( kv, "value", szValue, sizeof( szValue ) );
strcopy( szName, ITEM_MAX_SIZE, szBonusID );
priceOfItem = KvGetNum( kv, "price" );
typeOfClass = _:ClassType:Health;
}
else
{
SetFailState( "Check your config." );
}
}
else if( StrEqual( szBonusType, szThingName[ClassType:Color] ) )
{
if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
{
KvGetString( kv, "value", szValue, sizeof( szValue ) );
strcopy( szName, ITEM_MAX_SIZE, szBonusID );
priceOfItem = KvGetNum( kv, "price" );
typeOfClass = _:ClassType:Color;
}
else
{
SetFailState( "Check your config." );
}
}
new itemType = _:ItemType:Price;
PushArrayCell( g_hThingsContainer[typeOfClass][itemType], priceOfItem );
itemType = _:ItemType:Value;
PushArrayString( g_hThingsContainer[typeOfClass][itemType], szValue);
itemType = _:ItemType:Name;
PushArrayString( g_hThingsContainer[typeOfClass][itemType], szName);
} while( KvGotoNextKey( kv ) );
KvGoBack( kv );
} while( KvGotoNextKey( kv ) );
}
stock GetPlayerPoints( client )
{
if( g_hDataBase == INVALID_HANDLE )
{
LogError("Database is not initialized.");
return any:0;
}
new String:szAuth[64], String:szQuery[256];
GetClientAuthString( client, szAuth, sizeof(szAuth) );
Format( szQuery, sizeof(szQuery), "SELECT value FROM drshop WHERE steamid = '%s'", szAuth );
new Handle:hQuery = SQL_Query( g_hDataBase, szQuery );
if( SQL_FetchRow( hQuery ) )
{
return any:SQL_FetchInt( hQuery, 0 );
}
return 0;
}
stock void:SetPlayerPoints( client, value, bool:type )
{
if( g_hDataBase == INVALID_HANDLE )
{
LogError("Database is not initialized.");
}
new String:szAuth[64], String:szQuery[256];
GetClientAuthString( client, szAuth, sizeof(szAuth) );
Format( szQuery, sizeof( szQuery ), "SELECT * FROM drshop WHERE steamid = '%s'", szAuth );
new Handle:hQuery = SQL_Query( g_hDataBase, szQuery );
if( SQL_FetchRow( hQuery ) )
{
if( !type )
{
if( value < 0 )
{
Format( szQuery, sizeof( szQuery ), "UPDATE drshop SET value = value + %d WHERE steamid = '%s'", value, szAuth );
}
else
{
Format( szQuery, sizeof( szQuery ), "UPDATE drshop SET value = value + %d WHERE steamid = '%s'", value, szAuth );
}
}
else
{
Format( szQuery, sizeof( szQuery ), "UPDATE drshop SET value = %d WHERE steamid = '%s'", value, szAuth );
}
SQL_FastQuery( g_hDataBase, szQuery );
}
else
{
Format( szQuery, sizeof(szQuery), "INSERT INTO drshop ( steamid, value ) VALUES ('%s', %d)", szAuth, 0 );
SQL_FastQuery( g_hDataBase, szQuery );
}
CloseHandle( hQuery );
}
stock SetPlayerSpeed( client, Float:fSpeed )
{
SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", fSpeed);
}
stock SetPlayerGravity( client, Float:fGravity )
{
SetEntityGravity( client, fGravity );
}
stock AddPlayerHealth( client, health )
{
SetEntityHealth( client, GetClientHealth( client ) + health );
}
stock SetPlayerColor( client, r, g, b, a )
{
SetEntityRenderMode(client, RENDER_TRANSCOLOR);
SetEntityRenderColor(client, r, g, b, a);
}
Comments