def check_aabbs(self): out = [] self.add_grid_bounding_boxes_to(out) check = [0, 0, 0, 0] if len(out) == 3: bb = out[2] if fops.gt(bb.min_x, self.x): check[2] = -1 elif fops.lt(bb.max_x, self.x + 1): check[2] = 1 if fops.gt(bb.min_z, self.z): check[3] = -1 elif fops.lt(bb.max_z, self.z + 1): check[3] = 1 bb = out[1] if fops.gt(bb.min_x, self.x): check[0] = -1 elif fops.lt(bb.max_x, self.x + 1): check[0] = 1 if fops.gt(bb.min_z, self.z): check[1] = -1 elif fops.lt(bb.max_z, self.z + 1): check[1] = 1 if check[2] != 0 or check[3] != 0: if check[0] != 0: check[2] = check[0] if check[1] != 0: check[3] = check[1] yield AABB.from_block_coords(self.x + check[2] * config.PLAYER_RADIUS, self.y + 0.5, self.z + check[3] * config.PLAYER_RADIUS) else: if check[0] != 0: yield AABB.from_block_coords(self.x + check[0] * config.PLAYER_RADIUS, self.y + 0.5, self.z) if check[1] != 0: yield AABB.from_block_coords(self.x, self.y + 0.5, self.z + check[1] * config.PLAYER_RADIUS)
def _can_stand_on(self): """ can stand on top of the center of the block """ if isinstance(self.block, blocks.Cactus): return False under = self.grid.get_block(self.coords[0], self.coords[1] - 1, self.coords[2]) if not self.block.collidable and not under.is_fence and not self.block.is_water and not self.block.is_ladder_vine: return False if self.block.is_ladder_vine or self.block.is_water: bb = AABB.from_block_coords(self.block.coords) if under.is_fence: self.bb_stand = bb.shift(min_y=under.max_y) else: if not under.collidable or (under.collidable and fops.lt(under.max_y, bb.min_y)): bb1 = bb.offset(dy=0.5) if self.can_be_in(bb1): bb = bb1 self.bb_stand = bb self.stand_block = self.block self.platform = self.bb_stand.set_to(max_y=self.bb_stand.min_y) else: if under.is_fence: fence_top = under.maxedge_platform(y=1) if self.block.collidable: self.platform = self.block.maxedge_platform(y=1) self.stand_block = self.block if fence_top.min_y > self.platform.min_y: self.platform = fence_top self.stand_block = under else: self.platform = fence_top self.stand_block = under else: self.platform = self.block.maxedge_platform(y=1) self.stand_block = self.block bb = AABB.from_block_coords(self.block.coords) self.bb_stand = bb.offset(dy=self.platform.min_y - bb.min_y) if not self.bb_stand.collides_on_axes(self.platform, x=True, z=True): return False return self.can_be_in(self.bb_stand)
def check_aabbs(self): out = [] self.add_grid_bounding_boxes_to(out) check = [0, 0, 0, 0] if len(out) == 3: bb = out[2] if fops.gt(bb.min_x, self.x): check[2] = -1 elif fops.lt(bb.max_x, self.x + 1): check[2] = 1 if fops.gt(bb.min_z, self.z): check[3] = -1 elif fops.lt(bb.max_z, self.z + 1): check[3] = 1 bb = out[1] if fops.gt(bb.min_x, self.x): check[0] = -1 elif fops.lt(bb.max_x, self.x + 1): check[0] = 1 if fops.gt(bb.min_z, self.z): check[1] = -1 elif fops.lt(bb.max_z, self.z + 1): check[1] = 1 if check[2] != 0 or check[3] != 0: if check[0] != 0: check[2] = check[0] if check[1] != 0: check[3] = check[1] yield AABB.from_block_coords( self.x + check[2] * config.PLAYER_RADIUS, self.y + 0.5, self.z + check[3] * config.PLAYER_RADIUS) else: if check[0] != 0: yield AABB.from_block_coords( self.x + check[0] * config.PLAYER_RADIUS, self.y + 0.5, self.z) if check[1] != 0: yield AABB.from_block_coords( self.x, self.y + 0.5, self.z + check[1] * config.PLAYER_RADIUS)