Skip to content

Commit 5e600af

Browse files
authored
Merge pull request #6 from ErrorCraft/set_rotation
Add minecraft:set_rotation entity modifier
2 parents cb83e6e + 7766e79 commit 5e600af

4 files changed

Lines changed: 101 additions & 0 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import errorcraft.entitymodifiers.util.RelativeNumberProvider;
55
import errorcraft.entitymodifiers.world.position.provider.PositionProvider;
66
import errorcraft.entitymodifiers.world.position.provider.PositionProviderTypes;
7+
import errorcraft.entitymodifiers.world.rotation.RotationProvider;
78
import net.minecraft.loot.context.LootContext;
89
import net.minecraft.loot.provider.number.LootNumberProvider;
910
import net.minecraft.loot.provider.number.LootNumberProviderTypes;
@@ -20,6 +21,7 @@ public static GsonBuilder createEntityModifierSerialiser() {
2021
.registerTypeHierarchyAdapter(LootScoreProvider.class, LootScoreProviderTypes.createGsonSerializer())
2122
.registerTypeHierarchyAdapter(LootContext.EntityTarget.class, new LootContext.EntityTarget.Serializer())
2223
.registerTypeHierarchyAdapter(PositionProvider.class, PositionProviderTypes.createGsonAdapter())
24+
.registerTypeHierarchyAdapter(RotationProvider.class, new RotationProvider.Serialiser())
2325
.registerTypeHierarchyAdapter(RelativeNumberProvider.class, new RelativeNumberProvider.Serialiser());
2426
}
2527
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class EntityModifierTypes {
2020
public static final EntityModifierType SET_ABSORPTION = register("set_absorption", new SetAbsorptionEntityModifier.Serialiser());
2121
public static final EntityModifierType SET_SATURATION = register("set_saturation", new SetSaturationEntityModifier.Serialiser());
2222
public static final EntityModifierType SET_POSITION = register("set_position", new SetPositionEntityModifier.Serialiser());
23+
public static final EntityModifierType SET_ROTATION = register("set_rotation", new SetRotationEntityModifier.Serialiser());
2324

2425
public static Object createGsonAdapter() {
2526
return JsonSerializing.createSerializerBuilder(ENTITY_MODIFIER_TYPE, "function", "function", EntityModifier::getType).build();
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package errorcraft.entitymodifiers.entity.modifier.modifiers;
2+
3+
import com.google.gson.JsonDeserializationContext;
4+
import com.google.gson.JsonObject;
5+
import com.google.gson.JsonSerializationContext;
6+
import errorcraft.entitymodifiers.entity.modifier.EntityModifier;
7+
import errorcraft.entitymodifiers.entity.modifier.EntityModifierType;
8+
import errorcraft.entitymodifiers.entity.modifier.EntityModifierTypes;
9+
import errorcraft.entitymodifiers.world.rotation.RotationProvider;
10+
import net.minecraft.entity.Entity;
11+
import net.minecraft.loot.context.LootContext;
12+
import net.minecraft.server.network.ServerPlayerEntity;
13+
import net.minecraft.util.JsonHelper;
14+
import net.minecraft.util.math.Vec2f;
15+
16+
public class SetRotationEntityModifier implements EntityModifier {
17+
private final RotationProvider rotation;
18+
19+
public SetRotationEntityModifier(RotationProvider rotation) {
20+
this.rotation = rotation;
21+
}
22+
23+
@Override
24+
public EntityModifierType getType() {
25+
return EntityModifierTypes.SET_ROTATION;
26+
}
27+
28+
@Override
29+
public Entity apply(Entity entity, LootContext lootContext) {
30+
Vec2f newRotation = this.rotation.getRotation(entity.getRotationClient(), lootContext);
31+
entity.refreshPositionAndAngles(entity.getX(), entity.getY(), entity.getZ(), newRotation.y, newRotation.x);
32+
entity.setHeadYaw(newRotation.y);
33+
if (entity instanceof ServerPlayerEntity player) {
34+
setPlayerRotation(player, newRotation);
35+
}
36+
return entity;
37+
}
38+
39+
private static void setPlayerRotation(ServerPlayerEntity player, Vec2f rotation) {
40+
player.networkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), rotation.y, rotation.x);
41+
}
42+
43+
public static class Serialiser implements EntityModifier.Serialiser<SetRotationEntityModifier> {
44+
@Override
45+
public void toJson(JsonObject json, SetRotationEntityModifier object, JsonSerializationContext context) {
46+
json.add("rotation", context.serialize(object.rotation));
47+
}
48+
49+
@Override
50+
public SetRotationEntityModifier fromJson(JsonObject json, JsonDeserializationContext context) {
51+
RotationProvider rotation = JsonHelper.deserialize(json, "rotation", context, RotationProvider.class);
52+
return new SetRotationEntityModifier(rotation);
53+
}
54+
}
55+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package errorcraft.entitymodifiers.world.rotation;
2+
3+
import com.google.gson.*;
4+
import errorcraft.entitymodifiers.util.RelativeNumberProvider;
5+
import net.minecraft.loot.context.LootContext;
6+
import net.minecraft.util.JsonHelper;
7+
import net.minecraft.util.math.Vec2f;
8+
9+
import java.lang.reflect.Type;
10+
11+
public class RotationProvider {
12+
private final RelativeNumberProvider x;
13+
private final RelativeNumberProvider y;
14+
15+
public RotationProvider(RelativeNumberProvider x, RelativeNumberProvider y) {
16+
this.x = x;
17+
this.y = y;
18+
}
19+
20+
public Vec2f getRotation(Vec2f currentRotation, LootContext lootContext) {
21+
float newX = this.x.getFloat(currentRotation.x, lootContext);
22+
float newY = this.y.getFloat(currentRotation.y, lootContext);
23+
return new Vec2f(newX, newY);
24+
}
25+
26+
public static class Serialiser implements JsonDeserializer<RotationProvider>, JsonSerializer<RotationProvider> {
27+
@Override
28+
public RotationProvider deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
29+
JsonObject jsonObject = JsonHelper.asObject(json, "value");
30+
RelativeNumberProvider x = JsonHelper.deserialize(jsonObject, "x", context, RelativeNumberProvider.class);
31+
RelativeNumberProvider y = JsonHelper.deserialize(jsonObject, "y", context, RelativeNumberProvider.class);
32+
return new RotationProvider(x, y);
33+
}
34+
35+
@Override
36+
public JsonElement serialize(RotationProvider object, Type type, JsonSerializationContext context) {
37+
JsonObject json = new JsonObject();
38+
json.add("x", context.serialize(object.x));
39+
json.add("y", context.serialize(object.y));
40+
return json;
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)