Skip to content

Commit

Permalink
Fix research cost list serialization in network buffers [1.20] (ldtte…
Browse files Browse the repository at this point in the history
…am#9635)

Fix issues surrounding cost serialization to network buffers (and NBT)
  • Loading branch information
Thodor12 authored Dec 19, 2023
1 parent 3d8c4dc commit f44e418
Show file tree
Hide file tree
Showing 12 changed files with 169 additions and 62 deletions.
4 changes: 2 additions & 2 deletions src/api/java/com/minecolonies/api/IMinecoloniesAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry;
import com.minecolonies.api.quests.registries.QuestRegistries;
import com.minecolonies.api.research.IGlobalResearchTree;
import com.minecolonies.api.research.ModResearchCosts;
import com.minecolonies.api.research.ModResearchCostTypes.ResearchCostType;
import com.minecolonies.api.research.effects.registry.ResearchEffectEntry;
import com.minecolonies.api.research.registry.ResearchRequirementEntry;
import net.minecraftforge.registries.IForgeRegistry;
Expand Down Expand Up @@ -74,7 +74,7 @@ static IMinecoloniesAPI getInstance()

IForgeRegistry<ResearchEffectEntry> getResearchEffectRegistry();

IForgeRegistry<ModResearchCosts.ResearchCostEntry> getResearchCostRegistry();
IForgeRegistry<ResearchCostType> getResearchCostRegistry();

IForgeRegistry<ColonyEventTypeRegistryEntry> getColonyEventRegistry();

Expand Down
4 changes: 2 additions & 2 deletions src/api/java/com/minecolonies/api/MinecoloniesAPIProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry;
import com.minecolonies.api.quests.registries.QuestRegistries;
import com.minecolonies.api.research.IGlobalResearchTree;
import com.minecolonies.api.research.ModResearchCosts;
import com.minecolonies.api.research.ModResearchCostTypes.ResearchCostType;
import com.minecolonies.api.research.effects.registry.ResearchEffectEntry;
import com.minecolonies.api.research.registry.ResearchRequirementEntry;
import net.minecraftforge.registries.IForgeRegistry;
Expand Down Expand Up @@ -157,7 +157,7 @@ public IGlobalResearchTree getGlobalResearchTree()
public IForgeRegistry<ResearchEffectEntry> getResearchEffectRegistry() {return apiInstance.getResearchEffectRegistry();}

@Override
public IForgeRegistry<ModResearchCosts.ResearchCostEntry> getResearchCostRegistry()
public IForgeRegistry<ResearchCostType> getResearchCostRegistry()
{
return apiInstance.getResearchCostRegistry();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,11 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import static com.minecolonies.api.research.ModResearchCosts.LIST_ITEM_COST_ID;
import static com.minecolonies.api.research.ModResearchCosts.TAG_ITEM_COST_ID;
import java.util.List;
import java.util.concurrent.CompletableFuture;

import static com.minecolonies.api.research.ModResearchCostTypes.LIST_ITEM_COST_ID;
import static com.minecolonies.api.research.ModResearchCostTypes.TAG_ITEM_COST_ID;

/**
* A class for creating the Research-related JSONs, including Research, ResearchEffects, and (optional) Branches.
* Note that this does not validate that the resulting research tree is coherent:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,49 +6,65 @@
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.RegistryObject;

import java.util.function.Supplier;
import java.util.function.Function;

/**
* Registry entries for item cost types.
*/
public class ModResearchCosts
public class ModResearchCostTypes
{
public static final ResourceLocation SIMPLE_ITEM_COST_ID = new ResourceLocation(Constants.MOD_ID, "item_simple");
public static final ResourceLocation LIST_ITEM_COST_ID = new ResourceLocation(Constants.MOD_ID, "item_list");
public static final ResourceLocation TAG_ITEM_COST_ID = new ResourceLocation(Constants.MOD_ID, "item_tag");

public static RegistryObject<ResearchCostEntry> simpleItemCost;
public static RegistryObject<ResearchCostType> simpleItemCost;

public static RegistryObject<ResearchCostEntry> listItemCost;
public static RegistryObject<ResearchCostType> listItemCost;

public static RegistryObject<ResearchCostEntry> tagItemCost;
public static RegistryObject<ResearchCostType> tagItemCost;

/**
* Quest reward entry type.
*/
public static class ResearchCostEntry
public static class ResearchCostType
{
/**
* The ID of the cost type.
*/
private final ResourceLocation id;

/**
* The producer for the cost instance.
*/
private final Supplier<IResearchCost> producer;
private final Function<ResearchCostType, IResearchCost> producer;

/**
* Default constructor.
*/
public ResearchCostEntry(final Supplier<IResearchCost> productionFunction)
public ResearchCostType(final ResourceLocation id, final Function<ResearchCostType, IResearchCost> productionFunction)
{
this.id = id;
this.producer = productionFunction;
}

/**
* The ID of this cost type.
*
* @return the id.
*/
public ResourceLocation getId()
{
return id;
}

/**
* Create an empty cost instance.
*
* @return the cost instance.
*/
public IResearchCost createInstance()
{
return producer.get();
return producer.apply(this);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.minecolonies.api.research.costs;

import com.google.gson.JsonObject;
import com.minecolonies.api.research.ModResearchCostTypes.ResearchCostType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentUtils;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import org.jetbrains.annotations.NotNull;

Expand All @@ -16,11 +17,11 @@
public interface IResearchCost
{
/**
* The ID for this cost.
* The type for this cost.
*
* @return the id.
* @return the type.
*/
ResourceLocation getId();
ResearchCostType getType();

/**
* Get the count for this cost.
Expand Down Expand Up @@ -60,6 +61,20 @@ default Component getTranslatedName()
*/
void write(@NotNull final CompoundTag compound);

/**
* Serialize the cost instance to the given {@link FriendlyByteBuf}.
*
* @param buf the network buffer.
*/
void serialize(@NotNull final FriendlyByteBuf buf);

/**
* Deserialize the {@link FriendlyByteBuf} to this cost instance.
*
* @param buf the network buffer.
*/
void deserialize(@NotNull final FriendlyByteBuf buf);

/**
* Checks if this json object has the correct fields for this cost instance.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import com.minecolonies.api.entity.pathfinding.registry.IPathNavigateRegistry;
import com.minecolonies.api.quests.registries.QuestRegistries;
import com.minecolonies.api.research.IGlobalResearchTree;
import com.minecolonies.api.research.ModResearchCosts;
import com.minecolonies.api.research.ModResearchCostTypes.ResearchCostType;
import com.minecolonies.api.research.effects.registry.ResearchEffectEntry;
import com.minecolonies.api.research.registry.ResearchRequirementEntry;
import com.minecolonies.api.util.constant.Constants;
Expand All @@ -45,7 +45,7 @@
import net.minecraftforge.registries.RegistryBuilder;
import org.jetbrains.annotations.NotNull;

import static com.minecolonies.api.research.ModResearchCosts.LIST_ITEM_COST_ID;
import static com.minecolonies.api.research.ModResearchCostTypes.LIST_ITEM_COST_ID;
import static com.minecolonies.api.research.ModResearchRequirements.RESEARCH_RESEARCH_REQ_ID;
import static com.minecolonies.api.research.effects.ModResearchEffects.GLOBAL_EFFECT_ID;

Expand All @@ -69,7 +69,7 @@ public class CommonMinecoloniesAPIImpl implements IMinecoloniesAPI
private static IGlobalResearchTree globalResearchTree = new GlobalResearchTree();
private IForgeRegistry<ResearchRequirementEntry> researchRequirementRegistry;
private IForgeRegistry<ResearchEffectEntry> researchEffectRegistry;
private IForgeRegistry<ModResearchCosts.ResearchCostEntry> researchCostRegistry;
private IForgeRegistry<ResearchCostType> researchCostRegistry;
private IForgeRegistry<RecipeTypeEntry> recipeTypeEntryRegistry;
private IForgeRegistry<CraftingType> craftingTypeRegistry;
private IForgeRegistry<QuestRegistries.ObjectiveEntry> questObjectiveRegistry;
Expand Down Expand Up @@ -195,7 +195,7 @@ public IGlobalResearchTree getGlobalResearchTree()
public IForgeRegistry<ResearchEffectEntry> getResearchEffectRegistry() {return researchEffectRegistry;}

@Override
public IForgeRegistry<ModResearchCosts.ResearchCostEntry> getResearchCostRegistry()
public IForgeRegistry<ResearchCostType> getResearchCostRegistry()
{
return researchCostRegistry;
}
Expand Down Expand Up @@ -274,7 +274,7 @@ public void onRegistryNewRegistry(final NewRegistryEvent event)
.disableSaving().allowModification()
.setIDRange(0, Integer.MAX_VALUE - 1), (b) -> researchEffectRegistry = b);

event.create(new RegistryBuilder<ModResearchCosts.ResearchCostEntry>()
event.create(new RegistryBuilder<ResearchCostType>()
.setName(new ResourceLocation(Constants.MOD_ID, "researchcosttypes"))
.setDefaultKey(LIST_ITEM_COST_ID)
.disableSaving().allowModification()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
package com.minecolonies.apiimp.initializer;

import com.minecolonies.api.research.ModResearchCosts;
import com.minecolonies.api.research.ModResearchCostTypes;
import com.minecolonies.api.util.constant.Constants;
import com.minecolonies.coremod.research.costs.ListItemCost;
import com.minecolonies.coremod.research.costs.SimpleItemCost;
import com.minecolonies.coremod.research.costs.TagItemCost;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.DeferredRegister;

import static com.minecolonies.api.research.ModResearchCosts.*;
import static com.minecolonies.api.research.ModResearchCostTypes.*;

/**
* Registry initializer for the {@link ModResearchCosts}.
* Registry initializer for the {@link ModResearchCostTypes}.
*/
public class ModResearchCostInitializer
public class ModResearchCostTypeInitializer
{
public static final DeferredRegister<ModResearchCosts.ResearchCostEntry>
public static final DeferredRegister<ResearchCostType>
DEFERRED_REGISTER = DeferredRegister.create(new ResourceLocation(Constants.MOD_ID, "researchcosttypes"), Constants.MOD_ID);
static
{
ModResearchCosts.simpleItemCost =
DEFERRED_REGISTER.register(SIMPLE_ITEM_COST_ID.getPath(), () -> new ModResearchCosts.ResearchCostEntry(SimpleItemCost::new));
ModResearchCostTypes.simpleItemCost =
DEFERRED_REGISTER.register(SIMPLE_ITEM_COST_ID.getPath(), () -> new ResearchCostType(SIMPLE_ITEM_COST_ID, SimpleItemCost::new));

ModResearchCosts.listItemCost =
DEFERRED_REGISTER.register(LIST_ITEM_COST_ID.getPath(), () -> new ModResearchCosts.ResearchCostEntry(ListItemCost::new));
ModResearchCostTypes.listItemCost =
DEFERRED_REGISTER.register(LIST_ITEM_COST_ID.getPath(), () -> new ResearchCostType(LIST_ITEM_COST_ID, ListItemCost::new));

ModResearchCosts.tagItemCost =
DEFERRED_REGISTER.register(TAG_ITEM_COST_ID.getPath(), () -> new ModResearchCosts.ResearchCostEntry(TagItemCost::new));
ModResearchCostTypes.tagItemCost =
DEFERRED_REGISTER.register(TAG_ITEM_COST_ID.getPath(), () -> new ResearchCostType(TAG_ITEM_COST_ID, TagItemCost::new));
}
private ModResearchCostInitializer()
private ModResearchCostTypeInitializer()
{
throw new IllegalStateException("Tried to initialize: ModResearchCostInitializer but this is a Utility class.");
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/minecolonies/coremod/MineColonies.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import com.minecolonies.coremod.proxy.IProxy;
import com.minecolonies.coremod.proxy.ServerProxy;
import com.minecolonies.coremod.structures.MineColoniesStructures;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.Capability;
Expand Down Expand Up @@ -90,7 +92,7 @@ public MineColonies()
ModSoundEvents.SOUND_EVENTS.register(FMLJavaModLoadingContext.get().getModEventBus());
ModInteractionsInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus());
ModResearchEffectInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus());
ModResearchCostInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus());
ModResearchCostTypeInitializer.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus());
ModLootConditions.DEFERRED_REGISTER.register(FMLJavaModLoadingContext.get().getModEventBus());
SupplyLoot.GLM.register(FMLJavaModLoadingContext.get().getModEventBus());
ModBannerPatterns.BANNER_PATTERNS.register(FMLJavaModLoadingContext.get().getModEventBus());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.minecolonies.api.colony.requestsystem.factory.IFactoryController;
import com.minecolonies.api.research.IGlobalResearch;
import com.minecolonies.api.research.IResearchRequirement;
import com.minecolonies.api.research.ModResearchCosts;
import com.minecolonies.api.research.ModResearchCostTypes.ResearchCostType;
import com.minecolonies.api.research.costs.IResearchCost;
import com.minecolonies.api.research.effects.IResearchEffect;
import com.minecolonies.api.research.effects.registry.IResearchEffectRegistry;
Expand All @@ -27,7 +27,7 @@

import java.util.Objects;

import static com.minecolonies.api.research.ModResearchCosts.SIMPLE_ITEM_COST_ID;
import static com.minecolonies.api.research.ModResearchCostTypes.SIMPLE_ITEM_COST_ID;
import static com.minecolonies.api.research.util.ResearchConstants.*;

/**
Expand Down Expand Up @@ -78,10 +78,9 @@ public CompoundTag serialize(@NotNull final IFactoryController controller, @NotN
compound.putBoolean(TAG_HIDDEN, research.isHidden());
@NotNull final ListTag costTagList = research.getCostList().stream().map(cost ->
{
final ModResearchCosts.ResearchCostEntry researchCostEntry = IMinecoloniesAPI.getInstance().getResearchCostRegistry().getValue(cost.getId());
final IResearchCost instance = researchCostEntry.createInstance();
compound.putString(TAG_COST_TYPE, cost.getId().toString());
instance.write(compound);
final CompoundTag costCompound = new CompoundTag();
costCompound.putString(TAG_COST_TYPE, cost.getType().getId().toString());
cost.write(costCompound);
return compound;
}).collect(NBTUtils.toListNBT());
compound.put(TAG_COSTS, costTagList);
Expand Down Expand Up @@ -141,8 +140,8 @@ public IGlobalResearch deserialize(@NotNull final IFactoryController controller,
NBTUtils.streamCompound(nbt.getList(TAG_COSTS, Tag.TAG_COMPOUND)).forEach(compound ->
{
final ResourceLocation res = compound.contains(TAG_COST_TYPE) ? new ResourceLocation(compound.getString(TAG_COST_TYPE)) : SIMPLE_ITEM_COST_ID;
final ModResearchCosts.ResearchCostEntry researchCostEntry = IMinecoloniesAPI.getInstance().getResearchCostRegistry().getValue(res);
final IResearchCost instance = researchCostEntry.createInstance();
final ResearchCostType researchCostType = IMinecoloniesAPI.getInstance().getResearchCostRegistry().getValue(res);
final IResearchCost instance = researchCostType.createInstance();
instance.read(compound);
research.addCost(instance);
});
Expand Down Expand Up @@ -177,9 +176,10 @@ public void serialize(@NotNull IFactoryController controller, IGlobalResearch in
packetBuffer.writeBoolean(input.isImmutable());
packetBuffer.writeBoolean(input.isHidden());
packetBuffer.writeVarInt(input.getCostList().size());
for (IResearchCost is : input.getCostList())
for (IResearchCost cost : input.getCostList())
{
controller.serialize(packetBuffer, is);
packetBuffer.writeRegistryId(IMinecoloniesAPI.getInstance().getResearchCostRegistry(), cost.getType());
cost.serialize(packetBuffer);
}
packetBuffer.writeVarInt(input.getResearchRequirement().size());
for (IResearchRequirement req : input.getResearchRequirement())
Expand Down Expand Up @@ -224,7 +224,10 @@ public IGlobalResearch deserialize(@NotNull IFactoryController controller, Frien
final int costSize = buffer.readVarInt();
for(int i = 0; i < costSize; i++)
{
research.addCost(controller.deserialize(buffer));
final ResearchCostType researchCostType = buffer.readRegistryIdSafe(ResearchCostType.class);
final IResearchCost cost = researchCostType.createInstance();
cost.deserialize(buffer);
research.addCost(cost);
}

final int reqCount = buffer.readVarInt();
Expand Down
Loading

0 comments on commit f44e418

Please sign in to comment.