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.SkillTreeStatus;
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.WaypointOption;
import net.md_5.bungee.api.ChatMessageType;
@ -86,8 +86,8 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
private double health;
private Guild guild;
private SpawnPointContext lastSpawnPointContext;
private SpawnPointContext lastUsedSpawnPointContext;
private SpawnPoint lastSpawnPoint;
private SpawnPoint lastUsedSpawnPoint;
private SkillCastingInstance skillCasting;
private final PlayerQuests questData;
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.
*/
public void setupSpawnPoint() {
if (lastSpawnPointContext != null && isOnline() && shouldTeleportWhenJoin && (lastSpawnPointContext.getServer().isEmpty() ||
lastSpawnPointContext.getServer().get().equalsIgnoreCase(MMOCore.plugin.pluginMessageManager.getServerName()))
if (lastSpawnPoint != null && isOnline() && shouldTeleportWhenJoin && !lastSpawnPoint.isOtherServer()
&& !getPlayer().isDead()) {
MMOCore.plugin.spawnPointManager.getSpawnPoint(lastSpawnPointContext.getId()).whenRespawn(this);
MMOCore.plugin.spawnPointManager.getSpawnPoint(lastSpawnPoint.getId()).whenRespawn(this);
shouldTeleportWhenJoin = false;
}
}
@ -474,21 +473,21 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
this.lastActivity.put(activity, timestamp);
}
public SpawnPointContext getLastSpawnPointContext() {
return lastSpawnPointContext;
public SpawnPoint getLastSpawnPoint() {
return lastSpawnPoint;
}
public SpawnPointContext getLastUsedSpawnPointContext() {
return lastUsedSpawnPointContext;
public SpawnPoint getLastUsedSpawnPoint() {
return lastUsedSpawnPoint;
}
public void setLastSpawnPointContext(SpawnPointContext lastSpawnPointContext) {
this.lastSpawnPointContext = lastSpawnPointContext;
public void setLastSpawnPoint(SpawnPoint lastSpawnPoint) {
this.lastSpawnPoint = lastSpawnPoint;
}
public void setLastUsedSpawnPointContext(SpawnPointContext lastUsedSpawnPointContext) {
this.lastUsedSpawnPointContext = lastUsedSpawnPointContext;
public void setLastUsedSpawnPoint(SpawnPoint lastUsedSpawnPoint) {
this.lastUsedSpawnPoint = this.lastUsedSpawnPoint;
}
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.JsonElement;
import io.lumine.mythic.lib.gson.JsonObject;
import io.lumine.mythic.lib.gson.JsonParser;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
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.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.skilltree.tree.SkillTree;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import org.apache.commons.lang.Validate;
import org.bukkit.attribute.Attribute;
import org.jetbrains.annotations.Nullable;
@ -93,9 +90,10 @@ public class MMOCoreDataSynchronizer extends SQLDataSynchronizer<PlayerData> {
if (!isEmpty(result.getString("friends")))
MMOCoreUtils.jsonArrayToList(result.getString("friends")).forEach(str -> getData().getFriends().add(UUID.fromString(str)));
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")))
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().setupSpawnPoint();

View File

@ -126,8 +126,8 @@ public class SQLDataHandler extends SQLSynchronizedDataHandler<PlayerData, Offli
updater.addData("professions", data.getCollectionSkills().toJsonString());
updater.addData("quests", data.getQuestData().toJsonString());
updater.addData("class_info", createClassInfoData(data).toString());
updater.addData("last_spawn_point", data.getLastSpawnPointContext().toJson());
updater.addData("last_used_spawn_point", data.getLastUsedSpawnPointContext().toJson());
updater.addData("last_spawn_point", data.getLastSpawnPoint().getId());
updater.addData("last_used_spawn_point", data.getLastUsedSpawnPoint().getId());
updater.addJSONArray("unlocked_items", data.getUnlockedItems());
if (!autosave)
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.skill.ClassSkill;
import net.Indyuce.mmocore.skilltree.SkillTreeNode;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import org.apache.commons.lang.Validate;
import org.bukkit.attribute.Attribute;
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.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"));
if (config.contains("last-spawn-point")) {
data.setLastSpawnPointContext(new SpawnPointContext(config.getString("last-spawn-point.id"),
Optional.ofNullable(config.getString("last-spawn-point.server"))));
}
if (config.contains("last-used-spawn-point")) {
data.setLastUsedSpawnPointContext(new SpawnPointContext(config.getString("last-used-spawn-point.id"),
Optional.ofNullable(config.getString("last-used-spawn-point.server"))));
}
if (config.contains("last-spawn-point"))
data.setLastSpawnPoint(MMOCore.plugin.spawnPointManager.getSpawnPoint(config.getString("last-spawn-point")));
if (config.contains("last-used-spawn-point"))
data.setLastUsedSpawnPoint(MMOCore.plugin.spawnPointManager.getSpawnPoint(config.getString("last-used-spawn-point")));
data.setShouldTeleportWhenJoin(config.getBoolean("should-teleport-when-join", false));
data.setupSpawnPoint();
if (data.isOnline() && !data.getPlayer().isDead())
@ -182,10 +179,10 @@ public class YAMLPlayerDataHandler extends YAMLSynchronizedDataHandler<PlayerDat
config.set("attribute", null);
config.createSection("attribute");
data.getAttributes().save(config.getConfigurationSection("attribute"));
if (data.getLastSpawnPointContext() != null)
data.getLastUsedSpawnPointContext().save(config.createSection("last-used-spawn-point"));
if (data.getLastUsedSpawnPointContext() != null)
data.getLastUsedSpawnPointContext().save(config.createSection("last-used-spawn-point"));
if (data.getLastSpawnPoint() != null)
config.set("last-spawn-point", data.getLastSpawnPoint().getId());
if (data.getLastUsedSpawnPoint() != null)
config.set("last-used-spawn-point", data.getLastUsedSpawnPoint().getId());
config.set("profession", null);
config.createSection("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.UtilityMethods;
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.condition.Condition;
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.player.Unlockable;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection;
@ -26,6 +24,8 @@ import java.util.logging.Level;
public class SpawnPoint implements Unlockable {
private final String id;
private final Optional<String> server;
private final Location location;
private final Condition unlockCondition;
private final double strength;
@ -37,6 +37,7 @@ public class SpawnPoint implements Unlockable {
public SpawnPoint(ConfigurationSection section) {
id = section.getName();
server = Optional.ofNullable(section.getString("server"));
location = UtilityMethods.readLocation(new ConfigSectionObject(section.getConfigurationSection("location")));
Validate.isTrue(section.isConfigurationSection("unlock-condition"), "You must specify an unlock condition.");
unlockCondition = MythicLib.plugin.getSkills().loadCondition(
@ -101,6 +102,10 @@ public class SpawnPoint implements Unlockable {
unlockScript.ifPresent(skill -> skill.cast(triggerMetadata));
}
public boolean isOtherServer() {
return !server.isEmpty() && server.get() != MMOCore.plugin.pluginMessageManager.getServerName();
}
public boolean matchesCondition(PlayerData playerData) {
SkillMetadata metadata = new SkillMetadata(null, playerData.getMMOPlayerData());
if (!overridesUnlockCondition && !MMOCore.plugin.spawnPointManager.getUnlockCondition()
@ -110,9 +115,15 @@ public class SpawnPoint implements Unlockable {
}
public void whenRespawn(PlayerData playerData) {
TriggerMetadata triggerMetadata = new TriggerMetadata(playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND));
if (!overridesRespawnScript)
MMOCore.plugin.spawnPointManager.getRespawnScript().ifPresent(skill -> skill.cast(triggerMetadata));
respawnScript.ifPresent(skill -> skill.cast(triggerMetadata));
if (isOtherServer()) {
MMOCore.plugin.pluginMessageManager.teleportToOtherServer(playerData, server.get());
} else {
playerData.setLastUsedSpawnPoint(this);
TriggerMetadata triggerMetadata = new TriggerMetadata(playerData.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND));
if (!overridesRespawnScript)
MMOCore.plugin.spawnPointManager.getRespawnScript().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 net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import org.bukkit.World;
import java.util.regex.Matcher;
@ -28,6 +27,6 @@ public abstract class DefaultSpawnOption {
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 net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.spawnpoint.SpawnPointContext;
import net.Indyuce.mmocore.spawnpoint.SpawnPoint;
public class LastOption extends DefaultSpawnOption {
@ -11,8 +11,8 @@ public class LastOption extends DefaultSpawnOption {
}
@Override
public SpawnPointContext getSpawnPointContext(PlayerData playerData) {
return playerData.getLastSpawnPointContext();
public SpawnPoint getSpawnPoint(PlayerData playerData) {
return playerData.getLastSpawnPoint();
}
}

View File

@ -2,7 +2,7 @@ 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 net.Indyuce.mmocore.spawnpoint.SpawnPoint;
public class LastUsedOption extends DefaultSpawnOption {
@ -11,8 +11,8 @@ public class LastUsedOption extends DefaultSpawnOption {
}
@Override
public SpawnPointContext getSpawnPointContext(PlayerData playerData) {
return playerData.getLastSpawnPointContext();
public SpawnPoint getSpawnPoint(PlayerData playerData) {
return playerData.getLastSpawnPoint();
}
}

View File

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

View File

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