Beispiel #1
0
    def get_trace_ray(self, mask=ContentMasks.ALL, trace_filter=None):
        """Return the player's current trace data.

        :param ContentMasks mask:
            Will be passed to the trace filter.
        :param TraceFilter trace_filter:
            The trace filter to use. If ``None`` was given
            :class:`engines.trace.TraceFilterSimple` will be used.
        :rtype: GameTrace
        """
        # Get the eye location of the player
        start_vec = self.eye_location

        # Calculate the greatest possible distance
        end_vec = start_vec + self.view_vector * MAX_TRACE_LENGTH

        # Create a new trace object
        trace = GameTrace()

        # Start the trace
        engine_trace.trace_ray(
            Ray(start_vec, end_vec), mask,
            TraceFilterSimple(
                (self, )) if trace_filter is None else trace_filter, trace)

        # Return the trace data
        return trace
Beispiel #2
0
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
Beispiel #3
0
    def is_in_solid(
            self, mask=ContentMasks.ALL, generator=None):
        """Return whether or not the entity is in solid.

        :param ContentMasks mask:
            Contents the ray can possibly collide with.
        :param generator:
            A callable that returns an iterable which contains
            :class:`BaseEntity` instances that are ignored by the ray.
        :rtype: bool
        """
        # Get the entity's origin
        origin = self.origin

        # Get a Ray object of the entity physic box
        ray = Ray(origin, origin, self.mins, self.maxs)

        # Get a new GameTrace instance
        trace = GameTrace()

        # Do the trace
        if generator is None:

            # No need to trace against anything but the world if we are going
            # to filter out everything regardless.
            engine_trace.clip_ray_to_entity(
                ray, mask, BaseEntity(WORLD_ENTITY_INDEX), trace
            )
        else:
            engine_trace.trace_ray(ray, mask, TraceFilterSimple(
                generator()), trace)

        # Return whether or not the trace did hit
        return trace.did_hit()
    def get_trace_ray(self, mask=ContentMasks.ALL, trace_filter=None):
        """Return the player's current trace data.

        :param ContentMasks mask:
            Will be passed to the trace filter.
        :param TraceFilter trace_filter:
            The trace filter to use. If ``None`` was given
            :class:`engines.trace.TraceFilterSimple` will be used.
        :rtype: GameTrace
        """
        # Get the eye location of the player
        start_vec = self.eye_location

        # Calculate the greatest possible distance
        end_vec = start_vec + self.view_vector * MAX_TRACE_LENGTH

        # Create a new trace object
        trace = GameTrace()

        # Start the trace
        engine_trace.trace_ray(
            Ray(start_vec, end_vec), mask, TraceFilterSimple(
                (self,)) if trace_filter is None else trace_filter,
            trace
        )

        # Return the trace data
        return trace
Beispiel #5
0
def check_space(position, mins, maxs):
    mask = ContentMasks.ALL
    generator = BaseEntityGenerator
    ray = Ray(position, position, mins, maxs)

    trace = GameTrace()
    engine_trace.trace_ray(ray, mask, TraceFilterSimple(generator()), trace)
    return trace
Beispiel #6
0
def get_wall_between(command):
    var = str(command[1])
    user_one = int(command[2])
    user_two = int(command[3])
    origin_vector = Player.from_userid(user_one).origin
    direction_vector = Player.from_userid(user_two).origin
    trace = GameTrace()
    engine_trace.trace_ray(Ray(origin_vector, direction_vector),
                           ContentMasks.ALL, None, trace)
    ConVar(var).set_int(trace.did_hit_world())
Beispiel #7
0
def get_wall_between_command(command_info, var:ConVar, x:float, y:float, z:float, x2:float, y2:float, z2:float):
    vector = Vector(x, y, z)
    vector2 = Vector(x, y, z)

    trace = GameTrace()
    ray = Ray(vector, vector2)

    engine_trace.trace_ray(ray, ContentMasks.ALL, None, trace)

    var.set_int(trace.did_hit_world())
Beispiel #8
0
def wcs_getwallbetween_command(command_info, var:ConVar, player:convert_userid_to_player, target:convert_userid_to_player):
    if player is None or target is None:
        var.set_int(-1)
        return

    vector = player.origin
    vector2 = target.origin

    trace = GameTrace()
    ray = Ray(vector, vector2)

    engine_trace.trace_ray(ray, ContentMasks.ALL, None, trace)

    var.set_int(trace.did_hit_world())
