diff --git a/src/main/java/cpw/mods/fml/common/launcher/FMLTweaker.java b/src/main/java/cpw/mods/fml/common/launcher/FMLTweaker.java index 7148544..ca639ff 100644 --- a/src/main/java/cpw/mods/fml/common/launcher/FMLTweaker.java +++ b/src/main/java/cpw/mods/fml/common/launcher/FMLTweaker.java @@ -19,6 +19,7 @@ import com.google.common.collect.Maps; import cpw.mods.fml.relauncher.FMLLaunchHandler; +import cpw.mods.fml.relauncher.FMLSecurityManager; public class FMLTweaker implements ITweaker { private File gameDir; @@ -26,6 +27,17 @@ private List standaloneArgs; private static URI jarLocation; + public FMLTweaker() + { + try + { + System.setSecurityManager(new FMLSecurityManager()); + } + catch (SecurityException se) + { + throw new RuntimeException("FML was unable to install the security manager. The game will not start", se); + } + } @SuppressWarnings("unchecked") @Override public void acceptOptions(List args, File gameDir, File assetsDir, String profile) diff --git a/src/main/java/cpw/mods/fml/relauncher/FMLSecurityManager.java b/src/main/java/cpw/mods/fml/relauncher/FMLSecurityManager.java new file mode 100644 index 0000000..a6c1afe --- /dev/null +++ b/src/main/java/cpw/mods/fml/relauncher/FMLSecurityManager.java @@ -0,0 +1,36 @@ +package cpw.mods.fml.relauncher; + +import java.security.Permission; + +/** + * A custom security manager stopping certain events from happening + * unexpectedly. + * + * @author cpw + * + */ +public class FMLSecurityManager extends SecurityManager { + @Override + public void checkPermission(Permission perm) + { + String permName = perm.getName() != null ? perm.getName() : "missing"; + if (permName.startsWith("exitVM")) + { + String callingClass = getClassContext()[4].getName(); + // FML is allowed to call system exit + if (!callingClass.startsWith("cpw.mods.fml.")) + { + throw new ExitTrappedException(); + } + } + else if ("setSecurityManager".equals(permName)) + { + throw new SecurityException("Cannot replace the FML security manager"); + } + return; + } + + public static class ExitTrappedException extends SecurityException { + private static final long serialVersionUID = 1L; + } +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/world/ChunkCache.java b/src/main/java/net/minecraft/world/ChunkCache.java index 213858b..c6f89ea 100644 --- a/src/main/java/net/minecraft/world/ChunkCache.java +++ b/src/main/java/net/minecraft/world/ChunkCache.java @@ -138,6 +138,7 @@ return this.worldObj.getBiomeGenForCoords(par1, par2); } + @Deprecated /* gone in 1.7.10, use direct access to Vec3.createVectorHelper instead */ public Vec3Pool getWorldVec3Pool() { return this.worldObj.getWorldVec3Pool(); diff --git a/src/main/java/net/minecraft/world/IBlockAccess.java b/src/main/java/net/minecraft/world/IBlockAccess.java index e867168..a602dc9 100644 --- a/src/main/java/net/minecraft/world/IBlockAccess.java +++ b/src/main/java/net/minecraft/world/IBlockAccess.java @@ -30,6 +30,7 @@ @SideOnly(Side.CLIENT) boolean extendedLevelsInChunkCache(); + @Deprecated /* gone in 1.7.10, use direct access to Vec3.createVectorHelper instead */ Vec3Pool getWorldVec3Pool(); int isBlockProvidingPowerTo(int var1, int var2, int var3, int var4); diff --git a/src/main/java/net/minecraft/world/World.java b/src/main/java/net/minecraft/world/World.java index 37c9acd..6bb0371 100644 --- a/src/main/java/net/minecraft/world/World.java +++ b/src/main/java/net/minecraft/world/World.java @@ -3765,6 +3765,7 @@ } } + @Deprecated /* gone in 1.7.10, use direct access to Vec3.createVectorHelper instead */ public Vec3Pool getWorldVec3Pool() { return this.vecPool; diff --git a/src/main/java/net/minecraft/world/storage/SaveHandler.java b/src/main/java/net/minecraft/world/storage/SaveHandler.java index ff9360f..8a0511e 100644 --- a/src/main/java/net/minecraft/world/storage/SaveHandler.java +++ b/src/main/java/net/minecraft/world/storage/SaveHandler.java @@ -254,6 +254,7 @@ } file1.renameTo(file2); + net.minecraftforge.event.ForgeEventFactory.firePlayerSavingEvent(par1EntityPlayer, this.playersDirectory, par1EntityPlayer.getUniqueID().toString()); } catch (Exception exception) { @@ -270,6 +271,7 @@ par1EntityPlayer.readFromNBT(nbttagcompound); } + net.minecraftforge.event.ForgeEventFactory.firePlayerLoadingEvent(par1EntityPlayer, playersDirectory, par1EntityPlayer.getUniqueID().toString()); return nbttagcompound; } diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index 0660f99..9bbf2f0 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -1,5 +1,6 @@ package net.minecraftforge.event; +import java.io.File; import java.util.ArrayList; import java.util.List; import cpw.mods.fml.common.eventhandler.Event.Result; @@ -170,4 +171,14 @@ { MinecraftForge.EVENT_BUS.post(new PlayerEvent.StopTracking(player, entity)); } + + public static void firePlayerLoadingEvent(EntityPlayer player, File playerDirectory, String uuidString) + { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.SaveToFile(player, playerDirectory, uuidString)); + } + + public static void firePlayerSavingEvent(EntityPlayer player, File playerDirectory, String uuidString) + { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.SaveToFile(player, playerDirectory, uuidString)); + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java index 065ad1e..bcc1700 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java @@ -1,5 +1,6 @@ package net.minecraftforge.event.entity.player; +import java.io.File; import cpw.mods.fml.common.eventhandler.Cancelable; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -129,6 +130,86 @@ super(player); this.target = target; } - + + } + + /** + * The player is being loaded from the world save. Note that the + * player won't have been added to the world yet. Intended to + * allow mods to load an additional file from the players directory + * containing additional mod related player data. + */ + public static class LoadFromFile extends PlayerEvent { + /** + * The directory where player data is being stored. Use this + * to locate your mod additional file. + */ + public final File playerDirectory; + /** + * The UUID is the standard for player related file storage. + * It is broken out here for convenience for quick file generation. + */ + public final String playerUUID; + + public LoadFromFile(EntityPlayer player, File originDirectory, String playerUUID) + { + super(player); + this.playerDirectory = originDirectory; + this.playerUUID = playerUUID; + } + + /** + * Construct and return a recommended file for the supplied suffix + * @param suffix The suffix to use. + * @return + */ + public File getPlayerFile(String suffix) + { + if ("dat".equals(suffix)) throw new IllegalArgumentException("The suffix 'dat' is reserved"); + return new File(this.playerDirectory, this.playerUUID+"."+suffix); + } + } + /** + * The player is being saved to the world store. Note that the + * player may be in the process of logging out or otherwise departing + * from the world. Don't assume it's association with the world. + * This allows mods to load an additional file from the players directory + * containing additional mod related player data. + *
+ * Use this event to save the additional mod related player data to the world. + * + *
+ * WARNING: Do not overwrite the player's .dat file here. You will + * corrupt the world state. + */ + public static class SaveToFile extends PlayerEvent { + /** + * The directory where player data is being stored. Use this + * to locate your mod additional file. + */ + public final File playerDirectory; + /** + * The UUID is the standard for player related file storage. + * It is broken out here for convenience for quick file generation. + */ + public final String playerUUID; + + public SaveToFile(EntityPlayer player, File originDirectory, String playerUUID) + { + super(player); + this.playerDirectory = originDirectory; + this.playerUUID = playerUUID; + } + + /** + * Construct and return a recommended file for the supplied suffix + * @param suffix The suffix to use. + * @return + */ + public File getPlayerFile(String suffix) + { + if ("dat".equals(suffix)) throw new IllegalArgumentException("The suffix 'dat' is reserved"); + return new File(this.playerDirectory, this.playerUUID+"."+suffix); + } } } diff --git a/src/main/resources/fmlversion.properties b/src/main/resources/fmlversion.properties index f91c498..630cd9b 100644 --- a/src/main/resources/fmlversion.properties +++ b/src/main/resources/fmlversion.properties @@ -1,6 +1,6 @@ fmlbuild.major.number=7 fmlbuild.minor.number=2 -fmlbuild.revision.number=211 -fmlbuild.build.number=31 +fmlbuild.revision.number=213 +fmlbuild.build.number=32 fmlbuild.mcversion=1.7.2 fmlbuild.mcpversion=9.03 diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 482e65a..6d29236 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -1,14 +1,11 @@ - + - - - - + @@ -17,43 +14,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - + + + - + \ No newline at end of file