# ./addons/eventscripts/freezetag/freezetag,py import es import gamethread import playerlib import time from usermsg import hudhint ezrestrict = es.import_addon('ezrestrict') ### SECONDS_TO_UNFREEZE = 3 UNFREEZE_CHECK = 0.5 # In seconds UNFREEZE_DISTANCE = 150 # In game units ### WeaponList = {} class Unfreeze(dict): def __init__(self): super(Unfreeze, self).__init__() self.start() def start(self): self.cancel() self.clear() self.step() def cancel(self): gamethread.cancelDelayed('freezetag') def step(self): playerlist = playerlib.getPlayerList('#alive') for player in playerlist: if not player.userid in self and not player.freeze: continue for subplayer in playerlist: # Cannot unfreeze yourself or be unfrozen by multiple players if player.userid in self and self[player.userid][0] != subplayer.userid: continue if player is not subplayer and player.team == subplayer.team: if player.getDistance(subplayer) <= UNFREEZE_DISTANCE: if player.userid not in self: self[player.userid] = (subplayer.userid, time.time()) elapsed = time.time() - self[player.userid][1] if elapsed < SECONDS_TO_UNFREEZE: # Update HUD elapsed_percent = min(1, elapsed / SECONDS_TO_UNFREEZE * 100) progress_bar = '[]' * int(elapsed_percent // 10) if elapsed_percent % 10 >= 5: progress_bar += '[' line1 = 'Unfreezing ' + player.name + '...' hudhint(subplayer, line1.center(len(progress_bar)) + '\n' + progress_bar.center(len(line1))) line1 = 'Being unfrozen by ' + subplayer.name + '...' hudhint(player, line1.center(len(progress_bar)) + '\n' + progress_bar.center(len(line1))) else: # Unfreeze del self[player.userid] player.freeze = 0 player.color = (255, 255, 255) player.godmode(0) player.slay() break gamethread.delayedname(UNFREEZE_CHECK, 'freezetag', self.step) unfreeze = Unfreeze() ### def load(): ezrestrict.restrict('@all','#all') ezrestrict.unrestrict('@all',['scout','knife']) # If this addon is loaded while players are connected # we want to set each player's health for player in playerlib.getPlayerList('#alive'): player.health = 1124 def round_start(event_var): # Restart the timer unfreeze.start() def player_spawn(event_var): if not int(event_var['es_userteam']): return es.server.queuecmd('es_xgive %s weapon_scout'%event_var['userid']) # We set each player's health so the players don't die playerlib.getPlayer(event_var['userid']).health = 1124 def player_hurt(event_var): # We don't want players to die myPlayer = playerlib.getPlayer(event_var['userid']) myPlayer.health = 1124 # If this is world damage and the player is frozen the player needs to # die to keep from getting stuck attacker = int(event_var['attacker']) if not attacker and myPlayer.freeze: # and change their color back myPlayer.color = (255, 255, 255) myPlayer.slay() return # If world damage, don't freeze the player if not attacker: return # If the player is not already frozen we need to freeze him or her if myPlayer != attacker and not myPlayer.freeze: # Freeze the player myPlayer.godmode(1) checkFreeze(myPlayer) # Color the player blue myPlayer.color = (0, 0, 255) # Save their primary and secondary weapon clips and reserve ammo amounts - also save any nades they have # Set all ammo to 0 and take away knife and all nades es.server.queuecmd('es_xremove %s'%myPlayer.getWeaponIndex('knife')) myPlayer.setClip('scout', 0) myPlayer.setAmmo('scout', 0) myPlayer.setClip('usp', 0) myPlayer.setAmmo('usp',0) # Tell each player what happened if attacker: es.tell(attacker, '#multi', '#defaultYou froze#lightgreen ' + event_var['es_username'] + '#default!') es.tell(myPlayer, '#multi', '#defaultYou were frozen by#lightgreen ' + event_var['es_attackername'] + '#default!') # If all players on the team are frozen the other team wins! myTeam = int(event_var['es_userteam']) for player in playerlib.getPlayerList('#alive'): if player.team == myTeam and not player.freeze: return # All players on the team are frozen so slay them for player in playerlib.getPlayerList('#alive'): if player.team == myTeam: # We need to change their color back as well player.color = (255, 255, 255) player.slay() def checkFreeze(player): if player.onGround(): player.freeze = 1 else: gamethread.delayedname(.2, 'checkFreeze_%s'%player.userid, checkFreeze, player) def player_disconnect(event_var): userid = int(event_var['userid']) gamethread.cancelDelayed('checkFreeze_%s'%event_var['userid']) if userid in WeaponList: del WeaponList[userid] for player in list(unfreeze): if unfreeze[player][0] == userid: del unfreeze[player] break def round_end(event_var): for userid in es.getUseridList(): gamethread.cancelDelayed('checkFreeze_%s'%userid) def unload(): ezrestrict.unrestrict('@all','#all') # Clean up our mess unfreeze.cancel() for player in playerlib.getPlayerList(): gamethread.cancelDelayed('checkFreeze_%s'%player.userid) player.freeze = 0 player.color = (255, 255, 255)