mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-17 07:02:54 -04:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user