Skip to content

Commit 7427548

Browse files
committed
Add position providers
1 parent 51b1c8e commit 7427548

6 files changed

Lines changed: 120 additions & 25 deletions

File tree

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package errorcraft.entitymodifiers.entity.modifier;
22

33
import com.google.gson.GsonBuilder;
4+
import errorcraft.entitymodifiers.world.position.provider.PositionProvider;
5+
import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes;
46
import net.minecraft.loot.context.LootContext;
57
import net.minecraft.loot.provider.number.LootNumberProvider;
68
import net.minecraft.loot.provider.number.LootNumberProviderTypes;
@@ -12,9 +14,10 @@ private Deserialisers() {}
1214

1315
public static GsonBuilder createEntityModifierSerialiser() {
1416
return new GsonBuilder()
15-
.registerTypeHierarchyAdapter(EntityModifier.class, EntityModifierTypes.createGsonAdapter())
16-
.registerTypeHierarchyAdapter(LootNumberProvider.class, LootNumberProviderTypes.createGsonSerializer())
17-
.registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer())
18-
.registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer());
17+
.registerTypeHierarchyAdapter(EntityModifier.class, EntityModifierTypes.createGsonAdapter())
18+
.registerTypeHierarchyAdapter(LootNumberProvider.class, LootNumberProviderTypes.createGsonSerializer())
19+
.registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer())
20+
.registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer())
21+
.registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter());
1922
}
2023
}

src/main/java/errorcraft/entitymodifiers/entity/modifier/modifiers/SetPositionEntityModifier.java

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,19 @@
66
import errorcraft.entitymodifiers.entity.modifier.EntityModifier;
77
import errorcraft.entitymodifiers.entity.modifier.EntityModifierType;
88
import errorcraft.entitymodifiers.entity.modifier.EntityModifierTypes;
9+
import errorcraft.entitymodifiers.world.position.provider.PositionProvider;
910
import net.minecraft.entity.Entity;
1011
import net.minecraft.loot.context.LootContext;
1112
import net.minecraft.loot.provider.number.LootNumberProvider;
1213
import net.minecraft.server.network.ServerPlayerEntity;
1314
import net.minecraft.util.JsonHelper;
15+
import net.minecraft.util.math.Vec3d;
1416

