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
This commit is contained in:
Skyler Lehan
2016-05-27 00:22:00 -04:00
parent d950f3c33e
commit c0272cc4fc
2 changed files with 97 additions and 9 deletions
+84 -4
View File
@@ -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<GroupMember, Timer> 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);
}
}
}