use of org.bukkit.block.data.Bisected in project Denizen-For-Bukkit by DenizenScript.
the class SwitchCommand method switchBlock.
// Break off this portion of the code from execute() so it can be used in both execute and the delayed runnable
public void switchBlock(ScriptEntry scriptEntry, Location interactLocation, SwitchState switchState, boolean physics) {
Block block = interactLocation.getBlock();
BlockData data1 = block.getBlockData();
MaterialTag materialTag = new MaterialTag(data1);
MaterialSwitchable switchable = MaterialSwitchable.getFrom(materialTag);
if (switchable == null) {
Debug.echoError("Cannot switch block of type '" + materialTag.getMaterial().name() + "'");
return;
}
if (materialTag.getMaterial() == Material.BELL) {
NMSHandler.getBlockHelper().ringBell((Bell) block.getState());
return;
}
boolean currentState = switchable.getState();
if ((switchState.equals(SwitchState.ON) && !currentState) || (switchState.equals(SwitchState.OFF) && currentState) || switchState.equals(SwitchState.TOGGLE)) {
switchable.setState(!currentState);
if (physics) {
block.setBlockData(switchable.material.getModernData());
} else {
ModifyBlockCommand.setBlock(block.getLocation(), materialTag, false, null);
}
if (data1 instanceof Bisected && !(data1 instanceof TrapDoor)) {
// TrapDoor implements Bisected, but is not actually bisected???
Location other = interactLocation.clone();
if (((Bisected) data1).getHalf() == Bisected.Half.TOP) {
other = other.add(0, -1, 0);
} else {
other = other.add(0, 1, 0);
}
BlockData data2 = other.getBlock().getBlockData();
if (data2.getMaterial() == data1.getMaterial()) {
MaterialSwitchable switchable2 = MaterialSwitchable.getFrom(new MaterialTag(data2));
switchable2.setState(!currentState);
other.getBlock().setBlockData(switchable2.material.getModernData());
if (physics) {
AdjustBlockCommand.applyPhysicsAt(other);
}
}
}
if (physics) {
AdjustBlockCommand.applyPhysicsAt(interactLocation);
}
if (scriptEntry.dbCallShouldDebug()) {
Debug.echoDebug(scriptEntry, "Switched " + block.getType().toString() + "! Current state now: " + (switchState(block) ? "ON" : "OFF"));
}
}
}
use of org.bukkit.block.data.Bisected 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));
}
Aggregations