Pushok

Untitled

Sep 24th, 2011
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.15 KB | None | 0 0
  1. #pragma semicolon 1
  2.  
  3. #include <sourcemod>
  4. #include <cstrike>
  5.  
  6. #define PLUGIN_VERSION "1.0"
  7.  
  8. #define ITEM_MAX_SIZE 128
  9.  
  10. enum ClassType
  11. {
  12. Speed = 0,
  13. Gravity = 1,
  14. Health = 2,
  15. Color = 3
  16. }
  17.  
  18. enum ItemType
  19. {
  20. Price,
  21. Value,
  22. Name
  23. }
  24.  
  25. new String:szThingName[ClassType][128] = {
  26. "speed",
  27. "gravity",
  28. "health",
  29. "color"
  30. };
  31.  
  32. new Handle:g_hDataBase = INVALID_HANDLE;
  33. new Handle:g_hThingsContainer[ClassType][ItemType];
  34.  
  35. new String:szConfigPath[1024];
  36.  
  37. public Plugin:myinfo =
  38. {
  39. name = "Deathrun Shop",
  40. author = "Push",
  41. description = "Deathrun Bonuses Shop",
  42. version = PLUGIN_VERSION,
  43. url = "http://css-quad.ru"
  44. };
  45.  
  46. public OnPluginStart()
  47. {
  48. for( new i = 0; i < any:(ClassType); i++ )
  49. {
  50. for( new j = 0; j < any:(ItemType); j++ )
  51. {
  52. g_hThingsContainer[i][j] = CreateArray();
  53. }
  54. }
  55.  
  56. BuildPath(Path_SM, szConfigPath, PLATFORM_MAX_PATH, "configs/drshop_menu.cfg");
  57.  
  58. LoadTranslations("drshop.phrases");
  59.  
  60. RegConsoleCmd("sm_drshop", BuyThings);
  61. RegAdminCmd("sm_setpoints", SetPoints, ADMFLAG_ROOT);
  62.  
  63. decl String:szError[1024];
  64.  
  65. g_hDataBase = SQL_Connect("clientprefs", true, szError, sizeof(szError));
  66.  
  67. if( g_hDataBase != INVALID_HANDLE )
  68. {
  69. SQL_Query(g_hDataBase, "CREATE TABLE IF NOT EXISTS drshop ( steamid VARCHAR(64), value INT )");
  70. }
  71. else
  72. {
  73. LogError( szError );
  74. }
  75.  
  76. UpdateCofig();
  77. }
  78.  
  79. public OnPluginEnd()
  80. {
  81. CloseHandle( g_hDataBase );
  82.  
  83. for( new i = 0; i < any:(ClassType); i++ )
  84. {
  85. for( new j = 0; j < any:(ItemType); j++ )
  86. {
  87. CloseHandle( g_hThingsContainer[i][j] );
  88. }
  89. }
  90. }
  91.  
  92. public Action:SetPoints(client, args)
  93. {
  94. if( args == 2 )
  95. {
  96. new String:szCmdArgs[256], String:szTargets[256], String:szAmount[32], index, amount;
  97.  
  98. GetCmdArg( 1, szCmdArgs, sizeof(szCmdArgs) );
  99. GetCmdArg( 2, szAmount, sizeof(szAmount) );
  100. BreakString( szCmdArgs, szTargets, sizeof(szTargets) );
  101.  
  102. amount = StringToInt( szAmount );
  103.  
  104. if (szTargets[0] == '"')
  105. {
  106. index = 1;
  107.  
  108. if (szTargets[strlen(szTargets)-1] == '"')
  109. {
  110. szTargets[strlen(szTargets)-1] = 0;
  111. }
  112. }
  113.  
  114. new targets[MaxClients];
  115. new String:notUsed[2], bool:notUsedToo;
  116.  
  117. new count = ProcessTargetString( szTargets[index], client, targets, MaxClients, 0, notUsed, 1, notUsedToo );
  118.  
  119. if (count < 1)
  120. {
  121. ReplyToCommand(client, "No target found.");
  122. return Plugin_Handled;
  123. }
  124.  
  125. for( new i = 0; i < count; i++ )
  126. {
  127. SetPlayerPoints( targets[i], amount, true );
  128. }
  129. }
  130.  
  131. return Plugin_Handled;
  132. }
  133.  
  134. public Action:BuyThings(client, args)
  135. {
  136. new Handle:hMenu = CreateMenu( SelectBonusType );
  137. new String:szMenuName[128];
  138.  
  139. Format( szMenuName, sizeof( szMenuName ), "DeathRun Shop v%s", PLUGIN_VERSION );
  140.  
  141. SetMenuTitle( hMenu, szMenuName );
  142.  
  143. for( new i = 0; i < any:(ClassType); i++ )
  144. {
  145. decl String:szMenuItem[128], String:szItemId[8];
  146.  
  147. Format( szMenuItem, sizeof( szMenuItem ), "%t", szThingName[i] );
  148. IntToString( i, szItemId, sizeof( szItemId ) );
  149.  
  150. AddMenuItem( hMenu, szItemId, szMenuItem );
  151. }
  152.  
  153. SetMenuExitButton( hMenu, true );
  154. DisplayMenu( hMenu, client, 10 );
  155.  
  156. return Plugin_Handled;
  157. }
  158.  
  159. public SelectBonusType(Handle:hMenu, MenuAction:Msg, lParam, wParam)
  160. {
  161. decl String:szCommand[128];
  162.  
  163. switch( Msg )
  164. {
  165. case MenuAction_Select:
  166. {
  167. if( GetMenuItem( hMenu, wParam, szCommand, sizeof( szCommand ) ) )
  168. {
  169. new thingId = StringToInt(szCommand);
  170.  
  171. new Handle:hLocalMenu = CreateMenu( SelectBonusId );
  172. new String:szMenuName[128];
  173.  
  174. Format( szMenuName, sizeof( szMenuName ), "%t", szThingName[thingId] );
  175. SetMenuTitle( hLocalMenu, szMenuName );
  176.  
  177. for( new i = 0; i < GetArraySize( g_hThingsContainer[thingId][0] ); i++ )
  178. {
  179. new String:szName[ITEM_MAX_SIZE], itemType;
  180.  
  181. itemType = _:ItemType:Name;
  182. GetArrayString( g_hThingsContainer[thingId][itemType], i , szName, sizeof( szName ) );
  183.  
  184. decl String:szMsg[32], String:szNameToBeDisp[128], String:szPrice[64];
  185.  
  186. Format( szMsg, sizeof(szMsg), "%d_%d", thingId, i );
  187. itemType = _:ItemType:Price;
  188. Format( szPrice, sizeof( szPrice ), "%t", "price", GetArrayCell( g_hThingsContainer[thingId][itemType], i ) );
  189. Format( szNameToBeDisp, sizeof( szNameToBeDisp ), "%s, %s", szName, szPrice );
  190.  
  191. AddMenuItem( hLocalMenu,
  192. szMsg,
  193. szNameToBeDisp );
  194. }
  195.  
  196. SetMenuExitButton( hLocalMenu, true );
  197. DisplayMenu( hLocalMenu, lParam, MENU_TIME_FOREVER );
  198. }
  199. }
  200. case MenuAction_End:
  201. {
  202. CloseHandle( hMenu );
  203. }
  204. }
  205. }
  206.  
  207. public SelectBonusId(Handle:hMenu, MenuAction:Msg, lParam, wParam)
  208. {
  209. decl String:szCommand[128];
  210.  
  211. switch( Msg )
  212. {
  213. case MenuAction_Select:
  214. {
  215. if( GetMenuItem( hMenu, wParam, szCommand, sizeof( szCommand ) ) )
  216. {
  217. decl String:szInfoOfItem[2][16];
  218. new String:szItemName[ITEM_MAX_SIZE], String:szItemValue[ITEM_MAX_SIZE];
  219.  
  220. ExplodeString( szCommand, "_", szInfoOfItem, 2, 16 );
  221.  
  222. new classType = StringToInt( szInfoOfItem[0] );
  223. new itemId = StringToInt( szInfoOfItem[1] );
  224.  
  225. new itemType = _:ItemType:Name;
  226. GetArrayString( g_hThingsContainer[classType][itemType], itemId, szItemName, sizeof( szItemName ) );
  227. itemType = _:ItemType:Value;
  228. GetArrayString( g_hThingsContainer[classType][itemType], itemId, szItemValue, sizeof( szItemName ) );
  229.  
  230. if( classType == _:ClassType:Speed )
  231. {
  232. SetPlayerSpeed( lParam, StringToFloat( szItemValue ) );
  233. }
  234. else if( classType == _:ClassType:Gravity )
  235. {
  236. SetPlayerGravity( lParam, StringToFloat( szItemValue ) );
  237. }
  238. else if( classType == _:ClassType:Health )
  239. {
  240. AddPlayerHealth( lParam, StringToInt( szItemValue ) );
  241. }
  242. else if( classType == _:ClassType:Color )
  243. {
  244. decl String:szRGBA[4][16];
  245.  
  246. ExplodeString( szItemValue, " ", szRGBA, 4, 16 );
  247. SetPlayerColor( lParam, StringToInt( szRGBA[0] ), StringToInt( szRGBA[1] ), StringToInt( szRGBA[2] ), StringToInt( szRGBA[3] ) );
  248. }
  249. }
  250.  
  251. DisplayMenuAtItem( hMenu, lParam, GetMenuSelectionPosition(), MENU_TIME_FOREVER );
  252. }
  253.  
  254. case MenuAction_End:
  255. {
  256. if( lParam != MenuEnd_Selected )
  257. {
  258. CloseHandle( hMenu );
  259. }
  260. }
  261. }
  262. }
  263.  
  264. stock UpdateCofig()
  265. {
  266. new Handle:kv = CreateKeyValues("Things");
  267. FileToKeyValues(kv, szConfigPath);
  268.  
  269. if(!KvGotoFirstSubKey(kv))
  270. {
  271. SetFailState("Error in key values");
  272. }
  273.  
  274. new String:szBonusType[128];
  275.  
  276. do
  277. {
  278.  
  279. KvGetSectionName(kv, szBonusType, sizeof(szBonusType));
  280.  
  281. if(!KvGotoFirstSubKey(kv))
  282. {
  283. SetFailState("Error in key values");
  284. }
  285.  
  286. new String:szBonusID[ITEM_MAX_SIZE];
  287.  
  288. do
  289. {
  290. decl String:szValue[ITEM_MAX_SIZE], String:szName[ITEM_MAX_SIZE], priceOfItem, typeOfClass;
  291.  
  292. KvGetSectionName( kv, szBonusID, sizeof( szBonusID ) );
  293.  
  294. if( StrEqual( szBonusType, szThingName[ClassType:Speed] ) )
  295. {
  296. if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
  297. {
  298.  
  299. KvGetString( kv, "value", szValue, sizeof( szValue ) );
  300. strcopy( szName, ITEM_MAX_SIZE, szBonusID );
  301.  
  302. priceOfItem = KvGetNum( kv, "price" );
  303.  
  304. typeOfClass = _:ClassType:Speed;
  305. }
  306. else
  307. {
  308. SetFailState( "Check your config." );
  309. }
  310. }
  311. else if( StrEqual( szBonusType, szThingName[ClassType:Gravity] ) )
  312. {
  313. if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
  314. {
  315. KvGetString( kv, "value", szValue, sizeof( szValue ) );
  316. strcopy( szName, ITEM_MAX_SIZE, szBonusID );
  317.  
  318. priceOfItem = KvGetNum( kv, "price" );
  319.  
  320. typeOfClass = _:ClassType:Gravity;
  321. }
  322. else
  323. {
  324. SetFailState( "Check your config." );
  325. }
  326. }
  327. else if( StrEqual( szBonusType, szThingName[ClassType:Health] ) )
  328. {
  329. if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
  330. {
  331. KvGetString( kv, "value", szValue, sizeof( szValue ) );
  332. strcopy( szName, ITEM_MAX_SIZE, szBonusID );
  333.  
  334. priceOfItem = KvGetNum( kv, "price" );
  335.  
  336. typeOfClass = _:ClassType:Health;
  337. }
  338. else
  339. {
  340. SetFailState( "Check your config." );
  341. }
  342. }
  343. else if( StrEqual( szBonusType, szThingName[ClassType:Color] ) )
  344. {
  345. if( KvGetDataType( kv, "value" ) != KvData_None && KvGetDataType( kv, "price" ) != KvData_None)
  346. {
  347. KvGetString( kv, "value", szValue, sizeof( szValue ) );
  348. strcopy( szName, ITEM_MAX_SIZE, szBonusID );
  349.  
  350. priceOfItem = KvGetNum( kv, "price" );
  351.  
  352. typeOfClass = _:ClassType:Color;
  353. }
  354. else
  355. {
  356. SetFailState( "Check your config." );
  357. }
  358. }
  359.  
  360. new itemType = _:ItemType:Price;
  361.  
  362. PushArrayCell( g_hThingsContainer[typeOfClass][itemType], priceOfItem );
  363. itemType = _:ItemType:Value;
  364. PushArrayString( g_hThingsContainer[typeOfClass][itemType], szValue);
  365. itemType = _:ItemType:Name;
  366. PushArrayString( g_hThingsContainer[typeOfClass][itemType], szName);
  367.  
  368. } while( KvGotoNextKey( kv ) );
  369. KvGoBack( kv );
  370.  
  371. } while( KvGotoNextKey( kv ) );
  372. }
  373.  
  374. stock GetPlayerPoints( client )
  375. {
  376. if( g_hDataBase == INVALID_HANDLE )
  377. {
  378. LogError("Database is not initialized.");
  379. return any:0;
  380. }
  381.  
  382. new String:szAuth[64], String:szQuery[256];
  383. GetClientAuthString( client, szAuth, sizeof(szAuth) );
  384.  
  385. Format( szQuery, sizeof(szQuery), "SELECT value FROM drshop WHERE steamid = '%s'", szAuth );
  386. new Handle:hQuery = SQL_Query( g_hDataBase, szQuery );
  387.  
  388. if( SQL_FetchRow( hQuery ) )
  389. {
  390. return any:SQL_FetchInt( hQuery, 0 );
  391. }
  392.  
  393. return 0;
  394. }
  395.  
  396. stock void:SetPlayerPoints( client, value, bool:type )
  397. {
  398. if( g_hDataBase == INVALID_HANDLE )
  399. {
  400. LogError("Database is not initialized.");
  401. }
  402.  
  403. new String:szAuth[64], String:szQuery[256];
  404. GetClientAuthString( client, szAuth, sizeof(szAuth) );
  405.  
  406. Format( szQuery, sizeof( szQuery ), "SELECT * FROM drshop WHERE steamid = '%s'", szAuth );
  407.  
  408. new Handle:hQuery = SQL_Query( g_hDataBase, szQuery );
  409.  
  410. if( SQL_FetchRow( hQuery ) )
  411. {
  412. if( !type )
  413. {
  414. if( value < 0 )
  415. {
  416. Format( szQuery, sizeof( szQuery ), "UPDATE drshop SET value = value + %d WHERE steamid = '%s'", value, szAuth );
  417. }
  418. else
  419. {
  420. Format( szQuery, sizeof( szQuery ), "UPDATE drshop SET value = value + %d WHERE steamid = '%s'", value, szAuth );
  421. }
  422. }
  423. else
  424. {
  425. Format( szQuery, sizeof( szQuery ), "UPDATE drshop SET value = %d WHERE steamid = '%s'", value, szAuth );
  426. }
  427.  
  428. SQL_FastQuery( g_hDataBase, szQuery );
  429. }
  430. else
  431. {
  432. Format( szQuery, sizeof(szQuery), "INSERT INTO drshop ( steamid, value ) VALUES ('%s', %d)", szAuth, 0 );
  433. SQL_FastQuery( g_hDataBase, szQuery );
  434. }
  435.  
  436. CloseHandle( hQuery );
  437. }
  438.  
  439. stock SetPlayerSpeed( client, Float:fSpeed )
  440. {
  441. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", fSpeed);
  442. }
  443.  
  444. stock SetPlayerGravity( client, Float:fGravity )
  445. {
  446. SetEntityGravity( client, fGravity );
  447. }
  448.  
  449. stock AddPlayerHealth( client, health )
  450. {
  451. SetEntityHealth( client, GetClientHealth( client ) + health );
  452. }
  453.  
  454. stock SetPlayerColor( client, r, g, b, a )
  455. {
  456. SetEntityRenderMode(client, RENDER_TRANSCOLOR);
  457.  
  458. SetEntityRenderColor(client, r, g, b, a);
  459. }
Advertisement
Add Comment
Please, Sign In to add comment