Skip to content

Instantly share code, notes, and snippets.

@WouterG
Last active August 1, 2019 16:37
Show Gist options
  • Save WouterG/aff4712c5fcfb79b1640edc581340551 to your computer and use it in GitHub Desktop.
Save WouterG/aff4712c5fcfb79b1640edc581340551 to your computer and use it in GitHub Desktop.
import net.menoni.rd.RuntimeDebugger;
import net.menoni.rd.model.Debugger;
import org.bukkit.ChatColor;
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.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
public class HubSigns implements Debugger, Debugger.Stoppable, Listener {
private static List<Material> signMaterials;
static {
signMaterials = new ArrayList<>();
Pattern signPattern = Pattern.compile(".*SIGN.*");
for (Material value : Material.values()) {
if (signPattern.matcher(value.name()).matches()) {
signMaterials.add(value);
}
}
}
@SuppressWarnings("deprecation")
@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
Player player = e.getPlayer();
if (e.getTo() == null) {
return;
}
if (e.getFrom().getBlockX() != e.getTo().getBlockX() || e.getFrom().getBlockY() != e.getFrom().getBlockY() || e.getFrom().getBlockZ() != e.getTo().getBlockZ()) {
Block block = e.getTo().getBlock();
boolean shouldCancel = false;
for (Block min : getRelative(block)) {
if (min.getType() == Material.SPONGE) {
shouldCancel = true;
break;
} else if (signMaterials.contains(min.getType())) {
Sign sign = (Sign) min.getState();
String first = ChatColor.stripColor(sign.getLine(0)).toLowerCase();
if (first.equalsIgnoreCase("[jump]")) {
doVelocity(player, sign);
} else if (first.equalsIgnoreCase("[teleport]")) {
try {
double x = Double.valueOf(sign.getLine(1));
double y = Double.valueOf(sign.getLine(2));
double z = Double.valueOf(sign.getLine(3));
player.teleport(new Location(player.getWorld(), x, y, z, player.getLocation().getYaw(), player.getLocation().getPitch()), PlayerTeleportEvent.TeleportCause.PLUGIN);
} catch (NumberFormatException ex) {
}
} else if (sign.getLine(0).equalsIgnoreCase("[effect]")) {
try {
int id = Integer.valueOf(sign.getLine(1));
int time = Integer.valueOf(sign.getLine(2));
int level = Integer.valueOf(sign.getLine(3));
player.addPotionEffect(new PotionEffect(PotionEffectType.getById(id), time, level, false), true);
} catch (NumberFormatException ex) {
}
}
}
}
if (shouldCancel) {
Location newLoc = e.getFrom();
newLoc.setX(newLoc.getBlockX() + 0.5D);
newLoc.setY(newLoc.getBlockY());
newLoc.setZ(newLoc.getBlockZ() + 0.5D);
e.setTo(newLoc);
e.getPlayer().teleport(newLoc);
}
}
}
private void doVelocity(Player player, Sign sign) {
if (!sign.getLine(1).isEmpty() && !sign.getLine(2).isEmpty() && !sign.getLine(3).isEmpty()) {
// x/y/z -> force full direction
try {
double x = Double.parseDouble(sign.getLine(1));
double y = Double.parseDouble(sign.getLine(2));
double z = Double.parseDouble(sign.getLine(3));
player.setVelocity(new Vector(x, y, z));
} catch(NumberFormatException ex) { }
return;
}
if (!sign.getLine(1).isEmpty() && !sign.getLine(2).isEmpty()) {
// speed/y -> player direction + y velocity
double speed = Double.parseDouble(sign.getLine(1));
double y = Double.parseDouble(sign.getLine(2));
Vector dir = player.getEyeLocation().getDirection().clone();
dir.normalize();
dir.multiply(speed);
dir.setY(y);
player.setVelocity(dir);
return;
}
if (!sign.getLine(1).isEmpty()) {
double speed = Double.parseDouble(sign.getLine(1));
Vector dir = player.getEyeLocation().getDirection().clone();
dir.normalize();
dir.multiply(speed);
player.setVelocity(dir);
return;
}
}
private ArrayList<Block> getRelative(Block current) {
ArrayList<Block> list = new ArrayList<>();
for(int i = 0; i < 5; i++) {
list.add(current.getRelative(BlockFace.DOWN, i));
}
return list;
}
@Override
public void debug(RuntimeDebugger plugin, CommandSender cs) {
}
@Override
public void stop() {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment