diff --git a/.travis.yml b/.travis.yml index e526c902f..9321cf073 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ jdk: - openjdk6 # Caching for Gradle files, prevents hitting Maven too much. before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - find $HOME/.gradle/ -name '*.lock' -print -exec rm -f {} \; cache: directories: - $HOME/.gradle/caches/ diff --git a/build.gradle b/build.gradle index b797f51f2..144b8de13 100644 --- a/build.gradle +++ b/build.gradle @@ -26,9 +26,9 @@ buildscript { } dependencies { - classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.0' + classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1' - classpath 'org.ajoberstar:gradle-git:0.12.0' + classpath 'org.ajoberstar:gradle-git:1.4.2' } } @@ -36,14 +36,19 @@ if (!project.hasProperty("artifactory_contextUrl")) ext.artifactory_contextUrl = if (!project.hasProperty("artifactory_user")) ext.artifactory_user = "guest" if (!project.hasProperty("artifactory_password")) ext.artifactory_password = "" -if (!project.hasProperty("gitCommitHash")) { +if (!project.hasProperty("gitCommitHash") && !JavaVersion.current().isJava6()) { try { - def repo = Grgit.open(project.file('.')) + def Grgit = Class.forName("org.ajoberstar.grgit.Grgit"); + def Grgit_open = Grgit.getDeclaredMethod("open", File.class) + def repo = Grgit_open.invoke(null, project.file('.')) ext.gitCommitHash = repo.head().abbreviatedId } catch (Exception e) { - ext.gitCommitHash = "no_git_id" + println "Error getting commit hash: " + e.getMessage() } } +if (!project.hasProperty("gitCommitHash")) { + ext.gitCommitHash = "no_git_id" +} subprojects { apply plugin: 'java' @@ -75,11 +80,6 @@ subprojects { } } - task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource - } - task javadocJar(type: Jar, dependsOn: javadoc) { classifier = 'javadoc' from javadoc.destinationDir @@ -87,13 +87,23 @@ subprojects { artifacts { archives jar - archives sourcesJar archives javadocJar } + if (!name.equals('worldedit-forge')) { + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + } + + artifacts { + archives sourcesJar + } + build.dependsOn(sourcesJar) + } + build.dependsOn(checkstyleMain) build.dependsOn(checkstyleTest) - build.dependsOn(sourcesJar) build.dependsOn(javadocJar) shadowJar { diff --git a/config/checkstyle/import-control.xml b/config/checkstyle/import-control.xml index 1209aa71d..3e4233471 100644 --- a/config/checkstyle/import-control.xml +++ b/config/checkstyle/import-control.xml @@ -48,13 +48,14 @@ - + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 3c7abdf12..5ccda13e9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 74fe3a953..b2c6e7a02 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Apr 07 22:45:51 PDT 2014 +#Mon Feb 22 17:40:44 PST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.11-bin.zip diff --git a/gradlew b/gradlew index 91a7e269e..9d82f7891 100755 --- a/gradlew +++ b/gradlew @@ -42,11 +42,6 @@ case "`uname`" in ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -61,9 +56,9 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` diff --git a/gradlew.bat b/gradlew.bat index 8a0b282aa..72d362daf 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,90 +1,90 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/worldedit-forge/build.gradle b/worldedit-forge/build.gradle index a5857ecb8..41e0f4126 100644 --- a/worldedit-forge/build.gradle +++ b/worldedit-forge/build.gradle @@ -7,28 +7,33 @@ buildscript { } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT' } } -apply plugin: 'forge' - -repositories { - maven { - name 'forge' - url 'http://files.minecraftforge.net/maven/' - } -} +apply plugin: 'net.minecraftforge.gradle.forge' dependencies { compile project(':worldedit-core') - compile group: 'codechicken', name: 'ForgeMultipart', version: '1.7.10-1.2.0.345', classifier: 'dev' + compile 'org.spongepowered:spongeapi:3.1.0-SNAPSHOT' testCompile group: 'org.mockito', name: 'mockito-core', version: '1.9.0-rc1' } +repositories { + maven { + name = "Sponge" + url = "https://repo.spongepowered.org/maven" + } +} + +version = "6.1.1" +ext.forgeVersion = "11.15.1.1760" +ext.internalVersion = version + ";" + gitCommitHash + minecraft { - ext.forgeVersion = "10.13.4.1614-1.7.10" - version = "1.7.10-$forgeVersion" + version = "1.8.9-${project.forgeVersion}" + mappings = "snapshot_20160111" + runDir = 'run' replaceIn "com/sk89q/worldedit/forge/ForgeWorldEdit.java" replace "%VERSION%", project.version @@ -39,8 +44,8 @@ project.archivesBaseName = "${project.archivesBaseName}-mc${minecraft.version}" processResources { from (sourceSets.main.resources.srcDirs) { expand 'version': project.version, - 'mcVersion': project.minecraft.version, - 'forgeVersion': project.minecraft.forgeVersion, + 'mcVersion': project.minecraft.version, + 'forgeVersion': project.forgeVersion, 'internalVersion': project.internalVersion include 'mcmod.info' } @@ -53,7 +58,8 @@ processResources { jar { manifest { attributes("Class-Path": "truezip.jar WorldEdit/truezip.jar js.jar WorldEdit/js.jar", - "WorldEdit-Version": version) + "WorldEdit-Version": version, + "FMLAT": "worldedit_at.cfg") } } @@ -63,8 +69,10 @@ shadowJar { } } -reobf.reobf(shadowJar) { spec -> - spec.classpath = sourceSets.main.compileClasspath; +reobf { + shadowJar { + mappingType = 'SEARGE' + } } task deobfJar(type: Jar) { @@ -75,5 +83,3 @@ task deobfJar(type: Jar) { artifacts { archives deobfJar } - -build.dependsOn(shadowJar) diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ClientProxy.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ClientProxy.java index ebb5fa675..688728a63 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ClientProxy.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ClientProxy.java @@ -19,14 +19,14 @@ package com.sk89q.worldedit.forge; -import cpw.mods.fml.common.FMLCommonHandler; +import net.minecraftforge.common.MinecraftForge; public class ClientProxy extends CommonProxy { @Override public void registerHandlers() { super.registerHandlers(); - FMLCommonHandler.instance().bus().register(new KeyHandler()); + MinecraftForge.EVENT_BUS.register(new KeyHandler()); } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommandWrapper.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommandWrapper.java index fb5c55550..2b555c851 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommandWrapper.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommandWrapper.java @@ -19,18 +19,14 @@ package com.sk89q.worldedit.forge; -import com.google.common.base.Joiner; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.event.platform.CommandSuggestionEvent; import com.sk89q.worldedit.util.command.CommandMapping; + +import java.util.Arrays; +import java.util.List; +import javax.annotation.Nullable; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.EntityPlayerMP; - -import javax.annotation.Nullable; -import java.util.Arrays; -import java.util.List; public class CommandWrapper extends CommandBase { private CommandMapping command; @@ -52,17 +48,6 @@ public class CommandWrapper extends CommandBase { @Override public void processCommand(ICommandSender var1, String[] var2) {} - @Override - public List addTabCompletionOptions(ICommandSender sender, String[] arguments) { - if (sender instanceof EntityPlayerMP) { - CommandSuggestionEvent event = new CommandSuggestionEvent(ForgeWorldEdit.inst.wrap((EntityPlayerMP) sender), command.getPrimaryAlias() + " " + Joiner.on(" ").join(arguments)); - WorldEdit.getInstance().getEventBus().post(event); - return event.getSuggestions(); - } else { - return super.addTabCompletionOptions(sender, arguments); - } - } - @Override public String getCommandUsage(ICommandSender icommandsender) { return "/" + command.getPrimaryAlias() + " " + command.getDescription().getUsage(); @@ -79,7 +64,7 @@ public class CommandWrapper extends CommandBase { } @Override - public int compareTo(@Nullable Object o) { + public int compareTo(@Nullable ICommand o) { if (o == null) { return 0; } else if (o instanceof ICommand) { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommonProxy.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommonProxy.java index 8163afaae..fbb07b9d2 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommonProxy.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/CommonProxy.java @@ -19,8 +19,9 @@ package com.sk89q.worldedit.forge; +import net.minecraftforge.fml.common.network.NetworkRegistry; + import com.sk89q.worldedit.forge.gui.GuiHandler; -import cpw.mods.fml.common.network.NetworkRegistry; public class CommonProxy { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java index c7195da31..9c64b9403 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeAdapter.java @@ -20,10 +20,9 @@ package com.sk89q.worldedit.forge; import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.world.World; +import net.minecraft.util.BlockPos; import net.minecraft.util.Vec3; -import net.minecraftforge.common.util.ForgeDirection; final class ForgeAdapter { @@ -38,15 +37,16 @@ final class ForgeAdapter { return new Vector(vector.xCoord, vector.yCoord, vector.zCoord); } - public static int adapt(Direction face) { - switch (face) { - case NORTH: return ForgeDirection.NORTH.ordinal(); - case SOUTH: return ForgeDirection.SOUTH.ordinal(); - case WEST: return ForgeDirection.WEST.ordinal(); - case EAST: return ForgeDirection.EAST.ordinal(); - case UP: return ForgeDirection.UP.ordinal(); - case DOWN: return ForgeDirection.DOWN.ordinal(); - default: return ForgeDirection.UNKNOWN.ordinal(); - } + public static Vector adapt(BlockPos pos) { + return new Vector(pos.getX(), pos.getY(), pos.getZ()); } + + public static Vec3 toVec3(Vector vector) { + return new Vec3(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); + } + + public static BlockPos toBlockPos(Vector vector) { + return new BlockPos(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); + } + } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeConfiguration.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeConfiguration.java index efcaa1aab..011a6a3a1 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeConfiguration.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeConfiguration.java @@ -1,45 +1,45 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge; - -import com.sk89q.worldedit.util.PropertiesConfiguration; - -import java.io.File; - -public class ForgeConfiguration extends PropertiesConfiguration { - - public boolean creativeEnable = false; - public boolean cheatMode = false; - - public ForgeConfiguration(ForgeWorldEdit mod) { - super(new File(mod.getWorkingDir() + File.separator + "worldedit.properties")); - } - - @Override - protected void loadExtra() { - creativeEnable = getBool("use-in-creative", false); - cheatMode = getBool("cheat-mode", false); - } - - @Override - public File getWorkingDirectory() { - return ForgeWorldEdit.inst.getWorkingDir(); - } +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.forge; + +import com.sk89q.worldedit.util.PropertiesConfiguration; + +import java.io.File; + +public class ForgeConfiguration extends PropertiesConfiguration { + + public boolean creativeEnable = false; + public boolean cheatMode = false; + + public ForgeConfiguration(ForgeWorldEdit mod) { + super(new File(mod.getWorkingDir() + File.separator + "worldedit.properties")); + } + + @Override + protected void loadExtra() { + creativeEnable = getBool("use-in-creative", false); + cheatMode = getBool("cheat-mode", false); + } + + @Override + public File getWorkingDirectory() { + return ForgeWorldEdit.inst.getWorkingDir(); + } } \ No newline at end of file diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java index 4888c748d..c56375105 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeEntityType.java @@ -36,6 +36,7 @@ import net.minecraft.entity.item.EntityTNTPrimed; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.monster.EntityGolem; import net.minecraft.entity.passive.EntityAmbientCreature; +import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityTameable; import net.minecraft.entity.passive.IAnimals; import net.minecraft.entity.player.EntityPlayer; @@ -108,7 +109,7 @@ public class ForgeEntityType implements EntityType { @Override public boolean isAnimal() { - return entity instanceof IAnimals; + return entity instanceof EntityAnimal; } @Override @@ -133,7 +134,7 @@ public class ForgeEntityType implements EntityType { @Override public boolean isTagged() { - return entity instanceof EntityLiving && ((EntityLiving) entity).hasCustomNameTag(); + return entity instanceof EntityLiving && ((EntityLiving) entity).hasCustomName(); } @Override diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemRegistry.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemRegistry.java deleted file mode 100644 index 3dcb0dbf3..000000000 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeItemRegistry.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge; - -import com.sk89q.worldedit.blocks.BaseItem; -import com.sk89q.worldedit.world.registry.ItemRegistry; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nullable; - -public class ForgeItemRegistry implements ItemRegistry { - - @Nullable - @Override - public BaseItem createFromId(String id) { - Item item = (Item) Item.itemRegistry.getObject(id); - if (item != null) { - return new BaseItem(Item.getIdFromItem(item), (short) item.getDamage(new ItemStack(item, 1))); - } else { - return null; - } - } - - @Nullable - @Override - public BaseItem createFromId(int id) { - Item item = (Item) Item.itemRegistry.getObjectById(id); - if (item != null) { - return new BaseItem(Item.getIdFromItem(item), (short) item.getDamage(new ItemStack(item, 1))); - } else { - return null; - } - } - -} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePermissionsProvider.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePermissionsProvider.java index 60408df6c..c68131265 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePermissionsProvider.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePermissionsProvider.java @@ -19,10 +19,11 @@ package com.sk89q.worldedit.forge; -import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.command.ICommand; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.world.WorldSettings.GameType; +import net.minecraftforge.fml.common.FMLCommonHandler; +import org.spongepowered.api.entity.living.player.Player; public interface ForgePermissionsProvider { @@ -42,11 +43,24 @@ public interface ForgePermissionsProvider { public boolean hasPermission(EntityPlayerMP player, String permission) { ForgeConfiguration configuration = platform.getConfiguration(); return configuration.cheatMode || - FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().func_152596_g(player.getGameProfile()) || + FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().canSendCommands(player.getGameProfile()) || (configuration.creativeEnable && player.theItemInWorldManager.getGameType() == GameType.CREATIVE); } @Override public void registerPermission(ICommand command, String permission) {} } + + public static class SpongePermissionsProvider implements ForgePermissionsProvider { + + @Override + public boolean hasPermission(EntityPlayerMP player, String permission) { + return ((Player) player).hasPermission(permission); + } + + @Override + public void registerPermission(ICommand command, String permission) { + + } + } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java index 442b2c055..7edb92b3a 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlatform.java @@ -28,7 +28,7 @@ import com.sk89q.worldedit.extension.platform.Preference; import com.sk89q.worldedit.util.command.CommandMapping; import com.sk89q.worldedit.util.command.Dispatcher; import com.sk89q.worldedit.world.World; -import cpw.mods.fml.common.FMLCommonHandler; + import net.minecraft.block.Block; import net.minecraft.command.ServerCommandManager; import net.minecraft.entity.EntityList; @@ -38,8 +38,10 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.ServerConfigurationManager; import net.minecraft.world.WorldServer; import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.fml.common.FMLCommonHandler; import javax.annotation.Nullable; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -121,7 +123,7 @@ class ForgePlatform extends AbstractPlatform implements MultiUserPlatform { if (player instanceof ForgePlayer) { return player; } else { - EntityPlayerMP entity = server.getConfigurationManager().func_152612_a(player.getName()); + EntityPlayerMP entity = server.getConfigurationManager().getPlayerByUsername(player.getName()); return entity != null ? new ForgePlayer(this, entity) : null; } } @@ -202,7 +204,7 @@ class ForgePlatform extends AbstractPlatform implements MultiUserPlatform { List users = new ArrayList(); ServerConfigurationManager scm = server.getConfigurationManager(); for (String name : scm.getAllUsernames()) { - EntityPlayerMP entity = scm.func_152612_a(name); + EntityPlayerMP entity = scm.getPlayerByUsername(name); if (entity != null) { users.add(new ForgePlayer(this, entity)); } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java index 945b790a4..4553c1694 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java @@ -1,216 +1,222 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge; - -import com.sk89q.util.StringUtil; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.WorldVector; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.extension.platform.AbstractPlayerActor; -import com.sk89q.worldedit.extent.inventory.BlockBag; -import com.sk89q.worldedit.internal.LocalWorldAdapter; -import com.sk89q.worldedit.internal.cui.CUIEvent; -import com.sk89q.worldedit.session.SessionKey; -import com.sk89q.worldedit.util.Location; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.network.play.server.S3FPacketCustomPayload; -import net.minecraft.util.ChatComponentText; - -import javax.annotation.Nullable; - -import java.util.UUID; - -public class ForgePlayer extends AbstractPlayerActor { - - private final ForgePlatform platform; - private final EntityPlayerMP player; - - protected ForgePlayer(ForgePlatform platform, EntityPlayerMP player) { - this.platform = platform; - this.player = player; - ThreadSafeCache.getInstance().getOnlineIds().add(getUniqueId()); - } - - @Override - public UUID getUniqueId() { - return player.getUniqueID(); - } - - @Override - public int getItemInHand() { - ItemStack is = this.player.getCurrentEquippedItem(); - return is == null ? 0 : Item.getIdFromItem(is.getItem()); - } - - @Override - public String getName() { - return this.player.getCommandSenderName(); - } - - @Override - public BaseEntity getState() { - throw new UnsupportedOperationException("Cannot create a state from this object"); - } - - @Override - public Location getLocation() { - Vector position = new Vector(this.player.posX, this.player.posY, this.player.posZ); - return new Location( - ForgeWorldEdit.inst.getWorld(this.player.worldObj), - position, - this.player.cameraYaw, - this.player.cameraPitch); - } - - @Override - public WorldVector getPosition() { - return new WorldVector(LocalWorldAdapter.adapt(ForgeWorldEdit.inst.getWorld(this.player.worldObj)), this.player.posX, this.player.posY, this.player.posZ); - } - - @Override - public com.sk89q.worldedit.world.World getWorld() { - return ForgeWorldEdit.inst.getWorld(this.player.worldObj); - } - - @Override - public double getPitch() { - return this.player.rotationPitch; - } - - @Override - public double getYaw() { - return this.player.rotationYaw; - } - - @Override - public void giveItem(int type, int amt) { - this.player.inventory.addItemStackToInventory(new ItemStack(Item.getItemById(type), amt, 0)); - } - - @Override - public void dispatchCUIEvent(CUIEvent event) { - String[] params = event.getParameters(); - String send = event.getTypeId(); - if (params.length > 0) { - send = send + "|" + StringUtil.joinString(params, "|"); - } - S3FPacketCustomPayload packet = new S3FPacketCustomPayload(ForgeWorldEdit.CUI_PLUGIN_CHANNEL, send.getBytes(WECUIPacketHandler.UTF_8_CHARSET)); - this.player.playerNetServerHandler.sendPacket(packet); - } - - @Override - public void printRaw(String msg) { - for (String part : msg.split("\n")) { - this.player.addChatMessage(new ChatComponentText(part)); - } - } - - @Override - public void printDebug(String msg) { - for (String part : msg.split("\n")) { - this.player.addChatMessage(new ChatComponentText("\u00a77" + part)); - } - } - - @Override - public void print(String msg) { - for (String part : msg.split("\n")) { - this.player.addChatMessage(new ChatComponentText("\u00a7d" + part)); - } - } - - @Override - public void printError(String msg) { - for (String part : msg.split("\n")) { - this.player.addChatMessage(new ChatComponentText("\u00a7c" + part)); - } - } - - @Override - public void setPosition(Vector pos, float pitch, float yaw) { - this.player.playerNetServerHandler.setPlayerLocation(pos.getX(), pos.getY(), pos.getZ(), pitch, yaw); - } - - @Override - public String[] getGroups() { - return new String[]{}; // WorldEditMod.inst.getPermissionsResolver().getGroups(this.player.username); - } - - @Override - public BlockBag getInventoryBlockBag() { - return null; - } - - @Override - public boolean hasPermission(String perm) { - return ForgeWorldEdit.inst.getPermissionsProvider().hasPermission(player, perm); - } - - @Nullable - @Override - public T getFacet(Class cls) { - return null; - } - - @Override - public SessionKey getSessionKey() { - return new SessionKeyImpl(player.getUniqueID(), player.getCommandSenderName()); - } - - private static class SessionKeyImpl implements SessionKey { - // If not static, this will leak a reference - - private final UUID uuid; - private final String name; - - private SessionKeyImpl(UUID uuid, String name) { - this.uuid = uuid; - this.name = name; - } - - @Override - public UUID getUniqueId() { - return uuid; - } - - @Nullable - @Override - public String getName() { - return name; - } - - @Override - public boolean isActive() { - // We can't directly check if the player is online because - // the list of players is not thread safe - return ThreadSafeCache.getInstance().getOnlineIds().contains(uuid); - } - - @Override - public boolean isPersistent() { - return true; - } - - } - -} \ No newline at end of file +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.forge; + +import com.sk89q.util.StringUtil; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.WorldVector; +import com.sk89q.worldedit.entity.BaseEntity; +import com.sk89q.worldedit.extension.platform.AbstractPlayerActor; +import com.sk89q.worldedit.extent.inventory.BlockBag; +import com.sk89q.worldedit.internal.LocalWorldAdapter; +import com.sk89q.worldedit.internal.cui.CUIEvent; +import com.sk89q.worldedit.session.SessionKey; +import com.sk89q.worldedit.util.Location; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.server.S3FPacketCustomPayload; +import net.minecraft.util.ChatComponentText; +import io.netty.buffer.Unpooled; +import net.minecraft.util.EnumChatFormatting; + +import javax.annotation.Nullable; + +import java.util.UUID; + +public class ForgePlayer extends AbstractPlayerActor { + + private final ForgePlatform platform; + private final EntityPlayerMP player; + + protected ForgePlayer(ForgePlatform platform, EntityPlayerMP player) { + this.platform = platform; + this.player = player; + ThreadSafeCache.getInstance().getOnlineIds().add(getUniqueId()); + } + + @Override + public UUID getUniqueId() { + return player.getUniqueID(); + } + + @Override + public int getItemInHand() { + ItemStack is = this.player.getCurrentEquippedItem(); + return is == null ? 0 : Item.getIdFromItem(is.getItem()); + } + + @Override + public String getName() { + return this.player.getName(); + } + + @Override + public BaseEntity getState() { + throw new UnsupportedOperationException("Cannot create a state from this object"); + } + + @Override + public Location getLocation() { + Vector position = new Vector(this.player.posX, this.player.posY, this.player.posZ); + return new Location( + ForgeWorldEdit.inst.getWorld(this.player.worldObj), + position, + this.player.rotationYaw, + this.player.rotationPitch); + } + + @Override + public WorldVector getPosition() { + return new WorldVector(LocalWorldAdapter.adapt(ForgeWorldEdit.inst.getWorld(this.player.worldObj)), this.player.posX, this.player.posY, this.player.posZ); + } + + @Override + public com.sk89q.worldedit.world.World getWorld() { + return ForgeWorldEdit.inst.getWorld(this.player.worldObj); + } + + @Override + public double getPitch() { + return this.player.rotationPitch; + } + + @Override + public double getYaw() { + return this.player.rotationYaw; + } + + @Override + public void giveItem(int type, int amt) { + this.player.inventory.addItemStackToInventory(new ItemStack(Item.getItemById(type), amt, 0)); + } + + @Override + public void dispatchCUIEvent(CUIEvent event) { + String[] params = event.getParameters(); + String send = event.getTypeId(); + if (params.length > 0) { + send = send + "|" + StringUtil.joinString(params, "|"); + } + PacketBuffer buffer = new PacketBuffer(Unpooled.copiedBuffer(send.getBytes(WECUIPacketHandler.UTF_8_CHARSET))); + S3FPacketCustomPayload packet = new S3FPacketCustomPayload(ForgeWorldEdit.CUI_PLUGIN_CHANNEL, buffer); + this.player.playerNetServerHandler.sendPacket(packet); + } + + @Override + public void printRaw(String msg) { + for (String part : msg.split("\n")) { + this.player.addChatMessage(new ChatComponentText(part)); + } + } + + @Override + public void printDebug(String msg) { + sendColorized(msg, EnumChatFormatting.GRAY); + } + + @Override + public void print(String msg) { + sendColorized(msg, EnumChatFormatting.LIGHT_PURPLE); + } + + @Override + public void printError(String msg) { + sendColorized(msg, EnumChatFormatting.RED); + } + + private void sendColorized(String msg, EnumChatFormatting formatting) { + for (String part : msg.split("\n")) { + ChatComponentText component = new ChatComponentText(part); + component.getChatStyle().setColor(formatting); + this.player.addChatMessage(component); + } + } + + @Override + public void setPosition(Vector pos, float pitch, float yaw) { + this.player.playerNetServerHandler.setPlayerLocation(pos.getX(), pos.getY(), pos.getZ(), yaw, pitch); + } + + @Override + public String[] getGroups() { + return new String[]{}; // WorldEditMod.inst.getPermissionsResolver().getGroups(this.player.username); + } + + @Override + public BlockBag getInventoryBlockBag() { + return null; + } + + @Override + public boolean hasPermission(String perm) { + return ForgeWorldEdit.inst.getPermissionsProvider().hasPermission(player, perm); + } + + @Nullable + @Override + public T getFacet(Class cls) { + return null; + } + + @Override + public SessionKey getSessionKey() { + return new SessionKeyImpl(player.getUniqueID(), player.getName()); + } + + private static class SessionKeyImpl implements SessionKey { + // If not static, this will leak a reference + + private final UUID uuid; + private final String name; + + private SessionKeyImpl(UUID uuid, String name) { + this.uuid = uuid; + this.name = name; + } + + @Override + public UUID getUniqueId() { + return uuid; + } + + @Nullable + @Override + public String getName() { + return name; + } + + @Override + public boolean isActive() { + // We can't directly check if the player is online because + // the list of players is not thread safe + return ThreadSafeCache.getInstance().getOnlineIds().contains(uuid); + } + + @Override + public boolean isPersistent() { + return true; + } + + } + +} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java index c89863610..e89c46112 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorld.java @@ -1,483 +1,445 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge; - -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.MaxChangedBlocksException; -import com.sk89q.worldedit.Vector; -import com.sk89q.worldedit.Vector2D; -import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.blocks.BaseItem; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.LazyBlock; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.Entity; -import com.sk89q.worldedit.internal.Constants; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.util.Direction; -import com.sk89q.worldedit.util.Location; -import com.sk89q.worldedit.util.TreeGenerator.TreeType; -import com.sk89q.worldedit.world.AbstractWorld; -import com.sk89q.worldedit.world.biome.BaseBiome; -import com.sk89q.worldedit.world.registry.WorldData; -import net.minecraft.block.Block; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.LongHashMap; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraft.world.gen.ChunkProviderServer; -import net.minecraft.world.gen.feature.WorldGenBigMushroom; -import net.minecraft.world.gen.feature.WorldGenBigTree; -import net.minecraft.world.gen.feature.WorldGenCanopyTree; -import net.minecraft.world.gen.feature.WorldGenForest; -import net.minecraft.world.gen.feature.WorldGenMegaJungle; -import net.minecraft.world.gen.feature.WorldGenMegaPineTree; -import net.minecraft.world.gen.feature.WorldGenSavannaTree; -import net.minecraft.world.gen.feature.WorldGenShrub; -import net.minecraft.world.gen.feature.WorldGenSwamp; -import net.minecraft.world.gen.feature.WorldGenTaiga1; -import net.minecraft.world.gen.feature.WorldGenTaiga2; -import net.minecraft.world.gen.feature.WorldGenTrees; -import net.minecraft.world.gen.feature.WorldGenerator; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * An adapter to Minecraft worlds for WorldEdit. - */ -public class ForgeWorld extends AbstractWorld { - - private static final Logger logger = Logger.getLogger(ForgeWorld.class.getCanonicalName()); - private static final Random random = new Random(); - private final WeakReference worldRef; - - /** - * Construct a new world. - * - * @param world the world - */ - ForgeWorld(World world) { - checkNotNull(world); - this.worldRef = new WeakReference(world); - } - - /** - * Get the underlying handle to the world. - * - * @return the world - * @throws WorldEditException thrown if a reference to the world was lost (i.e. world was unloaded) - */ - public World getWorldChecked() throws WorldEditException { - World world = worldRef.get(); - if (world != null) { - return world; - } else { - throw new WorldReferenceLostException("The reference to the world was lost (i.e. the world may have been unloaded)"); - } - } - - /** - * Get the underlying handle to the world. - * - * @return the world - * @throws RuntimeException thrown if a reference to the world was lost (i.e. world was unloaded) - */ - public World getWorld() { - World world = worldRef.get(); - if (world != null) { - return world; - } else { - throw new RuntimeException("The reference to the world was lost (i.e. the world may have been unloaded)"); - } - } - - @Override - public String getName() { - return getWorld().getWorldInfo().getWorldName(); - } - - @Override - public boolean useItem(Vector position, BaseItem item, Direction face) { - Item nativeItem = Item.getItemById(item.getType()); - ItemStack stack = new ItemStack(nativeItem, 1, item.getData()); - World world = getWorld(); - return stack.tryPlaceItemIntoWorld(new WorldEditFakePlayer((WorldServer) world), world, position.getBlockX(), position.getBlockY(), position.getBlockZ(), ForgeAdapter.adapt(face), 0, 0, 0); - } - - @Override - public boolean setBlock(Vector position, BaseBlock block, boolean notifyAndLight) throws WorldEditException { - checkNotNull(position); - checkNotNull(block); - - World world = getWorldChecked(); - int x = position.getBlockX(); - int y = position.getBlockY(); - int z = position.getBlockZ(); - - // First set the block - Chunk chunk = world.getChunkFromChunkCoords(x >> 4, z >> 4); - int previousId = 0; - - if (notifyAndLight) { - previousId = Block.getIdFromBlock(chunk.getBlock(x & 15, y, z & 15)); - } - - boolean successful = chunk.func_150807_a(x & 15, y, z & 15, Block.getBlockById(block.getId()), block.getData()); - - // Create the TileEntity - if (successful) { - CompoundTag tag = block.getNbtData(); - if (tag != null) { - NBTTagCompound nativeTag = NBTConverter.toNative(tag); - nativeTag.setString("id", block.getNbtId()); - TileEntityUtils.setTileEntity(getWorld(), position, nativeTag); - } - } - - if (notifyAndLight) { - world.func_147451_t(x, y, z); - world.markBlockForUpdate(x, y, z); - world.notifyBlockChange(x, y, z, Block.getBlockById(previousId)); - - Block mcBlock = Block.getBlockById(previousId); - if (mcBlock != null && mcBlock.hasComparatorInputOverride()) { - world.func_147453_f(x, y, z, Block.getBlockById(block.getId())); - } - } - - return successful; - } - - @Override - public int getBlockLightLevel(Vector position) { - checkNotNull(position); - return getWorld().getBlockLightValue(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - } - - @Override - public boolean clearContainerBlockContents(Vector position) { - checkNotNull(position); - TileEntity tile = getWorld().getTileEntity(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - if ((tile instanceof IInventory)) { - IInventory inv = (IInventory) tile; - int size = inv.getSizeInventory(); - for (int i = 0; i < size; i++) { - inv.setInventorySlotContents(i, null); - } - return true; - } - return false; - } - - @Override - public BaseBiome getBiome(Vector2D position) { - checkNotNull(position); - return new BaseBiome(getWorld().getBiomeGenForCoords(position.getBlockX(), position.getBlockZ()).biomeID); - } - - @Override - public boolean setBiome(Vector2D position, BaseBiome biome) { - checkNotNull(position); - checkNotNull(biome); - - Chunk chunk = getWorld().getChunkFromBlockCoords(position.getBlockX(), position.getBlockZ()); - if ((chunk != null) && (chunk.isChunkLoaded)) { - chunk.getBiomeArray()[((position.getBlockZ() & 0xF) << 4 | position.getBlockX() & 0xF)] = (byte) biome.getId(); - return true; - } - - return false; - } - - @Override - public void dropItem(Vector position, BaseItemStack item) { - checkNotNull(position); - checkNotNull(item); - - if (item.getType() == 0) { - return; - } - - EntityItem entity = new EntityItem(getWorld(), position.getX(), position.getY(), position.getZ(), ForgeWorldEdit.toForgeItemStack(item)); - entity.delayBeforeCanPickup = 10; - getWorld().spawnEntityInWorld(entity); - } - - @Override - public boolean regenerate(Region region, EditSession editSession) { - BaseBlock[] history = new BaseBlock[256 * (getMaxY() + 1)]; - - for (Vector2D chunk : region.getChunks()) { - Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16); - - for (int x = 0; x < 16; x++) { - for (int y = 0; y < getMaxY() + 1; y++) { - for (int z = 0; z < 16; z++) { - Vector pt = min.add(x, y, z); - int index = y * 16 * 16 + z * 16 + x; - history[index] = editSession.getBlock(pt); - } - } - } - try { - Set chunks = region.getChunks(); - IChunkProvider provider = getWorld().getChunkProvider(); - if (!(provider instanceof ChunkProviderServer)) { - return false; - } - ChunkProviderServer chunkServer = (ChunkProviderServer) provider; - Field u; - try { - u = ChunkProviderServer.class.getDeclaredField("field_73248_b"); // chunksToUnload - } catch(NoSuchFieldException e) { - u = ChunkProviderServer.class.getDeclaredField("chunksToUnload"); - } - u.setAccessible(true); - Set unloadQueue = (Set) u.get(chunkServer); - Field m; - try { - m = ChunkProviderServer.class.getDeclaredField("field_73244_f"); // loadedChunkHashMap - } catch(NoSuchFieldException e) { - m = ChunkProviderServer.class.getDeclaredField("loadedChunkHashMap"); - } - m.setAccessible(true); - LongHashMap loadedMap = (LongHashMap) m.get(chunkServer); - Field lc; - try { - lc = ChunkProviderServer.class.getDeclaredField("field_73245_g"); // loadedChunkHashMap - } catch(NoSuchFieldException e) { - lc = ChunkProviderServer.class.getDeclaredField("loadedChunks"); - } - lc.setAccessible(true); - @SuppressWarnings("unchecked") List loaded = (List) lc.get(chunkServer); - Field p; - try { - p = ChunkProviderServer.class.getDeclaredField("field_73246_d"); // currentChunkProvider - } catch(NoSuchFieldException e) { - p = ChunkProviderServer.class.getDeclaredField("currentChunkProvider"); - } - p.setAccessible(true); - IChunkProvider chunkProvider = (IChunkProvider) p.get(chunkServer); - - for (Vector2D coord : chunks) { - long pos = ChunkCoordIntPair.chunkXZ2Int(coord.getBlockX(), coord.getBlockZ()); - Chunk mcChunk; - if (chunkServer.chunkExists(coord.getBlockX(), coord.getBlockZ())) { - mcChunk = chunkServer.loadChunk(coord.getBlockX(), coord.getBlockZ()); - mcChunk.onChunkUnload(); - } - unloadQueue.remove(pos); - loadedMap.remove(pos); - mcChunk = chunkProvider.provideChunk(coord.getBlockX(), coord.getBlockZ()); - loadedMap.add(pos, mcChunk); - loaded.add(mcChunk); - if (mcChunk != null) { - mcChunk.onChunkLoad(); - mcChunk.populateChunk(chunkProvider, chunkProvider, coord.getBlockX(), coord.getBlockZ()); - } - } - } catch (Throwable t) { - logger.log(Level.WARNING, "Failed to generate chunk", t); - return false; - } - - for (int x = 0; x < 16; x++) { - for (int y = 0; y < getMaxY() + 1; y++) { - for (int z = 0; z < 16; z++) { - Vector pt = min.add(x, y, z); - int index = y * 16 * 16 + z * 16 + x; - - if (!region.contains(pt)) - editSession.smartSetBlock(pt, history[index]); - else { - editSession.rememberChange(pt, history[index], editSession.rawGetBlock(pt)); - } - } - } - } - } - - return false; - } - - @Nullable - private static WorldGenerator createWorldGenerator(TreeType type) { - switch (type) { - case TREE: return new WorldGenTrees(true); - case BIG_TREE: return new WorldGenBigTree(true); - case REDWOOD: return new WorldGenTaiga2(true); - case TALL_REDWOOD: return new WorldGenTaiga1(); - case BIRCH: return new WorldGenForest(true, false); - case JUNGLE: return new WorldGenMegaJungle(true, 10, 20, 3, 3); - case SMALL_JUNGLE: return new WorldGenTrees(true, 4 + random.nextInt(7), 3, 3, false); - case SHORT_JUNGLE: return new WorldGenTrees(true, 4 + random.nextInt(7), 3, 3, true); - case JUNGLE_BUSH: return new WorldGenShrub(3, 0); - case RED_MUSHROOM: return new WorldGenBigMushroom(1); - case BROWN_MUSHROOM: return new WorldGenBigMushroom(0); - case SWAMP: return new WorldGenSwamp(); - case ACACIA: return new WorldGenSavannaTree(true); - case DARK_OAK: return new WorldGenCanopyTree(true); - case MEGA_REDWOOD: return new WorldGenMegaPineTree(false, random.nextBoolean()); - case TALL_BIRCH: return new WorldGenForest(true, true); - case RANDOM: - case PINE: - case RANDOM_REDWOOD: - default: - return null; - } - } - - @Override - public boolean generateTree(TreeType type, EditSession editSession, Vector position) throws MaxChangedBlocksException { - WorldGenerator generator = createWorldGenerator(type); - return generator != null ? generator.generate(getWorld(), random, position.getBlockX(), position.getBlockY(), position.getBlockZ()) : false; - } - - @Override - public WorldData getWorldData() { - return ForgeWorldData.getInstance(); - } - - @Override - public boolean isValidBlockType(int id) { - return (id == 0) || (net.minecraft.block.Block.getBlockById(id) != null); - } - - @Override - public BaseBlock getBlock(Vector position) { - World world = getWorld(); - int id = Block.getIdFromBlock(world.getBlock(position.getBlockX(), position.getBlockY(), position.getBlockZ())); - int data = world.getBlockMetadata(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - TileEntity tile = getWorld().getTileEntity(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - - if (tile != null) { - return new TileEntityBaseBlock(id, data, tile); - } else { - return new BaseBlock(id, data); - } - } - - @Override - public BaseBlock getLazyBlock(Vector position) { - World world = getWorld(); - int id = Block.getIdFromBlock(world.getBlock(position.getBlockX(), position.getBlockY(), position.getBlockZ())); - int data = world.getBlockMetadata(position.getBlockX(), position.getBlockY(), position.getBlockZ()); - return new LazyBlock(id, data, this, position); - } - - @Override - public int hashCode() { - return getWorld().hashCode(); - } - - @Override - public boolean equals(Object o) { - if (o == null) { - return false; - } else if ((o instanceof ForgeWorld)) { - ForgeWorld other = ((ForgeWorld) o); - World otherWorld = other.worldRef.get(); - World thisWorld = worldRef.get(); - return otherWorld != null && thisWorld != null && otherWorld.equals(thisWorld); - } else if (o instanceof com.sk89q.worldedit.world.World) { - return ((com.sk89q.worldedit.world.World) o).getName().equals(getName()); - } else { - return false; - } - } - - @Override - @SuppressWarnings("unchecked") - public List getEntities(Region region) { - List entities = new ArrayList(); - World world = getWorld(); - List ents = world.loadedEntityList; - for (net.minecraft.entity.Entity entity : ents) { - if (region.contains(new Vector(entity.posX, entity.posY, entity.posZ))) { - entities.add(new ForgeEntity(entity)); - } - } - return entities; - } - - @Override - public List getEntities() { - List entities = new ArrayList(); - for (Object entity : getWorld().loadedEntityList) { - entities.add(new ForgeEntity((net.minecraft.entity.Entity) entity)); - } - return entities; - } - - @Nullable - @Override - public Entity createEntity(Location location, BaseEntity entity) { - World world = getWorld(); - net.minecraft.entity.Entity createdEntity = EntityList.createEntityByName(entity.getTypeId(), world); - if (createdEntity != null) { - CompoundTag nativeTag = entity.getNbtData(); - if (nativeTag != null) { - NBTTagCompound tag = NBTConverter.toNative(entity.getNbtData()); - for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.removeTag(name); - } - createdEntity.readFromNBT(tag); - } - - createdEntity.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - - world.spawnEntityInWorld(createdEntity); - return new ForgeEntity(createdEntity); - } else { - return null; - } - } - - /** - * Thrown when the reference to the world is lost. - */ - private static class WorldReferenceLostException extends WorldEditException { - private WorldReferenceLostException(String message) { - super(message); - } - } - -} +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.forge; + +import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.Vector2D; +import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.blocks.BaseItemStack; +import com.sk89q.worldedit.blocks.LazyBlock; +import com.sk89q.worldedit.entity.BaseEntity; +import com.sk89q.worldedit.entity.Entity; +import com.sk89q.worldedit.internal.Constants; +import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.TreeGenerator.TreeType; +import com.sk89q.worldedit.world.AbstractWorld; +import com.sk89q.worldedit.world.biome.BaseBiome; +import com.sk89q.worldedit.world.registry.WorldData; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.annotation.Nullable; +import net.minecraft.block.Block; +import net.minecraft.block.BlockLeaves; +import net.minecraft.block.BlockOldLeaf; +import net.minecraft.block.BlockOldLog; +import net.minecraft.block.BlockPlanks; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.ChunkProviderServer; +import net.minecraft.world.gen.feature.WorldGenBigMushroom; +import net.minecraft.world.gen.feature.WorldGenBigTree; +import net.minecraft.world.gen.feature.WorldGenCanopyTree; +import net.minecraft.world.gen.feature.WorldGenForest; +import net.minecraft.world.gen.feature.WorldGenMegaJungle; +import net.minecraft.world.gen.feature.WorldGenMegaPineTree; +import net.minecraft.world.gen.feature.WorldGenSavannaTree; +import net.minecraft.world.gen.feature.WorldGenShrub; +import net.minecraft.world.gen.feature.WorldGenSwamp; +import net.minecraft.world.gen.feature.WorldGenTaiga1; +import net.minecraft.world.gen.feature.WorldGenTaiga2; +import net.minecraft.world.gen.feature.WorldGenTrees; +import net.minecraft.world.gen.feature.WorldGenerator; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * An adapter to Minecraft worlds for WorldEdit. + */ +public class ForgeWorld extends AbstractWorld { + + private static final Random random = new Random(); + private static final int UPDATE = 1, NOTIFY = 2, NOTIFY_CLIENT = 4; + private static final Logger logger = Logger.getLogger(ForgeWorld.class.getCanonicalName()); + + private static final IBlockState JUNGLE_LOG = Blocks.log.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.JUNGLE); + private static final IBlockState JUNGLE_LEAF = Blocks.leaves.getDefaultState().withProperty(BlockOldLeaf.VARIANT, BlockPlanks.EnumType.JUNGLE).withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)); + private static final IBlockState JUNGLE_SHRUB = Blocks.leaves.getDefaultState().withProperty(BlockOldLeaf.VARIANT, BlockPlanks.EnumType.OAK).withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)); + + private final WeakReference worldRef; + + /** + * Construct a new world. + * + * @param world the world + */ + ForgeWorld(World world) { + checkNotNull(world); + this.worldRef = new WeakReference(world); + } + + /** + * Get the underlying handle to the world. + * + * @return the world + * @throws WorldEditException thrown if a reference to the world was lost (i.e. world was unloaded) + */ + public World getWorldChecked() throws WorldEditException { + World world = worldRef.get(); + if (world != null) { + return world; + } else { + throw new WorldReferenceLostException("The reference to the world was lost (i.e. the world may have been unloaded)"); + } + } + + /** + * Get the underlying handle to the world. + * + * @return the world + * @throws RuntimeException thrown if a reference to the world was lost (i.e. world was unloaded) + */ + public World getWorld() { + World world = worldRef.get(); + if (world != null) { + return world; + } else { + throw new RuntimeException("The reference to the world was lost (i.e. the world may have been unloaded)"); + } + } + + @Override + public String getName() { + return getWorld().getWorldInfo().getWorldName(); + } + + @Override + public boolean setBlock(Vector position, BaseBlock block, boolean notifyAndLight) throws WorldEditException { + checkNotNull(position); + checkNotNull(block); + + World world = getWorldChecked(); + int x = position.getBlockX(); + int y = position.getBlockY(); + int z = position.getBlockZ(); + + // First set the block + Chunk chunk = world.getChunkFromChunkCoords(x >> 4, z >> 4); + BlockPos pos = new BlockPos(x, y, z); + IBlockState old = chunk.getBlockState(pos); + IBlockState newState = Block.getBlockById(block.getId()).getStateFromMeta(block.getData()); + IBlockState successState = chunk.setBlockState(pos, newState); + boolean successful = successState != null; + + // Create the TileEntity + if (successful) { + if (block.hasNbtData()) { + // Kill the old TileEntity + world.removeTileEntity(pos); + NBTTagCompound nativeTag = NBTConverter.toNative(block.getNbtData()); + nativeTag.setString("id", block.getNbtId()); + TileEntityUtils.setTileEntity(world, position, nativeTag); + } + } + + if (notifyAndLight) { + if (!successful) { + newState = old; + } + world.checkLight(pos); + world.markAndNotifyBlock(pos, chunk, old, newState, UPDATE | NOTIFY); + } + + return successful; + } + + @Override + public int getBlockLightLevel(Vector position) { + checkNotNull(position); + return getWorld().getLight(new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ())); + } + + @Override + public boolean clearContainerBlockContents(Vector position) { + checkNotNull(position); + TileEntity tile = getWorld().getTileEntity(new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ())); + if ((tile instanceof IInventory)) { + IInventory inv = (IInventory) tile; + int size = inv.getSizeInventory(); + for (int i = 0; i < size; i++) { + inv.setInventorySlotContents(i, null); + } + return true; + } + return false; + } + + @Override + public BaseBiome getBiome(Vector2D position) { + checkNotNull(position); + return new BaseBiome(getWorld().getBiomeGenForCoords(new BlockPos(position.getBlockX(), 0, position.getBlockZ())).biomeID); + } + + @Override + public boolean setBiome(Vector2D position, BaseBiome biome) { + checkNotNull(position); + checkNotNull(biome); + + Chunk chunk = getWorld().getChunkFromBlockCoords(new BlockPos(position.getBlockX(), 0, position.getBlockZ())); + if ((chunk != null) && (chunk.isLoaded())) { + chunk.getBiomeArray()[((position.getBlockZ() & 0xF) << 4 | position.getBlockX() & 0xF)] = (byte) biome.getId(); + return true; + } + + return false; + } + + @Override + public void dropItem(Vector position, BaseItemStack item) { + checkNotNull(position); + checkNotNull(item); + + if (item.getType() == 0) { + return; + } + + EntityItem entity = new EntityItem(getWorld(), position.getX(), position.getY(), position.getZ(), ForgeWorldEdit.toForgeItemStack(item)); + entity.setPickupDelay(10); + getWorld().spawnEntityInWorld(entity); + } + + @Override + public boolean regenerate(Region region, EditSession editSession) { + BaseBlock[] history = new BaseBlock[256 * (getMaxY() + 1)]; + + for (Vector2D chunk : region.getChunks()) { + Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16); + + for (int x = 0; x < 16; x++) { + for (int y = 0; y < getMaxY() + 1; y++) { + for (int z = 0; z < 16; z++) { + Vector pt = min.add(x, y, z); + int index = y * 16 * 16 + z * 16 + x; + history[index] = editSession.getBlock(pt); + } + } + } + try { + Set chunks = region.getChunks(); + IChunkProvider provider = getWorld().getChunkProvider(); + if (!(provider instanceof ChunkProviderServer)) { + return false; + } + ChunkProviderServer chunkServer = (ChunkProviderServer) provider; + IChunkProvider chunkProvider = chunkServer.serverChunkGenerator; + + for (Vector2D coord : chunks) { + long pos = ChunkCoordIntPair.chunkXZ2Int(coord.getBlockX(), coord.getBlockZ()); + Chunk mcChunk; + if (chunkServer.chunkExists(coord.getBlockX(), coord.getBlockZ())) { + mcChunk = chunkServer.loadChunk(coord.getBlockX(), coord.getBlockZ()); + mcChunk.onChunkUnload(); + } + chunkServer.droppedChunksSet.remove(pos); + chunkServer.id2ChunkMap.remove(pos); + mcChunk = chunkProvider.provideChunk(coord.getBlockX(), coord.getBlockZ()); + chunkServer.id2ChunkMap.add(pos, mcChunk); + chunkServer.loadedChunks.add(mcChunk); + if (mcChunk != null) { + mcChunk.onChunkLoad(); + mcChunk.populateChunk(chunkProvider, chunkProvider, coord.getBlockX(), coord.getBlockZ()); + } + } + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to generate chunk", t); + return false; + } + + for (int x = 0; x < 16; x++) { + for (int y = 0; y < getMaxY() + 1; y++) { + for (int z = 0; z < 16; z++) { + Vector pt = min.add(x, y, z); + int index = y * 16 * 16 + z * 16 + x; + + if (!region.contains(pt)) + editSession.smartSetBlock(pt, history[index]); + else { + editSession.rememberChange(pt, history[index], editSession.rawGetBlock(pt)); + } + } + } + } + } + + return false; + } + + @Nullable + private static WorldGenerator createWorldGenerator(TreeType type) { + switch (type) { + case TREE: return new WorldGenTrees(true); + case BIG_TREE: return new WorldGenBigTree(true); + case REDWOOD: return new WorldGenTaiga2(true); + case TALL_REDWOOD: return new WorldGenTaiga1(); + case BIRCH: return new WorldGenForest(true, false); + case JUNGLE: return new WorldGenMegaJungle(true, 10, 20, JUNGLE_LOG, JUNGLE_LEAF); + case SMALL_JUNGLE: return new WorldGenTrees(true, 4 + random.nextInt(7), JUNGLE_LOG, JUNGLE_LEAF, false); + case SHORT_JUNGLE: return new WorldGenTrees(true, 4 + random.nextInt(7), JUNGLE_LOG, JUNGLE_LEAF, true); + case JUNGLE_BUSH: return new WorldGenShrub(JUNGLE_LOG, JUNGLE_SHRUB); + case RED_MUSHROOM: return new WorldGenBigMushroom(Blocks.brown_mushroom_block); + case BROWN_MUSHROOM: return new WorldGenBigMushroom(Blocks.red_mushroom_block); + case SWAMP: return new WorldGenSwamp(); + case ACACIA: return new WorldGenSavannaTree(true); + case DARK_OAK: return new WorldGenCanopyTree(true); + case MEGA_REDWOOD: return new WorldGenMegaPineTree(false, random.nextBoolean()); + case TALL_BIRCH: return new WorldGenForest(true, true); + case RANDOM: + case PINE: + case RANDOM_REDWOOD: + default: + return null; + } + } + + @Override + public boolean generateTree(TreeType type, EditSession editSession, Vector position) throws MaxChangedBlocksException { + WorldGenerator generator = createWorldGenerator(type); + return generator != null ? generator.generate(getWorld(), random, ForgeAdapter.toBlockPos(position)) : false; + } + + @Override + public WorldData getWorldData() { + return ForgeWorldData.getInstance(); + } + + @Override + public boolean isValidBlockType(int id) { + return (id == 0) || (net.minecraft.block.Block.getBlockById(id) != null); + } + + @Override + public BaseBlock getBlock(Vector position) { + World world = getWorld(); + BlockPos pos = new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + IBlockState state = world.getBlockState(pos); + TileEntity tile = getWorld().getTileEntity(pos); + + if (tile != null) { + return new TileEntityBaseBlock(Block.getIdFromBlock(state.getBlock()), state.getBlock().getMetaFromState(state), tile); + } else { + return new BaseBlock(Block.getIdFromBlock(state.getBlock()), state.getBlock().getMetaFromState(state)); + } + } + + @Override + public BaseBlock getLazyBlock(Vector position) { + World world = getWorld(); + BlockPos pos = new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()); + IBlockState state = world.getBlockState(pos); + return new LazyBlock(Block.getIdFromBlock(state.getBlock()), state.getBlock().getMetaFromState(state), this, position); + } + + @Override + public int hashCode() { + return getWorld().hashCode(); + } + + @Override + public boolean equals(Object o) { + if (o == null) { + return false; + } else if ((o instanceof ForgeWorld)) { + ForgeWorld other = ((ForgeWorld) o); + World otherWorld = other.worldRef.get(); + World thisWorld = worldRef.get(); + return otherWorld != null && thisWorld != null && otherWorld.equals(thisWorld); + } else if (o instanceof com.sk89q.worldedit.world.World) { + return ((com.sk89q.worldedit.world.World) o).getName().equals(getName()); + } else { + return false; + } + } + + @Override + public List getEntities(Region region) { + List entities = new ArrayList(); + World world = getWorld(); + List ents = world.loadedEntityList; + for (net.minecraft.entity.Entity entity : ents) { + if (region.contains(new Vector(entity.posX, entity.posY, entity.posZ))) { + entities.add(new ForgeEntity(entity)); + } + } + return entities; + } + + @Override + public List getEntities() { + List entities = new ArrayList(); + for (net.minecraft.entity.Entity entity : getWorld().loadedEntityList) { + entities.add(new ForgeEntity(entity)); + } + return entities; + } + + @Nullable + @Override + public Entity createEntity(Location location, BaseEntity entity) { + World world = getWorld(); + net.minecraft.entity.Entity createdEntity = EntityList.createEntityByName(entity.getTypeId(), world); + if (createdEntity != null) { + CompoundTag nativeTag = entity.getNbtData(); + if (nativeTag != null) { + NBTTagCompound tag = NBTConverter.toNative(entity.getNbtData()); + for (String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { + tag.removeTag(name); + } + createdEntity.readFromNBT(tag); + } + + createdEntity.setLocationAndAngles(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + + world.spawnEntityInWorld(createdEntity); + return new ForgeEntity(createdEntity); + } else { + return null; + } + } + + /** + * Thrown when the reference to the world is lost. + */ + private static class WorldReferenceLostException extends WorldEditException { + private WorldReferenceLostException(String message) { + super(message); + } + } + +} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldData.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldData.java index 33248463b..249e93ddc 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldData.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldData.java @@ -20,7 +20,6 @@ package com.sk89q.worldedit.forge; import com.sk89q.worldedit.world.registry.BiomeRegistry; -import com.sk89q.worldedit.world.registry.ItemRegistry; import com.sk89q.worldedit.world.registry.LegacyWorldData; /** @@ -29,14 +28,8 @@ import com.sk89q.worldedit.world.registry.LegacyWorldData; class ForgeWorldData extends LegacyWorldData { private static final ForgeWorldData INSTANCE = new ForgeWorldData(); - private final ItemRegistry itemRegistry = new ForgeItemRegistry(); private final BiomeRegistry biomeRegistry = new ForgeBiomeRegistry(); - @Override - public ItemRegistry getItemRegistry() { - return itemRegistry; - } - @Override public BiomeRegistry getBiomeRegistry() { return biomeRegistry; diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java index 989865815..5ae29054e 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgeWorldEdit.java @@ -19,6 +19,8 @@ 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; @@ -26,24 +28,10 @@ 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.forge.compat.ForgeMultipartCompat; -import com.sk89q.worldedit.forge.compat.ForgeMultipartExistsCompat; -import com.sk89q.worldedit.forge.compat.NoForgeMultipartCompat; import com.sk89q.worldedit.internal.LocalWorldAdapter; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.Mod.Instance; -import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; -import cpw.mods.fml.common.event.FMLServerStartedEvent; -import cpw.mods.fml.common.event.FMLServerStoppingEvent; -import cpw.mods.fml.common.eventhandler.Event.Result; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +import java.io.File; +import java.util.Map; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -51,13 +39,22 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.CommandEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.util.Map; +import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; +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; -import static net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; /** * The Forge implementation of WorldEdit. @@ -80,7 +77,6 @@ public class ForgeWorldEdit { private ForgePlatform platform; private ForgeConfiguration config; private File workingDir; - private ForgeMultipartCompat compat = new NoForgeMultipartCompat(); @EventHandler public void preInit(FMLPreInitializationEvent event) { @@ -92,16 +88,13 @@ public class ForgeWorldEdit { config = new ForgeConfiguration(this); config.load(); - if (Loader.isModLoaded("ForgeMultipart")) { - compat = new ForgeMultipartExistsCompat(); - } - - FMLCommonHandler.instance().bus().register(ThreadSafeCache.getInstance()); + MinecraftForge.EVENT_BUS.register(ThreadSafeCache.getInstance()); } @EventHandler public void init(FMLInitializationEvent event) { MinecraftForge.EVENT_BUS.register(this); + WECUIPacketHandler.init(); proxy.registerHandlers(); } @@ -122,7 +115,12 @@ public class ForgeWorldEdit { this.platform = new ForgePlatform(this); WorldEdit.getInstance().getPlatformManager().register(platform); - this.provider = new ForgePermissionsProvider.VanillaPermissionsProvider(platform); + + if (Loader.isModLoaded("sponge")) { + this.provider = new ForgePermissionsProvider.SpongePermissionsProvider(); + } else { + this.provider = new ForgePermissionsProvider.VanillaPermissionsProvider(platform); + } } @EventHandler @@ -165,7 +163,7 @@ public class ForgeWorldEdit { Action action = event.action; switch (action) { case LEFT_CLICK_BLOCK: { - WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world), event.x, event.y, event.z); + WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world), event.pos.getX(), event.pos.getY(), event.pos.getZ()); if (we.handleBlockLeftClick(player, pos)) { event.setCanceled(true); @@ -178,7 +176,7 @@ public class ForgeWorldEdit { break; } case RIGHT_CLICK_BLOCK: { - WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world), event.x, event.y, event.z); + WorldVector pos = new WorldVector(LocalWorldAdapter.adapt(world), event.pos.getX(), event.pos.getY(), event.pos.getZ()); if (we.handleBlockRightClick(player, pos)) { event.setCanceled(true); @@ -203,7 +201,7 @@ public class ForgeWorldEdit { public static ItemStack toForgeItemStack(BaseItemStack item) { ItemStack ret = new ItemStack(Item.getItemById(item.getType()), item.getAmount(), item.getData()); for (Map.Entry entry : item.getEnchantments().entrySet()) { - ret.addEnchantment(net.minecraft.enchantment.Enchantment.enchantmentsList[((Integer) entry.getKey())], (Integer) entry.getValue()); + ret.addEnchantment(net.minecraft.enchantment.Enchantment.getEnchantmentById(entry.getKey()), entry.getValue()); } return ret; @@ -269,10 +267,6 @@ public class ForgeWorldEdit { return this.workingDir; } - public ForgeMultipartCompat getFMPCompat() { - return compat; - } - /** * Get the version of the WorldEdit-for-Forge implementation. * diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/KeyHandler.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/KeyHandler.java index b8ffa78db..ea037e548 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/KeyHandler.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/KeyHandler.java @@ -20,11 +20,13 @@ package com.sk89q.worldedit.forge; import com.sk89q.worldedit.forge.gui.GuiHandler; -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent; + import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.InputEvent.KeyInputEvent; + import org.lwjgl.input.Keyboard; public class KeyHandler { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/NBTConverter.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/NBTConverter.java index 98f88c6e8..69f4ab6ad 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/NBTConverter.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/NBTConverter.java @@ -170,7 +170,7 @@ final class NBTConverter { } public static IntArrayTag fromNative(NBTTagIntArray other) { - int[] value = other.func_150302_c(); + int[] value = other.getIntArray(); return new IntArrayTag(Arrays.copyOf(value, value.length)); } @@ -192,28 +192,28 @@ final class NBTConverter { } public static LongTag fromNative(NBTTagLong other) { - return new LongTag(other.func_150291_c()); + return new LongTag(other.getLong()); } public static StringTag fromNative(NBTTagString other) { - return new StringTag(other.func_150285_a_()); + return new StringTag(other.getString()); } public static IntTag fromNative(NBTTagInt other) { - return new IntTag(other.func_150287_d()); + return new IntTag(other.getInt()); } public static ByteTag fromNative(NBTTagByte other) { - return new ByteTag(other.func_150290_f()); + return new ByteTag(other.getByte()); } public static ByteArrayTag fromNative(NBTTagByteArray other) { - byte[] value = other.func_150292_c(); + byte[] value = other.getByteArray(); return new ByteArrayTag(Arrays.copyOf(value, value.length)); } public static CompoundTag fromNative(NBTTagCompound other) { - @SuppressWarnings("unchecked") Collection tags = other.func_150296_c(); + @SuppressWarnings("unchecked") Set tags = other.getKeySet(); Map map = new HashMap(); for (String tagName : tags) { map.put(tagName, fromNative(other.getTag(tagName))); @@ -222,15 +222,15 @@ final class NBTConverter { } public static FloatTag fromNative(NBTTagFloat other) { - return new FloatTag(other.func_150288_h()); + return new FloatTag(other.getFloat()); } public static ShortTag fromNative(NBTTagShort other) { - return new ShortTag(other.func_150289_e()); + return new ShortTag(other.getShort()); } public static DoubleTag fromNative(NBTTagDouble other) { - return new DoubleTag(other.func_150286_g()); + return new DoubleTag(other.getDouble()); } } diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ThreadSafeCache.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ThreadSafeCache.java index 1322f0713..0ca19c5b0 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ThreadSafeCache.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ThreadSafeCache.java @@ -19,10 +19,11 @@ package com.sk89q.worldedit.forge; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; import java.util.Collections; import java.util.HashSet; @@ -55,8 +56,9 @@ public class ThreadSafeCache { if (now - lastRefresh > REFRESH_DELAY) { Set onlineIds = new HashSet(); - - if (FMLCommonHandler.instance().getMinecraftServerInstance() == null) { + + MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); + if (server == null || server.getConfigurationManager() == null) { return; } for (Object object : FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().playerEntityList) { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityBaseBlock.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityBaseBlock.java index a17ac5d43..068482408 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityBaseBlock.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityBaseBlock.java @@ -1,40 +1,40 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge; - -import com.sk89q.worldedit.blocks.BaseBlock; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; - -public class TileEntityBaseBlock extends BaseBlock implements TileEntityBlock { - - public TileEntityBaseBlock(int type, int data, TileEntity tile) { - super(type, data); - setNbtData(NBTConverter.fromNative(copyNbtData(tile))); - } - - private static NBTTagCompound copyNbtData(TileEntity tile) { - NBTTagCompound tag = new NBTTagCompound(); - tile.writeToNBT(tag); - return tag; - } - +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.forge; + +import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.blocks.TileEntityBlock; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityBaseBlock extends BaseBlock implements TileEntityBlock { + + public TileEntityBaseBlock(int type, int data, TileEntity tile) { + super(type, data); + setNbtData(NBTConverter.fromNative(copyNbtData(tile))); + } + + private static NBTTagCompound copyNbtData(TileEntity tile) { + NBTTagCompound tag = new NBTTagCompound(); + tile.writeToNBT(tag); + return tag; + } + } \ No newline at end of file diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityUtils.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityUtils.java index b3706f349..328420b27 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityUtils.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/TileEntityUtils.java @@ -20,12 +20,15 @@ package com.sk89q.worldedit.forge; import com.sk89q.worldedit.Vector; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagInt; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; import net.minecraft.world.World; import javax.annotation.Nullable; + import java.lang.reflect.Constructor; import static com.google.common.base.Preconditions.checkNotNull; @@ -81,10 +84,9 @@ final class TileEntityUtils { tileEntity.readFromNBT(tag); } - tileEntity = ForgeWorldEdit.inst.getFMPCompat().overrideTileEntity(world, tag, tileEntity); - - setTileEntity(world, position, tileEntity); + world.setTileEntity(new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()), tileEntity); } + /** * Set a tile entity at the given location using the tile entity ID from * the tag. @@ -96,26 +98,12 @@ final class TileEntityUtils { static void setTileEntity(World world, Vector position, @Nullable NBTTagCompound tag) { if (tag != null) { updateForSet(tag, position); - TileEntity tileEntity = makeTileEntity(world, position, tag); + TileEntity tileEntity = TileEntity.createAndLoadEntity(tag); if (tileEntity != null) { - setTileEntity(world, position, tileEntity); + world.setTileEntity(new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()), tileEntity); } } } - - private static TileEntity makeTileEntity(World world, Vector position, - NBTTagCompound tag) { - TileEntity normal = TileEntity.createAndLoadEntity(tag); - return ForgeWorldEdit.inst.getFMPCompat().overrideTileEntity(world, tag, - normal); - } - - private static void setTileEntity(World world, Vector position, - TileEntity tileEntity) { - world.setTileEntity(position.getBlockX(), position.getBlockY(), - position.getBlockZ(), tileEntity); - ForgeWorldEdit.inst.getFMPCompat().sendDescPacket(world, tileEntity); - } /** * Construct a tile entity from the given class. diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/WECUIPacketHandler.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/WECUIPacketHandler.java index 03cf3ab0c..24da15c53 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/WECUIPacketHandler.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/WECUIPacketHandler.java @@ -1,63 +1,72 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge; - -import java.nio.charset.Charset; - -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.network.NetHandlerPlayServer; -import net.minecraft.network.play.client.C17PacketCustomPayload; - -import com.sk89q.worldedit.LocalSession; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.network.FMLEventChannel; -import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent; -import cpw.mods.fml.common.network.NetworkRegistry; - -public class WECUIPacketHandler { - public static final Charset UTF_8_CHARSET = Charset.forName("UTF-8"); - private static FMLEventChannel WECUI_CHANNEL; - - public static void init() { - WECUI_CHANNEL = NetworkRegistry.INSTANCE.newEventDrivenChannel(ForgeWorldEdit.CUI_PLUGIN_CHANNEL); - WECUI_CHANNEL.register(new WECUIPacketHandler()); - } - - @SubscribeEvent - public void onPacketData(ServerCustomPacketEvent event) { - C17PacketCustomPayload rawPacket = (C17PacketCustomPayload) event.packet.toC17Packet(); - if (event.packet.channel().equals(ForgeWorldEdit.CUI_PLUGIN_CHANNEL)) { - EntityPlayerMP player = getPlayerFromEvent(event); - LocalSession session = ForgeWorldEdit.inst.getSession((EntityPlayerMP) player); - - if (session.hasCUISupport()) { - return; - } - - String text = new String(rawPacket.func_149558_e(), UTF_8_CHARSET); - session.handleCUIInitializationMessage(text); - } - } - - private static EntityPlayerMP getPlayerFromEvent(ServerCustomPacketEvent event) { - return ((NetHandlerPlayServer) event.handler).playerEntity; - } +/* + * WorldEdit, a Minecraft world manipulation toolkit + * Copyright (C) sk89q + * 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 . + */ + +package com.sk89q.worldedit.forge; + +import com.sk89q.worldedit.LocalSession; + +import java.nio.charset.Charset; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.ThreadQuickExitException; +import net.minecraft.network.play.server.S3FPacketCustomPayload; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.network.FMLEventChannel; +import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent; +import net.minecraftforge.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent; +import net.minecraftforge.fml.common.network.NetworkRegistry; + +public class WECUIPacketHandler { + public static final Charset UTF_8_CHARSET = Charset.forName("UTF-8"); + public static FMLEventChannel WECUI_CHANNEL; + + public static void init() { + WECUI_CHANNEL = NetworkRegistry.INSTANCE.newEventDrivenChannel(ForgeWorldEdit.CUI_PLUGIN_CHANNEL); + WECUI_CHANNEL.register(new WECUIPacketHandler()); + } + + @SubscribeEvent + public void onPacketData(ServerCustomPacketEvent event) { + if (event.packet.channel().equals(ForgeWorldEdit.CUI_PLUGIN_CHANNEL)) { + EntityPlayerMP player = getPlayerFromEvent(event); + LocalSession session = ForgeWorldEdit.inst.getSession((EntityPlayerMP) player); + + if (session.hasCUISupport()) { + return; + } + + String text = event.packet.payload().toString(UTF_8_CHARSET); + session.handleCUIInitializationMessage(text); + session.describeCUI(ForgeWorldEdit.inst.wrap(player)); + } + } + + @SubscribeEvent + public void callProcessPacket(ClientCustomPacketEvent event) { + try { + new S3FPacketCustomPayload(event.packet.channel(), new PacketBuffer(event.packet.payload())).processPacket(event.handler); + } catch (ThreadQuickExitException suppress) { + } + } + + private static EntityPlayerMP getPlayerFromEvent(ServerCustomPacketEvent event) { + return ((NetHandlerPlayServer) event.handler).playerEntity; + } } \ No newline at end of file diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/ForgeMultipartCompat.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/ForgeMultipartCompat.java deleted file mode 100644 index 00d1615e1..000000000 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/ForgeMultipartCompat.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge.compat; - -import javax.annotation.Nullable; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public interface ForgeMultipartCompat { - - TileEntity overrideTileEntity(World world, @Nullable NBTTagCompound tag, - TileEntity normal); - - void sendDescPacket(World world, TileEntity entity); - -} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/ForgeMultipartExistsCompat.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/ForgeMultipartExistsCompat.java deleted file mode 100644 index d1b4752e4..000000000 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/ForgeMultipartExistsCompat.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ -package com.sk89q.worldedit.forge.compat; - -import codechicken.multipart.MultipartHelper; -import codechicken.multipart.TileMultipart; -import javax.annotation.Nullable; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class ForgeMultipartExistsCompat implements ForgeMultipartCompat { - - @Override - public TileEntity overrideTileEntity(World world, - @Nullable NBTTagCompound tag, TileEntity normal) { - if (tag == null) { - return normal; - } - TileEntity tile = MultipartHelper.createTileFromNBT(world, tag); - if (tile == null) { - return normal; - } - return tile; - } - - @Override - public void sendDescPacket(World world, TileEntity entity) { - if (entity instanceof TileMultipart) { - TileMultipart multi = (TileMultipart) entity; - MultipartHelper.sendDescPacket(world, multi); - } - } - -} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/NoForgeMultipartCompat.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/NoForgeMultipartCompat.java deleted file mode 100644 index 316509689..000000000 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/compat/NoForgeMultipartCompat.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * 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 . - */ - -package com.sk89q.worldedit.forge.compat; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -public class NoForgeMultipartCompat implements ForgeMultipartCompat { - - @Override - public TileEntity overrideTileEntity(World world, NBTTagCompound tag, - TileEntity normal) { - return normal; - } - - @Override - public void sendDescPacket(World world, TileEntity entity) { - } - -} diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/gui/GuiHandler.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/gui/GuiHandler.java index 4aba5eda0..d88b97379 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/gui/GuiHandler.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/gui/GuiHandler.java @@ -19,9 +19,9 @@ package com.sk89q.worldedit.forge.gui; -import cpw.mods.fml.common.network.IGuiHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.IGuiHandler; public class GuiHandler implements IGuiHandler { diff --git a/worldedit-forge/src/main/resources/META-INF/worldedit_at.cfg b/worldedit-forge/src/main/resources/META-INF/worldedit_at.cfg new file mode 100644 index 000000000..33f039ce3 --- /dev/null +++ b/worldedit-forge/src/main/resources/META-INF/worldedit_at.cfg @@ -0,0 +1,4 @@ +public net.minecraft.world.gen.ChunkProviderServer field_73248_b # droppedChunksSet +public net.minecraft.world.gen.ChunkProviderServer field_73244_f # id2ChunkMap +public net.minecraft.world.gen.ChunkProviderServer field_73245_g # loadedChunks +public net.minecraft.world.gen.ChunkProviderServer field_73246_d # serverChunkGenerator diff --git a/worldedit-forge/src/main/resources/mcmod.info b/worldedit-forge/src/main/resources/mcmod.info index f3f2f5b98..599e2f5e1 100644 --- a/worldedit-forge/src/main/resources/mcmod.info +++ b/worldedit-forge/src/main/resources/mcmod.info @@ -1,12 +1,12 @@ [{ - "modid": "WorldEdit", + "modid": "worldedit", "name": "WorldEdit", "description": "WorldEdit is an easy-to-use in-game world editor for Minecraft, supporting both single player and multiplayer.", "version": "${internalVersion}", "mcversion": "${mcVersion}", "url": "http://wiki.sk89q.com/wiki/WorldEdit", "updateUrl": "", - "authors": [ "sk89q", "wizjany", "TomyLobo" ], + "authors": [ "sk89q", "wizjany", "TomyLobo", "kenzierocks" ], "credits": "", "logoFile": "", "screenshots": [], @@ -15,7 +15,7 @@ ], "dependencies": [ "Forge@[${forgeVersion},)", - "ForgeMultipart" + "sponge" ], "dependants": [] }]