Skip to content

Commit

Permalink
Fix caps
Browse files Browse the repository at this point in the history
  • Loading branch information
Nightenom committed Feb 16, 2024
1 parent 4d7e167 commit c049e8b
Show file tree
Hide file tree
Showing 8 changed files with 85 additions and 48 deletions.
12 changes: 10 additions & 2 deletions src/main/java/com/minecolonies/api/colony/IColonyManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.minecolonies.api.IMinecoloniesAPI;
import com.minecolonies.api.colony.buildings.IBuilding;
import com.minecolonies.api.colony.buildings.views.IBuildingView;
import com.minecolonies.api.colony.capability.IColonyManagerCapability;
import com.minecolonies.api.compatibility.ICompatibilityManager;
import com.minecolonies.api.crafting.IRecipeManager;
import net.minecraft.core.BlockPos;
Expand Down Expand Up @@ -269,9 +270,9 @@ static IColonyManager getInstance()
void onWorldLoad(@NotNull Level world);

/**
* Sets the cap for this world to loaded
* @param cap null if loaded,
*/
void setCapLoaded();
void setLoadingCap(@Nullable IColonyManagerCapability cap);

/**
* When a world unloads, all colonies in that world are informed. Additionally, when the last world is unloaded, delete all colonies.
Expand Down Expand Up @@ -426,4 +427,11 @@ static IColonyManager getInstance()
* @param pos the pos to open it at.
*/
void openReactivationWindow(final BlockPos pos);

/**
* Adds colony directly to cap. Use only during loading!
*
* @param colony loaded colony
*/
void addColonyDirect(IColony colony, ServerLevel world);
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,10 @@ public Map<ChunkPos, ChunkLoadStorage> getAllChunkStorages()
{
return chunkStorages;
}

@Override
public boolean isDirty()
{
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ public class ColonyManagerCapability extends SavedData implements IColonyManager
{
private static final Logger LOGGER = LogUtils.getLogger();

public static final Codec<ColonyManagerCapability> CODEC = CompoundTag.CODEC.xmap(tag -> new ColonyManagerCapability().readNBT(tag), ColonyManagerCapability::writeNBT);
public static final Codec<ColonyManagerCapability> CODEC = CompoundTag.CODEC.xmap(tag -> {
final var cap = new ColonyManagerCapability();
IColonyManager.getInstance().setLoadingCap(cap);
cap.readNBT(tag);
IColonyManager.getInstance().setLoadingCap(null);
return cap;
}, ColonyManagerCapability::writeNBT);

public static final String NAME = new ResourceLocation(Constants.MOD_ID, "colony_manager").toDebugFileName();
public static final Factory<ColonyManagerCapability> FACTORY = new Factory<>(ColonyManagerCapability::new, CodecUtil.nbtDecoder(CODEC, LOGGER, ColonyManagerCapability::new));
Expand Down Expand Up @@ -97,6 +103,12 @@ public int getTopID()
return colonies.getTopID();
}

@Override
public boolean isDirty()
{
return true;
}

private CompoundTag writeNBT()
{
final CompoundTag compound = new CompoundTag();
Expand All @@ -111,16 +123,13 @@ private CompoundTag writeNBT()
return compound;
}

private ColonyManagerCapability readNBT(final CompoundTag compound)
private void readNBT(final CompoundTag compound)
{
// Notify that we did load the cap for this world
IColonyManager.getInstance().setCapLoaded();

if (!compound.contains(TAG_COLONIES) || !compound.contains(TAG_COLONY_MANAGER))
{
BackUpHelper.loadMissingColonies();
BackUpHelper.loadManagerBackup();
return this;
return;
}

// Load all colonies from Nbt
Expand Down Expand Up @@ -159,7 +168,7 @@ private ColonyManagerCapability readNBT(final CompoundTag compound)
}

freshLoaded = compound;
return this;
return;
}

