mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2024-06-13 22:31:45 +00:00
6ad11624bb
Also updates Gradle to 3.2.1, because keeping updated is good.
293 lines
10 KiB
Java
293 lines
10 KiB
Java
/*
|
|
* WorldEdit, a Minecraft world manipulation toolkit
|
|
* Copyright (C) sk89q <http://www.sk89q.com>
|
|
* Copyright (C) WorldEdit team and contributors
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package com.sk89q.worldedit.forge;
|
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
import com.google.common.base.Joiner;
|
|
import com.sk89q.worldedit.LocalSession;
|
|
import com.sk89q.worldedit.WorldEdit;
|
|
import com.sk89q.worldedit.WorldVector;
|
|
import com.sk89q.worldedit.blocks.BaseItemStack;
|
|
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
|
|
import com.sk89q.worldedit.extension.platform.Platform;
|
|
import com.sk89q.worldedit.internal.LocalWorldAdapter;
|
|
import com.sk89q.worldedit.util.Java8Detector;
|
|
|
|
import java.io.File;
|
|
import java.util.Map;
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.world.World;
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
import net.minecraftforge.event.CommandEvent;
|
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
|
import net.minecraftforge.fml.common.Loader;
|
|
import net.minecraftforge.fml.common.Mod;
|
|
import net.minecraftforge.fml.common.Mod.EventHandler;
|
|
import net.minecraftforge.fml.common.Mod.Instance;
|
|
import net.minecraftforge.fml.common.SidedProxy;
|
|
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
|
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
|
|
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
|
import net.minecraftforge.fml.common.event.FMLServerAboutToStartEvent;
|
|
import net.minecraftforge.fml.common.event.FMLServerStartedEvent;
|
|
import net.minecraftforge.fml.common.event.FMLServerStoppingEvent;
|
|
import net.minecraftforge.fml.common.eventhandler.Event.Result;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
|
|
import static com.google.common.base.Preconditions.checkNotNull;
|
|
|
|
/**
|
|
* The Forge implementation of WorldEdit.
|
|
*/
|
|
@Mod(modid = ForgeWorldEdit.MOD_ID, name = "WorldEdit", version = "%VERSION%", acceptableRemoteVersions = "*")
|
|
public class ForgeWorldEdit {
|
|
|
|
static {
|
|
Java8Detector.notifyIfNot8();
|
|
}
|
|
|
|
public static Logger logger;
|
|
public static final String MOD_ID = "worldedit";
|
|
public static final String CUI_PLUGIN_CHANNEL = "WECUI";
|
|
|
|
private ForgePermissionsProvider provider;
|
|
|
|
@Instance(MOD_ID)
|
|
public static ForgeWorldEdit inst;
|
|
|
|
@SidedProxy(serverSide = "com.sk89q.worldedit.forge.CommonProxy", clientSide = "com.sk89q.worldedit.forge.ClientProxy")
|
|
public static CommonProxy proxy;
|
|
|
|
private ForgePlatform platform;
|
|
private ForgeConfiguration config;
|
|
private File workingDir;
|
|
|
|
@EventHandler
|
|
public void preInit(FMLPreInitializationEvent event) {
|
|
logger = event.getModLog();
|
|
// Setup working directory
|
|
workingDir = new File(event.getModConfigurationDirectory() + File.separator + "worldedit");
|
|
workingDir.mkdir();
|
|
|
|
config = new ForgeConfiguration(this);
|
|
config.load();
|
|
|
|
MinecraftForge.EVENT_BUS.register(ThreadSafeCache.getInstance());
|
|
}
|
|
|
|
@EventHandler
|
|
public void init(FMLInitializationEvent event) {
|
|
MinecraftForge.EVENT_BUS.register(this);
|
|
WECUIPacketHandler.init();
|
|
proxy.registerHandlers();
|
|
}
|
|
|
|
@EventHandler
|
|
public void postInit(FMLPostInitializationEvent event) {
|
|
logger.info("WorldEdit for Forge (version " + getInternalVersion() + ") is loaded");
|
|
}
|
|
|
|
@EventHandler
|
|
public void serverAboutToStart(FMLServerAboutToStartEvent event) {
|
|
if (this.platform != null) {
|
|
logger.warn("FMLServerStartingEvent occurred when FMLServerStoppingEvent hasn't");
|
|
WorldEdit.getInstance().getPlatformManager().unregister(platform);
|
|
}
|
|
|
|
this.platform = new ForgePlatform(this);
|
|
|
|
WorldEdit.getInstance().getPlatformManager().register(platform);
|
|
|
|
if (Loader.isModLoaded("sponge")) {
|
|
this.provider = new ForgePermissionsProvider.SpongePermissionsProvider();
|
|
} else {
|
|
this.provider = new ForgePermissionsProvider.VanillaPermissionsProvider(platform);
|
|
}
|
|
}
|
|
|
|
@EventHandler
|
|
public void serverStopping(FMLServerStoppingEvent event) {
|
|
WorldEdit.getInstance().getPlatformManager().unregister(platform);
|
|
}
|
|
|
|
@EventHandler
|
|
public void serverStarted(FMLServerStartedEvent event) {
|
|
WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent());
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void onCommandEvent(CommandEvent event) {
|
|
if ((event.getSender() instanceof EntityPlayerMP)) {
|
|
if (((EntityPlayerMP) event.getSender()).world.isRemote) return;
|
|
String[] split = new String[event.getParameters().length + 1];
|
|
System.arraycopy(event.getParameters(), 0, split, 1, event.getParameters().length);
|
|
split[0] = event.getCommand().getName();
|
|
com.sk89q.worldedit.event.platform.CommandEvent weEvent =
|
|
new com.sk89q.worldedit.event.platform.CommandEvent(wrap((EntityPlayerMP) event.getSender()), Joiner.on(" ").join(split));
|
|
WorldEdit.getInstance().getEventBus().post(weEvent);
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
|
if (platform == null) {
|
|
return;
|
|
}
|
|
|
|
if (!platform.isHookingEvents())
|
|
return; // We have to be told to catch these events
|
|
|
|
boolean isLeftDeny = event instanceof PlayerInteractEvent.LeftClickBlock
|
|
&& ((PlayerInteractEvent.LeftClickBlock) event)
|
|
.getUseItem() == Result.DENY;
|
|
boolean isRightDeny =
|
|
event instanceof PlayerInteractEvent.RightClickBlock
|
|
&& ((PlayerInteractEvent.RightClickBlock) event)
|
|
.getUseItem() == Result.DENY;
|
|
if (isLeftDeny || isRightDeny || event.getEntity().world.isRemote) {
|
|
return;
|
|
}
|
|
|
|
WorldEdit we = WorldEdit.getInstance();
|
|
ForgePlayer player = wrap((EntityPlayerMP) event.getEntityPlayer());
|
|
ForgeWorld world = getWorld(event.getEntityPlayer().world);
|
|
|
|
if (event instanceof PlayerInteractEvent.LeftClickBlock) {
|
|
@SuppressWarnings("deprecation")
|
|
WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world),
|
|
event.getPos().getX(), event.getPos().getY(), event.getPos().getZ());
|
|
|
|
if (we.handleBlockLeftClick(player, pos)) {
|
|
event.setCanceled(true);
|
|
}
|
|
|
|
if (we.handleArmSwing(player)) {
|
|
event.setCanceled(true);
|
|
}
|
|
} else if (event instanceof PlayerInteractEvent.RightClickBlock) {
|
|
@SuppressWarnings("deprecation")
|
|
WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world),
|
|
event.getPos().getX(), event.getPos().getY(), event.getPos().getZ());
|
|
|
|
if (we.handleBlockRightClick(player, pos)) {
|
|
event.setCanceled(true);
|
|
}
|
|
|
|
if (we.handleRightClick(player)) {
|
|
event.setCanceled(true);
|
|
}
|
|
} else if (event instanceof PlayerInteractEvent.RightClickItem) {
|
|
if (we.handleRightClick(player)) {
|
|
event.setCanceled(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static ItemStack toForgeItemStack(BaseItemStack item) {
|
|
ItemStack ret = new ItemStack(Item.getItemById(item.getType()), item.getAmount(), item.getData());
|
|
for (Map.Entry<Integer, Integer> entry : item.getEnchantments().entrySet()) {
|
|
ret.addEnchantment(net.minecraft.enchantment.Enchantment.getEnchantmentByID(entry.getKey()), entry.getValue());
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* Get the configuration.
|
|
*
|
|
* @return the Forge configuration
|
|
*/
|
|
ForgeConfiguration getConfig() {
|
|
return this.config;
|
|
}
|
|
|
|
/**
|
|
* Get the WorldEdit proxy for the given player.
|
|
*
|
|
* @param player the player
|
|
* @return the WorldEdit player
|
|
*/
|
|
public ForgePlayer wrap(EntityPlayerMP player) {
|
|
checkNotNull(player);
|
|
return new ForgePlayer(player);
|
|
}
|
|
|
|
/**
|
|
* Get the session for a player.
|
|
*
|
|
* @param player the player
|
|
* @return the session
|
|
*/
|
|
public LocalSession getSession(EntityPlayerMP player) {
|
|
checkNotNull(player);
|
|
return WorldEdit.getInstance().getSessionManager().get(wrap(player));
|
|
}
|
|
|
|
/**
|
|
* Get the WorldEdit proxy for the given world.
|
|
*
|
|
* @param world the world
|
|
* @return the WorldEdit world
|
|
*/
|
|
public ForgeWorld getWorld(World world) {
|
|
checkNotNull(world);
|
|
return new ForgeWorld(world);
|
|
}
|
|
|
|
/**
|
|
* Get the WorldEdit proxy for the platform.
|
|
*
|
|
* @return the WorldEdit platform
|
|
*/
|
|
public Platform getPlatform() {
|
|
return this.platform;
|
|
}
|
|
|
|
/**
|
|
* Get the working directory where WorldEdit's files are stored.
|
|
*
|
|
* @return the working directory
|
|
*/
|
|
public File getWorkingDir() {
|
|
return this.workingDir;
|
|
}
|
|
|
|
/**
|
|
* Get the version of the WorldEdit-for-Forge implementation.
|
|
*
|
|
* @return a version string
|
|
*/
|
|
String getInternalVersion() {
|
|
return ForgeWorldEdit.class.getAnnotation(Mod.class).version();
|
|
}
|
|
|
|
public void setPermissionsProvider(ForgePermissionsProvider provider) {
|
|
this.provider = provider;
|
|
}
|
|
|
|
public ForgePermissionsProvider getPermissionsProvider() {
|
|
return provider;
|
|
}
|
|
|
|
}
|