Pushok icon

Untitled

Pushok | PRO | 09/24/11 02:54:58 PM UTC | 0 ⭐ | 513 👁️ | Never ⏰ | []
text |

11.15 KB

|

None

|

0 👍

/

0 👎

#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