void processAfterLoadHook(final boolean overworld)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.minecolonies.api.colony.IColony;
import com.minecolonies.api.colony.IColonyManager;
import com.minecolonies.api.colony.capability.PerChunkSavedData.IDirty;
import com.minecolonies.api.util.BlockPosUtil;
import com.minecolonies.api.util.CodecUtil;
import com.minecolonies.api.util.Log;
Expand All @@ -27,7 +28,7 @@
/**
* The implementation of the colonyTagCapability.
*/
public class ColonyTagCapability implements IColonyTagCapability
public class ColonyTagCapability implements IColonyTagCapability, IDirty
{
public static final Codec<ColonyTagCapability> CODEC = RecordCodecBuilder.create(builder -> builder
.group(CodecUtil.strictOptionalField(CodecUtil.set(Codec.INT, HashSet::new), TAG_COLONIES, HashSet::new).forGetter(cap -> cap.colonies),
Expand Down Expand Up @@ -248,4 +249,10 @@ public Map<Integer, Set<BlockPos>> getAllClaimingBuildings()
{
return claimingBuildings;
}

@Override
public boolean isDirty()
{
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
/**
* SavedData per chunk wrapper
*/
public class PerChunkSavedData<T> extends SavedData
public class PerChunkSavedData<T extends PerChunkSavedData.IDirty> extends SavedData
{
/**
* Actual live data
Expand All @@ -34,7 +34,7 @@ public class PerChunkSavedData<T> extends SavedData
* @param codec type codec
* @param logger logger for encoding/decoding errors
*/
public static <T> Factory<PerChunkSavedData<T>> factory(final Supplier<T> constructor, final Codec<T> codec, final Logger logger)
public static <T extends IDirty> Factory<PerChunkSavedData<T>> factory(final Supplier<T> constructor, final Codec<T> codec, final Logger logger)
{
final Function<CompoundTag, T> decoder = CodecUtil.nbtDecoder(codec, logger, () -> null);
final Function<T, CompoundTag> encoder = CodecUtil.nbtEncoder(codec, logger, () -> null);
Expand Down Expand Up @@ -80,6 +80,12 @@ public CompoundTag save(final CompoundTag tag)
return tag;
}

@Override
public boolean isDirty()
{
return chunkCapabilities.values().stream().anyMatch(IDirty::isDirty);
}

public T get(final LevelChunk chunk)
{
return get(chunk.getPos());
Expand All @@ -89,4 +95,9 @@ public T get(final ChunkPos chunkPos)
{
return chunkCapabilities.computeIfAbsent(chunkPos.toLong(), key -> factory.get());
}

public static interface IDirty
{
boolean isDirty();
}
}
54 changes: 31 additions & 23 deletions src/main/java/com/minecolonies/core/colony/ColonyManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,26 @@ public final class ColonyManager implements IColonyManager
private boolean schematicDownloaded = false;

/**
* If the manager finished loading already.
* Used during cap deserialization
*/
private boolean capLoaded = false;
private IColonyManagerCapability loadingColonyManagerCap;

@Nullable
private IColonyManagerCapability getColonyManager(final ServerLevel w)
{
return loadingColonyManagerCap != null ? loadingColonyManagerCap : IColonyManagerCapability.getCapability(w);
}

@Override
public void setLoadingCap(@Nullable final IColonyManagerCapability cap)
{
loadingColonyManagerCap = cap;
}

@Override
public IColony createColony(@NotNull final ServerLevel w, final BlockPos pos, @NotNull final Player player, @NotNull final String colonyName, @NotNull final String pack)
{
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(w);
final IColonyManagerCapability cap = getColonyManager(w);
if (cap == null)
{
Log.getLogger().warn(MISSING_WORLD_CAP_MESSAGE);
Expand Down Expand Up @@ -188,7 +200,7 @@ private void deleteColony(@Nullable final IColony iColony, final boolean canDest

Log.getLogger().info("Deleting colony: " + colony.getID());

final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(world);
final IColonyManagerCapability cap = getColonyManager(world);
if (cap == null)
{
Log.getLogger().warn(MISSING_WORLD_CAP_MESSAGE);
Expand Down Expand Up @@ -224,7 +236,7 @@ public IColony getColonyByWorld(final int id, final Level world)
{
return getColonyView(id, world.dimension());
}
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(serverLevel);
final IColonyManagerCapability cap = getColonyManager(serverLevel);
if (cap == null)
{
Log.getLogger().warn(MISSING_WORLD_CAP_MESSAGE);
Expand All @@ -242,7 +254,7 @@ public IColony getColonyByDimension(final int id, final ResourceKey<Level> regis
{
return null;
}
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(world);
final IColonyManagerCapability cap = getColonyManager(world);
if (cap == null)
{
Log.getLogger().warn(MISSING_WORLD_CAP_MESSAGE);
Expand Down Expand Up @@ -324,7 +336,7 @@ public List<IColony> getColonies(@NotNull final Level w)
final ColonyList<IColonyView> list = colonyViews.get(w.dimension());
return list == null || list.isEmpty() ? List.of() : list.getCopyAsList();
}
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(serverLevel);
final IColonyManagerCapability cap = getColonyManager(serverLevel);
if (cap == null)
{
Log.getLogger().warn(MISSING_WORLD_CAP_MESSAGE);
Expand All @@ -340,7 +352,7 @@ public List<IColony> getAllColonies()
final List<IColony> allColonies = new ArrayList<>();
for (final ServerLevel world : net.neoforged.neoforge.server.ServerLifecycleHooks.getCurrentServer().getAllLevels())
{
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(world);
final IColonyManagerCapability cap = getColonyManager(world);
if (cap != null)
{
allColonies.addAll(cap.getColonies());
Expand Down Expand Up @@ -617,14 +629,6 @@ public void onWorldLoad(@NotNull final Level w)
{
if (w instanceof final ServerLevel world)
{
// Late-load restore if cap was not loaded
if (!capLoaded)
{
BackUpHelper.loadMissingColonies();
BackUpHelper.loadManagerBackup();
}
capLoaded = false;

for (@NotNull final IColony c : getColonies(world))
{
c.onWorldLoad(world);
Expand All @@ -634,12 +638,6 @@ public void onWorldLoad(@NotNull final Level w)
}
}

@Override
public void setCapLoaded()
{
this.capLoaded = true;
}

@Override
public void onWorldUnload(@NotNull final Level world)
{
Expand Down Expand Up @@ -821,7 +819,7 @@ public int getTopColonyId()
int top = 0;
for (final ServerLevel world : ServerLifecycleHooks.getCurrentServer().getAllLevels())
{
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(world);
final IColonyManagerCapability cap = getColonyManager(world);
final int tempTop = cap == null ? 0 : cap.getTopID();
if (tempTop > top)
{
Expand All @@ -836,4 +834,14 @@ public void resetColonyViews()
{
colonyViews.clear();
}

@Override
public void addColonyDirect(final IColony colony, final ServerLevel world)
{
final IColonyManagerCapability cap = getColonyManager(world);
if (cap != null)
{
cap.addColony(colony);
}
}
}
7 changes: 1 addition & 6 deletions src/main/java/com/minecolonies/core/util/BackUpHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.minecolonies.api.colony.IColony;
import com.minecolonies.api.colony.IColonyManager;
import com.minecolonies.api.colony.buildings.IBuilding;
import com.minecolonies.api.colony.capability.IColonyManagerCapability;
import com.minecolonies.api.util.ColonyUtils;
import com.minecolonies.api.util.Log;
import com.minecolonies.core.colony.Colony;
Expand Down Expand Up @@ -476,11 +475,7 @@ public static void loadColonyBackup(final int colonyId, final ResourceKey<Level>
return;
}

final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(colonyWorld);
if (cap != null)
{
cap.addColony(loadedColony);
}
IColonyManager.getInstance().addColonyDirect(loadedColony, colonyWorld);

if (claimChunks)
{
Expand Down
7 changes: 0 additions & 7 deletions src/main/java/com/minecolonies/core/util/ChunkDataHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.minecolonies.api.colony.IColonyManager;
import com.minecolonies.api.colony.buildings.IBuilding;
import com.minecolonies.api.colony.capability.IChunkmanagerCapability;
import com.minecolonies.api.colony.capability.IColonyManagerCapability;
import com.minecolonies.api.colony.capability.IColonyTagCapability;
import com.minecolonies.api.util.*;
import com.minecolonies.core.MineColonies;
Expand Down Expand Up @@ -57,12 +56,6 @@ public static void loadChunk(final LevelChunk chunk, final ServerLevel world)

if (!chunkManager.getAllChunkStorages().isEmpty())
{
final IColonyManagerCapability cap = IColonyManagerCapability.getCapability(world);
if (cap == null)
{
return;
}

final ChunkLoadStorage existingStorage = chunkManager.getChunkStorage(chunk.getPos().x, chunk.getPos().z);
if (existingStorage != null)
{
Expand Down

0 comments on commit c049e8b

Please # to comment.