Adds underwater portal support using any wall coral as a button replacement
This commit is contained in:
parent
e49b94cf9a
commit
7b9f5a6de5
@ -7,7 +7,6 @@ import org.bukkit.block.Block;
|
|||||||
import java.io.BufferedWriter;
|
import java.io.BufferedWriter;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.FilenameFilter;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -400,7 +399,7 @@ public class Gate {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Tag.BUTTONS.isTagged(gate.button)) {
|
if (!Tag.BUTTONS.isTagged(gate.button) && !MaterialHelper.isWallCoral(gate.button)) {
|
||||||
Stargate.log.log(Level.SEVERE, "Could not load Gate " + file.getName() + " - Gate button must be a type of button.");
|
Stargate.log.log(Level.SEVERE, "Could not load Gate " + file.getName() + " - Gate button must be a type of button.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -435,28 +434,39 @@ public class Gate {
|
|||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads all gates inside the given folder
|
||||||
|
* @param gateFolder <p>The folder containing the gates</p>
|
||||||
|
*/
|
||||||
public static void loadGates(String gateFolder) {
|
public static void loadGates(String gateFolder) {
|
||||||
File dir = new File(gateFolder);
|
File directory = new File(gateFolder);
|
||||||
File[] files;
|
File[] files;
|
||||||
|
|
||||||
if (dir.exists()) {
|
if (directory.exists()) {
|
||||||
files = dir.listFiles(new StargateFilenameFilter());
|
files = directory.listFiles((file) -> file.isFile() && file.getName().endsWith(".gate"));
|
||||||
} else {
|
} else {
|
||||||
files = new File[0];
|
files = new File[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (files == null || files.length == 0) {
|
if (files == null || files.length == 0) {
|
||||||
if (dir.mkdir()) {
|
//The gates folder was not found. Assume this is the first run
|
||||||
|
if (directory.mkdir()) {
|
||||||
populateDefaults(gateFolder);
|
populateDefaults(gateFolder);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
Gate gate = loadGate(file);
|
Gate gate = loadGate(file);
|
||||||
if (gate != null) registerGate(gate);
|
if (gate != null) {
|
||||||
|
registerGate(gate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the default gate specification to the given folder
|
||||||
|
* @param gateFolder <p>The folder containing gate config files</p>
|
||||||
|
*/
|
||||||
public static void populateDefaults(String gateFolder) {
|
public static void populateDefaults(String gateFolder) {
|
||||||
Character[][] layout = new Character[][]{
|
Character[][] layout = new Character[][]{
|
||||||
{' ', 'X', 'X', ' '},
|
{' ', 'X', 'X', ' '},
|
||||||
@ -485,32 +495,46 @@ public class Gate {
|
|||||||
Gate[] result = new Gate[0];
|
Gate[] result = new Gate[0];
|
||||||
ArrayList<Gate> lookup = controlBlocks.get(type);
|
ArrayList<Gate> lookup = controlBlocks.get(type);
|
||||||
|
|
||||||
if (lookup != null) result = lookup.toArray(result);
|
if (lookup != null) {
|
||||||
|
result = lookup.toArray(result);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a portal by its name (filename before .gate)
|
||||||
|
* @param name <p>The name of the gate to get</p>
|
||||||
|
* @return <p>The gate with the given name</p>
|
||||||
|
*/
|
||||||
public static Gate getGateByName(String name) {
|
public static Gate getGateByName(String name) {
|
||||||
return gates.get(name);
|
return gates.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of loaded gate configurations
|
||||||
|
* @return <p>The number of loaded gate configurations</p>
|
||||||
|
*/
|
||||||
public static int getGateCount() {
|
public static int getGateCount() {
|
||||||
return gates.size();
|
return gates.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given material is used for the frame of any portals
|
||||||
|
* @param type <p>The material type to check</p>
|
||||||
|
* @return <p>True if the material is used for the frame of at least one portal</p>
|
||||||
|
*/
|
||||||
public static boolean isGateBlock(Material type) {
|
public static boolean isGateBlock(Material type) {
|
||||||
return frameBlocks.contains(type);
|
return frameBlocks.contains(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static class StargateFilenameFilter implements FilenameFilter {
|
/**
|
||||||
public boolean accept(File dir, String name) {
|
* Clears all loaded gates
|
||||||
return name.endsWith(".gate");
|
*/
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearGates() {
|
public static void clearGates() {
|
||||||
gates.clear();
|
gates.clear();
|
||||||
controlBlocks.clear();
|
controlBlocks.clear();
|
||||||
frameBlocks.clear();
|
frameBlocks.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
303
src/main/java/net/knarcraft/stargate/PlayerEventsListener.java
Normal file
303
src/main/java/net/knarcraft/stargate/PlayerEventsListener.java
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
package net.knarcraft.stargate;
|
||||||
|
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Tag;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.type.WallSign;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
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.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class PlayerEventsListener implements Listener {
|
||||||
|
|
||||||
|
private static long eventTime;
|
||||||
|
private static PlayerInteractEvent previousEvent;
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
if (!Stargate.enableBungee) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
String destination = Stargate.bungeeQueue.remove(player.getName().toLowerCase());
|
||||||
|
if (destination == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Portal portal = Portal.getBungeeGate(destination);
|
||||||
|
if (portal == null) {
|
||||||
|
Stargate.debug("PlayerJoin", "Error fetching destination portal: " + destination);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
portal.teleport(player, portal, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerTeleport(PlayerTeleportEvent event) {
|
||||||
|
// cancel portal and endgateway teleportation if it's from a stargate entrance
|
||||||
|
PlayerTeleportEvent.TeleportCause cause = event.getCause();
|
||||||
|
if (!event.isCancelled()
|
||||||
|
&& (cause == PlayerTeleportEvent.TeleportCause.NETHER_PORTAL
|
||||||
|
|| cause == PlayerTeleportEvent.TeleportCause.END_GATEWAY && World.Environment.THE_END == event.getFrom().getWorld().getEnvironment())
|
||||||
|
&& Portal.getByAdjacentEntrance(event.getFrom()) != null) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerMove(PlayerMoveEvent event) {
|
||||||
|
if (event.isCancelled()) return;
|
||||||
|
|
||||||
|
// Check to see if the player actually moved
|
||||||
|
if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
Portal portal = Portal.getByEntrance(event.getTo());
|
||||||
|
// No portal or not open
|
||||||
|
if (portal == null || !portal.isOpen()) return;
|
||||||
|
|
||||||
|
// Not open for this player
|
||||||
|
if (!portal.isOpenFor(player)) {
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
||||||
|
portal.teleport(player, portal, event);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Portal destination = portal.getDestination(player);
|
||||||
|
if (!portal.isBungee() && destination == null) return;
|
||||||
|
|
||||||
|
boolean deny = false;
|
||||||
|
// Check if player has access to this server for Bungee gates
|
||||||
|
if (portal.isBungee()) {
|
||||||
|
if (!Stargate.canAccessServer(player, portal.getNetwork())) {
|
||||||
|
deny = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Check if player has access to this network
|
||||||
|
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
||||||
|
deny = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if player has access to destination world
|
||||||
|
if (!Stargate.canAccessWorld(player, destination.getWorld().getName())) {
|
||||||
|
deny = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
||||||
|
portal.teleport(player, portal, event);
|
||||||
|
portal.close(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cost = Stargate.getUseCost(player, portal, destination);
|
||||||
|
if (cost > 0) {
|
||||||
|
boolean success;
|
||||||
|
if (portal.getGate().getToOwner()) {
|
||||||
|
success = portal.getOwnerUUID() != null && Stargate.chargePlayer(player, portal.getOwnerUUID(), cost);
|
||||||
|
} else {
|
||||||
|
success = Stargate.chargePlayer(player, cost);
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
// Insufficient Funds
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("inFunds"));
|
||||||
|
portal.close(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String deductMsg = Stargate.getString("ecoDeduct");
|
||||||
|
deductMsg = Stargate.replaceVars(deductMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()});
|
||||||
|
Stargate.sendMessage(player, deductMsg, false);
|
||||||
|
if (portal.getGate().getToOwner() && portal.getOwnerUUID() != null) {
|
||||||
|
Player p;
|
||||||
|
if (portal.getOwnerUUID() != null) {
|
||||||
|
p = Stargate.server.getPlayer(portal.getOwnerUUID());
|
||||||
|
} else {
|
||||||
|
p = Stargate.server.getPlayer(portal.getOwnerName());
|
||||||
|
}
|
||||||
|
if (p != null) {
|
||||||
|
String obtainedMsg = Stargate.getString("ecoObtain");
|
||||||
|
obtainedMsg = Stargate.replaceVars(obtainedMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()});
|
||||||
|
Stargate.sendMessage(p, obtainedMsg, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("teleportMsg"), false);
|
||||||
|
|
||||||
|
// BungeeCord Support
|
||||||
|
if (portal.isBungee()) {
|
||||||
|
if (!Stargate.enableBungee) {
|
||||||
|
player.sendMessage(Stargate.getString("bungeeDisabled"));
|
||||||
|
portal.close(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Teleport the player back to this gate, for sanity's sake
|
||||||
|
portal.teleport(player, portal, event);
|
||||||
|
|
||||||
|
// Send the SGBungee packet first, it will be queued by BC if required
|
||||||
|
try {
|
||||||
|
// Build the message, format is <player>#@#<destination>
|
||||||
|
String msg = event.getPlayer().getName() + "#@#" + portal.getDestinationName();
|
||||||
|
// Build the message data, sent over the SGBungee bungeecord channel
|
||||||
|
ByteArrayOutputStream bao = new ByteArrayOutputStream();
|
||||||
|
DataOutputStream msgData = new DataOutputStream(bao);
|
||||||
|
msgData.writeUTF("Forward");
|
||||||
|
msgData.writeUTF(portal.getNetwork()); // Server
|
||||||
|
msgData.writeUTF("SGBungee"); // Channel
|
||||||
|
msgData.writeShort(msg.length()); // Data Length
|
||||||
|
msgData.writeBytes(msg); // Data
|
||||||
|
player.sendPluginMessage(Stargate.stargate, "BungeeCord", bao.toByteArray());
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord teleport packet");
|
||||||
|
ex.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect player to new server
|
||||||
|
try {
|
||||||
|
ByteArrayOutputStream bao = new ByteArrayOutputStream();
|
||||||
|
DataOutputStream msgData = new DataOutputStream(bao);
|
||||||
|
msgData.writeUTF("Connect");
|
||||||
|
msgData.writeUTF(portal.getNetwork());
|
||||||
|
|
||||||
|
player.sendPluginMessage(Stargate.stargate, "BungeeCord", bao.toByteArray());
|
||||||
|
bao.reset();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord connect packet");
|
||||||
|
ex.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close portal if required (Should never be)
|
||||||
|
portal.close(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
destination.teleport(player, portal, event);
|
||||||
|
portal.close(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
Block block = event.getClickedBlock();
|
||||||
|
|
||||||
|
if (block == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Right click
|
||||||
|
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||||
|
if (block.getBlockData() instanceof WallSign) {
|
||||||
|
Portal portal = Portal.getByBlock(block);
|
||||||
|
if (portal == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Cancel item use
|
||||||
|
event.setUseItemInHand(Event.Result.DENY);
|
||||||
|
event.setUseInteractedBlock(Event.Result.DENY);
|
||||||
|
|
||||||
|
boolean deny = false;
|
||||||
|
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
||||||
|
deny = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!portal.isOpen()) && (!portal.isFixed())) {
|
||||||
|
portal.cycleDestination(player);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implement right-click to toggle a stargate, gets around spawn protection problem.
|
||||||
|
if (Tag.BUTTONS.isTagged(block.getType()) || MaterialHelper.isWallCoral(block.getType())) {
|
||||||
|
|
||||||
|
if (MaterialHelper.isWallCoral(block.getType())) {
|
||||||
|
if (previousEvent != null &&
|
||||||
|
event.getPlayer() == previousEvent.getPlayer() && eventTime + 10 > System.currentTimeMillis()) {
|
||||||
|
previousEvent = null;
|
||||||
|
eventTime = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
previousEvent = event;
|
||||||
|
eventTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
Portal portal = Portal.getByBlock(block);
|
||||||
|
if (portal == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cancel item use
|
||||||
|
event.setUseItemInHand(Event.Result.DENY);
|
||||||
|
event.setUseInteractedBlock(Event.Result.DENY);
|
||||||
|
|
||||||
|
boolean deny = false;
|
||||||
|
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
||||||
|
deny = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Stargate.openPortal(player, portal);
|
||||||
|
if (portal.isOpenFor(player)) {
|
||||||
|
event.setUseInteractedBlock(Event.Result.ALLOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left click
|
||||||
|
if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||||
|
// Check if we're scrolling a sign
|
||||||
|
if (block.getBlockData() instanceof WallSign) {
|
||||||
|
Portal portal = Portal.getByBlock(block);
|
||||||
|
if (portal == null) return;
|
||||||
|
|
||||||
|
event.setUseInteractedBlock(Event.Result.DENY);
|
||||||
|
// Only cancel event in creative mode
|
||||||
|
if (player.getGameMode().equals(GameMode.CREATIVE)) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean deny = false;
|
||||||
|
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
||||||
|
deny = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
||||||
|
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!portal.isOpen()) && (!portal.isFixed())) {
|
||||||
|
portal.cycleDestination(player, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -911,7 +911,9 @@ public class Portal {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Gate.getGatesByControlBlock(idParent).length == 0) return null;
|
if (Gate.getGatesByControlBlock(idParent).length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (Portal.getByBlock(idParent) != null) {
|
if (Portal.getByBlock(idParent) != null) {
|
||||||
Stargate.debug("createPortal", "idParent belongs to existing gate");
|
Stargate.debug("createPortal", "idParent belongs to existing gate");
|
||||||
@ -924,6 +926,7 @@ public class Portal {
|
|||||||
String destName = filterName(event.getLine(1));
|
String destName = filterName(event.getLine(1));
|
||||||
String network = filterName(event.getLine(2));
|
String network = filterName(event.getLine(2));
|
||||||
String options = filterName(event.getLine(3)).toLowerCase();
|
String options = filterName(event.getLine(3)).toLowerCase();
|
||||||
|
|
||||||
boolean hidden = (options.indexOf('h') != -1);
|
boolean hidden = (options.indexOf('h') != -1);
|
||||||
boolean alwaysOn = (options.indexOf('a') != -1);
|
boolean alwaysOn = (options.indexOf('a') != -1);
|
||||||
boolean priv = (options.indexOf('p') != -1);
|
boolean priv = (options.indexOf('p') != -1);
|
||||||
@ -935,14 +938,30 @@ public class Portal {
|
|||||||
boolean bungee = (options.indexOf('u') != -1);
|
boolean bungee = (options.indexOf('u') != -1);
|
||||||
|
|
||||||
// Check permissions for options.
|
// Check permissions for options.
|
||||||
if (hidden && !Stargate.canOption(player, "hidden")) hidden = false;
|
if (hidden && !Stargate.canOption(player, "hidden")) {
|
||||||
if (alwaysOn && !Stargate.canOption(player, "alwayson")) alwaysOn = false;
|
hidden = false;
|
||||||
if (priv && !Stargate.canOption(player, "private")) priv = false;
|
}
|
||||||
if (free && !Stargate.canOption(player, "free")) free = false;
|
if (alwaysOn && !Stargate.canOption(player, "alwayson")) {
|
||||||
if (backwards && !Stargate.canOption(player, "backwards")) backwards = false;
|
alwaysOn = false;
|
||||||
if (show && !Stargate.canOption(player, "show")) show = false;
|
}
|
||||||
if (noNetwork && !Stargate.canOption(player, "nonetwork")) noNetwork = false;
|
if (priv && !Stargate.canOption(player, "private")) {
|
||||||
if (random && !Stargate.canOption(player, "random")) random = false;
|
priv = false;
|
||||||
|
}
|
||||||
|
if (free && !Stargate.canOption(player, "free")) {
|
||||||
|
free = false;
|
||||||
|
}
|
||||||
|
if (backwards && !Stargate.canOption(player, "backwards")) {
|
||||||
|
backwards = false;
|
||||||
|
}
|
||||||
|
if (show && !Stargate.canOption(player, "show")) {
|
||||||
|
show = false;
|
||||||
|
}
|
||||||
|
if (noNetwork && !Stargate.canOption(player, "nonetwork")) {
|
||||||
|
noNetwork = false;
|
||||||
|
}
|
||||||
|
if (random && !Stargate.canOption(player, "random")) {
|
||||||
|
random = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Can not create a non-fixed always-on gate.
|
// Can not create a non-fixed always-on gate.
|
||||||
if (alwaysOn && destName.length() == 0) {
|
if (alwaysOn && destName.length() == 0) {
|
||||||
@ -995,7 +1014,9 @@ public class Portal {
|
|||||||
RelativeBlockVector buttonVector = null;
|
RelativeBlockVector buttonVector = null;
|
||||||
|
|
||||||
for (Gate possibility : possibleGates) {
|
for (Gate possibility : possibleGates) {
|
||||||
if ((gate == null) && (buttonVector == null)) {
|
if (gate != null || buttonVector != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
RelativeBlockVector[] vectors = possibility.getControls();
|
RelativeBlockVector[] vectors = possibility.getControls();
|
||||||
RelativeBlockVector otherControl = null;
|
RelativeBlockVector otherControl = null;
|
||||||
|
|
||||||
@ -1018,7 +1039,6 @@ public class Portal {
|
|||||||
otherControl = vector;
|
otherControl = vector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if ((gate == null) || (buttonVector == null)) {
|
if ((gate == null) || (buttonVector == null)) {
|
||||||
Stargate.debug("createPortal", "Could not find matching gate layout");
|
Stargate.debug("createPortal", "Could not find matching gate layout");
|
||||||
|
@ -4,7 +4,6 @@ import net.knarcraft.stargate.event.StargateAccessEvent;
|
|||||||
import net.knarcraft.stargate.event.StargateDestroyEvent;
|
import net.knarcraft.stargate.event.StargateDestroyEvent;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.Tag;
|
import org.bukkit.Tag;
|
||||||
@ -20,11 +19,9 @@ import org.bukkit.configuration.file.FileConfiguration;
|
|||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Vehicle;
|
import org.bukkit.entity.Vehicle;
|
||||||
import org.bukkit.event.Event.Result;
|
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.BlockFromToEvent;
|
import org.bukkit.event.block.BlockFromToEvent;
|
||||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
@ -32,10 +29,6 @@ import org.bukkit.event.block.BlockPistonExtendEvent;
|
|||||||
import org.bukkit.event.block.BlockPistonRetractEvent;
|
import org.bukkit.event.block.BlockPistonRetractEvent;
|
||||||
import org.bukkit.event.block.SignChangeEvent;
|
import org.bukkit.event.block.SignChangeEvent;
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
|
||||||
import org.bukkit.event.server.PluginDisableEvent;
|
import org.bukkit.event.server.PluginDisableEvent;
|
||||||
import org.bukkit.event.server.PluginEnableEvent;
|
import org.bukkit.event.server.PluginEnableEvent;
|
||||||
import org.bukkit.event.vehicle.VehicleMoveEvent;
|
import org.bukkit.event.vehicle.VehicleMoveEvent;
|
||||||
@ -47,10 +40,7 @@ import org.bukkit.plugin.PluginManager;
|
|||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.bukkit.plugin.java.JavaPluginLoader;
|
import org.bukkit.plugin.java.JavaPluginLoader;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@ -170,7 +160,7 @@ public class Stargate extends JavaPlugin {
|
|||||||
log.info(pdfFile.getName() + " v." + pdfFile.getVersion() + " is enabled.");
|
log.info(pdfFile.getName() + " v." + pdfFile.getVersion() + " is enabled.");
|
||||||
|
|
||||||
// Register events before loading gates to stop weird things happening.
|
// Register events before loading gates to stop weird things happening.
|
||||||
pm.registerEvents(new pListener(), this);
|
pm.registerEvents(new PlayerEventsListener(), this);
|
||||||
pm.registerEvents(new bListener(), this);
|
pm.registerEvents(new bListener(), this);
|
||||||
|
|
||||||
pm.registerEvents(new vListener(), this);
|
pm.registerEvents(new vListener(), this);
|
||||||
@ -759,273 +749,25 @@ public class Stargate extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class pListener implements Listener {
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
|
||||||
if (!enableBungee) return;
|
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
String destination = bungeeQueue.remove(player.getName().toLowerCase());
|
|
||||||
if (destination == null) return;
|
|
||||||
|
|
||||||
Portal portal = Portal.getBungeeGate(destination);
|
|
||||||
if (portal == null) {
|
|
||||||
Stargate.debug("PlayerJoin", "Error fetching destination portal: " + destination);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
portal.teleport(player, portal, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerTeleport(PlayerTeleportEvent event) {
|
|
||||||
// cancel portal and endgateway teleportation if it's from a stargate entrance
|
|
||||||
PlayerTeleportEvent.TeleportCause cause = event.getCause();
|
|
||||||
if (!event.isCancelled()
|
|
||||||
&& (cause == PlayerTeleportEvent.TeleportCause.NETHER_PORTAL
|
|
||||||
|| cause == PlayerTeleportEvent.TeleportCause.END_GATEWAY && World.Environment.THE_END == event.getFrom().getWorld().getEnvironment())
|
|
||||||
&& Portal.getByAdjacentEntrance(event.getFrom()) != null) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerMove(PlayerMoveEvent event) {
|
|
||||||
if (event.isCancelled()) return;
|
|
||||||
|
|
||||||
// Check to see if the player actually moved
|
|
||||||
if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
Portal portal = Portal.getByEntrance(event.getTo());
|
|
||||||
// No portal or not open
|
|
||||||
if (portal == null || !portal.isOpen()) return;
|
|
||||||
|
|
||||||
// Not open for this player
|
|
||||||
if (!portal.isOpenFor(player)) {
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
|
||||||
portal.teleport(player, portal, event);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Portal destination = portal.getDestination(player);
|
|
||||||
if (!portal.isBungee() && destination == null) return;
|
|
||||||
|
|
||||||
boolean deny = false;
|
|
||||||
// Check if player has access to this server for Bungee gates
|
|
||||||
if (portal.isBungee()) {
|
|
||||||
if (!canAccessServer(player, portal.getNetwork())) {
|
|
||||||
deny = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Check if player has access to this network
|
|
||||||
if (!canAccessNetwork(player, portal.getNetwork())) {
|
|
||||||
deny = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if player has access to destination world
|
|
||||||
if (!canAccessWorld(player, destination.getWorld().getName())) {
|
|
||||||
deny = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!canAccessPortal(player, portal, deny)) {
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
|
||||||
portal.teleport(player, portal, event);
|
|
||||||
portal.close(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cost = Stargate.getUseCost(player, portal, destination);
|
|
||||||
if (cost > 0) {
|
|
||||||
boolean success;
|
|
||||||
if (portal.getGate().getToOwner()) {
|
|
||||||
success = portal.getOwnerUUID() != null && Stargate.chargePlayer(player, portal.getOwnerUUID(), cost);
|
|
||||||
} else {
|
|
||||||
success = Stargate.chargePlayer(player, cost);
|
|
||||||
}
|
|
||||||
if (!success) {
|
|
||||||
// Insufficient Funds
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("inFunds"));
|
|
||||||
portal.close(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String deductMsg = Stargate.getString("ecoDeduct");
|
|
||||||
deductMsg = Stargate.replaceVars(deductMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()});
|
|
||||||
sendMessage(player, deductMsg, false);
|
|
||||||
if (portal.getGate().getToOwner() && portal.getOwnerUUID() != null) {
|
|
||||||
Player p;
|
|
||||||
if (portal.getOwnerUUID() != null) {
|
|
||||||
p = server.getPlayer(portal.getOwnerUUID());
|
|
||||||
} else {
|
|
||||||
p = server.getPlayer(portal.getOwnerName());
|
|
||||||
}
|
|
||||||
if (p != null) {
|
|
||||||
String obtainedMsg = Stargate.getString("ecoObtain");
|
|
||||||
obtainedMsg = Stargate.replaceVars(obtainedMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()});
|
|
||||||
Stargate.sendMessage(p, obtainedMsg, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("teleportMsg"), false);
|
|
||||||
|
|
||||||
// BungeeCord Support
|
|
||||||
if (portal.isBungee()) {
|
|
||||||
if (!enableBungee) {
|
|
||||||
player.sendMessage(Stargate.getString("bungeeDisabled"));
|
|
||||||
portal.close(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Teleport the player back to this gate, for sanity's sake
|
|
||||||
portal.teleport(player, portal, event);
|
|
||||||
|
|
||||||
// Send the SGBungee packet first, it will be queued by BC if required
|
|
||||||
try {
|
|
||||||
// Build the message, format is <player>#@#<destination>
|
|
||||||
String msg = event.getPlayer().getName() + "#@#" + portal.getDestinationName();
|
|
||||||
// Build the message data, sent over the SGBungee bungeecord channel
|
|
||||||
ByteArrayOutputStream bao = new ByteArrayOutputStream();
|
|
||||||
DataOutputStream msgData = new DataOutputStream(bao);
|
|
||||||
msgData.writeUTF("Forward");
|
|
||||||
msgData.writeUTF(portal.getNetwork()); // Server
|
|
||||||
msgData.writeUTF("SGBungee"); // Channel
|
|
||||||
msgData.writeShort(msg.length()); // Data Length
|
|
||||||
msgData.writeBytes(msg); // Data
|
|
||||||
player.sendPluginMessage(stargate, "BungeeCord", bao.toByteArray());
|
|
||||||
} catch (IOException ex) {
|
|
||||||
Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord teleport packet");
|
|
||||||
ex.printStackTrace();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connect player to new server
|
|
||||||
try {
|
|
||||||
ByteArrayOutputStream bao = new ByteArrayOutputStream();
|
|
||||||
DataOutputStream msgData = new DataOutputStream(bao);
|
|
||||||
msgData.writeUTF("Connect");
|
|
||||||
msgData.writeUTF(portal.getNetwork());
|
|
||||||
|
|
||||||
player.sendPluginMessage(stargate, "BungeeCord", bao.toByteArray());
|
|
||||||
bao.reset();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord connect packet");
|
|
||||||
ex.printStackTrace();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close portal if required (Should never be)
|
|
||||||
portal.close(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
destination.teleport(player, portal, event);
|
|
||||||
portal.close(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
Block block = event.getClickedBlock();
|
|
||||||
|
|
||||||
if (block == null) return;
|
|
||||||
|
|
||||||
// Right click
|
|
||||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
|
||||||
if (block.getBlockData() instanceof WallSign) {
|
|
||||||
Portal portal = Portal.getByBlock(block);
|
|
||||||
if (portal == null) return;
|
|
||||||
// Cancel item use
|
|
||||||
event.setUseItemInHand(Result.DENY);
|
|
||||||
event.setUseInteractedBlock(Result.DENY);
|
|
||||||
|
|
||||||
boolean deny = false;
|
|
||||||
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
|
||||||
deny = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!portal.isOpen()) && (!portal.isFixed())) {
|
|
||||||
portal.cycleDestination(player);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implement right-click to toggle a stargate, gets around spawn protection problem.
|
|
||||||
if (Tag.BUTTONS.isTagged(block.getType())) {
|
|
||||||
Portal portal = Portal.getByBlock(block);
|
|
||||||
if (portal == null) return;
|
|
||||||
|
|
||||||
// Cancel item use
|
|
||||||
event.setUseItemInHand(Result.DENY);
|
|
||||||
event.setUseInteractedBlock(Result.DENY);
|
|
||||||
|
|
||||||
boolean deny = false;
|
|
||||||
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
|
||||||
deny = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
openPortal(player, portal);
|
|
||||||
if (portal.isOpenFor(player)) {
|
|
||||||
event.setUseInteractedBlock(Result.ALLOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Left click
|
|
||||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
|
||||||
// Check if we're scrolling a sign
|
|
||||||
if (block.getBlockData() instanceof WallSign) {
|
|
||||||
Portal portal = Portal.getByBlock(block);
|
|
||||||
if (portal == null) return;
|
|
||||||
|
|
||||||
event.setUseInteractedBlock(Result.DENY);
|
|
||||||
// Only cancel event in creative mode
|
|
||||||
if (player.getGameMode().equals(GameMode.CREATIVE)) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean deny = false;
|
|
||||||
if (!Stargate.canAccessNetwork(player, portal.getNetwork())) {
|
|
||||||
deny = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Stargate.canAccessPortal(player, portal, deny)) {
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("denyMsg"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!portal.isOpen()) && (!portal.isFixed())) {
|
|
||||||
portal.cycleDestination(player, -1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class bListener implements Listener {
|
private class bListener implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onSignChange(SignChangeEvent event) {
|
public void onSignChange(SignChangeEvent event) {
|
||||||
if (event.isCancelled()) return;
|
if (event.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
Block block = event.getBlock();
|
Block block = event.getBlock();
|
||||||
if (!(block.getBlockData() instanceof WallSign)) return;
|
if (!(block.getBlockData() instanceof WallSign)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final Portal portal = Portal.createPortal(event, player);
|
final Portal portal = Portal.createPortal(event, player);
|
||||||
// Not creating a gate, just placing a sign
|
// Not creating a gate, just placing a sign
|
||||||
if (portal == null) return;
|
if (portal == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Stargate.sendMessage(player, Stargate.getString("createMsg"), false);
|
Stargate.sendMessage(player, Stargate.getString("createMsg"), false);
|
||||||
Stargate.debug("onSignChange", "Initialized stargate: " + portal.getName());
|
Stargate.debug("onSignChange", "Initialized stargate: " + portal.getName());
|
||||||
@ -1104,7 +846,7 @@ public class Stargate extends JavaPlugin {
|
|||||||
// Handle keeping portal material and buttons around
|
// Handle keeping portal material and buttons around
|
||||||
if (block.getType() == Material.NETHER_PORTAL) {
|
if (block.getType() == Material.NETHER_PORTAL) {
|
||||||
portal = Portal.getByEntrance(block);
|
portal = Portal.getByEntrance(block);
|
||||||
} else if (Tag.BUTTONS.isTagged(block.getType())) {
|
} else if (Tag.BUTTONS.isTagged(block.getType()) || MaterialHelper.isWallCoral(block.getType())) {
|
||||||
portal = Portal.getByControl(block);
|
portal = Portal.getByControl(block);
|
||||||
}
|
}
|
||||||
if (portal != null) event.setCancelled(true);
|
if (portal != null) event.setCancelled(true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user