Ejemplo n.º 1
0
 def dig_hook(self, chunk, x, y, z, block):
     """
     Whenever a block is dug out, destroy descending tracks next to the block
     or tracks on top of the block.
     """
     world = factory.world
     # Block coordinates
     x = chunk.x * 16 + x
     z = chunk.z * 16 + z
     for (dx, dy, dz) in ((1, 0, 0), (0, 0, 1), (-1, 0, 0), (0, 0, -1),
                          (0, 1, 0)):
         # Get affected chunk
         coords = (x + dx, y + dy, z + dz)
         if world.get_block(coords) != blocks["tracks"].slot:
             continue
         # Check if descending
         metadata = world.get_metadata(coords)
         if dx == 1 and metadata != ASCEND_N:
             continue
         elif dx == -1 and metadata != ASCEND_S:
             continue
         elif dz == 1 and metadata != ASCEND_E:
             continue
         elif dz == -1 and metadata != ASCEND_W:
             continue
         # Remove track and metadata
         world.destroy(coords)
         # Drop track on ground - needs pixel coordinates
         pixcoords = ((x + dx) * 32 + 16, (y + 1) * 32, (z + dz) * 32 + 16)
         factory.give(pixcoords, (blocks["tracks"].slot, 0), 1)
Ejemplo n.º 2
0
    def chat_command(self, username, parameters):
        if len(parameters) == 0:
            return ("Usage: /{0} {1}".format(self.name, self.usage),)
        elif len(parameters) == 1:
            block = parameters[0]
            count = 1
        elif len(parameters) == 2:
            block = parameters[0]
            count = parameters[1]
        else:
            block = " ".join(parameters[:-1])
            count = parameters[-1]

        player = parse_player(factory, username)
        block = parse_block(block)
        count = parse_int(count)

        # Get a location two blocks in front of the player.
        dest = player.player.location.in_front_of(2)
        dest.y += 1

        coords = int(dest.x * 32), int(dest.y * 32), int(dest.z * 32)

        factory.give(coords, block, count)

        # Return an empty tuple for iteration
        return tuple()
Ejemplo n.º 3
0
 def dig_hook(self, chunk, x, y, z, block):
     """
     Whenever a block is dug out, destroy descending tracks next to the block
     or tracks on top of the block.
     """
     world = factory.world
     # Block coordinates
     x = chunk.x * 16 + x
     z = chunk.z * 16 + z
     for (dx, dy, dz) in ((1, 0, 0), (0, 0, 1), (-1, 0, 0), (0, 0, -1),
                          (0, 1, 0)):
         # Get affected chunk
         coords = (x + dx, y + dy, z + dz)
         if world.get_block(coords) != blocks["tracks"].slot:
             continue
         # Check if descending
         metadata = world.get_metadata(coords)
         if dx == 1 and metadata != ASCEND_N:
             continue
         elif dx == -1 and metadata != ASCEND_S:
             continue
         elif dz == 1 and metadata != ASCEND_E:
             continue
         elif dz == -1 and metadata != ASCEND_W:
             continue
         # Remove track and metadata
         world.destroy(coords)
         # Drop track on ground - needs pixel coordinates
         pixcoords = ((x + dx) * 32 + 16, (y + 1) * 32, (z + dz) * 32 + 16)
         factory.give(pixcoords, (blocks["tracks"].slot, 0), 1)
Ejemplo n.º 4
0
    def dig_hook(self, chunk, x, y, z, block):
        """
        Whenever a block is dug out, destroy any torches attached to the
        block, and drop pickups for them.
        """

        world = factory.world
        # Block coordinates
        x = chunk.x * 16 + x
        z = chunk.z * 16 + z
        for dx, dy, dz, dmetadata in (
            (1,  0,  0, 0x1),
            (-1, 0,  0, 0x2),
            (0,  0,  1, 0x3),
            (0,  0, -1, 0x4),
            (0,  1,  0, 0x5)):
            # Check whether the attached block is a torch.
            coords = (x + dx, y + dy, z + dz)
            dblock = yield world.get_block(coords)
            if dblock not in (blocks["torch"].slot,
                blocks["redstone-torch"].slot):
                continue

            # Check whether this torch is attached to the block being dug out.
            metadata = yield world.get_metadata(coords)
            if dmetadata != metadata:
                continue

            # Destroy torches! Mwahahaha!
            world.destroy(coords)

            # Drop torch on ground - needs pixel coordinates
            pixcoords = ((x + dx) * 32 + 16, (y + 1) * 32, (z + dz) * 32 + 16)
            factory.give(pixcoords, blocks[dblock].key, 1)
