Call forge command event (#174)
This commit is contained in:
parent
3f5ae63382
commit
36d01d1a16
|
@ -1,18 +1,27 @@
|
|||
package io.izzel.arclight.common.mixin.bukkit;
|
||||
|
||||
import com.mojang.brigadier.ParseResults;
|
||||
import com.mojang.brigadier.StringReader;
|
||||
import io.izzel.arclight.common.bridge.bukkit.CraftServerBridge;
|
||||
import io.izzel.arclight.common.bridge.world.WorldBridge;
|
||||
import io.izzel.arclight.common.mod.server.ArclightServer;
|
||||
import jline.console.ConsoleReader;
|
||||
import net.minecraft.command.CommandSource;
|
||||
import net.minecraft.server.dedicated.DedicatedPlayerList;
|
||||
import net.minecraft.server.dedicated.DedicatedServer;
|
||||
import net.minecraft.server.management.PlayerList;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.CommandEvent;
|
||||
import net.minecraftforge.event.world.WorldEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.craftbukkit.v.CraftServer;
|
||||
import org.bukkit.craftbukkit.v.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v.command.CraftBlockCommandSender;
|
||||
import org.bukkit.craftbukkit.v.command.CraftCommandMap;
|
||||
import org.bukkit.craftbukkit.v.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v.help.SimpleHelpMap;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.SimplePluginManager;
|
||||
|
@ -24,6 +33,7 @@ import org.spongepowered.asm.mixin.Shadow;
|
|||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
|
@ -86,6 +96,42 @@ public abstract class CraftServerMixin implements CraftServerBridge {
|
|||
this.console.markWorldsDirty();
|
||||
}
|
||||
|
||||
@ModifyVariable(method = "dispatchCommand", remap = false, index = 2, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lorg/spigotmc/AsyncCatcher;catchOp(Ljava/lang/String;)V"))
|
||||
private String arclight$forgeCommandEvent(String commandLine, CommandSender sender) {
|
||||
CommandSource commandSource;
|
||||
if (sender instanceof CraftEntity) {
|
||||
commandSource = ((CraftEntity) sender).getHandle().getCommandSource();
|
||||
} else if (sender == Bukkit.getConsoleSender()) {
|
||||
commandSource = ArclightServer.getMinecraftServer().getCommandSource();
|
||||
} else if (sender instanceof CraftBlockCommandSender) {
|
||||
commandSource = ((CraftBlockCommandSender) sender).getWrapper();
|
||||
} else {
|
||||
return commandLine;
|
||||
}
|
||||
StringReader stringreader = new StringReader("/" + commandLine);
|
||||
if (stringreader.canRead() && stringreader.peek() == '/') {
|
||||
stringreader.skip();
|
||||
}
|
||||
ParseResults<CommandSource> parse = ArclightServer.getMinecraftServer().getCommandManager()
|
||||
.getDispatcher().parse(stringreader, commandSource);
|
||||
CommandEvent event = new CommandEvent(parse);
|
||||
if (MinecraftForge.EVENT_BUS.post(event)) {
|
||||
return null;
|
||||
} else if (event.getException() != null) {
|
||||
return null;
|
||||
} else {
|
||||
String s = event.getParseResults().getReader().getString();
|
||||
return s.startsWith("/") ? s.substring(1) : s;
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "dispatchCommand", remap = false, cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lorg/spigotmc/AsyncCatcher;catchOp(Ljava/lang/String;)V"))
|
||||
private void arclight$returnIfFail(CommandSender sender, String commandLine, CallbackInfoReturnable<Boolean> cir) {
|
||||
if (commandLine == null) {
|
||||
cir.setReturnValue(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bridge$removeWorld(ServerWorld world) {
|
||||
if (world == null) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user