Search in sources :

Example 1 with Nameable

use of org.bukkit.Nameable in project Prism-Bukkit by prism.

the class BlockAction method createActionData.

private void createActionData(BlockState state) {
    switch(state.getType()) {
        case SPAWNER:
            final SpawnerActionData spawnerActionData = new SpawnerActionData();
            final CreatureSpawner spawner = (CreatureSpawner) state;
            spawnerActionData.entityType = spawner.getSpawnedType().name().toLowerCase();
            spawnerActionData.delay = spawner.getDelay();
            actionData = spawnerActionData;
            break;
        case PLAYER_WALL_HEAD:
        case PLAYER_HEAD:
            SkullActionData headActionData = new SkullActionData();
            if (state instanceof Skull) {
                Skull skull = ((Skull) state);
                if (skull.getOwningPlayer() != null) {
                    headActionData.owner = skull.getOwningPlayer().getUniqueId().toString();
                }
            }
            setBlockRotation(state, headActionData);
            actionData = headActionData;
            break;
        case SKELETON_SKULL:
        case SKELETON_WALL_SKULL:
        case WITHER_SKELETON_SKULL:
        case WITHER_SKELETON_WALL_SKULL:
            SkullActionData skullActionData = new SkullActionData();
            setBlockRotation(state, skullActionData);
            actionData = skullActionData;
            break;
        case COMMAND_BLOCK:
            final CommandBlock cmdBlock = (CommandBlock) state;
            final CommandActionData commandActionData = new CommandActionData();
            commandActionData.command = cmdBlock.getCommand();
            actionData = commandActionData;
            break;
        default:
            if (Tag.SIGNS.isTagged(state.getType())) {
                final SignActionData signActionData = new SignActionData();
                final Sign sign = (Sign) state;
                signActionData.lines = sign.getLines();
                actionData = signActionData;
            }
            if (Tag.BANNERS.isTagged(state.getType())) {
                final BannerActionData bannerActionData = new BannerActionData();
                final Banner banner = (Banner) state;
                bannerActionData.patterns = new HashMap<>();
                setBlockRotation(state, bannerActionData);
                banner.getPatterns().forEach(pattern -> bannerActionData.patterns.put(pattern.getPattern().name(), pattern.getColor().name()));
                actionData = bannerActionData;
            }
            break;
    }
    if (state instanceof Nameable && ((Nameable) state).getCustomName() != null) {
        if (actionData == null) {
            actionData = new BlockActionData();
        }
        actionData.customName = ((Nameable) state).getCustomName();
    }
}
Also used : Banner(org.bukkit.block.Banner) CommandBlock(org.bukkit.block.CommandBlock) CreatureSpawner(org.bukkit.block.CreatureSpawner) Nameable(org.bukkit.Nameable) Skull(org.bukkit.block.Skull) Sign(org.bukkit.block.Sign)

Example 2 with Nameable

use of org.bukkit.Nameable in project Prism-Bukkit by prism.

the class BlockAction method handleApply.

/**
 * The BlockState object is modified by this method.
 *
 * @param block            Block
 * @param originalBlock    BlockState
 * @param parameters       QueryParameters
 * @param cancelIfBadPlace cancelIfBadPlace
 * @return ChangeResult.
 */
