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.field_70294_a);
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    }