Fixed capabilities and setup events.

This commit is contained in:
Christian Knaapen
2021-09-12 16:58:09 +02:00
parent d9df8b0d0e
commit 3930844208
7 changed files with 97 additions and 41 deletions

View File

@@ -64,7 +64,7 @@ public class EffortlessBuilding {
instance = this; instance = this;
// Register ourselves for server and other game events we are interested in // 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()); ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus()); CONTAINERS.register(FMLJavaModLoadingContext.get().getModEventBus());
@@ -89,7 +89,6 @@ public class EffortlessBuilding {
@SubscribeEvent @SubscribeEvent
public void clientSetup(final FMLClientSetupEvent event) { public void clientSetup(final FMLClientSetupEvent event) {
proxy.clientSetup(event); proxy.clientSetup(event);
} }
@@ -99,11 +98,6 @@ public class EffortlessBuilding {
event.register(ModeCapabilityManager.IModeCapability.class); event.register(ModeCapabilityManager.IModeCapability.class);
} }
@SubscribeEvent
public void onServerStarting(FMLServerStartingEvent event) {
CommandReach.register(event.getServer().getCommands().getDispatcher());
}
public static void log(String msg) { public static void log(String msg) {
logger.info(msg); logger.info(msg);
} }

View File

@@ -15,6 +15,7 @@ import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fmllegacy.network.PacketDistributor; import net.minecraftforge.fmllegacy.network.PacketDistributor;
import net.minecraftforge.fmlserverevents.FMLServerStartingEvent;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager;
import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers; 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.buildmodifier.UndoRedo;
import nl.requios.effortlessbuilding.capability.ModeCapabilityManager; import nl.requios.effortlessbuilding.capability.ModeCapabilityManager;
import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager; import nl.requios.effortlessbuilding.capability.ModifierCapabilityManager;
import nl.requios.effortlessbuilding.command.CommandReach;
import nl.requios.effortlessbuilding.helper.ReachHelper; import nl.requios.effortlessbuilding.helper.ReachHelper;
import nl.requios.effortlessbuilding.helper.SurvivalHelper; import nl.requios.effortlessbuilding.helper.SurvivalHelper;
import nl.requios.effortlessbuilding.network.AddUndoMessage; import nl.requios.effortlessbuilding.network.AddUndoMessage;
@@ -31,7 +33,7 @@ import nl.requios.effortlessbuilding.network.RequestLookAtMessage;
import java.util.List; import java.util.List;
@Mod.EventBusSubscriber(modid = EffortlessBuilding.MODID) @Mod.EventBusSubscriber(modid = EffortlessBuilding.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
public class EventHandler { public class EventHandler {
@SubscribeEvent @SubscribeEvent
@@ -43,6 +45,11 @@ public class EventHandler {
} }
} }
@SubscribeEvent
public void onServerStarting(FMLServerStartingEvent event) {
CommandReach.register(event.getServer().getCommands().getDispatcher());
}
@SubscribeEvent @SubscribeEvent
//Only called serverside (except with lilypads...) //Only called serverside (except with lilypads...)
public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) { public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) {

View File

@@ -16,22 +16,30 @@ import javax.annotation.Nonnull;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ModeSettingsManager { 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 //Never returns null
@Nonnull @Nonnull
public static ModeSettings getModeSettings(Player player) { public static ModeSettings getModeSettings(Player player) {
if (cache != null) return cache;
LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability = LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability =
player.getCapability(ModeCapabilityManager.modeCapability, null); player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null);
if (modeCapability.isPresent()) { if (modeCapability.isPresent()) {
ModeCapabilityManager.IModeCapability capability = modeCapability.orElse(null); ModeCapabilityManager.IModeCapability capability = modeCapability.orElse(null);
if (capability.getModeData() == null) { cache = capability.getModeData();
capability.setModeData(new ModeSettings()); if (cache == null) {
cache = new ModeSettings();
capability.setModeData(cache);
} }
//Add invalidation listener, to invalidate cache
modeCapability.addListener(self -> cache = null);
return capability.getModeData(); return capability.getModeData();
} }
//Player does not have modeCapability capability EffortlessBuilding.logger.warn("Player does not have modeCapability: " + player);
//Return dummy settings //Return dummy settings
return new ModeSettings(); return new ModeSettings();
// throw new IllegalArgumentException("Player does not have modeCapability capability"); // throw new IllegalArgumentException("Player does not have modeCapability capability");
@@ -43,7 +51,7 @@ public class ModeSettingsManager {
return; return;
} }
LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability = LazyOptional<ModeCapabilityManager.IModeCapability> modeCapability =
player.getCapability(ModeCapabilityManager.modeCapability, null); player.getCapability(ModeCapabilityManager.MODE_CAPABILITY, null);
modeCapability.ifPresent((capability) -> { modeCapability.ifPresent((capability) -> {
capability.setModeData(modeSettings); capability.setModeData(modeSettings);

View File

@@ -17,25 +17,32 @@ import javax.annotation.Nonnull;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ModifierSettingsManager { public class ModifierSettingsManager {
private static ModifierSettings cache = null;
//Retrieves the buildsettings of a player through the modifierCapability capability //Retrieves the buildsettings of a player through the modifierCapability capability
//Never returns null //Never returns null
@Nonnull @Nonnull
public static ModifierSettings getModifierSettings(Player player) { public static ModifierSettings getModifierSettings(Player player) {
if (cache != null) return cache;
LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability = LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability =
player.getCapability(ModifierCapabilityManager.modifierCapability, null); player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null);
if (modifierCapability.isPresent()) { if (modifierCapability.isPresent()) {
ModifierCapabilityManager.IModifierCapability capability = modifierCapability.orElse(null); ModifierCapabilityManager.IModifierCapability capability = modifierCapability.orElse(null);
if (capability.getModifierData() == null) { cache = capability.getModifierData();
capability.setModifierData(new ModifierSettings()); 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 dummy settings
return new ModifierSettings(); return new ModifierSettings();
// throw new IllegalArgumentException("Player does not have modifierCapability capability");
} }
public static void setModifierSettings(Player player, ModifierSettings modifierSettings) { public static void setModifierSettings(Player player, ModifierSettings modifierSettings) {
@@ -45,7 +52,7 @@ public class ModifierSettingsManager {
} }
LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability = LazyOptional<ModifierCapabilityManager.IModifierCapability> modifierCapability =
player.getCapability(ModifierCapabilityManager.modifierCapability, null); player.getCapability(ModifierCapabilityManager.MODIFIER_CAPABILITY, null);
modifierCapability.ifPresent((capability) -> { modifierCapability.ifPresent((capability) -> {
capability.setModifierData(modifierSettings); capability.setModifierData(modifierSettings);

View File

@@ -5,6 +5,7 @@ import net.minecraft.nbt.Tag;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.CapabilityProvider;
import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
@@ -15,21 +16,19 @@ import nl.requios.effortlessbuilding.buildmode.BuildModes;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import static nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings;
import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings; import nl.requios.effortlessbuilding.buildmode.ModeSettingsManager.ModeSettings;
@Mod.EventBusSubscriber @Mod.EventBusSubscriber
public class ModeCapabilityManager { public class ModeCapabilityManager {
@CapabilityInject(IModeCapability.class) @CapabilityInject(IModeCapability.class)
public final static Capability<IModeCapability> modeCapability = null; public final static Capability<IModeCapability> MODE_CAPABILITY = null;
// Allows for the capability to persist after death. // Allows for the capability to persist after death.
@SubscribeEvent @SubscribeEvent
public static void clonePlayer(PlayerEvent.Clone event) { public static void clonePlayer(PlayerEvent.Clone event) {
LazyOptional<IModeCapability> original = event.getOriginal().getCapability(modeCapability, null); LazyOptional<IModeCapability> original = event.getOriginal().getCapability(MODE_CAPABILITY, null);
LazyOptional<IModeCapability> clone = event.getEntity().getCapability(modeCapability, null); LazyOptional<IModeCapability> clone = event.getEntity().getCapability(MODE_CAPABILITY, null);
clone.ifPresent(cloneModeCapability -> clone.ifPresent(cloneModeCapability ->
original.ifPresent(originalModeCapability -> original.ifPresent(originalModeCapability ->
cloneModeCapability.setModeData(originalModeCapability.getModeData()))); cloneModeCapability.setModeData(originalModeCapability.getModeData())));
@@ -55,13 +54,33 @@ public class ModeCapabilityManager {
} }
} }
public static class Provider implements ICapabilitySerializable<Tag> { public static class Provider extends CapabilityProvider<Provider> implements ICapabilitySerializable<Tag> {
IModeCapability instance = new ModeCapability();
private IModeCapability instance = new ModeCapability();
private LazyOptional<IModeCapability> modeCapabilityOptional = LazyOptional.of(() -> instance);
public Provider() {
super(Provider.class);
gatherCapabilities();
}
@Nonnull @Nonnull
@Override @Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> 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 @Override

View File

@@ -7,7 +7,9 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.CapabilityProvider;
import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -25,13 +27,13 @@ import nl.requios.effortlessbuilding.buildmodifier.ModifierSettingsManager.Modif
public class ModifierCapabilityManager { public class ModifierCapabilityManager {
@CapabilityInject(IModifierCapability.class) @CapabilityInject(IModifierCapability.class)
public final static Capability<IModifierCapability> modifierCapability = null; public final static Capability<IModifierCapability> MODIFIER_CAPABILITY = null;
// Allows for the capability to persist after death. // Allows for the capability to persist after death.
@SubscribeEvent @SubscribeEvent
public static void clonePlayer(PlayerEvent.Clone event) { public static void clonePlayer(PlayerEvent.Clone event) {
LazyOptional<IModifierCapability> original = event.getOriginal().getCapability(modifierCapability, null); LazyOptional<IModifierCapability> original = event.getOriginal().getCapability(MODIFIER_CAPABILITY, null);
LazyOptional<IModifierCapability> clone = event.getEntity().getCapability(modifierCapability, null); LazyOptional<IModifierCapability> clone = event.getEntity().getCapability(MODIFIER_CAPABILITY, null);
clone.ifPresent(cloneModifierCapability -> clone.ifPresent(cloneModifierCapability ->
original.ifPresent(originalModifierCapability -> original.ifPresent(originalModifierCapability ->
cloneModifierCapability.setModifierData(originalModifierCapability.getModifierData()))); cloneModifierCapability.setModifierData(originalModifierCapability.getModifierData())));
@@ -57,14 +59,33 @@ public class ModifierCapabilityManager {
} }
} }
public static class Provider implements ICapabilitySerializable<Tag> { public static class Provider extends CapabilityProvider<Provider> implements INBTSerializable<Tag> {
IModifierCapability instance = new ModifierCapability(); private final IModifierCapability instance = new ModifierCapability();
private LazyOptional<IModifierCapability> modifierCapabilityOptional = LazyOptional.of(() -> instance);
public Provider() {
super(Provider.class);
gatherCapabilities();
}
@Nonnull @Nonnull
@Override @Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> 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 @Override

View File

@@ -7,12 +7,12 @@ import nl.requios.effortlessbuilding.EffortlessBuilding;
public class PacketHandler { public class PacketHandler {
private static final String PROTOCOL_VERSION = "1"; private static final String PROTOCOL_VERSION = "1";
public static final SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
.named(new ResourceLocation(EffortlessBuilding.MODID, "main_channel")) new ResourceLocation(EffortlessBuilding.MODID, "main_channel"),
.clientAcceptedVersions(PROTOCOL_VERSION::equals) () -> PROTOCOL_VERSION,
.serverAcceptedVersions(PROTOCOL_VERSION::equals) PROTOCOL_VERSION::equals,
.networkProtocolVersion(() -> PROTOCOL_VERSION) PROTOCOL_VERSION::equals
.simpleChannel(); );
public static void register() { public static void register() {
int id = 0; int id = 0;