package moe.ymc.acron.c2s; import com.google.gson.*; import com.google.gson.annotations.SerializedName; import org.jetbrains.annotations.Nullable; import java.lang.reflect.Type; public record ReqSetConfig(@SerializedName("id") int id, @SerializedName("world") @Nullable WorldKey world, @SerializedName("pos") @Nullable Vec3d pos, @SerializedName("rot") @Nullable Vec2f rot, @SerializedName("name") @Nullable String name) implements Request { @Override public void validate() { } @Override public int getId() { return id; } public static class ReqSetConfigDeserializer implements JsonDeserializer { @Override public ReqSetConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { final JsonObject object = json.getAsJsonObject(); final int id = object.has("id") ? object.get("id").getAsInt() : -1; final WorldKey world = object.has("world") ? WorldKey.valueOf(object.get("world").getAsString().toUpperCase()) : null; final Vec3d pos = object.has("pos") ? context.deserialize(object.get("pos"), Vec3d.class) : null; final Vec2f rot = object.has("rot") ? context.deserialize(object.get("rot"), Vec2f.class) : null; final String name = object.has("name") ? object.get("name").getAsString() : null; return new ReqSetConfig(id, world, pos, rot, name); } } public enum WorldKey { OVERWORLD, NETHER, END } public record Vec3d(@SerializedName("x") double x, @SerializedName("y") double y, @SerializedName("z") double z) { public static class Vec3dDeserializer implements JsonDeserializer { @Override public Vec3d deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { final JsonObject object = json.getAsJsonObject(); final double x = object.has("x") ? object.get("x").getAsDouble() : 0.0; final double y = object.has("y") ? object.get("y").getAsDouble() : 0.0; final double z = object.has("z") ? object.get("z").getAsDouble() : 0.0; return new Vec3d(x, y, z); } } } public record Vec2f(@SerializedName("x") float x, @SerializedName("y") float y) { public static class Vec2fDeserializer implements JsonDeserializer { @Override public Vec2f deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { final JsonObject object = json.getAsJsonObject(); final float x = object.has("x") ? object.get("x").getAsFloat() : 0.0f; final float y = object.has("y") ? object.get("y").getAsFloat() : 0.0f; return new Vec2f(x, y); } } } }