Fixed bungee issues and protection

This commit is contained in:
Sekwah 2020-06-18 03:37:06 +01:00
parent 859971b6ea
commit d2a362e5af
21 changed files with 152 additions and 37 deletions

View File

@ -4,4 +4,4 @@ REM Use this file for testing cases for different versions, just drag the versio
java -Xmx4096M -DIReallyKnowWhatIAmDoingISwear=true -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar %1
REM Could add a 32 bit test part but noone uses 32 bit anymore
GOTO A
PAUSE.
PAUSE

View File

@ -2,6 +2,7 @@ package com.sekwah.advancedportals.bukkit;
import com.sekwah.advancedportals.bukkit.api.events.WarpEvent;
import com.sekwah.advancedportals.bukkit.api.portaldata.PortalArg;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.listeners.Listeners;
import com.sekwah.advancedportals.bukkit.portals.AdvancedPortal;
import com.sekwah.advancedportals.bukkit.portals.Portal;

View File

@ -1,18 +1,17 @@
package com.sekwah.advancedportals.bukkit;
import com.sekwah.advancedportals.bukkit.compat.CraftBukkit;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigHelper;
import com.sekwah.advancedportals.bukkit.destinations.Destination;
import com.sekwah.advancedportals.bukkit.destinations.DestinationCommand;
import com.sekwah.advancedportals.bukkit.effects.WarpEffects;
import com.sekwah.advancedportals.bukkit.listeners.*;
import com.sekwah.advancedportals.bukkit.metrics.Metrics;
import com.sekwah.advancedportals.bukkit.portals.Portal;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
public class AdvancedPortalsPlugin extends JavaPlugin {
public CraftBukkit compat = null;
@ -38,6 +37,12 @@ public class AdvancedPortalsPlugin extends JavaPlugin {
ConfigAccessor config = new ConfigAccessor(this, "config.yml");
ConfigHelper configHelper = new ConfigHelper(config.getConfig());
configHelper.update();
config.saveConfig();
// TODO reenable and finish but probably focus on the recode first
/*if(config.getConfig().getBoolean("DisableGatewayBeam", true)) {
new PacketInjector(this, version);

View File

@ -1,5 +1,6 @@
package com.sekwah.advancedportals.bukkit;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import org.bukkit.command.CommandSender;
public class PluginMessages {

View File

@ -1,5 +1,6 @@
package com.sekwah.advancedportals.bukkit;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;

View File

@ -1,5 +1,7 @@
package com.sekwah.advancedportals.bukkit;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import static com.sekwah.advancedportals.bukkit.Settings.PortalConfigOption.*;
/**

View File

@ -1,4 +1,4 @@
package com.sekwah.advancedportals.bukkit;
package com.sekwah.advancedportals.bukkit.config;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@ -78,4 +78,4 @@ public class ConfigAccessor {
}
}
}
}

View File

@ -0,0 +1,23 @@
package com.sekwah.advancedportals.bukkit.config;
import org.bukkit.configuration.file.FileConfiguration;
public class ConfigHelper {
public static String CONFIG_VERSION = "ConfigVersion";
private FileConfiguration config;
public ConfigHelper(FileConfiguration config) {
this.config = config;
}
public void update() {
String configVersion = config.getString("ConfigVersion");
// Added in 0.5.3 so update to 0.5.3
if(configVersion == null) {
config.set(ConfigHelper.CONFIG_VERSION, "0.5.3");
}
}
}

View File

@ -1,7 +1,7 @@
package com.sekwah.advancedportals.bukkit.destinations;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.PluginMessages;
import com.sekwah.advancedportals.bukkit.effects.WarpEffects;
import org.bukkit.Bukkit;

View File

@ -1,7 +1,7 @@
package com.sekwah.advancedportals.bukkit.destinations;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.PluginMessages;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;

View File

@ -1,7 +1,7 @@
package com.sekwah.advancedportals.bukkit.listeners;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.portals.Portal;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;

View File

@ -1,7 +1,7 @@
package com.sekwah.advancedportals.bukkit.listeners;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.PluginMessages;
import com.sekwah.advancedportals.bukkit.api.events.WarpEvent;
import com.sekwah.advancedportals.bukkit.destinations.Destination;
@ -22,10 +22,8 @@ import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class Listeners implements Listener {

View File

@ -4,6 +4,9 @@ import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.destinations.Destination;
import com.sekwah.advancedportals.bungee.BungeeMessages;
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.PluginMessageListener;
@ -28,12 +31,23 @@ public class PluginMessageReceiver implements PluginMessageListener {
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subchannel = in.readUTF();
if (subchannel.equals("BungeePortal")) {
if (subchannel.equals(BungeeMessages.SERVER_DESTI)) {
String targetDestination = in.readUTF();
UUID bungeeUUID = UUID.fromString(in.readUTF());
UUID offlineUUID = UUID.fromString(in.readUTF());
if (player != null) {
Player targetPlayer = this.plugin.getServer().getPlayer(bungeeUUID);
if(targetPlayer == null) {
targetPlayer = this.plugin.getServer().getPlayer(offlineUUID);
this.plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + BungeeMessages.WARNING_MESSAGE
+ "\n\nThis server is the offending server.");
}
if (targetPlayer != null) {
Player finalTargetPlayer = targetPlayer;
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin,
() -> Destination.warp(player, targetDestination, false, true),
() -> Destination.warp(finalTargetPlayer, targetDestination, false, true),
20L
);
}

View File

@ -1,7 +1,7 @@
package com.sekwah.advancedportals.bukkit.listeners;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.portals.Portal;
import org.bukkit.Material;
import org.bukkit.block.Block;

View File

@ -1,7 +1,7 @@
package com.sekwah.advancedportals.bukkit.listeners;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.PluginMessages;
import com.sekwah.advancedportals.bukkit.portals.Portal;
import org.bukkit.block.Block;
@ -42,6 +42,8 @@ public class PortalProtect implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void onBlockBreak(BlockBreakEvent event) {
if(!this.PortalProtect) return;
Player player = event.getPlayer();
if (!player.hasPermission("advancedportals.build")
&& Portal.inPortalRegion(event.getBlock().getLocation(), PortalProtectionArea)) {
@ -52,8 +54,10 @@ public class PortalProtect implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void onBlockPlace(BlockPlaceEvent event) {
if(!this.PortalProtect) return;
Player player = event.getPlayer();
if (!player.hasPermission("advancedportals.build")
if (PortalProtect && !player.hasPermission("advancedportals.build")
&& Portal.inPortalRegion(event.getBlock().getLocation(), PortalProtectionArea)) {
event.setCancelled(true);
player.sendMessage(PluginMessages.customPrefixFail + " You don't have permission to build here!");
@ -62,6 +66,7 @@ public class PortalProtect implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void onExplosion(EntityExplodeEvent event) {
if(!this.PortalProtect) return;
List<Block> blockList = event.blockList();
for (int i = 0; i < blockList.size(); i++) {

View File

@ -3,11 +3,12 @@ package com.sekwah.advancedportals.bukkit.portals;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.sekwah.advancedportals.bukkit.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bukkit.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.config.ConfigAccessor;
import com.sekwah.advancedportals.bukkit.PluginMessages;
import com.sekwah.advancedportals.bukkit.api.portaldata.PortalArg;
import com.sekwah.advancedportals.bukkit.destinations.Destination;
import com.sekwah.advancedportals.bukkit.effects.WarpEffects;
import com.sekwah.advancedportals.bungee.BungeeMessages;
import org.bukkit.*;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
@ -40,7 +41,8 @@ public class Portal {
ConfigAccessor config = new ConfigAccessor(plugin, "config.yml");
this.showBungeeMessage = config.getConfig().getBoolean("ShowBungeeWarpMessage", false);
this.portalProtectionRadius = config.getConfig().getInt("PortalProtectionRadius");
this.portalProtectionRadius = config.getConfig().getBoolean("PortalProtection") ?
config.getConfig().getInt("PortalProtectionArea") : 0;
this.throwback = config.getConfig().getDouble("ThrowbackAmount", 0.7);
@ -483,9 +485,11 @@ public class Portal {
if (portal.getDestiation() != null) {
ByteArrayDataOutput outForList = ByteStreams.newDataOutput();
outForList.writeUTF("PortalEnter");
outForList.writeUTF(BungeeMessages.ENTER_PORTAL);
outForList.writeUTF(bungeeServer);
outForList.writeUTF(portal.getDestiation());
outForList.writeUTF(player.getUniqueId().toString());
outForList.writeUTF(player.getName());
player.sendPluginMessage(plugin, plugin.channelName, outForList.toByteArray());
}
@ -559,8 +563,7 @@ public class Portal {
} else if (command.startsWith("%") && plugin.getSettings().enabledCommandLevel("b")) {
command = command.substring(1);
ByteArrayDataOutput outForList = ByteStreams.newDataOutput();
outForList.writeUTF("BungeeCommand");
outForList.writeUTF(player.getUniqueId().toString());
outForList.writeUTF(BungeeMessages.BUNGEE_COMMAND);
outForList.writeUTF(command);
player.sendPluginMessage(plugin, plugin.channelName, outForList.toByteArray());
} else {

View File

@ -11,7 +11,7 @@ public class AdvancedPortalsPlugin extends Plugin {
public String channelName = "mc:advancedportals";
public HashMap<UUID, String[]> PlayerDestiMap = new HashMap<>();
public HashMap<String, String[]> PlayerDestiMap = new HashMap<>();
// key: UUID (string)
// value: [0] targetServer, [1] targetDestination

View File

@ -0,0 +1,44 @@
package com.sekwah.advancedportals.bungee;
public class BungeeMessages {
/**
* I may be severely wrong but there is a serious problem with offline UUID's
*/
public static final String WARNING_MESSAGE = "\u00A7cOffline UUID detected\n" +
"You should be using IP forwarding as it also forwards UUIDs\n" +
"The issue of accounts with duplicate names does exist so ignoring this message is a bad idea\n" +
"as changing a username alters the UUID and people can also log in as anyone if they find the sub server ip\n" +
"\n" +
"Instructions to setup IP forwarding https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/\n" +
"\n" +
"Publicly complaining about this message will just show everyone you have set up your server insecurely\n" +
"\n" +
"If you have a genuine reason to be running without IP forwarding or feel I am wrong about the above statements, " +
"feel free to DM me on Spigot and I will remove this message if it is a valid reason.\n\n" +
"This message also will only shows if the bungee is in online mode.";
/**
* String in
* string bungee server
* string desti name
* string uuid (of what the server thinks it is)
*
* String out (to recieving server)
* string destination
* string uuid
* string offline uuid
*
* String out
*/
public static String ENTER_PORTAL = "PortalEnter";
public static String SERVER_DESTI = "BungeePortal";
/**
* Same in and out. This is read by the bungee
* String containing command
*/
public static String BUNGEE_COMMAND = "BungeeCommand";
}

View File

@ -3,6 +3,7 @@ package com.sekwah.advancedportals.bungee.listener;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.sekwah.advancedportals.bungee.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bungee.BungeeMessages;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
@ -16,20 +17,22 @@ public class EventListener implements Listener {
@EventHandler
public void onPlayerSwitchServer(ServerSwitchEvent event) {
UUID uuid = event.getPlayer().getUniqueId();
String uuid = event.getPlayer().getUniqueId().toString();
if (plugin.PlayerDestiMap.containsKey(uuid)) {
String[] val = plugin.PlayerDestiMap.get(uuid);
// key: UUID (string)
// value: [0] targetServer, [1] targetDestination
// value: [0] targetServer, [1] targetDestination, [2] onlineUUID, [3] offlineUUID
if (event.getPlayer().getServer().getInfo().getName().equalsIgnoreCase(val[0])) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("BungeePortal");
out.writeUTF(BungeeMessages.SERVER_DESTI);
out.writeUTF(val[1]);
out.writeUTF(val[2]);
out.writeUTF(val[3]);
event.getPlayer().getServer().sendData(plugin.channelName, out.toByteArray());
}

View File

@ -1,8 +1,10 @@
package com.sekwah.advancedportals.bungee.listener;
import com.google.common.base.Charsets;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import com.sekwah.advancedportals.bungee.AdvancedPortalsPlugin;
import com.sekwah.advancedportals.bungee.BungeeMessages;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.PluginMessageEvent;
@ -24,32 +26,44 @@ public class PluginMessageReceiver implements Listener {
ByteArrayDataInput in = ByteStreams.newDataInput(event.getData());
String subChannel = in.readUTF();
if (subChannel.equalsIgnoreCase("PortalEnter")) {
if (subChannel.equalsIgnoreCase(BungeeMessages.ENTER_PORTAL)) {
String targetServer = in.readUTF();
String targetDestination = in.readUTF();
UUID uuid;
String targetUUID = in.readUTF();
String targetName = in.readUTF();
String bungeeUUID; // If the bungee is offline mode it will be an offline uuid
String offlineUUID = UUID.nameUUIDFromBytes(("OfflinePlayer:" + targetName).getBytes(Charsets.UTF_8)).toString();
if ( event.getReceiver() instanceof ProxiedPlayer )
{
ProxiedPlayer receiver = (ProxiedPlayer) event.getReceiver();
uuid = receiver.getUniqueId();
bungeeUUID = receiver.getUniqueId().toString();
if(!targetUUID.equals(bungeeUUID)) {
Server connection = (Server) event.getSender();
plugin.getLogger().warning(BungeeMessages.WARNING_MESSAGE
+ "\n\nThe server the player was sent from is the offending server.\n" +
"Server Name: " + connection.getInfo().getName());
}
targetUUID = bungeeUUID;
}
else {
plugin.getLogger().warning("There has been an issue getting the player for the teleport request.");
return;
}
plugin.PlayerDestiMap.put(uuid, new String[]{targetServer, targetDestination});
plugin.PlayerDestiMap.put(targetUUID, new String[]{targetServer, targetDestination, targetUUID, offlineUUID});
String finalTargetUUID = targetUUID;
plugin.getProxy().getScheduler().schedule(plugin, () -> {
plugin.PlayerDestiMap.remove(uuid);
plugin.PlayerDestiMap.remove(finalTargetUUID);
}, 20, TimeUnit.SECONDS);
}
else if (subChannel.equalsIgnoreCase("BungeeCommand")) {
String targetPlayerUUID = in.readUTF();
else if (subChannel.equalsIgnoreCase(BungeeMessages.BUNGEE_COMMAND)) {
String command = in.readUTF();
ProxiedPlayer player = plugin.getProxy().getPlayer(UUID.fromString(targetPlayerUUID));
ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
if (player != null) {
// To send command to server the player is currently on
// To send command to server the player is currently on in a lazy way
//player.chat("/" + command);
plugin.getProxy().getPluginManager().dispatchCommand(player, command);
}

View File

@ -2,7 +2,8 @@
# To set this file back to its default state just delete it and reload the server or restart it!
# Will update whenever there is a config update from an older version so may not be the latest plugin version
ConfigVersion: 0.5.4
# Set to true if you want the normal axes to work normally but the ones gived with /portals selector or wand will still work though
# It can be usefull if people with permission want to use an iron axe on a survival server