Guest User

Untitled

a guest
Jan 19th, 2017
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.85 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3. #include <cstrike>
  4.  
  5. #define VERSION "3.1.7"
  6. #define FREEZE_SOUND "physics/glass/glass_impact_bullet4.wav"
  7. #define NADE_SOUND "weapons/debris3.wav"
  8. #define BEACON_SOUND "buttons/blip1.wav"
  9. #define TEAM_T 2
  10. #define TEAM_CT 3
  11.  
  12. new bool:g_bEnabled;
  13. new UserMsg:g_umTextMsg;
  14. new bool:g_bFrozen[MAXPLAYERS+1];
  15. new Handle:g_hFrozenTimer[MAXPLAYERS+1];
  16. new Handle:g_hBeaconTimer[MAXPLAYERS+1];
  17. new Handle:g_hInvulnerableTimer[MAXPLAYERS+1];
  18. new g_iClientScore[MAXPLAYERS+1];
  19. new g_iClientDeaths[MAXPLAYERS+1];
  20. new g_iClientLevel[MAXPLAYERS+1];
  21. new g_iClientThaws[MAXPLAYERS+1];
  22. new g_iClientKnifeHits[MAXPLAYERS+1];
  23. new g_iTotalTs;
  24. new g_iFrozenTs;
  25. new g_iTotalCts;
  26. new g_iFrozenCts;
  27. new Handle:g_hScoreTimer;
  28. new Handle:g_CVarLevel1;
  29. new g_iLevel1;
  30. new Handle:g_CVarLevel2;
  31. new g_iLevel2;
  32. new Handle:g_CVarLevel3;
  33. new g_iLevel3;
  34. new Handle:g_CVarUFTime;
  35. new Float:g_fUFTime;
  36. new Handle:g_CVarThawsPerNade;
  37. new g_iThawsPerNade;
  38. new Handle:g_CVarMaxNades;
  39. new g_iMaxNades;
  40. new g_offsetOwnerEntity;
  41. new g_offsetHealth;
  42. new g_offsetAmmo;
  43. new g_offsetVelocity0;
  44. new g_offsetVelocity1;
  45. new g_offsetBaseVelocity;
  46. new const g_iBlueColor[4] = {75, 75, 255, 255};
  47. new g_BeamSprite;
  48. new g_HaloSprite;
  49. new g_GlowSprite;
  50. new g_GlowSpritee;
  51. new bool:g_bGameOver;
  52. new Roundstarttimestamp = -1;
  53. new Invulnerabletime = -1;
  54.  
  55. public Plugin:myinfo = {
  56.  
  57. name = "freezetag",
  58. author = "meng",
  59. version = VERSION,
  60. description = "friendly game of tag",
  61. url = ""
  62. };
  63.  
  64. public OnPluginStart() {
  65.  
  66. CreateConVar("teamfreezetag_version", VERSION, "Team Freeze Tag Version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
  67. g_CVarUFTime = CreateConVar("freezetag_auto_unfreeze", "15", "Time in seconds a player is automatically unfrozen. 0 to disable.", _, true, 0.0, true, 60.0);
  68. g_CVarThawsPerNade = CreateConVar("freezetag_thaws_per_freeze_nade", "1", "Thaws needed to gain a freeze nade.", _, true, 1.0, true, 100000.0);
  69. g_CVarMaxNades = CreateConVar("freezetag_max_freeze_nades", "3", "Max # of freeze nades a player can have. Players with the max # keep 1 when they are frozen.", _, true, 1.0, true, 99.0);
  70. g_CVarLevel1 = CreateConVar("freezetag_level_1", "10", "Score needed to reach level 1.", _, true, 1.0, true, 100000.0);
  71. g_CVarLevel2 = CreateConVar("freezetag_level_2", "20", "Score needed to reach level 2.", _, true, 1.0, true, 100000.0);
  72. g_CVarLevel3 = CreateConVar("freezetag_level_3", "30", "Score needed to reach level 3.", _, true, 1.0, true, 100000.0);
  73. AutoExecConfig(true, "teamfreezetag");
  74. g_fUFTime = GetConVarFloat(g_CVarUFTime);
  75. HookConVarChange(g_CVarUFTime, CVarChange);
  76. g_iThawsPerNade = GetConVarInt(g_CVarThawsPerNade);
  77. HookConVarChange(g_CVarThawsPerNade, CVarChange);
  78. g_iMaxNades = GetConVarInt(g_CVarMaxNades);
  79. HookConVarChange(g_CVarMaxNades, CVarChange);
  80. g_iLevel1 = GetConVarInt(g_CVarLevel1);
  81. HookConVarChange(g_CVarLevel1, CVarChange);
  82. g_iLevel2 = GetConVarInt(g_CVarLevel2);
  83. HookConVarChange(g_CVarLevel2, CVarChange);
  84. g_iLevel3 = GetConVarInt(g_CVarLevel3);
  85. HookConVarChange(g_CVarLevel3, CVarChange);
  86. g_offsetOwnerEntity = FindSendPropOffs("CBaseCombatWeapon", "m_hOwnerEntity");
  87. g_offsetHealth = FindSendPropOffs("CCSPlayer", "m_iHealth");
  88. g_offsetAmmo = FindSendPropInfo("CCSPlayer", "m_iAmmo");
  89. g_offsetVelocity0 = FindSendPropOffs("CBasePlayer","m_vecVelocity[0]");
  90. g_offsetVelocity1 = FindSendPropOffs("CBasePlayer","m_vecVelocity[1]");
  91. g_offsetBaseVelocity = FindSendPropOffs("CBasePlayer","m_vecBaseVelocity");
  92. g_umTextMsg = GetUserMessageId("TextMsg");
  93. HookUserMessage(g_umTextMsg, UserMessageHook, true);
  94. AddNormalSoundHook(NormalSHook:SoundsHook);
  95. HookEvent("round_start", EventRoundStart, EventHookMode_PostNoCopy);
  96. HookEvent("player_spawn", EventPlayerSpawn);
  97. HookEvent("player_hurt", EventPlayerHurt);
  98. HookEvent("player_jump", EventPlayerJump, EventHookMode_Pre);
  99. HookEvent("hegrenade_detonate", EventHD);
  100. HookEvent("player_death", EventPlayerDeath);
  101. HookEvent("player_team", EventPlayerTeam);
  102. //AddCommandListener(CmdDrop, "drop");
  103. RegAdminCmd("sm_freezetag", CmdFreezeTag, ADMFLAG_RCON);
  104. }
  105.  
  106. public CVarChange(Handle:convar, const String:oldValue[], const String:newValue[]) {
  107.  
  108. if (convar == g_CVarUFTime)
  109. g_fUFTime = StringToFloat(newValue);
  110. else if (convar == g_CVarThawsPerNade)
  111. g_iThawsPerNade = StringToInt(newValue);
  112. else if (convar == g_CVarMaxNades)
  113. g_iMaxNades = StringToInt(newValue);
  114. else if (convar == g_CVarLevel1)
  115. g_iLevel1 = StringToInt(newValue);
  116. else if (convar == g_CVarLevel2)
  117. g_iLevel2 = StringToInt(newValue);
  118. else if (convar == g_CVarLevel3)
  119. g_iLevel3 = StringToInt(newValue);
  120. }
  121.  
  122. public OnMapStart() {
  123.  
  124. if (g_bEnabled) {
  125. new maxent = GetMaxEntities(), String:sClassname[64];
  126. for (new i = MaxClients; i < maxent; i++)
  127. if (IsValidEdict(i) &&
  128. IsValidEntity(i) &&
  129. GetEdictClassname(i, sClassname, sizeof(sClassname)) &&
  130. ((StrContains(sClassname, "func_bomb_target") != -1) ||
  131. (StrContains(sClassname, "func_hostage_rescue") != -1) ||
  132. (StrContains(sClassname, "func_buyzone") != -1)))
  133. AcceptEntityInput(i,"Disable");
  134. }
  135. g_BeamSprite = PrecacheModel("materials/sprites/laser.vmt");
  136. g_HaloSprite = PrecacheModel("materials/sprites/halo01.vmt");
  137. g_GlowSprite = PrecacheModel("sprites/blueglow2.vmt");
  138. g_GlowSpritee = PrecacheModel("sprites/redglow2.vmt");
  139. PrecacheSound(FREEZE_SOUND);
  140. PrecacheSound(NADE_SOUND);
  141. PrecacheSound(BEACON_SOUND);
  142. }
  143.  
  144. public Action:FrozenGoods(Handle:timer) {
  145.  
  146. PrintHintTextToAll("CT: %i/%i ~~~~~~ T: %i/%i", g_iTotalCts - g_iFrozenCts, g_iTotalCts, g_iTotalTs - g_iFrozenTs, g_iTotalTs);
  147. }
  148.  
  149. public OnClientDisconnect(client) {
  150.  
  151. if (g_bEnabled) {
  152. if (g_hFrozenTimer[client] != INVALID_HANDLE) {
  153. KillTimer(g_hFrozenTimer[client]);
  154. g_hFrozenTimer[client] = INVALID_HANDLE;
  155. }
  156. if (g_hBeaconTimer[client] != INVALID_HANDLE) {
  157. KillTimer(g_hBeaconTimer[client]);
  158. g_hBeaconTimer[client] = INVALID_HANDLE;
  159. }
  160. g_iClientScore[client] = 0;
  161. g_iClientDeaths[client] = 0;
  162. g_iClientLevel[client] = 0;
  163. g_iClientThaws[client] = 0;
  164. g_iClientKnifeHits[client] = 0;
  165. CheckFrozen();
  166. }
  167. }
  168. /*
  169. public Action:CmdDrop(client, const String:command[], argc) {
  170.  
  171. if (g_bEnabled)
  172. return Plugin_Handled;
  173. return Plugin_Continue;
  174. }
  175. */
  176. public Action:CmdFreezeTag(client, args) {
  177.  
  178. if (args != 1) {
  179. ReplyToCommand(client, "[SM] Usage: sm_freezetag <1/0>");
  180. return Plugin_Handled;
  181. }
  182. new String:sArg[8];
  183. GetCmdArg(1, sArg, sizeof(sArg));
  184. if (StringToInt(sArg) == 1) {
  185. if (!g_bEnabled) {
  186. g_bEnabled = true;
  187. if (g_hScoreTimer == INVALID_HANDLE)
  188. g_hScoreTimer = CreateTimer(1.0, FrozenGoods, _, TIMER_REPEAT);
  189. new maxent = GetMaxEntities(), String:sClassname[64];
  190. for (new i = MaxClients; i < maxent; i++)
  191. if (IsValidEdict(i) &&
  192. IsValidEntity(i) &&
  193. GetEdictClassname(i, sClassname, sizeof(sClassname)) &&
  194. ((StrContains(sClassname, "func_bomb_target") != -1) ||
  195. (StrContains(sClassname, "func_hostage_rescue") != -1) ||
  196. (StrContains(sClassname, "func_buyzone") != -1)))
  197. AcceptEntityInput(i,"Disable");
  198. ServerCommand("mp_restartgame 1");
  199. }
  200. }
  201. else if (g_bEnabled) {
  202. g_bEnabled = false;
  203. if (g_hScoreTimer != INVALID_HANDLE) {
  204. KillTimer(g_hScoreTimer);
  205. g_hScoreTimer = INVALID_HANDLE;
  206. }
  207. for (new i = 1; i <= MaxClients; i++) {
  208. if (g_hFrozenTimer[i] != INVALID_HANDLE) {
  209. KillTimer(g_hFrozenTimer[i]);
  210. g_hFrozenTimer[i] = INVALID_HANDLE;
  211. }
  212. if (g_hBeaconTimer[i] != INVALID_HANDLE) {
  213. KillTimer(g_hBeaconTimer[i]);
  214. g_hBeaconTimer[i] = INVALID_HANDLE;
  215. }
  216. }
  217. new maxent = GetMaxEntities(), String:sClassname[64];
  218. for (new i = MaxClients; i < maxent; i++)
  219. if (IsValidEdict(i) &&
  220. IsValidEntity(i) &&
  221. GetEdictClassname(i, sClassname, sizeof(sClassname)) &&
  222. ((StrContains(sClassname, "func_bomb_target") != -1) ||
  223. (StrContains(sClassname, "func_hostage_rescue") != -1) ||
  224. (StrContains(sClassname, "func_buyzone") != -1)))
  225. AcceptEntityInput(i,"Enable");
  226. ServerCommand("mp_restartgame 1");
  227. }
  228. return Plugin_Handled;
  229. }
  230.  
  231. Setup(client) {
  232.  
  233. g_bFrozen[client] = false;
  234. g_iClientKnifeHits[client] = 0;
  235. SetEntData(client, g_offsetHealth, 10000484); // looks like 100 in-game. thx exvel.
  236. SetEntityRenderColor(client, 255, 255, 255, 255);
  237. // Kills
  238. if (g_iClientScore[client] < 0) {
  239. g_iClientScore[client] = 0;
  240. SetEntProp(client, Prop_Data, "m_iFrags", 0);
  241. }
  242. else
  243. SetEntProp(client, Prop_Data, "m_iFrags", g_iClientScore[client]);
  244. // Deaths
  245. if (g_iClientDeaths[client] < 0) {
  246. g_iClientDeaths[client] = 0;
  247. SetEntProp(client, Prop_Data, "m_iDeaths", 0);
  248. }
  249. else
  250. SetEntProp(client, Prop_Data, "m_iDeaths", g_iClientDeaths[client]);
  251. new pistol;
  252. if ((pistol = GetPlayerWeaponSlot(client, 1)) != -1) {
  253. RemovePlayerItem(client, pistol);
  254. RemoveEdict(pistol);
  255. }
  256. FakeClientCommand(client, "use weapon_knife");
  257. switch (g_iClientLevel[client]) {
  258. case 0:
  259. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
  260. case 1:
  261. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.1);
  262. case 2:
  263. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.14);
  264. case 3:
  265. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.18);
  266. }
  267. }
  268.  
  269.  
  270.  
  271. UnFreeze(client) {
  272.  
  273. g_iClientKnifeHits[client] = 0;
  274. if (g_hFrozenTimer[client] != INVALID_HANDLE) {
  275. KillTimer(g_hFrozenTimer[client]);
  276. g_hFrozenTimer[client] = INVALID_HANDLE;
  277. }
  278. if (g_hBeaconTimer[client] != INVALID_HANDLE) {
  279. KillTimer(g_hBeaconTimer[client]);
  280. g_hBeaconTimer[client] = INVALID_HANDLE;
  281. }
  282. GivePlayerItem(client, "weapon_knife");
  283. decl Float:vec[3];
  284. GetClientEyePosition(client, vec);
  285. EmitAmbientSound("physics/glass/glass_impact_bullet4.wav", vec, _, _, _, 0.3);
  286. switch (g_iClientLevel[client]) {
  287. case 0:
  288. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.0);
  289. case 1:
  290. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.1);
  291. case 2:
  292. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.14);
  293. case 3:
  294. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 1.18);
  295. }
  296. SetEntityRenderMode(client, RENDER_TRANSCOLOR);
  297. SetEntityRenderColor(client, 255, 255, 255, 112);
  298. g_hInvulnerableTimer[client] = CreateTimer(1.0, TimerInvulnerable, client);
  299. CheckFrozen();
  300. }
  301.  
  302. public Action:TimerInvulnerable(Handle:timer, any:client) {
  303. g_bFrozen[client] = false;
  304. SetEntityRenderMode(client, RENDER_NORMAL);
  305. SetEntityRenderColor(client, 255, 255, 255, 255);
  306. }
  307.  
  308. public Action:TimerThaw(Handle:timer, any:client) {
  309. g_hFrozenTimer[client] = INVALID_HANDLE;
  310. if (IsClientInGame(client) && IsPlayerAlive(client) && g_bFrozen[client])
  311. UnFreeze(client);
  312. }
  313.  
  314.  
  315.  
  316. public EventHD(Handle:event, const String:name[],bool:dontBroadcast) {
  317.  
  318. if (g_bEnabled) {
  319. decl Float:vec[3];
  320. vec[0] = GetEventFloat(event,"x");
  321. vec[1] = GetEventFloat(event,"y");
  322. vec[2] = GetEventFloat(event,"z");
  323.  
  324. TE_SendToAll();
  325. TE_SetupBeamRingPoint(vec, 300.0, 10.0, g_BeamSprite, g_HaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iBlueColor, 8, 0);
  326. TE_SendToAll();
  327. EmitAmbientSound(NADE_SOUND, vec, _, SNDLEVEL_RAIDSIREN, _, 0.9);
  328. }
  329. }
  330.  
  331. public EventRoundStart(Handle:event,const String:name[],bool:dontBroadcast) {
  332.  
  333. Roundstarttimestamp = GetTime();
  334. if (g_bEnabled) {
  335. g_bGameOver = false;
  336. PrintToChatAll("\x04Team FreezeTag Enabled! \x03Freeze All Enemies To Win The Round!!!");
  337. new maxEntities = GetMaxEntities();
  338. decl String:sClassname[64];
  339. for (new i = MaxClients; i < maxEntities; i++)
  340. if (IsValidEdict(i) &&
  341. IsValidEntity(i) &&
  342. GetEdictClassname(i, sClassname, sizeof(sClassname)) &&
  343. (StrContains(sClassname, "item_") != -1 || StrContains(sClassname, "weapon_") != -1) &&
  344. GetEntDataEnt2(i, g_offsetOwnerEntity) == -1) {
  345. RemoveEdict(i);
  346. }
  347. CheckFrozen();
  348. for (new i = 0; i < MaxClients; i++) {
  349. g_iClientKnifeHits[i] = 0;
  350. }
  351. }
  352. }
  353.  
  354. public EventPlayerSpawn(Handle:event, const String:name[],bool:dontBroadcast) {
  355.  
  356. new time = GetTime()
  357. if(Roundstarttimestamp == -1 || (time-Roundstarttimestamp) < 3)
  358. {
  359. if (g_bEnabled) {
  360. new client = GetClientOfUserId(GetEventInt(event,"userid"));
  361. if (GetClientTeam(client) > 1)
  362. Setup(client);
  363. }
  364. }
  365. else
  366. {
  367. new client = GetClientOfUserId(GetEventInt(event,"userid"));
  368. Freeze(client);
  369. new pistol;
  370. if ((pistol = GetPlayerWeaponSlot(client, 1)) != -1) {
  371. RemovePlayerItem(client, pistol);
  372. RemoveEdict(pistol);
  373. }
  374. }
  375. }
  376.  
  377. public EventPlayerJump(Handle:event,const String:name[],bool:dontBroadcast) {
  378.  
  379. if (g_bEnabled) {
  380. new client = GetClientOfUserId(GetEventInt(event,"userid"));
  381. switch (g_iClientLevel[client]) {
  382. case 1: {
  383. SetEntityGravity(client, 0.9);
  384. decl Float:vec[3];
  385. vec[0] = GetEntDataFloat(client, g_offsetVelocity0)*0.1/2.0;
  386. vec[1] = GetEntDataFloat(client, g_offsetVelocity1)*0.1/2.0;
  387. vec[2] = 0.8*50.0;
  388. SetEntDataVector(client, g_offsetBaseVelocity, vec, true);
  389. }
  390. case 2: {
  391. SetEntityGravity(client, 0.8);
  392. decl Float:vec[3];
  393. vec[0] = GetEntDataFloat(client, g_offsetVelocity0)*0.16/2.0;
  394. vec[1] = GetEntDataFloat(client, g_offsetVelocity1)*0.16/2.0;
  395. vec[2] = 1.0*50.0;
  396. SetEntDataVector(client, g_offsetBaseVelocity, vec, true);
  397. }
  398. case 3: {
  399. SetEntityGravity(client, 0.7);
  400. decl Float:vec[3];
  401. vec[0] = GetEntDataFloat(client, g_offsetVelocity0)*0.22/2.0;
  402. vec[1] = GetEntDataFloat(client, g_offsetVelocity1)*0.22/2.0;
  403. vec[2] = 1.2*50.0;
  404. SetEntDataVector(client, g_offsetBaseVelocity, vec, true);
  405. }
  406. }
  407. }
  408. }
  409.  
  410. public EventPlayerHurt(Handle:event, const String:name[],bool:dontBroadcast) {
  411.  
  412. if (g_bEnabled) {
  413. new victim = GetClientOfUserId(GetEventInt(event,"userid"));
  414. new attacker = GetClientOfUserId(GetEventInt(event,"attacker"));
  415. new damage = GetEventInt(event, "dmg_health");
  416. static String:sWeapon[32];
  417. GetEventString(event, "weapon", sWeapon, sizeof(sWeapon));
  418. SetEntData(victim, g_offsetHealth, 10000484);
  419. if (attacker != 0) {
  420. new victimTeam = GetClientTeam(victim);
  421. new attackerTeam = GetClientTeam(attacker);
  422. if (g_bFrozen[victim] && (victimTeam == attackerTeam) && (damage > 20)) {
  423. if (!StrEqual(sWeapon, "hegrenade") && g_iClientKnifeHits[victim] > 0) {
  424. UnFreeze(victim);
  425. if (++g_iClientThaws[attacker] >= g_iThawsPerNade) {
  426. new nadeCount = GetEntData(attacker, g_offsetAmmo+(11*4));
  427. if (GetPlayerWeaponSlot(attacker, 3) == -1)
  428. GivePlayerItem(attacker, "weapon_hegrenade");
  429. if (nadeCount < g_iMaxNades)
  430. SetEntData(attacker, g_offsetAmmo+(11*4), nadeCount+1);
  431. g_iClientThaws[attacker] = 0;
  432. }
  433. }
  434. else if (!StrEqual(sWeapon, "hegrenade") && g_iClientKnifeHits[victim] <= 0) {
  435. g_iClientKnifeHits[victim]++;
  436. new team;
  437. team = GetClientTeam(victim);
  438. if (team == 2)
  439. SetEntityRenderColor(victim, 255, g_iClientKnifeHits[victim]*140, 0, 112);
  440. else if (team == 3)
  441. SetEntityRenderColor(victim, 0, g_iClientKnifeHits[victim]*140, 255, 112);
  442. return;
  443. }
  444. else if (victim == attacker) {
  445. UnFreeze(victim);
  446. return;
  447. }
  448. switch (ClientLevelCheck(attacker, ++g_iClientScore[attacker])) {
  449. case 1: {
  450. SetEntPropFloat(attacker, Prop_Data, "m_flLaggedMovementValue", 1.1);
  451. PrintToChatAll("\x03%N \x04has reached Level 1!", attacker);
  452. }
  453. case 2: {
  454. SetEntPropFloat(attacker, Prop_Data, "m_flLaggedMovementValue", 1.14);
  455. PrintToChatAll("\x03%N \x04has reached Level 2!", attacker);
  456. }
  457. case 3: {
  458. SetEntPropFloat(attacker, Prop_Data, "m_flLaggedMovementValue", 1.18);
  459. PrintToChatAll("\x03%N \x04has reached Level 3!", attacker);
  460. }
  461. }
  462. }
  463. else if (!g_bFrozen[victim] && (victimTeam != attackerTeam) && (damage > 35)) {
  464. new time = GetTime()
  465. if(Invulnerabletime == -1 || (time-Invulnerabletime) > 1) {
  466. Freeze(victim);
  467. SetEntProp(victim, Prop_Data, "m_iDeaths", ++g_iClientDeaths[victim]);
  468. switch (ClientLevelCheck(attacker, ++g_iClientScore[attacker])) {
  469. case 1: {
  470. SetEntPropFloat(attacker, Prop_Data, "m_flLaggedMovementValue", 1.1);
  471. PrintToChatAll("\x03%N \x04has reached Level 1!", attacker);
  472. }
  473. case 2: {
  474. SetEntPropFloat(attacker, Prop_Data, "m_flLaggedMovementValue", 1.14);
  475. PrintToChatAll("\x03%N \x04has reached Level 2!", attacker);
  476. }
  477. case 3: {
  478. SetEntPropFloat(attacker, Prop_Data, "m_flLaggedMovementValue", 1.18);
  479. PrintToChatAll("\x03%N \x04has reached Level 3!", attacker);
  480. }
  481. }
  482. }
  483.  
  484.  
  485. }
  486.  
  487. }
  488. }
  489. }
  490.  
  491. Freeze(client) {
  492. g_bFrozen[client] = true;
  493. g_iClientKnifeHits[client] = 0;
  494. new index;
  495. if ((index = GetPlayerWeaponSlot(client, 2)) != -1) {
  496. RemovePlayerItem(client, index);
  497. RemoveEdict(index);
  498. }
  499. new nadeCount = GetEntData(client, g_offsetAmmo+(11*4));
  500. if (nadeCount == g_iMaxNades)
  501. SetEntData(client, g_offsetAmmo+(11*4), 1);
  502. else if ((index = GetPlayerWeaponSlot(client, 3)) != -1) {
  503. RemovePlayerItem(client, index);
  504. RemoveEdict(index);
  505. SetEntData(client, g_offsetAmmo+(11*4), 0);
  506. }
  507. decl Float:vec[3];
  508. GetClientEyePosition(client, vec);
  509. EmitAmbientSound(FREEZE_SOUND, vec, _, _, _, 0.4);
  510. SetEntityGravity(client, 1.0);
  511. SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", 0.0);
  512. new team;
  513.  
  514. team = GetClientTeam(client);
  515. if (team == 2)
  516. SetEntityRenderColor(client, 255, 0, 0, 112);
  517. else if (team == 3)
  518. SetEntityRenderColor(client, 0, 0, 255, 112);
  519.  
  520. if (g_fUFTime > 0.0)
  521. g_hFrozenTimer[client] = CreateTimer(g_fUFTime, TimerThaw, client);
  522. g_hBeaconTimer[client] = CreateTimer(1.0, BeaconGlow, client, TIMER_REPEAT);
  523. CheckFrozen();
  524. }
  525.  
  526. public Action:BeaconGlow(Handle:timer, any:client) {
  527.  
  528. if (IsClientInGame(client) && IsPlayerAlive(client) && g_bFrozen[client]) {
  529. static Float:vec[3];
  530. GetClientAbsOrigin(client, vec);
  531. vec[2] += 47.1;
  532.  
  533. new team;
  534. team = GetClientTeam(client);
  535. if (team == 3)
  536. TE_SetupGlowSprite(vec, g_GlowSprite, 1.0, 1.3, 500);
  537. else if (team == 2)
  538. TE_SetupGlowSprite(vec, g_GlowSpritee, 1.0, 1.3, 500);
  539.  
  540. TE_SendToAll();
  541. return Plugin_Continue;
  542. }
  543. g_hBeaconTimer[client] = INVALID_HANDLE;
  544. return Plugin_Stop;
  545. }
  546.  
  547. public EventPlayerDeath(Handle:event,const String:name[],bool:dontBroadcast) {
  548.  
  549. if (g_bEnabled) {
  550. new client = GetClientOfUserId(GetEventInt(event,"userid"));
  551. if (g_hFrozenTimer[client] != INVALID_HANDLE) {
  552. KillTimer(g_hFrozenTimer[client]);
  553. g_hFrozenTimer[client] = INVALID_HANDLE;
  554. }
  555. Dissolve(client);
  556. CheckFrozen();
  557. }
  558. }
  559.  
  560. public EventPlayerTeam(Handle:event,const String:name[],bool:dontBroadcast) {
  561. if (g_bEnabled) {
  562. CheckFrozen();
  563. }
  564. }
  565.  
  566. public Action:UserMessageHook(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init) {
  567.  
  568. if (g_bEnabled) {
  569. decl String:message[256];
  570. if(GetUserMessageType() == UM_Protobuf)
  571. PbReadString(bf, "message", message, sizeof(message));
  572. else
  573. BfReadString(bf, message, sizeof(message));
  574. if (StrContains(message, "teammate_attack") != -1)
  575. return Plugin_Handled;
  576. }
  577. return Plugin_Continue;
  578. }
  579.  
  580. public Action:SoundsHook(clients[64],&numClients,String:sample[PLATFORM_MAX_PATH],&entity,&channel,&Float:volume,&level,&pitch,&flags) {
  581.  
  582. if (g_bEnabled) {
  583. if ((StrContains(sample, "hegrenade/explode") != -1) ||
  584. (StrContains(sample, "player/death") != -1))
  585. return Plugin_Handled;
  586. }
  587. return Plugin_Continue;
  588. }
  589.  
  590. Dissolve(client) {
  591.  
  592. if (!IsValidEntity(client) || IsPlayerAlive(client))
  593. return;
  594. new ragdoll = GetEntPropEnt(client, Prop_Send, "m_hRagdoll");
  595. if (ragdoll<0)
  596. return;
  597. new String:dname[32], String:dtype[32];
  598. Format(dname, sizeof(dname), "dis_%d", client);
  599. Format(dtype, sizeof(dtype), "%d", 2);
  600. new ent = CreateEntityByName("env_entity_dissolver");
  601. if (ent != -1) {
  602. DispatchKeyValue(ragdoll, "targetname", dname);
  603. DispatchKeyValue(ent, "dissolvetype", dtype);
  604. DispatchKeyValue(ent, "target", dname);
  605. AcceptEntityInput(ent, "Dissolve");
  606. AcceptEntityInput(ent, "kill");
  607. }
  608. }
  609.  
  610. ClientLevelCheck(client, clientScore) {
  611.  
  612. SetEntProp(client, Prop_Data, "m_iFrags", clientScore);
  613. if (clientScore < g_iLevel1) {
  614. g_iClientLevel[client] = 0;
  615. return 0;
  616. }
  617. if (clientScore < g_iLevel2) {
  618. g_iClientLevel[client] = 1;
  619. if (clientScore == g_iLevel1)
  620. return 1;
  621. return 0;
  622. }
  623. if (clientScore < g_iLevel3) {
  624. g_iClientLevel[client] = 2;
  625. if (clientScore == g_iLevel2)
  626. return 2;
  627. return 0;
  628. }
  629. g_iClientLevel[client] = 3;
  630. if (clientScore == g_iLevel3)
  631. return 3;
  632. return 0;
  633. }
  634.  
  635. CheckFrozen() {
  636.  
  637. g_iTotalTs = 0;
  638. g_iFrozenTs = 0;
  639. g_iTotalCts = 0;
  640. g_iFrozenCts = 0;
  641. for (new i = 1; i <= MaxClients; i++) {
  642. if (IsClientInGame(i) && IsPlayerAlive(i)) {
  643. switch (GetClientTeam(i)) {
  644. case 2: {
  645. g_iTotalTs++;
  646. if (g_bFrozen[i])
  647. g_iFrozenTs++;
  648. }
  649. case 3: {
  650. g_iTotalCts++;
  651. if (g_bFrozen[i])
  652. g_iFrozenCts++;
  653. }
  654. }
  655. }
  656. }
  657. if (!g_bGameOver)
  658. WinCheck();
  659. }
  660.  
  661. WinCheck() {
  662.  
  663. if (g_iTotalTs <= g_iFrozenTs) {
  664. g_bGameOver = true;
  665. for (new i = 1; i <= MaxClients; i++) {
  666. if (IsClientInGame(i) && IsPlayerAlive(i)) {
  667. switch (GetClientTeam(i)) {
  668. case 2:
  669. ForcePlayerSuicide(i);
  670. case 3:
  671. if (g_bFrozen[i])
  672. UnFreeze(i);
  673. }
  674. }
  675. }
  676. PrintToChatAll("\x03All \x04Terrorists \x03Have Been \x04Frozen!!!");
  677. Roundstarttimestamp = -1;
  678. }
  679. else if (g_iTotalCts <= g_iFrozenCts) {
  680. g_bGameOver = true;
  681. for (new i = 1; i <= MaxClients; i++) {
  682. if (IsClientInGame(i) && IsPlayerAlive(i)) {
  683. switch (GetClientTeam(i)) {
  684. case 2:
  685. if (g_bFrozen[i])
  686. UnFreeze(i);
  687. case 3:
  688. ForcePlayerSuicide(i);
  689. }
  690. }
  691. }
  692. PrintToChatAll("\x03All \x04Counter-Terrorists \x03Have Been \x04Frozen!!!");
  693. Roundstarttimestamp = -1;
  694. }
  695. }
Advertisement
Add Comment
Please, Sign In to add comment