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();
}
}
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));
}
Aggregations