Beispiel #9
0
    def _find_floor(self, origin):
        if origin is None:
            origin = self.origin

        end_trace_vec = origin + Vector(0, 0, -1) * MAX_TRACE_LENGTH

        trace = GameTrace()
        engine_trace.trace_ray(Ray(origin, end_trace_vec), ContentMasks.ALL,
                               TraceFilterSimple(), trace)

        if not trace.did_hit():
            return None

        return trace.end_position
Beispiel #10
0
    def is_in_solid(
            self, mask=ContentMasks.ALL, generator=BaseEntityGenerator):
        """Return whether or not the entity is in solid."""
        # Get a Ray object of the entity physic box
        ray = Ray(self.origin, self.origin, self.mins, self.maxs)

        # Get a new GameTrace instance
        trace = GameTrace()

        # Do the trace
        engine_trace.trace_ray(ray, mask, TraceFilterSimple(
            [entity.index for entity in generator()]), trace)

        # Return whether or not the trace did hit
        return trace.did_hit()
Beispiel #11
0
    def is_in_solid(
            self, mask=ContentMasks.ALL, generator=BaseEntityGenerator):
        """Return whether or not the entity is in solid."""
        # Get a Ray object of the entity physic box
        ray = Ray(self.origin, self.origin, self.mins, self.maxs)

        # Get a new GameTrace instance
        trace = GameTrace()

        # Do the trace
        engine_trace.trace_ray(ray, mask, TraceFilterSimple(
            [entity.index for entity in generator()]), trace)

        # Return whether or not the trace did hit
        return trace.did_hit()
Beispiel #12
0
    def get_trace_ray(self, mask=ContentMasks.ALL, trace_filter=None):
        """Return the player's current trace data."""
        # Get the eye location of the player
        start_vec = self.get_eye_location()

        # Calculate the greatest possible distance
        end_vec = start_vec + self.view_vector * MAX_TRACE_LENGTH

        # Create a new trace object
        trace = GameTrace()

        # Start the trace
        engine_trace.trace_ray(
            Ray(start_vec, end_vec), mask, TraceFilterSimple(
                (self.index,)) if trace_filter is None else trace_filter,
            trace
        )

        # Return the trace data
        return trace
Beispiel #13
0
def is_player_stuck(player_index, origin):
    '''Return whether or not the given player is stuck in solid.'''

    # Get the player's PlayerInfo instance...
    player_info = playerinfo_from_index(player_index)

    # Get the player's origin...
    #origin = player_info.origin

    # Get a Ray object based on the player physic box...
    ray = Ray(origin, origin, player_info.mins, player_info.maxs)

    # Get a new GameTrace instance...
    trace = GameTrace()

    # Do the trace...
    engine_trace.trace_ray(ray, ContentMasks.PLAYER_SOLID,
                           TraceFilterSimple(PlayerIter()), trace)

    # Return whether or not the trace did hit...
    return trace.did_hit()
Beispiel #14
0
    def is_in_solid(
            self, mask=ContentMasks.ALL, generator=BaseEntityGenerator):
        """Return whether or not the entity is in solid.

        :param ContentMasks mask:
            Contents the ray can possibly collide with.
        :param generator:
            A callable that returns an iterable which contains
            :class:`BaseEntity` instances that are ignored by the ray.
        :rtype: bool
        """
        # Get a Ray object of the entity physic box
        ray = Ray(self.origin, self.origin, self.mins, self.maxs)

        # Get a new GameTrace instance
        trace = GameTrace()

        # Do the trace
        engine_trace.trace_ray(ray, mask, TraceFilterSimple(
            generator()), trace)

        # Return whether or not the trace did hit
        return trace.did_hit()
    def is_in_solid(
            self, mask=ContentMasks.ALL, generator=BaseEntityGenerator):
        """Return whether or not the entity is in solid.

        :param ContentMasks mask:
            Contents the ray can possibly collide with.
        :param generator:
            A callable that returns an iterable which contains
            :class:`BaseEntity` instances that are ignored by the ray.
        :rtype: bool
        """
        # Get a Ray object of the entity physic box
        ray = Ray(self.origin, self.origin, self.mins, self.maxs)

        # Get a new GameTrace instance
        trace = GameTrace()

        # Do the trace
        engine_trace.trace_ray(ray, mask, TraceFilterSimple(
            generator()), trace)

        # Return whether or not the trace did hit
        return trace.did_hit()
