3
0

Initial commit (Forge 1291).

This commit is contained in:
gamerforEA
2015-03-22 20:38:04 +03:00
commit 16773ead6a
611 changed files with 64826 additions and 0 deletions

View File

@ -0,0 +1,31 @@
--- ../src-base/minecraft/org/bukkit/plugin/SimplePluginManager.java
+++ ../src-work/minecraft/org/bukkit/plugin/SimplePluginManager.java
@@ -132,7 +132,9 @@
try {
description = loader.getPluginDescription(file);
String name = description.getName();
- if (name.equalsIgnoreCase("bukkit") || name.equalsIgnoreCase("minecraft") || name.equalsIgnoreCase("mojang")) {
+ if (name.equalsIgnoreCase("bukkit") || name.equalsIgnoreCase("minecraft") || name.equalsIgnoreCase("mojang")
+ // Cauldron - Add more restricted names
+ || name.equalsIgnoreCase("spigot") || name.equalsIgnoreCase("forge") || name.equalsIgnoreCase("cauldron") || name.equalsIgnoreCase("mcpc")) {
server.getLogger().log(Level.SEVERE, "Could not load '" + file.getPath() + "' in folder '" + directory.getPath() + "': Restricted Name");
continue;
} else if (description.rawName.indexOf(' ') != -1) {
@@ -188,6 +190,9 @@
}
}
+ // Cauldron - fill names for Cauldron-provided dependencies
+ loadedPlugins.addAll(ImmutableSet.of("Cauldron", "Forge", "MCPC", "MCPC+"));
+
while (!plugins.isEmpty()) {
boolean missingDependency = true;
Iterator<String> pluginIterator = plugins.keySet().iterator();
@@ -295,6 +300,7 @@
}
}
+ org.bukkit.command.defaults.TimingsCommand.timingStart = System.nanoTime(); // Spigot
return result.toArray(new Plugin[result.size()]);
}

View File

