Skip to content

Commit

Permalink
Fixes world edit logging, adds support for async world edit plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
Rothes authored and viveleroi committed Feb 14, 2022
1 parent f85ff02 commit be058bf
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 11 deletions.
41 changes: 35 additions & 6 deletions Prism/src/main/java/network/darkhelmet/prism/ApiHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,56 @@
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import network.darkhelmet.prism.bridge.PrismBlockEditHandler;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;

import java.util.ArrayList;
import java.util.Collection;

public class ApiHandler {

public enum WEType {
WORLDEDIT("WorldEdit"),
ASYNC_WORLDEDIT("AsyncWorldEdit"),
FAST_ASYNC_WORLDEDIT("FastAsyncWorldEdit");

private final String pluginId;

WEType(String pluginId) {
this.pluginId = pluginId;
}

public String getPluginId() {
return pluginId;
}
}

private static final Collection<String> enabledPlugins = new ArrayList<>();
public static WorldEditPlugin worldEditPlugin = null;
private static PrismBlockEditHandler handler;
private static WEType weType = null;

private ApiHandler() {
}

static void hookWorldEdit() {
final Plugin we = Prism.getInstance().getServer().getPluginManager().getPlugin("WorldEdit");
if (Bukkit.getServer().getPluginManager().getPlugin("FastAsyncWorldEdit") != null) {
weType = WEType.FAST_ASYNC_WORLDEDIT;
} else if (Bukkit.getServer().getPluginManager().getPlugin("AsyncWorldEdit") != null) {
weType = WEType.ASYNC_WORLDEDIT;
} else if (Bukkit.getServer().getPluginManager().getPlugin("WorldEdit") != null) {
weType = WEType.WORLDEDIT;
}

final Plugin we = Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
if (we != null) {
worldEditPlugin = (WorldEditPlugin) we;
enabledPlugins.add(we.getName());
// Easier and foolproof way.
try {
WorldEdit.getInstance().getEventBus().register(new PrismBlockEditHandler());
Prism.log("WorldEdit found. Associated features enabled.");
handler = new PrismBlockEditHandler(weType);
WorldEdit.getInstance().getEventBus().register(handler);
Prism.log(weType.pluginId + " found. Associated features enabled.");
} catch (Throwable error) {
Prism.log("Required WorldEdit version is 7.1.0 or greater!"
+ " Certain optional features of Prism disabled.");
Expand All @@ -39,11 +68,11 @@ static boolean checkDependency(String pluginName) {
return ApiHandler.enabledPlugins.contains(pluginName);
}

private static boolean disableWorldEditHook() {
static boolean disableWorldEditHook() {
if (worldEditPlugin != null) {
try {
WorldEdit.getInstance().getEventBus().unregister(new PrismBlockEditHandler());
Prism.log("WorldEdit unhooked");
WorldEdit.getInstance().getEventBus().unregister(handler);
Prism.log(weType.pluginId + " unhooked");
enabledPlugins.remove(worldEditPlugin.getName());
worldEditPlugin = null;
return true;
Expand Down
1 change: 1 addition & 0 deletions Prism/src/main/java/network/darkhelmet/prism/Prism.java
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,7 @@ public void onDisable() {
for (Handler handler : prismLog.getHandlers()) {
handler.close();
}
ApiHandler.disableWorldEditHook();
shutdownTasks();
super.onDisable();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,37 @@
import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import network.darkhelmet.prism.ApiHandler;
import org.bukkit.Bukkit;

public class PrismBlockEditHandler {

private final ApiHandler.WEType weType;

public PrismBlockEditHandler(ApiHandler.WEType weType) {
this.weType = weType;
}

/**
* Wrap and edit session so it can be logged.
*
* @param event EditSessionEvent
*/
@Subscribe
public void wrapForLogging(EditSessionEvent event) {
if (event.getStage().equals(EditSession.Stage.BEFORE_CHANGE)) {
Actor actor = event.getActor();
org.bukkit.World world = Bukkit.getWorld(event.getWorld().getName());
if (actor != null && actor.isPlayer() && world != null) {
event.setExtent(new PrismWorldEditLogger(actor, event.getExtent(), world));
switch (weType) {
case WORLDEDIT, ASYNC_WORLDEDIT -> {
if (event.getStage() != EditSession.Stage.BEFORE_REORDER) return;
}
case FAST_ASYNC_WORLDEDIT -> {
if (event.getStage() != EditSession.Stage.BEFORE_HISTORY) return;
}
}

Actor actor = event.getActor();
org.bukkit.World world = Bukkit.getWorld(event.getWorld().getName());
if (actor != null && actor.isPlayer() && world != null) {
event.setExtent(new PrismWorldEditLogger(actor, event.getExtent(), world));
}
}
}

0 comments on commit be058bf

Please sign in to comment.