Add support for enqueing enter/exit messages, so that mutliples display
This commit is contained in:
parent
18f3a5ccf3
commit
e86a7203eb
1 changed files with 48 additions and 9 deletions
|
|
@ -91,6 +91,13 @@ public class MapManager {
|
||||||
|
|
||||||
private HashMap<UUID, HashSet<EnterExitMarker>> entersetstate = new HashMap<UUID, HashSet<EnterExitMarker>>();
|
private HashMap<UUID, HashSet<EnterExitMarker>> entersetstate = new HashMap<UUID, HashSet<EnterExitMarker>>();
|
||||||
|
|
||||||
|
private static class SendQueueRec {
|
||||||
|
DynmapPlayer player;
|
||||||
|
ArrayList<EnterExitText> queue = new ArrayList<EnterExitText>();
|
||||||
|
int tickdelay;
|
||||||
|
};
|
||||||
|
private HashMap<UUID, SendQueueRec> entersetsendqueue = new HashMap<UUID, SendQueueRec>();
|
||||||
|
|
||||||
private boolean did_start = false;
|
private boolean did_start = false;
|
||||||
|
|
||||||
private int zoomout_period = DEFAULT_ZOOMOUT_PERIOD; /* Zoom-out tile processing period, in seconds */
|
private int zoomout_period = DEFAULT_ZOOMOUT_PERIOD; /* Zoom-out tile processing period, in seconds */
|
||||||
|
|
@ -963,6 +970,17 @@ public class MapManager {
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void enqueueMessage(UUID uuid, DynmapPlayer player, EnterExitText txt) {
|
||||||
|
SendQueueRec rec = entersetsendqueue.get(uuid);
|
||||||
|
if (rec == null) {
|
||||||
|
rec = new SendQueueRec();
|
||||||
|
rec.player = player;
|
||||||
|
rec.tickdelay = 0;
|
||||||
|
entersetsendqueue.put(uuid, rec);
|
||||||
|
}
|
||||||
|
rec.queue.add(txt);
|
||||||
|
}
|
||||||
|
|
||||||
private class DoUserMoveProcessing implements Runnable {
|
private class DoUserMoveProcessing implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
HashMap<UUID, HashSet<EnterExitMarker>> newstate = new HashMap<UUID, HashSet<EnterExitMarker>>();
|
HashMap<UUID, HashSet<EnterExitMarker>> newstate = new HashMap<UUID, HashSet<EnterExitMarker>>();
|
||||||
|
|
@ -976,25 +994,46 @@ public class MapManager {
|
||||||
MarkerAPIImpl.getEnteredMarkers(dl.world, dl.x, dl.y, dl.z, newset);
|
MarkerAPIImpl.getEnteredMarkers(dl.world, dl.x, dl.y, dl.z, newset);
|
||||||
}
|
}
|
||||||
HashSet<EnterExitMarker> oldset = entersetstate.get(puuid);
|
HashSet<EnterExitMarker> oldset = entersetstate.get(puuid);
|
||||||
// See which we just entered
|
|
||||||
for (EnterExitMarker m : newset) {
|
|
||||||
EnterExitText txt = m.getGreetingText();
|
|
||||||
if ((txt != null) && ((oldset == null) || (oldset.contains(m) == false))) {
|
|
||||||
sendPlayerEnterExit(player, txt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// See which we just left
|
// See which we just left
|
||||||
if (oldset != null) {
|
if (oldset != null) {
|
||||||
for (EnterExitMarker m : oldset) {
|
for (EnterExitMarker m : oldset) {
|
||||||
EnterExitText txt = m.getFarewellText();
|
EnterExitText txt = m.getFarewellText();
|
||||||
if ((txt != null) && (newset.contains(m) == false)) {
|
if ((txt != null) && (newset.contains(m) == false)) {
|
||||||
sendPlayerEnterExit(player, txt);
|
enqueueMessage(puuid, player, txt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// See which we just entered
|
||||||
|
for (EnterExitMarker m : newset) {
|
||||||
|
EnterExitText txt = m.getGreetingText();
|
||||||
|
if ((txt != null) && ((oldset == null) || (oldset.contains(m) == false))) {
|
||||||
|
enqueueMessage(puuid, player, txt);
|
||||||
|
}
|
||||||
|
}
|
||||||
newstate.put(puuid, newset);
|
newstate.put(puuid, newset);
|
||||||
}
|
}
|
||||||
entersetstate = newstate; // Replace old with new
|
entersetstate = newstate; // Replace old with new
|
||||||
|
|
||||||
|
// Go through queues - send pending messages
|
||||||
|
List<UUID> keys = new ArrayList<UUID>(entersetsendqueue.keySet());
|
||||||
|
for (UUID id : keys) {
|
||||||
|
SendQueueRec rec = entersetsendqueue.get(id);
|
||||||
|
// Check delay - count down if needed
|
||||||
|
if (rec.tickdelay > enterexitperiod) {
|
||||||
|
rec.tickdelay -= enterexitperiod;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
rec.tickdelay = 0;
|
||||||
|
// If something to send, send it
|
||||||
|
if (rec.queue.size() > 0) {
|
||||||
|
EnterExitText txt = rec.queue.remove(0);
|
||||||
|
sendPlayerEnterExit(rec.player, txt); // And send it
|
||||||
|
rec.tickdelay = 50 * (titleFadeIn + 10); // Delay by fade in time plus 1/2 second
|
||||||
|
}
|
||||||
|
else { // Else, if we are empty and exhausted delay, remove it
|
||||||
|
entersetsendqueue.remove(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (enterexitperiod > 0) {
|
if (enterexitperiod > 0) {
|
||||||
scheduleDelayedJob(this, enterexitperiod);
|
scheduleDelayedJob(this, enterexitperiod);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue