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())
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())
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())
def test_straight_line(self): self.assertEqual((0, 0, 1), gen_close_point((0, 0, 0), (0, 0, 3)))
def test_perfect_diagonal_3d_negative(self): self.assertEqual((-1, -1, -1), gen_close_point((0, 0, 0), (-3, -3, -3)))
def test_perfect_diagonal_3d(self): self.assertEqual((1, 1, 1), gen_close_point((0, 0, 0), (3, 3, 3)))