Commit 3e896077b180d8a19508857140b0b372e154abeb

Authored by Mumfrey
1 parent 6f0192d2

LiteLoader 1.6.4_02 - experimental - force permissions query packet on world cha…

…nge for BungeeCord multi-server support
java/com/mumfrey/liteloader/core/Events.java
@@ -22,17 +22,17 @@ public class Events implements IPlayerUsage @@ -22,17 +22,17 @@ public class Events implements IPlayerUsage
22 /** 22 /**
23 * Reference to the loader instance 23 * Reference to the loader instance
24 */ 24 */
25 - private LiteLoader loader; 25 + private final LiteLoader loader;
26 26
27 /** 27 /**
28 * Reference to the game 28 * Reference to the game
29 */ 29 */
30 - private Minecraft minecraft; 30 + private final Minecraft minecraft;
31 31
32 /** 32 /**
33 * Plugin channel manager 33 * Plugin channel manager
34 */ 34 */
35 - private PluginChannels pluginChannels; 35 + private final PluginChannels pluginChannels;
36 36
37 /** 37 /**
38 * Reference to the minecraft timer 38 * Reference to the minecraft timer
@@ -47,7 +47,7 @@ public class Events implements IPlayerUsage @@ -47,7 +47,7 @@ public class Events implements IPlayerUsage
47 /** 47 /**
48 * Profiler hook objects 48 * Profiler hook objects
49 */ 49 */
50 - private HookProfiler profilerHook = new HookProfiler(this); 50 + private final HookProfiler profilerHook = new HookProfiler(this);
51 51
52 /** 52 /**
53 * ScaledResolution used by the pre-chat and post-chat render callbacks 53 * ScaledResolution used by the pre-chat and post-chat render callbacks
@@ -128,6 +128,12 @@ public class Events implements IPlayerUsage @@ -128,6 +128,12 @@ public class Events implements IPlayerUsage
128 * client login events 128 * client login events
129 */ 129 */
130 private LinkedList<PreLoginListener> preLoginListeners = new LinkedList<PreLoginListener>(); 130 private LinkedList<PreLoginListener> preLoginListeners = new LinkedList<PreLoginListener>();
  131 +
  132 + /**
  133 + * Hash code of the current world. We don't store the world reference here because we don't want
  134 + * to mess with world GC by mistake
  135 + */
  136 + private int worldHashCode = 0;
