Skip to content

Commit e80e423

Browse files
committed
Add serializer for Forge's ToolAction system.
1 parent e5b5336 commit e80e423

File tree

2 files changed

+90
-22
lines changed

2 files changed

+90
-22
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package net.darkhax.bookshelf.serialization;
2+
3+
import java.util.Map;
4+
5+
import com.google.gson.JsonElement;
6+
import com.google.gson.JsonParseException;
7+
import com.google.gson.JsonPrimitive;
8+
9+
import net.darkhax.bookshelf.Bookshelf;
10+
import net.minecraft.network.FriendlyByteBuf;
11+
import net.minecraft.util.GsonHelper;
12+
import net.minecraftforge.common.ToolAction;
13+
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
14+
15+
public class SerializerToolAction implements ISerializer<ToolAction> {
16+
17+
public static final ISerializer<ToolAction> SERIALIZER = new SerializerToolAction();
18+
19+
private SerializerToolAction () {
20+
21+
}
22+
23+
@Override
24+
public ToolAction read (JsonElement json) {
25+
26+
if (json.isJsonPrimitive()) {
27+
28+
final String actionName = json.getAsString();
29+
return getAction(actionName);
30+
}
31+
32+
throw new JsonParseException("Expected a string. Got " + GsonHelper.getType(json));
33+
}
34+
35+
@Override
36+
public JsonElement write (ToolAction toWrite) {
37+
38+
return new JsonPrimitive(toWrite.name());
39+
}
40+
41+
@Override
42+
public ToolAction read (FriendlyByteBuf buffer) {
43+
44+
final String actionName = buffer.readUtf();
45+
return getAction(actionName);
46+
}
47+
48+
@Override
49+
public void write (FriendlyByteBuf buffer, ToolAction toWrite) {
50+
51+
buffer.writeUtf(toWrite.name());
52+
}
53+
54+
private ToolAction getAction(String name) {
55+
56+
final Map<String, ToolAction> actions = ObfuscationReflectionHelper.getPrivateValue(ToolAction.class, null, "actions");
57+
58+
if (!actions.containsKey(name)) {
59+
60+
Bookshelf.LOG.warn("Could not find ToolAction with name {}. It will be created.");
61+
}
62+
63+
return ToolAction.get(name);
64+
}
65+
}

src/main/java/net/darkhax/bookshelf/serialization/Serializers.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,42 @@
22

33
import java.util.UUID;
44

5+
import com.mojang.math.Vector3f;
6+
57
import net.darkhax.bookshelf.block.DisplayableBlockState;
68
import net.darkhax.bookshelf.crafting.block.BlockIngredient;
7-
import net.minecraft.world.level.block.Block;
8-
import net.minecraft.world.level.block.state.BlockState;
9-
import net.minecraft.world.item.enchantment.Enchantment;
10-
import net.minecraft.world.item.enchantment.EnchantmentInstance;
9+
import net.minecraft.core.particles.ParticleType;
10+
import net.minecraft.nbt.CompoundTag;
11+
import net.minecraft.network.chat.Component;
12+
import net.minecraft.resources.ResourceLocation;
13+
import net.minecraft.sounds.SoundEvent;
14+
import net.minecraft.stats.StatType;
15+
import net.minecraft.tags.BlockTags;
16+
import net.minecraft.tags.EntityTypeTags;
17+
import net.minecraft.tags.FluidTags;
18+
import net.minecraft.tags.ItemTags;
19+
import net.minecraft.tags.Tag.Named;
20+
import net.minecraft.world.effect.MobEffect;
1121
import net.minecraft.world.entity.EntityType;
1222
import net.minecraft.world.entity.ai.attributes.Attribute;
23+
import net.minecraft.world.entity.ai.village.poi.PoiType;
1324
import net.minecraft.world.entity.decoration.Motive;
1425
import net.minecraft.world.entity.npc.VillagerProfession;
15-
import net.minecraft.world.level.material.Fluid;
1626
import net.minecraft.world.inventory.MenuType;
1727
import net.minecraft.world.item.Item;
1828
import net.minecraft.world.item.ItemStack;
19-
import net.minecraft.world.item.crafting.RecipeSerializer;
20-
import net.minecraft.world.item.crafting.Ingredient;
21-
import net.minecraft.nbt.CompoundTag;
22-
import net.minecraft.core.particles.ParticleType;
23-
import net.minecraft.world.effect.MobEffect;
2429
import net.minecraft.world.item.alchemy.Potion;
25-
import net.minecraft.stats.StatType;
26-
import net.minecraft.tags.BlockTags;
27-
import net.minecraft.tags.EntityTypeTags;
28-
import net.minecraft.tags.FluidTags;
29-
import net.minecraft.tags.Tag.Named;
30-
import net.minecraft.tags.ItemTags;
30+
import net.minecraft.world.item.crafting.Ingredient;
31+
import net.minecraft.world.item.crafting.RecipeSerializer;
32+
import net.minecraft.world.item.enchantment.Enchantment;
33+
import net.minecraft.world.item.enchantment.EnchantmentInstance;
34+
import net.minecraft.world.level.block.Block;
3135
import net.minecraft.world.level.block.entity.BlockEntityType;
32-
import net.minecraft.resources.ResourceLocation;
33-
import net.minecraft.sounds.SoundEvent;
36+
import net.minecraft.world.level.block.state.BlockState;
37+
import net.minecraft.world.level.material.Fluid;
3438
import net.minecraft.world.phys.Vec3;
35-
import com.mojang.math.Vector3f;
36-
import net.minecraft.network.chat.Component;
37-
import net.minecraft.world.entity.ai.village.poi.PoiType;
3839
import net.minecraftforge.common.ForgeTagHandler;
40+
import net.minecraftforge.common.ToolAction;
3941
import net.minecraftforge.registries.ForgeRegistries;
4042

4143
public class Serializers {
@@ -60,7 +62,8 @@ public class Serializers {
6062
public static final ISerializer<Vec3> VEC3D = SerializerVec3d.SERIALIZER;
6163
public static final ISerializer<DisplayableBlockState> DISPLAY_STATE = DisplayableBlockState.SERIALIZER;
6264
public static final ISerializer<BlockIngredient> BLOCK_INGREDIENT = BlockIngredientSerializer.SERIALIZER;
63-
65+
public static final ISerializer<ToolAction> TOOL_ACTION = SerializerToolAction.SERIALIZER;
66+
6467
public static final ISerializer<Named<Block>> BLOCK_TAG = new SerializerINamedTag<>(BlockTags::createOptional);
6568
public static final ISerializer<Named<Item>> ITEM_TAG = new SerializerINamedTag<>(ItemTags::createOptional);
6669
public static final ISerializer<Named<EntityType<?>>> ENTITY_TAG = new SerializerINamedTag<>(EntityTypeTags::createOptional);

0 commit comments

Comments
 (0)