From 39308442089af31d28ce27131f4436b3062f12ca Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Sun, 12 Sep 2021 16:58:09 +0200 Subject: [PATCH] Fixed capabilities and setup events. --- .../EffortlessBuilding.java | 8 +---- .../effortlessbuilding/EventHandler.java | 9 ++++- .../buildmode/ModeSettingsManager.java | 20 +++++++---- .../ModifierSettingsManager.java | 21 +++++++---- .../capability/ModeCapabilityManager.java | 35 ++++++++++++++----- .../capability/ModifierCapabilityManager.java | 33 +++++++++++++---- .../network/PacketHandler.java | 12 +++---- 7 files changed, 97 insertions(+), 41 deletions(-) diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index ccdb8b6..a0ba9b2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -64,7 +64,7 @@ public class EffortlessBuilding { instance = this; // Register ourselves for server and other game events we are interested in - MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().register(this); ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus()); CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus()); @@ -89,7 +89,6 @@ public class EffortlessBuilding { @SubscribeEvent public void clientSetup(final FMLClientSetupEvent event) { - proxy.clientSetup(event); } @@ -99,11 +98,6 @@ public class EffortlessBuilding { event.register(ModeCapabilityManager.IModeCapability.class); } - @SubscribeEvent - public void onServerStarting(FMLServerStartingEvent event) { - CommandReach.register(event.getServer().getCommands().getDispatcher()); - } - public static void log(String msg) { logger.info(msg); } diff --git a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java index addb63a..3c771c1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EventHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/EventHandler.java @@ -15,6 +15,7 @@ import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fmllegacy.network.PacketDistributor; +import net.minecraftforge.fmlserverevents.FMLServerStartingEvent; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers; @@ -22,6 +23,7 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager; import nl.requios.effortlessbuilding.buildmodifier.UndoRedo; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; +import nl.requios.effortlessbuilding.command.CommandReach; import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.network.AddUndoMessage; @@ -31,7 +33,7 @@ import nl.requios.effortlessbuilding.network.RequestLookAtMessage; import java.util.List; -@Mod.EventBusSubscriber(modid = EffortlessBuilding.MODID) +@Mod.EventBusSubscriber(modid = EffortlessBuilding.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class EventHandler { @SubscribeEvent @@ -43,6 +45,11 @@ public class EventHandler { } } + @SubscribeEvent + public void onServerStarting(FMLServerStartingEvent event) { + CommandReach.register(event.getServer().getCommands().getDispatcher()); + } + @SubscribeEvent //Only called serverside (except with lilypads...) public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java index a173d82..c929fed 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeSettingsManager.java @@ -16,22 +16,30 @@ import javax.annotation.Nonnull; @Mod.EventBusSubscriber public class ModeSettingsManager { - //Retrieves the buildsettings of a player through the modifierCapability capability + private static ModeSettings cache = null; + + //Retrieves the buildsettings of a player through the modeCapability capability //Never returns null @Nonnull public static ModeSettings getModeSettings(Player player) { + if (cache != null) return cache; + LazyOptional modeCapability = - player.getCapability(ModeCapabilityManager.modeCapability, null); + player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null); if (modeCapability.isPresent()) { ModeCapabilityManager.IModeCapability capability = modeCapability.orElse(null); - if (capability.getModeData() == null) { - capability.setModeData(new ModeSettings()); + cache = capability.getModeData(); + if (cache == null) { + cache = new ModeSettings(); + capability.setModeData(cache); } + //Add invalidation listener, to invalidate cache + modeCapability.addListener(self -> cache = null); return capability.getModeData(); } - //Player does not have modeCapability capability + EffortlessBuilding.logger.warn("Player does not have modeCapability: " + player); //Return dummy settings return new ModeSettings(); // throw new IllegalArgumentException("Player does not have modeCapability capability"); @@ -43,7 +51,7 @@ public class ModeSettingsManager { return; } LazyOptional modeCapability = - player.getCapability(ModeCapabilityManager.modeCapability, null); + player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null); modeCapability.ifPresent((capability) -> { capability.setModeData(modeSettings); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java index af7640a..bfb55b6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/ModifierSettingsManager.java @@ -17,25 +17,32 @@ import javax.annotation.Nonnull; @Mod.EventBusSubscriber public class ModifierSettingsManager { + private static ModifierSettings cache = null; + //Retrieves the buildsettings of a player through the modifierCapability capability //Never returns null @Nonnull public static ModifierSettings getModifierSettings(Player player) { + if (cache != null) return cache; + LazyOptional modifierCapability = - player.getCapability(ModifierCapabilityManager.modifierCapability, null); + player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null); if (modifierCapability.isPresent()) { ModifierCapabilityManager.IModifierCapability capability = modifierCapability.orElse(null); - if (capability.getModifierData() == null) { - capability.setModifierData(new ModifierSettings()); + cache = capability.getModifierData(); + if (cache == null) { + cache = new ModifierSettings(); + capability.setModifierData(cache); } - return capability.getModifierData(); + //Add invalidation listener, to invalidate cache + modifierCapability.addListener(self -> cache = null); + return cache; } - //Player does not have modifierCapability capability + EffortlessBuilding.logger.warn("Player does not have modifierCapability: " + player); //Return dummy settings return new ModifierSettings(); -// throw new IllegalArgumentException("Player does not have modifierCapability capability"); } public static void setModifierSettings(Player player, ModifierSettings modifierSettings) { @@ -45,7 +52,7 @@ public class ModifierSettingsManager { } LazyOptional modifierCapability = - player.getCapability(ModifierCapabilityManager.modifierCapability, null); + player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null); modifierCapability.ifPresent((capability) -> { capability.setModifierData(modifierSettings); diff --git a/src/main/java/nl/requios/effortlessbuilding/capability/ModeCapabilityManager.java b/src/main/java/nl/requios/effortlessbuilding/capability/ModeCapabilityManager.java index 86dfdef..b544593 100644 --- a/src/main/java/nl/requios/effortlessbuilding/capability/ModeCapabilityManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/capability/ModeCapabilityManager.java @@ -5,6 +5,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.core.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.common.capabilities.CapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.event.entity.player.PlayerEvent; @@ -15,21 +16,19 @@ import nl.requios.effortlessbuilding.buildmode.BuildModes; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import static nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings; - import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings; @Mod.EventBusSubscriber public class ModeCapabilityManager { @CapabilityInject(IModeCapability.class) - public final static Capability modeCapability = null; + public final static Capability MODE_CAPABILITY = null; // Allows for the capability to persist after death. @SubscribeEvent public static void clonePlayer(PlayerEvent.Clone event) { - LazyOptional original = event.getOriginal().getCapability(modeCapability, null); - LazyOptional clone = event.getEntity().getCapability(modeCapability, null); + LazyOptional original = event.getOriginal().getCapability(MODE_CAPABILITY, null); + LazyOptional clone = event.getEntity().getCapability(MODE_CAPABILITY, null); clone.ifPresent(cloneModeCapability -> original.ifPresent(originalModeCapability -> cloneModeCapability.setModeData(originalModeCapability.getModeData()))); @@ -55,13 +54,33 @@ public class ModeCapabilityManager { } } - public static class Provider implements ICapabilitySerializable { - IModeCapability instance = new ModeCapability(); + public static class Provider extends CapabilityProvider implements ICapabilitySerializable { + + private IModeCapability instance = new ModeCapability(); + private LazyOptional modeCapabilityOptional = LazyOptional.of(() -> instance); + + public Provider() { + super(Provider.class); + gatherCapabilities(); + } @Nonnull @Override public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - return modeCapability.orEmpty(cap, LazyOptional.of(() -> instance)); + if (cap == MODE_CAPABILITY) return modeCapabilityOptional.cast(); + return LazyOptional.empty(); + } + + @Override + public void invalidateCaps() { + super.invalidateCaps(); + modeCapabilityOptional.invalidate(); + } + + @Override + public void reviveCaps() { + super.reviveCaps(); + modeCapabilityOptional = LazyOptional.of(() -> instance); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/capability/ModifierCapabilityManager.java b/src/main/java/nl/requios/effortlessbuilding/capability/ModifierCapabilityManager.java index 2412af7..8a1740c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/capability/ModifierCapabilityManager.java +++ b/src/main/java/nl/requios/effortlessbuilding/capability/ModifierCapabilityManager.java @@ -7,7 +7,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.common.capabilities.CapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -25,13 +27,13 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.Modif public class ModifierCapabilityManager { @CapabilityInject(IModifierCapability.class) - public final static Capability modifierCapability = null; + public final static Capability MODIFIER_CAPABILITY = null; // Allows for the capability to persist after death. @SubscribeEvent public static void clonePlayer(PlayerEvent.Clone event) { - LazyOptional original = event.getOriginal().getCapability(modifierCapability, null); - LazyOptional clone = event.getEntity().getCapability(modifierCapability, null); + LazyOptional original = event.getOriginal().getCapability(MODIFIER_CAPABILITY, null); + LazyOptional clone = event.getEntity().getCapability(MODIFIER_CAPABILITY, null); clone.ifPresent(cloneModifierCapability -> original.ifPresent(originalModifierCapability -> cloneModifierCapability.setModifierData(originalModifierCapability.getModifierData()))); @@ -57,14 +59,33 @@ public class ModifierCapabilityManager { } } - public static class Provider implements ICapabilitySerializable { + public static class Provider extends CapabilityProvider implements INBTSerializable { - IModifierCapability instance = new ModifierCapability(); + private final IModifierCapability instance = new ModifierCapability(); + private LazyOptional modifierCapabilityOptional = LazyOptional.of(() -> instance); + + public Provider() { + super(Provider.class); + gatherCapabilities(); + } @Nonnull @Override public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - return modifierCapability.orEmpty(cap, LazyOptional.of(() -> instance)); + if (cap == MODIFIER_CAPABILITY) return modifierCapabilityOptional.cast(); + return LazyOptional.empty(); + } + + @Override + public void invalidateCaps() { + super.invalidateCaps(); + modifierCapabilityOptional.invalidate(); + } + + @Override + public void reviveCaps() { + super.reviveCaps(); + modifierCapabilityOptional = LazyOptional.of(() -> instance); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java b/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java index 4d05918..550c3b5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java @@ -7,12 +7,12 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; public class PacketHandler { private static final String PROTOCOL_VERSION = "1"; - public static final SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder - .named(new ResourceLocation(EffortlessBuilding.MODID, "main_channel")) - .clientAcceptedVersions(PROTOCOL_VERSION::equals) - .serverAcceptedVersions(PROTOCOL_VERSION::equals) - .networkProtocolVersion(() -> PROTOCOL_VERSION) - .simpleChannel(); + public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( + new ResourceLocation(EffortlessBuilding.MODID, "main_channel"), + () -> PROTOCOL_VERSION, + PROTOCOL_VERSION::equals, + PROTOCOL_VERSION::equals + ); public static void register() { int id = 0;