def get(self, info): """ Returns weapon properties """ if info == 'name': return self.info_name elif info == 'basename': return self.info_basename elif info == 'prop': return self.info_ammoprop elif info == 'tags': return self.info_tags elif info == 'slot': return self.info_slot elif info == 'clip': return self.info_clip elif info == 'maxammo': return int(self.info_maxammo) elif info == 'indexlist': return list(es.createentitylist(self)) elif info == 'indexiter': return iter(es.createentitylist(self)) raise ValueError, "No weapon info '%s'" % info
def get(self, info): """ Returns weapon properties """ if info == 'name': return self.info_name elif info == 'prop': return ('CBasePlayer.localdata.m_iAmmo.' + self.info_ammoprop) if self.info_ammoprop else None elif info == 'tags': return self.info_tags elif info == 'slot': return self.info_slot elif info == 'clip': return self.info_clip elif info == 'maxammo': return int(es.ServerVar('ammo_' + self.info_maxammo + '_max')) if isinstance( self.info_maxammo, str) else self.info_maxammo elif info == 'indexlist': return list(es.createentitylist(self.name)) raise ValueError, "No weapon info '%s'" % info
def check(self): """ This function is a function which is repeated every second to check all current player positions and relative smoke grenades. If the player is in range, damage them. """ smokeList = es.createentitylist("smokegrenade_projectile") for entity in self.entities.copy(): if entity in smokeList: x, y, z = map( float, es.getindexprop(entity, 'CBaseEntity.m_vecOrigin').split(",")) player = self.entities[entity] level = sourcerpg.players[player][skillName] for loopPlayer in playerlib.getPlayerList( '#t,#alive' if es.getplayerteam(player) == 3 else '#ct,#alive'): xx, yy, zz = loopPlayer.get('location') if abs(x - xx) <= 220 and abs(y - yy) <= 220 and abs( z - zz) <= 220: es.server.queuecmd('damage %s %s 32 %s' % (int(loopPlayer), level * int(damagePerLevel), player)) es.emitsound( 'player', int(loopPlayer), 'player/damage%s.wav' % random.randint(1, 3), '0.7', '0.6') else: self.removeEntity(entity)
def testcase(): playercount = len(playerlib.getUseridList('#all')) weaponcount = len(weaponlib.getWeaponList('#all')) entitycount = len(es.createentitylist('env_fire')) for line in ( 'profile begin foreach_test', 'profile begin foreach_player', 'testlib begin foreach_player "foreach player #all"', 'es_xset _foreach_count 0', 'foreach player _foreach_testvar #all "es_xmath _foreach_count + 1"', 'testlib fail_unless _foreach_count equalto %d' % playercount, 'testlib end', 'profile end foreach_player', 'profile begin foreach_weapon', 'testlib begin foreach_weapon "foreach weapon #all"', 'es_xset _foreach_count 0', 'foreach weapon _foreach_testvar #all "es_xmath _foreach_count + 1"', 'testlib fail_unless _foreach_count equalto %d' % weaponcount, 'testlib end', 'profile end foreach_weapon', 'profile begin foreach_entity', 'testlib begin foreach_entity "foreach entity env_fire"', 'es_xset _foreach_count 0', 'foreach entity _foreach_testvar _foreach_testvar env_fire "es_xmath _foreach_count + 1"', 'testlib fail_unless _foreach_count equalto %d' % entitycount, 'testlib end', 'profile end foreach_entity', 'profile begin foreach_token', 'testlib begin foreach_token "foreach token"', 'es_xset _foreach_count 0', 'foreach token _foreach_testvar "a-ab-abc-abcd-abcde" - "es_xmath _foreach_count + 1"', 'testlib fail_unless _foreach_count equalto 5', 'testlib end', 'profile end foreach_token', 'profile begin foreach_part', 'testlib begin foreach_part "foreach part"', 'es_xset _foreach_count 0', 'foreach part _foreach_testvar "a1b2c3d4e5" 2 "es_xmath _foreach_count + 1"', 'testlib fail_unless _foreach_count equalto 5', 'testlib end', 'profile end foreach_part', 'profile end foreach_test'): es.server.cmd(line)
def removeWeapon(self, weapon): """ Executes "lastinv" on the client if the weapon to remove is the player's active weapon Removes the weapon by index Creates a new weapon at the player's feet if necessary Announces the restricted pickup """ longname = "weapon_" + weapon xarestrict.logging.log("Weapon %s has been removed from user %s" % (weapon, es.getplayername(self.userid))) if es.createplayerlist(self.userid)[self.userid]["weapon"] == longname: es.cexec(self.userid, "lastinv") for index in es.createentitylist(longname): if es.getindexprop(x, "CBaseEntity.m_hOwnerEntity") <> self.handle: continue gamethread.delayedname(0.2, "saferemove_%s" % index, saferemove, index) if (getTeam(2).isRestricted(weapon) and getTeam(3).isRestricted(weapon)) if int(removebanned) else False: lastgive = -1 else: eye_angles = tuple(es.getplayerprop(self.userid, eyeangle_prop % x) for x in range(3)) es.server.cmd("es_xsetang %s 90 0 0" % self.userid) es.server.cmd("es_xentcreate %s %s" % (self.userid, longname)) lastgive = int(es.ServerVar("eventscripts_lastgive")) setNPCWeapon(longname) es.server.cmd("es_xsetang %s %s %s %s" % ((self.userid,) + eye_angles)) self.announceRestrictedPickup(weapon, lastgive) break
def getSiteIndex(centerpos): for index in es.createentitylist('func_bomb_target'): current_min = vecmath.vector(es.getindexprop(index, 'CBaseEntity.m_Collision.m_vecMins')) current_max = vecmath.vector(es.getindexprop(index, 'CBaseEntity.m_Collision.m_vecMaxs')) if vecmath.isbetweenRect(centerpos, current_min, current_max): return index return 0
def removeWeapon(self, weapon): """ Executes "lastinv" on the client if the weapon to remove is the player's active weapon Removes the weapon by index Creates a new weapon at the player's feet if necessary Announces the restricted pickup """ longname = 'weapon_' + weapon if es.createplayerlist(self.userid)[self.userid]['weapon'] == longname: es.cexec(self.userid, 'lastinv') for index in es.createentitylist(longname): if es.getindexprop(x, 'CBaseEntity.m_hOwnerEntity') <> self.handle: continue gamethread.delayedname(0.2, 'saferemove_%s'%index, saferemove, index) if (getTeam(2).isRestricted(weapon) and getTeam(3).isRestricted(weapon)) if int(removebanned) else False: lastgive = -1 else: eye_angles = tuple(es.getplayerprop(self.userid, eyeangle_prop % x) for x in range(3)) es.server.cmd('es_xsetang %s 90 0 0' % self.userid) es.server.cmd('es_xentcreate %s %s' % (self.userid, longname)) lastgive = int(es.ServerVar('eventscripts_lastgive')) setNPCWeapon(longname) es.server.cmd('es_xsetang %s %s %s %s' % ((self.userid,) + eye_angles)) self.announceRestrictedPickup(weapon, lastgive) break
def restart(): """ Teleports player to first level """ userid = es.getcmduserid() if (es.getplayerteam(userid) != 1): entities = es.createentitylist('info_teleport_destination') for i in entities: if (es.entitygetvalue(i, 'targetname') == "timer_stage1"): x = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop(userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed( 0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(i, 'origin').split(' ') startAng = es.entitygetvalue(i, 'angles').split(' ') gamethread.delayed( 0.01, es.setpos, (userid, startPos[0], startPos[1], startPos[2])) es.setang(userid, startAng[0], startAng[1], startAng[2])
def bonusMenu_select(userid, choice, popupid): if (es.getplayerteam(userid) == 1): return for a in range(1, 4): if (choice == '%s' % a): entities = es.createentitylist('info_teleport_destination') for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_bonus%s" % a): x = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop( userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed( 0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(b, 'origin').split(' ') startAng = es.entitygetvalue(b, 'angles').split(' ') es.setpos(userid, startPos[0], startPos[1], startPos[2]) es.setang(userid, startAng[0], startAng[1], startAng[2])
def stageMenu_select(userid, choice, popupid): if (es.getplayerteam(userid) == 1): return if (userid in started): started.remove(userid) for a in range(1, 26): if (choice == '%s' % a): entities = es.createentitylist('info_teleport_destination') for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_stage%s" % a): x = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop( userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed( 0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(b, 'origin').split(' ') startAng = es.entitygetvalue(b, 'angles').split(' ') es.setpos(userid, startPos[0], startPos[1], startPos[2]) es.setang(userid, startAng[0], startAng[1], startAng[2]) if (int(choice) > 7): gamethread.delayed(0.5, stageMenu.sendPage, (userid, (math.ceil(float(choice) / float(7))))) else: gamethread.delayed(0.5, stageMenu.send, (userid))
def _remove_weapon(userid, weapon): handle = es.getplayerhandle(userid) weapon = _prepend_prefix(weapon) for index in es.createentitylist(weapon): if es.getindexprop(index, 'CBaseEntity.m_hOwnerEntity') == handle: es.server.cmd('es_xremove %s' % index) break
def safeRemove(index): """ Ensures that an entity exists before safely removing it. @pararm int index The entity ID of the object to remove """ if index in es.createentitylist() and index: es.remove(index)
def RemoveWeapon(userid, weapon): handle = es.getplayerhandle(userid) if not weapon.startswith('weapon_'): weapon = "weapon_" + weapon for index in es.createentitylist(weapon): if es.getindexprop(index, 'CBaseEntity.m_hOwnerEntity') == handle: es.server.cmd('es_xremove %s' % index) break
def _extinguish(userid): napalmlist = es.createentitylist("entityflame") handle = es.getplayerhandle(userid) for flame_entity in napalmlist: string = es.getindexprop(flame_entity, 'CEntityFlame.m_hEntAttached') if string == handle: es.setindexprop(flame_entity, 'CEntityFlame.m_flLifetime', 0) break
def Kill_InfectedClip(Userid): handle = es.getplayerhandle(Userid) List = es.createentitylist() for index in List: if "tf_weapon" in List[index]["classname"]: for item in List[index]: if "clip" in str(item).lower(): if es.getindexprop(index,'CBaseEntity.m_hOwnerEntity') == handle: es.setindexprop(index,item,0)
def Request_SetPlayerMaxHealth(Userid,Health): for item in es.createentitylist("tf_player_manager"): Ent = item break index = int(playerlib.getPlayer(Userid).get('index')) Template = GetTemplate(str("CTFPlayerResource.m_iMaxHealth.0"),index) es.setindexprop(Ent,Template,Health) es.setplayerprop(Userid,"CTFPlayer.baseclass.baseclass.m_bGlowEnabled",1) es.setplayerprop(Userid,"CTFPlayer.baseclass.m_flMaxspeed",random.randint(300,400))
def foreach_entity(variable, classvariable, identifier, command): if identifier: entities = es.createentitylist(identifier) for entity in entities: variable.set(str(entity)) classvariable.set(str(entities[entity]['classname'])) es.server.cmd(command) else: es.dbgmsg(0, 'foreach entity: The identifier "%s" does not exists' % identifier)
def getSiteIndex(centerpos): for index in es.createentitylist('func_bomb_target'): current_min = vecmath.vector( es.getindexprop(index, 'CBaseEntity.m_Collision.m_vecMins')) current_max = vecmath.vector( es.getindexprop(index, 'CBaseEntity.m_Collision.m_vecMaxs')) if vecmath.isbetweenRect(centerpos, current_min, current_max): return index return 0
def getSpawnLocations(team): """Gets the spawn location using entities. Put them in a tuple and return them. team - the team number. 2 - Terrorist; 3 - CT""" if team == 2: tSpawnEntities = es.createentitylist("info_player_terrorist") locations = [] for key in tSpawnEntities: xyz = tuple(tSpawnEntities[key]["CBaseEntity.m_vecOrigin"].split(",")) locations.append(xyz) return tuple(locations) elif team == 3: ctSpawnEntities = es.createentitylist("info_player_counterterrorist") locations = [] for key in ctSpawnEntities: xyz = tuple(ctSpawnEntities[key]["CBaseEntity.m_vecOrigin"].split(",")) locations.append(xyz) return tuple(locations) else: return False
def removeidle(arg_weapons='#all'): """Removes idle weapons of the desired type""" arg_weapons = getWeaponList(arg_weapons) if not arg_weapons: raise IndexError, 'Invalid weapon list' for weapon in arg_weapons: for index in filter( lambda x: es.getindexprop(x, 'CBaseEntity.m_hOwnerEntity') == -1, es.createentitylist('weapon_' + weapon)): es.server.cmd('es_xremove %s' % index)
def _count_down(amount, bombType, userid): if amount: es.centermsg(amount) amount -= 1 gamethread.delayedname(1, '%s_%s' % (bombType, userid), _count_down, (amount, bombType, userid)) es.emitsound('player', userid, xa_adminbomb_sound, '1.0', '0.7') r, g, b, a = str(xa_adminbomb_beaconcolor).split() location = es.getplayerlocation(userid) effectlib.drawCircle(location, 150, steps=50, model="materials/sprites/laser.vmt", seconds=0.2, width=20, endwidth=10, red=r, green=g, blue=b, brightness=a, speed=70) elif bombType == "timebomb": for index in es.createentitylist('env_explosion'): es.server.cmd('es_xremove %s' % index) es.server.cmd('es_xgive %s env_explosion' % userid) es.server.cmd('es_xfire %s env_explosion addoutput "imagnitude 300"' % userid) es.server.cmd( 'es_xfire %s env_explosion addoutput "iradiusoverride 600"' % userid) es.setindexprop(es.ServerVar('eventscripts_lastgive'), 'CBaseEntity.m_hOwnerEntity', es.getplayerhandle(userid)) es.server.cmd('es_xfire %s env_explosion explode' % userid) es.server.cmd('es_xfire %s env_explosion kill' % userid) players[userid]['timebombed'] = 0 elif bombType == "freezebomb": x, y, z = es.getplayerlocation(userid) for player in es.getUseridList(): xx, yy, zz = es.getplayerlocation(player) if (((xx - x)**2 + (yy - y)**2 + (zz - z)**2)**0.5) <= 300: player = playerlib.Player(userid) gamethread.queue(player.set, ('noclip', 1)) gamethread.queue(player.set, ('freeze', 1)) players[userid]['freezebombed'] = 0 elif bombType == "firebomb": x, y, z = es.getplayerlocation(userid) for player in es.getUseridList(): xx, yy, zz = es.getplayerlocation(player) if (((xx - x)**2 + (yy - y)**2 + (zz - z)**2)**0.5) <= 300: es.server.cmd('es_xfire %s !self ignite' % player) gamethread.delayedname(xa_adminfirebomb_duration, 'remove_fire', _extinguish, player) players[userid]['firebombed'] = 0
def foreach_entity(variable, classvariable, identifier, command): if identifier: entities = es.createentitylist(identifier) for entity in entities: variable.set(str(entity)) classvariable.set(str(entities[entity]['classname'])) es.server.cmd(command) else: es.dbgmsg( 0, 'foreach entity: The identifier "%s" does not exists' % identifier)
def removeidle(arg_weapons="#all"): """Removes idle weapons of the desired type""" arg_weapons = getWeaponList(arg_weapons) if not arg_weapons: raise IndexError, "Invalid weapon list" for weapon in arg_weapons: for index in filter( lambda x: es.getindexprop(x, "CBaseEntity.m_hOwnerEntity") == -1, es.createentitylist("weapon_" + weapon) ): es.server.cmd("es_xremove %s" % index)
def removeEntity(self, entity): """ Remove a specific entity and cancel the delay @PARAM entity - the entity to remove """ if entity in self.entities: del self.entities[entity] gamethread.cancelDelayed("sourcerpg_smokegrenade_entity%s" % entity) """ Remove the entity if it exists """ if entity in es.createentitylist("smokegrenade_projectile"): es.remove(entity)
def _punishment_extinguish(userid, adminid, args, force): if str(xa_adminburn_anonymous) == '0' and not force: tokens = {} tokens['admin'] = es.getplayername(adminid) tokens['user'] = es.getplayername(userid) for user in playerlib.getPlayerList(): es.tell(user, xalanguage("admin extinguish", tokens, user.get("lang"))) # Copied from un-released playerlib flamelist = es.createentitylist("entityflame") handle = es.getplayerhandle(userid) for flame_entity in flamelist: string = es.getindexprop(flame_entity, 'CEntityFlame.m_hEntAttached') if string == handle: es.setindexprop(flame_entity, 'CEntityFlame.m_flLifetime', 0) break
def restart(): """ Teleports player to first level """ userid = es.getcmduserid() if (es.getplayerteam(userid) != 1): entities = es.createentitylist('info_teleport_destination') for i in entities: if (es.entitygetvalue(i, 'targetname') == "timer_stage1"): x = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop(userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed(0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(i, 'origin').split(' ') startAng = es.entitygetvalue(i, 'angles').split(' ') gamethread.delayed(0.01, es.setpos, (userid, startPos[0], startPos[1], startPos[2])) es.setang(userid, startAng[0], startAng[1], startAng[2])
def bonusMenu_select(userid, choice, popupid): if (es.getplayerteam(userid) == 1): return for a in range(1,4): if (choice == '%s' % a): entities = es.createentitylist('info_teleport_destination') for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_bonus%s" % a): x = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop(userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed(0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(b, 'origin').split(' ') startAng = es.entitygetvalue(b, 'angles').split(' ') es.setpos(userid, startPos[0], startPos[1], startPos[2]) es.setang(userid, startAng[0], startAng[1], startAng[2])
def smokegrenade_detonate(event_var): """ Executed when a smoke grenade detonates. Get the userid of the person who detonated it and add the user and entity into the class. @PARAM event_var - an automatically passed event instance """ userid = event_var['userid'] player = sourcerpg.players[userid] level = player[skillName] if level: """ The player has at least level 1, so create an instance of this object """ handle = es.getplayerhandle(userid) for entity in es.createentitylist("smokegrenade_projectile"): if handle == es.getindexprop(entity, 'CBaseEntity.m_hOwnerEntity'): """ Add in the entitty as we have the owner so the right handle """ smoke.addEntity(entity, userid) break
def check(self): """ This function is a function which is repeated every second to check all current player positions and relative smoke grenades. If the player is in range, damage them. """ smokeList = es.createentitylist("smokegrenade_projectile") for entity in self.entities.copy(): if entity in smokeList: x, y, z = map(float, es.getindexprop(entity, 'CBaseEntity.m_vecOrigin').split(",")) player = self.entities[entity] level = sourcerpg.players[player][skillName] for loopPlayer in playerlib.getPlayerList('#t,#alive' if es.getplayerteam(player) == 3 else '#ct,#alive'): xx, yy, zz = loopPlayer.get('location') if abs(x - xx) <= 220 and abs(y - yy) <= 220 and abs(z - zz) <= 220: es.server.queuecmd('damage %s %s 32 %s' % ( int(loopPlayer), level * int(damagePerLevel), player)) es.emitsound('player', int(loopPlayer), 'player/damage%s.wav' % random.randint(1, 3), '0.7', '0.6') else: self.removeEntity(entity)
def removeWeapon(self, weapon): """ Executes "lastinv" on the client if the weapon to remove is the player's active weapon Removes the weapon by index Creates a new weapon at the player's feet if necessary Announces the restricted pickup """ longname = 'weapon_' + weapon xarestrict.logging.log("Weapon %s has been removed from user %s" % (weapon, es.getplayername(self.userid))) if es.createplayerlist(self.userid)[self.userid]['weapon'] == longname: es.cexec(self.userid, 'lastinv') for index in es.createentitylist(longname): if es.getindexprop(x, 'CBaseEntity.m_hOwnerEntity') <> self.handle: continue gamethread.delayedname(0.2, 'saferemove_%s' % index, saferemove, index) if (getTeam(2).isRestricted(weapon) and getTeam(3).isRestricted(weapon) ) if int(removebanned) else False: lastgive = -1 else: eye_angles = tuple( es.getplayerprop(self.userid, eyeangle_prop % x) for x in range(3)) es.server.cmd('es_xsetang %s 90 0 0' % self.userid) es.server.cmd('es_xentcreate %s %s' % (self.userid, longname)) lastgive = int(es.ServerVar('eventscripts_lastgive')) setNPCWeapon(longname) es.server.cmd('es_xsetang %s %s %s %s' % ((self.userid, ) + eye_angles)) self.announceRestrictedPickup(weapon, lastgive) break
def stageMenu_select(userid, choice, popupid): if (es.getplayerteam(userid) == 1): return if (userid in started): started.remove(userid) for a in range(1,26): if (choice == '%s' % a): entities = es.createentitylist('info_teleport_destination') for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_stage%s" % a): x = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop(userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed(0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(b, 'origin').split(' ') startAng = es.entitygetvalue(b, 'angles').split(' ') es.setpos(userid, startPos[0], startPos[1], startPos[2]) es.setang(userid, startAng[0], startAng[1], startAng[2]) if (int(choice) > 7): gamethread.delayed(0.5, stageMenu.sendPage, (userid, (math.ceil(float(choice) / float(7))))) else: gamethread.delayed(0.5, stageMenu.send, (userid))
def get(self, info): """ Returns weapon properties """ if info == 'name': return self.info_name elif info == 'prop': return ('CBasePlayer.localdata.m_iAmmo.' + self.info_ammoprop) if self.info_ammoprop else None elif info == 'tags': return self.info_tags elif info == 'slot': return self.info_slot elif info == 'clip': return self.info_clip elif info == 'maxammo': return int(es.ServerVar('ammo_' + self.info_maxammo + '_max')) if isinstance(self.info_maxammo, str) else self.info_maxammo elif info == 'indexlist': return list(es.createentitylist(self.name)) raise ValueError, "No weapon info '%s'" % info
def _count_down(amount, bombType, userid): if amount: es.centermsg(amount) amount -= 1 gamethread.delayedname(1, '%s_%s'%(bombType, userid), _count_down, (amount, bombType, userid)) es.emitsound('player', userid, xa_adminbomb_sound, '1.0', '0.7') r, g, b, a = str(xa_adminbomb_beaconcolor).split() location = es.getplayerlocation(userid) effectlib.drawCircle(location, 150, steps=50, model="materials/sprites/laser.vmt", seconds=0.2, width=20, endwidth=10, red=r, green=g, blue=b, brightness = a, speed=70) elif bombType == "timebomb": for index in es.createentitylist('env_explosion'): es.server.cmd('es_xremove %s'%index) es.server.cmd('es_xgive %s env_explosion'%userid) es.server.cmd('es_xfire %s env_explosion addoutput "imagnitude 300"'%userid) es.server.cmd('es_xfire %s env_explosion addoutput "iradiusoverride 600"'%userid) es.setindexprop(es.ServerVar('eventscripts_lastgive'), 'CBaseEntity.m_hOwnerEntity', es.getplayerhandle(userid)) es.server.cmd('es_xfire %s env_explosion explode'%userid) es.server.cmd('es_xfire %s env_explosion kill'%userid) players[userid]['timebombed'] = 0 elif bombType == "freezebomb": x,y,z = es.getplayerlocation(userid) for player in es.getUseridList(): xx,yy,zz = es.getplayerlocation(player) if (((xx - x) ** 2 + (yy - y) ** 2 + (zz-z) ** 2) ** 0.5) <= 300: player = playerlib.Player(userid) gamethread.queue(player.set, ('noclip', 1)) gamethread.queue(player.set, ('freeze', 1)) players[userid]['freezebombed'] = 0 elif bombType == "firebomb": x,y,z = es.getplayerlocation(userid) for player in es.getUseridList(): xx,yy,zz = es.getplayerlocation(player) if (((xx - x) ** 2 + (yy - y) ** 2 + (zz-z) ** 2) ** 0.5) <= 300: es.server.cmd('es_xfire %s !self ignite'%player) gamethread.delayedname(xa_adminfirebomb_duration, 'remove_fire', _extinguish, player) players[userid]['firebombed'] = 0
def player_say(event_var): """ Executed when a player talks. Run the chat commands """ message = event_var['text'].strip() userid = int(event_var['userid']) if message == "!surftimer": """ Admin menu """ if isAuthed(userid): adminPopup.send(userid) elif message.startswith("!wr"): """ Display world record time to all players """ sortedList = mk_sortDict(str(currentMap)) es.tell( userid, "#multi", "#green[Surf Timer] #default- #lightgreen%s holds the world record with time #default%s#lightgreen." % (mapDicts[str(currentMap)][sortedList[0][0]]["name"], formatTime(sortedList[0][1]))) elif message.startswith("!top"): """ Display a popup with all times for that map, or if a map was present as an argument, display for that map. !top // display current map records !top <map name> // displays <map name>'s current records """ if message.count(" "): mapName = " ".join(message.split()[1:]) else: mapName = str(currentMap) if mapName not in mapDicts: es.tell( userid, "#multi", "#green[Surf Timer] #default- #lightgreenSorry, we cannot find %s on the server." % mapName) return if "startpos" not in mapDicts[mapName]: return if "endpos" not in mapDicts[mapName]: return topMenu = popuplib.easymenu("topMenu%s" % userid, "_popup_choice", None) topMenu.settitle("[Map Records : %s]" % mapName) sortedList = mk_sortDict(mapName) if sortedList: lx = 1 for top in sortedList: topMenu.addoption( 'an', "Rank " + str(lx) + ": " + mapDicts[mapName][top[0]]["name"] + " " + formatTime(mapDicts[mapName][top[0]]["time"])) lx += 1 else: topMenu.addoption('an', "[No places recorded]") topMenu.send(userid) elif message.startswith("!pr"): """ Similar to a rank command. Tell the user their time or another person's time on that current map. !pr // displays their time for that map !pr <userid/name/steamid> // displays the user's time for that map TODO: Add in an additional [map] argument and test for the last argument and see if it's a dict item. If so, then they want information for that map. """ mapName = str(currentMap) if mapName not in mapDicts: return if "startpos" not in mapDicts[mapName]: return if "endpos" not in mapDicts[mapName]: return if message.count(" "): message = " ".join(message.split()[1:]) target = es.getuserid(message) else: target = userid if not target: es.tell( userid, "#multi", "#green[Surf Timer] #default- #lightgreenSorry, we cannot find %s on the server." % message) return steamid = es.getplayersteamid(target) (_pos, _len) = mk_sortDictIndex(mapName, steamid) for player in es.getUseridList(): if (_pos > 0): sortedList = mk_sortDict(str(currentMap)) dictObject = mapDicts[mapName][steamid] es.tell( player, "#multi", "#green[Surf Timer] #default- #lightgreen%s is ranked #default%s/%s #lightgreenwith time #default%s #lightgreen(#default+%s#lightgreen)." % (dictObject['name'], _pos, _len, formatTime(dictObject['time']), formatTime(dictObject['time'] - sortedList[0][1]))) else: es.tell( player, "#multi", "#green[Surf Timer] #default- #lightgreen%s has not yet completed this map." % es.getplayername(target)) elif message.startswith("!stage"): """ Opens a stage selection menu """ mapName = str(currentMap) global stageMenu stageMenu = popuplib.easymenu('stageMenu', '_popup_choice', stageMenu_select) stageMenu.settitle("[Stage Menu : %s]" % (mapName)) entities = es.createentitylist('info_teleport_destination') """ Create Stage Menu """ stages = 0 for a in range(1, 26): for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_stage%s" % a): stageMenu.addoption('%s' % a, "Stage %s" % a) stages += 1 if (stages > 1): stageMenu.send(userid) if (userid in started): es.tell( userid, "#green", "Teleporting to a stage while the timer is active will clear your time" ) else: es.tell( userid, "#multi", "#green[Surf Timer] #default- #lightgreenThis is not a staged map." ) elif message.startswith("!bonus"): """ Opens a bonus selection menu """ mapName = str(currentMap) global bonusMenu bonusMenu = popuplib.easymenu('bonusMenu', '_popup_choice', bonusMenu_select) bonusMenu.settitle("[Bonus Menu : %s]" % (mapName)) entities = es.createentitylist('info_teleport_destination') bonuses = 0 """ Set up bonus menu and count the number of bonuses (up to 3 bonuses) """ for a in range(1, 4): for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_bonus%s" % a): bonuses += 1 bonusMenu.addoption('%s' % a, "Bonus %s" % a) if (bonuses > 1): bonusMenu.send(userid) elif (bonuses == 1): entities = es.createentitylist('info_teleport_destination') for i in entities: if (es.entitygetvalue(i, 'targetname') == "timer_bonus1"): x = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop( userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop( userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed( 0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(i, 'origin').split(' ') startAng = es.entitygetvalue(i, 'angles').split(' ') es.setpos(userid, startPos[0], startPos[1], startPos[2]) es.setang(userid, startAng[0], startAng[1], startAng[2]) else: es.tell( userid, "#multi", "#green[Surf Timer] #default- #lightgreenCurrent map has no bonuses." )
def createentitylist(argv): dict_to_keyvalues(argv[0], es.createentitylist(*argv[1:]))
def saferemove(arg_index): """Ensures the entity at index arg_index exists before it is removed""" if es.createentitylist(arg_index).has_key(int(arg_index)): es.server.cmd('es_xremove %s' % arg_index)
def removeidle(arg_weapons='#all'): """Removes idle weapons of the desired type""" arg_weapons = getWeaponList(arg_weapons) if not arg_weapons: raise IndexError, 'Invalid weapon list' for weapon in arg_weapons: for index in filter(lambda x: es.getindexprop(x, 'CBaseEntity.m_hOwnerEntity') == -1, es.createentitylist('weapon_' + weapon)): es.server.cmd('es_xremove %s' % index)
def player_say(event_var): """ Executed when a player talks. Run the chat commands """ message = event_var['text'].strip() userid = int(event_var['userid']) if message == "!surftimer": """ Admin menu """ if isAuthed(userid): adminPopup.send(userid) elif message.startswith("!wr"): """ Display world record time to all players """ sortedList = mk_sortDict(str(currentMap)) es.tell(userid, "#multi", "#green[Surf Timer] #default- #lightgreen%s holds the world record with time #default%s#lightgreen." % (mapDicts[str(currentMap)][sortedList[0][0]]["name"], formatTime(sortedList[0][1]))) elif message.startswith("!top"): """ Display a popup with all times for that map, or if a map was present as an argument, display for that map. !top // display current map records !top <map name> // displays <map name>'s current records """ if message.count(" "): mapName = " ".join(message.split()[1:]) else: mapName = str(currentMap) if mapName not in mapDicts: es.tell(userid, "#multi", "#green[Surf Timer] #default- #lightgreenSorry, we cannot find %s on the server." % mapName) return if "startpos" not in mapDicts[mapName]: return if "endpos" not in mapDicts[mapName]: return topMenu = popuplib.easymenu("topMenu%s" % userid, "_popup_choice",None) topMenu.settitle("[Map Records : %s]" % mapName) sortedList = mk_sortDict(mapName) if sortedList: lx = 1 for top in sortedList: topMenu.addoption('an', "Rank " + str(lx) + ": " + mapDicts[mapName][top[0]]["name"] + " " + formatTime(mapDicts[mapName][top[0]]["time"])) lx += 1 else: topMenu.addoption('an', "[No places recorded]") topMenu.send(userid) elif message.startswith("!pr"): """ Similar to a rank command. Tell the user their time or another person's time on that current map. !pr // displays their time for that map !pr <userid/name/steamid> // displays the user's time for that map TODO: Add in an additional [map] argument and test for the last argument and see if it's a dict item. If so, then they want information for that map. """ mapName = str(currentMap) if mapName not in mapDicts: return if "startpos" not in mapDicts[mapName]: return if "endpos" not in mapDicts[mapName]: return if message.count(" "): message = " ".join(message.split()[1:]) target = es.getuserid(message) else: target = userid if not target: es.tell(userid, "#multi", "#green[Surf Timer] #default- #lightgreenSorry, we cannot find %s on the server." % message) return steamid = es.getplayersteamid(target) (_pos, _len) = mk_sortDictIndex(mapName, steamid) for player in es.getUseridList(): if (_pos > 0): sortedList = mk_sortDict(str(currentMap)) dictObject = mapDicts[mapName][steamid] es.tell(player, "#multi", "#green[Surf Timer] #default- #lightgreen%s is ranked #default%s/%s #lightgreenwith time #default%s #lightgreen(#default+%s#lightgreen)." % (dictObject['name'], _pos, _len, formatTime(dictObject['time']), formatTime(dictObject['time'] - sortedList[0][1]))) else: es.tell(player, "#multi", "#green[Surf Timer] #default- #lightgreen%s has not yet completed this map." % es.getplayername(target)) elif message.startswith("!stage"): """ Opens a stage selection menu """ mapName = str(currentMap) global stageMenu stageMenu = popuplib.easymenu('stageMenu', '_popup_choice', stageMenu_select) stageMenu.settitle("[Stage Menu : %s]" % (mapName)) entities = es.createentitylist('info_teleport_destination') """ Create Stage Menu """ stages = 0 for a in range(1,26): for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_stage%s" % a): stageMenu.addoption('%s' % a, "Stage %s" % a) stages += 1 if (stages > 1): stageMenu.send(userid) if (userid in started): es.tell(userid, "#green", "Teleporting to a stage while the timer is active will clear your time") else: es.tell(userid, "#multi", "#green[Surf Timer] #default- #lightgreenThis is not a staged map.") elif message.startswith("!bonus"): """ Opens a bonus selection menu """ mapName = str(currentMap) global bonusMenu bonusMenu = popuplib.easymenu('bonusMenu', '_popup_choice', bonusMenu_select) bonusMenu.settitle("[Bonus Menu : %s]" % (mapName)) entities = es.createentitylist('info_teleport_destination') bonuses = 0 """ Set up bonus menu and count the number of bonuses (up to 3 bonuses) """ for a in range(1,4): for b in entities: if (es.entitygetvalue(b, 'targetname') == "timer_bonus%s" % a): bonuses += 1 bonusMenu.addoption('%s' % a, "Bonus %s" % a) if (bonuses > 1): bonusMenu.send(userid) elif (bonuses == 1): entities = es.createentitylist('info_teleport_destination') for i in entities: if (es.entitygetvalue(i, 'targetname') == "timer_bonus1"): x = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[0]") * -1 / 2 y = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[1]") * -1 / 2 z = es.getplayerprop(userid, "CBasePlayer.localdata.m_vecVelocity[2]") * -1 / 2 es.setplayerprop(userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z)) gamethread.delayed(0.01, es.setplayerprop, (userid, "CBasePlayer.localdata.m_vecBaseVelocity", es.createvectorstring(x, y, z))) startPos = es.entitygetvalue(i, 'origin').split(' ') startAng = es.entitygetvalue(i, 'angles').split(' ') es.setpos(userid, startPos[0], startPos[1], startPos[2]) es.setang(userid, startAng[0], startAng[1], startAng[2]) else: es.tell(userid, "#multi", "#green[Surf Timer] #default- #lightgreenCurrent map has no bonuses.")
def saferemove(arg_index): """Ensures the entity at index arg_index exists before it is removed""" if es.createentitylist(arg_index).has_key(int(arg_index)): es.server.cmd("es_xremove %s" % arg_index)