From 69a981b46405e28db9af1a42c5bd687f33348b97 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Sun, 15 May 2022 00:18:14 +0200 Subject: [PATCH 1/5] Update loader version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0ecca93..f4dc97a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.jvmargs=-Xmx1G # check these on https://fabricmc.net/versions.html minecraft_version=1.18.2 yarn_mappings=1.18.2+build.3 - loader_version=0.13.3 + loader_version=0.14.5 # Mod Properties mod_version = 1.1.0 From 51b1c8e22732dd7418fbebc18256fe787dd70a1b Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Fri, 20 May 2022 16:24:22 +0200 Subject: [PATCH 2/5] Add SetPositionEntityModifier --- .../entity/modifier/EntityModifierTypes.java | 1 + .../modifiers/SetPositionEntityModifier.java | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java diff --git a/src/main/java/errorcraft/entitymodifiers/entity/modifier/EntityModifierTypes.java b/src/main/java/errorcraft/entitymodifiers/entity/modifier/EntityModifierTypes.java index f2a276c..1808584 100644 --- a/src/main/java/errorcraft/entitymodifiers/entity/modifier/EntityModifierTypes.java +++ b/src/main/java/errorcraft/entitymodifiers/entity/modifier/EntityModifierTypes.java @@ -19,6 +19,7 @@ public class EntityModifierTypes { public static final EntityModifierType SET_CUSTOM_NAME = register("set_custom_name", new SetCustomNameEntityModifier.Serialiser()); public static final EntityModifierType SET_ABSORPTION = register("set_absorption", new SetAbsorptionEntityModifier.Serialiser()); public static final EntityModifierType SET_SATURATION = register("set_saturation", new SetSaturationEntityModifier.Serialiser()); + public static final EntityModifierType SET_POSITION = register("set_position", new SetPositionEntityModifier.Serialiser()); public static Object createGsonAdapter() { return JsonSerializing.createSerializerBuilder(ENTITY_MODIFIER_TYPE, "function", "function", EntityModifier::getType).build(); diff --git a/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java b/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java new file mode 100644 index 0000000..5192ff8 --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java @@ -0,0 +1,66 @@ +package errorcraft.entitymodifiers.entity.modifier.modifiers; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import errorcraft.entitymodifiers.entity.modifier.EntityModifier; +import errorcraft.entitymodifiers.entity.modifier.EntityModifierType; +import errorcraft.entitymodifiers.entity.modifier.EntityModifierTypes; +import net.minecraft.entity.Entity; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.provider.number.LootNumberProvider; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.JsonHelper; + +public class SetPositionEntityModifier implements EntityModifier { + private final LootNumberProvider x; + private final LootNumberProvider y; + private final LootNumberProvider z; + + public SetPositionEntityModifier(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public EntityModifierType getType() { + return EntityModifierTypes.SET_POSITION; + } + + @Override + public Entity apply(Entity entity, LootContext lootContext) { + double newX = this.x.nextFloat(lootContext); + double newY = this.y.nextFloat(lootContext); + double newZ = this.z.nextFloat(lootContext); + entity.setPosition(newX, newY, newZ); + if (entity instanceof ServerPlayerEntity player) { + setPlayerPosition(player, newX, newY, newZ); + } + return entity; + } + + private static void setPlayerPosition(ServerPlayerEntity player, double x, double y, double z) { + if (player.isSleeping()) { + player.wakeUp(true, true); + } + player.requestTeleportAndDismount(x, y, z); + } + + public static class Serialiser implements EntityModifier.Serialiser { + @Override + public void toJson(JsonObject json, SetPositionEntityModifier object, JsonSerializationContext context) { + json.add("x", context.serialize(object.x)); + json.add("y", context.serialize(object.y)); + json.add("z", context.serialize(object.z)); + } + + @Override + public SetPositionEntityModifier fromJson(JsonObject json, JsonDeserializationContext context) { + LootNumberProvider x = JsonHelper.deserialize(json, "x", context, LootNumberProvider.class); + LootNumberProvider y = JsonHelper.deserialize(json, "y", context, LootNumberProvider.class); + LootNumberProvider z = JsonHelper.deserialize(json, "z", context, LootNumberProvider.class); + return new SetPositionEntityModifier(x, y, z); + } + } +} From 74275487cca02756708e701b582b4358c9ffd1a7 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Fri, 20 May 2022 17:53:55 +0200 Subject: [PATCH 3/5] Add position providers --- .../entity/modifier/Deserialisers.java | 11 ++-- .../modifiers/SetPositionEntityModifier.java | 34 +++++------- .../position/provider/PositionProvider.java | 13 +++++ .../provider/PositionProviderType.java | 10 ++++ .../provider/PositionProviderTypes.java | 23 ++++++++ .../providers/WorldPositionProvider.java | 54 +++++++++++++++++++ 6 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProvider.java create mode 100644 src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderType.java create mode 100644 src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java create mode 100644 src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java diff --git a/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java b/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java index f5af8c3..1c349a9 100644 --- a/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java +++ b/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java @@ -1,6 +1,8 @@ package errorcraft.entitymodifiers.entity.modifier; import com.google.gson.GsonBuilder; +import errorcraft.entitymodifiers.world.position.provider.PositionProvider; +import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.provider.number.LootNumberProvider; import net.minecraft.loot.provider.number.LootNumberProviderTypes; @@ -12,9 +14,10 @@ private Deserialisers() {} public static GsonBuilder createEntityModifierSerialiser() { return new GsonBuilder() - .registerTypeHierarchyAdapter(EntityModifier.class, EntityModifierTypes.createGsonAdapter()) - .registerTypeHierarchyAdapter(LootNumberProvider.class, LootNumberProviderTypes.createGsonSerializer()) - .registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer()) - .registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer()); + .registerTypeHierarchyAdapter(EntityModifier.class, EntityModifierTypes.createGsonAdapter()) + .registerTypeHierarchyAdapter(LootNumberProvider.class, LootNumberProviderTypes.createGsonSerializer()) + .registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer()) + .registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer()) + .registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter()); } } diff --git a/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java b/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java index 5192ff8..20d0a64 100644 --- a/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java +++ b/src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java @@ -6,21 +6,19 @@ import errorcraft.entitymodifiers.entity.modifier.EntityModifier; import errorcraft.entitymodifiers.entity.modifier.EntityModifierType; import errorcraft.entitymodifiers.entity.modifier.EntityModifierTypes; +import errorcraft.entitymodifiers.world.position.provider.PositionProvider; import net.minecraft.entity.Entity; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.provider.number.LootNumberProvider; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.JsonHelper; +import net.minecraft.util.math.Vec3d; public class SetPositionEntityModifier implements EntityModifier { - private final LootNumberProvider x; - private final LootNumberProvider y; - private final LootNumberProvider z; + private final PositionProvider position; - public SetPositionEntityModifier(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) { - this.x = x; - this.y = y; - this.z = z; + public SetPositionEntityModifier(PositionProvider position) { + this.position = position; } @Override @@ -30,37 +28,31 @@ public EntityModifierType getType() { @Override public Entity apply(Entity entity, LootContext lootContext) { - double newX = this.x.nextFloat(lootContext); - double newY = this.y.nextFloat(lootContext); - double newZ = this.z.nextFloat(lootContext); - entity.setPosition(newX, newY, newZ); + Vec3d newPos = this.position.getPosition(entity.getPos(), entity.getRotationClient(), lootContext); + entity.setPosition(newPos); if (entity instanceof ServerPlayerEntity player) { - setPlayerPosition(player, newX, newY, newZ); + setPlayerPosition(player, newPos); } return entity; } - private static void setPlayerPosition(ServerPlayerEntity player, double x, double y, double z) { + private static void setPlayerPosition(ServerPlayerEntity player, Vec3d pos) { if (player.isSleeping()) { player.wakeUp(true, true); } - player.requestTeleportAndDismount(x, y, z); + player.requestTeleportAndDismount(pos.getX(), pos.getY(), pos.getZ()); } public static class Serialiser implements EntityModifier.Serialiser { @Override public void toJson(JsonObject json, SetPositionEntityModifier object, JsonSerializationContext context) { - json.add("x", context.serialize(object.x)); - json.add("y", context.serialize(object.y)); - json.add("z", context.serialize(object.z)); + json.add("position", context.serialize(object.position)); } @Override public SetPositionEntityModifier fromJson(JsonObject json, JsonDeserializationContext context) { - LootNumberProvider x = JsonHelper.deserialize(json, "x", context, LootNumberProvider.class); - LootNumberProvider y = JsonHelper.deserialize(json, "y", context, LootNumberProvider.class); - LootNumberProvider z = JsonHelper.deserialize(json, "z", context, LootNumberProvider.class); - return new SetPositionEntityModifier(x, y, z); + PositionProvider position = JsonHelper.deserialize(json, "position", context, PositionProvider.class); + return new SetPositionEntityModifier(position); } } } diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProvider.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProvider.java new file mode 100644 index 0000000..7387355 --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProvider.java @@ -0,0 +1,13 @@ +package errorcraft.entitymodifiers.world.position.provider; + +import net.minecraft.loot.context.LootContext; +import net.minecraft.util.JsonSerializer; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +public interface PositionProvider { + PositionProviderType getType(); + Vec3d getPosition(Vec3d currentPosition, Vec2f rotation, LootContext lootContext); + + interface Serialiser extends JsonSerializer {} +} diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderType.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderType.java new file mode 100644 index 0000000..2c40dac --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderType.java @@ -0,0 +1,10 @@ +package errorcraft.entitymodifiers.world.position.provider; + +import net.minecraft.util.JsonSerializableType; +import net.minecraft.util.JsonSerializer; + +public class PositionProviderType extends JsonSerializableType { + public PositionProviderType(JsonSerializer jsonSerializer) { + super(jsonSerializer); + } +} diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java new file mode 100644 index 0000000..a0ea659 --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java @@ -0,0 +1,23 @@ +package errorcraft.entitymodifiers.world.position.provider; + +import errorcraft.entitymodifiers.mixin.registry.RegistryAccessor; +import errorcraft.entitymodifiers.world.position.provider.providers.WorldPositionProvider; +import net.minecraft.util.Identifier; +import net.minecraft.util.JsonSerializing; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryKey; + +public class PositionProviderTypes { + public static final RegistryKey> POSITION_PROVIDER_TYPE_KEY = RegistryAccessor.createRegistryKey("position_provider_type"); + public static final Registry POSITION_PROVIDER_TYPE = RegistryAccessor.create(POSITION_PROVIDER_TYPE_KEY, registry -> PositionProviderTypes.WORLD); + + public static final PositionProviderType WORLD = register("world", new WorldPositionProvider.Serialiser()); + + public static Object createGsonAdapter() { + return JsonSerializing.createSerializerBuilder(POSITION_PROVIDER_TYPE, "type", "type", PositionProvider::getType).build(); + } + + private static PositionProviderType register(String id, PositionProvider.Serialiser serialiser) { + return Registry.register(POSITION_PROVIDER_TYPE, new Identifier(id), new PositionProviderType(serialiser)); + } +} diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java new file mode 100644 index 0000000..3e1eebe --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java @@ -0,0 +1,54 @@ +package errorcraft.entitymodifiers.world.position.provider.providers; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import errorcraft.entitymodifiers.world.position.provider.PositionProvider; +import errorcraft.entitymodifiers.world.position.provider.PositionProviderType; +import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.provider.number.LootNumberProvider; +import net.minecraft.util.JsonHelper; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +public class WorldPositionProvider implements PositionProvider { + private final LootNumberProvider x; + private final LootNumberProvider y; + private final LootNumberProvider z; + + public WorldPositionProvider(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) { + this.x = x; + this.y = y; + this.z = z; + } + + public PositionProviderType getType() { + return PositionProviderTypes.WORLD; + } + + @Override + public Vec3d getPosition(Vec3d currentPosition, Vec2f rotation, LootContext lootContext) { + double newX = this.x.nextFloat(lootContext); + double newY = this.y.nextFloat(lootContext); + double newZ = this.z.nextFloat(lootContext); + return new Vec3d(newX, newY, newZ); + } + + public static class Serialiser implements PositionProvider.Serialiser { + @Override + public void toJson(JsonObject json, WorldPositionProvider object, JsonSerializationContext context) { + json.add("x", context.serialize(object.x)); + json.add("y", context.serialize(object.y)); + json.add("z", context.serialize(object.z)); + } + + @Override + public WorldPositionProvider fromJson(JsonObject json, JsonDeserializationContext context) { + LootNumberProvider x = JsonHelper.deserialize(json, "x", context, LootNumberProvider.class); + LootNumberProvider y = JsonHelper.deserialize(json, "y", context, LootNumberProvider.class); + LootNumberProvider z = JsonHelper.deserialize(json, "z", context, LootNumberProvider.class); + return new WorldPositionProvider(x, y, z); + } + } +} From 7e3753fbca443b45c14045d9cff9680b894cc8df Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Sun, 22 May 2022 16:17:06 +0200 Subject: [PATCH 4/5] Add relative number provider --- .../entity/modifier/Deserialisers.java | 4 +- .../util/RelativeNumberProvider.java | 62 +++++++++++++++++++ .../providers/WorldPositionProvider.java | 22 +++---- 3 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/main/java/errorcraft/entitymodifiers/util/RelativeNumberProvider.java diff --git a/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java b/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java index 1c349a9..fd6a697 100644 --- a/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java +++ b/src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java @@ -1,6 +1,7 @@ package errorcraft.entitymodifiers.entity.modifier; import com.google.gson.GsonBuilder; +import errorcraft.entitymodifiers.util.RelativeNumberProvider; import errorcraft.entitymodifiers.world.position.provider.PositionProvider; import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes; import net.minecraft.loot.context.LootContext; @@ -18,6 +19,7 @@ public static GsonBuilder createEntityModifierSerialiser() { .registerTypeHierarchyAdapter(LootNumberProvider.class, LootNumberProviderTypes.createGsonSerializer()) .registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer()) .registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer()) - .registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter()); + .registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter()) + .registerTypeHierarchyAdapter(RelativeNumberProvider.class, new RelativeNumberProvider.Serialiser()); } } diff --git a/src/main/java/errorcraft/entitymodifiers/util/RelativeNumberProvider.java b/src/main/java/errorcraft/entitymodifiers/util/RelativeNumberProvider.java new file mode 100644 index 0000000..c01513c --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/util/RelativeNumberProvider.java @@ -0,0 +1,62 @@ +package errorcraft.entitymodifiers.util; + +import com.google.gson.*; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.provider.number.ConstantLootNumberProvider; +import net.minecraft.loot.provider.number.LootNumberProvider; +import net.minecraft.util.JsonHelper; + +import java.lang.reflect.Type; + +public class RelativeNumberProvider { + private final LootNumberProvider value; + private final boolean relative; + + public RelativeNumberProvider(LootNumberProvider value, boolean relative) { + this.value = value; + this.relative = relative; + } + + public double getDouble(double currentValue, LootContext context) { + if (this.relative) { + return currentValue + this.value.nextFloat(context); + } + return this.value.nextFloat(context); + } + + public float getFloat(float currentValue, LootContext context) { + if (this.relative) { + return currentValue + this.value.nextFloat(context); + } + return this.value.nextFloat(context); + } + + public int getInt(int currentValue, LootContext context) { + if (this.relative) { + return currentValue + this.value.nextInt(context); + } + return this.value.nextInt(context); + } + + public static class Serialiser implements JsonDeserializer, JsonSerializer { + @Override + public RelativeNumberProvider deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { + if (json.isJsonPrimitive()) { + return new RelativeNumberProvider(ConstantLootNumberProvider.create(json.getAsFloat()), false); + } + + JsonObject jsonObject = JsonHelper.asObject(json, "value"); + LootNumberProvider value = JsonHelper.deserialize(jsonObject, "value", context, LootNumberProvider.class); + boolean relative = JsonHelper.getBoolean(jsonObject, "relative", false); + return new RelativeNumberProvider(value, relative); + } + + @Override + public JsonElement serialize(RelativeNumberProvider object, Type type, JsonSerializationContext context) { + JsonObject json = new JsonObject(); + json.add("value", context.serialize(object.value)); + json.addProperty("relative", object.relative); + return json; + } + } +} diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java index 3e1eebe..55386ff 100644 --- a/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java @@ -3,21 +3,21 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; +import errorcraft.entitymodifiers.util.RelativeNumberProvider; import errorcraft.entitymodifiers.world.position.provider.PositionProvider; import errorcraft.entitymodifiers.world.position.provider.PositionProviderType; import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes; import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.provider.number.LootNumberProvider; import net.minecraft.util.JsonHelper; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; public class WorldPositionProvider implements PositionProvider { - private final LootNumberProvider x; - private final LootNumberProvider y; - private final LootNumberProvider z; + private final RelativeNumberProvider x; + private final RelativeNumberProvider y; + private final RelativeNumberProvider z; - public WorldPositionProvider(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) { + public WorldPositionProvider(RelativeNumberProvider x, RelativeNumberProvider y, RelativeNumberProvider z) { this.x = x; this.y = y; this.z = z; @@ -29,9 +29,9 @@ public PositionProviderType getType() { @Override public Vec3d getPosition(Vec3d currentPosition, Vec2f rotation, LootContext lootContext) { - double newX = this.x.nextFloat(lootContext); - double newY = this.y.nextFloat(lootContext); - double newZ = this.z.nextFloat(lootContext); + double newX = this.x.getDouble(currentPosition.getX(), lootContext); + double newY = this.y.getDouble(currentPosition.getY(), lootContext); + double newZ = this.z.getDouble(currentPosition.getZ(), lootContext); return new Vec3d(newX, newY, newZ); } @@ -45,9 +45,9 @@ public void toJson(JsonObject json, WorldPositionProvider object, JsonSerializat @Override public WorldPositionProvider fromJson(JsonObject json, JsonDeserializationContext context) { - LootNumberProvider x = JsonHelper.deserialize(json, "x", context, LootNumberProvider.class); - LootNumberProvider y = JsonHelper.deserialize(json, "y", context, LootNumberProvider.class); - LootNumberProvider z = JsonHelper.deserialize(json, "z", context, LootNumberProvider.class); + RelativeNumberProvider x = JsonHelper.deserialize(json, "x", context, RelativeNumberProvider.class); + RelativeNumberProvider y = JsonHelper.deserialize(json, "y", context, RelativeNumberProvider.class); + RelativeNumberProvider z = JsonHelper.deserialize(json, "z", context, RelativeNumberProvider.class); return new WorldPositionProvider(x, y, z); } } From 8dd6e271cec1ebc35dc8a945f57331ad80ed9b7e Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Thu, 2 Jun 2022 16:25:05 +0200 Subject: [PATCH 5/5] Add local position provider --- .../provider/PositionProviderTypes.java | 2 + .../providers/LocalPositionProvider.java | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/LocalPositionProvider.java diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java index a0ea659..7f14f16 100644 --- a/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/PositionProviderTypes.java @@ -1,6 +1,7 @@ package errorcraft.entitymodifiers.world.position.provider; import errorcraft.entitymodifiers.mixin.registry.RegistryAccessor; +import errorcraft.entitymodifiers.world.position.provider.providers.LocalPositionProvider; import errorcraft.entitymodifiers.world.position.provider.providers.WorldPositionProvider; import net.minecraft.util.Identifier; import net.minecraft.util.JsonSerializing; @@ -12,6 +13,7 @@ public class PositionProviderTypes { public static final Registry POSITION_PROVIDER_TYPE = RegistryAccessor.create(POSITION_PROVIDER_TYPE_KEY, registry -> PositionProviderTypes.WORLD); public static final PositionProviderType WORLD = register("world", new WorldPositionProvider.Serialiser()); + public static final PositionProviderType LOCAL = register("local", new LocalPositionProvider.Serialiser()); public static Object createGsonAdapter() { return JsonSerializing.createSerializerBuilder(POSITION_PROVIDER_TYPE, "type", "type", PositionProvider::getType).build(); diff --git a/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/LocalPositionProvider.java b/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/LocalPositionProvider.java new file mode 100644 index 0000000..ba72245 --- /dev/null +++ b/src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/LocalPositionProvider.java @@ -0,0 +1,59 @@ +package errorcraft.entitymodifiers.world.position.provider.providers; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import errorcraft.entitymodifiers.world.position.provider.PositionProvider; +import errorcraft.entitymodifiers.world.position.provider.PositionProviderType; +import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes; +import net.minecraft.command.argument.LookingPosArgument; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.provider.number.LootNumberProvider; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.JsonHelper; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +public class LocalPositionProvider implements PositionProvider { + private final LootNumberProvider left; + private final LootNumberProvider up; + private final LootNumberProvider forwards; + + public LocalPositionProvider(LootNumberProvider left, LootNumberProvider up, LootNumberProvider forwards) { + this.left = left; + this.up = up; + this.forwards = forwards; + } + + @Override + public PositionProviderType getType() { + return PositionProviderTypes.LOCAL; + } + + @Override + public Vec3d getPosition(Vec3d currentPosition, Vec2f rotation, LootContext lootContext) { + double leftOffset = this.left.nextFloat(lootContext); + double upOffset = this.up.nextFloat(lootContext); + double forwardsOffset = this.forwards.nextFloat(lootContext); + LookingPosArgument argument = new LookingPosArgument(leftOffset, upOffset, forwardsOffset); + ServerCommandSource commandSource = new ServerCommandSource(null, currentPosition, rotation, null, 0, null, null, null, null); + return argument.toAbsolutePos(commandSource); + } + + public static class Serialiser implements PositionProvider.Serialiser { + @Override + public void toJson(JsonObject json, LocalPositionProvider object, JsonSerializationContext context) { + json.add("left", context.serialize(object.left)); + json.add("up", context.serialize(object.up)); + json.add("forwards", context.serialize(object.forwards)); + } + + @Override + public LocalPositionProvider fromJson(JsonObject json, JsonDeserializationContext context) { + LootNumberProvider left = JsonHelper.deserialize(json, "left", context, LootNumberProvider.class); + LootNumberProvider up = JsonHelper.deserialize(json, "up", context, LootNumberProvider.class); + LootNumberProvider forwards = JsonHelper.deserialize(json, "forwards", context, LootNumberProvider.class); + return new LocalPositionProvider(left, up, forwards); + } + } +}