Injecting decorator at the correct initialization state
This commit is contained in:
parent
d950e45e49
commit
4664b2ec75
|
@ -6,13 +6,18 @@ import net.fabricmc.loader.api.FabricLoader;
|
||||||
import io.github.vftdan.xaeromapaddon.worldmap.WaypointRightClickOptionsRegistry;
|
import io.github.vftdan.xaeromapaddon.worldmap.WaypointRightClickOptionsRegistry;
|
||||||
import io.github.vftdan.xaeromapaddon.worldmap.waypointactions.ClipboardCopyWaypointAction;
|
import io.github.vftdan.xaeromapaddon.worldmap.waypointactions.ClipboardCopyWaypointAction;
|
||||||
import io.github.vftdan.xaeromapaddon.worldmap.WaypointReaderDecorator;
|
import io.github.vftdan.xaeromapaddon.worldmap.WaypointReaderDecorator;
|
||||||
import xaero.map.mods.SupportMods;
|
import static io.github.vftdan.xaeromapaddon.VftdansXaerosMapAddon.LOGGER;
|
||||||
|
import xaero.map.WorldMapFabric;
|
||||||
|
import xaero.map.mods.SupportModsFabric;
|
||||||
import xaero.map.mods.SupportXaeroMinimap;
|
import xaero.map.mods.SupportXaeroMinimap;
|
||||||
import xaero.map.mods.gui.WaypointRenderer;
|
import xaero.map.mods.gui.WaypointRenderer;
|
||||||
import xaero.map.mods.gui.WaypointReader;
|
import xaero.map.mods.gui.WaypointReader;
|
||||||
import xaero.map.element.MapElementRenderer;
|
import xaero.map.element.MapElementRenderer;
|
||||||
|
import xaero.map.gui.GuiMap;
|
||||||
|
|
||||||
public class VftdansXaerosMapAddonClient implements ClientModInitializer {
|
public class VftdansXaerosMapAddonClient implements ClientModInitializer {
|
||||||
|
private static boolean decoratorInjected = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitializeClient() {
|
public void onInitializeClient() {
|
||||||
// This entrypoint is suitable for setting up client-specific logic, such as rendering.
|
// This entrypoint is suitable for setting up client-specific logic, such as rendering.
|
||||||
|
@ -20,19 +25,45 @@ public class VftdansXaerosMapAddonClient implements ClientModInitializer {
|
||||||
WaypointRightClickOptionsRegistry registry = WaypointRightClickOptionsRegistry.getInstance();
|
WaypointRightClickOptionsRegistry registry = WaypointRightClickOptionsRegistry.getInstance();
|
||||||
registry.addFactory(new ClipboardCopyWaypointAction());
|
registry.addFactory(new ClipboardCopyWaypointAction());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (FabricLoader.getInstance().isModLoaded("xaeros-world-map")) {
|
public static boolean hasXaeroWorldMap() {
|
||||||
injectWaypointReaderDecorator();
|
return FabricLoader.getInstance().isModLoaded("xaeroworldmap");
|
||||||
} else {
|
}
|
||||||
System.err.println("No xaeros-world-map");
|
|
||||||
|
public static void onGameJoin() {
|
||||||
|
if (!decoratorInjected) {
|
||||||
|
if (hasXaeroWorldMap()) {
|
||||||
|
injectWaypointReaderDecorator();
|
||||||
|
} else {
|
||||||
|
LOGGER.warn("No xaeroworldmap");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void injectWaypointReaderDecorator() {
|
public static boolean tryLoadXaeroWorldMap() {
|
||||||
|
if (WorldMapFabric.INSTANCE == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
((WorldMapFabric) WorldMapFabric.INSTANCE).tryLoadLater();
|
||||||
|
return WorldMapFabric.loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void injectWaypointReaderDecorator() {
|
||||||
|
if (decoratorInjected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGGER.info("Trying to inject decorator");
|
||||||
try {
|
try {
|
||||||
SupportXaeroMinimap supportMinimap = SupportMods.xaeroMinimap;
|
if (!tryLoadXaeroWorldMap()) {
|
||||||
|
LOGGER.warn("Failed to load Xaero WorldMap");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SupportXaeroMinimap supportMinimap = SupportModsFabric.xaeroMinimap;
|
||||||
if (supportMinimap == null) {
|
if (supportMinimap == null) {
|
||||||
System.err.println("No xaeroMinimap mod support");
|
LOGGER.warn("No xaeroMinimap mod support");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,10 +74,13 @@ public class VftdansXaerosMapAddonClient implements ClientModInitializer {
|
||||||
Field waypointReaderField = MapElementRenderer.class.getDeclaredField("reader");
|
Field waypointReaderField = MapElementRenderer.class.getDeclaredField("reader");
|
||||||
waypointReaderField.setAccessible(true);
|
waypointReaderField.setAccessible(true);
|
||||||
waypointReaderField.set(waypointRenderer, new WaypointReaderDecorator((WaypointReader) waypointReaderField.get(waypointRenderer)));
|
waypointReaderField.set(waypointRenderer, new WaypointReaderDecorator((WaypointReader) waypointReaderField.get(waypointRenderer)));
|
||||||
|
|
||||||
|
decoratorInjected = true;
|
||||||
|
LOGGER.info("Successfully injected decorator");
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
LOGGER.error("Field access failure", e);
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
e.printStackTrace();
|
LOGGER.error("Field lookup failure", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package io.github.vftdan.xaeromapaddon.mixin.client;
|
||||||
|
|
||||||
|
import io.github.vftdan.xaeromapaddon.VftdansXaerosMapAddonClient;
|
||||||
|
import net.minecraft.client.network.ClientPlayNetworkHandler;
|
||||||
|
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(ClientPlayNetworkHandler.class)
|
||||||
|
public class ClientPlayNetworkHandlerMixin {
|
||||||
|
@Inject(at = @At("INVOKE"), method = "onGameJoin")
|
||||||
|
private void gameJoinHandler(GameJoinS2CPacket packet, CallbackInfo info) {
|
||||||
|
VftdansXaerosMapAddonClient.onGameJoin();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package io.github.vftdan.xaeromapaddon.worldmap;
|
package io.github.vftdan.xaeromapaddon.worldmap;
|
||||||
|
|
||||||
|
import static io.github.vftdan.xaeromapaddon.VftdansXaerosMapAddon.LOGGER;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import xaero.map.mods.gui.WaypointReader;
|
import xaero.map.mods.gui.WaypointReader;
|
||||||
|
@ -111,6 +112,7 @@ public class WaypointReaderDecorator extends WaypointReader {
|
||||||
ArrayList<RightClickOption> rightClickOptions = wrapped.getRightClickOptions(element, target);
|
ArrayList<RightClickOption> rightClickOptions = wrapped.getRightClickOptions(element, target);
|
||||||
|
|
||||||
for (WaypointRightClickOptionFactory factory: WaypointRightClickOptionsRegistry.getInstance()) {
|
for (WaypointRightClickOptionFactory factory: WaypointRightClickOptionsRegistry.getInstance()) {
|
||||||
|
LOGGER.debug("Trying to inject menu entry: " + factory + " at index " + rightClickOptions.size());
|
||||||
RightClickOption option = factory.create(element, target, rightClickOptions.size());
|
RightClickOption option = factory.create(element, target, rightClickOptions.size());
|
||||||
if (option != null) {
|
if (option != null) {
|
||||||
rightClickOptions.add(option);
|
rightClickOptions.add(option);
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
"package": "io.github.vftdan.xaeromapaddon.mixin.client",
|
"package": "io.github.vftdan.xaeromapaddon.mixin.client",
|
||||||
"compatibilityLevel": "JAVA_21",
|
"compatibilityLevel": "JAVA_21",
|
||||||
"client": [
|
"client": [
|
||||||
"ExampleClientMixin"
|
"ExampleClientMixin",
|
||||||
|
"ClientPlayNetworkHandlerMixin"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|
|
@ -21,4 +21,4 @@ public class VftdansXaerosMapAddon implements ModInitializer {
|
||||||
|
|
||||||
LOGGER.info("Hello Fabric world!");
|
LOGGER.info("Hello Fabric world!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue