Removed SpawnPointContext and centralized everything into SpawnPoints directly.

This commit is contained in:
Ka0rX 2023-07-19 21:45:32 +01:00
parent c0d69a1e5a
commit cbe31c5e73
11 changed files with 74 additions and 145 deletions

View File

@ -49,7 +49,7 @@ import net.Indyuce.mmocore.skill.cast.SkillCastingMode;
import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.skilltree.SkillTreeStatus; import net.Indyuce.mmocore.skilltree.SkillTreeStatus;
import net.Indyuce.mmocore.skilltree.tree.SkillTree; import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext; import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
import net.Indyuce.mmocore.waypoint.Waypoint; import net.Indyuce.mmocore.waypoint.Waypoint;
import net.Indyuce.mmocore.waypoint.WaypointOption; import net.Indyuce.mmocore.waypoint.WaypointOption;
import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ChatMessageType;
@ -86,8 +86,8 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
private double health; private double health;
private Guild guild; private Guild guild;
private SpawnPointContext lastSpawnPointContext; private SpawnPoint lastSpawnPoint;
private SpawnPointContext lastUsedSpawnPointContext; private SpawnPoint lastUsedSpawnPoint;
private SkillCastingInstance skillCasting; private SkillCastingInstance skillCasting;
private final PlayerQuests questData; private final PlayerQuests questData;
private final PlayerStats playerStats; private final PlayerStats playerStats;
@ -203,10 +203,9 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
* If he is dead this will be done when he respawns. * If he is dead this will be done when he respawns.
*/ */
public void setupSpawnPoint() { public void setupSpawnPoint() {
if (lastSpawnPointContext != null && isOnline() && shouldTeleportWhenJoin && (lastSpawnPointContext.getServer().isEmpty() || if (lastSpawnPoint != null && isOnline() && shouldTeleportWhenJoin && !lastSpawnPoint.isOtherServer()
lastSpawnPointContext.getServer().get().equalsIgnoreCase(MMOCore.plugin.pluginMessageManager.getServerName()))
&& !getPlayer().isDead()) { && !getPlayer().isDead()) {
MMOCore.plugin.spawnPointManager.getSpawnPoint(lastSpawnPointContext.getId()).whenRespawn(this); MMOCore.plugin.spawnPointManager.getSpawnPoint(lastSpawnPoint.getId()).whenRespawn(this);
shouldTeleportWhenJoin = false; shouldTeleportWhenJoin = false;
} }
} }
@ -474,21 +473,21 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
this.lastActivity.put(activity, timestamp); this.lastActivity.put(activity, timestamp);
} }
public SpawnPointContext getLastSpawnPointContext() { public SpawnPoint getLastSpawnPoint() {
return lastSpawnPointContext; return lastSpawnPoint;
} }
public SpawnPointContext getLastUsedSpawnPointContext() { public SpawnPoint getLastUsedSpawnPoint() {
return lastUsedSpawnPointContext; return lastUsedSpawnPoint;
} }
public void setLastSpawnPointContext(SpawnPointContext lastSpawnPointContext) { public void setLastSpawnPoint(SpawnPoint lastSpawnPoint) {
this.lastSpawnPointContext = lastSpawnPointContext; this.lastSpawnPoint = lastSpawnPoint;
} }
public void setLastUsedSpawnPointContext(SpawnPointContext lastUsedSpawnPointContext) { public void setLastUsedSpawnPoint(SpawnPoint lastUsedSpawnPoint) {
this.lastUsedSpawnPointContext = lastUsedSpawnPointContext; this.lastUsedSpawnPoint = this.lastUsedSpawnPoint;
} }
public void setShouldTeleportWhenJoin(boolean shouldTeleport) { public void setShouldTeleportWhenJoin(boolean shouldTeleport) {

View File

@ -6,8 +6,6 @@ import io.lumine.mythic.lib.data.sql.SQLDataSynchronizer;
import io.lumine.mythic.lib.gson.JsonArray; import io.lumine.mythic.lib.gson.JsonArray;
import io.lumine.mythic.lib.gson.JsonElement; import io.lumine.mythic.lib.gson.JsonElement;
import io.lumine.mythic.lib.gson.JsonObject; import io.lumine.mythic.lib.gson.JsonObject;
import io.lumine.mythic.lib.gson.JsonParser;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.PlayerClass;
@ -17,7 +15,6 @@ import net.Indyuce.mmocore.guild.provided.Guild;
import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.skilltree.tree.SkillTree; import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -93,9 +90,10 @@ public class MMOCoreDataSynchronizer extends SQLDataSynchronizer<PlayerData> {
if (!isEmpty(result.getString("friends"))) if (!isEmpty(result.getString("friends")))
MMOCoreUtils.jsonArrayToList(result.getString("friends")).forEach(str -> getData().getFriends().add(UUID.fromString(str))); MMOCoreUtils.jsonArrayToList(result.getString("friends")).forEach(str -> getData().getFriends().add(UUID.fromString(str)));
if (!isEmpty(result.getString("last_spawn_point"))) if (!isEmpty(result.getString("last_spawn_point")))
getData().setLastSpawnPointContext(new SpawnPointContext(new JsonParser().parseString(result.getString("last_spawn_point")).getAsJsonObject())); getData().setLastSpawnPoint(MMOCore.plugin.spawnPointManager.getSpawnPoint(result.getString("last_spawn_point")));
if (!isEmpty(result.getString("last_used_spawn_point"))) if (!isEmpty(result.getString("last_used_spawn_point")))
getData().setLastUsedSpawnPointContext(new SpawnPointContext(new JsonParser().parseString(result.getString("last_spawn_point")).getAsJsonObject())); getData().setLastUsedSpawnPoint(MMOCore.plugin.spawnPointManager.getSpawnPoint(result.getString("last_spawn_point")));
getData().setShouldTeleportWhenJoin(result.getBoolean("should_teleport_when_join")); getData().setShouldTeleportWhenJoin(result.getBoolean("should_teleport_when_join"));
getData().setupSpawnPoint(); getData().setupSpawnPoint();

View File

@ -126,8 +126,8 @@ public class SQLDataHandler extends SQLSynchronizedDataHandler<PlayerData, Offli
updater.addData("professions", data.getCollectionSkills().toJsonString()); updater.addData("professions", data.getCollectionSkills().toJsonString());
updater.addData("quests", data.getQuestData().toJsonString()); updater.addData("quests", data.getQuestData().toJsonString());
updater.addData("class_info", createClassInfoData(data).toString()); updater.addData("class_info", createClassInfoData(data).toString());
updater.addData("last_spawn_point", data.getLastSpawnPointContext().toJson()); updater.addData("last_spawn_point", data.getLastSpawnPoint().getId());
updater.addData("last_used_spawn_point", data.getLastUsedSpawnPointContext().toJson()); updater.addData("last_used_spawn_point", data.getLastUsedSpawnPoint().getId());
updater.addJSONArray("unlocked_items", data.getUnlockedItems()); updater.addJSONArray("unlocked_items", data.getUnlockedItems());
if (!autosave) if (!autosave)
updater.addData("is_saved", 1); updater.addData("is_saved", 1);

View File

@ -10,7 +10,6 @@ import net.Indyuce.mmocore.guild.provided.Guild;
import net.Indyuce.mmocore.manager.data.OfflinePlayerData; import net.Indyuce.mmocore.manager.data.OfflinePlayerData;
import net.Indyuce.mmocore.skill.ClassSkill; import net.Indyuce.mmocore.skill.ClassSkill;
import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.attribute.Attribute; import org.bukkit.attribute.Attribute;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@ -135,14 +134,12 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler<PlayerDat
data.setMana(config.contains("mana") ? config.getDouble("mana") : data.getStats().getStat("MAX_MANA")); data.setMana(config.contains("mana") ? config.getDouble("mana") : data.getStats().getStat("MAX_MANA"));
data.setStamina(config.contains("stamina") ? config.getDouble("stamina") : data.getStats().getStat("MAX_STAMINA")); data.setStamina(config.contains("stamina") ? config.getDouble("stamina") : data.getStats().getStat("MAX_STAMINA"));
data.setStellium(config.contains("stellium") ? config.getDouble("stellium") : data.getStats().getStat("MAX_STELLIUM")); data.setStellium(config.contains("stellium") ? config.getDouble("stellium") : data.getStats().getStat("MAX_STELLIUM"));
if (config.contains("last-spawn-point")) { if (config.contains("last-spawn-point"))
data.setLastSpawnPointContext(new SpawnPointContext(config.getString("last-spawn-point.id"), data.setLastSpawnPoint(MMOCore.plugin.spawnPointManager.getSpawnPoint(config.getString("last-spawn-point")));
Optional.ofNullable(config.getString("last-spawn-point.server"))));
} if (config.contains("last-used-spawn-point"))
if (config.contains("last-used-spawn-point")) { data.setLastUsedSpawnPoint(MMOCore.plugin.spawnPointManager.getSpawnPoint(config.getString("last-used-spawn-point")));
data.setLastUsedSpawnPointContext(new SpawnPointContext(config.getString("last-used-spawn-point.id"),
Optional.ofNullable(config.getString("last-used-spawn-point.server"))));
}
data.setShouldTeleportWhenJoin(config.getBoolean("should-teleport-when-join", false)); data.setShouldTeleportWhenJoin(config.getBoolean("should-teleport-when-join", false));
data.setupSpawnPoint(); data.setupSpawnPoint();
if (data.isOnline() && !data.getPlayer().isDead()) if (data.isOnline() && !data.getPlayer().isDead())
@ -182,10 +179,10 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler<PlayerDat
config.set("attribute", null); config.set("attribute", null);
config.createSection("attribute"); config.createSection("attribute");
data.getAttributes().save(config.getConfigurationSection("attribute")); data.getAttributes().save(config.getConfigurationSection("attribute"));
if (data.getLastSpawnPointContext() != null) if (data.getLastSpawnPoint() != null)
data.getLastUsedSpawnPointContext().save(config.createSection("last-used-spawn-point")); config.set("last-spawn-point", data.getLastSpawnPoint().getId());
if (data.getLastUsedSpawnPointContext() != null) if (data.getLastUsedSpawnPoint() != null)
data.getLastUsedSpawnPointContext().save(config.createSection("last-used-spawn-point")); config.set("last-used-spawn-point", data.getLastUsedSpawnPoint().getId());
config.set("profession", null); config.set("profession", null);
config.createSection("profession"); config.createSection("profession");
data.getCollectionSkills().save(config.getConfigurationSection("profession")); data.getCollectionSkills().save(config.getConfigurationSection("profession"));

View File

@ -3,7 +3,6 @@ package net.Indyuce.mmocore.spawnpoint;
import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.MythicLib;
import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.UtilityMethods;
import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.player.PlayerMetadata;
import io.lumine.mythic.lib.script.Script; import io.lumine.mythic.lib.script.Script;
import io.lumine.mythic.lib.script.condition.Condition; import io.lumine.mythic.lib.script.condition.Condition;
import io.lumine.mythic.lib.skill.SimpleSkill; import io.lumine.mythic.lib.skill.SimpleSkill;
@ -17,7 +16,6 @@ import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.player.Unlockable; import net.Indyuce.mmocore.player.Unlockable;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@ -26,6 +24,8 @@ import java.util.logging.Level;
public class SpawnPoint implements Unlockable { public class SpawnPoint implements Unlockable {
private final String id; private final String id;
private final Optional<String> server;
private final Location location; private final Location location;
private final Condition unlockCondition; private final Condition unlockCondition;
private final double strength; private final double strength;
@ -37,6 +37,7 @@ public class SpawnPoint implements Unlockable {
public SpawnPoint(ConfigurationSection section) { public SpawnPoint(ConfigurationSection section) {
id = section.getName(); id = section.getName();
server = Optional.ofNullable(section.getString("server"));
location = UtilityMethods.readLocation(new ConfigSectionObject(section.getConfigurationSection("location"))); location = UtilityMethods.readLocation(new ConfigSectionObject(section.getConfigurationSection("location")));
Validate.isTrue(section.isConfigurationSection("unlock-condition"), "You must specify an unlock condition."); Validate.isTrue(section.isConfigurationSection("unlock-condition"), "You must specify an unlock condition.");
unlockCondition = MythicLib.plugin.getSkills().loadCondition( unlockCondition = MythicLib.plugin.getSkills().loadCondition(
@ -101,6 +102,10 @@ public class SpawnPoint implements Unlockable {
unlockScript.ifPresent(skill -> skill.cast(triggerMetadata)); unlockScript.ifPresent(skill -> skill.cast(triggerMetadata));
} }
public boolean isOtherServer() {
return !server.isEmpty() && server.get() != MMOCore.plugin.pluginMessageManager.getServerName();
}
public boolean matchesCondition(PlayerData playerData) { public boolean matchesCondition(PlayerData playerData) {
SkillMetadata metadata = new SkillMetadata(null, playerData.getMMOPlayerData()); SkillMetadata metadata = new SkillMetadata(null, playerData.getMMOPlayerData());
if (!overridesUnlockCondition && !MMOCore.plugin.spawnPointManager.getUnlockCondition() if (!overridesUnlockCondition && !MMOCore.plugin.spawnPointManager.getUnlockCondition()
@ -110,9 +115,15 @@ public class SpawnPoint implements Unlockable {
} }
public void whenRespawn(PlayerData playerData) { public void whenRespawn(PlayerData playerData) {
if (isOtherServer()) {
MMOCore.plugin.pluginMessageManager.teleportToOtherServer(playerData, server.get());
} else {
playerData.setLastUsedSpawnPoint(this);
TriggerMetadata triggerMetadata = new TriggerMetadata(playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND)); TriggerMetadata triggerMetadata = new TriggerMetadata(playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND));
if (!overridesRespawnScript) if (!overridesRespawnScript)
MMOCore.plugin.spawnPointManager.getRespawnScript().ifPresent(skill -> skill.cast(triggerMetadata)); MMOCore.plugin.spawnPointManager.getRespawnScript().ifPresent(skill -> skill.cast(triggerMetadata));
respawnScript.ifPresent(skill -> skill.cast(triggerMetadata)); respawnScript.ifPresent(skill -> skill.cast(triggerMetadata));
} }
}
} }

View File

@ -1,71 +0,0 @@
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.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import java.util.Optional;
public class SpawnPointContext implements Jsonable {
private final String id;
private final Optional<String> server;
public SpawnPointContext(String id) {
this.id = id;
this.server = Optional.empty();
}
public SpawnPointContext(String id, Optional<String> 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<String> 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 {
playerData.setLastUsedSpawnPointContext(this);
MMOCore.plugin.spawnPointManager.getSpawnPoint(id).whenRespawn(playerData);
}
}
public void save(ConfigurationSection section) {
section.set("id", id);
server.ifPresent((server) -> section.set("server", server));
}
@Override
public @NotNull JsonObject toJson() {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("id", id);
server.ifPresent((server) -> jsonObject.addProperty("server", server));
return jsonObject;
}
}

View File

@ -3,7 +3,6 @@ package net.Indyuce.mmocore.spawnpoint.def;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPoint; import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import org.bukkit.World; import org.bukkit.World;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -28,6 +27,6 @@ public abstract class DefaultSpawnOption {
return matcher.matches(); return matcher.matches();
} }
public abstract SpawnPointContext getSpawnPointContext(PlayerData playerData); public abstract SpawnPoint getSpawnPoint(PlayerData playerData);
} }

View File

@ -2,7 +2,7 @@ package net.Indyuce.mmocore.spawnpoint.def;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext; import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
public class LastOption extends DefaultSpawnOption { public class LastOption extends DefaultSpawnOption {
@ -11,8 +11,8 @@ public class LastOption extends DefaultSpawnOption {
} }
@Override @Override
public SpawnPointContext getSpawnPointContext(PlayerData playerData) { public SpawnPoint getSpawnPoint(PlayerData playerData) {
return playerData.getLastSpawnPointContext(); return playerData.getLastSpawnPoint();
} }
} }

View File

@ -2,7 +2,7 @@ package net.Indyuce.mmocore.spawnpoint.def;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext; import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
public class LastUsedOption extends DefaultSpawnOption { public class LastUsedOption extends DefaultSpawnOption {
@ -11,8 +11,8 @@ public class LastUsedOption extends DefaultSpawnOption {
} }
@Override @Override
public SpawnPointContext getSpawnPointContext(PlayerData playerData) { public SpawnPoint getSpawnPoint(PlayerData playerData) {
return playerData.getLastSpawnPointContext(); return playerData.getLastSpawnPoint();
} }
} }

View File

@ -1,22 +1,24 @@
package net.Indyuce.mmocore.spawnpoint.def; package net.Indyuce.mmocore.spawnpoint.def;
import io.lumine.mythic.lib.api.MMOLineConfig; import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext; import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
import org.apache.commons.lang.Validate;
import java.util.Optional; import java.util.Optional;
public class SpawnPointOption extends DefaultSpawnOption { public class SpawnPointOption extends DefaultSpawnOption {
private final SpawnPointContext spawnPointContext; private final SpawnPoint spawnPoint;
public SpawnPointOption(MMOLineConfig config) { public SpawnPointOption(MMOLineConfig config) {
super(config); super(config);
spawnPointContext = new SpawnPointContext(config.getString("id"), config.contains("server") ? Validate.isTrue(MMOCore.plugin.spawnPointManager.isSpawnPoint(config.getString("id")));
Optional.of(config.getString("server")) : Optional.empty()); spawnPoint = MMOCore.plugin.spawnPointManager.getSpawnPoint(config.getString("id"));
} }
@Override @Override
public SpawnPointContext getSpawnPointContext(PlayerData playerData) { public SpawnPoint getSpawnPoint(PlayerData playerData) {
return spawnPointContext; return spawnPoint;
} }
} }

View File

@ -3,7 +3,6 @@ package net.Indyuce.mmocore.listener;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPoint; import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import net.Indyuce.mmocore.spawnpoint.def.DefaultSpawnOption; import net.Indyuce.mmocore.spawnpoint.def.DefaultSpawnOption;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -23,7 +22,7 @@ public class SpawnPointsListener implements Listener {
public void onTeleport(PlayerTeleportEvent event) { public void onTeleport(PlayerTeleportEvent event) {
if (!event.getFrom().getWorld().equals(event.getTo().getWorld())) { if (!event.getFrom().getWorld().equals(event.getTo().getWorld())) {
PlayerData playerData = PlayerData.get(event.getPlayer()); PlayerData playerData = PlayerData.get(event.getPlayer());
getLastSpawnPointContext(event.getFrom(), playerData).ifPresent(playerData::setLastSpawnPointContext); getLastSpawnPoint(event.getFrom(), playerData).ifPresent(playerData::setLastSpawnPoint);
} }
} }
@ -31,28 +30,23 @@ public class SpawnPointsListener implements Listener {
public void onDeath(PlayerDeathEvent event) { public void onDeath(PlayerDeathEvent event) {
PlayerData playerData = PlayerData.get(event.getEntity()); PlayerData playerData = PlayerData.get(event.getEntity());
//TODO: Only when module enabled //TODO: Only when module enabled
Optional<SpawnPointContext> context = getLastSpawnPointContext(playerData); getLastSpawnPoint(playerData).ifPresent((spawnPoint) -> playerData.setLastSpawnPoint(spawnPoint));
if (context.isPresent()) {
SpawnPointContext spawnPointContext = context.get();
playerData.setLastSpawnPointContext(spawnPointContext);
}
} }
@EventHandler @EventHandler
public void onSpawn(PlayerRespawnEvent event) { public void onSpawn(PlayerRespawnEvent event) {
PlayerData playerData = PlayerData.get(event.getPlayer()); PlayerData playerData = PlayerData.get(event.getPlayer());
Optional<SpawnPointContext> context = getLastSpawnPointContext(playerData); getLastSpawnPoint(playerData).ifPresent((spawnPoint) ->
if (context.isPresent()) { {
SpawnPointContext spawnPointContext = context.get(); if (!spawnPoint.isOtherServer())
if (!spawnPointContext.isOtherServer()) { event.setRespawnLocation(spawnPoint.getLocation());
event.setRespawnLocation(spawnPointContext.getLocation());
spawnPoint.whenRespawn(playerData);
});
} }
spawnPointContext.whenRespawn(playerData); public Optional<SpawnPoint> getLastSpawnPoint(Location location, PlayerData playerData) {
}
}
public Optional<SpawnPointContext> getLastSpawnPointContext(Location location, PlayerData playerData) {
World world = location.getWorld(); World world = location.getWorld();
List<SpawnPoint> reachableSpawnPoints = MMOCore.plugin.spawnPointManager. List<SpawnPoint> reachableSpawnPoints = MMOCore.plugin.spawnPointManager.
getAll() getAll()
@ -71,19 +65,19 @@ public class SpawnPointsListener implements Listener {
closestSpawnPoint = spawnPoint; closestSpawnPoint = spawnPoint;
} }
} }
return Optional.of(new SpawnPointContext(closestSpawnPoint.getId())); return Optional.of(closestSpawnPoint);
} else } else
for (DefaultSpawnOption defaultSpawnOption : MMOCore.plugin.spawnPointManager.getDefaultSpawnOptions()) { for (DefaultSpawnOption defaultSpawnOption : MMOCore.plugin.spawnPointManager.getDefaultSpawnOptions()) {
Bukkit.broadcastMessage("world: " + world.getName() + " matches: " + defaultSpawnOption.matches(world)); Bukkit.broadcastMessage("world: " + world.getName() + " matches: " + defaultSpawnOption.matches(world));
if (defaultSpawnOption.matches(world)) { if (defaultSpawnOption.matches(world)) {
return Optional.of(defaultSpawnOption.getSpawnPointContext(playerData)); return Optional.of(defaultSpawnOption.getSpawnPoint(playerData));
} }
} }
return Optional.empty(); return Optional.empty();
} }
public Optional<SpawnPointContext> getLastSpawnPointContext(PlayerData playerData) { public Optional<SpawnPoint> getLastSpawnPoint(PlayerData playerData) {
return getLastSpawnPointContext(playerData.getPlayer().getLocation(), playerData); return getLastSpawnPoint(playerData.getPlayer().getLocation(), playerData);
} }
} }