@NotNull
private ChangeResult handleApply(final Block block, final BlockState originalBlock, final PrismParameters parameters, final boolean cancelIfBadPlace) {
    BlockState state = block.getState();
    // So this will ensure the head of the bed is broken when removing the bed during rollback.
    if (MaterialTag.BEDS.isTagged(state.getType())) {
        state = Utilities.getSiblingForDoubleLengthBlock(state).getState();
    }
    switch(getMaterial()) {
        case LILY_PAD:
            // If restoring a lily pad, check that block below is water.
            // Be sure it's set to stationary water so the lily pad will stay
            final Block below = block.getRelative(BlockFace.DOWN);
            if (below.getType().equals(WATER) || below.getType().equals(AIR)) {
                below.setType(WATER);
            } else {
                // Prism.debug("Lilypad skipped because no water exists below.");
                return new ChangeResultImpl(ChangeResultType.SKIPPED, null);
            }
            break;
        case NETHER_PORTAL:
            // Only way to restore a nether portal is to set it on fire.
            final Block obsidian = Utilities.getFirstBlockOfMaterialBelow(OBSIDIAN, block.getLocation());
            if (obsidian != null) {
                final Block above = obsidian.getRelative(BlockFace.UP);
                if (!(above.getType() == NETHER_PORTAL)) {
                    above.setType(FIRE);
                    return new ChangeResultImpl(ChangeResultType.APPLIED, null);
                }
            }
            break;
        case JUKEBOX:
            setBlockData(Bukkit.createBlockData(JUKEBOX));
            break;
        default:
            break;
    }
    state.setType(getMaterial());
    state.setBlockData(getBlockData());
    state.update(true);
    BlockState newState = block.getState();
    BlockActionData blockActionData = getActionData();
    if (blockActionData != null) {
        if ((getMaterial() == PLAYER_HEAD || getMaterial() == PLAYER_WALL_HEAD) && blockActionData instanceof SkullActionData) {
            return handleSkulls(block, blockActionData, originalBlock);
        }
        if (Tag.BANNERS.isTagged(getMaterial()) && blockActionData instanceof BannerActionData) {
            return handleBanners(block, blockActionData, originalBlock);
        }
        if (getMaterial() == SPAWNER && blockActionData instanceof SpawnerActionData) {
            final SpawnerActionData s = (SpawnerActionData) blockActionData;
            // Set spawner data
            ((CreatureSpawner) newState).setDelay(s.getDelay());
            ((CreatureSpawner) newState).setSpawnedType(s.getEntityType());
        }
        if (getMaterial() == COMMAND_BLOCK && blockActionData instanceof CommandActionData) {
            final CommandActionData c = (CommandActionData) blockActionData;
            ((CommandBlock) newState).setCommand(c.command);
        }
        if (newState instanceof Nameable && blockActionData.customName != null && !blockActionData.customName.equals("")) {
            ((Nameable) newState).setCustomName(blockActionData.customName);
        }
        if (parameters.getProcessType() == PrismProcessType.ROLLBACK && Tag.SIGNS.isTagged(getMaterial()) && blockActionData instanceof SignActionData) {
            final SignActionData s = (SignActionData) blockActionData;
            // https://snowy-evening.com/botsko/prism/455/
            if (newState instanceof Sign) {
                if (s.lines != null) {
                    for (int i = 0; i < s.lines.length; ++i) {
                        ((Sign) newState).setLine(i, s.lines[i]);
                    }
                }
            }
        }
    } else {
        Prism.debug("BlockAction Data was null with " + parameters.toString());
    }
    // -----------------------------
    // Sibling logic marker
    // If the material is a crop that needs soil, we must restore the soil
    // This may need to go before setting the block, but I prefer the BlockUtil logic to use materials.
    BlockState sibling = null;
    if (Utilities.materialRequiresSoil(getMaterial())) {
        sibling = block.getRelative(BlockFace.DOWN).getState();
        if (cancelIfBadPlace && !MaterialTag.SOIL_CANDIDATES.isTagged(sibling.getType())) {
            Prism.debug(parameters.getProcessType().name() + " skipped due to lack of soil for " + getMaterial().name());
            return new ChangeResultImpl(ChangeResultType.SKIPPED, null);
        }
        sibling.setType(FARMLAND);
    }
    // Chest sides can be broken independently, ignore them
    if (newState.getType() != CHEST && newState.getType() != TRAPPED_CHEST) {
        final Block s = Utilities.getSiblingForDoubleLengthBlock(state);
        if (s != null) {
            sibling = s.getState();
            if (cancelIfBadPlace && !Utilities.isAcceptableForBlockPlace(sibling.getType())) {
                Prism.debug(parameters.getProcessType().name() + " skipped due to lack of wrong sibling type for " + getMaterial().name());
                return new ChangeResultImpl(ChangeResultType.SKIPPED, null);
            }
            sibling.setType(block.getType());
            BlockData siblingData = getBlockData().clone();
            if (siblingData instanceof Bed) {
                // We always log the foot
                ((Bed) siblingData).setPart(Part.HEAD);
            } else if (siblingData instanceof Bisected) {
                // We always log the bottom
                ((Bisected) siblingData).setHalf(Half.TOP);
            }
            sibling.setBlockData(siblingData);
        }
    }
    boolean physics = !parameters.hasFlag(Flag.NO_PHYS);
    newState.update(true, physics);
    if (sibling != null) {
        sibling.update(true, physics);
    }
    return new ChangeResultImpl(ChangeResultType.APPLIED, new BlockStateChangeImpl(originalBlock, state));
}
Also used : Bed(org.bukkit.block.data.type.Bed) CommandBlock(org.bukkit.block.CommandBlock) CreatureSpawner(org.bukkit.block.CreatureSpawner) Nameable(org.bukkit.Nameable) BlockState(org.bukkit.block.BlockState) BlockStateChangeImpl(me.botsko.prism.events.BlockStateChangeImpl) Block(org.bukkit.block.Block) CommandBlock(org.bukkit.block.CommandBlock) Sign(org.bukkit.block.Sign) ChangeResultImpl(me.botsko.prism.appliers.ChangeResultImpl) BlockData(org.bukkit.block.data.BlockData) Bisected(org.bukkit.block.data.Bisected) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

Nameable (org.bukkit.Nameable)2 CommandBlock (org.bukkit.block.CommandBlock)2 CreatureSpawner (org.bukkit.block.CreatureSpawner)2 Sign (org.bukkit.block.Sign)2 ChangeResultImpl (me.botsko.prism.appliers.ChangeResultImpl)1 BlockStateChangeImpl (me.botsko.prism.events.BlockStateChangeImpl)1 Banner (org.bukkit.block.Banner)1 Block (org.bukkit.block.Block)1 BlockState (org.bukkit.block.BlockState)1 Skull (org.bukkit.block.Skull)1 Bisected (org.bukkit.block.data.Bisected)1 BlockData (org.bukkit.block.data.BlockData)1 Bed (org.bukkit.block.data.type.Bed)1 NotNull (org.jetbrains.annotations.NotNull)1