criszeu

sank

Aug 14th, 2020
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.37 KB | None | 0 0
  1. #include <hattrick_csgo>
  2.  
  3. public Plugin myinfo =
  4. {
  5. name = "sank_sounds",
  6. author = "Hattrick HKS",
  7. description = "Provides Sank Sounds",
  8. version = "2.0",
  9. url = "http://hattrick.go.ro/"
  10. };
  11.  
  12. native bool IsClientVIP(int iId);
  13. native bool IsUserGagged(int iId);
  14. native bool HasClientSoundsEnabled(int iId);
  15. native Handle GetMainDbHandle();
  16.  
  17. Handle g_pKeys = INVALID_HANDLE;
  18. Handle g_pSounds = INVALID_HANDLE;
  19. Handle g_pPrecached = INVALID_HANDLE;
  20. Handle g_pChances = INVALID_HANDLE;
  21.  
  22. char g_Buffer[PLATFORM_MAX_PATH] = "";
  23. Handle g_pDb = INVALID_HANDLE;
  24.  
  25. bool g_Enabled = false;
  26.  
  27. int g_maxSoundsPerRound = 0;
  28. char g_AccessToAvoidSankSoundsCheck[MAX_NAME_LENGTH] = "";
  29. char g_AccessToPlaySankSoundsCheck[MAX_NAME_LENGTH] = "";
  30.  
  31. int g_Count[MAXPLAYERS + 1] = { 0, ... };
  32.  
  33. Handle __GetMainDbHandle()
  34. {
  35. return CanTestFeatures() && \
  36. GetFeatureStatus(FeatureType_Native, "GetMainDbHandle") == FeatureStatus_Available ? \
  37. GetMainDbHandle() : INVALID_HANDLE;
  38. }
  39.  
  40. public void OnPluginStart()
  41. {
  42. RegConsoleCmd("say", OnSay);
  43.  
  44. HookEventEx("announce_phase_end", DisabPlugin);
  45. HookEventEx("cs_intermission", DisabPlugin);
  46. HookEventEx("cs_win_panel_match", DisabPlugin);
  47. HookEventEx("start_halftime", DisabPlugin);
  48.  
  49. HookEventEx("round_start", EnabPlugin);
  50.  
  51. g_pKeys = CreateArray(MAX_NAME_LENGTH);
  52. g_pSounds = CreateArray(PLATFORM_MAX_PATH);
  53. g_pPrecached = CreateArray(PLATFORM_MAX_PATH);
  54. g_pChances = CreateArray(MAX_NAME_LENGTH);
  55. }
  56.  
  57. public void OnClientPutInServer(int Id)
  58. {
  59. static Handle pPack = INVALID_HANDLE;
  60. static int Iter = 0, Size = 0, Chance = 0;
  61. static char Steam[MAX_NAME_LENGTH], Extracted[MAX_NAME_LENGTH], \
  62. Object[MAX_NAME_LENGTH], Sample[PLATFORM_MAX_PATH];
  63. static char Container[MAX_NAME_LENGTH][PLATFORM_MAX_PATH];
  64. static int iContainer[MAX_NAME_LENGTH] = { 0, ... };
  65. static int iContainerSize = 0;
  66.  
  67. Size = GetArraySize(g_pKeys);
  68.  
  69. if (Size > 0 && \
  70. Id >= 1 && \
  71. Id <= MaxClients)
  72. {
  73. iContainerSize = 0;
  74.  
  75. g_Count[Id] = 0;
  76.  
  77. GetClientAuthId(Id, AuthId_Engine, Steam, sizeof(Steam));
  78. hCSGO_ExtractSteamID(Steam, Extracted, sizeof(Extracted));
  79.  
  80. for (Iter = 0; Iter < Size; Iter++)
  81. {
  82. GetArrayString(g_pKeys, Iter, Object, sizeof(Object));
  83.  
  84. if (StrContains(Object, Extracted, false) != -1)
  85. {
  86. GetArrayString(g_pSounds, Iter, Container[iContainerSize], PLATFORM_MAX_PATH);
  87.  
  88. iContainer[iContainerSize++] = GetArrayCell(g_pChances, Iter);
  89. }
  90. }
  91.  
  92. if (iContainerSize > 0)
  93. {
  94. Iter = GetRandomInt(0, iContainerSize - 1);
  95.  
  96. FormatEx(Sample, sizeof(Sample), Container[Iter]);
  97. Chance = iContainer[Iter];
  98.  
  99. if (GetRandomInt(0, Chance) == 0)
  100. {
  101. pPack = CreateDataPack();
  102.  
  103. if (pPack != INVALID_HANDLE)
  104. {
  105. WritePackCell(pPack, Id);
  106. WritePackString(pPack, Sample);
  107.  
  108. CreateTimer(GetRandomFloat(4.0, 8.0), playJoinSound, pPack);
  109. }
  110. }
  111. }
  112. }
  113. }
  114.  
  115. public Action playJoinSound(Handle pTimer, any pPack)
  116. {
  117. static int Id = INVALID_ENT_REFERENCE, Other = INVALID_ENT_REFERENCE;
  118. static char Sample[PLATFORM_MAX_PATH];
  119.  
  120. ResetPack(pPack);
  121.  
  122. Id = ReadPackCell(pPack);
  123. ReadPackString(pPack, Sample, sizeof(Sample));
  124.  
  125. CloseHandle(pPack);
  126. pPack = INVALID_HANDLE;
  127.  
  128. if (!g_Enabled || \
  129. !IsClientInGame(Id))
  130. {
  131. return Plugin_Continue;
  132. }
  133.  
  134. for (Other = 1; Other <= MaxClients; Other++)
  135. {
  136. if (HasClientSoundsEnabled(Other))
  137. {
  138. hCSGO_PlaySound(Other, Sample);
  139.  
  140. PrintToChat(Other, "*\x02 *******************************");
  141. PrintToChat(Other, "*\x02 BOSS\x05 %N\x02 JOINED", Id);
  142. }
  143. }
  144.  
  145. return Plugin_Continue;
  146. }
  147.  
  148. public void DisabPlugin(Handle pHndl, const char[] Name, bool bNoBCast)
  149. {
  150. g_Enabled = false;
  151. }
  152.  
  153. public void EnabPlugin(Handle pHndl, const char[] Name, bool bNoBCast)
  154. {
  155. static int iId = INVALID_ENT_REFERENCE;
  156.  
  157. for (iId = 1; iId <= MaxClients; iId++)
  158. g_Count[iId] = 0;
  159.  
  160. g_Enabled = true;
  161. }
  162.  
  163. public void OnMapStart()
  164. {
  165. g_Enabled = false;
  166.  
  167. LoadSankSounds();
  168.  
  169. hCSGO_GetOptFromFileChar("configs/hattrick.core.txt", \
  170. "m_szAccessToPlaySankSoundsCheck", \
  171. g_AccessToPlaySankSoundsCheck, \
  172. sizeof(g_AccessToPlaySankSoundsCheck));
  173.  
  174. hCSGO_GetOptFromFileChar("configs/hattrick.core.txt", \
  175. "m_szAccessToAvoidSankSoundsCheck", \
  176. g_AccessToAvoidSankSoundsCheck, \
  177. sizeof(g_AccessToAvoidSankSoundsCheck));
  178.  
  179. g_maxSoundsPerRound = hCSGO_ClampInt(hCSGO_GetOptFromFileInt("configs/hattrick.core.txt", \
  180. "m_uMaxSankSoundsPerRound"), \
  181. 1, \
  182. 999999);
  183. }
  184.  
  185. public void OnMapEnd()
  186. {
  187. g_Enabled = false;
  188. }
  189.  
  190. public Action OnSay(int Client, int Args)
  191. {
  192. static int Size = 0, Iterator = 0, Id = INVALID_ENT_REFERENCE, Len = 0;
  193. static char Arg[MAX_NAME_LENGTH], Object[MAX_NAME_LENGTH], Buffer[PLATFORM_MAX_PATH];
  194. static bool bDone = false;
  195.  
  196. if (!g_Enabled || \
  197. !HasClientSoundsEnabled(Client) || \
  198. IsUserGagged(Client))
  199. {
  200. return Plugin_Continue;
  201. }
  202.  
  203. if (IsClientVIP(Client) || \
  204. CheckCommandAccess(Client, g_AccessToPlaySankSoundsCheck, ADMFLAG_BAN))
  205. {
  206. GetCmdArgString(Arg, sizeof(Arg));
  207.  
  208. if ((Len = hCSGO_ClearLine(Arg)) <= 32 && \
  209. Len > 0 && \
  210. StrContains(Arg, "STEAM_", false) == -1)
  211. {
  212. Size = GetArraySize(g_pKeys);
  213.  
  214. if (Size > 0)
  215. {
  216. bDone = false;
  217.  
  218. for (Iterator = 0; Iterator < Size; Iterator++)
  219. {
  220. GetArrayString(g_pKeys, Iterator, Object, sizeof(Object));
  221.  
  222. if (strcmp(Arg, Object, false) == 0)
  223. {
  224. if (!hCSGO_IsWarmup() && \
  225. !CheckCommandAccess(Client, g_AccessToAvoidSankSoundsCheck, ADMFLAG_ROOT) && \
  226. g_Count[Client]++ >= g_maxSoundsPerRound)
  227. {
  228. return Plugin_Continue;
  229. }
  230.  
  231. GetArrayString(g_pSounds, Iterator, Buffer, sizeof(Buffer));
  232.  
  233. for (Id = 1; Id <= MaxClients; Id++)
  234. {
  235. if (HasClientSoundsEnabled(Id))
  236. {
  237. hCSGO_PlaySound(Id, Buffer);
  238. }
  239. }
  240.  
  241. bDone = true;
  242. break;
  243. }
  244. }
  245.  
  246. if (!bDone)
  247. {
  248. for (Iterator = 0; Iterator < Size; Iterator++)
  249. {
  250. GetArrayString(g_pKeys, Iterator, Object, sizeof(Object));
  251.  
  252. Len = strlen(Object);
  253.  
  254. if (strncmp(Arg, Object, Len, false) == 0)
  255. {
  256. if (Len <= 3 && \
  257. Arg[Len] != ' ' && \
  258. Arg[Len] != EOS)
  259. {
  260. continue;
  261. }
  262.  
  263. if (!hCSGO_IsWarmup() && \
  264. !CheckCommandAccess(Client, g_AccessToAvoidSankSoundsCheck, ADMFLAG_ROOT) && \
  265. g_Count[Client]++ >= g_maxSoundsPerRound)
  266. {
  267. return Plugin_Continue;
  268. }
  269.  
  270. GetArrayString(g_pSounds, Iterator, Buffer, sizeof(Buffer));
  271.  
  272. for (Id = 1; Id <= MaxClients; Id++)
  273. {
  274. if (HasClientSoundsEnabled(Id))
  275. {
  276. hCSGO_PlaySound(Id, Buffer);
  277. }
  278. }
  279.  
  280. break;
  281. }
  282. }
  283. }
  284. }
  285. }
  286. }
  287.  
  288. return Plugin_Continue;
  289. }
  290.  
  291. bool IsFilePrecached(char[] fileName = "")
  292. {
  293. static int Size = 0, Iter = 0;
  294. static char Object[PLATFORM_MAX_PATH];
  295.  
  296. Size = GetArraySize(g_pPrecached);
  297.  
  298. if (Size < 1)
  299. {
  300. return false;
  301. }
  302.  
  303. for (Iter = 0; Iter < Size; Iter++)
  304. {
  305. GetArrayString(g_pPrecached, Iter, Object, sizeof(Object));
  306.  
  307. if (strcmp(Object, fileName, false) == 0)
  308. {
  309. return true;
  310. }
  311. }
  312.  
  313. return false;
  314. }
  315.  
  316. bool LoadSankSounds()
  317. {
  318. static int Size = 0, Table = INVALID_STRING_TABLE;
  319. static char Buffer[PLATFORM_MAX_PATH * 4];
  320. static char Buffers[4][PLATFORM_MAX_PATH * 2];
  321. static Handle pFile = INVALID_HANDLE;
  322. static bool bKeyOK = false, bFileOK = false;
  323. static Handle pRes = INVALID_HANDLE;
  324. static char szSteam[PLATFORM_MAX_PATH] = "";
  325. static char szMusic[PLATFORM_MAX_PATH] = "";
  326. static char szError[PLATFORM_MAX_PATH] = "";
  327.  
  328. ClearArray(g_pKeys);
  329. ClearArray(g_pSounds);
  330. ClearArray(g_pPrecached);
  331. ClearArray(g_pChances);
  332.  
  333. if (Table == INVALID_STRING_TABLE)
  334. {
  335. Table = FindStringTable("soundprecache");
  336. }
  337.  
  338. if (Table == INVALID_STRING_TABLE)
  339. {
  340. return false;
  341. }
  342.  
  343. if (g_pDb == INVALID_HANDLE)
  344. {
  345. g_pDb = __GetMainDbHandle();
  346.  
  347. if (g_pDb == INVALID_HANDLE)
  348. {
  349. g_pDb = SQL_Connect("main_db", true, szError, sizeof(szError));
  350.  
  351. if (g_pDb != INVALID_HANDLE)
  352. {
  353. SQL_SetCharset(g_pDb, "utf8");
  354. }
  355. }
  356. }
  357.  
  358. if (g_pDb != INVALID_HANDLE)
  359. {
  360. SQL_LockDatabase(g_pDb);
  361. FormatEx(g_Buffer, sizeof(g_Buffer), "DELETE FROM sm_music WHERE Stamp < %d;", GetTime() - (86400 * 7 * 3));
  362. pRes = SQL_Query(g_pDb, g_Buffer);
  363. if (pRes)
  364. {
  365. CloseHandle(pRes);
  366. pRes = INVALID_HANDLE;
  367. }
  368. FormatEx(g_Buffer, sizeof(g_Buffer), "SELECT Steam, Music FROM sm_music;");
  369. pRes = SQL_Query(g_pDb, g_Buffer);
  370. if (pRes)
  371. {
  372. while (SQL_FetchRow(pRes))
  373. {
  374. SQL_FetchString(pRes, 0, szSteam, sizeof(szSteam));
  375. SQL_FetchString(pRes, 1, szMusic, sizeof(szMusic));
  376.  
  377. if (strlen(szSteam) > 0 && strlen(szMusic) > 0)
  378. {
  379. FormatEx(g_Buffer, sizeof(g_Buffer), "sound/sank/%s", szMusic);
  380. if (FileExists(g_Buffer))
  381. {
  382. PushArrayString(g_pKeys, szSteam);
  383.  
  384. Format(szMusic, sizeof(szMusic), "*sank/%s", szMusic);
  385. PushArrayString(g_pSounds, szMusic);
  386.  
  387. if (!IsFilePrecached(g_Buffer))
  388. {
  389. AddFileToDownloadsTable(g_Buffer);
  390. PushArrayString(g_pPrecached, g_Buffer);
  391. ReplaceString(g_Buffer, sizeof(g_Buffer), "sound/", "*");
  392. AddToStringTable(Table, g_Buffer);
  393. }
  394. }
  395. }
  396. }
  397.  
  398. CloseHandle(pRes);
  399. pRes = INVALID_HANDLE;
  400. }
  401. SQL_UnlockDatabase(g_pDb);
  402. }
  403.  
  404. BuildPath(Path_SM, Buffer, sizeof(Buffer), "configs/sank_sounds.txt");
  405.  
  406. if (!FileExists(Buffer))
  407. {
  408. return false;
  409. }
  410.  
  411. pFile = OpenFile(Buffer, "r");
  412.  
  413. if (pFile == INVALID_HANDLE)
  414. {
  415. return false;
  416. }
  417.  
  418. while (!IsEndOfFile(pFile) && \
  419. ReadFileLine(pFile, Buffer, sizeof(Buffer)))
  420. {
  421. TrimString(Buffer);
  422.  
  423. hCSGO_FixFileLine(Buffer, sizeof(Buffer));
  424.  
  425. if (strlen(Buffer) < 1 || \
  426. Buffer[0] == ';' || \
  427. Buffer[0] == '#' || \
  428. (Buffer[0] == '/' && Buffer[1] == '/'))
  429. {
  430. continue;
  431. }
  432.  
  433. Size = ExplodeString(Buffer, " ", Buffers, sizeof(Buffers), sizeof(Buffers[]));
  434.  
  435. if (Size >= 2)
  436. {
  437. bKeyOK = false, \
  438. bFileOK = false;
  439.  
  440. if (hCSGO_ClearLine(Buffers[0]) > 0)
  441. {
  442. ReplaceString(Buffers[0], sizeof(Buffers[]), "|", " "), \
  443. bKeyOK = true;
  444. }
  445.  
  446. if (hCSGO_ClearLine(Buffers[1]) > 0)
  447. {
  448. ReplaceString(Buffers[1], sizeof(Buffers[]), "|", " ");
  449.  
  450. FormatEx(Buffer, sizeof(Buffer), Buffers[1]);
  451. ReplaceString(Buffer, sizeof(Buffer), "*", "sound/");
  452.  
  453. if (!FileExists(Buffer))
  454. {
  455. LogError("Invalid Sank Sound Entry [Sound Key (\"%s\")] [Sound File (\"%s\")] - Sound File Could Not Be Found And Pre-Cached!", \
  456. Buffers[0], Buffer);
  457. }
  458.  
  459. else
  460. {
  461. bFileOK = true;
  462. }
  463. }
  464.  
  465. if (bKeyOK && \
  466. bFileOK)
  467. {
  468. PushArrayString(g_pKeys, Buffers[0]);
  469. PushArrayString(g_pSounds, Buffers[1]);
  470.  
  471. if (!IsFilePrecached(Buffer))
  472. {
  473. AddToStringTable(Table, Buffers[1]);
  474. AddFileToDownloadsTable(Buffer);
  475.  
  476. PushArrayString(g_pPrecached, Buffer);
  477. }
  478.  
  479. if (Size >= 3 && \
  480. StrContains(Buffers[0], "STEAM", false) != -1)
  481. {
  482. PushArrayCell(g_pChances, StringToInt(Buffers[2]));
  483. }
  484.  
  485. else
  486. {
  487. PushArrayCell(g_pChances, 0);
  488. }
  489. }
  490. }
  491. }
  492.  
  493. CloseHandle(pFile);
  494. pFile = INVALID_HANDLE;
  495.  
  496. return true;
  497. }
  498.  
Add Comment
Please, Sign In to add comment