예제 #1
0
파일: entity.py 프로젝트: mmcgill/bravo
    def update(self):
        """
        Update this mob's location with respect to a factory.
        """

        # XXX  Discuss appropriate style with MAD
        player = self.manager.closest_player((self.location.x,
                                 self.location.y,
                                 self.location.z),
                                 16)

        if player == None:
            vector = (uniform(-.4,.4),
                      uniform(-.4,.4),
                      uniform(-.4,.4))

            target = (self.location.x + vector[0],
                self.location.y + vector[1],
                self.location.z + vector[2])
        else:
            target = (player.location.x,
                player.location.y,
                player.location.z)

            self_pos = (self.location.x, self.location.y, self.location.z)
            vector = gen_close_point(self_pos, target)

            vector = (
                clamp(vector[0], -0.4, 0.4),
                clamp(vector[1], -0.4, 0.4),
                clamp(vector[2], -0.4, 0.4),
            )

        new_position = (vector[0] + self.location.x,
            vector[1] + self.location.y,
            vector[2] + self.location.z,)

        new_theta = int(atan2(
            (self.location.z - new_position[2]),
            (self.location.x - new_position[0] ))
            + pi/2)

        if new_theta < 0 :
            new_theta = 0

        can_go = self.manager.check_block_collision(self.location, (-.3, 0, -.3,), (.5, 1, .5))
        self.location.theta = new_theta

        if can_go:
            self.slide = False
            self.location.x = new_position[0]
            self.location.y = new_position[1]
            self.location.z = new_position[2]

            self.manager.correct_origin_chunk(self)
            self.manager.broadcast(self.save_location_to_packet())
        else:
            self.slide = self.manager.slide_vector(vector, )
            self.manager.broadcast(self.save_location_to_packet())
예제 #2
0
파일: entity.py 프로젝트: JDShu/bravo
    def update(self):
        """
        Update this mob's location with respect to a factory.
        """

        # XXX  Discuss appropriate style with MAD
        # XXX remarkably untested
        player = self.manager.closest_player(self.location.pos, 16)

        if player is None:
            vector = (uniform(-.4,.4),
                      uniform(-.4,.4),
                      uniform(-.4,.4))

            target = self.location.pos + vector
        else:
            target = player.location.pos

            self_pos = self.location.pos
            vector = gen_close_point(self_pos, target)

            vector = (
                clamp(vector[0], -0.4, 0.4),
                clamp(vector[1], -0.4, 0.4),
                clamp(vector[2], -0.4, 0.4),
            )

        new_position = self.location.pos + vector

        new_theta = self.location.pos.heading(new_position)
        self.location.ori = self.location.ori._replace(theta=new_theta)

        # XXX explain these magic numbers please
        can_go = self.manager.check_block_collision(self.location.pos,
                (-10, 0, -10), (16, 32, 16))

        if can_go:
            self.slide = False
            self.location.pos = new_position

            self.manager.correct_origin_chunk(self)
            self.manager.broadcast(self.save_location_to_packet())
        else:
            self.slide = self.manager.slide_vector(vector)
            self.manager.broadcast(self.save_location_to_packet())
예제 #3
0
파일: entity.py 프로젝트: JDShu/bravo
    def update(self):
        """
        Update this mob's location with respect to a factory.
        """

        # XXX  Discuss appropriate style with MAD
        # XXX remarkably untested
        player = self.manager.closest_player(self.location.pos, 16)

        if player is None:
            vector = (uniform(-.4, .4), uniform(-.4, .4), uniform(-.4, .4))

            target = self.location.pos + vector
        else:
            target = player.location.pos

            self_pos = self.location.pos
            vector = gen_close_point(self_pos, target)

            vector = (
                clamp(vector[0], -0.4, 0.4),
                clamp(vector[1], -0.4, 0.4),
                clamp(vector[2], -0.4, 0.4),
            )

        new_position = self.location.pos + vector

        new_theta = self.location.pos.heading(new_position)
        self.location.ori = self.location.ori._replace(theta=new_theta)

        # XXX explain these magic numbers please
        can_go = self.manager.check_block_collision(self.location.pos,
                                                    (-10, 0, -10),
                                                    (16, 32, 16))

        if can_go:
            self.slide = False
            self.location.pos = new_position

            self.manager.correct_origin_chunk(self)
            self.manager.broadcast(self.save_location_to_packet())
        else:
            self.slide = self.manager.slide_vector(vector)
            self.manager.broadcast(self.save_location_to_packet())
예제 #4
0
 def test_straight_line(self):
     self.assertEqual((0, 0, 1), gen_close_point((0, 0, 0), (0, 0, 3)))
예제 #5
0
 def test_perfect_diagonal_3d_negative(self):
     self.assertEqual((-1, -1, -1), gen_close_point((0, 0, 0), (-3, -3, -3)))
예제 #6
0
 def test_perfect_diagonal_3d(self):
     self.assertEqual((1, 1, 1), gen_close_point((0, 0, 0), (3, 3, 3)))
예제 #7
0
 def test_straight_line(self):
     self.assertEqual((0, 0, 1), gen_close_point((0, 0, 0), (0, 0, 3)))
예제 #8
0
 def test_perfect_diagonal_3d_negative(self):
     self.assertEqual((-1, -1, -1), gen_close_point((0, 0, 0), (-3, -3, -3)))
예제 #9
0
 def test_perfect_diagonal_3d(self):
     self.assertEqual((1, 1, 1), gen_close_point((0, 0, 0), (3, 3, 3)))