Skip to content

Commit

Permalink
Fix field sync logic (ldtteam#9327)
Browse files Browse the repository at this point in the history
Fix field sync logic
  • Loading branch information
Thodor12 authored Aug 31, 2023
1 parent a94ad1c commit bc7ee36
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 209 deletions.
31 changes: 4 additions & 27 deletions src/api/java/com/minecolonies/api/colony/IColonyView.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,14 @@

import com.minecolonies.api.colony.buildings.views.IBuildingView;
import com.minecolonies.api.colony.buildings.workerbuildings.ITownHallView;
import com.minecolonies.api.colony.permissions.ColonyPlayer;
import com.minecolonies.api.colony.permissions.IPermissions;
import com.minecolonies.api.colony.fields.IField;
import com.minecolonies.api.colony.fields.registry.FieldRegistries;
import com.minecolonies.api.colony.permissions.ColonyPlayer;
import com.minecolonies.api.colony.permissions.IPermissions;
import com.minecolonies.api.colony.requestsystem.manager.IRequestManager;
import com.minecolonies.api.colony.requestsystem.requester.IRequester;
import com.minecolonies.api.colony.workorders.IWorkOrderView;
import com.minecolonies.api.network.IMessage;
import net.minecraft.core.BlockPos;
import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.entity.player.Player;
Expand All @@ -24,14 +19,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.function.Predicate;

public interface IColonyView extends IColony
Expand Down Expand Up @@ -281,22 +269,11 @@ public interface IColonyView extends IColony
IMessage handleColonyBuildingViewMessage(BlockPos buildingId, @NotNull FriendlyByteBuf buf);

/**
* Add or update a ColonyView's fields given a network data ColonyView update packet.
*
* @param type the field type.
* @param position the field position.
* @param buf buffer containing field information.
*/
void handleColonyFieldViewMessage(@NotNull FieldRegistries.FieldEntry type, @NotNull BlockPos position, @NotNull FriendlyByteBuf buf);

/**
* Removes a ColonyView's fields given a data ColonyView update packet.
* Update all field instances in the colony view.
*
* @param type the field type.
* @param position the field position.
* @param buf buffer containing field information.
* @param fields the list of fields.
*/
void handleColonyRemoveFieldViewMessage(@NotNull FieldRegistries.FieldEntry type, @NotNull BlockPos position, @NotNull FriendlyByteBuf buf);
void handleColonyFieldViewUpdateMessage(Set<IField> fields);

/**
* Get all fields.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,11 @@ public interface IRegisteredStructureManager
*/
void markBuildingsDirty();

/**
* Marks fields data dirty.
*/
void markFieldsDirty();

/**
* Creates a building from a tile entity and adds it to the colony.
*
Expand Down
18 changes: 3 additions & 15 deletions src/main/java/com/minecolonies/coremod/colony/ColonyView.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.minecolonies.api.colony.buildings.views.IBuildingView;
import com.minecolonies.api.colony.buildings.workerbuildings.ITownHallView;
import com.minecolonies.api.colony.fields.IField;
import com.minecolonies.api.colony.fields.registry.FieldRegistries;
import com.minecolonies.api.colony.managers.interfaces.*;
import com.minecolonies.api.colony.permissions.ColonyPlayer;
import com.minecolonies.api.colony.permissions.IPermissions;
Expand Down Expand Up @@ -57,7 +56,6 @@
import net.minecraft.world.scores.PlayerTeam;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.registries.ForgeRegistries;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -1106,20 +1104,10 @@ public IMessage handleColonyBuildingViewMessage(final BlockPos buildingId, @NotN
}

@Override
public void handleColonyFieldViewMessage(final @NotNull FieldRegistries.FieldEntry type, final @NonNull BlockPos position, @NotNull final FriendlyByteBuf buf)
public void handleColonyFieldViewUpdateMessage(final Set<IField> fields)
{
final IField fieldView = type.produceField(position);
fieldView.deserialize(buf);
fields.remove(fieldView);
fields.add(fieldView);
}

@Override
public void handleColonyRemoveFieldViewMessage(final @NotNull FieldRegistries.FieldEntry type, final @NonNull BlockPos position, @NotNull final FriendlyByteBuf buf)
{
final IField field = type.produceField(position);
field.deserialize(buf);
fields.remove(field);
this.fields.clear();
this.fields.addAll(fields);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,13 @@ public final boolean canAssignField(IField field)
return getOwnedFields().size() < getMaxFieldCount() && canAssignFieldOverride(field);
}

@Override
public void markDirty()
{
super.markDirty();
building.getColony().getBuildingManager().markFieldsDirty();
}

/**
* Additional checks to see if this field can be assigned to the building.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ public final class FieldDataManager
private static final String TAG_FIELD_POSITION = "position";
private static final String TAG_FIELD_DATA = "data";

private FieldDataManager()
{
}

/**
* Creates a field instance from NBT compound data.
*
* @param compound the input compound data.
* @return the created field instance.
*/
public static IField compoundToField(final @NotNull CompoundTag compound)
{
ResourceLocation fieldName = new ResourceLocation(compound.getString(TAG_FIELD_NAME));
Expand All @@ -33,6 +43,13 @@ public static IField compoundToField(final @NotNull CompoundTag compound)
return field;
}

/**
* Creates a field instance from a field type and position.
*
* @param fieldName the field registry entry name.
* @param position the position of the field.
* @return the field instance.
*/
public static IField resourceLocationToField(final @NotNull ResourceLocation fieldName, final @NotNull BlockPos position)
{
final FieldRegistries.FieldEntry fieldEntry = FieldRegistries.getFieldRegistry().getValue(fieldName);
Expand All @@ -46,6 +63,12 @@ public static IField resourceLocationToField(final @NotNull ResourceLocation fie
return fieldEntry.produceField(position);
}

/**
* Creates a field instance from a complete network buffer.
*
* @param buf the buffer, still containing the field registry type and position.
* @return the field instance.
*/
public static IField bufferToField(final @NotNull FriendlyByteBuf buf)
{
final FieldRegistries.FieldEntry fieldType = buf.readRegistryIdSafe(FieldRegistries.FieldEntry.class);
Expand All @@ -55,6 +78,12 @@ public static IField bufferToField(final @NotNull FriendlyByteBuf buf)
return field;
}

/**
* Creates a network buffer from a field instance.
*
* @param field the field instance.
* @return the network buffer.
*/
public static FriendlyByteBuf fieldToBuffer(final @NotNull IField field)
{
final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer());
Expand All @@ -64,6 +93,12 @@ public static FriendlyByteBuf fieldToBuffer(final @NotNull IField field)
return buf;
}

/**
* Creates NBT compound data from a field instance.
*
* @param field the field instance.
* @return the NBT compound.
*/
public static CompoundTag fieldToCompound(final @NotNull IField field)
{
final CompoundTag compound = new CompoundTag();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.minecolonies.api.colony.IColony;
import com.minecolonies.api.colony.IColonyTagCapability;
import com.minecolonies.api.colony.buildings.*;
import com.minecolonies.api.colony.buildings.modules.AbstractBuildingModule;
import com.minecolonies.api.colony.buildings.registry.BuildingEntry;
import com.minecolonies.api.colony.buildings.registry.IBuildingDataManager;
import com.minecolonies.api.colony.buildings.workerbuildings.ITownHall;
Expand Down Expand Up @@ -35,9 +34,8 @@
import com.minecolonies.coremod.colony.fields.registry.FieldDataManager;
import com.minecolonies.coremod.entity.ai.citizen.builder.ConstructionTapeHelper;
import com.minecolonies.coremod.network.messages.client.colony.ColonyViewBuildingViewMessage;
import com.minecolonies.coremod.network.messages.client.colony.ColonyViewFieldViewMessage;
import com.minecolonies.coremod.network.messages.client.colony.ColonyViewFieldsUpdateMessage;
import com.minecolonies.coremod.network.messages.client.colony.ColonyViewRemoveBuildingMessage;
import com.minecolonies.coremod.network.messages.client.colony.ColonyViewRemoveFieldViewMessage;
import com.minecolonies.coremod.quests.objectives.IBuildingUpgradeObjectiveTemplate;
import com.minecolonies.coremod.tileentities.TileEntityDecorationController;
import net.minecraft.core.BlockPos;
Expand Down Expand Up @@ -796,13 +794,10 @@ public void removeMysticalSite(final IMysticalSite mysticalSite)
/**
* Updates all subscribers of fields etc.
*/
private void markFieldsDirty()
@Override
public void markFieldsDirty()
{
isFieldsDirty = true;
for (IBuilding building : buildings.values())
{
building.getFirstOptionalModuleOccurance(FieldsModule.class).ifPresent(AbstractBuildingModule::markDirty);
}
}

/**
Expand Down Expand Up @@ -875,10 +870,7 @@ private void sendFieldPackets(final Set<ServerPlayer> closeSubscribers, final Se
players.addAll(closeSubscribers);
}
players.addAll(newSubscribers);
for (final IField field : fields)
{
players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewFieldViewMessage(colony, field), player));
}
players.forEach(player -> Network.getNetwork().sendToPlayer(new ColonyViewFieldsUpdateMessage(colony, fields), player));
}
}

Expand Down Expand Up @@ -987,7 +979,6 @@ public void removeField(Predicate<IField> matcher)
for (IField field : fieldsToRemove)
{
fields.remove(field);
Network.getNetwork().sendToEveryone(new ColonyViewRemoveFieldViewMessage(colony, field));
markFieldsDirty();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,7 @@ public void registerCommonMessages()
registerMessage(++idx, ColonyViewRemoveCitizenMessage.class, ColonyViewRemoveCitizenMessage::new);
registerMessage(++idx, ColonyViewBuildingViewMessage.class, ColonyViewBuildingViewMessage::new);
registerMessage(++idx, ColonyViewRemoveBuildingMessage.class, ColonyViewRemoveBuildingMessage::new);
registerMessage(++idx, ColonyViewFieldViewMessage.class, ColonyViewFieldViewMessage::new);
registerMessage(++idx, ColonyViewRemoveFieldViewMessage.class, ColonyViewRemoveFieldViewMessage::new);
registerMessage(++idx, ColonyViewFieldsUpdateMessage.class, ColonyViewFieldsUpdateMessage::new);
registerMessage(++idx, PermissionsMessage.View.class, PermissionsMessage.View::new);
registerMessage(++idx, ColonyViewWorkOrderMessage.class, ColonyViewWorkOrderMessage::new);
registerMessage(++idx, ColonyViewRemoveWorkOrderMessage.class, ColonyViewRemoveWorkOrderMessage::new);
Expand Down
Loading

0 comments on commit bc7ee36

Please sign in to comment.