From abc0b640fb79c208a3dfff8c2a7737e288159ac3 Mon Sep 17 00:00:00 2001 From: Skyler Lehan Date: Mon, 30 May 2016 13:34:49 -0400 Subject: [PATCH] More work for NGE-111, mostly minor fixes GroupObject - fixed some formatting issues - added method to get the CreatureObjects of each GroupMember in the group - removed mark/unmarkPlayerForLogoff and the TimerTask for them (moved to GroupService instead) GroupService - fixed the message sending methods - GroupService now tracks if players log in and out and removes them as necessary - still need to make sure the "disband" message is only being sent once, this stems from the leader being in GroupMembers twice - need to make sure all appropriate messages are being sent to the players, like when leadership changes etc --- src/resources/objects/group/GroupObject.java | 69 ++++----------- src/services/group/GroupService.java | 93 +++++++++++++++----- 2 files changed, 91 insertions(+), 71 deletions(-) diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java index c93ca7e48..fc97006eb 100644 --- a/src/resources/objects/group/GroupObject.java +++ b/src/resources/objects/group/GroupObject.java @@ -41,11 +41,10 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; public class GroupObject extends SWGObject { // Extends INTO or TANO? @@ -54,7 +53,6 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? private short level; private long lootMaster; private int lootRule; - private HashMap logoffTimers = new HashMap<>(); private transient PickupPointTimer pickupPointTimer; @@ -73,7 +71,7 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? super.createBaseline6(target, bb); // BASE06 -- 2 variables bb.addObject(groupMembers); // 2 -- NOTE: First person is the leader bb.addInt(0); // formationmembers // 3 - bb.addInt(0); // updateCount + bb.addInt(0); // updateCount bb.addAscii(""); // groupName // 4 bb.addShort(level); // 5 bb.addInt(0); // formationNameCrc // 6 @@ -81,9 +79,9 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? bb.addInt(lootRule); // 8 bb.addObject(pickupPointTimer); // 9 bb.addAscii(""); // PickupPoint planetName // 10 - bb.addFloat(0); // x - bb.addFloat(0); // y - bb.addFloat(0); // z + bb.addFloat(0); // x + bb.addFloat(0); // y + bb.addFloat(0); // z bb.incrementOperandCount(9); } @@ -196,6 +194,19 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? return members; } + public ArrayList getGroupMemberObjects() { + + ArrayList memberObjects = new ArrayList<>(); + + synchronized (groupMembers) { + + for (GroupMember groupMember : groupMembers) + memberObjects.add(groupMember.playerCreo); + } + + return memberObjects; + } + private GroupMember getGroupMember(Player player) { GroupMember foundMember = null; @@ -211,31 +222,6 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? return foundMember; } - public void markPlayerForLogoff(Player player) { - - // Create a timer with the GroupMember player owns as the key - // and a timer set to fire and remove that member as the value - GroupMember loggedMember = this.getGroupMember(player); - - Timer timer = new Timer(); - LogOffTask task = new LogOffTask(this, player.getCreatureObject()); - - timer.schedule(task, 240000); - - this.logoffTimers.put(loggedMember, timer); - } - - public void unmarkPlayerForLogoff(Player player) { - - GroupMember loggedMember = this.getGroupMember(player); - - if (loggedMember == null) - return; - - // Cancel the timer and remove from the list - this.logoffTimers.remove(loggedMember).cancel(); - } - public void disbandGroup() { synchronized (groupMembers) { @@ -328,23 +314,4 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? return result; } } - - private static class LogOffTask extends TimerTask { - - GroupObject taskingGroup; - CreatureObject loggedMember; - - public LogOffTask(GroupObject group, CreatureObject member) { - - this.taskingGroup = group; - this.loggedMember = member; - } - - @Override - public void run() { - - this.taskingGroup.removeMember(loggedMember); - } - - } } diff --git a/src/services/group/GroupService.java b/src/services/group/GroupService.java index f29255b83..76523702a 100644 --- a/src/services/group/GroupService.java +++ b/src/services/group/GroupService.java @@ -30,6 +30,7 @@ package services.group; import intents.GroupEventIntent; import intents.NotifyPlayersPacketIntent; import intents.PlayerEventIntent; +import intents.chat.ChatBroadcastIntent; import intents.chat.ChatRoomUpdateIntent; import intents.object.ObjectCreatedIntent; import network.packets.swg.zone.chat.ChatSystemMessage; @@ -51,6 +52,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; /** * Created by Waverunner on 10/4/2015 @@ -58,7 +61,8 @@ import java.util.Map; public class GroupService extends Service { private final Map groups = new HashMap<>(); - + private HashMap logoffTimers = new HashMap<>(); + public GroupService() { registerForIntent(GroupEventIntent.TYPE); registerForIntent(PlayerEventIntent.TYPE); @@ -135,7 +139,7 @@ public class GroupService extends Service { } // Tell group to remove that player from the log off timer - groupObject.unmarkPlayerForLogoff(player); + unmarkPlayerForLogoff(player); groupObject.updateMember(creatureObject); } @@ -151,7 +155,32 @@ public class GroupService extends Service { if (group == null) return; - group.markPlayerForLogoff(player); + markPlayerForLogoff(player); + } + + public void markPlayerForLogoff(Player player) { + + // Create a timer with the GroupMember player owns as the key + // and a timer set to fire and remove that member as the value + + Timer timer = new Timer(); + CreatureObject playerCreo = player.getCreatureObject(); + LogOffTask task = new LogOffTask(this, player.getCreatureObject()); + + timer.schedule(task, 60000); + + this.logoffTimers.put(playerCreo, timer); + System.out.println(this.logoffTimers); + } + + public void unmarkPlayerForLogoff(Player player ) { + + CreatureObject playerCreo = player.getCreatureObject(); + + if (playerCreo.getGroupId() == 0) + return; + + this.logoffTimers.remove(playerCreo).cancel(); } private void handleGroupDisband(Player player, CreatureObject target) { @@ -201,6 +230,8 @@ public class GroupService extends Service { } // Otherwise, remove player + sendGroupSystemMessage(group, "other_left_prose", "TU", creo.getObjectId()); + sendSystemMessage(creo.getOwner(), "removed"); group.removeMember(creo); } @@ -208,6 +239,11 @@ public class GroupService extends Service { private void handleGroupInvite(Player player, CreatureObject target) { CreatureObject playerCreo = player.getCreatureObject(); + if (target == null) { + sendSystemMessage(player, "invite_no_target_self"); + return; + } + Player targetOwner = target.getOwner(); if (targetOwner == null) return; @@ -361,18 +397,6 @@ public class GroupService extends Service { sendGroupSystemMessage(group, "disbanded"); group.disbandGroup(); - -// for (String name : members.keySet()) { -// Player memPlayer = playerManager.getPlayerByCreatureName(name); -// if (memPlayer == null) -// continue; -// -// CreatureObject memCreo = memPlayer.getCreatureObject(); -// if (memCreo == null) -// continue; -// -// group.removeMember(memCreo); -// } // TODO: Object destroy intent } @@ -396,11 +420,14 @@ public class GroupService extends Service { } private void sendGroupSystemMessage(GroupObject group, String id) { - Map members = group.getGroupMembers(); + + ArrayList members = group.getGroupMemberObjects(); + + for (CreatureObject member : members) { + new ChatBroadcastIntent(member.getOwner(), new ProsePackage("group", id)).broadcast(); - List ids = new ArrayList<>(members.values()); - - new NotifyPlayersPacketIntent(new ChatSystemMessage(ChatSystemMessage.SystemChatType.SCREEN_AND_CHAT, "@group:" + id), ids).broadcast(); + } + //new NotifyPlayersPacketIntent(new ChatSystemMessage(ChatSystemMessage.SystemChatType.SCREEN_AND_CHAT, "@group:" + id), ids).broadcast(); } private void sendGroupSystemMessage(GroupObject group, String id, Object ... objects) { @@ -430,10 +457,36 @@ public class GroupService extends Service { } private void sendSystemMessage(Player target, String id) { - target.sendPacket(new ChatSystemMessage(ChatSystemMessage.SystemChatType.SCREEN_AND_CHAT, id)); + new ChatBroadcastIntent(target, new ProsePackage("group", id)).broadcast(); } private void sendSystemMessage(Player target, String id, Object ... objects) { IntentFactory.sendSystemMessage(target, "@group:" + id, objects); } + + private void removeTimer(CreatureObject groupMember) { + + this.logoffTimers.remove(groupMember).cancel(); + } + + private static class LogOffTask extends TimerTask { + + GroupService taskingGroupService; + CreatureObject loggedMember; + + public LogOffTask(GroupService groupService, CreatureObject member) { + + this.taskingGroupService = groupService; + this.loggedMember = member; + } + + @Override + public void run() { + + this.taskingGroupService.handleGroupLeave(loggedMember.getOwner()); + this.taskingGroupService.removeTimer(loggedMember); + } + } } + +