Files
mcef-legacy/src/main/java/net/montoyo/mcef/example/ExampleMod.java
2025-03-28 11:39:20 -04:00

168 lines
5.3 KiB
Java

package net.montoyo.mcef.example;
import net.minecraftforge.common.MinecraftForge;
import net.montoyo.mcef.utilities.Log;
import org.lwjgl.input.Keyboard;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.montoyo.mcef.api.API;
import net.montoyo.mcef.api.IBrowser;
import net.montoyo.mcef.api.IDisplayHandler;
import net.montoyo.mcef.api.IJSQueryCallback;
import net.montoyo.mcef.api.IJSQueryHandler;
import net.montoyo.mcef.api.MCEFApi;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import net.minecraftforge.fml.relauncher.Side;
/**
* An example mod that shows you how to use MCEF.
* Assuming that it is client-side only and that onInit() is called on initialization.
* This example shows a simple 2D web browser when pressing F6.
*
* @author montoyo
*
*/
public class ExampleMod implements IDisplayHandler, IJSQueryHandler {
public static ExampleMod INSTANCE;
public ScreenCfg hudBrowser = null;
private KeyBinding key = new KeyBinding("Open Browser", Keyboard.KEY_F10, "key.categories.misc");
private Minecraft mc = Minecraft.getMinecraft();
private BrowserScreen backup = null;
private API api;
public API getAPI() {
return api;
}
public void onPreInit() {
//Grab the API and make sure it isn't null.
api = MCEFApi.getAPI();
if(api == null)
return;
api.registerScheme("mod", ModScheme.class, true, false, false, true, true, false, false);
}
public void onInit() {
INSTANCE = this;
//Register key binding and listen to the FML event bus for ticks.
ClientRegistry.registerKeyBinding(key);
MinecraftForge.EVENT_BUS.register(this);
if(api != null) {
//Register this class to handle onAddressChange and onQuery events
api.registerDisplayHandler(this);
api.registerJSQueryHandler(this);
}
}
public void setBackup(BrowserScreen bu) {
backup = bu;
}
public boolean hasBackup() {
return (backup != null);
}
public void showScreen(String url) {
if(mc.currentScreen instanceof BrowserScreen)
((BrowserScreen) mc.currentScreen).loadURL(url);
else if(hasBackup()) {
mc.displayGuiScreen(backup);
backup.loadURL(url);
backup = null;
} else
mc.displayGuiScreen(new BrowserScreen(url));
}
public IBrowser getBrowser() {
if(mc.currentScreen instanceof BrowserScreen)
return ((BrowserScreen) mc.currentScreen).browser;
else if(backup != null)
return backup.browser;
else
return null;
}
@SubscribeEvent
public void onTick(TickEvent ev) {
if(ev.phase == TickEvent.Phase.START && ev.side == Side.CLIENT && ev.type == TickEvent.Type.CLIENT) {
//Check if our key was pressed
if(key.isPressed() && !(mc.currentScreen instanceof BrowserScreen)) {
//Display the web browser UI.
mc.displayGuiScreen(hasBackup() ? backup : new BrowserScreen());
backup = null;
}
}
}
@Override
public void onAddressChange(IBrowser browser, String url) {
//Called by MCEF if a browser's URL changes. Forward this event to the screen.
if(mc.currentScreen instanceof BrowserScreen)
((BrowserScreen) mc.currentScreen).onUrlChanged(browser, url);
else if(hasBackup())
backup.onUrlChanged(browser, url);
}
@Override
public void onTitleChange(IBrowser browser, String title) {
}
@Override
public void onTooltip(IBrowser browser, String text) {
}
@Override
public void onStatusMessage(IBrowser browser, String value) {
}
@Override
public boolean handleQuery(IBrowser b, long queryId, String query, boolean persistent, IJSQueryCallback cb) {
if(b != null && query.equalsIgnoreCase("username")) {
if(b.getURL().startsWith("mod://")) {
//Only allow MCEF URLs to get the player's username to keep his identity secret
mc.addScheduledTask(() -> {
//Add this to a scheduled task because this is NOT called from the main Minecraft thread...
try {
String name = mc.getSession().getUsername();
cb.success(name);
} catch(Throwable t) {
cb.failure(500, "Internal error.");
Log.warning("Could not get username from JavaScript:");
t.printStackTrace();
}
});
} else
cb.failure(403, "Can't access username from external page");
return true;
}
return false;
}
@Override
public void cancelQuery(IBrowser b, long queryId) {
}
@SubscribeEvent
public void onDrawHUD(RenderGameOverlayEvent.Post ev) {
if(hudBrowser != null)
hudBrowser.drawScreen(0, 0, 0.f);
}
}