diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index b8b8fcb6d..038baed6e 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -2,7 +2,6 @@ package noppes.npcs; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent; import cpw.mods.fml.relauncher.Side; import foxz.utils.Market; @@ -113,19 +112,12 @@ public class PacketHandlerServer{ PlayerDataController.Instance.getPlayerData(player).animationData.cacheAnimation(buffer.readInt()); return; } else if (type == EnumPacketServer.GetPartyData || type == EnumPacketServer.CreateParty) { - PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); if (type == EnumPacketServer.CreateParty) { Party party = PartyController.Instance().createParty(); party.addPlayer(player); party.setLeader(player); } - - NBTTagCompound compound = new NBTTagCompound(); - if (playerData.partyUUID != null) { - Party party = PartyController.Instance().getParty(playerData.partyUUID); - compound = party.writeToNBT(); - } - Server.sendData(player, EnumPacketClient.GUI_DATA, compound); + sendPartyData(player); } else if (type == EnumPacketServer.DisbandParty) { PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); if (playerData.partyUUID != null) { @@ -142,7 +134,11 @@ public class PacketHandlerServer{ if (playerData.partyUUID != null) { Party party = PartyController.Instance().getParty(playerData.partyUUID); party.removePlayer(kickPlayer); - Server.sendData(player, EnumPacketClient.GUI_DATA, party.writeToNBT()); + if (kickPlayer != player) { + sendPartyData(player); + } else { + sendInviteData((EntityPlayerMP) kickPlayer); + } } } } else if (type == EnumPacketServer.SavePartyData) { @@ -167,6 +163,22 @@ public class PacketHandlerServer{ invitedData.inviteToParty(PartyController.Instance().getParty(senderData.partyUUID)); } } + } else if (type == EnumPacketServer.GetPartyInviteList) { + sendInviteData(player); + } else if (type == EnumPacketServer.AcceptInvite) { + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + String uuidString = Server.readString(buffer); + if (uuidString != null) { + UUID uuid = UUID.fromString(uuidString); + playerData.acceptInvite(uuid); + } + } else if (type == EnumPacketServer.IgnoreInvite) { + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + String uuidString = Server.readString(buffer); + if (uuidString != null) { + UUID uuid = UUID.fromString(uuidString); + playerData.ignoreInvite(uuid); + } } if(type.needsNpc && npc == null){ @@ -214,6 +226,35 @@ public class PacketHandlerServer{ } } + public static void sendPartyData(EntityPlayerMP player) { + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + + if (playerData.partyUUID != null) { + Party party = PartyController.Instance().getParty(playerData.partyUUID); + Server.sendData(player, EnumPacketClient.GUI_DATA, party.writeToNBT()); + } else { + sendInviteData(player); + } + } + + public static void sendInviteData(EntityPlayerMP player) { + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + if (playerData.partyUUID == null) { + NBTTagCompound compound = new NBTTagCompound(); + NBTTagList list = new NBTTagList(); + HashSet partyInvites = playerData.getPartyInvites(); + for (UUID uuid : partyInvites) { + Party party = PartyController.Instance().getParty(uuid); + NBTTagCompound partyCompound = new NBTTagCompound(); + partyCompound.setString("PartyLeader", party.getPartyLeaderName()); + partyCompound.setString("PartyUUID", party.getPartyUUID().toString()); + list.appendTag(partyCompound); + } + compound.setTag("PartyInvites", list); + Server.sendData(player, EnumPacketClient.GUI_DATA, compound); + } + } + private void isGuiOpenPacket(ByteBuf buffer, EntityPlayerMP player) throws IOException { NoppesUtilServer.isGUIOpen(buffer, player); } diff --git a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java index e08e36672..36eaa7a34 100644 --- a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java +++ b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java @@ -6,6 +6,7 @@ import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import noppes.npcs.client.Client; @@ -20,6 +21,7 @@ import tconstruct.client.tabs.TabRegistry; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.UUID; public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, ITopButtonListener,ICustomScrollListener, IGuiData, GuiYesNoCallback { @@ -29,11 +31,15 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT private boolean receivedData; private long renderTicks; + private String selectedPlayer; + private String selectedInvite; private boolean partyChanged = false; private boolean isLeader; + private final HashMap invites = new HashMap<>(); + public GuiParty(EntityPlayer player) { super(); this.player = player; @@ -46,6 +52,7 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT public void initGui(){ super.initGui(); + this.selectedInvite = this.selectedPlayer = null; Party party = ClientCacheHandler.party; TabRegistry.addTabsToList(buttonList); TabRegistry.updateTabValues(guiLeft, guiTop, InventoryTabCustomNpc.class); @@ -69,6 +76,7 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT inviteScroll.setSize(150, 160); inviteScroll.guiLeft = guiLeft + 5; inviteScroll.guiTop = guiTop + 5; + inviteScroll.setList(new ArrayList<>(this.invites.keySet())); this.addScroll(inviteScroll); GuiNpcButton acceptButton = new GuiNpcButton(215, guiLeft + 15, guiTop + ySize - 12, "party.accept"); @@ -133,15 +141,15 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT //disband party // - GuiNpcButton disbandButton = new GuiNpcButton(335, guiLeft + xSize/2 + 45, guiTop + ySize/2 + 70, "party.leaveParty"); + GuiNpcButton disbandButton = new GuiNpcButton(335, guiLeft + xSize/2 + 45, guiTop + ySize/2 + 70, "party.disbandParty"); disbandButton.width = 100; this.addButton(disbandButton); } else { //leave party // - GuiNpcButton disbandButton = new GuiNpcButton(335, guiLeft + xSize/2 + 45, guiTop + ySize/2 + 70, "party.disbandParty"); - disbandButton.width = 100; - this.addButton(disbandButton); + GuiNpcButton leaveButton = new GuiNpcButton(335, guiLeft + xSize/2 + 45, guiTop + ySize/2 + 70, "party.leaveParty"); + leaveButton.width = 100; + this.addButton(leaveButton); } } } @@ -179,6 +187,18 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT Client.sendData(EnumPacketServer.CreateParty); receivedData = false; break; + case 215: + if (this.selectedInvite != null) { + Client.sendData(EnumPacketServer.AcceptInvite, this.selectedInvite); + receivedData = false; + } + break; + case 220: + if (this.selectedInvite != null) { + Client.sendData(EnumPacketServer.IgnoreInvite, this.selectedInvite); + receivedData = false; + } + break; case 305: if (!party.getPartyLeaderName().equals(this.selectedPlayer)) { GuiYesNo yesnoLeader = new GuiYesNo(this, StatCollector.translateToLocal("party.leaderConfirm"), this.selectedPlayer, 0); @@ -282,6 +302,16 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT } else if (compound.hasKey("Disband")) { ClientCacheHandler.party = null; this.isLeader = false; + } else if (compound.hasKey("PartyInvites")) { + ClientCacheHandler.party = null; + this.invites.clear(); + NBTTagList list = compound.getTagList("PartyInvites", 10); + for (int i = 0; i < list.tagCount(); i++) { + NBTTagCompound listCompound = list.getCompoundTagAt(i); + String inviteName = listCompound.getString("PartyLeader"); + String partyUUID = listCompound.getString("PartyUUID"); + this.invites.put(inviteName, partyUUID); + } } initGui(); @@ -302,7 +332,14 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener, IT @Override public void customScrollClicked(int i, int j, int k, GuiCustomScroll guiCustomScroll) { - this.selectedPlayer = guiCustomScroll.getSelected(); + switch (guiCustomScroll.id) { + case 210: + this.selectedInvite = this.invites.get(guiCustomScroll.getSelected()); + break; + case 300: + this.selectedPlayer = guiCustomScroll.getSelected(); + break; + } } @Override diff --git a/src/main/java/noppes/npcs/constants/EnumPacketServer.java b/src/main/java/noppes/npcs/constants/EnumPacketServer.java index fed898905..656e2e57f 100644 --- a/src/main/java/noppes/npcs/constants/EnumPacketServer.java +++ b/src/main/java/noppes/npcs/constants/EnumPacketServer.java @@ -95,7 +95,7 @@ public enum EnumPacketServer { CustomGuiButton,CustomGuiScrollClick,CustomGuiClose,CustomGuiUnfocused, - SavePartyData, CreateParty, GetPartyData, DisbandParty, KickPlayer, PartyInvite, SetPartyLeader, + SavePartyData, CreateParty, GetPartyData, DisbandParty, KickPlayer, PartyInvite, GetPartyInviteList, AcceptInvite, IgnoreInvite, SetPartyLeader, ServerUpdateSkinOverlays; diff --git a/src/main/java/noppes/npcs/controllers/data/Party.java b/src/main/java/noppes/npcs/controllers/data/Party.java index cb09b3636..5192ad126 100644 --- a/src/main/java/noppes/npcs/controllers/data/Party.java +++ b/src/main/java/noppes/npcs/controllers/data/Party.java @@ -80,6 +80,9 @@ public class Party { } } + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + playerData.partyUUID = null; + return true; } @@ -106,9 +109,12 @@ public class Party { return NoppesUtilServer.getPlayer(this.partyLeader); } - @SideOnly(Side.CLIENT) public String getPartyLeaderName() { - return this.partyLeaderName; + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { + return this.partyLeaderName; + } else { + return this.getPartyLeader().getCommandSenderName(); + } } public boolean setLeader(EntityPlayer player){ diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerData.java b/src/main/java/noppes/npcs/controllers/data/PlayerData.java index cec4b7356..35078c5c3 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerData.java @@ -8,12 +8,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.IExtendedEntityProperties; import noppes.npcs.LogWriter; +import noppes.npcs.PacketHandlerServer; import noppes.npcs.Server; import noppes.npcs.api.entity.ICustomNpc; import noppes.npcs.api.handler.*; import noppes.npcs.config.ConfigMain; import noppes.npcs.constants.EnumPacketClient; import noppes.npcs.constants.EnumRoleType; +import noppes.npcs.controllers.PartyController; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; @@ -203,6 +205,26 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { } } + public void ignoreInvite(UUID uuid) { + if (uuid != null) { + this.partyInvites.remove(uuid); + PacketHandlerServer.sendInviteData((EntityPlayerMP) player); + } + } + + public void acceptInvite(UUID uuid) { + if (uuid != null) { + this.partyInvites.remove(uuid); + Party party = PartyController.Instance().getParty(uuid); + party.addPlayer(player); + PacketHandlerServer.sendPartyData((EntityPlayerMP) player); + } + } + + public HashSet getPartyInvites() { + return (HashSet) this.partyInvites.clone(); + } + public void setCompanion(ICustomNpc npc) { this.setCompanion((EntityNPCInterface) npc.getMCEntity()); }