diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/PluginMessageManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/PluginMessageManager.java new file mode 100644 index 00000000..d00d7bad --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/PluginMessageManager.java @@ -0,0 +1,58 @@ +package net.Indyuce.mmocore.manager; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class PluginMessageManager implements MMOCoreManager, PluginMessageListener { + private String serverName; + private List allServerNames; + public final String BUNGEECORD_CHANNEL = "BungeeCord"; + + @Override + public void initialize(boolean clearBefore) { + if (!clearBefore) { + //Setup the channels. + MMOCore.plugin.getServer().getMessenger().registerOutgoingPluginChannel(MMOCore.plugin, BUNGEECORD_CHANNEL); + MMOCore.plugin.getServer().getMessenger().registerIncomingPluginChannel(MMOCore.plugin, BUNGEECORD_CHANNEL, this); + + } + } + + public void teleportToOtherServer(PlayerData playerData, String server) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("Connect"); + out.writeUTF(server); + playerData.getPlayer().sendPluginMessage(MMOCore.plugin, BUNGEECORD_CHANNEL, out.toByteArray()); + } + + + @Override + public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] bytes) { + if (!channel.equals(BUNGEECORD_CHANNEL)) return; + ByteArrayDataInput in = ByteStreams.newDataInput(bytes); + String subchannel = in.readUTF(); + if (subchannel.equals("GetServer")) { + serverName = in.readUTF(); + } else if (subchannel.equals("GetServers")) { + allServerNames = Arrays.asList(in.readUTF().split(", ")); + } + } + + public String getServerName() { + return serverName; + } + + public List getAllServerNames() { + return new ArrayList(allServerNames); + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java index ab3290d4..6327fdcb 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/data/yaml/YAMLPlayerDataHandler.java @@ -40,7 +40,6 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler config.set("bound-skills." + slot, skill)); - MMOCore.log(data.getUnlockedItems().size()+" unlocked."); config.set("unlocked-items", data.getUnlockedItems().stream().collect(Collectors.toList())); config.set("attribute", null); config.createSection("attribute"); @@ -209,6 +208,7 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler config.set("class-info." + key + ".bound-skills." + slot, skill)); config.set("class-info." + key + ".unlocked-items", new ArrayList<>(info.getUnlockedItems())); } + } @NotNull diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/spawnpoint/SpawnPointContext.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/spawnpoint/SpawnPointContext.java new file mode 100644 index 00000000..c155ad82 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/spawnpoint/SpawnPointContext.java @@ -0,0 +1,64 @@ +package net.Indyuce.mmocore.spawnpoint; + +import io.lumine.mythic.lib.gson.JsonObject; +import io.lumine.mythic.lib.util.Jsonable; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class SpawnPointContext implements Jsonable { + private final String id; + + private final Optional server; + + public SpawnPointContext(String id) { + this.id = id; + this.server = Optional.empty(); + } + + public SpawnPointContext(String id, Optional server) { + this.id = id; + this.server = server; + } + + public SpawnPointContext(JsonObject jsonObject) { + this.id = jsonObject.get("id").getAsString(); + this.server = Optional.ofNullable(jsonObject.get("server")).map((jsonElement) -> jsonElement.getAsString()); + } + + public String getId() { + return id; + } + + public Optional getServer() { + return server; + } + + + public Location getLocation() { + return MMOCore.plugin.spawnPointManager.getSpawnPoint(id).getLocation(); + } + + public boolean isOtherServer() { + return !server.isEmpty() && server.get() != MMOCore.plugin.pluginMessageManager.getServerName(); + } + + public void whenRespawn(PlayerData playerData) { + if (isOtherServer()) { + MMOCore.plugin.pluginMessageManager.teleportToOtherServer(playerData, server.get()); + } else { + MMOCore.plugin.spawnPointManager.getSpawnPoint(id).whenRespawn(playerData); + } + } + + @Override + public @NotNull JsonObject toJson() { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("id", id); + server.ifPresent((server) -> jsonObject.addProperty("server", server)); + return jsonObject; + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/spawnpoint/def/SpawnPointOption.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/spawnpoint/def/SpawnPointOption.java new file mode 100644 index 00000000..18cd4389 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/spawnpoint/def/SpawnPointOption.java @@ -0,0 +1,22 @@ +package net.Indyuce.mmocore.spawnpoint.def; + +import io.lumine.mythic.lib.api.MMOLineConfig; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.spawnpoint.SpawnPointContext; + +import java.util.Optional; + +public class SpawnPointOption extends DefaultSpawnOption { + private final SpawnPointContext spawnPointContext; + + public SpawnPointOption(MMOLineConfig config) { + super(config); + spawnPointContext = new SpawnPointContext(config.getString("id"), config.contains("server") ? + Optional.of(config.getString("server")) : Optional.empty()); + } + + @Override + public SpawnPointContext getSpawnPointContext(PlayerData playerData) { + return spawnPointContext; + } +}