From d35130e525c89672a67951593ad2d1f1a95ab285 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Mon, 13 Feb 2017 15:23:28 +0100 Subject: [PATCH] Fixed weird player data updating in certain situations Closes #630 --- .../mod/ActuallyAdditions.java | 5 ++ .../mod/booklet/gui/GuiBooklet.java | 2 +- .../mod/booklet/gui/GuiMainPage.java | 2 +- .../mod/data/PlayerData.java | 34 +++++++----- .../actuallyadditions/mod/data/WorldData.java | 6 +++ .../mod/event/ClientEvents.java | 14 +++++ .../mod/event/CommonEvents.java | 2 +- .../mod/items/ItemWingsOfTheBats.java | 2 +- .../mod/network/PacketHandler.java | 53 ++++++++++++------- .../mod/network/PacketHandlerHelper.java | 42 +++++++++++---- 10 files changed, 117 insertions(+), 45 deletions(-) diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java index 6c023a006..17a332c42 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/ActuallyAdditions.java @@ -151,6 +151,11 @@ public class ActuallyAdditions{ } } + @EventHandler + public void serverStopped(FMLServerStoppedEvent event){ + WorldData.clear(); + } + @EventHandler public void missingMapping(FMLMissingMappingsEvent event){ int totalRemaps = 0; diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java index c96554151..025648482 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java @@ -151,7 +151,7 @@ public abstract class GuiBooklet extends GuiBookletBase{ data.lastOpenBooklet = this; if(change){ - PacketHandlerHelper.sendPlayerDataPacket(this.mc.player, true, false); + PacketHandlerHelper.sendPlayerDataToServer(true, 0); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java index fb5fc14de..27c60df18 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java @@ -247,7 +247,7 @@ public class GuiMainPage extends GuiBooklet{ PlayerSave data = PlayerData.getDataFromPlayer(this.mc.player); data.didBookTutorial = true; - PacketHandlerHelper.sendPlayerDataPacket(this.mc.player, true, false); + PacketHandlerHelper.sendPlayerDataToServer(true, 1); } } else{ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java b/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java index 5af2b045f..1a67f3fc0 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java @@ -71,13 +71,7 @@ public final class PlayerData{ this.batWingsFlyTime = compound.getInteger("BatWingsFlyTime"); NBTTagList bookmarks = compound.getTagList("Bookmarks", 8); - for(int i = 0; i < bookmarks.tagCount(); i++){ - String strg = bookmarks.getStringTagAt(i); - if(strg != null && !strg.isEmpty()){ - IBookletPage page = BookletUtils.getBookletPageById(strg); - this.bookmarks[i] = page; - } - } + this.loadBookmarks(bookmarks); if(!savingToFile){ this.shouldDisableBatWings = compound.getBoolean("ShouldDisableWings"); @@ -91,17 +85,33 @@ public final class PlayerData{ compound.setBoolean("HasBatWings", this.hasBatWings); compound.setInteger("BatWingsFlyTime", this.batWingsFlyTime); - NBTTagList bookmarks = new NBTTagList(); - for(IBookletPage bookmark : this.bookmarks){ - bookmarks.appendTag(new NBTTagString(bookmark == null ? "" : bookmark.getIdentifier())); - } - compound.setTag("Bookmarks", bookmarks); + compound.setTag("Bookmarks", this.saveBookmarks()); if(!savingToFile){ compound.setBoolean("ShouldDisableWings", this.shouldDisableBatWings); } } + public NBTTagList saveBookmarks(){ + NBTTagList bookmarks = new NBTTagList(); + for(IBookletPage bookmark : this.bookmarks){ + bookmarks.appendTag(new NBTTagString(bookmark == null ? "" : bookmark.getIdentifier())); + } + return bookmarks; + } + + public void loadBookmarks(NBTTagList bookmarks){ + for(int i = 0; i < bookmarks.tagCount(); i++){ + String strg = bookmarks.getStringTagAt(i); + if(strg != null && !strg.isEmpty()){ + IBookletPage page = BookletUtils.getBookletPageById(strg); + this.bookmarks[i] = page; + } + else{ + this.bookmarks[i] = null; + } + } + } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/data/WorldData.java b/src/main/java/de/ellpeck/actuallyadditions/mod/data/WorldData.java index 19d3627cc..8eada7218 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/data/WorldData.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/data/WorldData.java @@ -102,6 +102,12 @@ public class WorldData extends WorldSavedData{ return data; } + public static void clear(){ + if(data != null){ + data = null; + } + } + public static WorldData get(World world){ return get(world, false); } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/event/ClientEvents.java b/src/main/java/de/ellpeck/actuallyadditions/mod/event/ClientEvents.java index af3decb08..bd9a317d7 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/event/ClientEvents.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/event/ClientEvents.java @@ -13,6 +13,7 @@ package de.ellpeck.actuallyadditions.mod.event; import de.ellpeck.actuallyadditions.mod.blocks.IHudDisplay; import de.ellpeck.actuallyadditions.mod.config.values.ConfigBoolValues; import de.ellpeck.actuallyadditions.mod.config.values.ConfigIntValues; +import de.ellpeck.actuallyadditions.mod.data.WorldData; import de.ellpeck.actuallyadditions.mod.inventory.gui.EnergyDisplay; import de.ellpeck.actuallyadditions.mod.items.ItemWingsOfTheBats; import de.ellpeck.actuallyadditions.mod.tile.IEnergyDisplay; @@ -39,6 +40,8 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.oredict.OreDictionary; @@ -57,6 +60,17 @@ public class ClientEvents{ MinecraftForge.EVENT_BUS.register(this); } + @SubscribeEvent + public void onClientTick(ClientTickEvent event){ + if(event.phase == Phase.END){ + Minecraft mc = Minecraft.getMinecraft(); + + if(mc.world == null){ + WorldData.clear(); + } + } + } + @SubscribeEvent public void onTooltipEvent(ItemTooltipEvent event){ ItemStack stack = event.getItemStack(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java b/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java index 39ec24712..78fb86aa9 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/event/CommonEvents.java @@ -70,7 +70,7 @@ public class CommonEvents{ public void onLogInEvent(PlayerEvent.PlayerLoggedInEvent event){ if(!event.player.world.isRemote && event.player instanceof EntityPlayerMP){ EntityPlayerMP player = (EntityPlayerMP)event.player; - PacketHandlerHelper.sendPlayerDataPacket(player, true, true); + PacketHandlerHelper.syncPlayerData(player, true); ModUtil.LOGGER.info("Sending Player Data to player "+player.getName()+" with UUID "+player.getUniqueID()+"."); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemWingsOfTheBats.java b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemWingsOfTheBats.java index bbf5974ed..96ec6f37d 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemWingsOfTheBats.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/items/ItemWingsOfTheBats.java @@ -188,7 +188,7 @@ public class ItemWingsOfTheBats extends ItemBase{ } if(shouldSend){ - PacketHandlerHelper.sendPlayerDataPacket(player, false, true); + PacketHandlerHelper.syncPlayerData(player, false); data.shouldDisableBatWings = false; //was set only temporarily to send it } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandler.java b/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandler.java index 6f7ab90b2..360e24551 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandler.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandler.java @@ -39,7 +39,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.List; -import java.util.UUID; public final class PacketHandler{ @@ -137,37 +136,52 @@ public final class PacketHandler{ } } }; - public static final IDataHandler CHANGE_PLAYER_DATA_HANDLER = new IDataHandler(){ + public static final IDataHandler SYNC_PLAYER_DATA = new IDataHandler(){ @Override + @SideOnly(Side.CLIENT) public void handleData(NBTTagCompound compound, MessageContext context){ NBTTagCompound dataTag = compound.getCompoundTag("Data"); - UUID id = compound.getUniqueId("UUID"); - EntityPlayer player = null; - - if(context.side == Side.SERVER){ - int dim = compound.getInteger("Dimension"); - World world = DimensionManager.getWorld(dim); - if(world != null){ - player = world.getPlayerEntityByUUID(id); - } - } - else{ - player = ActuallyAdditions.proxy.getCurrentPlayer(); - } + EntityPlayer player = ActuallyAdditions.proxy.getCurrentPlayer(); if(player != null){ PlayerData.getDataFromPlayer(player).readFromNBT(dataTag, false); - WorldData.get(player.getEntityWorld()).markDirty(); if(compound.getBoolean("Log")){ - ModUtil.LOGGER.info("Receiving (new or changed) Player Data for player "+player.getName()+" with UUID "+id+"."); + ModUtil.LOGGER.info("Receiving (new or changed) Player Data for player "+player.getName()+"."); } } else{ - ModUtil.LOGGER.error("Tried to receive Player Data for player with UUID "+id+", but he doesn't seem to be present!"); + ModUtil.LOGGER.error("Tried to receive Player Data for the current player, but he doesn't seem to be present!"); } } }; + public static final IDataHandler PLAYER_DATA_TO_SERVER = new IDataHandler(){ + @Override + public void handleData(NBTTagCompound compound, MessageContext context){ + World world = DimensionManager.getWorld(compound.getInteger("World")); + EntityPlayer player = world.getPlayerEntityByUUID(compound.getUniqueId("UUID")); + if(player != null){ + PlayerData.PlayerSave data = PlayerData.getDataFromPlayer(player); + + int type = compound.getInteger("Type"); + if(type == 0){ + data.loadBookmarks(compound.getTagList("Bookmarks", 8)); + } + else if(type == 1){ + data.didBookTutorial = compound.getBoolean("DidBookTutorial"); + } + WorldData.get(world).markDirty(); + + if(compound.getBoolean("Log")){ + ModUtil.LOGGER.info("Receiving changed Player Data for player "+player.getName()+"."); + } + } + else{ + ModUtil.LOGGER.error("Tried to receive Player Data for player "+player.getName()+", but he doesn't seem to be present!"); + } + } + }; + public static SimpleNetworkWrapper theNetwork; public static void init(){ @@ -180,8 +194,9 @@ public final class PacketHandler{ DATA_HANDLERS.add(GUI_BUTTON_TO_TILE_HANDLER); DATA_HANDLERS.add(GUI_STRING_TO_TILE_HANDLER); DATA_HANDLERS.add(GUI_NUMBER_TO_TILE_HANDLER); - DATA_HANDLERS.add(CHANGE_PLAYER_DATA_HANDLER); + DATA_HANDLERS.add(SYNC_PLAYER_DATA); DATA_HANDLERS.add(GUI_BUTTON_TO_CONTAINER_HANDLER); DATA_HANDLERS.add(LASER_PARTICLE_HANDLER); + DATA_HANDLERS.add(PLAYER_DATA_TO_SERVER); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandlerHelper.java b/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandlerHelper.java index 1dba981bb..58ce667e1 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandlerHelper.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/network/PacketHandlerHelper.java @@ -11,15 +11,19 @@ package de.ellpeck.actuallyadditions.mod.network; import de.ellpeck.actuallyadditions.mod.data.PlayerData; +import de.ellpeck.actuallyadditions.mod.data.PlayerData.PlayerSave; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; public final class PacketHandlerHelper{ + @SideOnly(Side.CLIENT) public static void sendButtonPacket(TileEntity tile, int buttonId){ NBTTagCompound compound = new NBTTagCompound(); BlockPos pos = tile.getPos(); @@ -32,26 +36,44 @@ public final class PacketHandlerHelper{ PacketHandler.theNetwork.sendToServer(new PacketClientToServer(compound, PacketHandler.GUI_BUTTON_TO_TILE_HANDLER)); } - public static void sendPlayerDataPacket(EntityPlayer player, boolean log, boolean toClient){ + public static void syncPlayerData(EntityPlayer player, boolean log){ NBTTagCompound compound = new NBTTagCompound(); - compound.setUniqueId("UUID", player.getUniqueID()); compound.setBoolean("Log", log); NBTTagCompound data = new NBTTagCompound(); PlayerData.getDataFromPlayer(player).writeToNBT(data, false); compound.setTag("Data", data); - if(toClient){ - if(player instanceof EntityPlayerMP){ - PacketHandler.theNetwork.sendTo(new PacketServerToClient(compound, PacketHandler.CHANGE_PLAYER_DATA_HANDLER), (EntityPlayerMP)player); - } - } - else{ - compound.setInteger("Dimension", player.world.provider.getDimension()); - PacketHandler.theNetwork.sendToServer(new PacketClientToServer(compound, PacketHandler.CHANGE_PLAYER_DATA_HANDLER)); + if(player instanceof EntityPlayerMP){ + PacketHandler.theNetwork.sendTo(new PacketServerToClient(compound, PacketHandler.SYNC_PLAYER_DATA), (EntityPlayerMP)player); } } + @SideOnly(Side.CLIENT) + public static void sendPlayerDataToServer(boolean log, int type){ + NBTTagCompound compound = new NBTTagCompound(); + compound.setBoolean("Log", log); + compound.setInteger("Type", type); + + EntityPlayer player = Minecraft.getMinecraft().player; + if(player != null){ + compound.setInteger("World", player.world.provider.getDimension()); + compound.setUniqueId("UUID", player.getUniqueID()); + + PlayerSave data = PlayerData.getDataFromPlayer(player); + + if(type == 0){ + compound.setTag("Bookmarks", data.saveBookmarks()); + } + else if(type == 1){ + compound.setBoolean("DidBookTutorial", data.didBookTutorial); + } + + PacketHandler.theNetwork.sendToServer(new PacketClientToServer(compound, PacketHandler.PLAYER_DATA_TO_SERVER)); + } + } + + @SideOnly(Side.CLIENT) public static void sendNumberPacket(TileEntity tile, double number, int id){ NBTTagCompound compound = new NBTTagCompound(); compound.setInteger("X", tile.getPos().getX());