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 }