Dateien nach "src/main/java/net/licks92/wirelessredstone/listeners" hochladen
This commit is contained in:
@@ -0,0 +1,356 @@
|
|||||||
|
package net.licks92.wirelessredstone.listeners;
|
||||||
|
|
||||||
|
import net.licks92.wirelessredstone.ConfigManager;
|
||||||
|
import net.licks92.wirelessredstone.Utils;
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
import net.licks92.wirelessredstone.compat.InternalProvider;
|
||||||
|
import net.licks92.wirelessredstone.materiallib.data.CrossMaterial;
|
||||||
|
import net.licks92.wirelessredstone.signs.SignType;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.block.BlockRedstoneEvent;
|
||||||
|
import org.bukkit.event.block.SignChangeEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class BlockListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void on(BlockRedstoneEvent event) {
|
||||||
|
if (event.getBlock().getType() == Material.REDSTONE || event.getBlock().getType() == Material.REDSTONE_WIRE) {
|
||||||
|
if (event.getNewCurrent() < event.getOldCurrent() && event.getNewCurrent() != 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean skipLocation = false;
|
||||||
|
if (Utils.isNewMaterialSystem()) {
|
||||||
|
if (event.getOldCurrent() < 15) {
|
||||||
|
skipLocation = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleRedstoneEvent(event.getBlock(), event.getNewCurrent() > 0, skipLocation, false); // skipLocation: true
|
||||||
|
} else {
|
||||||
|
handleRedstoneEvent(event.getBlock(), event.getNewCurrent() > 0, false, event.getNewCurrent() == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void on(BlockPhysicsEvent event) {
|
||||||
|
if (event.getBlock() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getBlock().getState() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getBlock().getState().getData() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!InternalProvider.getCompatBlockData().isPowerable(event.getBlock())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing for better performance
|
||||||
|
// if (event.getBlock().getType() == Material.REDSTONE || event.getBlock().getType() == Material.REDSTONE_WIRE) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
boolean isPowered = InternalProvider.getCompatBlockData().isPowered(event.getBlock());
|
||||||
|
|
||||||
|
// Testing to handle only dispowering or all events
|
||||||
|
if (!isPowered) {
|
||||||
|
handleRedstoneEvent(event.getBlock(), isPowered, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void on(final SignChangeEvent event) {
|
||||||
|
SignType signType = Utils.getSignType(event.getLine(0));
|
||||||
|
if (signType == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signType == SignType.TRANSMITTER) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (signType == SignType.RECEIVER) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (signType == SignType.SCREEN) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
signType = Utils.getSignType(event.getLine(0), event.getLine(2));
|
||||||
|
|
||||||
|
if (event.getLine(1).equalsIgnoreCase("")) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().noChannelName, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String channelName = event.getLine(1);
|
||||||
|
|
||||||
|
if (!WirelessRedstone.getSignManager().hasAccessToChannel(event.getPlayer(), channelName)) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int delay = 0;
|
||||||
|
try {
|
||||||
|
delay = Integer.parseInt(event.getLine(3));
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
if (signType == SignType.RECEIVER_DELAYER) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().delayNumberOnly, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
} else if (signType == SignType.RECEIVER_CLOCK) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().intervalNumberOnly, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delay < 50 && signType == SignType.RECEIVER_DELAYER) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().commandDelayMin, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
} else if (delay < 50 && signType == SignType.RECEIVER_CLOCK) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().commandIntervalMin, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: #registerSign Implement error message if failed
|
||||||
|
final int finalDelay = delay;
|
||||||
|
Bukkit.getScheduler().runTask(WirelessRedstone.getInstance(), () -> {
|
||||||
|
if (!(event.getBlock().getState() instanceof Sign)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sign sign = (Sign) event.getBlock().getState();
|
||||||
|
BlockFace signDirection = InternalProvider.getCompatBlockData().getSignRotation(event.getBlock());
|
||||||
|
|
||||||
|
int result = WirelessRedstone.getSignManager().registerSign(
|
||||||
|
channelName,
|
||||||
|
event.getBlock(),
|
||||||
|
Utils.getSignType(sign.getLine(0), sign.getLine(2)),
|
||||||
|
signDirection,
|
||||||
|
Collections.singletonList(event.getPlayer().getUniqueId().toString()),
|
||||||
|
finalDelay
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result == 0) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().channelExtended, event.getPlayer(), false);
|
||||||
|
} else if (result == 1) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().channelCreated, event.getPlayer(), false);
|
||||||
|
} else if (result == -1) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().commandDelayMin, event.getPlayer(), true);
|
||||||
|
} else if (result == -2) {
|
||||||
|
handlePlaceCancelled(event.getBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().commandIntervalMin, event.getPlayer(), true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void on(BlockPlaceEvent event) {
|
||||||
|
if (event.getBlock().getType() == Material.REDSTONE_BLOCK || CrossMaterial.REDSTONE_TORCH.equals(event.getBlock().getType())) {
|
||||||
|
handleRedstoneEvent(event.getBlock(), true, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void on(BlockBreakEvent event) {
|
||||||
|
if (event.getBlock().getType() == Material.REDSTONE_BLOCK || CrossMaterial.REDSTONE_TORCH.equals(event.getBlock().getType())) {
|
||||||
|
handleRedstoneEvent(event.getBlock(), false, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MC <= 1.12 #getBlock can be NULL
|
||||||
|
if (event.getBlock() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getBlock().getState() instanceof Sign) {
|
||||||
|
Sign sign = (Sign) event.getBlock().getState();
|
||||||
|
|
||||||
|
SignType signType = Utils.getSignType(sign.getLine(0));
|
||||||
|
if (signType == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signType == SignType.TRANSMITTER) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionDestroySign, event.getPlayer(), true, true);
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (signType == SignType.RECEIVER) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionDestroySign, event.getPlayer(), true, true);
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (signType == SignType.SCREEN) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionDestroySign, event.getPlayer(), true, true);
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String channelName = sign.getLine(1);
|
||||||
|
|
||||||
|
if (!WirelessRedstone.getSignManager().hasAccessToChannel(event.getPlayer(), channelName)) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionDestroySign, event.getPlayer(), true, true);
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessRedstone.getSignManager().removeSign(channelName, event.getBlock().getLocation());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().signDestroyed, event.getPlayer(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleRedstoneEvent(Block block, boolean powered, boolean skipLocation, boolean useScheduler) {
|
||||||
|
Collection<BlockFace> blockFaces = Utils.getAxisBlockFaces();
|
||||||
|
List<Location> locations = new ArrayList<>();
|
||||||
|
Material type = block.getType();
|
||||||
|
|
||||||
|
if (CrossMaterial.REPEATER.equals(type) || CrossMaterial.REPEATER_ON.equals(type) || CrossMaterial.REPEATER_OFF.equals(type) ||
|
||||||
|
CrossMaterial.COMPARATOR.equals(type) || CrossMaterial.COMPARATOR_ON.equals(type) || CrossMaterial.COMPARATOR_OFF.equals(type)) {
|
||||||
|
if (Utils.isNewMaterialSystem()) {
|
||||||
|
// org.bukkit.block.data.Directional directional = (org.bukkit.block.data.Directional) block.getBlockData();
|
||||||
|
BlockFace direction = InternalProvider.getCompatBlockData().getDirectionalFacing(block);
|
||||||
|
|
||||||
|
if (block.getRelative(direction.getOppositeFace()).getType().isOccluding() &&
|
||||||
|
!block.getRelative(direction.getOppositeFace()).getType().isInteractable()) {
|
||||||
|
Block relBlock = block.getRelative(direction.getOppositeFace());
|
||||||
|
locations = Utils.getAxisBlockFaces().stream()
|
||||||
|
.map(axisBlockFace -> relBlock.getRelative(axisBlockFace).getLocation())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
locations.add(block.getRelative(direction.getOppositeFace()).getRelative(direction.getOppositeFace()).getLocation());
|
||||||
|
blockFaces = Collections.singletonList(direction.getOppositeFace());
|
||||||
|
} else {
|
||||||
|
// Directional directional = (Directional) block.getState().getData();
|
||||||
|
BlockFace direction = InternalProvider.getCompatBlockData().getDirectionalFacing(block);
|
||||||
|
|
||||||
|
if (block.getRelative(direction).getType().isOccluding()) {
|
||||||
|
Block relBlock = block.getRelative(direction);
|
||||||
|
locations = Utils.getAxisBlockFaces().stream()
|
||||||
|
.map(axisBlockFace -> relBlock.getRelative(axisBlockFace).getLocation())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
locations.add(block.getRelative(direction).getRelative(direction).getLocation());
|
||||||
|
blockFaces = Collections.singletonList(direction);
|
||||||
|
}
|
||||||
|
} else if (type == Material.DAYLIGHT_DETECTOR || type == Material.DETECTOR_RAIL
|
||||||
|
|| type.name().toUpperCase().endsWith("_PLATE")) {
|
||||||
|
locations.add(block.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN).getLocation());
|
||||||
|
} else {
|
||||||
|
if (InternalProvider.getCompatBlockData().isRedstoneSwitch(block)) {
|
||||||
|
BlockFace direction = InternalProvider.getCompatBlockData().getRedstoneSwitchFacing(block);
|
||||||
|
|
||||||
|
Block relBlock = block.getRelative(direction);
|
||||||
|
for (BlockFace axisBlockFace : Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN)) {
|
||||||
|
locations.add(relBlock.getRelative(axisBlockFace).getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
locations.add(block.getRelative(direction).getRelative(direction).getLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (BlockFace blockFace : blockFaces) {
|
||||||
|
if (block.getRelative(blockFace).getState() instanceof Sign) {
|
||||||
|
locations.add(block.getRelative(blockFace).getLocation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!locations.isEmpty()) {
|
||||||
|
for (Location location : locations) {
|
||||||
|
if (!(location.getBlock().getState() instanceof Sign)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sign sign = (Sign) location.getBlock().getState();
|
||||||
|
|
||||||
|
if (useScheduler) {
|
||||||
|
Bukkit.getScheduler().runTask(WirelessRedstone.getInstance(), () -> updateRedstonePower(sign, powered, skipLocation));
|
||||||
|
} else {
|
||||||
|
updateRedstonePower(sign, powered, skipLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handlePlaceCancelled(Block block) {
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
|
||||||
|
if (ConfigManager.getConfig().getDropSignBroken()) {
|
||||||
|
CrossMaterial.SIGN.getHandle()
|
||||||
|
.ifPresent(materialHandler -> block.getWorld().dropItem(block.getLocation(), new ItemStack(materialHandler.getType())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateRedstonePower(Sign sign, boolean powered, boolean skipLocation) {
|
||||||
|
if ("TRUE".equalsIgnoreCase(System.getProperty("mc.development"))) {
|
||||||
|
WirelessRedstone.getWRLogger().debug("Redstone power update (" + powered + "): " + sign.getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Utils.getSignType(sign.getLine(0)) != SignType.TRANSMITTER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (sign.getLine(1).equalsIgnoreCase(""))
|
||||||
|
return;
|
||||||
|
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(sign.getLine(1));
|
||||||
|
if (channel == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (powered) {
|
||||||
|
channel.turnOn();
|
||||||
|
} else {
|
||||||
|
channel.turnOff(skipLocation ? sign.getLocation() : null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,134 @@
|
|||||||
|
package net.licks92.wirelessredstone.listeners;
|
||||||
|
|
||||||
|
import net.licks92.wirelessredstone.ConfigManager;
|
||||||
|
import net.licks92.wirelessredstone.Utils;
|
||||||
|
import net.licks92.wirelessredstone.WirelessRedstone;
|
||||||
|
import net.licks92.wirelessredstone.compat.InternalProvider;
|
||||||
|
import net.licks92.wirelessredstone.materiallib.data.CrossMaterial;
|
||||||
|
import net.licks92.wirelessredstone.signs.SignType;
|
||||||
|
import net.licks92.wirelessredstone.signs.WirelessChannel;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
public class PlayerListener implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void on(PlayerInteractEvent event) {
|
||||||
|
if (!(event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getClickedBlock() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(event.getClickedBlock().getState() instanceof Sign)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sign sign = (Sign) event.getClickedBlock().getState();
|
||||||
|
SignType signType = Utils.getSignType(sign.getLine(0));
|
||||||
|
if (signType == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signType == SignType.TRANSMITTER) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (signType == SignType.RECEIVER) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (signType == SignType.SCREEN) {
|
||||||
|
if (!WirelessRedstone.getSignManager().canPlaceSign(event.getPlayer(), signType)) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionCreateSign, event.getPlayer(), true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
signType = Utils.getSignType(sign.getLine(0), sign.getLine(2));
|
||||||
|
|
||||||
|
if (sign.getLine(1).equalsIgnoreCase("")) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().noChannelName, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(sign.getLine(1));
|
||||||
|
if (channel != null) {
|
||||||
|
if (!WirelessRedstone.getSignManager().hasAccessToChannel(event.getPlayer(), sign.getLine(1))) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().permissionChannelAccess, event.getPlayer(), true);
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WirelessRedstone.getSignManager().isSignRegistred(event.getClickedBlock().getLocation())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int delay = 0;
|
||||||
|
try {
|
||||||
|
delay = Integer.parseInt(sign.getLine(3));
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
if (signType == SignType.RECEIVER_DELAYER) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().delayNumberOnly, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
} else if (signType == SignType.RECEIVER_CLOCK) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().intervalNumberOnly, event.getPlayer(), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockFace signDirection = InternalProvider.getCompatBlockData().getSignRotation(sign.getBlock());
|
||||||
|
|
||||||
|
int result = WirelessRedstone.getSignManager().registerSign(
|
||||||
|
sign.getLine(1),
|
||||||
|
event.getClickedBlock(),
|
||||||
|
Utils.getSignType(sign.getLine(0), sign.getLine(2)),
|
||||||
|
signDirection,
|
||||||
|
Collections.singletonList(event.getPlayer().getUniqueId().toString()),
|
||||||
|
delay
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result == 0) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().channelExtended, event.getPlayer(), false);
|
||||||
|
} else if (result == 1) {
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().channelCreated, event.getPlayer(), false);
|
||||||
|
} else if (result == -1) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().commandDelayMin, event.getPlayer(), true);
|
||||||
|
} else if (result == -2) {
|
||||||
|
handlePlaceCancelled(event.getClickedBlock());
|
||||||
|
Utils.sendFeedback(WirelessRedstone.getStrings().commandIntervalMin, event.getPlayer(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handlePlaceCancelled(Block block) {
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
|
||||||
|
if (ConfigManager.getConfig().getDropSignBroken()) {
|
||||||
|
CrossMaterial.SIGN.getHandle()
|
||||||
|
.ifPresent(materialHandler -> block.getWorld().dropItem(block.getLocation(), new ItemStack(materialHandler.getType())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,33 @@
|
|||||||
|
package net.licks92.wirelessredstone.listeners;
|
||||||
|
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
public class WorldListener implements Listener {
|
||||||
|
|
||||||
|
// Method borrowed from MinecraftMania! Credits to Afforess!
|
||||||
|
// https://github.com/Afforess/MinecartMania/blob/master/src/com/afforess/minecartmaniacore/api/MinecartManiaCoreWorldListener.java
|
||||||
|
// @EventHandler
|
||||||
|
// public void on(ChunkUnloadEvent event) {
|
||||||
|
// if (!event.isCancelled()) {
|
||||||
|
// if (ConfigManager.getConfig().getCancelChunkUnload()) {
|
||||||
|
// try {
|
||||||
|
// Collection<WirelessPoint> points = WirelessRedstone.getStorageManager().getAllSigns();
|
||||||
|
// for (WirelessPoint point : points) {
|
||||||
|
// if (Math.abs(event.getChunk().getX() - point.getLocation().getBlock().getChunk().getX()) > ConfigManager.getConfig().getCancelChunkUnloadRange()) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// if (Math.abs(event.getChunk().getZ() - point.getLocation().getBlock().getChunk().getZ()) > ConfigManager.getConfig().getCancelChunkUnloadRange()) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// event.setCancelled(true);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// WirelessRedstone.getWRLogger().debug(e.toString());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user