8000 fix 10894 by Raycoms · Pull Request #10897 · ldtteam/minecolonies · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

fix 10894 #10897

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,20 @@
import com.minecolonies.api.colony.buildingextensions.modules.IBuildingExtensionModule;
import com.minecolonies.api.colony.buildingextensions.registry.BuildingExtensionRegistries;
import com.minecolonies.api.colony.modules.IModuleContainer;
import com.minecolonies.api.util.BlockPosUtil;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.neoforge.common.util.INBTSerializable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_ID;
import static com.minecolonies.api.util.constant.NbtTagConstants.TAG_POS;

/**
* Interface for building extension instances.
*/
Expand Down Expand Up @@ -108,4 +115,31 @@ public interface IBuildingExtension extends IModuleContainer<IBuildingExtensionM
* Equals implementation for this building extension.
*/
boolean equals(Object other);

/**
* Get the unique extension id.
* @return the unique id.
*/
ExtensionId getId();

/**
* Unique extension id.
* @param pos the pos it's at.
* @param entry it's entry type.
*/
record ExtensionId(BlockPos pos, BuildingExtensionRegistries.BuildingExtensionEntry entry)
{
public Tag serializeNBT(final HolderLookup.Provider provider)
{
final CompoundTag tag = new CompoundTag();
BlockPosUtil.write(tag, TAG_POS, pos);
tag.putString(TAG_ID, entry.getRegistryName().toString());
return tag;
}

public static ExtensionId deserializeNBT(final HolderLookup.Provider provider, final CompoundTag nbt)
{
return new ExtensionId(BlockPosUtil.read(nbt, TAG_POS), BuildingExtensionRegistries.getBuildingExtensionRegistry().get(ResourceLocation.parse(nbt.getString(TAG_ID))));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ public interface IRegisteredStructureManager
* @param matcher the building extension matcher predicate.
* @return the building extension, if any.
*/
Optional<IBuildingExtension> getBuildingExtension(Predicate<IBuildingExtension> matcher);
Optional<IBuildingExtension> getMatchingBuildingExtension(Predicate<IBuildingExtension> matcher);

/**
* Add a new building extension to the building manager.
Expand All @@ -348,4 +348,11 @@ public interface IRegisteredStructureManager
* @param matcher the building extension matcher predicate.
*/
void removeBuildingExtension(Predicate<IBuildingExtension> matcher);

/**
* Get a building extension by id.
* @param extensionId the id of the extension.
* @return the building extension or null.
*/
@Nullable IBuildingExtension getMatchingBuildingExtension(IBuildingExtension.ExtensionId extensionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,13 @@ public final class NbtTagConstants

public static final String TAG_LAST_FOODS = "lastfoods";

/**
* Farmer building related things.
*/
public static final String TAG_CELL = "cell";
public static final String TAG_WORKING_OFFSET = "workingoffset";
public static final String TAG_PREV_POS = "prevpos";

/**
* Private constructor to hide the implicit one.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ public abstract class AbstractBuildingExtension implements IBuildingExtension
@Nullable
private BlockPos buildingId = null;

/**
* Unique extension id.
*/
private final ExtensionId extensionId;

/**
* Constructor used in NBT deserialization.
*
Expand All @@ -60,6 +65,7 @@ protected AbstractBuildingExtension(final @NotNull BuildingExtensionRegistries.B
{
this.buildingExtensionEntry = buildingExtensionEntry;
this.position = position;
this.extensionId = new ExtensionId(position, buildingExtensionEntry);
}

@Override
Expand Down Expand Up @@ -230,4 +236,10 @@ public boolean equals(final Object o)
}
return buildingExtensionEntry.equals(that.buildingExtensionEntry);
}

@Override
public ExtensionId getId()
{
return extensionId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModule;
import com.minecolonies.api.colony.buildings.modules.IBuildingModule;
import com.minecolonies.api.colony.buildings.modules.IPersistentModule;
import com.minecolonies.api.util.BlockPosUtil;
import net.minecraft.core.BlockPos;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
Expand All @@ -17,7 +16,6 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Predicate;

import static com.minecolonies.api.util.constant.NbtTagConstants.*;
Expand All @@ -31,17 +29,18 @@ public abstract class BuildingExtensionsModule extends AbstractBuildingModule im
* NBT tag to store assign manually.
*/
private static final String TAG_ASSIGN_MANUALLY = "assign";
private static final String TAG_CURRENT_EXTENSION = "currex";

/**
* A map of building extensions, along with their unix timestamp of when they can next be checked again.
*/
private final Map<BlockPos, Integer> checkedExtensions = new HashMap<>();
private final Map<IBuildingExtension.ExtensionId, Integer> checkedExtensions = new Object2IntOpenHashMap<>();

/**
* The building extension the citizen is currently working on.
*/
@Nullable
private IBuildingExtension currentExtension;
private IBuildingExtension.ExtensionId currentExtensionId;

/**
* Building extensions should be assigned manually to the citizen.
Expand All @@ -52,11 +51,15 @@ public abstract class BuildingExtensionsModule extends AbstractBuildingModule im
public void deserializeNBT(@NotNull final HolderLookup.Provider provider, final CompoundTag compound)
{
shouldAssignManually = compound.getBoolean(TAG_ASSIGN_MANUALLY);
final ListTag listTag = compound.getList(TAG_LIST, Tag.TAG_COMPOUND);
final ListTag listTag = compound.getList(TAG_BUILDING_EXTENSIONS, Tag.TAG_COMPOUND);
for (int i = 0; i < listTag.size(); ++i)
{
final CompoundTag tag = listTag.getCompound(i);
checkedExtensions.put(BlockPosUtil.read(tag, TAG_POS), compound.getInt(TAG_DAY));
checkedExtensions.put(IBuildingExtension.ExtensionId.deserializeNBT(provider, tag.getCompound(TAG_ID)), compound.getInt(TAG_DAY));
}
if (compound.contains(TAG_CURRENT_EXTENSION))
{
currentExtensionId = IBuildingExtension.ExtensionId.deserializeNBT(provider, compound.getCompound(TAG_CURRENT_EXTENSION));
}
}

Expand All @@ -66,14 +69,18 @@ public void serializeNBT(@NotNull final HolderLookup.Provider provider, Compound
compound.putBoolean(TAG_ASSIGN_MANUALLY, shouldAssignManually);

final ListTag listTag = new ListTag();
for (final Map.Entry<BlockPos, Integer> entry : checkedExtensions.entrySet())
for (final Map.Entry<IBuildingExtension.ExtensionId, Integer> entry : checkedExtensions.entrySet())
{
final CompoundTag listEntry = new CompoundTag();
BlockPosUtil.write(compound, TAG_POS, entry.getKey());
compound.put(TAG_ID, entry.getKey().serializeNBT(provider));
listEntry.putLong(TAG_DAY, entry.getValue());
listTag.add(listEntry);
}
compound.put(TAG_LIST, listTag);
if (currentExtensionId != null)
{
compound.put(TAG_CURRENT_EXTENSION, currentExtensionId.serializeNBT(provider));
}
}

@Override
Expand Down Expand Up @@ -105,7 +112,11 @@ public void serializeToView(@NotNull final RegistryFriendlyByteBuf buf)
@Nullable
public IBuildingExtension getCurrentExtension()
{
return currentExtension;
if (currentExtensionId == null)
{
return null;
}
return building.getColony().getBuildingManager().getMatchingBuildingExtension(currentExtensionId);
}

/**
Expand All @@ -118,39 +129,32 @@ public IBuildingExtension getCurrentExtension()
@Nullable
public IBuildingExtension getBuildingExtensionToWorkOn()
{
final IBuildingExtension currentExtension = getCurrentExtension();
if (currentExtension != null)
{
return currentExtension;
}

IBuildingExtension lastUsedExtension = null;
int lastUsedExtensionDay = 0;
IBuildingExtension.ExtensionId lastUsedExtension = null;
int lastUsedExtensionDay = building.getColony().getDay();

for (final IBuildingExtension extension : getOwnedExtensions())
{
if (!checkedExtensions.containsKey(extension.getPosition()))
if (!checkedExtensions.containsKey(extension.getId()))
{
currentExtension = extension;
currentExtensionId = extension.getId();
return extension;
}

final int lastDay = checkedExtensions.get(extension.getPosition());
if (lastUsedExtension == null)
{
if (lastDay < building.getColony().getDay())
{
lastUsedExtension = extension;
lastUsedExtensionDay = lastDay;
}
}
else if (lastUsedExtensionDay < lastDay)
final int lastDay = checkedExtensions.get(extension.getId());
if (lastDay < lastUsedExtensionDay)
{
lastUsedExtension = extension;
lastUsedExtension = extension.getId();
lastUsedExtensionDay = lastDay;
}
}
currentExtension = lastUsedExtension;
return lastUsedExtension;
currentExtensionId = lastUsedExtension;
return getCurrentExtension();
}

/**
Expand Down Expand Up @@ -276,7 +280,7 @@ public void freeExtension(final IBuildingExtension extension)
extension.resetOwningBuilding();
markDirty();

if (Objects.equals(currentExtension, extension))
if (currentExtensionId == extension.getId())
{
resetCurrentExtension();
}
Expand All @@ -287,10 +291,10 @@ public void freeExtension(final IBuildingExtension extension)
*/
public void resetCurrentExtension()
{
if (currentExtension != null)
if (currentExtensionId != null)
{
checkedExtensions.put(currentExtension.getPosition(), building.getColony().getDay());
checkedExtensions.put(currentExtensionId, building.getColony().getDay());
}
currentExtension = null;
currentExtensionId = null;
}
}
Loading
0