218 lines
6.7 KiB
Java
218 lines
6.7 KiB
Java
package com.boydti.fawe.forge;
|
|
|
|
|
|
import com.boydti.fawe.Fawe;
|
|
import com.boydti.fawe.IFawe;
|
|
import com.boydti.fawe.forge.v1710.ForgeQueue_All;
|
|
import com.boydti.fawe.object.FaweCommand;
|
|
import com.boydti.fawe.object.FawePlayer;
|
|
import com.boydti.fawe.object.FaweQueue;
|
|
import com.boydti.fawe.regions.FaweMaskManager;
|
|
import com.boydti.fawe.util.MainUtil;
|
|
import com.boydti.fawe.util.TaskManager;
|
|
import com.boydti.fawe.wrappers.WorldWrapper;
|
|
import com.sk89q.worldedit.EditSession;
|
|
import com.sk89q.worldedit.forge.ForgeWorld;
|
|
import com.sk89q.worldedit.internal.LocalWorldAdapter;
|
|
import com.sk89q.worldedit.world.World;
|
|
import cpw.mods.fml.common.FMLCommonHandler;
|
|
import cpw.mods.fml.common.ModMetadata;
|
|
import java.io.File;
|
|
import java.lang.reflect.Method;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
import javax.management.InstanceAlreadyExistsException;
|
|
import net.minecraft.command.ServerCommandManager;
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.world.WorldServer;
|
|
import net.minecraftforge.common.DimensionManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
public class FaweForge implements IFawe {
|
|
|
|
private final ForgeMain parent;
|
|
private final File directory;
|
|
private final Logger logger;
|
|
private final ModMetadata mod;
|
|
|
|
public FaweForge(ForgeMain plugin, Logger logger, ModMetadata mod, File directory) {
|
|
this.parent = plugin;
|
|
this.logger = logger;
|
|
this.directory = directory;
|
|
this.mod = mod;
|
|
try {
|
|
Fawe.set(this);
|
|
setupInjector();
|
|
} catch (InstanceAlreadyExistsException e) {
|
|
MainUtil.handleError(e);
|
|
}
|
|
}
|
|
|
|
public void setupInjector() {
|
|
try {
|
|
Fawe.setupInjector();
|
|
com.sk89q.worldedit.forge.ForgePlayer.inject();
|
|
} catch (Throwable e) {
|
|
Fawe.debug("Failed to inject WorldEdit classes.");
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void debug(String s) {
|
|
logger.error(s);
|
|
}
|
|
|
|
@Override
|
|
public boolean isOnlineMode() {
|
|
return MinecraftServer.getServer().isServerInOnlineMode();
|
|
}
|
|
|
|
@Override
|
|
public String getPlatformVersion() {
|
|
return MinecraftServer.getServer().getMinecraftVersion();
|
|
}
|
|
|
|
@Override
|
|
public int getPlayerCount() {
|
|
return MinecraftServer.getServer().getCurrentPlayerCount();
|
|
}
|
|
|
|
@Override
|
|
public File getDirectory() {
|
|
return directory;
|
|
}
|
|
|
|
private HashMap<String, FaweCommand> commands = new HashMap<>();
|
|
|
|
@Override
|
|
public void setupCommand(String label, FaweCommand cmd) {
|
|
this.commands.put(label, cmd);
|
|
}
|
|
|
|
public void insertCommands() {
|
|
for (Map.Entry<String, FaweCommand> entry : commands.entrySet()) {
|
|
ServerCommandManager scm = (ServerCommandManager) FMLCommonHandler.instance().getMinecraftServerInstance().getCommandManager();
|
|
scm.registerCommand(new ForgeCommand(entry.getKey(), entry.getValue()));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public FawePlayer wrap(Object obj) {
|
|
EntityPlayerMP player = null;
|
|
if (obj instanceof String) {
|
|
MinecraftServer server = MinecraftServer.getServer();
|
|
player = server.getConfigurationManager().func_152612_a((String) obj);
|
|
} else if (obj instanceof EntityPlayerMP) {
|
|
player = (EntityPlayerMP) obj;
|
|
}
|
|
if (player == null) {
|
|
return null;
|
|
}
|
|
FawePlayer existing = Fawe.get().getCachedPlayer(player.getCommandSenderName());
|
|
return existing != null ? existing : new ForgePlayer(player);
|
|
}
|
|
|
|
@Override
|
|
public void setupVault() {
|
|
// Do nothing
|
|
}
|
|
|
|
@Override
|
|
public TaskManager getTaskManager() {
|
|
return new ForgeTaskMan(512);
|
|
}
|
|
|
|
@Override
|
|
public String getWorldName(World world) {
|
|
if (world instanceof WorldWrapper) {
|
|
return getWorldName(((WorldWrapper) world).getParent());
|
|
}
|
|
else if (world instanceof EditSession) {
|
|
return getWorldName(((EditSession) world).getWorld());
|
|
} else if (world.getClass().getName().equals("com.sk89q.worldedit.bukkit.BukkitWorld")) {
|
|
try {
|
|
Class<?> classBukkitWorld = world.getClass();
|
|
Method methodGetWorld = classBukkitWorld.getDeclaredMethod("getWorld");
|
|
methodGetWorld.setAccessible(true);
|
|
Object craftWorld = methodGetWorld.invoke(world);
|
|
Class<? extends Object> classCraftWorld = craftWorld.getClass();
|
|
Method methodGetHandle = classCraftWorld.getDeclaredMethod("getHandle");
|
|
methodGetHandle.setAccessible(true);
|
|
Object nmsWorld = methodGetHandle.invoke(craftWorld);
|
|
return getWorldName((net.minecraft.world.World) nmsWorld);
|
|
} catch (Throwable e) {
|
|
e.printStackTrace();
|
|
return world.getName();
|
|
}
|
|
}else if (world instanceof LocalWorldAdapter){
|
|
return world.getName();
|
|
}
|
|
return getWorldName(((ForgeWorld) world).getWorld());
|
|
}
|
|
|
|
public String getWorldName(net.minecraft.world.World w) {
|
|
Integer[] ids = DimensionManager.getIDs();
|
|
WorldServer[] worlds = DimensionManager.getWorlds();
|
|
for (int i = 0; i < ids.length; i++) {
|
|
if (worlds[i] == w) {
|
|
return w.getWorldInfo().getWorldName() + ";" + ids[i];
|
|
}
|
|
}
|
|
return w.getWorldInfo().getWorldName() + ";" + w.provider.dimensionId;
|
|
}
|
|
|
|
@Override
|
|
public FaweQueue getNewQueue(World world, boolean dontCareIfFast) {
|
|
return new ForgeQueue_All(world);
|
|
}
|
|
|
|
@Override
|
|
public FaweQueue getNewQueue(String world, boolean dontCareIfFast) {
|
|
return new ForgeQueue_All(world);
|
|
}
|
|
|
|
@Override
|
|
public Collection<FaweMaskManager> getMaskManagers() {
|
|
return new ArrayList<>();
|
|
}
|
|
|
|
@Override
|
|
public void startMetrics() {
|
|
try {
|
|
ForgeMetrics metrics = new ForgeMetrics("FastAsyncWorldEdit", "3.5.1");
|
|
metrics.start();
|
|
} catch (Throwable e) {
|
|
debug("[FAWE] &cFailed to load up metrics.");
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getPlatform() {
|
|
return "forge";
|
|
}
|
|
|
|
@Override
|
|
public UUID getUUID(String name) {
|
|
try {
|
|
return UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(StandardCharsets.UTF_8));
|
|
} catch (Throwable e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getName(UUID uuid) {
|
|
return uuid.toString();
|
|
}
|
|
|
|
@Override
|
|
public Object getBlocksHubApi() {
|
|
return null;
|
|
}
|
|
}
|