def player_death(event_var): """ Removes the dead player's handle from the dictionary of living player handles Registers client command filter if this is the first unauthorized dead player Adds the player to the dictionary of dead players to monitor if the player is not authorized to observe opponents """ userid = int(event_var['userid']) team = int(event_var['es_userteam']) if event_var['es_userteam'] else 0 handle = es.getplayerhandle(userid) if team in team_handles: for loop_userid in dead_players: if dead_players[loop_userid] == handle: gamethread.delayedname(float(spec_delay), 'xaobserve_%s' % loop_userid, end_spec_delay, loop_userid) if loop_userid not in delays: delays.append(loop_userid) if handle in team_handles[team]: team_handles[team].remove(handle) if not xaobserve.isUseridAuthorized(userid, 'observe_opponent') and event_var['es_steamid'] <> 'BOT': if not dead_players: es.addons.registerClientCommandFilter(client_command_filter) dead_players[userid] = -1 gamethread.delayedname(float(spec_delay), 'xaobserve_%s' % userid, end_spec_delay, (userid, True) ) if userid not in delays: delays.append(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 player_death(event_var): # Find the number of hostages following the victim handle = es.getplayerhandle(event_var['userid']) hostages = len(filter(lambda index: es.getindexprop(index, 'CHostage.m_leader') == handle, es.getEntityIndexes('hostage_entity'))) # Were any hostages following? if not hostages: return # Was suicide? attacker = int(event_var['attacker']) if not attacker: return # Was a team kill? if event_var['es_userteam'] == event_var['es_attackerteam']: return # Get the attacker instance ggPlayer = Player(attacker) # Increment player hostage stops ggPlayer.hostage_stopped += hostages # Enough hostages stopped to level player up? if ggPlayer.hostage_stopped >= int(gg_hostage_stopped_stops): # Decrease the hostage stopped counter ggPlayer.hostage_stopped -= int(gg_hostage_stopped_stops) # The number of levels we will level up the player levels = 1 # If they shouldn't be skipping their current level, stop here if (not int(gg_hostage_stopped_skip_nade) and ggPlayer.weapon == 'hegrenade') or ( not int(gg_hostage_stopped_skip_knife) and ggPlayer.weapon == 'knife'): msg(ggPlayer.userid, 'CannotSkipLevel_ByStopping', {'level': ggPlayer.weapon}) return # Loop through weapons of the levels we plan to level the player past for weapon in getLevelupList(ggPlayer.level, ggPlayer.level + int(gg_hostage_stopped_levels)): # If gg_hostage_stopped_skip_knife or gg_hostage_stopped_skip_nade # are disabled, make sure the player will not skip that level if (not int(gg_hostage_stopped_skip_knife) and weapon == 'knife') or ( not int(gg_hostage_stopped_skip_nade) and weapon == 'hegrenade'): msg(ggPlayer.userid, 'CannotSkipLevel_ByStopping', {'level': weapon}) break # Add to the number of levels they will gain levels += 1 ggPlayer.levelup(levels, 0, 'hostage_stopped')
def player_death(event_var): """ Removes the dead player's handle from the dictionary of living player handles Registers client command filter if this is the first unauthorized dead player Adds the player to the dictionary of dead players to monitor if the player is not authorized to observe opponents """ userid = int(event_var['userid']) team = int(event_var['es_userteam']) if event_var['es_userteam'] else 0 handle = es.getplayerhandle(userid) if team in team_handles: for loop_userid in dead_players: if dead_players[loop_userid] == handle: gamethread.delayedname(float(spec_delay), 'xaobserve_%s' % loop_userid, end_spec_delay, loop_userid) if loop_userid not in delays: delays.append(loop_userid) if handle in team_handles[team]: team_handles[team].remove(handle) if not xaobserve.isUseridAuthorized( userid, 'observe_opponent') and event_var['es_steamid'] <> 'BOT': if not dead_players: es.addons.registerClientCommandFilter(client_command_filter) dead_players[userid] = -1 gamethread.delayedname(float(spec_delay), 'xaobserve_%s' % userid, end_spec_delay, (userid, True)) if userid not in delays: delays.append(userid)
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 index(self): '''Returns the index of a player on the team''' # Loop through all players on the server for userid in self.team_players: # Return the index of the first team player found return getindexfromhandle(getplayerhandle(userid))
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 player_death(event_var): # Get the userids of the attacker and victim attacker = int(event_var['attacker']) userid = int(event_var['userid']) # If there is no attacker (falling to death), return if not attacker: return # If the kill was a suicide, return if attacker == userid: return # If the kill was a teamkill, return if event_var['es_attackerteam'] == event_var['es_userteam']: return # Get the name of the weapon used to get the kill weapon = event_var['weapon'] ggPlayer = Player(attacker) level = ggPlayer.level # If the player has already leveled up internally, check their last level if attacker in recentlyLeveled: level -= 1 level = 1 if level < 1 else level reloadWeapons = [get_level_weapon(level)] # If nade bonus is loaded, add the bonus weapons to reloadWeapons if not str(gg_nade_bonus) in ('', '0'): reloadWeapons.extend(get_weapon(userid)) # If the weapon name doesn't match the player's level's weapon name at the # time, return if not weapon in reloadWeapons: return # If the player is on hegrenade or knife level, return if weapon in ('hegrenade', 'knife'): return # Get the weapon object and the size if its clip weaponObject = getWeapon(weapon) # Find the attacker's weapon index to be used to reload the weapon playerHandle = es.getplayerhandle(attacker) for index in weaponObject.indexlist: # When the attacker's handle matches the index handle we have found # the attacker's weapon index if es.getindexprop(index, 'CBaseEntity.m_hOwnerEntity') == playerHandle: # Set the clip to the maximum ammo allowed getPlayer(attacker)['clip'][weaponObject] = weaponObject.clip break
def __init__(self, userid): """ Default constructor, initialize variables @PARAM userid - the user who this class represents """ self.userid = int(userid) self.handle = es.getplayerhandle(self.userid) self.regening = False self.repeat = None
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 getspec(self): """ Gets the handle of the player that the user is spectating. """ handle = es.getplayerprop(self.userid, "CCSPlayer.baseclass.m_hObserverTarget") for tuserid in es.getUseridList(): thandle = es.getplayerhandle(tuserid) if thandle == handle: return tuserid return -1
def add_player_handle(userid, team): """Adds the player's handle to the dictionary of player handles according to team""" if team in (2, 3): handle = es.getplayerhandle(userid) if handle not in team_handles[team]: team_handles[team].append(handle) if playerlib.getPlayer(userid).get('isdead'): dead_players[userid] = -1 end_spec_delay(userid) elif userid in dead_players: del dead_players[userid]
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 gravity2(users, value): '''Set a player gravity...''' # Loop through all matching players... for userid in _get_matching_players(users): # Is the player dead? if es.getplayerprop(userid, 'CBasePlayer.pl.deadflag'): # Don't go further... continue # Set the player gravity... es.entitysetvalue( es.getindexfromhandle(es.getplayerhandle(userid)), 'gravity', value)
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 HG_Trail(uid): handle = es.getplayerhandle(uid) index = 0 for index in es.getEntityIndexes('hegrenade_projectile'): if handle == es.getindexprop(index, 'CBaseEntity.m_hOwnerEntity'): spe_effects.beamFollow( '#all', # users 0., # fDelay index, # iEntityIndex 'sprites/laser.vmt', # szModelPath 1, # iHaloIndex 0.5, # fLife 16, # fWidth 4, # fEndWidth 0, # fFadeLength 0, # iRed 255, # iGreen 0, # iBlue 255, # iAlpha )
def showHint(userid): key = es.getplayersteamid(userid) if not key == 'BOT': speed = playerlib.getPlayer(userid).getSpeed() color = playerlib.getPlayer(userid).getColor() index = float(es.getindexfromhandle(es.getplayerhandle(userid))) gravity = float(es.entitygetvalue(index, "gravity")) a,b,c,d = color playername = es.getplayername(userid) racenumber = tools.wcsgroup.wcsgroup.getUser(userid, "race") race = es.keygetvalue('wcsraces', racenumber, 'name') totallevel = tools.wcsgroup.wcsgroup.getUseruserid, "total_level") level = tools.wcsgroup.wcsgroup.getUseruserid, "level") xp = tools.wcsgroup.wcsgroup.getUseruserid, "xp") needed = (int(level)+1)*int(es.ServerVar("wcs_levelxp")) #rank = wcs.database.getRank(es.getplayersteamid(userid)) text = str(playername)+'\n=============\nRace: '+str(race)+'\nTotallevel: ['+str(totallevel)+']\nLevel: ['+str(level)+']\nXp: ['+str(xp)+'/'+str(needed)+']\n=============\nSpeed: '+str(round(speed*100))+'%' tools.expand.expand.keyHint(userid, text) player_spawn({'userid':userid})
def player_spawn(event_var): """ Executed automatically when a player spawns. Test to see if their recover key is active, if so, activate their weapons and give them back their previous weapons. @PARAM event_var - an automatically passed event instance """ userid = event_var['userid'] if es.getplayerprop(userid, 'CBasePlayer.pl.deadflag'): """ The player is dead so we ignore this event, return early """ return player = sourcerpg.players[userid] if player is not None: if player['recover']: level = player[skillName] if level: currentDelay = 0.1 """ Player is at least level one in this skill """ for weaponName in weaponlib.getWeaponNameList("#grenade"): while player[weaponName] > 0: gamethread.delayed(currentDelay, giveWeapon, (userid, weaponName)) player[weaponName] -= 1 if level >= 2: """ Player has at least level 2, give them back their secondary """ if player["secondary"]: handle = es.getplayerhandle(userid) for index in weaponlib.getIndexList({2 : "weapon_glock", 3 : "weapon_usp"}[es.getplayerteam(userid)]): if es.getindexprop(index, 'CBaseEntity.m_hOwnerEntity') == handle: safeRemove(index) break gamethread.delayed(currentDelay, giveWeapon, (userid, player["secondary"])) if level >= 3: """ Player has at least level 3, give them back their primary """ if player["primary"]: gamethread.delayed(currentDelay, giveWeapon, (userid, player["primary"])) player['recover'] = False
def __init__(self, userid): self.userid = userid self.handle = es.getplayerhandle(userid) self.restrictions = set()
def RunCmd(args): ucmd = spe.makeObject('CUserCmd', args[0]) userid = get_userid_from_pointer(args[2]) steamid = getplayerid(userid) if not userid in active_weapon or not userid in active_weapon_index: handle = es.getplayerprop(userid, "CBaseCombatCharacter.m_hActiveWeapon") index = es.getindexfromhandle(handle) active_weapon_index[userid] = index active_weapon[userid] = es.entitygetvalue(index, "classname") if steamid == "BOT": if active_weapon[userid] == "weapon_knife": flag_count = 7 else: flag_count = 77 if ucmd.buttons & IN_ATTACK or ucmd.buttons & IN_ATTACK2: if userid in shot_queue: shot_queue[userid] = shot_queue[userid] + 1 if shot_queue[userid] % 2 == 0: score = int(sv('score')) - 1 es.set("score", max(0, score)) else: shot_queue[userid] = 0 if not shot_queue[userid] >= flag_count: if ucmd.buttons & IN_ATTACK: ucmd.buttons &= ~IN_ATTACK elif ucmd.buttons & IN_ATTACK2: ucmd.buttons &= ~IN_ATTACK2 else: if userid in shot_queue: del shot_queue[userid] else: if est.isalive(userid): if ucmd.impulse % 256 == 100: ucmd.impulse = 0 if est.isalive(userid): ObserverMode = es.getplayerprop( userid, "CCSPlayer.baseclass.m_iObserverMode") if ObserverMode == 0: es.setplayerprop( userid, "CCSPlayer.baseclass.m_iObserverMode", 1) es.setplayerprop( userid, "CCSPlayer.baseclass.m_hObserverTarget", es.getplayerhandle(userid)) es.setplayerprop( userid, "CCSPlayer.baseclass.localdata.m_Local.m_bDrawViewmodel", 0) es.setplayerprop(userid, "CCSPlayer.baseclass.m_iFOV", 120) elif ObserverMode == 1: es.setplayerprop( userid, "CCSPlayer.baseclass.m_iObserverMode", 0) es.setplayerprop( userid, "CCSPlayer.baseclass.m_hObserverTarget", 0) es.setplayerprop( userid, "CCSPlayer.baseclass.localdata.m_Local.m_bDrawViewmodel", 1) es.setplayerprop(userid, "CCSPlayer.baseclass.m_iFOV", 90) if ucmd.buttons & IN_ATTACK2: ucmd.buttons &= ~IN_ATTACK2 if ucmd.buttons & IN_RELOAD: ucmd.buttons &= ~IN_RELOAD return (spe.HookAction.Continue, 0)
def getplayerhandle(argv): sv[argv[0]] = es.getplayerhandle(*argv[1:])
def player_death(event_var): # Find the number of hostages following the victim handle = es.getplayerhandle(event_var['userid']) hostages = len( filter( lambda index: es.getindexprop(index, 'CHostage.m_leader') == handle, es.getEntityIndexes('hostage_entity'))) # Were any hostages following? if not hostages: return # Was suicide? attacker = int(event_var['attacker']) if not attacker: return # Was a team kill? if event_var['es_userteam'] == event_var['es_attackerteam']: return # Get the attacker instance ggPlayer = Player(attacker) # Increment player hostage stops ggPlayer.hostage_stopped += hostages # Enough hostages stopped to level player up? if ggPlayer.hostage_stopped >= int(gg_hostage_stopped_stops): # Decrease the hostage stopped counter ggPlayer.hostage_stopped -= int(gg_hostage_stopped_stops) # The number of levels we will level up the player levels = 1 # If they shouldn't be skipping their current level, stop here if (not int(gg_hostage_stopped_skip_nade) and ggPlayer.weapon == 'hegrenade') or (not int(gg_hostage_stopped_skip_knife) and ggPlayer.weapon == 'knife'): msg(ggPlayer.userid, 'CannotSkipLevel_ByStopping', {'level': ggPlayer.weapon}) return # Loop through weapons of the levels we plan to level the player past for weapon in getLevelupList( ggPlayer.level, ggPlayer.level + int(gg_hostage_stopped_levels)): # If gg_hostage_stopped_skip_knife or gg_hostage_stopped_skip_nade # are disabled, make sure the player will not skip that level if (not int(gg_hostage_stopped_skip_knife) and weapon == 'knife') or (not int(gg_hostage_stopped_skip_nade) and weapon == 'hegrenade'): msg(ggPlayer.userid, 'CannotSkipLevel_ByStopping', {'level': weapon}) break # Add to the number of levels they will gain levels += 1 ggPlayer.levelup(levels, 0, 'hostage_stopped')
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 damage(users, _damage, attacker=None, armor=False, weapon=None): '''Damage a player...''' # Is there no player on the server? if not es.getplayercount(): # Don't go further... return # Create a 'point_hurt' entity... index = es.createentity('point_hurt') # Set the entity name... es.setentityname(index, index) # Does we need to apply damage on the player's armor? if armor: # Set the damage type to fall... es.entitysetvalue(index, 'damagetype', 32) # Is any weapon specified? if weapon: # Set the classname to the given weapon... es.entitysetvalue(index, 'classname', weapon) # Set the given damage... es.entitysetvalue(index, 'damage', _damage) # Loop through all matching players... for userid in _get_matching_players(users): # Is the player dead? if es.getplayerprop(userid, 'CBasePlayer.pl.deadflag'): # Don't go further... continue # Is the given damage need to be the player health? if _damage == '#health': # Set the damage to the player health... es.entitysetvalue(index, 'damage', es.getplayerprop(userid, 'CBasePlayer.m_iHealth')) # Get the player index... player_index = es.getindexfromhandle(es.getplayerhandle(userid)) # Store the actual player name... targetname = es.entitygetvalue(index, 'targetname') # Set the player name to his index... es.setentityname(player_index, player_index) # Set the damage target... es.entitysetvalue(index, 'damagetarget', player_index) # Is there's no attacker? if not attacker: # Damage the player... es.fire(userid, index, 'Hurt') # Otherwise... else: # Damage the player... es.fire(attacker, index, 'Hurt') # Set back the player name... es.fire(userid, player_index, 'AddOutput', 'targetname %s' % targetname) # Remove the entity later... gamethread.delayedname(0.5, '_wcs_delay', _remove_entity, index)
def RunCmd(args): ucmd = spe.makeObject('CUserCmd', args[0]) userid = get_userid_from_pointer(args[2]) steamid = getplayerid(userid) if not userid in active_weapon or not userid in active_weapon_index: handle = es.getplayerprop(userid, "CBaseCombatCharacter.m_hActiveWeapon") index = es.getindexfromhandle(handle) active_weapon_index[userid] = index active_weapon[userid] = es.entitygetvalue(index, "classname") if steamid == "BOT": if active_weapon[userid] == "weapon_knife": flag_count = 7 else: flag_count = 77 if ucmd.buttons & IN_ATTACK or ucmd.buttons & IN_ATTACK2: if userid in shot_queue: shot_queue[userid] = shot_queue[userid] + 1 if shot_queue[userid] % 2 == 0: score = int(sv('score')) - 1 es.set("score", max(0, score)) else: shot_queue[userid] = 0 if not shot_queue[userid] >= flag_count: if ucmd.buttons & IN_ATTACK: ucmd.buttons &= ~IN_ATTACK elif ucmd.buttons & IN_ATTACK2: ucmd.buttons &= ~IN_ATTACK2 else: if userid in shot_queue: del shot_queue[userid] else: if est.isalive(userid): if ucmd.impulse % 256 == 100: ucmd.impulse = 0 if est.isalive(userid): ObserverMode = es.getplayerprop(userid, "CCSPlayer.baseclass.m_iObserverMode") if ObserverMode == 0: es.setplayerprop(userid, "CCSPlayer.baseclass.m_iObserverMode", 1) es.setplayerprop(userid, "CCSPlayer.baseclass.m_hObserverTarget", es.getplayerhandle(userid)) es.setplayerprop(userid, "CCSPlayer.baseclass.localdata.m_Local.m_bDrawViewmodel", 0) es.setplayerprop(userid, "CCSPlayer.baseclass.m_iFOV", 120) elif ObserverMode == 1: es.setplayerprop(userid, "CCSPlayer.baseclass.m_iObserverMode", 0) es.setplayerprop(userid, "CCSPlayer.baseclass.m_hObserverTarget", 0) es.setplayerprop(userid, "CCSPlayer.baseclass.localdata.m_Local.m_bDrawViewmodel", 1) es.setplayerprop(userid, "CCSPlayer.baseclass.m_iFOV", 90) if ucmd.buttons & IN_ATTACK2: ucmd.buttons &= ~IN_ATTACK2 if ucmd.buttons & IN_RELOAD: ucmd.buttons &= ~IN_RELOAD return (spe.HookAction.Continue, 0)