131 137
132 /** 138 /**
133 * Package private ctor 139 * Package private ctor
@@ -585,6 +591,21 @@ public class Events implements IPlayerUsage @@ -585,6 +591,21 @@ public class Events implements IPlayerUsage
585 tickable.onTick(this.minecraft, partialTicks, inGame, clock); 591 tickable.onTick(this.minecraft, partialTicks, inGame, clock);
586 profiler.endSection(); 592 profiler.endSection();
587 } 593 }
  594 +
  595 + // Detected world change
  596 + if (this.minecraft.theWorld != null)
  597 + {
  598 + if (this.minecraft.theWorld.hashCode() != this.worldHashCode)
  599 + {
  600 + this.worldHashCode = this.minecraft.theWorld.hashCode();
  601 + this.loader.onWorldChanged(this.minecraft.theWorld);
  602 + }
  603 + }
  604 + else
  605 + {
  606 + this.worldHashCode = 0;
  607 + this.loader.onWorldChanged(null);
  608 + }
588 } 609 }
589 610
590 /** 611 /**
java/com/mumfrey/liteloader/core/LiteLoader.java
@@ -29,6 +29,7 @@ import net.minecraft.src.NetHandler; @@ -29,6 +29,7 @@ import net.minecraft.src.NetHandler;
29 import net.minecraft.src.Packet1Login; 29 import net.minecraft.src.Packet1Login;
30 import net.minecraft.src.ResourcePack; 30 import net.minecraft.src.ResourcePack;
31 import net.minecraft.src.SimpleReloadableResourceManager; 31 import net.minecraft.src.SimpleReloadableResourceManager;
  32 +import net.minecraft.src.World;
32 33
33 import com.mumfrey.liteloader.*; 34 import com.mumfrey.liteloader.*;
34 import com.mumfrey.liteloader.crashreport.CallableLiteLoaderBrand; 35 import com.mumfrey.liteloader.crashreport.CallableLiteLoaderBrand;
@@ -639,8 +640,8 @@ public final class LiteLoader @@ -639,8 +640,8 @@ public final class LiteLoader
639 * @param metaDataKey 640 * @param metaDataKey
640 * @param defaultValue 641 * @param defaultValue
641 * @return 642 * @return
642 - * @throws InvalidActivityException  
643 - * @throws IllegalArgumentException 643 + * @throws InvalidActivityException Thrown by getMod if init is not complete
  644 + * @throws IllegalArgumentException Thrown by getMod if argument is null
644 */ 645 */
645 public String getModMetaData(String mod, String metaDataKey, String defaultValue) throws InvalidActivityException, IllegalArgumentException 646 public String getModMetaData(String mod, String metaDataKey, String defaultValue) throws InvalidActivityException, IllegalArgumentException
646 { 647 {
@@ -846,7 +847,24 @@ public final class LiteLoader @@ -846,7 +847,24 @@ public final class LiteLoader
846 { 847 {
847 this.permissionsManager.onLogin(netHandler, loginPacket); 848 this.permissionsManager.onLogin(netHandler, loginPacket);
848 } 849 }
  850 +
  851 + /**
  852 + * Called when the world reference is changed
  853 + *
  854 + * @param world
  855 + */
  856 + void onWorldChanged(World world)
  857 + {
  858 + if (world != null)
  859 + {
  860 + // For bungeecord
  861 + this.permissionsManager.scheduleRefresh();
  862 + }
  863 + }
849 864
  865 + /**
  866 + * On render callback
  867 + */
850 void onRender() 868 void onRender()
851 { 869 {
852 if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class)) 870 if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class))
@@ -863,6 +881,10 @@ public final class LiteLoader @@ -863,6 +881,10 @@ public final class LiteLoader
863 } 881 }
864 } 882 }
865 883
  884 + /**
  885 + * @param partialTicks
  886 + * @param inGame
  887 + */
866 void onTick(float partialTicks, boolean inGame) 888 void onTick(float partialTicks, boolean inGame)
867 { 889 {
868 // Tick the permissions manager 890 // Tick the permissions manager
@@ -871,6 +893,11 @@ public final class LiteLoader @@ -871,6 +893,11 @@ public final class LiteLoader
871 this.checkAndStoreKeyBindings(); 893 this.checkAndStoreKeyBindings();
872 } 894 }
873 895
  896 + /**
  897 + * Register a key for a mod
  898 + *
  899 + * @param binding
  900 + */