Beispiel #16
0
    def create_beam(self):
        if self.prop is None:
            raise RuntimeError("Create prop first")

        end_trace_vec = self.origin + self.normal * MAX_TRACE_LENGTH

        trace = GameTrace()
        engine_trace.trace_ray(
            Ray(self.origin, end_trace_vec),
            ContentMasks.ALL,
            TraceFilterSimple(ignore=(self.prop.index, )),
            trace
        )

        if not trace.did_hit():
            return

        if self.owner.team == teams_by_name['ct']:
            beam_color = Color(100, 100, 255)
        else:
            beam_color = Color(255, 100, 100)

        self.beam_target = Entity.create("env_spark")
        self.beam_target.target_name = "_tripmines_target1_{}".format(self.id)
        self.beam_target.teleport(self.origin, None, None)
        self.beam_target.spawn()

        self.beam = Entity.create("env_beam")
        self.beam.target_name = "_tripmines_beam_{}".format(self.id)
        self.beam.spawn_flags = 1
        self.beam.teleport(trace.end_position, None, None)

        self.beam.set_key_value_float('BoltWidth', 1.0)
        self.beam.set_key_value_int('damage', 0)
        self.beam.set_key_value_float('HDRColorScale', 1.0)
        self.beam.set_key_value_int('life', 0)
        self.beam.set_key_value_string(
            'LightningStart', self.beam.target_name)
        self.beam.set_key_value_string(
            'LightningEnd', self.beam_target.target_name)
        self.beam.set_key_value_int('Radius', 255)
        self.beam.set_key_value_int('renderamt', 100)
        self.beam.set_key_value_color('rendercolor', beam_color)
        self.beam.set_key_value_int('StrikeTime', 1)
        self.beam.set_key_value_string('texture', "sprites/laserbeam.spr")
        self.beam.set_key_value_int('TextureScroll', 35)
        self.beam.set_key_value_int('TouchType', 3)

        self.beam.model = BEAM_MODEL
        self.beam.set_property_vector('m_vecEndPos', self.origin)

        self.beam.spawn()

        self.beam.call_input('TurnOff')
        self.beam.call_input('TurnOn')

        self.activated = True

        if config_manager['activation_sound'] != "":
            Sound(config_manager['activation_sound'],
                  index=self.prop.index,
                  attenuation=Attenuation.STATIC).play()
 def _get_trace(self, start, end, mask, player, trace):
     engine_trace.trace_ray(Ray(start, end), ContentMasks.ALL,
                            TraceFilterSimple((player, )), trace)
     return trace
Beispiel #18
0
 def can_see_location(self, vector):
     "Checks to see if the turret can see the <Vector> provided."
     trace = GameTrace()
     engine_trace.trace_ray(self.get_ray(vector), self.mask,
                            self.trace_filter, trace)
     return not trace.did_hit()
Beispiel #19
0
    def _tick(self):
        now = time()
        players = {
            wcsplayer: player.origin
            for player, wcsplayer in self._filter
        }

        for wcsplayer in list(players.keys()):
            if wcsplayer.player.dead:
                warn(f'Player "{wcsplayer.name}" should NOT be here')

                del players[wcsplayer]

        ignore = TraceFilterSimple(PlayerIter())

        for ward in self.copy():
            if ward._next_tick <= now:
                try:
                    ward.on_tick()
                except:
                    except_hooks.print_exception()

                    try:
                        ward.on_disappear()
                    except:
                        except_hooks.print_exception()

                    self.remove(ward)

                    continue
                else:
                    ward._next_tick = now + ward.tick_interval

                    ward.duration -= 1

                    if not ward.duration:
                        try:
                            ward.on_disappear()
                        except:
                            except_hooks.print_exception()

                        self.remove(ward)

            entities = ward.entities
            team = ward.team_target

            for wcsplayer, origin in players.items():
                if team is None or wcsplayer.player.team == team:
                    trace = GameTrace()
                    ray = Ray(ward.origin, origin)

                    engine_trace.trace_ray(ray, ContentMasks.ALL, ignore,
                                           trace)

                    if ward.has_within(origin) and not trace.did_hit_world():
                        if wcsplayer in entities:
                            if entities[wcsplayer] <= now:
                                entities[
                                    wcsplayer] = now + ward.update_interval

                                try:
                                    ward.on_update(wcsplayer)
                                except:
                                    except_hooks.print_exception()
                        else:
                            entities[wcsplayer] = now + ward.update_interval

                            try:
                                ward.on_enter(wcsplayer)
                            except:
                                except_hooks.print_exception()
                    else:
                        if wcsplayer in entities:
                            del entities[wcsplayer]

                            try:
                                ward.on_exit(wcsplayer)
                            except:
                                except_hooks.print_exception()