Skip to content

Commit 7e3753f

Browse files
committed
Add relative number provider
1 parent 7427548 commit 7e3753f

3 files changed

Lines changed: 76 additions & 12 deletions

File tree

src/main/java/errorcraft/entitymodifiers/entity/modifier/Deserialisers.java

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

33
import com.google.gson.GsonBuilder;
4+
import errorcraft.entitymodifiers.util.RelativeNumberProvider;
45
import errorcraft.entitymodifiers.world.position.provider.PositionProvider;
56
import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes;
67
import net.minecraft.loot.context.LootContext;
@@ -18,6 +19,7 @@ public static GsonBuilder createEntityModifierSerialiser() {
1819
.registerTypeHierarchyAdapter(LootNumberProvider.class, LootNumberProviderTypes.createGsonSerializer())
1920
.registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer())
2021
.registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer())
21-
.registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter());
22+
.registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter())
23+
.registerTypeHierarchyAdapter(RelativeNumberProvider.class, new RelativeNumberProvider.Serialiser());
2224
}
2325
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package errorcraft.entitymodifiers.util;
2+
3+
import com.google.gson.*;
4+
import net.minecraft.loot.context.LootContext;
5+
import net.minecraft.loot.provider.number.ConstantLootNumberProvider;
6+
import net.minecraft.loot.provider.number.LootNumberProvider;
7+
import net.minecraft.util.JsonHelper;
8+
9+
import java.lang.reflect.Type;
10+
11+
public class RelativeNumberProvider {
12+
private final LootNumberProvider value;
13+
private final boolean relative;
14+
15+
public RelativeNumberProvider(LootNumberProvider value, boolean relative) {
16+
this.value = value;
17+
this.relative = relative;
18+
}
19+
20+
public double getDouble(double currentValue, LootContext context) {
21+
if (this.relative) {
22+
return currentValue + this.value.nextFloat(context);
23+
}
24+
return this.value.nextFloat(context);
25+
}
26+
27+
public float getFloat(float currentValue, LootContext context) {
28+
if (this.relative) {
29+
return currentValue + this.value.nextFloat(context);
30+
}
31+
return this.value.nextFloat(context);
32+
}
33+
34+
public int getInt(int currentValue, LootContext context) {
35+
if (this.relative) {
36+
return currentValue + this.value.nextInt(context);
37+
}
38+
return this.value.nextInt(context);
39+
}
40+
41+
public static class Serialiser implements JsonDeserializer<RelativeNumberProvider>, JsonSerializer<RelativeNumberProvider> {
42+
@Override
43+
public RelativeNumberProvider deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
44+
if (json.isJsonPrimitive()) {
45+
return new RelativeNumberProvider(ConstantLootNumberProvider.create(json.getAsFloat()), false);
46+
}
47+
48+
JsonObject jsonObject = JsonHelper.asObject(json, "value");
49+
LootNumberProvider value = JsonHelper.deserialize(jsonObject, "value", context, LootNumberProvider.class);
50+
boolean relative = JsonHelper.getBoolean(jsonObject, "relative", false);
51+
return new RelativeNumberProvider(value, relative);
52+
}
53+
54+
@Override
55+
public JsonElement serialize(RelativeNumberProvider object, Type type, JsonSerializationContext context) {
56+
JsonObject json = new JsonObject();
57+
json.add("value", context.serialize(object.value));
58+
json.addProperty("relative", object.relative);
59+
return json;
60+
}
61+
}
62+
}

src/main/java/errorcraft/entitymodifiers/world/position/provider/providers/WorldPositionProvider.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33
import com.google.gson.JsonDeserializationContext;
44
import com.google.gson.JsonObject;
55
import com.google.gson.JsonSerializationContext;
6+
import errorcraft.entitymodifiers.util.RelativeNumberProvider;
67
import errorcraft.entitymodifiers.world.position.provider.PositionProvider;
78
import errorcraft.entitymodifiers.world.position.provider.PositionProviderType;
89
import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes;
910
import net.minecraft.loot.context.LootContext;
10-
import net.minecraft.loot.provider.number.LootNumberProvider;
1111
import net.minecraft.util.JsonHelper;
1212
import net.minecraft.util.math.Vec2f;
1313
import net.minecraft.util.math.Vec3d;
1414

1515
public class WorldPositionProvider implements PositionProvider {
16-
private final LootNumberProvider x;
17-
private final LootNumberProvider y;
18-
private final LootNumberProvider z;
16+
private final RelativeNumberProvider x;
17+
private final RelativeNumberProvider y;
18+
private final RelativeNumberProvider z;
1919

20-
public WorldPositionProvider(LootNumberProvider x, LootNumberProvider y, LootNumberProvider z) {
20+
public WorldPositionProvider(RelativeNumberProvider x, RelativeNumberProvider y, RelativeNumberProvider z) {
2121
this.x = x;
2222
this.y = y;
2323
this.z = z;
@@ -29,9 +29,9 @@ public PositionProviderType getType() {
2929

3030
@Override
3131
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);
32+
double newX = this.x.getDouble(currentPosition.getX(), lootContext);
33+
double newY = this.y.getDouble(currentPosition.getY(), lootContext);
34+
double newZ = this.z.getDouble(currentPosition.getZ(), lootContext);
3535
return new Vec3d(newX, newY, newZ);
3636
}
3737

@@ -45,9 +45,9 @@ public void toJson(JsonObject json, WorldPositionProvider object, JsonSerializat
4545

4646
@Override
4747
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);
48+
RelativeNumberProvider x = JsonHelper.deserialize(json, "x", context, RelativeNumberProvider.class);
49+
RelativeNumberProvider y = JsonHelper.deserialize(json, "y", context, RelativeNumberProvider.class);
50+
RelativeNumberProvider z = JsonHelper.deserialize(json, "z", context, RelativeNumberProvider.class);
5151
return new WorldPositionProvider(x, y, z);
5252
}
5353
}

0 commit comments

Comments
 (0)