    001    /*
    002     * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw
    003     *
    004     * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
    005     * Software Foundation; either version 2.1 of the License, or any later version.
    006     *
    007     * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
    008     * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    009     *
    010     * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
    011     * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    012     */
    013    package net.minecraft.src;
    014
    015    import static cpw.mods.fml.relauncher.Side.CLIENT;
    016
    017    import java.util.Map;
    018    import java.util.Random;
    019
    020    import net.minecraft.block.Block;
    021    import net.minecraft.client.*;
    022    import net.minecraft.client.entity.EntityClientPlayerMP;
    023    import net.minecraft.client.gui.GuiScreen;
    024    import net.minecraft.client.gui.inventory.GuiContainer;
    025    import net.minecraft.client.multiplayer.NetClientHandler;
    026    import net.minecraft.client.renderer.RenderBlocks;
    027    import net.minecraft.client.renderer.entity.Render;
    028    import net.minecraft.client.settings.KeyBinding;
    029    import net.minecraft.entity.Entity;
    030    import net.minecraft.entity.player.EntityPlayer;
    031    import net.minecraft.inventory.IInventory;
    032    import net.minecraft.item.ItemStack;
    033    import net.minecraft.network.INetworkManager;
    034    import net.minecraft.network.NetServerHandler;
    035    import net.minecraft.network.packet.NetHandler;
    036    import net.minecraft.network.packet.Packet250CustomPayload;
    037    import net.minecraft.server.MinecraftServer;
    038    import net.minecraft.world.IBlockAccess;
    039    import net.minecraft.world.World;
    040    import cpw.mods.fml.client.FMLClientHandler;
    041    import cpw.mods.fml.common.FMLLog;
    042    import cpw.mods.fml.common.TickType;
    043    import cpw.mods.fml.relauncher.SideOnly;
    044
    045    public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModProxy
    046    {
    047        // CALLBACK MECHANISMS
    048
    049        public final boolean doTickInGame(TickType tick, boolean tickEnd, Object... data)
    050        {
    051            Minecraft mc = FMLClientHandler.instance().getClient();
    052            boolean hasWorld = mc.theWorld != null;
    053            // World and render ticks
    054            if (tickEnd && ( tick==TickType.RENDER || tick==TickType.CLIENT ) && hasWorld) {
    055                return onTickInGame((Float) data[0], mc);
    056            }
    057            return true;
    058        }
    059
    060        public final boolean doTickInGUI(TickType tick, boolean tickEnd, Object... data)
    061        {
    062            Minecraft mc = FMLClientHandler.instance().getClient();
    063
    064            boolean hasWorld = mc.theWorld != null;
    065
    066            if (tickEnd && ( tick==TickType.RENDER || ( tick==TickType.CLIENT && hasWorld))) {
    067                return onTickInGUI((Float) data[0], mc, mc.currentScreen);
    068            }
    069            return true;
    070        }
    071
    072       /*
    073        public final void onRenderHarvest(Map renderers)
    074        {
    075            addRenderer((Map<Class<? extends Entity>,Render>)renderers);
    076        }
    077
    078        public final void onRegisterAnimations()
    079        {
    080            registerAnimation(FMLClientHandler.instance().getClient());
    081        }
    082
    083        @Override
    084        public final void onCrafting(Object... craftingParameters)
    085        {
    086            takenFromCrafting((EntityPlayer)craftingParameters[0], (ItemStack)craftingParameters[1], (IInventory)craftingParameters[2]);
    087        }
    088
    089        @Override
    090        public final void onSmelting(Object... smeltingParameters)
    091        {
    092            takenFromFurnace((EntityPlayer)smeltingParameters[0], (ItemStack)smeltingParameters[1]);
    093        }
    094
    095        @Override
    096        public final boolean dispense(double x, double y, double z, int xVelocity, int zVelocity, Object... data)
    097        {
    098            return dispenseEntity((World)data[0], x, y, z, xVelocity, zVelocity, (ItemStack)data[1]);
    099        }
    100
    101        @Override
    102        public final boolean onChat(Object... data)
    103        {
    104            receiveChatPacket(((Packet3Chat)data[0]).message);
    105            return true;
    106        }
    107
    108
    109        @Override
    110        public final void onServerLogin(Object handler) {
    111            serverConnect((NetClientHandler) handler);
    112        }
    113
    114        public final void onServerLogout() {
    115            serverDisconnect();
    116        }
    117
    118        @Override
    119        public final void onPlayerLogin(Object player)
    120        {
    121            onClientLogin((EntityPlayer) player);
    122        }
    123
    124        @Override
    125        public final void onPlayerLogout(Object player)
    126        {
    127            onClientLogout((EntityPlayer)player);
    128        }
    129
    130        @Override
    131        public final void onPlayerChangedDimension(Object player)
    132        {
    133            onClientDimensionChanged((EntityPlayer)player);
    134        }
    135
    136        @Override
    137        public final void onPacket250Packet(Object... data)
    138        {
    139            receiveCustomPacket((Packet250CustomPayload)data[0]);
    140        }
    141
    142        @Override
    143        public final void notifyPickup(Object... pickupData)
    144        {
    145            EntityItem item = (EntityItem) pickupData[0];
    146            EntityPlayer player = (EntityPlayer) pickupData[1];
    147            onItemPickup(player, item.item);
    148        }
    149
    150        @Override
    151        public final void generate(Random random, int chunkX, int chunkZ, Object... additionalData)
    152        {
    153            World w = (World) additionalData[0];
    154            IChunkProvider cp = (IChunkProvider) additionalData[1];
    155
    156            if (cp instanceof ChunkProviderGenerate)
    157            {
    158                generateSurface(w, random, chunkX << 4, chunkZ << 4);
    159            }
    160            else if (cp instanceof ChunkProviderHell)
    161            {
    162                generateNether(w, random, chunkX << 4, chunkZ << 4);
    163            }
    164        }
    165
    166        @Override
    167        public final boolean handleCommand(String command, Object... data)
    168        {
    169            return false;
    170        }
    171
    172        */
    173        // BASEMOD API
    174        /**
    175         * Override if you wish to provide a fuel item for the furnace and return the fuel value of the item
    176         *
    177         * @param id
    178         * @param metadata
    179         */
    180        public int addFuel(int id, int metadata)
    181        {
    182            return 0;
    183        }
    184
    185        @SideOnly(CLIENT)
    186        public void addRenderer(Map<Class<? extends Entity>, Render> renderers)
    187        {
    188        }
    189
    190        /**
    191         * Override if you wish to generate Nether (Hell biome) blocks
    192         *
    193         * @param world
    194         * @param random
    195         * @param chunkX
    196         * @param chunkZ
    197         */
    198        public void generateNether(World world, Random random, int chunkX, int chunkZ)
    199        {
    200        }
    201
    202        /**
    203         * Override if you wish to generate Overworld (not hell or the end) blocks
    204         *
    205         * @param world
    206         * @param random
    207         * @param chunkX
    208         * @param chunkZ
    209         */
    210        public void generateSurface(World world, Random random, int chunkX, int chunkZ)
    211        {
    212        }
    213
    214        /**
    215         * Callback to return a gui screen to display
    216         * @param player
    217         * @param containerID
    218         * @param x
    219         * @param y
    220         * @param z
    221         */
    222        @SideOnly(CLIENT)
    223        public GuiContainer getContainerGUI(EntityClientPlayerMP player, int containerID, int x, int y, int z)
    224        {
    225            return null;
    226        }
    227
    228        /**
    229         * Return the name of your mod. Defaults to the class name
    230         */
    231        public String getName()
    232        {
    233            return getClass().getSimpleName();
    234        }
    235
    236        /**
    237         * Get your mod priorities
    238         */
    239        public String getPriorities()
    240        {
    241            return "";
    242        }
    243
    244        /**
    245         * Return the version of your mod
    246         */
    247        public abstract String getVersion();
    248
    249        @SideOnly(CLIENT)
    250        public void keyboardEvent(KeyBinding event)
    251        {
    252
    253        }
    254
    255        /**
    256         * Load your mod
    257         */
    258        public abstract void load();
    259
    260        /**
    261         * Finish loading your mod
    262         */
    263        public void modsLoaded()
    264        {
    265        }
    266
    267        /**
    268         * Handle item pickup
    269         *
    270         * @param player
    271         * @param item
    272         */
    273        public void onItemPickup(EntityPlayer player, ItemStack item)
    274        {
    275        }
    276
    277        /**
    278         * Ticked every game tick if you have subscribed to tick events through {@link ModLoader#setInGameHook(BaseMod, boolean, boolean)}
    279         *
    280         * @param time the rendering subtick time (0.0-1.0)
    281         * @param minecraftInstance the client
    282         * @return true to continue receiving ticks
    283         */
    284        @SideOnly(CLIENT)
    285        public boolean onTickInGame(float time, Minecraft minecraftInstance)
    286        {
    287            return false;
    288        }
    289
    290        public boolean onTickInGame(MinecraftServer minecraftServer)
    291        {
    292            return false;
    293        }
    294
    295        @SideOnly(CLIENT)
    296        public boolean onTickInGUI(float tick, Minecraft game, GuiScreen gui)
    297        {
    298            return false;
    299        }
    300
    301        /**
    302         * Only implemented on the client side
    303         * {@link #serverChat(NetServerHandler, String)}
    304         *
    305         * @param text
    306         */
    307        @Override
    308        public void clientChat(String text)
    309        {
    310        }
    311
    312        /**
    313         * Called when a client connects
    314         * @param handler
    315         */
    316        @SideOnly(CLIENT)
    317        public void clientConnect(NetClientHandler handler)
    318        {
    319
    320        }
    321
    322        /**
    323         * Called when the client disconnects
    324         * @param handler
    325         */
    326        @SideOnly(CLIENT)
    327        public void clientDisconnect(NetClientHandler handler)
    328        {
    329
    330        }
    331        /**
    332         * Called client side to receive a custom payload for this mod
    333         *
    334         * @param packet
    335         */
    336        @Override
    337        public void receiveCustomPacket(Packet250CustomPayload packet)
    338        {
    339        }
    340
    341        @SideOnly(CLIENT)
    342        public void registerAnimation(Minecraft game)
    343        {
    344
    345        }
    346
    347        @SideOnly(CLIENT)
    348        public void renderInvBlock(RenderBlocks renderer, Block block, int metadata, int modelID)
    349        {
    350
    351        }
    352
    353        @SideOnly(CLIENT)
    354        public boolean renderWorldBlock(RenderBlocks renderer, IBlockAccess world, int x, int y, int z, Block block, int modelID)
    355        {
    356            return false;
    357
    358        }
    359
    360        @Override
    361        public void serverConnect(NetHandler handler) {
    362
    363        }
    364
    365        @Override
    366        public void serverCustomPayload(NetServerHandler handler, Packet250CustomPayload packet)
    367        {
    368
    369        }
    370
    371        @Override
    372        public void serverDisconnect() {
    373
    374        }
    375        /**
    376         * Called when someone crafts an item from a crafting table
    377         *
    378         * @param player
    379         * @param item
    380         * @param matrix
    381         */
    382        public void takenFromCrafting(EntityPlayer player, ItemStack item, IInventory matrix)
    383        {
    384        }
    385
    386        /**
    387         * Called when someone takes a smelted item from a furnace
    388         *
    389         * @param player
    390         * @param item
    391         */
    392        public void takenFromFurnace(EntityPlayer player, ItemStack item)
    393        {
    394        }
    395
    396        /**
    397         * The identifier string for the mod- used in client<->server negotiation
    398         */
    399        @Override
    400        public String toString()
    401        {
    402            return getName() + " " + getVersion();
    403        }
    404
    405        /**
    406         * Called when a chat message is received. Return true to stop further processing
    407         */
    408        @Override
    409        public void serverChat(NetServerHandler source, String message)
    410        {
    411        }
    412        /**
    413         * Called when a new client logs in.
    414         *
    415         * @param player
    416         */
    417        @Override
    418        public void onClientLogin(EntityPlayer player)
    419        {
    420        }
    421
    422        /**
    423         * Called when a client logs out of the server.
    424         */
    425        @Override
    426        public void onClientLogout(INetworkManager mgr)
    427        {
    428
    429        }
    430
    431        /**
    432         * Spawn the entity of the supplied type, if it is your mod's
    433         */
    434        @SideOnly(CLIENT)
    435        public Entity spawnEntity(int entityId, World world, double scaledX, double scaledY, double scaledZ)
    436        {
    437            return null;
    438        }
    439
    440        public void clientCustomPayload(NetClientHandler handler, Packet250CustomPayload packet)
    441        {
    442
    443        }
    444
    445    }