Ejemplo n.º 5
0
    def dig_hook(self, chunk, x, y, z, block):
        """
        Whenever a block is dug out, destroy any torches attached to the
        block, and drop pickups for them.
        """

        world = factory.world
        # Block coordinates
        x = chunk.x * 16 + x
        z = chunk.z * 16 + z
        for dx, dy, dz, dmetadata in ((1, 0, 0, 0x1), (-1, 0, 0, 0x2),
                                      (0, 0, 1, 0x3), (0, 0, -1,
                                                       0x4), (0, 1, 0, 0x5)):
            # Check whether the attached block is a torch.
            coords = (x + dx, y + dy, z + dz)
            dblock = yield world.get_block(coords)
            if dblock not in (blocks["torch"].slot,
                              blocks["redstone-torch"].slot):
                continue

            # Check whether this torch is attached to the block being dug out.
            metadata = yield world.get_metadata(coords)
            if dmetadata != metadata:
                continue

            # Destroy torches! Mwahahaha!
            world.destroy(coords)

            # Drop torch on ground - needs pixel coordinates
            pixcoords = ((x + dx) * 32 + 16, (y + 1) * 32, (z + dz) * 32 + 16)
            factory.give(pixcoords, blocks[dblock].key, 1)
Ejemplo n.º 6
0
    def use_hook(self, player, target, button):
        # Block coordinates.
        x, y, z = target.location.x, target.location.y, target.location.z

        # Offset coords according to direction. A painting does not
        # occupy a block, therefore we drop the pickup right in front of the
        # block it is attached to.
        face = direction_to_face[target.direction]
        if face == "-x":
            x -= 1
        elif face == "+x":
            x += 1
        elif face == "-z":
            z -= 1
        elif face == "+z":
            z += 1

        # Pixel coordinates.
        coords = (x * 32 + 16, y * 32, z * 32 + 16)

        factory.destroy_entity(target)
        factory.give(coords, (items["paintings"].slot, 0), 1)

        packet = make_packet("destroy", eid=target.eid)
        factory.broadcast(packet)

        # Force the chunk (with its entities) to be saved to disk.
        factory.world.mark_dirty((x, y, z))
Ejemplo n.º 7
0
    def chat_command(self, username, parameters):
        if len(parameters) == 0:
            return ("Usage: /{0} {1}".format(self.name, self.usage),)
        elif len(parameters) == 1:
            block = parameters[0]
            count = 1
        elif len(parameters) == 2:
            block = parameters[0]
            count = parameters[1]
        else:
            block = " ".join(parameters[:-1])
            count = parameters[-1]

        player = parse_player(factory, username)
        block = parse_block(block)
        count = int(count)

        # Get a location two blocks in front of the player.
        dest = player.player.location.in_front_of(2)
        dest.y += 1

        coords = int(dest.x * 32), int(dest.y * 32), int(dest.z * 32)

        factory.give(coords, block, count)

        # Return an empty tuple for iteration
        return tuple()
Ejemplo n.º 8
0
    def dig_hook(self, chunk, x, y, z, block):
        if block.drop == blocks["air"].slot:
            return

        # Block coordinates...
        x = chunk.x * 16 + x
        z = chunk.z * 16 + z

        # ...and pixel coordinates.
        coords = (x * 32 + 16, y * 32, z * 32 + 16)

        # Drop a block, according to the block's drop ratio. It's important to
        # remember that, for most blocks, the drop ratio is 1, so we should
        # have a short-circuit for those cases.
        if block.ratio == 1 or random.random() <= block.ratio:
            factory.give(coords, (block.drop, 0), block.quantity)
Ejemplo n.º 9
0
    def dig_hook(self, chunk, x, y, z, block):
        if block.drop == blocks["air"].key:
            return

        # Block coordinates...
        x = chunk.x * 16 + x
        z = chunk.z * 16 + z

        # ...and pixel coordinates.
        coords = (x * 32 + 16, y * 32, z * 32 + 16)

        # Drop a block, according to the block's drop ratio. It's important to
        # remember that, for most blocks, the drop ratio is 1, so we should
        # have a short-circuit for those cases.
        if block.ratio == 1 or random.random() <= block.ratio:
            factory.give(coords, block.drop, block.quantity)
Ejemplo n.º 10
0
def drop_items(location, items, y_offset = 0):
    """
    Loop over items and drop all of them

    :param location: Location() or tuple (x, y, z)
    :param items: list of items
    """

    # XXX why am I polymorphic? :T
    if type(location) == Location:
        x, y, z = location.x, location.y, location.z
    else:
        x, y, z = location
    y += y_offset
    coords = (int(x * 32) + 16, int(y * 32) + 16, int(z * 32) + 16)
    for item in items:
        if item is None:
            continue
        factory.give(coords, (item[0], item[1]), item[2])
Ejemplo n.º 11
0
    def use_hook(self, player, target, button):
        # Block coordinates.
        x, y, z = target.location.x, target.location.y, target.location.z

        # Offset coords according to direction. A painting does not
        # occupy a block, therefore we drop the pickup right in front of the
        # block it is attached to.
        face = direction_to_face[target.direction]
        x, y, z = adjust_coords_for_face((x, y, z), face)

        # Pixel coordinates.
        coords = (x * 32 + 16, y * 32, z * 32 + 16)

        factory.destroy_entity(target)
        factory.give(coords, (items["paintings"].slot, 0), 1)

        packet = make_packet("destroy", eid=target.eid)
        factory.broadcast(packet)

        # Force the chunk (with its entities) to be saved to disk.
        factory.world.mark_dirty((x, y, z))