LiteModExample.java 6.14 KB
package com.examplemod;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.mumfrey.liteloader.Configurable;
import com.mumfrey.liteloader.PreRenderListener;
import com.mumfrey.liteloader.Tickable;
import com.mumfrey.liteloader.core.LiteLoader;
import com.mumfrey.liteloader.modconfig.ConfigPanel;
import com.mumfrey.liteloader.modconfig.ConfigStrategy;
import com.mumfrey.liteloader.modconfig.ExposableOptions;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.settings.KeyBinding;
import org.lwjgl.input.Keyboard;

import java.io.File;

/**
 * This is a very simple example LiteMod, it draws an analogue clock on the
 * minecraft HUD using a traditional onTick hook supplied by LiteLoader's
 * {@link Tickable} interface.
 *
 * @author Adam Mummery-Smith
 */
@ExposableOptions(strategy = ConfigStrategy.Versioned, filename="examplemod.json")
public class LiteModExample implements Tickable, PreRenderListener, Configurable
{
    /**
     * This is our instance of Clock which we will draw every tick
     */
    private Clock clock = new Clock(10, 10);
    
    /**
     * This is a keybinding that we will register with the game and use to
     * toggle the clock
     * 
     * Notice that we specify the key name as an *unlocalised* string. The
     * localisation is provided from the included resource file.
     */
    private static KeyBinding clockKeyBinding = new KeyBinding("key.clock.toggle", Keyboard.KEY_F12, "key.categories.litemods");
    
    @Expose
    @SerializedName("clock_size")
    private int clockSize = 64;
    
    @Expose
    @SerializedName("clock_visible")
    private boolean clockVisible = true;
    
    /**
     * Default constructor. All LiteMods must have a default constructor. In
     * general you should do very little in the mod constructor EXCEPT for
     * initialising any non-game-interfacing components or performing sanity
     * checking prior to initialisation
     */
    public LiteModExample()
    {
    }
    
    /**
     * getName() should be used to return the display name of your mod and MUST
     * NOT return null
     * 
     * @see com.mumfrey.liteloader.LiteMod#getName()
     */
    @Override
    public String getName()
    {
        return "Example Mod";
    }
    
    /**
     * getVersion() should return the same version string present in the mod
     * metadata, although this is not a strict requirement.
     * 
     * @see com.mumfrey.liteloader.LiteMod#getVersion()
     */
    @Override
    public String getVersion()
    {
        return "0.0.0";
    }
    
    @Override
    public Class<? extends ConfigPanel> getConfigPanelClass()
    {
        return ExampleModConfigPanel.class;
    }
    
    /**
     * init() is called very early in the initialisation cycle, before the game
     * is fully initialised, this means that it is important that your mod does
     * not interact with the game in any way at this point.
     * 
     * @see com.mumfrey.liteloader.LiteMod#init(java.io.File)
     */
    @Override
    public void init(File configPath)
    {
        // The key binding declared above won't do anything unless we register
        // it, LiteLoader's Input manager provides a convenience method for this
        LiteLoader.getInput().registerKeyBinding(LiteModExample.clockKeyBinding);
        
        this.clock.setSize(this.clockSize);
        this.clock.setVisible(this.clockVisible);
    }
    
    /**
     * upgradeSettings is used to notify a mod that its version-specific
     * settings are being migrated
     * 
     * @see com.mumfrey.liteloader.LiteMod#upgradeSettings(java.lang.String,
     *         java.io.File, java.io.File)
     */
    @Override
    public void upgradeSettings(String version, File configPath, File oldConfigPath)
    {
    }
    
    @Override
    public void onTick(Minecraft minecraft, float partialTicks, boolean inGame, boolean clock)
    {
        // The three checks here are critical to ensure that we only draw the
        // clock as part of the "HUD" and don't draw it over active GUI's or
        // other elements
        if (inGame && minecraft.currentScreen == null && Minecraft.isGuiEnabled())
        {
            if (LiteModExample.clockKeyBinding.isPressed())
            {
                if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT))
                {
                    this.clockSize = (this.clockSize << 1) & 0x1FF;
                    this.clock.setSize(this.clockSize);
                    this.clockSize = this.clock.getSize();
                }
                else
                {
                    this.clock.setVisible(!this.clock.isVisible());
                    this.clockVisible = this.clock.isVisible();
                }
                
                // Our @Expose annotations control what properties get saved,
                // this tells liteloader to actually write properties to disk
                LiteLoader.getInstance().writeConfig(this);
            }
            
            // Render the clock
            this.clock.render(minecraft);
        }
    }
    
    boolean getClockVisibility()
    {
        return this.clock.isVisible();
    }
    
    void setClockVisibility(boolean visible)
    {
        this.clock.setVisible(this.clockVisible = visible);
    }
    
    @Override
    public void onRenderWorld(float partialTicks)
    {
//		System.err.printf(">> onRenderWorld!\n");
    }
    
    @Override
    public void onSetupCameraTransform(float partialTicks, int pass, long timeSlice)
    {
//		System.err.printf(">> onSetupCameraTransform %s, %d, %d!\n", partialTicks, pass, timeSlice);
    }
    
    @Override
    public void onRenderSky(float partialTicks, int pass)
    {
//		System.err.printf(">> onRenderSky %s, %d!\n", partialTicks, pass);
    }
    
    @Override
    public void onRenderClouds(float partialTicks, int pass, RenderGlobal renderGlobal)
    {
//		System.err.printf(">> onRenderClouds %s, %d!\n", partialTicks, pass);
    }
    
    @Override
    public void onRenderTerrain(float partialTicks, int pass)
    {
//		System.err.printf(">> onRenderTerrain %s, %d!\n", partialTicks, pass);
    }
}