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 22 /**
23 23 * Reference to the loader instance
24 24 */
25   - private LiteLoader loader;
  25 + private final LiteLoader loader;
26 26  
27 27 /**
28 28 * Reference to the game
29 29 */
30   - private Minecraft minecraft;
  30 + private final Minecraft minecraft;
31 31  
32 32 /**
33 33 * Plugin channel manager
34 34 */
35   - private PluginChannels pluginChannels;
  35 + private final PluginChannels pluginChannels;
36 36  
37 37 /**
38 38 * Reference to the minecraft timer
... ... @@ -47,7 +47,7 @@ public class Events implements IPlayerUsage
47 47 /**
48 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 53 * ScaledResolution used by the pre-chat and post-chat render callbacks
... ... @@ -128,6 +128,12 @@ public class Events implements IPlayerUsage
128 128 * client login events
129 129 */
130 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 139 * Package private ctor
... ... @@ -585,6 +591,21 @@ public class Events implements IPlayerUsage
585 591 tickable.onTick(this.minecraft, partialTicks, inGame, clock);
586 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 29 import net.minecraft.src.Packet1Login;
30 30 import net.minecraft.src.ResourcePack;
31 31 import net.minecraft.src.SimpleReloadableResourceManager;
  32 +import net.minecraft.src.World;
32 33  
33 34 import com.mumfrey.liteloader.*;
34 35 import com.mumfrey.liteloader.crashreport.CallableLiteLoaderBrand;
... ... @@ -639,8 +640,8 @@ public final class LiteLoader
639 640 * @param metaDataKey
640 641 * @param defaultValue
641 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 646 public String getModMetaData(String mod, String metaDataKey, String defaultValue) throws InvalidActivityException, IllegalArgumentException
646 647 {
... ... @@ -846,7 +847,24 @@ public final class LiteLoader
846 847 {
847 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 868 void onRender()
851 869 {
852 870 if (this.paginateControls && this.minecraft.currentScreen != null && this.minecraft.currentScreen.getClass().equals(GuiControls.class))
... ... @@ -863,6 +881,10 @@ public final class LiteLoader
863 881 }
864 882 }
865 883  
  884 + /**
  885 + * @param partialTicks
  886 + * @param inGame
  887 + */
866 888 void onTick(float partialTicks, boolean inGame)
867 889 {
868 890 // Tick the permissions manager
... ... @@ -871,6 +893,11 @@ public final class LiteLoader
871 893 this.checkAndStoreKeyBindings();
872 894 }
873 895  
  896 + /**
  897 + * Register a key for a mod
  898 + *
  899 + * @param binding
  900 + */
874 901 public void registerModKey(KeyBinding binding)
875 902 {
876 903 LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>();
... ...
java/com/mumfrey/liteloader/core/LiteLoaderEnumerator.java
... ... @@ -32,6 +32,7 @@ import java.util.zip.ZipInputStream;
32 32 import net.minecraft.launchwrapper.LaunchClassLoader;
33 33  
34 34 import com.mumfrey.liteloader.LiteMod;
  35 +import com.mumfrey.liteloader.core.exceptions.OutdatedLoaderException;
35 36 import com.mumfrey.liteloader.launch.LiteLoaderTweaker;
36 37  
37 38 /**
... ... @@ -645,6 +646,11 @@ class LiteLoaderEnumerator implements FilenameFilter
645 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 654 catch (Throwable th)
649 655 {
650 656 LiteLoaderEnumerator.logger.log(Level.WARNING, "Enumeration error", th);
... ... @@ -700,8 +706,9 @@ class LiteLoaderEnumerator implements FilenameFilter
700 706 * @param classes
701 707 * @param packagePath
702 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 713 LiteLoaderEnumerator.enumerateDirectory(prefix, superClass, classloader, classes, packagePath, "", 0);
707 714 }
... ... @@ -714,8 +721,9 @@ class LiteLoaderEnumerator implements FilenameFilter
714 721 * @param classes
715 722 * @param packagePath
716 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 728 // Prevent crash due to broken recursion
721 729 if (depth > MAX_DISCOVERY_DEPTH)
... ... @@ -746,8 +754,9 @@ class LiteLoaderEnumerator implements FilenameFilter
746 754 * @param superClass
747 755 * @param classes
748 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 761 if (className.indexOf('$') > -1)
753 762 return;
... ... @@ -763,6 +772,15 @@ class LiteLoaderEnumerator implements FilenameFilter
763 772 }
764 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 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 75 /**
76 76 * Delay counter for when joining a server
77 77 */
78   - private int loginRegisterTicks = 0;
  78 + private int pendingRefreshTicks = 0;
79 79  
80 80 private int menuTicks = 0;
81 81  
... ... @@ -166,11 +166,19 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann
166 166 @Override
167 167 public void onLogin(NetHandler netHandler, Packet1Login loginPacket)
168 168 {
169   - this.loginRegisterTicks = 2;
170 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 182 * Clears the current replicated server permissions
175 183 */
176 184 protected void clearServerPermissions()
... ... @@ -239,11 +247,11 @@ public class PermissionsManagerClient implements PermissionsManager, PluginChann
239 247 this.minecraft = minecraft;
240 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 256 this.sendPermissionQueries();
249 257 return;
... ...