@ -0,0 +1,12 @@
--- ../src-base/minecraft/org/bukkit/plugin/SimpleServicesManager.java
+++ ../src-work/minecraft/org/bukkit/plugin/SimpleServicesManager.java
@@ -79,7 +79,8 @@
while (it2.hasNext()) {
RegisteredServiceProvider<?> registered = it2.next();
- if (registered.getPlugin().equals(plugin)) {
+ Plugin oPlugin = registered.getPlugin();
+ if (oPlugin != null ? oPlugin.equals(plugin) : plugin == null) {
it2.remove();
unregisteredEvents.add(new ServiceUnregisterEvent(registered));
}

View File

@ -0,0 +1,51 @@
--- ../src-base/minecraft/org/bukkit/plugin/TimedRegisteredListener.java
+++ ../src-work/minecraft/org/bukkit/plugin/TimedRegisteredListener.java
@@ -11,6 +11,10 @@
public class TimedRegisteredListener extends RegisteredListener {
private int count;
private long totalTime;
+ // Spigot start
+ public long curTickTotal = 0;
+ public long violations = 0;
+ // Spigot end
private Class<? extends Event> eventClass;
private boolean multiple = false;
@@ -20,6 +24,13 @@
@Override
public void callEvent(Event event) throws EventException {
+ // Spigot start
+ if ( org.bukkit.Bukkit.getServer() != null && !org.bukkit.Bukkit.getServer().getPluginManager().useTimings() )
+ {
+ super.callEvent( event );
+ return;
+ }
+ // Spigot end
if (event.isAsynchronous()) {
super.callEvent(event);
return;
@@ -34,7 +45,11 @@
}
long start = System.nanoTime();
super.callEvent(event);
- totalTime += System.nanoTime() - start;
+ // Spigot start
+ long diff = System.nanoTime() - start;
+ curTickTotal += diff;
+ totalTime += diff;
+ // Spigot end
}
private static Class<?> getCommonSuperclass(Class<?> class1, Class<?> class2) {
@@ -50,6 +65,10 @@
public void reset() {
count = 0;
totalTime = 0;
+ // Spigot start
+ curTickTotal = 0;
+ violations = 0;
+ // Spigot end
}
/**

View File

@ -0,0 +1,233 @@
--- ../src-base/minecraft/org/bukkit/plugin/java/JavaPluginLoader.java
+++ ../src-work/minecraft/org/bukkit/plugin/java/JavaPluginLoader.java
@@ -1,5 +1,15 @@
package org.bukkit.plugin.java;
+// Cauldron start
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import net.md_5.specialsource.InheritanceMap;
+import net.md_5.specialsource.JarMapping;
+import net.md_5.specialsource.transformer.MavenShade;
+// Cauldron end
+
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -10,6 +20,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarEntry;
@@ -39,8 +50,11 @@
import org.bukkit.plugin.RegisteredListener;
import org.bukkit.plugin.TimedRegisteredListener;
import org.bukkit.plugin.UnknownDependencyException;
+import org.spigotmc.CustomTimingsHandler; // Spigot
import org.yaml.snakeyaml.error.YAMLException;
+import com.google.common.collect.ImmutableList;
+
/**
* Represents a Java plugin loader, allowing plugins in the form of .jar
*/
@@ -49,6 +63,7 @@
private final Pattern[] fileFilters = new Pattern[] { Pattern.compile("\\.jar$"), };
private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
private final Map<String, PluginClassLoader> loaders = new LinkedHashMap<String, PluginClassLoader>();
+ public static final CustomTimingsHandler pluginParentTimer = new CustomTimingsHandler("** Plugins"); // Spigot
/**
* This class was not meant to be constructed explicitly
@@ -59,43 +74,41 @@
server = instance;
}
- public Plugin loadPlugin(final File file) throws InvalidPluginException {
+ public Plugin loadPlugin(File file) throws InvalidPluginException {
Validate.notNull(file, "File cannot be null");
if (!file.exists()) {
throw new InvalidPluginException(new FileNotFoundException(file.getPath() + " does not exist"));
}
- final PluginDescriptionFile description;
+ PluginDescriptionFile description;
try {
description = getPluginDescription(file);
} catch (InvalidDescriptionException ex) {
throw new InvalidPluginException(ex);
}
- final File parentFile = file.getParentFile();
- final File dataFolder = new File(parentFile, description.getName());
- @SuppressWarnings("deprecation")
- final File oldDataFolder = new File(parentFile, description.getRawName());
+ File dataFolder = new File(file.getParentFile(), description.getName());
+ File oldDataFolder = getDataFolder(file);
// Found old data folder
if (dataFolder.equals(oldDataFolder)) {
// They are equal -- nothing needs to be done!
} else if (dataFolder.isDirectory() && oldDataFolder.isDirectory()) {
- server.getLogger().warning(String.format(
- "While loading %s (%s) found old-data folder: `%s' next to the new one `%s'",
- description.getFullName(),
+ server.getLogger().log(Level.INFO, String.format(
+ "While loading %s (%s) found old-data folder: %s next to the new one: %s",
+ description.getName(),
file,
oldDataFolder,
dataFolder
));
} else if (oldDataFolder.isDirectory() && !dataFolder.exists()) {
if (!oldDataFolder.renameTo(dataFolder)) {
- throw new InvalidPluginException("Unable to rename old data folder: `" + oldDataFolder + "' to: `" + dataFolder + "'");
+ throw new InvalidPluginException("Unable to rename old data folder: '" + oldDataFolder + "' to: '" + dataFolder + "'");
}
server.getLogger().log(Level.INFO, String.format(
- "While loading %s (%s) renamed data folder: `%s' to `%s'",
- description.getFullName(),
+ "While loading %s (%s) renamed data folder: '%s' to '%s'",
+ description.getName(),
file,
oldDataFolder,
dataFolder
@@ -104,14 +117,19 @@
if (dataFolder.exists() && !dataFolder.isDirectory()) {
throw new InvalidPluginException(String.format(
- "Projected datafolder: `%s' for %s (%s) exists and is not a directory",
+ "Projected datafolder: '%s' for %s (%s) exists and is not a directory",
dataFolder,
- description.getFullName(),
+ description.getName(),
file
));
}
- for (final String pluginName : description.getDepend()) {
+ List<String> depend = description.getDepend();
+ if (depend == null) {
+ depend = ImmutableList.<String>of();
+ }
+
+ for (String pluginName : depend) {
if (loaders == null) {
throw new UnknownDependencyException(pluginName);
}
@@ -122,7 +140,7 @@
}
}
- final PluginClassLoader loader;
+ PluginClassLoader loader;
try {
loader = new PluginClassLoader(this, getClass().getClassLoader(), description, dataFolder, file);
} catch (InvalidPluginException ex) {
@@ -136,6 +154,26 @@
return loader.plugin;
}
+ private File getDataFolder(File file) {
+ File dataFolder = null;
+
+ String filename = file.getName();
+ int index = file.getName().lastIndexOf(".");
+
+ if (index != -1) {
+ String name = filename.substring(0, index);
+
+ dataFolder = new File(file.getParentFile(), name);
+ } else {
+ // This is if there is no extension, which should not happen
+ // Using _ to prevent name collision
+
+ dataFolder = new File(file.getParentFile(), filename + "_");
+ }
+
+ return dataFolder;
+ }
+
public PluginDescriptionFile getPluginDescription(File file) throws InvalidDescriptionException {
Validate.notNull(file, "File cannot be null");
@@ -283,13 +321,19 @@
}
}
+ final CustomTimingsHandler timings = new CustomTimingsHandler("Plugin: " + plugin.getDescription().getFullName() + " Event: " + listener.getClass().getName() + "::" + method.getName()+"("+eventClass.getSimpleName()+")", pluginParentTimer); // Spigot
EventExecutor executor = new EventExecutor() {
public void execute(Listener listener, Event event) throws EventException {
try {
if (!eventClass.isAssignableFrom(event.getClass())) {
return;
}
+ // Spigot start
+ boolean isAsync = event.isAsynchronous();
+ if (!isAsync) timings.startTiming();
method.invoke(listener, event);
+ if (!isAsync) timings.stopTiming();
+ // Spigot end
} catch (InvocationTargetException ex) {
throw new EventException(ex.getCause());
} catch (Throwable t) {
@@ -297,7 +341,7 @@
}
}
};
- if (useTimings) {
+ if (false) { // Spigot - RL handles useTimings check now
eventSet.add(new TimedRegisteredListener(listener, executor, eh.priority(), plugin, eh.ignoreCancelled()));
} else {
eventSet.add(new RegisteredListener(listener, executor, eh.priority(), plugin, eh.ignoreCancelled()));
@@ -362,4 +406,44 @@
}
}
}
+
+ // Cauldron start
+ private InheritanceMap globalInheritanceMap = null;
+
+ /**
+ * Get the inheritance map for remapping all plugins
+ */
+ public InheritanceMap getGlobalInheritanceMap() {
+ if (globalInheritanceMap == null) {
+ Map<String, String> relocationsCurrent = new HashMap<String, String>();
+ relocationsCurrent.put("net.minecraft.server", "net.minecraft.server."+PluginClassLoader.getNativeVersion());
+ JarMapping currentMappings = new JarMapping();
+
+ try {
+ currentMappings.loadMappings(
+ new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("mappings/"+PluginClassLoader.getNativeVersion()+"/cb2numpkg.srg"))),
+ new MavenShade(relocationsCurrent),
+ null, false);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+
+ BiMap<String, String> inverseClassMap = HashBiMap.create(currentMappings.classes).inverse();
+ globalInheritanceMap = new InheritanceMap();
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("mappings/"+PluginClassLoader.getNativeVersion()+"/nms.inheritmap")));
+
+ try {
+ globalInheritanceMap.load(reader, inverseClassMap);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+ System.out.println("Loaded inheritance map of "+globalInheritanceMap.size()+" classes");
+ }
+
+ return globalInheritanceMap;
+ }
+ // Cauldron end
}

View File

@ -0,0 +1,486 @@
--- ../src-base/minecraft/org/bukkit/plugin/java/PluginClassLoader.java
+++ ../src-work/minecraft/org/bukkit/plugin/java/PluginClassLoader.java
@@ -1,5 +1,23 @@
package org.bukkit.plugin.java;
+// Cauldron start
+import net.md_5.specialsource.provider.ClassLoaderProvider;
+import net.md_5.specialsource.transformer.MavenShade;
+//import org.bouncycastle.util.io.Streams;
+import net.md_5.specialsource.*;
+import net.md_5.specialsource.repo.*;
+import net.minecraft.server.MinecraftServer;
+import net.minecraftforge.cauldron.configuration.CauldronConfig;
+import net.minecraftforge.cauldron.CauldronUtils;
+
+import org.bukkit.plugin.PluginDescriptionFile;
+import java.io.*;
+import java.net.JarURLConnection;
+import java.security.CodeSigner;
+import java.security.CodeSource;
+import java.util.concurrent.*;
+// Cauldron end
+
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
@@ -15,16 +33,40 @@
/**
* A ClassLoader for plugins, to allow shared classes across multiple plugins
*/
-final class PluginClassLoader extends URLClassLoader {
+public class PluginClassLoader extends URLClassLoader {
private final JavaPluginLoader loader;
- private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
+ private final ConcurrentMap<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>(); // Cauldron - Threadsafe classloading
private final PluginDescriptionFile description;
private final File dataFolder;
private final File file;
- final JavaPlugin plugin;
+ JavaPlugin plugin; // Cauldron - remove final
private JavaPlugin pluginInit;
private IllegalStateException pluginState;
+ // Cauldron start
+ private JarRemapper remapper; // class remapper for this plugin, or null
+ private RemapperProcessor remapperProcessor; // secondary; for inheritance & remapping reflection
+ private boolean debug; // classloader debugging
+ private int remapFlags = -1;
+ private static ConcurrentMap<Integer,JarMapping> jarMappings = new ConcurrentHashMap<Integer, JarMapping>();
+ private static final int F_GLOBAL_INHERIT = 1 << 1;
+ private static final int F_REMAP_OBCPRE = 1 << 2;
+ private static final int F_REMAP_NMS152 = 1 << 3;
+ private static final int F_REMAP_NMS164 = 1 << 4;
+ private static final int F_REMAP_NMS172 = 1 << 5;
+ private static final int F_REMAP_NMS179 = 1 << 6;
+ private static final int F_REMAP_NMS1710 = 1 << 7;
+ private static final int F_REMAP_OBC152 = 1 << 8;
+ private static final int F_REMAP_OBC164 = 1 << 9;
+ private static final int F_REMAP_OBC172 = 1 << 10;
+ private static final int F_REMAP_OBC179 = 1 << 11;
+ private static final int F_REMAP_OBC1710 = 1 << 12;
+ private static final int F_REMAP_NMSPRE_MASK= 0xffff0000; // "unversioned" NMS plugin version
+
+ // This trick bypasses Maven Shade's package rewriting when using String literals [same trick in jline]
+ private static final String org_bukkit_craftbukkit = new String(new char[] {'o','r','g','/','b','u','k','k','i','t','/','c','r','a','f','t','b','u','k','k','i','t'});
+ // Cauldron end
+
PluginClassLoader(final JavaPluginLoader loader, final ClassLoader parent, final PluginDescriptionFile description, final File dataFolder, final File file) throws InvalidPluginException, MalformedURLException {
super(new URL[] {file.toURI().toURL()}, parent);
Validate.notNull(loader, "Loader cannot be null");
@@ -34,6 +76,113 @@
this.dataFolder = dataFolder;
this.file = file;
+ // Cauldron start
+
+ String pluginName = this.description.getName();
+
+ // configure default remapper settings
+ boolean useCustomClassLoader = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.custom-class-loader", true);
+ debug = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.debug", false);
+ boolean remapNMS1710 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-nms-v1_7_R4", true);
+ boolean remapNMS179 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-nms-v1_7_R3", true);
+ boolean remapNMS172 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-nms-v1_7_R1", true);
+ boolean remapNMS164 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-nms-v1_6_R3", true);
+ boolean remapNMS152 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-nms-v1_5_R3", true);
+ String remapNMSPre = MinecraftServer.getServer().cauldronConfig.getString("plugin-settings.default.remap-nms-pre", "false");
+ boolean remapOBC1710 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-obc-v1_7_R4", true);
+ boolean remapOBC179 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-obc-v1_7_R3", true);
+ boolean remapOBC172 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-obc-v1_7_R1", true);
+ boolean remapOBC164 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-obc-v1_6_R3", true);
+ boolean remapOBC152 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-obc-v1_5_R3", true);
+ boolean remapOBCPre = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-obc-pre", false);
+ boolean globalInherit = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.global-inheritance", true);
+ boolean pluginInherit = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.plugin-inheritance", true);
+ boolean reflectFields = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-reflect-field", true);
+ boolean reflectClass = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-reflect-class", true);
+ boolean allowFuture = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings.default.remap-allow-future", false);
+
+ // plugin-specific overrides
+ useCustomClassLoader = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".custom-class-loader", useCustomClassLoader, false);
+ debug = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".debug", debug, false);
+ remapNMS1710 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-nms-v1_7_R4", remapNMS1710, false);
+ remapNMS179 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-nms-v1_7_R3", remapNMS179, false);
+ remapNMS172 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-nms-v1_7_R1", remapNMS172, false);
+ remapNMS164 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-nms-v1_6_R3", remapNMS164, false);
+ remapNMS152 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-nms-v1_5_R3", remapNMS152, false);
+ remapNMSPre = MinecraftServer.getServer().cauldronConfig.getString("plugin-settings."+pluginName+".remap-nms-pre", remapNMSPre, false);
+ remapOBC1710 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-obc-v1_7_R4", remapOBC1710, false);
+ remapOBC179 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-obc-v1_7_R3", remapOBC179, false);
+ remapOBC172 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-obc-v1_7_R1", remapOBC172, false);
+ remapOBC164 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-obc-v1_6_R3", remapOBC164, false);
+ remapOBC152 = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-obc-v1_5_R3", remapOBC152, false);
+ remapOBCPre = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-obc-pre", remapOBCPre, false);
+ globalInherit = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".global-inheritance", globalInherit, false);
+ pluginInherit = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".plugin-inheritance", pluginInherit, false);
+ reflectFields = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-reflect-field", reflectFields, false);
+ reflectClass = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-reflect-class", reflectClass, false);
+ allowFuture = MinecraftServer.getServer().cauldronConfig.getBoolean("plugin-settings."+pluginName+".remap-allow-future", allowFuture, false);
+
+ if (debug) {
+ System.out.println("PluginClassLoader debugging enabled for "+pluginName);
+ }
+
+ if (!useCustomClassLoader) {
+ remapper = null;
+ return;
+ }
+
+ int flags = 0;
+ if (remapNMS1710) flags |= F_REMAP_NMS1710;
+ if (remapNMS179) flags |= F_REMAP_NMS179;
+ if (remapNMS172) flags |= F_REMAP_NMS172;
+ if (remapNMS164) flags |= F_REMAP_NMS164;
+ if (remapNMS152) flags |= F_REMAP_NMS152;
+ if (!remapNMSPre.equals("false")) {
+ if (remapNMSPre.equals("1.7.10")) flags |= 0x17100000;
+ else if (remapNMSPre.equals("1.7.9")) flags |= 0x01790000;
+ else if (remapNMSPre.equals("1.7.2")) flags |= 0x01720000;
+ else if (remapNMSPre.equals("1.6.4")) flags |= 0x01640000;
+ else if (remapNMSPre.equals("1.5.2")) flags |= 0x01520000;
+ else {
+ System.out.println("Unsupported nms-remap-pre version '"+remapNMSPre+"', disabling");
+ }
+ }
+ if (remapOBC1710) flags |= F_REMAP_OBC1710;
+ if (remapOBC179) flags |= F_REMAP_OBC179;
+ if (remapOBC172) flags |= F_REMAP_OBC172;
+ if (remapOBC164) flags |= F_REMAP_OBC164;
+ if (remapOBC152) flags |= F_REMAP_OBC152;
+ if (remapOBCPre) flags |= F_REMAP_OBCPRE;
+ if (globalInherit) flags |= F_GLOBAL_INHERIT;
+
+ remapFlags = flags; // used in findClass0
+ JarMapping jarMapping = getJarMapping(flags);
+
+ // Load inheritance map
+ if ((flags & F_GLOBAL_INHERIT) != 0) {
+ if (debug) {
+ System.out.println("Enabling global inheritance remapping");
+ //ClassLoaderProvider.verbose = debug; // TODO: changed in https://github.com/md-5/SpecialSource/commit/132584eda4f0860c9d14f4c142e684a027a128b8#L3L48
+ }
+ jarMapping.setInheritanceMap(loader.getGlobalInheritanceMap());
+ jarMapping.setFallbackInheritanceProvider(new ClassLoaderProvider(this));
+ }
+
+ remapper = new JarRemapper(jarMapping);
+
+ if (pluginInherit || reflectFields || reflectClass) {
+ remapperProcessor = new RemapperProcessor(
+ pluginInherit ? loader.getGlobalInheritanceMap() : null,
+ (reflectFields || reflectClass) ? jarMapping : null);
+
+ remapperProcessor.setRemapReflectField(reflectFields);
+ remapperProcessor.setRemapReflectClass(reflectClass);
+ remapperProcessor.debug = debug;
+ } else {
+ remapperProcessor = null;
+ }
+ // Cauldron end
+
try {
Class<?> jarClass;
try {
@@ -58,34 +207,290 @@
}
@Override
- protected Class<?> findClass(String name) throws ClassNotFoundException {
+ public Class<?> findClass(String name) throws ClassNotFoundException { // Cauldron - public access for plugins to support CB NMS -> MCP class remap
return findClass(name, true);
}
- Class<?> findClass(String name, boolean checkGlobal) throws ClassNotFoundException {
- if (name.startsWith("org.bukkit.") || name.startsWith("net.minecraft.")) {
- throw new ClassNotFoundException(name);
+ // Cauldron start
+ /**
+ * Get the "native" obfuscation version, from our Maven shading version.
+ */
+ public static String getNativeVersion() {
+ // see https://github.com/mbax/VanishNoPacket/blob/master/src/main/java/org/kitteh/vanish/compat/NMSManager.java
+ if (CauldronUtils.deobfuscatedEnvironment()) return "v1_7_R4"; // support plugins in deobf environment
+ final String packageName = org.bukkit.craftbukkit.CraftServer.class.getPackage().getName();
+ return packageName.substring(packageName.lastIndexOf('.') + 1);
+ }
+
+ /**
+ * Load NMS mappings from CraftBukkit mc-dev to repackaged srgnames for FML runtime deobf
+ *
+ * @param jarMapping An existing JarMappings instance to load into
+ * @param obfVersion CraftBukkit version with internal obfuscation counter identifier
+ * >=1.4.7 this is the major version + R#. v1_4_R1=1.4.7, v1_5_R1=1.5, v1_5_R2=1.5.1..
+ * For older versions (including pre-safeguard) it is the full Minecraft version number
+ * @throws IOException
+ */
+ private void loadNmsMappings(JarMapping jarMapping, String obfVersion) throws IOException {
+ Map<String, String> relocations = new HashMap<String, String>();
+ // mc-dev jar to CB, apply version shading (aka plugin safeguard)
+ relocations.put("net.minecraft.server", "net.minecraft.server." + obfVersion);
+
+ // support for running 1.7.10 plugins in Cauldron dev
+ if (CauldronUtils.deobfuscatedEnvironment() && obfVersion.equals("v1_7_R4"))
+ {
+ jarMapping.loadMappings(
+ new BufferedReader(new InputStreamReader(loader.getClass().getClassLoader().getResourceAsStream("mappings/"+obfVersion+"/cb2pkgmcp.srg"))),
+ new MavenShade(relocations),
+ null, false);
+
+ jarMapping.loadMappings(
+ new BufferedReader(new InputStreamReader(loader.getClass().getClassLoader().getResourceAsStream("mappings/"+obfVersion+"/obf2pkgmcp.srg"))),
+ null, // no version relocation for obf
+ null, false);
+ // resolve naming conflict in FML/CB
+ jarMapping.methods.put("net/minecraft/server/"+obfVersion+"/PlayerConnection/getPlayer ()Lorg/bukkit/craftbukkit/entity/CraftPlayer;", "getPlayerB");
}
- Class<?> result = classes.get(name);
+ else
+ {
+ jarMapping.loadMappings(
+ new BufferedReader(new InputStreamReader(loader.getClass().getClassLoader().getResourceAsStream("mappings/"+obfVersion+"/cb2numpkg.srg"))),
+ new MavenShade(relocations),
+ null, false);
- if (result == null) {
- if (checkGlobal) {
- result = loader.getClassByName(name);
+ if (obfVersion.equals("v1_7_R4")) {
+ jarMapping.loadMappings(
+ new BufferedReader(new InputStreamReader(loader.getClass().getClassLoader().getResourceAsStream("mappings/"+obfVersion+"/obf2numpkg.srg"))),
+ null, // no version relocation for obf
+ null, false);
}
+ // resolve naming conflict in FML/CB
+ jarMapping.methods.put("net/minecraft/server/"+obfVersion+"/PlayerConnection/getPlayer ()Lorg/bukkit/craftbukkit/"+getNativeVersion()+"/entity/CraftPlayer;", "getPlayerB");
+ }
+ // remap bouncycastle to Forge's included copy, not the vanilla obfuscated copy (not in Cauldron), see #133
+ //jarMapping.packages.put("net/minecraft/"+obfVersion+"/org/bouncycastle", "org/bouncycastle"); No longer needed
+ }
+
+ private JarMapping getJarMapping(int flags) {
+ JarMapping jarMapping = jarMappings.get(flags);
+
+ if (jarMapping != null) {
+ if (debug) {
+ System.out.println("Mapping reused for "+Integer.toHexString(flags));
+ }
+ return jarMapping;
+ }
+
+ jarMapping = new JarMapping();
+ try {
+
+ // Guava 10 is part of the Bukkit API, so plugins can use it, but FML includes Guava 15
+ // To resolve this conflict, remap plugin usages to Guava 10 in a separate package
+ // Most plugins should keep this enabled, unless they want a newer Guava
+ jarMapping.packages.put("com/google/common", "guava10/com/google/common");
+ jarMapping.packages.put(org_bukkit_craftbukkit + "/libs/com/google/gson", "com/google/gson"); // Handle Gson being in a "normal" place
+ // Bukkit moves these packages to nms while we keep them in root so we must relocate them for plugins that rely on them
+ jarMapping.packages.put("net/minecraft/util/io", "io");
+ jarMapping.packages.put("net/minecraft/util/com", "com");
+ jarMapping.packages.put("net/minecraft/util/gnu", "gnu");
+ jarMapping.packages.put("net/minecraft/util/org", "org");
+
+ if ((flags & F_REMAP_NMS1710) != 0) {
+ loadNmsMappings(jarMapping, "v1_7_R4");
+ }
+
+ if ((flags & F_REMAP_NMS179) != 0) {
+ loadNmsMappings(jarMapping, "v1_7_R3");
+ }
+
+ if ((flags & F_REMAP_NMS172) != 0) {
+ loadNmsMappings(jarMapping, "v1_7_R1");
+ }
+
+ if ((flags & F_REMAP_NMS164) != 0) {
+ loadNmsMappings(jarMapping, "v1_6_R3");
+ }
+
+ if ((flags & F_REMAP_NMS152) != 0) {
+ loadNmsMappings(jarMapping, "v1_5_R3");
+ }
+
+ if ((flags & F_REMAP_OBC1710) != 0) {
+ if (CauldronUtils.deobfuscatedEnvironment())
+ jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_7_R4", org_bukkit_craftbukkit);
+ else jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_7_R4", org_bukkit_craftbukkit+"/"+getNativeVersion());
+ }
+
+ if ((flags & F_REMAP_OBC179) != 0) {
+ if (CauldronUtils.deobfuscatedEnvironment())
+ jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_7_R3", org_bukkit_craftbukkit);
+ else jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_7_R3", org_bukkit_craftbukkit+"/"+getNativeVersion());
+ }
+
+ if ((flags & F_REMAP_OBC172) != 0) {
+ if (CauldronUtils.deobfuscatedEnvironment())
+ jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_7_R1", org_bukkit_craftbukkit+"/"+getNativeVersion());
+ else jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_7_R1", org_bukkit_craftbukkit+"/"+getNativeVersion());
+ }
+
+ if ((flags & F_REMAP_OBC164) != 0) {
+ jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_6_R3", org_bukkit_craftbukkit+"/"+getNativeVersion());
+ }
+
+ if ((flags & F_REMAP_OBC152) != 0) {
+ jarMapping.packages.put(org_bukkit_craftbukkit+"/v1_5_R3", org_bukkit_craftbukkit+"/"+getNativeVersion());
+ }
+
+ if ((flags & F_REMAP_OBCPRE) != 0) {
+ // enabling unversioned obc not currently compatible with versioned obc plugins (overmapped) -
+ // admins should enable remap-obc-pre on a per-plugin basis, as needed
+ // then map unversioned to current version
+ jarMapping.packages.put(org_bukkit_craftbukkit+"/libs/org/objectweb/asm", "org/objectweb/asm"); // ?
+ jarMapping.packages.put(org_bukkit_craftbukkit, org_bukkit_craftbukkit+"/"+getNativeVersion());
+ }
+
+ if ((flags & F_REMAP_NMSPRE_MASK) != 0) {
+ String obfVersion;
+ switch (flags & F_REMAP_NMSPRE_MASK)
+ {
+ case 0x17100000: obfVersion = "v1_7_R4"; break;
+ case 0x01790000: obfVersion = "v1_7_R3"; break;
+ case 0x01720000: obfVersion = "v1_7_R1"; break;
+ case 0x01640000: obfVersion = "v1_6_R3"; break;
+ case 0x01510000: obfVersion = "v1_5_R2"; break;
+ default: throw new IllegalArgumentException("Invalid unversioned mapping flags: "+Integer.toHexString(flags & F_REMAP_NMSPRE_MASK)+" in "+Integer.toHexString(flags));
+ }
+
+ jarMapping.loadMappings(
+ new BufferedReader(new InputStreamReader(loader.getClass().getClassLoader().getResourceAsStream("mappings/" + obfVersion + "/cb2numpkg.srg"))),
+ null, // no version relocation!
+ null, false);
+ }
+
+ System.out.println("Mapping loaded "+jarMapping.packages.size()+" packages, "+jarMapping.classes.size()+" classes, "+jarMapping.fields.size()+" fields, "+jarMapping.methods.size()+" methods, flags "+Integer.toHexString(flags));
+
+ JarMapping currentJarMapping = jarMappings.putIfAbsent(flags, jarMapping);
+ return currentJarMapping == null ? jarMapping : currentJarMapping;
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+ }
+
+ Class<?> findClass(String name, boolean checkGlobal) throws ClassNotFoundException {
+ // Cauldron start - remap any calls for classes with packaged nms version
+ if (name.startsWith("net.minecraft."))
+ {
+ JarMapping jarMapping = this.getJarMapping(remapFlags); // grab from SpecialSource
+ String remappedClass = jarMapping.classes.get(name.replaceAll("\\.", "\\/")); // get remapped pkgmcp class name
+ Class<?> clazz = ((net.minecraft.launchwrapper.LaunchClassLoader)MinecraftServer.getServer().getClass().getClassLoader()).findClass(remappedClass);
+ return clazz;
+ }
+ if (name.startsWith("org.bukkit.")) {
+ if (debug) {
+ System.out.println("Unexpected plugin findClass on OBC/NMS: name="+name+", checkGlobal="+checkGlobal+"; returning not found");
+ }
+ throw new ClassNotFoundException(name);
+ }
+ // custom loader, if enabled, threadsafety
+ synchronized (name.intern()) {
+ Class<?> result = classes.get(name);
+
if (result == null) {
- result = super.findClass(name);
+ if (checkGlobal) {
+ result = loader.getClassByName(name); // Don't warn on deprecation, but maintain overridability
+ }
+ if (result == null) {
+ if (remapper == null) {
+ result = super.findClass(name);
+ } else {
+ result = remappedFindClass(name);
+ }
+
+ if (result != null) {
+ loader.setClass(name, result);
+ }
+ }
if (result != null) {
- loader.setClass(name, result);
+ Class<?> old = classes.putIfAbsent(name, result);
+ if (old != null && old != result) {
+ System.err.println("Defined class " + name + " twice as different classes, " + result + " and " + old);
+ result = old;
+ }
}
}
- classes.put(name, result);
+ return result;
}
+ // Cauldron end
+ }
+ private Class<?> remappedFindClass(String name) throws ClassNotFoundException {
+ Class<?> result = null;
+ try {
+ // Load the resource to the name
+ String path = name.replace('.', '/').concat(".class");
+ URL url = this.findResource(path);
+ if (url != null) {
+ InputStream stream = url.openStream();
+ if (stream != null) {
+ byte[] bytecode = null;
+
+ // Reflection remap and inheritance extract
+ if (remapperProcessor != null) {
+ // add to inheritance map
+ bytecode = remapperProcessor.process(stream);
+ if (bytecode == null) stream = url.openStream();
+ }
+
+ /*if (bytecode == null) {
+ bytecode = Streams.readAll(stream);
+ }*/
+
+ // Remap the classes
+ byte[] remappedBytecode = remapper.remapClassFile(bytecode, RuntimeRepo.getInstance());
+
+ if (debug) {
+ File file = new File("remapped-plugin-classes/"+name+".class");
+ file.getParentFile().mkdirs();
+ try {
+ FileOutputStream fileOutputStream = new FileOutputStream(file);
+ fileOutputStream.write(remappedBytecode);
+ fileOutputStream.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ // Define (create) the class using the modified byte code
+ // The top-child class loader is used for this to prevent access violations
+ // Set the codesource to the jar, not within the jar, for compatibility with
+ // plugins that do new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()))
+ // instead of using getResourceAsStream - see https://github.com/MinecraftPortCentral/Cauldron-Plus/issues/75
+ JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); // parses only
+ URL jarURL = jarURLConnection.getJarFileURL();
+ CodeSource codeSource = new CodeSource(jarURL, new CodeSigner[0]);
+
+ result = this.defineClass(name, remappedBytecode, 0, remappedBytecode.length, codeSource);
+ if (result != null) {
+ // Resolve it - sets the class loader of the class
+ this.resolveClass(result);
+ }
+ }
+ }
+ } catch (Throwable t) {
+ if (debug) {
+ System.out.println("remappedFindClass("+name+") exception: "+t);
+ t.printStackTrace();
+ }
+ throw new ClassNotFoundException("Failed to remap class "+name, t);
+ }
+
return result;
}
+ // Cauldron end
Set<String> getClasses() {
return classes.keySet();

View File

@ -0,0 +1,11 @@
--- ../src-base/minecraft/org/bukkit/plugin/messaging/Messenger.java
+++ ../src-work/minecraft/org/bukkit/plugin/messaging/Messenger.java
@@ -18,7 +18,7 @@
/**
* Represents the largest size that a Plugin Channel may be.
*/
- public static final int MAX_CHANNEL_SIZE = 16;
+ public static final int MAX_CHANNEL_SIZE = 20; // Cauldron - Vanilla increased limit of C17PacketCustomPayload size from 16 -> 20 in 1.7
/**
* Checks if the specified channel is a reserved name.

View File

@ -0,0 +1,19 @@
--- ../src-base/minecraft/org/bukkit/plugin/messaging/StandardMessenger.java
+++ ../src-work/minecraft/org/bukkit/plugin/messaging/StandardMessenger.java
@@ -421,7 +421,15 @@
Set<PluginMessageListenerRegistration> registrations = getIncomingChannelRegistrations(channel);
for (PluginMessageListenerRegistration registration : registrations) {
- registration.getListener().onPluginMessageReceived(channel, source, message);
+ // Spigot Start
+ try
+ {
+ registration.getListener().onPluginMessageReceived( channel, source, message );
+ } catch ( Throwable t )
+ {
+ org.bukkit.Bukkit.getLogger().log( java.util.logging.Level.WARNING, "Could not pass incoming plugin message to " + registration.getPlugin(), t );
+ }
+ // Spigot End
}
}