From 08aacefc268e4ad7b75f8506a8e0a25d7c9f35ec Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 2 Feb 2019 13:23:49 +0200 Subject: [PATCH] Fixed player abilities not being synchronised when switching dimensions --- .../unicopia/forgebullshit/FBS.java | 12 +++++++++++ .../unicopia/player/IRaceContainer.java | 1 + .../unicopia/player/ItemCapabilities.java | 5 +++++ .../unicopia/player/PlayerCapabilities.java | 21 ++++++++++++++++--- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/forgebullshit/FBS.java b/src/main/java/com/minelittlepony/unicopia/forgebullshit/FBS.java index 7ffa5165..91b93aaf 100644 --- a/src/main/java/com/minelittlepony/unicopia/forgebullshit/FBS.java +++ b/src/main/java/com/minelittlepony/unicopia/forgebullshit/FBS.java @@ -9,6 +9,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.EntityTravelToDimensionEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -46,6 +47,17 @@ public class FBS { clone.getPlayer().copyFrom(original.getPlayer()); } + @SubscribeEvent + public static void onDimensionalTravel(EntityTravelToDimensionEvent event) { + final ICapabilitiesProxyContainer original = of(event.getEntity()); + + if (original == null) { + return; + } + + original.getRaceContainer().onDimensionalTravel(event.getDimension()); + } + @SuppressWarnings("unchecked") public static ICapabilitiesProxyContainer of(T entity) { if (entity.hasCapability(DefaultEntityCapabilitiesProxyContainer.CAPABILITY, EnumFacing.DOWN)) { diff --git a/src/main/java/com/minelittlepony/unicopia/player/IRaceContainer.java b/src/main/java/com/minelittlepony/unicopia/player/IRaceContainer.java index 23442b17..13c8fcab 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/IRaceContainer.java +++ b/src/main/java/com/minelittlepony/unicopia/player/IRaceContainer.java @@ -10,4 +10,5 @@ public interface IRaceContainer extends InbtSerialisable, IUpd void setPlayerSpecies(Race race); + void onDimensionalTravel(int destinationDimension); } diff --git a/src/main/java/com/minelittlepony/unicopia/player/ItemCapabilities.java b/src/main/java/com/minelittlepony/unicopia/player/ItemCapabilities.java index 8d2a2a79..00b4f4c4 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/ItemCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/player/ItemCapabilities.java @@ -42,6 +42,11 @@ class ItemCapabilities implements IRaceContainer, IOwned this.owner = owner; } + @Override + public void onDimensionalTravel(int destinationDimension) { + + } + @Override public EntityItem getOwner() { return owner; diff --git a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java index 1da1f618..00c4f205 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java @@ -67,6 +67,8 @@ class PlayerCapabilities implements IPlayer { private EntityPlayer entity; + private boolean dirty = false; + PlayerCapabilities(EntityPlayer player) { setOwner(player); @@ -133,7 +135,9 @@ class PlayerCapabilities implements IPlayer { @Override public void sendCapabilities(boolean full) { - if (!getOwner().getEntityWorld().isRemote) { + dirty = false; + + if (!getWorld().isRemote) { if (full) { Unicopia.channel.broadcast(new MsgPlayerCapabilities(this)); } else { @@ -142,6 +146,13 @@ class PlayerCapabilities implements IPlayer { } } + @Override + public void onDimensionalTravel(int destinationDimension) { + if (!getWorld().isRemote) { + dirty = true; + } + } + @Override public IAbilityReceiver getAbilities() { return powers; @@ -201,11 +212,15 @@ class PlayerCapabilities implements IPlayer { addEnergy(-1); attributes.applyAttributes(entity, getPlayerSpecies()); + + if (dirty) { + sendCapabilities(true); + } } @Override public void onFall(float distance, float damageMultiplier) { - if (!entity.getEntityWorld().isRemote) { + if (!getWorld().isRemote) { if (getPlayerSpecies().canFly()) { if (entity.fallDistance > 2) { entity.addStat(StatList.FALL_ONE_CM, (int)Math.round(distance * 100)); @@ -298,6 +313,7 @@ class PlayerCapabilities implements IPlayer { @Override public void copyFrom(IPlayer oldPlayer) { + pages.addAll(oldPlayer.getUnlockedPages()); setEffect(oldPlayer.getEffect()); setPlayerSpecies(oldPlayer.getPlayerSpecies()); } @@ -337,5 +353,4 @@ class PlayerCapabilities implements IPlayer { public List getUnlockedPages() { return pages; } - }