HolographicDisplays/core/src/main/java/me/filoghost/holographicdisplays/core/listener/LineClickListener.java

94 lines
3.0 KiB
Java
Raw Normal View History

/*
* Copyright (C) filoghost and contributors
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package me.filoghost.holographicdisplays.core.listener;
2022-12-04 11:58:41 +01:00
import me.filoghost.holographicdisplays.core.tracking.ClickableLineTracker;
import me.filoghost.holographicdisplays.nms.common.EntityID;
import me.filoghost.holographicdisplays.nms.common.PacketListener;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
2021-07-31 09:06:36 +02:00
public class LineClickListener implements PacketListener {
2022-12-04 11:58:41 +01:00
private final ConcurrentMap<Integer, ClickableLineTracker<?>> lineTrackerByEntityID;
2021-07-31 09:06:36 +02:00
// It is necessary to queue async click events to process them from the main thread.
// Use a set to avoid duplicate click events to the same line.
2021-08-25 08:54:56 +02:00
private final Set<QueuedClickEvent> queuedClickEvents;
2021-07-31 09:06:36 +02:00
public LineClickListener() {
2022-12-04 11:58:41 +01:00
lineTrackerByEntityID = new ConcurrentHashMap<>();
queuedClickEvents = Collections.newSetFromMap(new ConcurrentHashMap<>());
}
@Override
public boolean onAsyncEntityInteract(Player player, int entityID) {
2022-12-04 11:58:41 +01:00
ClickableLineTracker<?> lineTracker = lineTrackerByEntityID.get(entityID);
if (lineTracker != null) {
queuedClickEvents.add(new QueuedClickEvent(player, lineTracker));
return true;
} else {
return false;
}
}
2021-07-31 09:06:36 +02:00
// This method is called from the main thread
public void processQueuedClickEvents() {
2022-12-04 11:58:41 +01:00
for (QueuedClickEvent event : queuedClickEvents) {
event.lineTracker.onClientClick(event.player);
}
2021-07-31 09:06:36 +02:00
queuedClickEvents.clear();
}
2022-12-04 11:58:41 +01:00
public void addLineTracker(EntityID clickableEntityID, ClickableLineTracker<?> lineTracker) {
lineTrackerByEntityID.put(clickableEntityID.getNumericID(), lineTracker);
}
2022-12-04 11:58:41 +01:00
public void removeLineTracker(EntityID clickableEntityID) {
2021-07-31 09:06:36 +02:00
if (clickableEntityID.hasInitializedNumericID()) {
2022-12-04 11:58:41 +01:00
lineTrackerByEntityID.remove(clickableEntityID.getNumericID());
}
}
2021-08-25 08:54:56 +02:00
private static class QueuedClickEvent {
private final Player player;
2022-12-04 11:58:41 +01:00
private final ClickableLineTracker<?> lineTracker;
2022-12-04 11:58:41 +01:00
QueuedClickEvent(Player player, ClickableLineTracker<?> lineTracker) {
this.player = player;
2022-12-04 11:58:41 +01:00
this.lineTracker = lineTracker;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
2021-08-25 08:54:56 +02:00
QueuedClickEvent other = (QueuedClickEvent) obj;
2022-12-04 11:58:41 +01:00
return this.player.equals(other.player) && this.lineTracker.equals(other.lineTracker);
}
@Override
public int hashCode() {
int result = player.hashCode();
2022-12-04 11:58:41 +01:00
result = 31 * result + lineTracker.hashCode();
return result;
}
}
}