From 34cde8390aa574469d4d6a2737b38d12dd9eb2d6 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 17:09:24 +0200 Subject: [PATCH] Add more node children manipulation methods --- .../net/minestom/server/event/EventNode.java | 53 ++++++++++++++++--- src/test/java/demo/PlayerInit.java | 8 ++- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 4a440cf55..55d49948f 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -174,15 +174,13 @@ public class EventNode { @Contract(pure = true) public @NotNull List> findChildren(@NotNull String name, Class eventType) { + if (children.isEmpty()) { + return Collections.emptyList(); + } synchronized (GLOBAL_CHILD_LOCK) { - if (children.isEmpty()) { - return Collections.emptyList(); - } List> result = new ArrayList<>(); this.children.forEach(child -> { - final boolean nameCheck = child.getName().equals(name); - final boolean typeCheck = child.eventType.isAssignableFrom(eventType); - if (nameCheck && typeCheck) { + if (EventNode.equals(child, name, eventType)) { result.add((EventNode) child); } result.addAll(child.findChildren(name, eventType)); @@ -196,6 +194,43 @@ public class EventNode { return findChildren(name, eventType); } + public void replaceChildren(@NotNull String name, @NotNull Class eventType, @NotNull EventNode eventNode) { + if (children.isEmpty()) { + return; + } + synchronized (GLOBAL_CHILD_LOCK) { + this.children.forEach(child -> { + if (EventNode.equals(child, name, eventType)) { + removeChild(child); + addChild(eventNode); + } + child.replaceChildren(name, eventType, eventNode); + }); + } + } + + public void replaceChildren(@NotNull String name, @NotNull EventNode eventNode) { + replaceChildren(name, eventType, eventNode); + } + + public void removeChildren(@NotNull String name, @NotNull Class eventType) { + if (children.isEmpty()) { + return; + } + synchronized (GLOBAL_CHILD_LOCK) { + this.children.forEach(child -> { + if (EventNode.equals(child, name, eventType)) { + removeChild(child); + } + child.removeChildren(name, eventType); + }); + } + } + + public void removeChildren(@NotNull String name) { + removeChildren(name, eventType); + } + @Contract(value = "_ -> this") public @NotNull EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { @@ -303,6 +338,12 @@ public class EventNode { } } + private static boolean equals(EventNode node, String name, Class eventType) { + final boolean nameCheck = node.getName().equals(name); + final boolean typeCheck = node.eventType.isAssignableFrom(eventType); + return nameCheck && typeCheck; + } + private static class ListenerEntry { private static final AtomicIntegerFieldUpdater CHILD_UPDATER = AtomicIntegerFieldUpdater.newUpdater(ListenerEntry.class, "childCount"); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index e7cc656aa..7688bbf7d 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -154,7 +154,13 @@ public class PlayerInit { private static AtomicReference LAST_TICK = new AtomicReference<>(); public static void init() { - MinecraftServer.getGlobalEventHandler().addChild(DEMO_NODE); + var eventHandler = MinecraftServer.getGlobalEventHandler(); + eventHandler.addChild(DEMO_NODE); + var children = eventHandler.findChildren("demo", Event.class); + eventHandler.replaceChildren("demo", Event.class, EventNode.all("new_demo")); + eventHandler.replaceChildren("new_demo", EventNode.all("new_demo2")); + eventHandler.removeChildren("new_demo2"); + MinecraftServer.getUpdateManager().addTickMonitor(tickMonitor -> LAST_TICK.set(tickMonitor));