rivalry.pwn 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /*
  2. /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$$
  3. | $$$ | $$ /$$__ $$ | $$__ $$| $$__ $$
  4. | $$$$| $$| $$ \__/ | $$ \ $$| $$ \ $$
  5. | $$ $$ $$| $$ /$$$$ /$$$$$$| $$$$$$$/| $$$$$$$/
  6. | $$ $$$$| $$|_ $$|______/| $$__ $$| $$____/
  7. | $$\ $$$| $$ \ $$ | $$ \ $$| $$
  8. | $$ \ $$| $$$$$$/ | $$ | $$| $$
  9. |__/ \__/ \______/ |__/ |__/|__/
  10. Rivalry System
  11. Jingles
  12. Next Generation Gaming, LLC
  13. (created by Next Generation Gaming Development Team)
  14. * Copyright (c) 2016, Next Generation Gaming, LLC
  15. *
  16. * All rights reserved.
  17. *
  18. * Redistribution and use in source and binary forms, with or without modification,
  19. * are not permitted in any case.
  20. *
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  26. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  27. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  28. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  29. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  30. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  31. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  32. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. #include <YSI\y_hooks>
  35. hook OnPlayerDisconnect(playerid) {
  36. if(GetPVarType(playerid, "RepFam_TL")) {
  37. if(IsValidDynamic3DTextLabel(Text3D:GetPVarInt(playerid, "RepFam_TL"))) {
  38. DestroyDynamic3DTextLabel(Text3D:GetPVarInt(playerid, "RepFam_TL"));
  39. }
  40. }
  41. DeletePVar(playerid, "RepFam_TL");
  42. DeletePVar(playerid, "RepFam");
  43. }
  44. timer RepFam_Cooldown[1000 * 120](playerid) { // 2 minutes
  45. DeletePVar(playerid, "RepFam");
  46. }
  47. Rivalry_Toggle(playerid, bool:bState) {
  48. RemovePlayerAttachedObject(playerid, 8);
  49. if(bState == true) {
  50. SetPVarInt(playerid, "RepFam_TL", _:CreateDynamic3DTextLabel(
  51. arrGroupData[PlayerInfo[playerid][pMember]][g_szGroupName],
  52. arrGroupData[PlayerInfo[playerid][pMember]][g_hDutyColour] * 256 + 0xFF,
  53. 0.0, 0.0, -0.3, 40,
  54. .attachedplayer = playerid,
  55. .testlos = 1,
  56. .worldid = -1,
  57. .interiorid = -1,
  58. .streamdistance = 40));
  59. SetPlayerAttachedObject(playerid, 8, arrGroupData[PlayerInfo[playerid][pMember]][g_iGroupToyID], PlayerInfo[playerid][pGroupToyBone],
  60. PlayerInfo[playerid][pGroupToy][0], PlayerInfo[playerid][pGroupToy][1], PlayerInfo[playerid][pGroupToy][2],
  61. PlayerInfo[playerid][pGroupToy][3], PlayerInfo[playerid][pGroupToy][4], PlayerInfo[playerid][pGroupToy][5],
  62. PlayerInfo[playerid][pGroupToy][6], PlayerInfo[playerid][pGroupToy][7], PlayerInfo[playerid][pGroupToy][8]);
  63. SendClientMessageEx(playerid, COLOR_WHITE, "You are now representing your gang (/grouptoy to adjust).");
  64. //if(PlayerInfo[playerid][pToggledChats][23] == 0) TextDrawShowForPlayer(playerid, TD_RepFam);
  65. }
  66. else {
  67. DestroyDynamic3DTextLabel(Text3D:GetPVarInt(playerid, "RepFam_TL"));
  68. DeletePVar(playerid, "RepFam_TL");
  69. SendClientMessageEx(playerid, COLOR_WHITE, "You are not representing your gang anymore.");
  70. TextDrawHideForPlayer(playerid, TD_RepFam);
  71. }
  72. }
  73. CMD:aviewrivals(playerid, params[]) {
  74. if(!IsAdminLevel(playerid, ADMIN_GENERAL)) return 1;
  75. szMiscArray[0] = 0;
  76. szMiscArray = "Gang\tRival";
  77. for(new i; i < MAX_GROUP_RIVALS; ++i) {
  78. for(new j; j < MAX_GROUPS; ++j) {
  79. if(arrGroupData[j][g_iRivals][i] != INVALID_GROUP_ID) {
  80. format(szMiscArray, sizeof(szMiscArray), "%s\n{%s}%s\t{%s}%s",
  81. szMiscArray,
  82. Group_NumToDialogHex(arrGroupData[j][g_hDutyColour]),
  83. arrGroupData[j][g_szGroupName],
  84. Group_NumToDialogHex(arrGroupData[arrGroupData[j][g_iRivals][i]][g_hDutyColour]),
  85. arrGroupData[arrGroupData[j][g_iRivals][i]][g_szGroupName]);
  86. }
  87. }
  88. }
  89. ShowPlayerDialogEx(playerid, DIALOG_NOTHING, DIALOG_STYLE_TABLIST_HEADERS, "Gangs | Rival List", szMiscArray, "<<", "");
  90. return 1;
  91. }
  92. CMD:repfam(playerid, params[]) {
  93. if(!IsACriminal(playerid)) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not part of a gang.");
  94. if(PlayerInfo[playerid][pHospital] > 0) return SendClientMessage(playerid, COLOR_GRAD2, "You can't do that at this time!");
  95. if(GetPVarType(playerid, "RepFam")) return SendClientMessageEx(playerid, COLOR_GRAD1, "You cannot take your bandana off yet.");
  96. if(GetPVarType(playerid, "RepFam_TL")) Rivalry_Toggle(playerid, false);
  97. else {
  98. SetPVarInt(playerid, "RepFam", 1);
  99. Rivalry_Toggle(playerid, true);
  100. defer RepFam_Cooldown(playerid);
  101. }
  102. return 1;
  103. }
  104. CMD:repcheck(playerid, params[]) {
  105. if(!IsACriminal(playerid)) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not part of a gang.");
  106. if(GetPVarType(playerid, "RepFam_TL")) SendClientMessageEx(playerid, COLOR_GREEN, "[GANG]: {CCCCCC}You're representing the gang.");
  107. else SendClientMessageEx(playerid, COLOR_GREEN, "[GANG]: {CCCCCC}You're not representing the gang.");
  108. return 1;
  109. }
  110. CMD:myrivals(playerid, params[]) {
  111. if(!IsACriminal(playerid)) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not part of a gang.");
  112. if(arrGroupData[PlayerInfo[playerid][pMember]][g_iGroupType] != GROUP_TYPE_CRIMINAL) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not in a gang.");
  113. Rivalry_GetRivalList(playerid, PlayerInfo[playerid][pMember]);
  114. return 1;
  115. }
  116. CMD:grouptoy(playerid, params[]) {
  117. if(!IsACriminal(playerid)) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not part of a gang.");
  118. if(arrGroupData[PlayerInfo[playerid][pMember]][g_iGroupToyID] == 0) return SendClientMessageEx(playerid, COLOR_GRAD1, "Your group does not have a toy.");
  119. if(!GetPVarType(playerid, "RepFam_TL")) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not wearing it.");
  120. if(isnull(params)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /grouptoy [pos/bone]");
  121. if(strcmp(params, "pos", true) == 0) {
  122. SetPVarInt(playerid, "EditGToy", 1);
  123. EditAttachedObject(playerid, 8);
  124. }
  125. if(strcmp(params, "bone", true) == 0) {
  126. szMiscArray[0] = 0;
  127. for(new i; i < sizeof(HoldingBones); ++i) {
  128. format(szMiscArray, sizeof(szMiscArray), "%s%s\n", szMiscArray, HoldingBones[i]);
  129. }
  130. ShowPlayerDialogEx(playerid, DIALOG_TOYS_GROUP, DIALOG_STYLE_LIST, "Edit Group Toy", szMiscArray, "Select", "Cancel");
  131. }
  132. return 1;
  133. }
  134. CMD:editgrouptoy(playerid, params[]) {
  135. if(PlayerInfo[playerid][pAdmin] < 4 && PlayerInfo[playerid][pGangModerator] < 2) return SendClientMessageEx(playerid, COLOR_GRAD1, "You are not allowed to use this command.");
  136. new iGroupID,
  137. iObjectID;
  138. if(sscanf(params, "dd", iGroupID, iObjectID)) return SendClientMessageEx(playerid, COLOR_GRAD1, "USAGE: /editgrouptoy [Group ID] [Object ID]");
  139. if(!(1 <= iGroupID < MAX_GROUPS)) return SendClientMessageEx(playerid, COLOR_GRAD1, "You specified an invalid Group ID.");
  140. arrGroupData[iGroupID-1][g_iGroupToyID] = iObjectID;
  141. SaveGroup(iGroupID-1);
  142. format(szMiscArray, sizeof(szMiscArray), "[Group Toy]: You set %s's toy to object ID %d", arrGroupData[iGroupID-1][g_szGroupName], iObjectID);
  143. SendClientMessageEx(playerid, COLOR_GRAD1, szMiscArray);
  144. return 1;
  145. }
  146. CMD:amanagerivals(playerid, params[]) {
  147. if(IsAdminLevel(playerid, ADMIN_SENIOR, 0) || PlayerInfo[playerid][pGangModerator] >= 2) {
  148. if(isnull(params)) return SendClientMessageEx(playerid, COLOR_GRAD1, "Usage: /amanagerivals [Group ID]");
  149. new iGroupID = strval(params);
  150. if(!(0 < iGroupID <= MAX_GROUPS)) return SendClientMessageEx(playerid, COLOR_GRAD1, "You specified an invalid group ID.");
  151. iGroupID--; // GroupIDs start at 1 in the dialogs.
  152. Rivalry_GetRivalList(playerid, iGroupID);
  153. }
  154. else SendClientMessageEx(playerid, COLOR_GRAD1, "You cannot use this command.");
  155. return 1;
  156. }
  157. hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
  158. if(arrAntiCheat[playerid][ac_iFlags][AC_DIALOGSPOOFING] > 0) return 1;
  159. switch(dialogid) {
  160. case DIALOG_GROUP_RIVALS: {
  161. if(!response) {
  162. DeletePVar(playerid, "AddRival");
  163. DeletePVar(playerid, "RemRival");
  164. DeletePVar(playerid, "RGroupID");
  165. return 1;
  166. }
  167. if(GetPVarType(playerid, "AddRival")) {
  168. new iAddGroupID = ListItemTrackId[playerid][listitem],
  169. iGroupID = GetPVarInt(playerid, "RGroupID"),
  170. iFreeSlot[2];
  171. iFreeSlot[0] = INVALID_GROUP_ID;
  172. iFreeSlot[1] = INVALID_GROUP_ID;
  173. DeletePVar(playerid, "RGroupID");
  174. for(new i; i < MAX_GROUP_RIVALS; ++i) {
  175. if(arrGroupData[iGroupID][g_iRivals][i] == iAddGroupID) {
  176. DeletePVar(playerid, "AddRival");
  177. DeletePVar(playerid, "RemRival");
  178. return SendClientMessageEx(playerid, COLOR_GRAD1, "These groups are already rivals.");
  179. }
  180. if(iFreeSlot[0] == INVALID_GROUP_ID && arrGroupData[iAddGroupID][g_iRivals][i] == INVALID_GROUP_ID) iFreeSlot[0] = i;
  181. if(iFreeSlot[1] == INVALID_GROUP_ID && arrGroupData[iGroupID][g_iRivals][i] == INVALID_GROUP_ID) iFreeSlot[1] = i;
  182. }
  183. if(iFreeSlot[0] == INVALID_GROUP_ID || iFreeSlot[1] == INVALID_GROUP_ID) {
  184. DeletePVar(playerid, "AddRival");
  185. DeletePVar(playerid, "RemRival");
  186. return SendClientMessageEx(playerid, COLOR_GRAD1, "One of the groups cannot have another rival.");
  187. }
  188. format(szMiscArray, sizeof(szMiscArray), "[RIVALS]: {FFFF00}%s {CCCCCC}and {FFFF00}%s {CCCCCC}are now rivals.", arrGroupData[iGroupID][g_szGroupName], arrGroupData[iAddGroupID][g_szGroupName]);
  189. foreach(new i: Player)
  190. {
  191. if(PlayerInfo[i][pMember] == iGroupID) {
  192. ChatTrafficProcess(i, arrGroupData[iGroupID][g_hRadioColour] * 256 + 255, szMiscArray, 12);
  193. }
  194. if(PlayerInfo[i][pMember] == iAddGroupID) {
  195. ChatTrafficProcess(i, arrGroupData[iAddGroupID][g_hRadioColour] * 256 + 255, szMiscArray, 12);
  196. }
  197. }
  198. format(szMiscArray, sizeof(szMiscArray), "Successfully added %s to %s's rivals.", arrGroupData[iAddGroupID][g_szGroupName], arrGroupData[iGroupID][g_szGroupName]);
  199. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  200. format(szMiscArray, sizeof(szMiscArray), "Successfully added %s to %s's rivals.", arrGroupData[iGroupID][g_szGroupName], arrGroupData[iAddGroupID][g_szGroupName]);
  201. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  202. format(szMiscArray, sizeof(szMiscArray), "%s (%d) added %s to %s's rivals.",
  203. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), arrGroupData[iAddGroupID][g_szGroupName], arrGroupData[iGroupID][g_szGroupName]);
  204. Log("logs/rivals", szMiscArray);
  205. arrGroupData[iAddGroupID][g_iRivals][iFreeSlot[0]] = iGroupID;
  206. arrGroupData[iGroupID][g_iRivals][iFreeSlot[1]] = iAddGroupID;
  207. SaveGroup(iGroupID);
  208. SaveGroup(iAddGroupID);
  209. DeletePVar(playerid, "AddRival");
  210. DeletePVar(playerid, "RGroupID");
  211. return 1;
  212. }
  213. if(GetPVarType(playerid, "RemRival")) {
  214. new iRemGroupID = ListItemTrackId[playerid][listitem],
  215. iGroupID = GetPVarInt(playerid, "RGroupID");
  216. DeletePVar(playerid, "RGroupID");
  217. format(szMiscArray, sizeof(szMiscArray), "[RIVALS]: {FFFF00}%s {CCCCCC}and {FFFF00}%s {CCCCCC}are no longer rivals.", arrGroupData[iGroupID][g_szGroupName], arrGroupData[iRemGroupID][g_szGroupName]);
  218. foreach(new i: Player)
  219. {
  220. if(PlayerInfo[i][pMember] == iGroupID) {
  221. ChatTrafficProcess(i, arrGroupData[iGroupID][g_hRadioColour] * 256 + 255, szMiscArray, 12);
  222. }
  223. if(PlayerInfo[i][pMember] == iRemGroupID) {
  224. ChatTrafficProcess(i, arrGroupData[iRemGroupID][g_hRadioColour] * 256 + 255, szMiscArray, 12);
  225. }
  226. }
  227. format(szMiscArray, sizeof(szMiscArray), "Successfully removed %s from %s's rivals.", arrGroupData[iRemGroupID][g_szGroupName], arrGroupData[iGroupID][g_szGroupName]);
  228. SendClientMessageEx(playerid, COLOR_YELLOW, szMiscArray);
  229. format(szMiscArray, sizeof(szMiscArray), "%s (%d) removed %s from %s's rivals.",
  230. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), arrGroupData[iRemGroupID][g_szGroupName], arrGroupData[iGroupID][g_szGroupName]);
  231. Log("logs/rivals", szMiscArray);
  232. format(szMiscArray, sizeof(szMiscArray), "%s (%d) removed %s from %s's rivals.",
  233. GetPlayerNameExt(playerid), GetPlayerSQLId(playerid), arrGroupData[iGroupID][g_szGroupName], arrGroupData[iRemGroupID][g_szGroupName]);
  234. Log("logs/rivals", szMiscArray);
  235. for(new i; i < MAX_GROUP_RIVALS; ++i) {
  236. if(arrGroupData[iGroupID][g_iRivals][i] == iRemGroupID) arrGroupData[iGroupID][g_iRivals][i] = INVALID_GROUP_ID;
  237. if(arrGroupData[iRemGroupID][g_iRivals][i] == iGroupID) arrGroupData[iRemGroupID][g_iRivals][i] = INVALID_GROUP_ID;
  238. }
  239. SaveGroup(iGroupID);
  240. SaveGroup(iRemGroupID);
  241. DeletePVar(playerid, "RemRival");
  242. DeletePVar(playerid, "RGroupID");
  243. return 1;
  244. }
  245. if(strcmp("Add Rival", inputtext, true) == 0) {
  246. new szTitle[GROUP_MAX_NAME_LEN + 24],
  247. iGroupID = GetPVarInt(playerid, "RGroupID"),
  248. iDialogCount;
  249. format(szTitle, sizeof(szTitle), "{%s}%s (ID %d) | Add Rival", Group_NumToDialogHex(arrGroupData[iGroupID][g_hDutyColour]), arrGroupData[iGroupID][g_szGroupName], iGroupID + 1);
  250. for(new i; i < MAX_GROUPS; ++i) {
  251. if(arrGroupData[i][g_iGroupType] == GROUP_TYPE_CRIMINAL) {
  252. ListItemTrackId[playerid][iDialogCount] = i;
  253. format(szMiscArray, sizeof(szMiscArray), "%s(%d) {%s}%s\n", szMiscArray, i, Group_NumToDialogHex(arrGroupData[i][g_hDutyColour]), arrGroupData[i][g_szGroupName]);
  254. iDialogCount++;
  255. }
  256. }
  257. SetPVarInt(playerid, "AddRival", 1);
  258. ShowPlayerDialogEx(playerid, DIALOG_GROUP_RIVALS, DIALOG_STYLE_LIST, szTitle, szMiscArray, "Add", "Cancel");
  259. return 1;
  260. }
  261. if(strcmp("Remove Rival", inputtext, true) == 0) {
  262. new szTitle[GROUP_MAX_NAME_LEN + 24],
  263. iGroupID = GetPVarInt(playerid, "RGroupID"),
  264. iRivalID,
  265. iDialogCount;
  266. format(szTitle, sizeof(szTitle), "{%s}%s (ID %d) | Remove Rival", Group_NumToDialogHex(arrGroupData[iGroupID][g_hDutyColour]), arrGroupData[iGroupID][g_szGroupName], iGroupID + 1);
  267. for(new i; i < MAX_GROUP_RIVALS; ++i) {
  268. if(arrGroupData[iGroupID][g_iRivals][i] != INVALID_GROUP_ID) {
  269. iRivalID = arrGroupData[iGroupID][g_iRivals][i];
  270. ListItemTrackId[playerid][iDialogCount] = iRivalID;
  271. format(szMiscArray, sizeof(szMiscArray), "%s(%d) {%s}%s (ID %d)\n", szMiscArray, iRivalID, Group_NumToDialogHex(arrGroupData[iRivalID][g_hDutyColour]), arrGroupData[iRivalID][g_szGroupName], iRivalID + 1);
  272. iDialogCount++;
  273. }
  274. }
  275. SetPVarInt(playerid, "RemRival", 1);
  276. ShowPlayerDialogEx(playerid, DIALOG_GROUP_RIVALS, DIALOG_STYLE_LIST, szTitle, szMiscArray, "Select", "Cancel");
  277. return 1;
  278. }
  279. }
  280. case DIALOG_TOYS_GROUP: {
  281. if(!response) return 1;
  282. PlayerInfo[playerid][pGroupToyBone] = listitem;
  283. mysql_format(MainPipeline, szMiscArray, sizeof(szMiscArray), "UPDATE `accounts` SET `GroupToyBone` = %d WHERE `id` = %d", listitem, GetPlayerSQLId(playerid));
  284. mysql_tquery(MainPipeline, szMiscArray, "OnQueryFinish", "i", SENDDATA_THREAD);
  285. format(szMiscArray, sizeof(szMiscArray), "[Group Toy]: Attached to %s", HoldingBones[listitem]);
  286. SendClientMessageEx(playerid, COLOR_GRAD1, szMiscArray);
  287. RemovePlayerAttachedObject(playerid, 8);
  288. SetPlayerAttachedObject(playerid, 8, arrGroupData[PlayerInfo[playerid][pMember]][g_iGroupToyID], PlayerInfo[playerid][pGroupToyBone],
  289. PlayerInfo[playerid][pGroupToy][0], PlayerInfo[playerid][pGroupToy][1], PlayerInfo[playerid][pGroupToy][2],
  290. PlayerInfo[playerid][pGroupToy][3], PlayerInfo[playerid][pGroupToy][4], PlayerInfo[playerid][pGroupToy][5],
  291. PlayerInfo[playerid][pGroupToy][6], PlayerInfo[playerid][pGroupToy][7], PlayerInfo[playerid][pGroupToy][8]);
  292. }
  293. }
  294. return 0;
  295. }
  296. Rivalry_GetRivalList(playerid, iGroupID) {
  297. szMiscArray[0] = 0;
  298. new iRivalID,
  299. szTitle[GROUP_MAX_NAME_LEN + 24];
  300. SetPVarInt(playerid, "RGroupID", iGroupID);
  301. format(szTitle, sizeof(szTitle), "{%s}%s (ID %d) | Rivals", Group_NumToDialogHex(arrGroupData[iGroupID][g_hDutyColour]), arrGroupData[iGroupID][g_szGroupName], iRivalID + 1);
  302. for(new i; i < MAX_GROUP_RIVALS; ++i) {
  303. iRivalID = arrGroupData[iGroupID][g_iRivals][i];
  304. if(iRivalID == INVALID_GROUP_ID) format(szMiscArray, sizeof(szMiscArray), "%s(%d) (Empty)\n", szMiscArray, i);
  305. else {
  306. format(szMiscArray, sizeof(szMiscArray), "%s(%d) {%s} %s (ID %d)\n",
  307. szMiscArray, i, Group_NumToDialogHex(arrGroupData[iRivalID][g_hDutyColour]), arrGroupData[iRivalID][g_szGroupName], iRivalID + 1);
  308. }
  309. }
  310. if(IsAdminLevel(playerid, ADMIN_SENIOR, 0) || PlayerInfo[playerid][pGangModerator] >= 2) strcat(szMiscArray, "Add Rival\nRemove Rival", sizeof(szMiscArray));
  311. ShowPlayerDialogEx(playerid, DIALOG_GROUP_RIVALS, DIALOG_STYLE_LIST, szTitle, szMiscArray, "Select", "Cancel");
  312. }
  313. hook OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart) {
  314. if(GetPVarType(playerid, "RepFam")) {
  315. RepFam_Cooldown(playerid);
  316. SetPVarInt(playerid, "RepFam", 1);
  317. defer RepFam_Cooldown[1000 * 30](playerid);
  318. }
  319. }
  320. hook OnPlayerConnect(playerid)
  321. {
  322. TD_RepFam = TextDrawCreate(581.5, 414, "/repfam");
  323. TextDrawFont(TD_RepFam, 2);
  324. TextDrawLetterSize(TD_RepFam, 0.25, 2.8000000000000003);
  325. TextDrawColor(TD_RepFam, 0xffffffFF);
  326. TextDrawSetOutline(TD_RepFam, true);
  327. TextDrawSetProportional(TD_RepFam, true);
  328. TextDrawSetShadow(TD_RepFam, 1);
  329. }