From c0272cc4fcc0be61172631bece575f5629fd6e56 Mon Sep 17 00:00:00 2001 From: Skyler Lehan Date: Fri, 27 May 2016 00:22:00 -0400 Subject: [PATCH] Made it so that when a player logs off, they're removed from the group in 4 minutes GroupObject - added a hashmap of a timer to a GroupMember - changed removeMember to handle setting leader to the next most recent joiner - refactored setLeader out to changeLeader, and added a way of setting a leader with a GroupMember object - added method getGroupMember that will return a given GroupMember based on the player passed to it, if that Player is in the groupMember list - added method markPlayerForLogoff which will start a timer for that player, when the timer fires, that character/player is removed from the group - added method unmarkPlayerForLogoff which will cancel the timer to prevent that player from logging off - added class LogOffTask which will be used in the Timer as a task GroupService - changed from watching for a player disappearing to one logging out - when the player zones in, it will unmark it for logoff - also handle if the player logs off by marking that player as logged off --- src/resources/objects/group/GroupObject.java | 88 +++++++++++++++++++- src/services/group/GroupService.java | 18 ++-- 2 files changed, 97 insertions(+), 9 deletions(-) diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java index a78ef4c10..55b27696d 100644 --- a/src/resources/objects/group/GroupObject.java +++ b/src/resources/objects/group/GroupObject.java @@ -43,6 +43,8 @@ import java.io.Serializable; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; public class GroupObject extends SWGObject { // Extends INTO or TANO? private static final long serialVersionUID = 200L; @@ -52,6 +54,7 @@ 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; @@ -98,8 +101,15 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? } public void removeMember(CreatureObject object) { + + GroupMember member = new GroupMember(object.getObjectId(), object.getName()); synchronized (groupMembers) { - groupMembers.remove(new GroupMember(object.getObjectId(), object.getName())); + + if (this.leader == object.getObjectId()) { + this.setLeader(this.groupMembers.get(2)); + } + + groupMembers.remove(member); object.setGroupId(0); awarenessOutOfRange(object, true); @@ -123,17 +133,28 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? this.leader = object.getObjectId(); GroupMember member = new GroupMember(object.getObjectId(), object.getName()); + this.changeLeader(member); + } + + public void setLeader(GroupMember member) { + this.leader = member.getId(); + + this.changeLeader(member); + } + + private void changeLeader(GroupMember member) { + if (groupMembers.size() > 0) { synchronized (groupMembers) { GroupMember previous = groupMembers.set(0, member); - groupMembers.add(previous); + //groupMembers.add(previous); } } else { groupMembers.add(member); } groupMembers.sendDeltaMessage(this); } - + public short getLevel() { return level; } @@ -170,7 +191,47 @@ public class GroupObject extends SWGObject { // Extends INTO or TANO? return members; } - + + private GroupMember getGroupMember(Player player) { + + GroupMember foundMember = null; + + synchronized(groupMembers) { + GroupMember testMember = new GroupMember(player.getCreatureObject().getObjectId(), player.getCharacterName()); + int index = groupMembers.indexOf(testMember); + + if (index != -1) + foundMember = groupMembers.get(index); + } + + 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(); + } + private static class PickupPointTimer implements Serializable, Encodable { private static final long serialVersionUID = 1L; @@ -242,4 +303,23 @@ 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 2839f909d..e3f6c1a53 100644 --- a/src/services/group/GroupService.java +++ b/src/services/group/GroupService.java @@ -113,8 +113,8 @@ public class GroupService extends Service { case PE_FIRST_ZONE: handleMemberRezoned(intent.getPlayer()); break; - case PE_DISAPPEAR: - handleMemberDisappeared(intent.getPlayer()); + case PE_LOGGED_OUT: + handleMemberLoggedOff(intent.getPlayer()); break; default: break; } @@ -134,11 +134,20 @@ public class GroupService extends Service { return; } + // Tell group to remove that player from the log off timer + groupObject.unmarkPlayerForLogoff(player); groupObject.updateMember(creatureObject); } - private void handleMemberDisappeared(Player player) { - System.out.println("Group member " + player.getCharacterName() + " disappeared."); + private void handleMemberLoggedOff(Player player) { + + CreatureObject playerCreo = player.getCreatureObject(); + GroupObject group = getGroup(playerCreo.getGroupId()); + + if (group == null) + return; + + group.markPlayerForLogoff(player); } private void handleGroupDisband(Player player, CreatureObject target) { @@ -190,7 +199,6 @@ public class GroupService extends Service { // Otherwise, remove player group.removeMember(creo); - System.out.println("Group member leaving"); } private void handleGroupInvite(Player player, CreatureObject target) {