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.awt.image.BufferedImage; 018 import java.util.Collections; 019 import java.util.List; 020 import java.util.Map; 021 import java.util.logging.Logger; 022 023 import net.minecraft.block.Block; 024 import net.minecraft.block.BlockDispenser; 025 import net.minecraft.client.*; 026 import net.minecraft.client.gui.GuiScreen; 027 import net.minecraft.client.multiplayer.NetClientHandler; 028 import net.minecraft.client.renderer.RenderBlocks; 029 import net.minecraft.client.renderer.RenderEngine; 030 import net.minecraft.client.renderer.entity.Render; 031 import net.minecraft.client.renderer.texturefx.TextureFX; 032 import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; 033 import net.minecraft.client.settings.KeyBinding; 034 import net.minecraft.command.ICommand; 035 import net.minecraft.dispenser.IBehaviorDispenseItem; 036 import net.minecraft.entity.Entity; 037 import net.minecraft.entity.EntityLiving; 038 import net.minecraft.entity.EnumCreatureType; 039 import net.minecraft.entity.player.EntityPlayer; 040 import net.minecraft.entity.player.EntityPlayerMP; 041 import net.minecraft.inventory.Container; 042 import net.minecraft.inventory.IInventory; 043 import net.minecraft.item.Item; 044 import net.minecraft.item.ItemBlock; 045 import net.minecraft.item.ItemStack; 046 import net.minecraft.network.NetServerHandler; 047 import net.minecraft.network.packet.Packet; 048 import net.minecraft.network.packet.Packet1Login; 049 import net.minecraft.network.packet.Packet250CustomPayload; 050 import net.minecraft.server.*; 051 import net.minecraft.stats.Achievement; 052 import net.minecraft.tileentity.TileEntity; 053 import net.minecraft.world.IBlockAccess; 054 import net.minecraft.world.World; 055 import net.minecraft.world.WorldType; 056 import net.minecraft.world.biome.BiomeGenBase; 057 import net.minecraft.world.chunk.IChunkProvider; 058 import cpw.mods.fml.client.FMLClientHandler; 059 import cpw.mods.fml.client.SpriteHelper; 060 import cpw.mods.fml.client.TextureFXManager; 061 import cpw.mods.fml.client.modloader.ModLoaderClientHelper; 062 import cpw.mods.fml.client.modloader.ModLoaderKeyBindingHandler; 063 import cpw.mods.fml.client.registry.ClientRegistry; 064 import cpw.mods.fml.client.registry.KeyBindingRegistry; 065 import cpw.mods.fml.client.registry.RenderingRegistry; 066 import cpw.mods.fml.common.FMLCommonHandler; 067 import cpw.mods.fml.common.FMLLog; 068 import cpw.mods.fml.common.Loader; 069 import cpw.mods.fml.common.ObfuscationReflectionHelper; 070 import cpw.mods.fml.common.modloader.ModLoaderHelper; 071 import cpw.mods.fml.common.modloader.ModLoaderModContainer; 072 import cpw.mods.fml.common.network.NetworkRegistry; 073 import cpw.mods.fml.common.network.PacketDispatcher; 074 import cpw.mods.fml.common.network.Player; 075 import cpw.mods.fml.common.registry.EntityRegistry; 076 import cpw.mods.fml.common.registry.GameRegistry; 077 import cpw.mods.fml.common.registry.LanguageRegistry; 078 import cpw.mods.fml.relauncher.SideOnly; 079 import cpw.mods.fml.server.FMLServerHandler; 080 081 public class ModLoader 082 { 083 public static final String fmlMarker = "This is an FML marker"; 084 // TODO dirty workaround for millinaire 085 @Deprecated 086 public static final Map<String,Map<String,String>> localizedStrings=Collections.emptyMap(); 087 088 /** 089 * Adds localization info for an achievement, Not used on the server. 090 * 091 * @param achievement The achievement to name 092 * @param name The name 093 * @param description The description 094 */ 095 public static void addAchievementDesc(Achievement achievement, String name, String description) 096 { 097 String achName=achievement.getName(); 098 addLocalization(achName, name); 099 addLocalization(achName+".desc", description); 100 } 101 102 /** 103 * This method is a call in hook from modified external code. Implemented elsewhere. 104 * 105 * {@link GameRegistry#getFuelValue(ItemStack)} 106 * 107 * @param id The Item ID 108 * @param metadata The Item Metadata 109 * @return The fuel strength, in ticks, 0 if unhandled 110 */ 111 @Deprecated 112 public static int addAllFuel(int id, int metadata) 113 { 114 return 0; 115 } 116 117 @Deprecated 118 @SideOnly(CLIENT) 119 public static void addAllRenderers(Map<Class<? extends Entity>, Render> renderers) 120 { 121 } 122 123 @SideOnly(CLIENT) 124 public static void addAnimation(TextureFX anim) 125 { 126 TextureFXManager.instance().addAnimation(anim); 127 } 128 129 /** 130 * Adds a new prefix to the armor texture list 131 * 132 * {@link RenderingRegistry#addNewArmourRendererPrefix(String)} 133 * 134 * @param armor The new armor prefix 135 * @return The new armor index 136 */ 137 @SideOnly(CLIENT) 138 public static int addArmor(String armor) 139 { 140 return RenderingRegistry.addNewArmourRendererPrefix(armor); 141 } 142 143 /** 144 * This method adds the supplied biome to the set of candidate biomes for the default world generator type. 145 * 146 * @param biome The biome to add 147 */ 148 public static void addBiome(BiomeGenBase biome) 149 { 150 GameRegistry.addBiome(biome); 151 } 152 153 public static void addEntityTracker(BaseMod mod, Class<? extends Entity> entityClass, int entityTypeId, int updateRange, int updateInterval, boolean sendVelocityInfo) 154 { 155 ModLoaderHelper.buildEntityTracker(mod, entityClass, entityTypeId, updateRange, updateInterval, sendVelocityInfo); 156 } 157 158 public static void addCommand(ICommand command) 159 { 160 ModLoaderHelper.addCommand(command); 161 } 162 163 /** 164 * Add a behaviour to the dispenser 165 * 166 * @param item 167 * @param behavior 168 */ 169 public static void addDispenserBehavior(Item item, IBehaviorDispenseItem behavior) 170 { 171 BlockDispenser.dispenseBehaviorRegistry.putObject(item, behavior); 172 } 173 /** 174 * Add localization for the specified string 175 * 176 * @param key Key 177 * @param value Value 178 */ 179 public static void addLocalization(String key, String value) 180 { 181 addLocalization(key, "en_US", value); 182 } 183 184 /** 185 * Add localization for the specified string 186 * 187 * @param key Key 188 * @param lang Language identifier 189 * @param value Value 190 */ 191 public static void addLocalization(String key, String lang, String value) 192 { 193 LanguageRegistry.instance().addStringLocalization(key, lang, value); 194 } 195 196 /** 197 * Name the specified minecraft object with the supplied name 198 * 199 * @param instance Item to name 200 * @param name The name to give it 201 */ 202 public static void addName(Object instance, String name) 203 { 204 addName(instance,"en_US",name); 205 } 206 207 /** 208 * Unimplemented on the server as it does not generate names 209 * 210 * @param instance Item to name 211 * @param lang Languge identifier 212 * @param name Name to give it 213 */ 214 public static void addName(Object instance, String lang, String name) 215 { 216 LanguageRegistry.instance().addNameForObject(instance, lang, name); 217 } 218 219 /** 220 * Attempts to register a small image to be applied to a larger texture image, 221 * typically how old ModLoader mods add custom Item/Block textures. 222 * 223 * Forge mods should use setTextureFile in Item/Block 224 * 225 * Will return the icon index it was applied to. 226 * 227 * Unimplemented on the server as it does not render textures 228 * 229 * @param fileToOverride The texture to apply the new image to 230 * @param fileToAdd The new image 231 * @return The 'icon index' in the main image that the new image will be applied to 232 */ 233 @SideOnly(CLIENT) 234 public static int addOverride(String fileToOverride, String fileToAdd) 235 { 236 return RenderingRegistry.addTextureOverride(fileToOverride, fileToAdd); 237 } 238 239 /** 240 * Attempts to register a small image to be applied to a larger texture image, 241 * typically how old ModLoader mods add custom Item/Block textures. 242 * 243 * Forge mods should use setTextureFile in Item/Block 244 * 245 * Unimplemented on the server as it does not render textures 246 * 247 * @param path The texture to apply the new image to 248 * @param overlayPath The new image 249 * @param index Where on the texture to apply it 250 */ 251 @SideOnly(CLIENT) 252 public static void addOverride(String path, String overlayPath, int index) 253 { 254 RenderingRegistry.addTextureOverride(path, overlayPath, index); 255 } 256 257 /** 258 * Add a Shaped Recipe 259 * 260 * @param output The result 261 * @param params The input 262 */ 263 public static void addRecipe(ItemStack output, Object... params) 264 { 265 GameRegistry.addRecipe(output, params); 266 } 267 268 /** 269 * Add a shapeless recipe 270 * 271 * @param output The result 272 * @param params The input 273 */ 274 public static void addShapelessRecipe(ItemStack output, Object... params) 275 { 276 GameRegistry.addShapelessRecipe(output, params); 277 } 278 279 /** 280 * Add a new product to be smelted 281 * 282 * @param input 283 * @param output 284 */ 285 public static void addSmelting(int input, ItemStack output) 286 { 287 GameRegistry.addSmelting(input, output, 1.0f); 288 } 289 290 /** 291 * Add a new product to be smelted 292 * 293 * @param input 294 * @param output 295 */ 296 public static void addSmelting(int input, ItemStack output, float experience) 297 { 298 GameRegistry.addSmelting(input, output, experience); 299 } 300 /** 301 * Add a mob to the spawn list 302 * 303 * @param entityClass 304 * @param weightedProb 305 * @param min 306 * @param max 307 * @param spawnList 308 */ 309 public static void addSpawn(Class<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList) 310 { 311 EntityRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, WorldType.base12Biomes); 312 } 313 314 /** 315 * Add a mob to the spawn list 316 * 317 * @param entityClass 318 * @param weightedProb 319 * @param min 320 * @param max 321 * @param spawnList 322 * @param biomes 323 */ 324 public static void addSpawn(Class<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) 325 { 326 EntityRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, biomes); 327 } 328 329 /** 330 * Add a mob to the spawn list 331 * 332 * @param entityName 333 * @param weightedProb 334 * @param min 335 * @param max 336 * @param spawnList 337 */ 338 public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList) 339 { 340 EntityRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, WorldType.base12Biomes); 341 } 342 343 /** 344 * Add a mob to the spawn list 345 * 346 * @param entityName 347 * @param weightedProb 348 * @param min 349 * @param max 350 * @param spawnList 351 * @param biomes 352 */ 353 public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes) 354 { 355 EntityRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, biomes); 356 } 357 358 public static void addTrade(int profession, TradeEntry entry) 359 { 360 ModLoaderHelper.registerTrade(profession, entry); 361 } 362 /** 363 * Send a packet from the client 364 * @param packet 365 */ 366 public static void clientSendPacket(Packet packet) 367 { 368 PacketDispatcher.sendPacketToServer(packet); 369 } 370 371 /** 372 * This method is a call in hook from modified external code. Implemented elsewhere. 373 * 374 * @param world 375 * @param x 376 * @param y 377 * @param z 378 * @param xVel 379 * @param zVel 380 * @param item 381 * @return Always false, not implemented here 382 */ 383 @Deprecated 384 public static boolean dispenseEntity(World world, double x, double y, double z, int xVel, int zVel, ItemStack item) 385 { 386 return false; 387 } 388 389 /** 390 * Remove a container and drop all the items in it on the ground around 391 * 392 * @param world 393 * @param x 394 * @param y 395 * @param z 396 */ 397 public static void genericContainerRemoval(World world, int x, int y, int z) 398 { 399 /* TileEntity te = world.func_603_b(x, y, z); 400 401 if (!(te instanceof IInventory)) 402 { 403 return; 404 } 405 406 IInventory inv = (IInventory)te; 407 408 for (int l = 0; l < inv.func_469_c(); l++) 409 { 410 ItemStack itemstack = inv.func_468_c(l); 411 412 if (itemstack == null) 413 { 414 continue; 415 } 416 417 float f = world.field_1037_n.nextFloat() * 0.8F + 0.1F; 418 float f1 = world.field_1037_n.nextFloat() * 0.8F + 0.1F; 419 float f2 = world.field_1037_n.nextFloat() * 0.8F + 0.1F; 420 421 while (itemstack.field_1615_a > 0) 422 { 423 int i1 = world.field_1037_n.nextInt(21) + 10; 424 425 if (i1 > itemstack.field_1615_a) 426 { 427 i1 = itemstack.field_1615_a; 428 } 429 430 itemstack.field_1615_a -= i1; 431 EntityItem entityitem = new EntityItem(world, (float)te.field_823_f + f, (float)te.field_822_g + f1, (float)te.field_821_h + f2, new ItemStack(itemstack.field_1617_c, i1, itemstack.func_21181_i())); 432 float f3 = 0.05F; 433 entityitem.field_608_an = (float) world.field_1037_n.nextGaussian() * f3; 434 entityitem.field_607_ao = (float) world.field_1037_n.nextGaussian() * f3 + 0.2F; 435 entityitem.field_606_ap = (float) world.field_1037_n.nextGaussian() * f3; 436 437 if (itemstack.func_40710_n()) 438 { 439 entityitem.field_801_a.func_40706_d((NBTTagCompound) itemstack.func_40709_o().func_40195_b()); 440 } 441 442 world.func_674_a(entityitem); 443 } 444 } 445 */ } 446 447 /** 448 * Get a list of all BaseMod loaded into the system 449 * {@link ModLoaderModContainer#findAll} 450 * 451 * @return A list containing all loaded ModLoader mods 452 */ 453 public static List<BaseMod> getLoadedMods() 454 { 455 return ModLoaderModContainer.findAll(BaseMod.class); 456 } 457 458 /** 459 * Get a logger instance {@link FMLCommonHandler#getFMLLogger()} 460 * 461 * @return The current logger 462 */ 463 public static Logger getLogger() 464 { 465 return FMLLog.getLogger(); 466 } 467 468 @SideOnly(CLIENT) 469 public static Minecraft getMinecraftInstance() 470 { 471 return FMLClientHandler.instance().getClient(); 472 } 473 474 public static MinecraftServer getMinecraftServerInstance() 475 { 476 return FMLCommonHandler.instance().getMinecraftServerInstance(); 477 } 478 479 /** 480 * Get a value from a field using reflection 481 * {@link ObfuscationReflectionHelper#getPrivateValue(Class, Object, int)} 482 * 483 * @param instanceclass 484 * @param instance 485 * @param fieldindex 486 * @return The value in the specified field. 487 */ 488 public static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, int fieldindex) 489 { 490 return ObfuscationReflectionHelper.getPrivateValue(instanceclass, instance, fieldindex); 491 } 492 493 /** 494 * Get a value from a field using reflection 495 * {@link ObfuscationReflectionHelper#getPrivateValue(Class, Object, String[])} 496 * 497 * @param instanceclass 498 * @param instance 499 * @param field 500 * @return The value in the specified field. 501 */ 502 public static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, String field) 503 { 504 return ObfuscationReflectionHelper.getPrivateValue(instanceclass, instance, field); 505 } 506 507 /** 508 * Stubbed method on the server to return a unique model id 509 * 510 */ 511 @SideOnly(CLIENT) 512 public static int getUniqueBlockModelID(BaseMod mod, boolean inventoryRenderer) 513 { 514 return ModLoaderClientHelper.obtainBlockModelIdFor(mod, inventoryRenderer); 515 } 516 517 /** 518 * Get a new unique entity id 519 * {@link EntityRegistry#findGlobalUniqueEntityId()} 520 * 521 * @return A unique entity ID 522 */ 523 public static int getUniqueEntityId() 524 { 525 return EntityRegistry.findGlobalUniqueEntityId(); 526 } 527 528 @SideOnly(CLIENT) 529 public static int getUniqueSpriteIndex(String path) 530 { 531 return SpriteHelper.getUniqueSpriteIndex(path); 532 } 533 534 /** 535 * To properly implement packet 250 protocol you should always check your 536 * channel is active prior to sending the packet 537 * 538 * @param player 539 * @param channel 540 * @return If the channel is registered to the current connection. 541 */ 542 public static boolean isChannelActive(EntityPlayer player, String channel) 543 { 544 return NetworkRegistry.instance().isChannelActive(channel, (Player)player); 545 } 546 547 @SideOnly(CLIENT) 548 public static boolean isGUIOpen(Class<? extends GuiScreen> gui) 549 { 550 return FMLClientHandler.instance().getClient().currentScreen != null && FMLClientHandler.instance().getClient().currentScreen.equals(gui); 551 } 552 553 /** 554 * Is the named mod loaded? 555 * {@link Loader#isModLoaded(String)} 556 * 557 * @param modname 558 * @return If the specified mod is loaded 559 */ 560 public static boolean isModLoaded(String modname) 561 { 562 return Loader.isModLoaded(modname); 563 } 564 565 /** 566 * Implemented elsewhere 567 */ 568 @Deprecated 569 public static void loadConfig() 570 { 571 } 572 573 @SideOnly(CLIENT) 574 public static BufferedImage loadImage(RenderEngine renderEngine, String path) throws Exception 575 { 576 return TextureFXManager.instance().loadImageFromTexturePack(renderEngine, path); 577 } 578 579 /** 580 * Call in from elsewhere. Unimplemented here. 581 * @param player 582 * @param item 583 */ 584 @Deprecated 585 public static void onItemPickup(EntityPlayer player, ItemStack item) 586 { 587 } 588 /** 589 * Call in from elsewhere. Unimplemented here. 590 */ 591 @Deprecated 592 @SideOnly(CLIENT) 593 public static void onTick(float tick, Minecraft game) 594 { 595 } 596 597 @SideOnly(CLIENT) 598 public static void openGUI(EntityPlayer player, GuiScreen gui) 599 { 600 FMLClientHandler.instance().displayGuiScreen(player, gui); 601 } 602 603 @Deprecated 604 public static void populateChunk(IChunkProvider generator, int chunkX, int chunkZ, World world) 605 { 606 } 607 608 /** 609 * This method is a call in hook from modified external code. Implemented elsewhere. 610 * 611 * @param packet 612 */ 613 @Deprecated 614 public static void receivePacket(Packet250CustomPayload packet) 615 { 616 } 617 618 @Deprecated 619 @SideOnly(CLIENT) 620 public static KeyBinding[] registerAllKeys(KeyBinding[] keys) 621 { 622 return keys; 623 } 624 625 @Deprecated 626 @SideOnly(CLIENT) 627 public static void registerAllTextureOverrides(RenderEngine cache) 628 { 629 } 630 631 /** 632 * Register a new block 633 * 634 * @param block 635 */ 636 public static void registerBlock(Block block) 637 { 638 GameRegistry.registerBlock(block); 639 } 640 641 /** 642 * Register a new block 643 * 644 * @param block 645 * @param itemclass 646 */ 647 public static void registerBlock(Block block, Class<? extends ItemBlock> itemclass) 648 { 649 GameRegistry.registerBlock(block, itemclass); 650 } 651 652 public static void registerContainerID(BaseMod mod, int id) 653 { 654 ModLoaderHelper.buildGuiHelper(mod, id); 655 } 656 /** 657 * Register a new entity ID 658 * 659 * @param entityClass 660 * @param entityName 661 * @param id 662 */ 663 public static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id) 664 { 665 EntityRegistry.registerGlobalEntityID(entityClass, entityName, id); 666 } 667 668 /** 669 * Register a new entity ID 670 * 671 * @param entityClass 672 * @param entityName 673 * @param id 674 * @param background 675 * @param foreground 676 */ 677 public static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id, int background, int foreground) 678 { 679 EntityRegistry.registerGlobalEntityID(entityClass, entityName, id, background, foreground); 680 } 681 682 @SideOnly(CLIENT) 683 public static void registerKey(BaseMod mod, KeyBinding keyHandler, boolean allowRepeat) 684 { 685 ModLoaderClientHelper.registerKeyBinding(mod, keyHandler, allowRepeat); 686 } 687 688 /** 689 * Register the mod for packets on this channel. 690 * {@link NetworkRegistry#registerChannel(IPacketHandler, String)} 691 * 692 * @param mod 693 * @param channel 694 */ 695 public static void registerPacketChannel(BaseMod mod, String channel) 696 { 697 NetworkRegistry.instance().registerChannel(ModLoaderHelper.buildPacketHandlerFor(mod), channel); 698 } 699 700 /** 701 * Register a new tile entity class 702 * 703 * @param tileEntityClass 704 * @param id 705 */ 706 public static void registerTileEntity(Class<? extends TileEntity> tileEntityClass, String id) 707 { 708 GameRegistry.registerTileEntity(tileEntityClass, id); 709 } 710 711 @SideOnly(CLIENT) 712 public static void registerTileEntity(Class<? extends TileEntity> tileEntityClass, String id, TileEntitySpecialRenderer renderer) 713 { 714 ClientRegistry.registerTileEntity(tileEntityClass, id, renderer); 715 } 716 717 /** 718 * Remove a biome from the list of generated biomes 719 * 720 * @param biome 721 */ 722 public static void removeBiome(BiomeGenBase biome) 723 { 724 GameRegistry.removeBiome(biome); 725 } 726 727 /** 728 * Remove a spawn 729 * 730 * @param entityClass 731 * @param spawnList 732 */ 733 public static void removeSpawn(Class<? extends EntityLiving> entityClass, EnumCreatureType spawnList) 734 { 735 EntityRegistry.removeSpawn(entityClass, spawnList, WorldType.base12Biomes); 736 } 737 738 /** 739 * Remove a spawn 740 * 741 * @param entityClass 742 * @param spawnList 743 * @param biomes 744 */ 745 public static void removeSpawn(Class<? extends EntityLiving> entityClass, EnumCreatureType spawnList, BiomeGenBase... biomes) 746 { 747 EntityRegistry.removeSpawn(entityClass, spawnList, biomes); 748 } 749 750 /** 751 * Remove a spawn 752 * 753 * @param entityName 754 * @param spawnList 755 */ 756 public static void removeSpawn(String entityName, EnumCreatureType spawnList) 757 { 758 EntityRegistry.removeSpawn(entityName, spawnList, WorldType.base12Biomes); 759 } 760 761 /** 762 * Remove a spawn 763 * 764 * @param entityName 765 * @param spawnList 766 * @param biomes 767 */ 768 public static void removeSpawn(String entityName, EnumCreatureType spawnList, BiomeGenBase... biomes) 769 { 770 EntityRegistry.removeSpawn(entityName, spawnList, biomes); 771 } 772 773 @Deprecated 774 @SideOnly(CLIENT) 775 public static boolean renderBlockIsItemFull3D(int modelID) 776 { 777 return RenderingRegistry.instance().renderItemAsFull3DBlock(modelID); 778 } 779 780 @Deprecated 781 @SideOnly(CLIENT) 782 public static void renderInvBlock(RenderBlocks renderer, Block block, int metadata, int modelID) 783 { 784 RenderingRegistry.instance().renderInventoryBlock(renderer, block, metadata, modelID); 785 } 786 787 @Deprecated 788 @SideOnly(CLIENT) 789 public static boolean renderWorldBlock(RenderBlocks renderer, IBlockAccess world, int x, int y, int z, Block block, int modelID) 790 { 791 return RenderingRegistry.instance().renderWorldBlock(renderer, world, x, y, z, block, modelID); 792 } 793 794 /** 795 * Configuration is handled elsewhere 796 * {@link ModLoaderModContainer} 797 */ 798 @Deprecated 799 public static void saveConfig() 800 { 801 } 802 803 /** 804 * Send a packet from client to server 805 * 806 * @param packet 807 */ 808 public static void sendPacket(Packet packet) { 809 PacketDispatcher.sendPacketToServer(packet); 810 } 811 /** 812 * Send a chat message to the server 813 * 814 * @param text 815 */ 816 @Deprecated 817 public static void serverChat(String text) 818 { 819 //TODO 820 } 821 822 @Deprecated 823 @SideOnly(CLIENT) 824 public static void serverLogin(NetClientHandler handler, Packet1Login loginPacket) 825 { 826 //TODO 827 } 828 829 public static void serverSendPacket(NetServerHandler handler, Packet packet) 830 { 831 if (handler != null) 832 { 833 PacketDispatcher.sendPacketToPlayer(packet, (Player)handler.getPlayer()); 834 } 835 } 836 public static void serverOpenWindow(EntityPlayerMP player, Container container, int ID, int x, int y, int z) 837 { 838 ModLoaderHelper.openGui(ID, player, container, x, y, z); 839 } 840 841 /** 842 * Indicate that you want to receive ticks 843 * 844 * @param mod receiving the events 845 * @param enable indicates whether you want to recieve them or not 846 * @param useClock don't receive render subticks, just world ticks 847 */ 848 public static void setInGameHook(BaseMod mod, boolean enable, boolean useClock) 849 { 850 ModLoaderHelper.updateStandardTicks(mod, enable, useClock); 851 } 852 853 854 public static void setInGUIHook(BaseMod mod, boolean enable, boolean useClock) 855 { 856 ModLoaderHelper.updateGUITicks(mod, enable, useClock); 857 } 858 859 /** 860 * Set a private field to a value using reflection 861 * {@link ObfuscationReflectionHelper#setPrivateValue(Class, Object, int, Object)} 862 * 863 * @param instanceclass 864 * @param instance 865 * @param fieldindex 866 * @param value 867 */ 868 public static <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, int fieldindex, E value) 869 { 870 ObfuscationReflectionHelper.setPrivateValue(instanceclass, instance, value, fieldindex); 871 } 872 873 /** 874 * Set a private field to a value using reflection 875 * {@link ObfuscationReflectionHelper#setPrivateValue(Class, Object, String, Object)} 876 * 877 * @param instanceclass 878 * @param instance 879 * @param field 880 * @param value 881 */ 882 public static <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, String field, E value) 883 { 884 ObfuscationReflectionHelper.setPrivateValue(instanceclass, instance, value, field); 885 } 886 887 /** 888 * This method is a call in hook from modified external code. Implemented elsewhere. 889 * 890 * @param player 891 * @param item 892 * @param matrix 893 */ 894 @Deprecated 895 public static void takenFromCrafting(EntityPlayer player, ItemStack item, IInventory matrix) 896 { 897 } 898 899 /** 900 * This method is a call in hook from modified external code. Implemented elsewhere. 901 * 902 * @param player 903 * @param item 904 */ 905 @Deprecated 906 public static void takenFromFurnace(EntityPlayer player, ItemStack item) 907 { 908 } 909 910 /** 911 * Throw the offered exception. Likely will stop the game. 912 * 913 * @param message 914 * @param e 915 */ 916 public static void throwException(String message, Throwable e) 917 { 918 FMLCommonHandler.instance().raiseException(e, message, true); 919 } 920 921 public static void throwException(Throwable e) 922 { 923 throwException("Exception in ModLoader", e); 924 } 925 }