874 public void registerModKey(KeyBinding binding) 901 public void registerModKey(KeyBinding binding)
875 { 902 {
876 LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>(); 903 LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>();
java/com/mumfrey/liteloader/core/LiteLoaderEnumerator.java
@@ -32,6 +32,7 @@ import java.util.zip.ZipInputStream; @@ -32,6 +32,7 @@ import java.util.zip.ZipInputStream;
32 import net.minecraft.launchwrapper.LaunchClassLoader; 32 import net.minecraft.launchwrapper.LaunchClassLoader;
33 33
34 import com.mumfrey.liteloader.LiteMod; 34 import com.mumfrey.liteloader.LiteMod;
  35 +import com.mumfrey.liteloader.core.exceptions.OutdatedLoaderException;
35 import com.mumfrey.liteloader.launch.LiteLoaderTweaker; 36 import com.mumfrey.liteloader.launch.LiteLoaderTweaker;
36 37
37 /** 38 /**
@@ -645,6 +646,11 @@ class LiteLoaderEnumerator implements FilenameFilter @@ -645,6 +646,11 @@ class LiteLoaderEnumerator implements FilenameFilter
645 LiteLoaderEnumerator.enumerateCompressedPackage(prefix, superClass, classloader, classes, packagePath); 646 LiteLoaderEnumerator.enumerateCompressedPackage(prefix, superClass, classloader, classes, packagePath);
646 } 647 }
647 } 648 }
  649 + catch (OutdatedLoaderException ex)
  650 + {
  651 + classes.clear();
  652 + LiteLoaderEnumerator.logWarning("Error searching in '%s', missing API component '%s', your loader is probably out of date", packagePath, ex.getMessage());
  653 + }
648 catch (Throwable th) 654 catch (Throwable th)
649 { 655 {
650 LiteLoaderEnumerator.logger.log(Level.WARNING, "Enumeration error", th); 656 LiteLoaderEnumerator.logger.log(Level.WARNING, "Enumeration error", th);
@@ -700,8 +706,9 @@ class LiteLoaderEnumerator implements FilenameFilter @@ -700,8 +706,9 @@ class LiteLoaderEnumerator implements FilenameFilter
700 * @param classes 706 * @param classes
701 * @param packagePath 707 * @param packagePath
702 * @param packageName 708 * @param packageName
  709 + * @throws OutdatedLoaderException
703 */ 710 */
704 - private static void enumerateDirectory(String prefix, Class<?> superClass, ClassLoader classloader, LinkedList<Class<?>> classes, File packagePath) 711 + private static void enumerateDirectory(String prefix, Class<?> superClass, ClassLoader classloader, LinkedList<Class<?>> classes, File packagePath) throws OutdatedLoaderException
705 { 712 {
706 LiteLoaderEnumerator.enumerateDirectory(prefix, superClass, classloader, classes, packagePath, "", 0); 713 LiteLoaderEnumerator.enumerateDirectory(prefix, superClass, classloader, classes, packagePath, "", 0);
707 } 714 }
@@ -714,8 +721,9 @@ class LiteLoaderEnumerator implements FilenameFilter @@ -714,8 +721,9 @@ class LiteLoaderEnumerator implements FilenameFilter
714 * @param classes 721 * @param classes
715 * @param packagePath 722 * @param packagePath
716 * @param packageName 723 * @param packageName
  724 + * @throws OutdatedLoaderException
717 */ 725 */
718 - private static void enumerateDirectory(String prefix, Class<?> superClass, ClassLoader classloader, LinkedList<Class<?>> classes, File packagePath, String packageName, int depth) 726 + private static void enumerateDirectory(String prefix, Class<?> superClass, ClassLoader classloader, LinkedList<Class<?>> classes, File packagePath, String packageName, int depth) throws OutdatedLoaderException
719 { 727 {
720 // Prevent crash due to broken recursion 728 // Prevent crash due to broken recursion
721 if (depth > MAX_DISCOVERY_DEPTH) 729 if (depth > MAX_DISCOVERY_DEPTH)
@@ -746,8 +754,9 @@ class LiteLoaderEnumerator implements FilenameFilter @@ -746,8 +754,9 @@ class LiteLoaderEnumerator implements FilenameFilter
746 * @param superClass 754 * @param superClass
747 * @param classes 755 * @param classes
748 * @param className 756 * @param className
  757 + * @throws OutdatedLoaderException
749 */ 758 */
750 - private static void checkAndAddClass(ClassLoader classloader, Class<?> superClass, LinkedList<Class<?>> classes, String className) 759 + private static void checkAndAddClass(ClassLoader classloader, Class<?> superClass, LinkedList<Class<?>> classes, String className) throws OutdatedLoaderException
751 { 760 {
752 if (className.indexOf('$') > -1) 761 if (className.indexOf('$') > -1)
753 return; 762 return;
@@ -763,6 +772,15 @@ class LiteLoaderEnumerator implements FilenameFilter @@ -763,6 +772,15 @@ class LiteLoaderEnumerator implements FilenameFilter
763 } 772 }
764 catch (Throwable th) 773 catch (Throwable th)
765 { 774 {
  775 + String missingClassName = th.getCause().getMessage();
  776 + if (th.getCause() instanceof NoClassDefFoundError && missingClassName != null)
  777 + {
  778 + if (missingClassName.startsWith("com/mumfrey/liteloader/"))
  779 + {
  780 + throw new OutdatedLoaderException(missingClassName.substring(missingClassName.lastIndexOf('/') + 1));
  781 + }
  782 + }
  783 +
766 LiteLoaderEnumerator.logger.log(Level.WARNING, "checkAndAddClass error", th); 784 LiteLoaderEnumerator.logger.log(Level.WARNING, "checkAndAddClass error", th);
767 } 785 }
768 } 786 }
java/com/mumfrey/liteloader/core/exceptions/OutdatedLoaderException.java 0 → 100644
  1 +package com.mumfrey.liteloader.core.exceptions;
  2 +
  3 +/**
  4 + * Exception thrown when a mod class references a liteloader interface which does not exist,
  5 + * which more than likely means that it requires a more up-to-date version of the loader than
  6 + * is currently installed.
  7 + *
  8 + * @author Adam Mummery-Smith
  9 + */
  10 +public class OutdatedLoaderException extends Exception
  11 +{
  12 + private static final long serialVersionUID = 8770358290208830747L;
  13 +
  14 + /**
  15 + * @param missingAPI Name of the referenced class which is missing
  16 + */
  17 + public OutdatedLoaderException(String missingAPI)
  18 + {
  19 + super(missingAPI);
  20 + }
  21 +}
java/com/mumfrey/liteloader/permissions/PermissionsManagerClient.java
@@ -75,7 +75,7 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann @@ -75,7 +75,7 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann
75 /** 75 /**
76 * Delay counter for when joining a server 76 * Delay counter for when joining a server
77 */ 77 */
78 - private int loginRegisterTicks = 0; 78 + private int pendingRefreshTicks = 0;
79 79
80 private int menuTicks = 0; 80 private int menuTicks = 0;
81 81
@@ -166,11 +166,19 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann @@ -166,11 +166,19 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann
166 @Override 166 @Override
167 public void onLogin(NetHandler netHandler, Packet1Login loginPacket) 167 public void onLogin(NetHandler netHandler, Packet1Login loginPacket)
168 { 168 {
169 - this.loginRegisterTicks = 2;  
170 this.clearServerPermissions(); 169 this.clearServerPermissions();
  170 + this.scheduleRefresh();
171 } 171 }
172 172
173 /** 173 /**
  174 + * Schedule a permissions refresh
  175 + */
  176 + public void scheduleRefresh()
  177 + {
  178 + this.pendingRefreshTicks = 2;
  179 + }
  180 +
  181 + /**
174 * Clears the current replicated server permissions 182 * Clears the current replicated server permissions
175 */ 183 */
176 protected void clearServerPermissions() 184 protected void clearServerPermissions()
@@ -239,11 +247,11 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann @@ -239,11 +247,11 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann
239 this.minecraft = minecraft; 247 this.minecraft = minecraft;
240 this.lastTickTime = System.currentTimeMillis(); 248 this.lastTickTime = System.currentTimeMillis();
241 249
242 - if (this.loginRegisterTicks > 0) 250 + if (this.pendingRefreshTicks > 0)
243 { 251 {
244 - this.loginRegisterTicks--; 252 + this.pendingRefreshTicks--;
245 253
246 - if (this.loginRegisterTicks == 0 && inGame) 254 + if (this.pendingRefreshTicks == 0 && inGame)
247 { 255 {
248 this.sendPermissionQueries(); 256 this.sendPermissionQueries();
249 return; 257 return;