示例#1
0
 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)
示例#2
0
 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)
示例#3
0
 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)