#pragma semicolon 1 #include #include #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); }