From d41c0029919ef4ab2d0c68b937f94e072291959e Mon Sep 17 00:00:00 2001 From: CreepyCre Date: Fri, 19 Feb 2021 21:40:08 +0100 Subject: [PATCH] PocketAddon WIP stuff --- .../pocket/type/addon/AddonContainer.java | 63 +++++++++++++++++++ .../type/addon/AutoSyncedAddonContainer.java | 23 +++++++ .../pocket/type/addon/ContainedAddon.java | 36 +++++++++++ .../addon/blockbreak/BlockBreakContainer.java | 15 +++++ .../BlockBreakRegexBlacklistAddon.java | 45 +++++++++++++ .../blockbreak/TryBlockBreakEventAddon.java | 10 +++ 6 files changed, 192 insertions(+) create mode 100644 src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AddonContainer.java create mode 100644 src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AutoSyncedAddonContainer.java create mode 100644 src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/ContainedAddon.java create mode 100644 src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakContainer.java create mode 100644 src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakRegexBlacklistAddon.java create mode 100644 src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/TryBlockBreakEventAddon.java diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AddonContainer.java b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AddonContainer.java new file mode 100644 index 00000000..32182b33 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AddonContainer.java @@ -0,0 +1,63 @@ +package org.dimdev.dimdoors.world.pocket.type.addon; + +import net.fabricmc.fabric.api.util.NbtType; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public abstract class AddonContainer implements PocketAddon { + protected Identifier id; + protected List addons = new ArrayList<>(); + + public AddonContainer() { + } + + public void setId(Identifier id) { + this.id = id; + } + + public void addAll(Collection addons) { + this.addons.addAll(addons); + } + + public void add(T addon) { + this.addons.add(addon); + } + + @Override + public PocketAddon fromTag(CompoundTag tag) { + this.id = Identifier.tryParse(tag.getString("id")); + + if (tag.contains("addons", NbtType.LIST)) { + for (Tag addonTag : tag.getList("addons", NbtType.COMPOUND)) { + addons.add((T) PocketAddon.deserialize((CompoundTag) addonTag)); + } + } + + return this; + } + + @Override + public CompoundTag toTag(CompoundTag tag) { + PocketAddon.super.toTag(tag); + + ListTag addonsTag = new ListTag(); + for(T addon : addons) { + addonsTag.add(addon.toTag(new CompoundTag())); + } + tag.put("addons", addonsTag); + + return null; + } + + @Override + public Identifier getId() { + return id; + } +} + diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AutoSyncedAddonContainer.java b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AutoSyncedAddonContainer.java new file mode 100644 index 00000000..4f6afd0d --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/AutoSyncedAddonContainer.java @@ -0,0 +1,23 @@ +package org.dimdev.dimdoors.world.pocket.type.addon; + +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.Identifier; + +import java.io.IOException; + +abstract public class AutoSyncedAddonContainer extends AddonContainer implements AutoSyncedAddon { + @Override + public AutoSyncedAddon read(PacketByteBuf buf) throws IOException { + id = Identifier.tryParse(buf.readString()); + addons = AutoSyncedAddon.readAutoSyncedAddonList(buf); + + return this; + } + + @Override + public PacketByteBuf write(PacketByteBuf buf) throws IOException { + buf.writeString(id.toString()); + AutoSyncedAddon.writeAutoSyncedAddonList(buf, addons); + return buf; + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/ContainedAddon.java b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/ContainedAddon.java new file mode 100644 index 00000000..5c20606b --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/ContainedAddon.java @@ -0,0 +1,36 @@ +package org.dimdev.dimdoors.world.pocket.type.addon; + + +import net.minecraft.util.Identifier; +import org.dimdev.dimdoors.world.pocket.type.Pocket; + +import java.util.Map; + +public interface ContainedAddon extends PocketAddon { + Identifier getContainerId(); + + @Override + default void addAddon(Map addons) { + throw new UnsupportedOperationException("ContainedEventListenerAddons cannot be attach to a Pocket directly"); + } + + interface ContainedBuilderAddon extends PocketAddon.PocketBuilderAddon { + Identifier getContainerId(); + + AddonContainer supplyContainer(); + + @Override + default void apply(Pocket pocket) { + AddonContainer container; + if (pocket.hasAddon(getContainerId())) { + container = pocket.getAddon(getContainerId()); + } else { + container = supplyContainer(); + pocket.addAddon(container); + } + container.add(buildAddon()); + } + + T buildAddon(); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakContainer.java b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakContainer.java new file mode 100644 index 00000000..9d17c909 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakContainer.java @@ -0,0 +1,15 @@ +package org.dimdev.dimdoors.world.pocket.type.addon.blockbreak; + +import net.minecraft.util.Identifier; +import org.dimdev.dimdoors.world.pocket.type.addon.AutoSyncedAddonContainer; +import org.dimdev.dimdoors.world.pocket.type.addon.PocketAddon; + +// TODO +public class BlockBreakContainer extends AutoSyncedAddonContainer { + public static Identifier ID = new Identifier("dimdoors", "block_break_container"); + + @Override + public PocketAddonType getType() { + return PocketAddonType.BLOCK_BREAK_CONTAINER; + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakRegexBlacklistAddon.java b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakRegexBlacklistAddon.java new file mode 100644 index 00000000..b5a356c0 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/BlockBreakRegexBlacklistAddon.java @@ -0,0 +1,45 @@ +package org.dimdev.dimdoors.world.pocket.type.addon.blockbreak; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.Identifier; +import org.dimdev.dimdoors.world.pocket.type.addon.AutoSyncedAddon; +import org.dimdev.dimdoors.world.pocket.type.addon.ContainedAddon; +import org.dimdev.dimdoors.world.pocket.type.addon.PocketAddon; + +import java.io.IOException; + +// TODO +public class BlockBreakRegexBlacklistAddon implements AutoSyncedAddon, ContainedAddon { //TODO + @Override + public AutoSyncedAddon read(PacketByteBuf buf) throws IOException { + this.fromTag(buf.readCompoundTag()); + return this; + } + + @Override + public PacketByteBuf write(PacketByteBuf buf) throws IOException { + buf.writeCompoundTag(this.toTag(new CompoundTag())); + return buf; + } + + @Override + public Identifier getContainerId() { + return BlockBreakContainer.ID; + } + + @Override + public PocketAddon fromTag(CompoundTag tag) { + return null; + } + + @Override + public PocketAddonType getType() { + return null; + } + + @Override + public Identifier getId() { + return null; + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/TryBlockBreakEventAddon.java b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/TryBlockBreakEventAddon.java new file mode 100644 index 00000000..6c0de544 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/pocket/type/addon/blockbreak/TryBlockBreakEventAddon.java @@ -0,0 +1,10 @@ +package org.dimdev.dimdoors.world.pocket.type.addon.blockbreak; + +import net.fabricmc.fabric.api.event.player.AttackBlockCallback; +import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import org.dimdev.dimdoors.world.pocket.type.addon.AutoSyncedAddon; +import org.dimdev.dimdoors.world.pocket.type.addon.ContainedAddon; + +// TODO +public interface TryBlockBreakEventAddon extends AttackBlockCallback, PlayerBlockBreakEvents.Before, ContainedAddon, AutoSyncedAddon { +}