def wcs_teleport_command(command_info, player:convert_userid_to_player, x:float, y:float, z:float): if player is None: return location = Vector(x, y, z) origin = player.origin angles = QAngle(*player.get_property_vector('m_angAbsRotation')) forward = Vector() right = Vector() up = Vector() angles.get_angle_vectors(forward, right, up) forward.normalize() forward *= 10 playerinfo = player.playerinfo mins, maxs = playerinfo.mins, playerinfo.maxs players = TraceFilterSimple(PlayerIter()) for _ in range(100): ray = Ray(location, location, mins, maxs) trace = GameTrace() engine_trace.trace_ray(ray, ContentMasks.PLAYER_SOLID, players, trace) if not trace.did_hit(): player.teleport(origin=location) break location -= forward if location.get_distance(origin) <= 10.0: break
def wcs_nearcoord_command(command_info, var:str, players:convert_identifier_to_players, x:float, y:float, z:float, distance:float, command:str): vector = Vector(x, y, z) for player in players: if vector.get_distance(player.origin) <= distance: for cmd in [f'es_xset {var} {player.userid}'] + command.split(';'): execute_server_command(*split(cmd))
def _wcs_teleport(command): userid = int(command[1]) x = float(command[2]) y = float(command[3]) z = float(command[4]) target_location = Vector( x, y, z, ) player = Player.from_userid(userid) origin = player.origin angles = QAngle(*player.get_property_vector('m_angAbsRotation')) forward = Vector() right = Vector() up = Vector() angles.get_angle_vectors(forward, right, up) forward.normalize() forward *= 10.0 loop_limit = 100 can_teleport = 1 while is_player_stuck(player.index, target_location): target_location -= forward loop_limit -= 1 if target_location.get_distance(origin) <= 10.0 or loop_limit < 1: can_teleport = 0 break if can_teleport == 1: player.teleport(target_location, None, None)
def chain_lightning(wcsplayer, variables): player = wcsplayer.player if not player.dead: team = player.team_index if team >= 2: max_targets = variables['max_targets'] radius = variables['radius'] targets = [] immune = 0 vector = Vector(*player.origin) # TODO: Check if there's a wall between the two players for target, wcstarget in PlayerReadyIter(['alive', 'ct' if wcsplayer.player.team_index == 2 else 't']): if wcstarget.data.get('ulti_immunity', False): immune += 1 chain_lightning_block_victim_message.send(target.index) else: vector2 = target.origin distance = vector.get_distance(vector2) if distance <= radius: targets.append((wcstarget, Vector(*vector2))) max_targets -= 1 if not max_targets: break if immune: chain_lightning_block_attacker_message.send(wcsplayer.index, count=immune) if targets: wcsplayer.skills['chain_lightning'].reset_cooldown() vector.z += 35 damage = variables['damage'] for (wcstarget, vector2) in targets: wcstarget.take_damage(damage, wcsplayer.index, 'orcish_horde-chain_lightning') vector2.z += 35 chain_lightning_0_effect.create(start_point=vector, end_point=vector2) chain_lightning_1_effect.create(start_point=vector, end_point=vector2) chain_lightning_2_effect.create(start_point=vector, end_point=vector2) chain_lightning_count_message.send(wcsplayer.index, count=len(targets)) else: chain_lightning_failed_message.send(wcsplayer.index)
def _getdistance(command): var = str(command[1]) x1 = float(command[2]) y1 = float(command[3]) z1 = float(command[4]) x2 = float(command[5]) y2 = float(command[6]) z2 = float(command[7]) vec1 = Vector(x1, y1, z1) vec2 = Vector(x2, y2, z2) distance = vec1.get_distance(vec2) ConVar(var).set_float(distance)
def teleport(wcsplayer, variables): player = wcsplayer.player vector1 = Vector(*player.origin) vector2 = Vector(*player.view_coordinates) if variables['range'] >= vector1.get_distance(vector2): vector2 -= vector1 vector2 *= 2 player.set_property_vector('m_vecBaseVelocity', vector2) wcsplayer.skills['teleport'].reset_cooldown() vector1.z += 25 teleport_effect_0.create(origin=vector1) teleport_effect_1.create(mins=vector1, maxs=vector1) teleport_effect_2.create(origin=vector1) teleport_effect_3.create(center=vector1) else: teleport_failed_message.send(wcsplayer.index)
def wcs_getdistance_command(command_info, var:ConVar, x:float, y:float, z:float, x2:float, y2:float, z2:float): vector = Vector(x, y, z) vector2 = Vector(x2, y2, z2) var.set_float(vector.get_distance(vector2))
def entangling_roots(wcsplayer, variables): player = wcsplayer.player if not player.dead: team = player.team_index if team >= 2: radius = variables['radius'] targets = [] immune = 0 vector = Vector(*player.origin) # TODO: Check if there's a wall between the two players for target, wcstarget in PlayerReadyIter( ['alive', 'ct' if team == 2 else 't']): if wcstarget.data.get('ulti_immunity', False): immune += 1 entangling_roots_block_victim_message.send(target.index) else: vector2 = target.origin distance = vector.get_distance(vector2) if distance <= radius: targets.append((wcstarget, Vector(*vector2))) if immune: entangling_roots_block_attacker_message.send(wcsplayer.index, count=immune) if targets: wcsplayer.skills['entangling_roots'].reset_cooldown() vector.z += 35 duration = variables['duration'] for (wcstarget, vector2) in targets: stuck = wcstarget.data.get('stuck', 0) if not stuck: if not wcstarget.data.get('noclip'): wcstarget.player.move_type = MoveType.NONE wcstarget.data['stuck'] = stuck + 1 delay = Delay(duration, _reset_root, (wcstarget, )) delay.args += (delay, ) _delays[wcstarget].append(delay) vector2.z += 10 entangling_roots_0_effect.create(center=vector2) vector2.z += 15 entangling_roots_1_effect.create(center=vector2) vector2.z += 10 entangling_roots_2_effect.create(start_point=vector, end_point=vector2) entangling_roots_3_effect.create(start_point=vector, end_point=vector2) entangling_roots_4_effect.create(start_point=vector, end_point=vector2) entangling_roots_count_message.send(wcsplayer.index, count=len(targets)) else: entangling_roots_failed_message.send(wcsplayer.index)