diff --git a/src/main/java/com/modularmc/synceddata/SyncedData.java b/src/main/java/com/modularmc/synceddata/SyncedData.java index e4a4d09..8bd36d0 100644 --- a/src/main/java/com/modularmc/synceddata/SyncedData.java +++ b/src/main/java/com/modularmc/synceddata/SyncedData.java @@ -22,9 +22,9 @@ public class SyncedData { public static final String MOD_ID = "synced"; - public static final String MOD_NAME = "SyncedData"; + public static final String MOD_NAME = "SyncedData Lib"; public static final Logger LOGGER = LogManager.getLogger(MOD_NAME); - public static final Codec GTCEU_ID = Codec.STRING.comapFlatMap( + public static final Codec SyncedData_ID = Codec.STRING.comapFlatMap( str -> Identifier.read(appendIdString(str)), s -> s.getNamespace().equals(MOD_ID) ? s.getPath() : s.toString()); public static final Path SYNCED_FOLDER = getGameDir().resolve("synced"); diff --git a/src/main/java/com/modularmc/synceddata/api/blockentity/BlockEntityCreationInfo.java b/src/main/java/com/modularmc/synceddata/api/blockentity/BlockEntityCreationInfo.java new file mode 100644 index 0000000..71f5e3c --- /dev/null +++ b/src/main/java/com/modularmc/synceddata/api/blockentity/BlockEntityCreationInfo.java @@ -0,0 +1,7 @@ +package com.modularmc.synceddata.api.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public record BlockEntityCreationInfo(BlockEntityType type, BlockPos pos, BlockState state) {} diff --git a/src/main/java/com/modularmc/synceddata/api/sync_system/ISyncManaged.java b/src/main/java/com/modularmc/synceddata/api/sync_system/ISyncManaged.java new file mode 100644 index 0000000..8937124 --- /dev/null +++ b/src/main/java/com/modularmc/synceddata/api/sync_system/ISyncManaged.java @@ -0,0 +1,16 @@ +package com.modularmc.synceddata.api.sync_system; + +public interface ISyncManaged { + + SyncDataHolder getSyncDataHolder(); + + /** + * Function called when a synced field requests a rerender + */ + void scheduleRenderUpdate(); + + /** + * Function called to notify the server that this object has been updated and must be synced to clients + */ + void markAsChanged(); +} diff --git a/src/main/java/com/modularmc/synceddata/api/sync_system/ManagedSyncBlockEntity.java b/src/main/java/com/modularmc/synceddata/api/sync_system/ManagedSyncBlockEntity.java new file mode 100644 index 0000000..255865e --- /dev/null +++ b/src/main/java/com/modularmc/synceddata/api/sync_system/ManagedSyncBlockEntity.java @@ -0,0 +1,45 @@ +package com.modularmc.synceddata.api.sync_system; + +import com.modularmc.synceddata.api.blockentity.BlockEntityCreationInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Objects; + +public abstract class ManagedSyncBlockEntity extends BlockEntity implements ISyncManaged { + + @Getter + protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + @Getter + @Setter + private boolean isDirty; + + public ManagedSyncBlockEntity(BlockEntityCreationInfo info) { + super(info.type(), info.pos(), info.state()); + } + + public ManagedSyncBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { + super(type, pos, blockState); + } + + @Override + public final void markAsChanged() { + isDirty = true; + } + + public final void updateTick() { + setChanged(); + if (isDirty) { + Objects.requireNonNull(getLevel()).sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), + Block.UPDATE_CLIENTS); + isDirty = false; + } + } +} diff --git a/src/main/java/com/modularmc/synceddata/api/sync_system/SyncDataHolder.java b/src/main/java/com/modularmc/synceddata/api/sync_system/SyncDataHolder.java new file mode 100644 index 0000000..643df44 --- /dev/null +++ b/src/main/java/com/modularmc/synceddata/api/sync_system/SyncDataHolder.java @@ -0,0 +1,16 @@ +package com.modularmc.synceddata.api.sync_system; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import it.unimi.dsi.fastutil.objects.ObjectSet; + +public class SyncDataHolder { + + private final ISyncManaged holder; + + private final ObjectSet dirtySyncFields = new ObjectOpenHashSet<>(); + private boolean resyncAll = false; + + public SyncDataHolder(ISyncManaged o) { + holder = o; + } +} diff --git a/src/main/resources/assets/synceddata/lang/en_us.json b/src/main/resources/assets/synceddata/lang/en_us.json deleted file mode 100644 index cc4c85b..0000000 --- a/src/main/resources/assets/synceddata/lang/en_us.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "itemGroup.synceddata": "Example Mod Tab", - "block.synceddata.example_block": "Example Block", - "item.synceddata.example_item": "Example Item" -}