Commit 3e896077b180d8a19508857140b0b372e154abeb
1 parent
6f0192d2
LiteLoader 1.6.4_02 - experimental - force permissions query packet on world cha…
…nge for BungeeCord multi-server support
Showing
5 changed files
with
109 additions
and
14 deletions
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; | ... | ... |