1517
public class SetPositionEntityModifier implements EntityModifier {
16-
private final LootNumberProvider x;
17-
private final LootNumberProvider y;
18-
private final LootNumberProvider z;
18+
private final PositionProvider position;
1919

20-
public SetPositionEntityModifier(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) {
21-
this.x = x;
22-
this.y = y;
23-
this.z = z;
20+
public SetPositionEntityModifier(PositionProvider position) {
21+
this.position = position;
2422
}
2523

2624
@Override
@@ -30,37 +28,31 @@ public EntityModifierType getType() {
3028

3129
@Override
3230
public Entity apply(Entity entity, LootContext lootContext) {
33-
double newX = this.x.nextFloat(lootContext);
34-
double newY = this.y.nextFloat(lootContext);
35-
double newZ = this.z.nextFloat(lootContext);
36-
entity.setPosition(newX, newY, newZ);
31+
Vec3d newPos = this.position.getPosition(entity.getPos(), entity.getRotationClient(), lootContext);
32+
entity.setPosition(newPos);
3733
if (entity instanceof ServerPlayerEntity player) {
38-
setPlayerPosition(player, newX, newY, newZ);
34+
setPlayerPosition(player, newPos);
3935
}
4036
return entity;
4137
}
4238

43-
private static void setPlayerPosition(ServerPlayerEntity player, double x, double y, double z) {
39+
private static void setPlayerPosition(ServerPlayerEntity player, Vec3d pos) {
4440
if (player.isSleeping()) {
4541
player.wakeUp(true, true);
4642
}
47-
player.requestTeleportAndDismount(x, y, z);
43+
player.requestTeleportAndDismount(pos.getX(), pos.getY(), pos.getZ());
4844
}
4945

5046
public static class Serialiser implements EntityModifier.Serialiser<SetPositionEntityModifier> {
5147
@Override
5248
public void toJson(JsonObject json, SetPositionEntityModifier object, JsonSerializationContext context) {
53-
json.add("x", context.serialize(object.x));
54-
json.add("y", context.serialize(object.y));
55-
json.add("z", context.serialize(object.z));
49+
json.add("position", context.serialize(object.position));
5650
}
5751

5852
@Override
5953
public SetPositionEntityModifier fromJson(JsonObject json, JsonDeserializationContext context) {
60-
LootNumberProvider x = JsonHelper.deserialize(json, "x", context, LootNumberProvider.class);
61-
LootNumberProvider y = JsonHelper.deserialize(json, "y", context, LootNumberProvider.class);
62-
LootNumberProvider z = JsonHelper.deserialize(json, "z", context, LootNumberProvider.class);
63-
return new SetPositionEntityModifier(x, y, z);
54+
PositionProvider position = JsonHelper.deserialize(json, "position", context, PositionProvider.class);
55+
return new SetPositionEntityModifier(position);
6456
}
6557
}
6658
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package errorcraft.entitymodifiers.world.position.provider;
2+
3+
import net.minecraft.loot.context.LootContext;
4+
import net.minecraft.util.JsonSerializer;
5+
import net.minecraft.util.math.Vec2f;
6+
import net.minecraft.util.math.Vec3d;
7+
8+
public interface PositionProvider {
9+
PositionProviderType getType();
10+
Vec3d getPosition(Vec3d currentPosition, Vec2f rotation, LootContext lootContext);
11+
12+
interface Serialiser<T extends PositionProvider> extends JsonSerializer<T> {}
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package errorcraft.entitymodifiers.world.position.provider;
2+
3+
import net.minecraft.util.JsonSerializableType;
4+
import net.minecraft.util.JsonSerializer;
5+
6+
public class PositionProviderType extends JsonSerializableType<PositionProvider> {
7+
public PositionProviderType(JsonSerializer<? extends PositionProvider> jsonSerializer) {
8+
super(jsonSerializer);
9+
}
10+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package errorcraft.entitymodifiers.world.position.provider;
2+
3+
import errorcraft.entitymodifiers.mixin.registry.RegistryAccessor;
4+
import errorcraft.entitymodifiers.world.position.provider.providers.WorldPositionProvider;
5+
import net.minecraft.util.Identifier;
6+
import net.minecraft.util.JsonSerializing;
7+
import net.minecraft.util.registry.Registry;
8+
import net.minecraft.util.registry.RegistryKey;
9+
10+
public class PositionProviderTypes {
11+
public static final RegistryKey<Registry<PositionProviderType>> POSITION_PROVIDER_TYPE_KEY = RegistryAccessor.createRegistryKey("position_provider_type");
12+
public static final Registry<PositionProviderType> POSITION_PROVIDER_TYPE = RegistryAccessor.create(POSITION_PROVIDER_TYPE_KEY, registry -> PositionProviderTypes.WORLD);
13+
14+
public static final PositionProviderType WORLD = register("world", new WorldPositionProvider.Serialiser());
15+
16+
public static Object createGsonAdapter() {
17+
return JsonSerializing.createSerializerBuilder(POSITION_PROVIDER_TYPE, "type", "type", PositionProvider::getType).build();
18+
}
19+
20+
private static PositionProviderType register(String id, PositionProvider.Serialiser<? extends PositionProvider> serialiser) {
21+
return Registry.register(POSITION_PROVIDER_TYPE, new Identifier(id), new PositionProviderType(serialiser));
22+
}
23+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package errorcraft.entitymodifiers.world.position.provider.providers;
2+
3+
import com.google.gson.JsonDeserializationContext;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.JsonSerializationContext;
6+
import errorcraft.entitymodifiers.world.position.provider.PositionProvider;
7+
import errorcraft.entitymodifiers.world.position.provider.PositionProviderType;
8+
import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes;
9+
import net.minecraft.loot.context.LootContext;
10+
import net.minecraft.loot.provider.number.LootNumberProvider;
11+
import net.minecraft.util.JsonHelper;
12+
import net.minecraft.util.math.Vec2f;
13+
import net.minecraft.util.math.Vec3d;
14+
15+
public class WorldPositionProvider implements PositionProvider {
16+
private final LootNumberProvider x;
17+
private final LootNumberProvider y;
18+
private final LootNumberProvider z;
19+
20+
public WorldPositionProvider(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) {
21+
this.x = x;
22+
this.y = y;
23+
this.z = z;
24+
}
25+
26+
public PositionProviderType getType() {
27+
return PositionProviderTypes.WORLD;
28+
}
29+
30+
@Override
31+
public Vec3d getPosition(Vec3d currentPosition, Vec2f rotation, LootContext lootContext) {
32+
double newX = this.x.nextFloat(lootContext);
33+
double newY = this.y.nextFloat(lootContext);
34+
double newZ = this.z.nextFloat(lootContext);
35+
return new Vec3d(newX, newY, newZ);
36+
}
37+
38+
public static class Serialiser implements PositionProvider.Serialiser<WorldPositionProvider> {
39+
@Override
40+
public void toJson(JsonObject json, WorldPositionProvider object, JsonSerializationContext context) {
41+
json.add("x", context.serialize(object.x));
42+
json.add("y", context.serialize(object.y));
43+
json.add("z", context.serialize(object.z));
44+
}
45+
46+
@Override
47+
public WorldPositionProvider fromJson(JsonObject json, JsonDeserializationContext context) {
48+
LootNumberProvider x = JsonHelper.deserialize(json, "x", context, LootNumberProvider.class);
49+
LootNumberProvider y = JsonHelper.deserialize(json, "y", context, LootNumberProvider.class);
50+
LootNumberProvider z = JsonHelper.deserialize(json, "z", context, LootNumberProvider.class);
51+
return new WorldPositionProvider(x, y, z);
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)