Skip to content

Commit bc3556a

Browse files
authored
Merge pull request #186 from TheNextLvl-net/fix/spawn-location
Fixed spawn location de/serialization
2 parents 41692ff + 310865d commit bc3556a

File tree

5 files changed

+101
-9
lines changed

5 files changed

+101
-9
lines changed

src/main/java/net/thenextlvl/tweaks/TweaksPlugin.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import core.i18n.file.ComponentBundle;
77
import core.io.IO;
88
import core.paper.adapters.inventory.MaterialAdapter;
9-
import core.paper.adapters.world.LocationAdapter;
10-
import core.paper.adapters.world.WorldAdapter;
119
import core.paper.messenger.PluginMessenger;
1210
import io.papermc.paper.command.brigadier.Commands;
1311
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
@@ -16,6 +14,7 @@
1614
import net.kyori.adventure.text.minimessage.MiniMessage;
1715
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
1816
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
17+
import net.thenextlvl.tweaks.adapter.LazyLocationAdapter;
1918
import net.thenextlvl.tweaks.command.environment.time.DayCommand;
2019
import net.thenextlvl.tweaks.command.environment.time.MidnightCommand;
2120
import net.thenextlvl.tweaks.command.environment.time.NightCommand;
@@ -101,14 +100,13 @@
101100
import net.thenextlvl.tweaks.listener.SpawnListener;
102101
import net.thenextlvl.tweaks.listener.WorldListener;
103102
import net.thenextlvl.tweaks.model.CommandConfig;
103+
import net.thenextlvl.tweaks.model.LazyLocation;
104104
import net.thenextlvl.tweaks.model.MessageMigrator;
105105
import net.thenextlvl.tweaks.model.PluginConfig;
106106
import net.thenextlvl.tweaks.version.PluginVersionChecker;
107107
import org.bstats.bukkit.Metrics;
108-
import org.bukkit.Location;
109108
import org.bukkit.Material;
110109
import org.bukkit.ServerLinks;
111-
import org.bukkit.World;
112110
import org.bukkit.entity.Player;
113111
import org.bukkit.plugin.java.JavaPlugin;
114112
import org.jspecify.annotations.NullMarked;
@@ -364,9 +362,8 @@ private void initConfig() {
364362
this.config = new GsonFile<>(
365363
IO.of(getDataFolder(), "config.json"),
366364
new PluginConfig(), new GsonBuilder()
367-
.registerTypeHierarchyAdapter(Location.class, new LocationAdapter.Simple())
365+
.registerTypeHierarchyAdapter(LazyLocation.class, new LazyLocationAdapter())
368366
.registerTypeHierarchyAdapter(Material.class, new MaterialAdapter())
369-
.registerTypeHierarchyAdapter(World.class, new WorldAdapter.Key())
370367
.disableHtmlEscaping()
371368
.setPrettyPrinting()
372369
.serializeNulls()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package net.thenextlvl.tweaks.adapter;
2+
3+
import com.google.gson.JsonDeserializationContext;
4+
import com.google.gson.JsonDeserializer;
5+
import com.google.gson.JsonElement;
6+
import com.google.gson.JsonNull;
7+
import com.google.gson.JsonParseException;
8+
import com.google.gson.JsonPrimitive;
9+
import com.google.gson.JsonSerializationContext;
10+
import com.google.gson.JsonSerializer;
11+
import net.kyori.adventure.key.Key;
12+
import net.thenextlvl.tweaks.model.LazyLocation;
13+
import org.jspecify.annotations.NullMarked;
14+
import org.jspecify.annotations.Nullable;
15+
16+
import java.lang.reflect.Type;
17+
18+
@NullMarked
19+
public class LazyLocationAdapter implements JsonSerializer<LazyLocation>, JsonDeserializer<LazyLocation> {
20+
@Override
21+
@SuppressWarnings("PatternValidation")
22+
public @Nullable LazyLocation deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
23+
if (!element.isJsonPrimitive()) return null;
24+
var split = element.getAsString().split(", ");
25+
var world = Key.key(split[0]);
26+
var x = Double.parseDouble(split[1]);
27+
var y = Double.parseDouble(split[2]);
28+
var z = Double.parseDouble(split[3]);
29+
var yaw = split.length == 6 ? Float.parseFloat(split[4]) : 0;
30+
var pitch = split.length == 6 ? Float.parseFloat(split[5]) : 0;
31+
return new LazyLocation(world, x, y, z, yaw, pitch);
32+
}
33+
34+
@Override
35+
public JsonElement serialize(@Nullable LazyLocation source, Type type, JsonSerializationContext context) {
36+
if (source == null) return JsonNull.INSTANCE;
37+
var builder = new StringBuilder(source.key().asString()).append(", ")
38+
.append(source.getX()).append(", ")
39+
.append(source.getY()).append(", ")
40+
.append(source.getZ());
41+
if (source.getYaw() != 0 || source.getPitch() != 0)
42+
builder.append(", ").append(source.getYaw()).append(", ").append(source.getPitch());
43+
return new JsonPrimitive(builder.toString());
44+
}
45+
}

src/main/java/net/thenextlvl/tweaks/command/spawn/SetSpawnCommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import net.kyori.adventure.text.minimessage.tag.resolver.Formatter;
1414
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
1515
import net.thenextlvl.tweaks.TweaksPlugin;
16+
import net.thenextlvl.tweaks.model.LazyLocation;
1617
import org.bukkit.GameRule;
1718
import org.bukkit.World;
1819
import org.bukkit.entity.Player;
@@ -71,7 +72,7 @@ private RequiredArgumentBuilder<CommandSourceStack, World> world() {
7172

7273
private int setSpawn(CommandContext<CommandSourceStack> context, World world, FinePosition position, Rotation rotation) {
7374
var spawn = position.toLocation(world).setRotation(rotation);
74-
plugin.config().spawn.location = spawn;
75+
plugin.config().spawn.location = new LazyLocation(spawn);
7576
plugin.saveConfig();
7677

7778
if (Boolean.TRUE.equals(world.getGameRuleValue(GameRule.SEND_COMMAND_FEEDBACK)))
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package net.thenextlvl.tweaks.model;
2+
3+
import net.kyori.adventure.key.Key;
4+
import net.kyori.adventure.key.Keyed;
5+
import org.bukkit.Bukkit;
6+
import org.bukkit.Location;
7+
import org.bukkit.World;
8+
import org.jspecify.annotations.NullMarked;
9+
import org.jspecify.annotations.Nullable;
10+
11+
@NullMarked
12+
public final class LazyLocation extends Location implements Keyed {
13+
private Key key;
14+
15+
public LazyLocation(Location location) {
16+
super(location.getWorld(), location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
17+
this.key = location.getWorld().key();
18+
}
19+
20+
public LazyLocation(Key key, double x, double y, double z, float yaw, float pitch) {
21+
super(Bukkit.getWorld(key), x, y, z, yaw, pitch);
22+
this.key = key;
23+
}
24+
25+
@Override
26+
public void setWorld(@Nullable World world) {
27+
super.setWorld(world);
28+
if (world != null) this.key = world.key();
29+
}
30+
31+
@Override
32+
public @Nullable World getWorld() {
33+
var world = super.getWorld();
34+
if (world != null) return world;
35+
36+
world = Bukkit.getWorld(key);
37+
if (world != null) setWorld(world);
38+
return world;
39+
}
40+
41+
@Override
42+
public boolean isWorldLoaded() {
43+
return getWorld() != null;
44+
}
45+
46+
@Override
47+
public Key key() {
48+
return key;
49+
}
50+
}

src/main/java/net/thenextlvl/tweaks/model/PluginConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.thenextlvl.tweaks.model;
22

33
import com.google.gson.annotations.SerializedName;
4-
import org.bukkit.Location;
54
import org.bukkit.Material;
65
import org.jspecify.annotations.NullMarked;
76
import org.jspecify.annotations.Nullable;
@@ -62,7 +61,7 @@ public static class SpawnConfig {
6261
public @SerializedName("ignore-respawn-position") boolean ignoreRespawnPosition = false;
6362

6463
@Nullable
65-
public @SerializedName("location") Location location = null;
64+
public @SerializedName("location") LazyLocation location = null;
6665
}
6766

6867
public static class GUIConfig {

0 commit comments

Comments
 (0)