Help Sign In/Register

Minecraft Forums

Advanced Search
  • News
  • Rules
  • Forum
  • Chat
  • Mods
  • Maps
  • Resource Packs
  • Minecraft Station
  • Minecraft Server Hosting
Desktop View
  • Home
  • Member List
  • GadzooksThePaperCreeper's Profile
  • Send Private Message
  • View GadzooksThePaperCreeper's Profile
  • GadzooksThePaperCreeper
  • Registered Member
  • Member for 8 years, 8 months, and 15 days
    Last active Sun, Feb, 24 2013 15:14:19
  • 0 Followers
  • 188 Total Posts
  • 4 Thanks
  • Member
  • Posts
  • Threads
  • Reputation
  • Comments
  • Received
  • Given
  • View GadzooksThePaperCreeper's Profile

    1

    Feb 8, 2013
    GadzooksThePaperCreeper posted a message on [1.8] MinecraftForge Video & Text Modding Tutorials [Updated May 2] Now in English and German
    Quote from LordOfEpicness

    Umm, Where do I find mob animation? It says that its there in the end of part 9 in the text entities tutorial but I cant find it.


    He hasn't made one yet. If you'd like to know, check out SCMOwns's thread. It explains animations, but it doesn't, however, go into details such as specific animations going wen it, say, kills you, or is in the air or something like that.
    Quote from 88mooggles

    So Wuppy, I got a question. Why do my aquatic mobs drown? I set them to extends EntityWaterMob.

    Clearly I need something more.

    Could you give a few pointers?


    Take a look at the squid.
    Posted in: Mapping and Modding Tutorials
  • View GadzooksThePaperCreeper's Profile

    1

    Nov 25, 2012
    GadzooksThePaperCreeper posted a message on Official Chat Thread XIV: Unshaven Edition
    Quote from SkaterSam


    Whens that happen?

    You'd be sad without "compooter things".


    It happens when the kid next to you in computer class screws up so badly the printer shoots out 20 pages of symbols I can't even locate on my keyboard.
    Posted in: General Off Topic
  • View GadzooksThePaperCreeper's Profile

    1

    Nov 6, 2012
    GadzooksThePaperCreeper posted a message on Today in Minecraft - Pocket Edition, Gift Cards, & More
    Quote from DragonHeroBlaze

    Nether reactor?
    Sounds strange.


    Yes, what is a Nether reactor?
    Posted in: Minecraft News
  • View GadzooksThePaperCreeper's Profile

    1

    Sep 22, 2012
    GadzooksThePaperCreeper posted a message on CreepyPastaCraft | v4 [1.4.7] - [Discontinued]
    Quote from __Peel_Out___Caa_t__fis_h

    They aren't even creepypastas, just Urban Myths. >_>


    So is Slendy.
    Posted in: Minecraft Mods
  • View GadzooksThePaperCreeper's Profile

    2

    Aug 13, 2012
    GadzooksThePaperCreeper posted a message on [1.2.5] Zeppelin [0.31] [WIP]
    I'm beginning to question whether this is a Mod thread or a Drama thread. |:|
    Posted in: WIP Mods
  • View GadzooksThePaperCreeper's Profile

    1

    Jul 30, 2012
    GadzooksThePaperCreeper posted a message on Ender Pearls
    Quote from CraftNinja2011


    Ah, a quick question about the ender chests (apologies for digression), do they work across dimensions? As in, could I put down an Ender Chest in my house and in a Nether Stronghold for Blaze rod farming?


    Yes.Just realzed something. Because they go underground during rainstorms, don't skip a rainy night. Head into the caves. In there you will find all the Endermen who spawned underground AND all the one that spawned above ground in one place. This is the best method.
    Posted in: Survival Mode
  • To post a comment, please login.
  • 1
  • 2
  • Next
  • View karyonix's Profile

    277

    Oct 30, 2012
    karyonix posted a message on Shaders Mod (updated by karyonix)

    ShadersMod adds shaders to Minecraft and add multiple draw buffers, shadow map, normal map, specular map. These things can be used to change appearance of Minecraft world. How it looks depends on selected shaderpack and some user settings.
    This mod is derived from daxnitro's GLSL Shaders Mod.

    This mod requires recent and fast graphic card with NVIDIA or AMD GPU.

    Graphics effects do not come out of nowhere. They require computing power of both CPU and GPU.
    Some shaderpacks render around 10 times slower than vanilla Minecraft.
    You can expect low frame rate if your computer cannot get more than 200 FPS from vanilla Minecraft.


    Latest status


    ShadersMod has not been updated for more recent Minecraft version than 1.12.

    You may use OptiFIne instead of ShadersMod for loading shaders in latest Minecraft version.


    For Minecraft 1.12

    - ShadersMod v2.7.0 Installer for Minecraft 1.12 (updated 2017-06-17)
    (link)
    Download download page
    -- Not Compatible with Forge, Optifine

    -- This is for Minecraft 1.12 only, not for 1.12.1 or 1.12.2.


    For Minecraft 1.11.2

    - ShadersMod v2.6.1 Installer for Minecraft 1.11.2 (updated 2016-12-28)
    (link)
    Download download page
    -- Not Compatible with Forge, Optifine


    For Minecraft 1.11

    - ShadersMod v2.6.0 Installer for Minecraft 1.11 (updated 2016-12-18)
    (link)
    Download download page
    -- Not Compatible with Forge, Optifine


    For Minecraft 1.10.2

    - ShadersMod v2.5.4 Installer for Minecraft 1.10.2 (updated 2016-12-18)
    (link)
    Download download page
    Change - Fix some texture bug
    -- Not Compatible with Forge, Optifine



    - ShadersMod v2.5.3 Installer for Minecraft 1.10.2 (updated 2016-06-29)
    (link)
    -- Not Compatible with Forge, Optifine
    -- More info...


    For Minecraft 1.10

    - ShadersMod v2.5.2 Installer for Minecraft 1.10 (updated 2016-06-20)
    (link)
    Download download page
    -- Not Compatible with Forge, Optifine
    -- More info... Please read before install.


    For Minecraft 1.9.4

    - ShadersMod v2.5.1 Installer for Minecraft 1.9.4 (updated 2016-06-12) (link)
    Download download page
    -- Not Compatible with Forge, Optifine
    -- More info... Please read before install.


    For Minecraft 1.9

    - ShadersMod v2.5.0 Installer for Minecraft 1.9 (updated 2016-05-15) (link)
    Download download page
    -- Not Compatible with Forge, Optifine
    -- More info... Please read before install.


    OptiFine for 1.9.x also include ShadersMod features. See OptiFine thread.
    ShadersMod cannot be used together with OptiFine.


    For Minecraft 1.8.8 - 1.8.9

    sp614x has merged ShadersMod's feature into OptiFine. Available at OptiFine thread.


    For Minecraft 1.8 (1.8 only, cannot be used on 1.8.1 or 1.8.2 or 1.8.3)

    - ShadersMod v2.4.12 Installer for Minecraft 1.8 (updated 2015-06-30) (link)
    Download download page
    -- Compatible with Forge 1487 to 1521. Not compatible with Forge 1523 or later.
    -- Compatible with OptiFine_1.8.0_HD_U_D5 (AA OFF. AF OFF, Fast Render OFF, Natural Texture OFF)
    -- More info... Please read before install.



    - ShadersMod v2.4.11 Installer for Minecraft 1.8 (updated 2015-03-07) (link)
    -- Fixed entity shadows not rendered when used with Forge
    -- Fixed shadow framebuffer error on OSX
    -- Compatible with OptiFine_1.8.0_HD_U_D2, not with OptiFine_1.8.0_HD_U_D3
    -- Compatible with Forge 1468, not with 1469 or later

    - ShadersMod v2.4.10 Installer for Minecraft 1.8 (updated 2015-03-01) (link)
    -- Partially fixed Fixed beacon beam glitch with AMD Catalyst 14.12 omega driver.
    -- Partially fixed enchanted armor glitch with AMD Catalyst 14.12 omega driver.
    -- Changed shadow read buffer parameter.
    -- More info...

    - ShadersMod v2.4.9 Installer for Minecraft 1.8 (updated 2015-02-23) (link)
    -- Fixed compatbility with OptiFine connected textures.
    -- More info...

    - ShadersMod v2.4.8 Installer for Minecraft 1.8 (updated 2015-02-16) (link)
    -- Fixed compatbility with OptiFine_1.8.0_HD_U_D1.
    -- Fixed compatbility with Forge 11.14.1.1313.
    -- Not compatible with connected texture. You have to disable connected texture in optifine option when use with shadersmod.
    -- More info...

    - ShadersMod v2.4.7 Non-Forge Edition Installer for Minecraft 1.8 (updated 2015-01-12) (installer updated 2015-02-01) (link)
    -- It can work with OptiFine_1.8.0_HD_U_B6 - C7 but not D1
    -- It can work with Forge 11.14.0.1281 but not Forge 11.14.0.1292 and later
    -- Mod and installer are merged in one jar.
    -- ASM library is not included in mod installer. You can install it separately.
    -- Fixed texture feedback loop in some shaderpacks (eg. water glitch in SEUS 10.1).
    -- Fixed far away chunks are not rendered in v2.4.6
    -- More info...

    - ShadersMod v2.4.6 Non-Forge Edition Installer for Minecraft 1.8 (updated 2015-01-09) (link)
    Require Minecraft 1.8
    Not compatible with Forge
    Not fully compatible with optifine. It works with OptiFine_1.8.0_HD_U_B6 but has some glitch.

    Recent Change
    - Fixed missing shadow

    For Minecraft 1.7.10
    - Shaders Mod v2.3.31 Forge Edition for Minecraft 1.7.10 (2015-11-16) (link)
    Download download page
    Compatibie with Minecraft 1.7.10 with Forge 1481-1566
    Compatible with OptiFine_1.7.10_HD_U_C1 (only ultra edition)
    Compatible with AMD Catalyst 14.9
    Requires Forge or FML. You can download Forge installer from files.minecraftforge.net.
    Use Forge installer to install Forge. Select Forge Profile in Minecraft Launcher.
    Copy ShadersMod jar file to mods folder in game directory, so it will be loaded by Forge.

    - Shaders Mod v2.3.29 Non-Forge Edition Installer for Minecraft 1.7.10 (2014-10-03) (link)
    Download download page
    Compatible with Minecraft 1.7.10.
    Compatible with OptiFine_1.7.10_HD_U_A4. (only ultra edition)
    Compatible with AMD Catalyst 14.9.
    Recent Change
    - Fixed crash while rendering compass in item frame.
    - Fixed compatibility with AMD Catalyst 14.9.


    For Minecraft 1.7.2
    - Shaders Mod v2.3.30 Forge Edition for Minecraft 1.7.2 (2014-11-11) (link)
    Download download page
    Compatible with Minecraft 1.7.2.
    Compatible with OptiFine_1.7.2_HD_U_D3. (only ultra edition)
    Compatible with AMD Catalyst 14.9.
    Requires Forge or FML. You can download Forge installer from files.minecraftforge.net.
    Use Forge installer to install Forge. Select Forge Profile in Minecraft Launcher.
    Copy ShadersMod jar file to mods folder in game directory, so it will be loaded by Forge.

    For Minecraft 1.6.4
    - Shaders Mod v2.2.3 Forge Edition for Minecraft 1.6.4 (2014-12-02) (link)
    Download download page
    * Compatible with AMD Catalyst 14.9
    . Compatible with Minecraft 1.6.4.
    . Compatible with OptiFine_1.6.4_HD_U_D1. (only ultra edition) (anti-aliasing and anisotropic filtering must be disabled)
    . Requires Forge or FML. You can download Forge installer from files.minecraftforge.net.
    Use Forge installer to install Forge. Select Forge Profile in Minecraft Launcher.
    Copy ShadersMod jar file to mods folder in game directory (or mods\1.6.4), so it will be loaded by Forge.

    Installation

    Installation (Forge Edition)
    -Prerequisite
    - Install Forge or FML
    -- Download Minecraft Forge or FML installer
    -- Open Minecraft Launcher.
    -- Select a profile (lower left corner of launcher window).
    -- Edit Profile. Select Minecraft version that ShadersMod is made for and save.
    -- Click play. Wait for Minecraft to load.
    -- After the game start successfully, close Minecraft. Close launcher if it is still open.
    -- Install Minecraft Forge or FML with the downloaded installer.
    -- Open Minecraft Launcher.
    Select Forge or FML in profile box at lower left corner of launcher window.
    Or select other profile and click Edit Profile and select Forge or FML version and save.
    -- Click Play.
    -- You should see "Mods" button in title screen below "Multiplayer" button.
    - Check whether everything is alright and close Minecraft.
    - Install
    - Copy ShadersModCore-....jar to %appdata%\.minecraft\mods folder.
    Make sure its file extension is ".jar", not ".zip".
    - If you want to install other FML mods or Forge mods, copy them to the same mods folder.
    - Run
    - Use Mojang's Minecraft Launcher to run Minecraft with Forge profile.
    (Don't worry if ShadersMod is not shown in mod list screen)
    - Open Option menu, Shaders... button. Click open shaderpacks folder.
    - Put some shaderpacks in the folder.
    - In Shaders screen click shaderpack name.

    Installation (Non-Forge Edition)
    1. Before running ShadersMod installer:
    1.1 Use minecraft Launcher. Run Minecraft 1.8 at least once and close it.
    ---- If you have only other versions installed, click "New Profile" or "Edit Profile" and select "Use version" "release 1.8", save, then selected the new/edited profile and click play.
    1.2 Install ASM 5.0.3 in minecraft libraries.
    ---- Use this ASM v5.0.3 Installer for Minecraft
    ---- If you have installed Forge or FML for Minecraft 1.8, it should have already installed ASM.
    1.3 Close Minecraft Launcher before you run ShadersMod installer.
    1.4 For some version that is compatible with optifine, if you want to install it together with OptiFine, run OptiFine installer before ShadersMod installer.

    2. Run ShadersMod installer
    2A. The installer is executable jar file. Double-click it in Windows Explorer to run.
    2B. If your computer doesn't associate .jar file properly, you may have to run java from command line or batch file.
    ---- The command to use is like this "java -jar ShadersMod-v2.4.7.jar"
    ---- You may have to use full path to java.exe if it is not in your PATH environment.

    3. After you run installer successfully:
    3.1 Open Minecraft Launcher. Select Profile 1.8-ShadersMod and click Play.
    3.2 Open Option screen. There should be Shaders button. Click it to open Shaders screen.

    Previous versions


    - Shaders Mod v2.3.28 Forge Edition for Minecraft 1.7.10 (2014-10-03) (link)
    Compatible with Minecraft 1.7.10.
    Compatible with OptiFine_1.7.10_HD_U_A4. (only ultra edition)
    Compatible with AMD Catalyst 14.9.

    - GLSL Shaders Mod v2.3.27 Non-Forge Edition Installer for Minecraft 1.7.10 (2014-10-02)(link)
    Download download page 1 or download page 2

    - GLSL Shaders Mod v2.3.26 Forge Edition for Minecraft 1.7.10 (2014-10-02)*
    Download download page 1 or download page 2

    Recent Change
    - Fixed crash while rendering compass in item frame.
    - Fixed compatibility with AMD Catalyst 14.9.

    - GLSL Shaders Mod v2.3.25 Non-Forge Edition Installer for Minecraft 1.7.10 (2014-09-28)(link)
    Download download page
    Compatible with Minecraft 1.7.10.
    Compatible with OptiFine_1.7.10_HD_U_A4.

    - GLSL Shaders Mod v2.3.24 Forge Edition for Minecraft 1.7.10 (2014-09-28)(link)
    Download download page
    Compatible with Minecraft 1.7.10.

    Change
    - Fixed normal map and specular map animation.

    - GLSL Shaders Mod v2.3.23 Non-Forge Edition Installer for Minecraft 1.7.10 (2014-09-09)(link)
    Download link1

    - GLSL Shaders Mod v2.3.22 Forge Edition for Minecraft 1.7.10 (2014-09-09)(link)
    Download link1

    Change
    - Fixed rendering of held block.

    - GLSL Shaders Mod v2.3.21 Non-Forge Edition Installer for Minecraft 1.7.10 (2014-09-06)(link)
    Download link1

    - GLSL Shaders Mod v2.3.20 Forge Edition for Minecraft 1.7.10 (2014-09-06)(link)
    Download link1

    Change
    - Added vertex attribute vec4 at_tangent. (at_tangent.xyz = tangent vector, at_tangent.w = handedness)
    - Fixed compatibility with ProjectRed-Lighting-1.7.10-4.4.8.47

    - GLSL Shaders Mod v2.3.19 Non-Forge Edition installer for Minecraft 1.7.10 (2014-07-12)(link)
    Download link1
    Compatible with Minecraft 1.7.10.
    Compatible with OptiFine_1.7.10_HD_U_A4.

    - GLSL Shaders Mod v2.3.18 Forge Edition for Minecraft 1.7.10 (2014-07-12)(link)
    Download link1

    - GLSL Shaders Mod v2.3.17 Forge Edition for Minecraft 1.7.10 (2014-07-07)(link)
    Download link1
    Compatible with Minecraft 1.7.10 and 1.7.2.
    Requires Forge or FML.

    - GLSL Shaders Mod v2.3.16 Non-Forge Edition installer for Minecraft 1.7.10 (2014-07-06)(link)
    Compatible with OptiFine_1.7.10_HD_U_A2.
    more info ...

    For Minecraft 1.7.5
    Non-Forge Edition
    - GLSL Shaders Mod v2.3.15 for Minecraft 1.7.5 installer (2014-03-29)*
    Not require Forge.
    Compatible with OptiFine_1.7.5_HD_U_D1.
    more info ...

    For Minecraft 1.7.4
    Non-Forge Edition
    - GLSL Shaders Mod v2.3.13 for Minecraft 1.7.4 installer (2014-03-24)*
    Not require Forge.
    Compatible with OptiFine_1.7.4_HD_U_D1.
    more info ...

    For Minecraft 1.7.2
    - GLSL Shaders Mod v2.3.12 for Minecraft 1.7.2 (2014-03-11)*
    Download link1
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    . Fixed crash if used with FML without Forge (v2.3.10-2.3.11).
    . Fixed mc_Entity.z and gl_MultiTexCoord3 not work in v2.3.10.

    GLSL Shaders Mod v2.3.11 for Minecraft 1.7.2 (2014-03-10)*
    Download link1
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    Fixed mc_Entity.z and gl_MultiTexCoord3 not work in v2.3.10.
    Bug : crash if used with FML without Forge.

    GLSL Shaders Mod v2.3.10 for Minecraft 1.7.2 (2014-03-09)*
    Download link1
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    Fixed flashing shadow
    Fixed held item rendering
    Added program gbuffers_spidereyes
    Changed mc_Entity x=blockID, y=renderType, z=metadata
    Added shader settings : shadowtex0Mipmap, shadowtex1Mipmap, shadowcolor0Mipmap, shadowcolor1Mipmap, shadowtex0Nearest, shadowtex1Nearest, shadowcolor0Nearest, shadowcolor1Nearest (to be used by SEUS GI algorithm)
    Bug : mc_Entity.z=metadata does not work.
    Bug : gl_MultiTexCoord3 does not work.
    Bug : crash if used with FML without Forge.

    GLSL Shaders Mod v2.3.9 for Minecraft 1.7.2 (2014-02-16)*
    Download link1
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    Added gbuffers mipmaps generation before final program (previously only before composite* program).
    Fixed display error message on screen.

    GLSL Shaders Mod v2.3.7 for Minecraft 1.7.2 (2014-02-09)*
    Download link1
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    Fixed shadow of transparent block.
    Added shaderpack settings : generateShadowColorMipmap, shadowHardwareFiltering0, shadowHardwareFiltering1, shadow0MinMagNearest, shadow1MinMagNearest, shadowColor0MinMagNearest, shadowColor1MinMagNearest

    GLSL Shaders Mod v2.3.6 for Minecraft 1.7.2 (2014-02-08)*
    Download download
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    Fixed EnderDragon lighting bug.
    Fixed render chests and signs with gbuffers_terrain.
    GLSL Shaders Mod v2.3.4 for Minecraft 1.7.2 (2014-01-31)*
    Download download
    Requires Forge or FML.
    Compatible with Optifine.
    Recent changes:
    Fixed Spider and Enderman lighting bug.
    Added option to disable loading of normal map and specular map
    Added option to enable old lighting
    Changed block damage rendering
    Changed Sky rendering at the horizon.
    Changed Skip generating mipmaps of buffers if not OpenGl 3.0.

    For Minecraft 1.6.4
    Forge Edition
    - GLSL Shaders Mod v2.2.2 for Minecraft 1.6.4 (2014-02-03)
    Download link1
    Requires Forge or FML.
    Compatible with Optifine. But not compatible with Optifine's anisotropic filtering and anti-aliasing features. Turn them off when use with shaders mod.

    GLSL Shaders Mod (updated by karyonix) v2.2.1 for Minecraft 1.6.4 (2013-12-23)
    Fixed water bug while holding enchanted item.

    Optifine in mods folder is not compatible with ShadersMod 2.2.1 because of change in Forge/FML.
    Forge/FML can load Optifine in mods folder but it runs Optifine's class transformer after ShadersMod, so Optifine overwrite the change that ShadersMod does, so ShadersMod is not functional.
    Experimental FML Plugin for loading OptiFine from mods folder link.

    GLSL Shaders Mod (updated by karyonix) v2.2.0 for Minecraft 1.6.4 (2013-12-21)
    Fixed skyColor value.
    Changed hand rendering.
    Draw horizon with gbuffers_skybasic.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta18 for Minecraft 1.6.2-1.6.4 (2013-10-01)
    Fixed access flag of some fields and methods.
    Fixed fogMode has zero value.
    Fixed skyColor value -- bug again.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta17 for Minecraft 1.6.2 (2013-09-20)
    Fixed native crash while changing resourcepack on AMD card.
    Fixed composite buffer format setting.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta15 for Minecraft 1.6.2 (2013-09-18)
    Fixed default normal map and specular map bug when used with OptiFine.
    Fixed uniform variable not set before verify program object.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta14 for Minecraft 1.6.2 (2013-09-16)
    Fixed buffer overflow in ShadersTex from beta 13.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta13 for Minecraft 1.6.2 (2013-09-15)
    Does not require Forge but requires FML (which is included in Forge but can be installed separately).
    Compatible with Forge 9.10.1.859, FML 6.2.60.744, Optifine 1.6.2 HD Ultra C4.
    Fixed crash when used with TConstruct.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta12 for Minecraft 1.6.2 (2013-09-09)
    Added gaux1-gaux4 format setting from shaderpack.
    Added Optifine-compatible edition.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta11 for Minecraft 1.6.2 (2013-09-04)
    Load-time patching code completed.
    No whole-class replacement.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta9 for Minecraft 1.6.2 (2013-08-26)
    Fixed loading of texture filtering configuration.
    Added option for correct shadow pass frustum clipping (but lower FPS).
    Added render resolution multiplier option.
    Less class replacement.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta8 for Minecraft 1.6.2 (2013-08-22)
    Fixed mipmap bug.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta7 for Minecraft 1.6.2 (2013-08-21)
    Fixed config not loaded on startup bug.
    Less classes replacement.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta6 for Minecraft 1.6.2 (2013-08-18)
    Multiple depth buffers.
    Multiple shadow depth buffers with shadow color buffer.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta5 for Minecraft 1.6.2 (2013-08-15)
    Fixed white box covering horse head.
    Fixed rendering of downloaded player skin.
    Skip calculation of some new features when not used.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta2 for Minecraft 1.6.2 (2013-08-12)
    Fixed skeleton texture bug.
    Skip drawing circular shadow.
    Added block texture filtering option.

    GLSL Shaders Mod (updated by karyonix) v2.0.1 beta1 for Minecraft 1.6.2 (2013-08-10)
    Requires Minecraft Forge.
    Incompatible with Optifine.
    Now compatible with Sonic Ether's Unbelievable Shaders v10.0

    Shaderpacks

    - Sonic Ether's Unbelievable Shaders -- for NVIDIA GTX or AMD RADEON -- not compatible with Intel HD graphics -- not compatible with OS X
    topic link

    - Sildur's shaders PC/Mac,Intel compatible.
    topic link

    - Chocapic13's Shaders
    topic link

    - sensi277's yShaders -- for Intel HD Graphics
    topic link

    - MrMeep_x3's Shaders
    topic link

    - Naelego's Cel Shaders
    topic link

    - RRe36's Shaders
    topic link

    - DeDelner's CUDA Shaders
    web site link

    - bruceatsr44's Acid Shaders
    topic link

    - Beed28's Shaders
    Jelly World topic link
    Bendy Ground topic link
    The Wave topic link
    - Ziipzaap's Shader Pack
    topic link

    - robobo1221's Shaders
    topic link

    - dvv16's Shaders
    topic link

    - Stazza85 super Shaders
    topic link

    - hoo00's Shaders pack B
    topic link

    - Regi24's Waving Plants shaders
    topic link

    - MrButternuss ShaderPack | Shader 4 low Pc's
    topic link

    - DethRaid's Awesome Graphics On Nitro Shaders
    topic link

    - Edi's Shader ForALLPc's
    topic link

    - CrankerMan's TME Shaders
    topic link

    - Kadir Nck Shader (for skate702)
    topic link

    - Werrus's Shaders
    web site link
    topic link

    - Knewtonwako's Life Nexus Shaders
    topic link

    - CYBOX shaderpack
    topic link

    - CrapDeShoes CloudShade Alpha
    topic link

    - AirLoocke42 Shader
    topic link

    - CaptTatsu's BSL Shaders
    topic link

    - Triliton's shaders
    topic link

    - ShadersMcOfficial's Bloominx Shaders (Chocapic13' Shaders edit)
    topic link

    - dotModded's Continuum Shaders
    topic link

    - Qwqx71's Lunar Shaders (chocapic13's shader edit)
    topic link

    - Epix Shaders
    topic link

    - SeaMatis's Vibrant Shaders v1 (Chocapic13's Shader Edit)
    topic link

    - DatWeirdPerson's Mercury Shaders (PC/MAC/INTEL)
    topic link

    - bump-shadow-waving v0.9.9 (2014-09-06)

    bump-shadow-waving v0.9.9 (2014-09-06)
    download link1 or download link2
    - Fix POM glitch on some blocks (eg. Redstone wire).
    - Demonstrate how to use the new at_tangent attribute.
    - Require ShadersMod v2.3.20+.

    bump-shadow-waving 0.9.8 for mc1.7.2 (2014-03-22)
    Adjusted POM calculation for flipped texture in east and north sides of block in Minecraft 1.7.2 only, as suggested by Death_Dealer. This is for Minecraft 1.7.2 only, not for 1.7.4+.
    bump-shadow-waving 0.9.8 (2014-02-19)
    Fixed compatibility with NVIDIA 334.89.
    Old versions
    bump-shadow-waving 0.9.7 (2013-09-23)
    Demonstrate the use of multiple depth buffers, multiple shadow buffers and shadow color buffer.
    Underwater shading is still incomplete -- it is too bright now.
    Compatible with NVIDIA, AMD, Intel HD Graphics.
    bump-shadow-waving 0.9.6 (2013-08-20)
    Demonstrate the use of multiple depth buffers and shadow depth buffers and shadow color buffer.
    Water and Portal have colored shadow.
    Opaque objects above water cast shadows on both water surface and underwater.
    Underwater shading is still incomplete.
    Bug : incompatible with AMD.
    bump-shadow-waving 0.9.5 (2013-08-18)
    Demonstrate the use of multiple depth buffers and shadow depth buffers and shadow color buffer.
    Water and Portal have colored shadow.
    Opaque objects above water cast shadows on both water surface and underwater.
    Bug: POM does not work.
    bump-shadow-waving v0.9.3 (2013-08-08)
    Fixed waving grass and flowers problem in 1.6.x.
    Do not move bottom vertices of water.
    Rain is still not good.
    Require ShadersMod preview 3 or v2.0.1 beta 1 for Minecraft 1.6.2.
    bump-shadow-waving v0.9.2 experimental build (2013-03-06)
    (updated 2013-08-06)
    Require ShadersMod 1.44+
    Based on alternative shaders in daxnitro's GLSL Shaders release and daxnitro's wiki.
    Effects :
    Waving leaves, grass etc.
    POM, Shadow, Fog,
    DOF blur (disabled by default, edit final.fsh to enable)
    Use normal map + height map in *_n.png.
    Use Sonic Ether's specular texture format in *_s.png.
    Compatible with default texture (but it has no bump and specular effect).
    Compatible with default lightmap. Incompatible with special lightmap made for SEUSv10rc5.
    Rain is not looking good. I may fix it in later version.

    - How to prepare shaderpack zip file

    1.Make a folder named shaders
    2.Copy *.vsh *.fsh files in the folder
    3.Zip the folder.
    4.Make sure the zip file has shaders folder in it with *.vsh *.fsh in shaders folder.
    5.Rename your zip file for easy identification.

    - How to prepare shaderpack folder for in-game shaders selection

    1. Start Minecraft with ShadersMod installed
    2. Option... Shaders... open shaderpacks folder
    3. Create subfolder .minecraft/shaderpacks/packname
    4. Create subfolder .minecraft/shaderpacks/packname/shaders
    5. Copy your .fsh .vsh files into .minecraft/shaderpacks/packname/shaders

    Here is folder structure for .minecraft/shaderpacks

    - .minecraft
    --- shaderpacks
    ----- packname1 -- folder
    ------- shaders -- subfolder
    --------- *.vsh
    --------- *.fsh
    ----- packname1 -- folder
    ------- shaders -- subfolder
    --------- *.vsh
    --------- *.fsh
    ----- packname3.zip -- zip file
    ------- shaders -- folder in zip
    --------- *.vsh
    --------- *.fsh
    ----- packname4.zip -- zip file
    ------- shaders -- folder in zip
    --------- *.vsh
    --------- *.fsh

    Resource packs
    Some shaders effects need "normal map" and "specular map" in resource pack.
    Normal map name is + "_n.png".
    Specular map name is + "_s.png".
    - Chroma Hills
    web site link
    - 3D-Craft (bumpmap) 16x16
    topic link
    - Balea's continued
    web site link

    Graphics drivers links

    If you encounter problem running this mod, try update your graphics driver.
    Sometimes, latest version may not work well, you may have to install prior version that is known to work.

    Intel HD Graphics Drivers

    Driver versions *.3408 - *.3907 are not compatible. Game will crash.
    You should use the latest driver (or recent driver since *.3945)



    - 2nd Generation Intel Core Processors with Intel HD Graphics 3000/2000
    ---- 15.28.23.64.4101 for Windows 64-bit
    - 3rd Generation Intel Core Processors with Intel HD Graphics 4000/2500
    ---- 15.33.32.64.4061 for Windows 64-bit
    - 4th Generation Intel Core Processors with Intel HD Graphics 5000/4600/4400/4200
    ---- 15.36.14.64.4080 for Windows 64-bit
    - Intel download center

    NVIDIA GeForce Drivers

    Recommended version is 335.23 or newer

    335.23 for Windows 7/8/8.1 64-bit32-bit
    Search
    Versions 32x.xx are unstable. I can't use them.

    AMD Catalyst Drivers

    ShadersMod v2.3.26+ can be used with AMD Catalyst 14.9.
    Older versions of ShadersMod crashes on 14.9 but can be used with 14.4 or 13.12.

    driver for Windows 7/8/8.1 64-bit32-bit
    Search

    Troubleshooting

    - Texture resolution
    If the game cannot run after install this mod, and you are using high resolution texture, try again with 16x16 or 32x32 texture. If it works, you can try higher resolution like 64x64 or 128x128.
    256x256 does not work well with ShadersMod on most graphics cards today.
    - Java heap size
    This can be set in Minecraft Launcher - Edit Profile - JVM Arguments
    -Xmx1024M or -Xmx1G is usually enough. 2048M is plenty, depending on render distance and mods.
    Don't set it too high.
    ShadersMod and OpenGL requires a lot of memory outside java heap.
    Make sure you have enough memory remaining outside java heap.
    - Console output
    In Minecraft Launcher - Edit Profile -
    check "Launcher Visibility" and set it to "Keep the launcher open". Save Profile.
    After this is set and you launch the game, console output is in Minecraft Launcher window, Development Console tab.
    Reading it may provide some clue about cause of the problem.
    You can copy the text and paste it to http://pastebin.com/ (or similar website), submit it and get its link. Post your link in the forum when you ask for help.
    - Crash Report
    If the game crashes. There is also Crash Report page in launcher window that provides useful information.
    - Version and system info
    If you ask for help, please provide Minecraft version number, Forge version number, ShadersMod version number, and other mods name and version/edition (if installed).
    If non-default launcher is used, you should write its name and version number too.
    Also the operating system name and version, graphics adapter name and driver version.
    Please be specific. Don't say latest version of everything.

    Modpack permission

    This statement is about ShadersMod only, not including shaderpacks (which are made by many people).
    You can include ShadersMod in mod pack.
    However, some computers are not compatible or not powerful enough.
    This may cause problem for your users. You should provide support for them.

    Thanks

    - daxnitro for original GLSL Shaders mod
    - id_miner for GLSL Shaders OF
    - sp614x for Optifine
    - sonicether for Sonic Ether's Unbelievable Shaders
    - snowycat2012, volDeus for suggestion of fixing buffer overflow
    - Alexei03a for suggestion of improvement.

    History

    daxnitro created the original GLSL SHADERS mod which create possibility for better-looking Minecraft.
    However, in September to October 2012, daxnitro did not update his mod for new Minecraft version 1.3.2-1.4.2. The last version was 2.1.6 for Minecraft 1.3.1.
    Many users requested an update for new Mincraft version.
    daxnitro said in his post that he allow modification and distribution of his mod.


    Quote from daxnitro
    class="quote-body">
    Modified / Alternate Versions

    A few community members have been making modifications to the mod as well as mods that supplement its functionality (It's open source and I encourage people to do so.). If you do this, you can do what you want with it and distribute it how you want, but I highly recommend putting it on the wiki for everyone to download.

    So I started updating new version of mod. id_miner also made his updated version of GLSL Shaders mod as well. He post it in his GLSL Shaders OF thread. I am combining his code in my version of shaders mod. He plans to leave development of shaders mod after I include all his added features in my version.
    If you like the mod and want to donate to daxnitro, see the link in his thread.

    Old Releases

    Zip of modified classes releases
    Old Releases
    * ShadersMod (modified by karyonix) 1.46
    ShadersMod-mc1.5.2-ofud3-1.46 for Minecraft 1.5.2 OptiFine HD Ultra D3
    Release note
    - Update for new texture implementation in Minecraft 1.5
    - texturename_n.png = normal map
    - texturename_s.png = specular map
    - texture and its normal map and specular map must have the same number of pixels.

    * ShadersMod (modified by karyonix) 1.44 (2013-03-06)
    ShadersMod-mc1.4.6-ofuD5-1.44 for Minecraft 1.4.6-1.4.7 OptiFine HD Ultra D5
    Release note
    - Fixed abnormal GUI rendering when rain is OFF.
    - Added uniform int entityHurt and uniform int entityFlash for gbuffers_entities.
    - Added custom DRAWBUFFERS setting.
    - Added uniform float sunAngle and uniform float shadowAngle
    uniform int entityHurt;
    value: 0 = normal, 102 = hurt

    uniform int entityFlash;
    value: 0 = normal, 1..255 = glow factor of flashing creeper

    uniform float sunAngle;
    value:
    0.00 = east
    0.25 = zenith (noon)
    0.50 = west
    0.75 = nadir (midnight)

    uniform float shadowAngle;
    value:
    0.00 = east
    0.25 = zenith (noon)
    0.50 = west

    Shaderpacks author can write DRAWBUFFERS setting in gbuffers_*.fsh and composite*.fsh
    /* DRAWBUFFERS:xxxx */

    Length of xxxx is number of draw buffers used.
    Number of valid draw buffers depends on GPU.
    Maximum allowed in ShadersMod is 8.

    where each letter in xxxx can be a digit (0-7) or N
    0 = color attachment 0
    ...
    7 = color attachment 7
    N = none
    First letter set output of gl_FragData[0]
    Second letter set output of gl_FragData[1]
    ...

    Example
    /* DRAWBUFFERS:0124 */
    gl_FragData[0] write to color attachment 0
    gl_FragData[1] write to color attachment 1
    gl_FragData[2] write to color attachment 2
    gl_FragData[3] write to color attachment 4

    /* DRAWBUFFERS:3 */
    gl_FragData[0] write to color attachment 3

    /* DRAWBUFFERS:01234567 */
    gl_FragData[0] write to color attachment 0
    gl_FragData[1] write to color attachment 1
    gl_FragData[2] write to color attachment 2
    gl_FragData[3] write to color attachment 3
    gl_FragData[4] write to color attachment 4
    gl_FragData[5] write to color attachment 5
    gl_FragData[6] write to color attachment 6
    gl_FragData[7] write to color attachment 7

    Internal format of gnormal and gaux4 can be changed from RGBA to RGBA32F or RGB32F.
    /* GNORMALFORMAT:RGBA32F */ or /* GNORMALFORMAT:RGB32F */
    /* GAUX4FORMAT:RGBA32F */ or /* GAUX4FORMAT:RGB32F */
    Installation v1.20-1.46
    You need correct version of minecraft and OptiFine. Wrong version does not work.
    Example :

    ShadersMod-mc1.4.6-ofuD5-1.43 for Minecraft 1.4.6-1.4.7 is to be used with OptiFine 1.4.6_HD_U_D5
    will not work with OptiFine 1.4.6_HD_D5 (standard edition not ultra),
    will not work with OptiFine 1.4.6_HD_U_C3 (wrong OptiFine version),
    will not work with OptiFine 1.4.5_HD_U_D5 (wrong Minecraft version).

    MCPatcher HD fix is not compatible.
    Modloader is not compatible.
    Forge is compatible. See compatible Forge version number in OptiFine thread.

    Forge includes FML which provides modloader functionality.
    * Installation for use with Magic Launcher
    1. Open Magic Launcher.
    2. Click Setup button.
    3. Select or create configuration you want to use.
    4. If you use Forge, add Forge universal zip.
    5. Add OptiFine zip (below Forge universal if used together).
    6. Add ShadersMod zip below OptiFine.
    7. OK and login. Test the game without shaderpack first.
    8. Option... Shaders... open shaderpacks folder
    9. Put some shaderpacks in the folder.
    10. Go back to Minecraft Shaders GUI. Click shaderpack name from the list.


    * Manual installation in minecraft.jar (for advanced user, if you don't want to use Magic Launcher)
    1. Make a backup of original minecraft.jar. (You may want it later.)
    2. Open minecraft.jar in WinRAR or 7-Zip or similar program.
    3. Delete META-INF in minecraft.jar.
    4. If you use Forge, copy files from Forge universal zip into minecraft.jar
    5. Copy files from OptiFine zip into minecraft.jar.
    6. Copy files from ShadersMod zip into minecraft.jar
    7. Close minecraft.jar file and run the game. Test it without shaderpack first.
    If the game cannot run, you may have to restore minecraft.jar from backup and try again or give up.
    8. Option... Shaders... open shaderpacks folder
    9. Put some shaderpacks in the folder
    10. Go back to Minecraft Shaders GUI. Click shaderpack name from the list.


    * ShadersMod (modified by karyonix) 1.43 (2013-02-21) stable build
    ShadersMod-mc1.4.6-ofuD5-1.43 for Minecraft 1.4.6-1.4.7 OptiFine HD Ultra D5 (2013-02-23)
    ShadersMod-mc1.4.6-ofuD4-1.43 for Minecraft 1.4.6-1.4.7 OptiFine HD Ultra D4
    ShadersMod-mc1.4.6-ofud3-1.43 for Minecraft 1.4.6-1.4.7 OptiFine HD Ultra D3
    Release note
    - Rewrite shaderpack loading.
    - Rearrange setEntity calls.

    * ShadersMod (modified by karyonix) 1.42 (2013-02-17)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Added gbuffers_skybasic and gbuffers_skytextured.

    * ShadersMod (modified by karyonix) 1.41 (2013-02-17)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Fixed black sky behind water bug from recent versions.
    - Set mc_Entity attribute = -2 for sky.

    * ShadersMod (modified by karyonix) 1.40 (2013-02-16)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Fixed abnormal reflection after changing texture pack.
    - Disable blending for hand but enable blending for hand-held ice.
    - Disable back-face culling for hand-held glass.
    - Improved error handling in validation of shader program.

    * ShadersMod (modified by karyonix) 1.39 (2013-02-16)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Improved error handling in validation of shader program.

    * ShadersMod (modified by karyonix) 1.38 (2013-02-15)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Bug: depend on LWJGL 2.8.5
    Release note
    - Improved error handling in validation of shader program.

    * ShadersMod (modified by karyonix) 1.36 (2013-02-15)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Added hand depth adjustment option.

    * ShadersMod (modified by karyonix) 1.35 (2013-02-12)
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Fixed worldTime bug (which cause black world appearance in SEUS v10) from v1.33-1.34.

    * ShadersMod (modified by karyonix) 1.34
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Fixed opaque water while holding enchanted item.

    * ShadersMod (modified by karyonix) 1.33
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Fixed invisible fire overlay
    - Fixed error while changing shaderpack

    * ShadersMod (modified by karyonix) 1.32
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    Release note
    - Compatible with Forge #518

    * ShadersMod (modified by karyonix) 1.31
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    - Bug: incompatible with forge
    Release note
    - Fixed v1.30 frame buffer bug

    * ShadersMod (modified by karyonix) 1.30
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    - Bug: incompatible with forge

    Release note
    - Add uniform variables.
    uniform ivec2 eyeBrightnessSmooth; // similar to eyeBrightness but changes smoothly in a few seconds
    uniform sampler2D gdepthtex; // depth buffer texture

    * ShadersMod (modified by karyonix) 1.28
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D3 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D2 --
    Release note
    - Update all chunks after changing shaderpack.
    - Add uniform variables.

    uniform float eyeAltitude; // y position
    uniform ivec2 eyeBrightness; // .x=light from torch,lava etc.; .y=sky light; range 0..240
    uniform int isEyeInWater; //0=no 1=yes
    uniform int hideGUI; //0=show 1=hide

    * ShadersMod (modified by karyonix) 1.26
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D2 --
    Release note
    - Change Shaders... button ID because of conflict with GuiAPI.

    * ShadersMod (modified by karyonix) 1.25
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D2 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D1 --
    Release note
    - Fixed error/crash when player gets hurt while in inventory screen.
    - Fixed fire overlay rendering.

    * ShadersMod (modified by karyonix) 1.24
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra D1 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra C3 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B6 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B5 --
    Release note
    - Added uniform int isEyeInWater.

    * ShadersMod (modified by karyonix) 1.23
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra C3 --

    * ShadersMod (modified by karyonix) 1.22
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra C2 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B6 --
    Release note
    - Fixed shadow stops working when player gets hurt.
    - Changed skip rendering of "vanilla" shadow.

    * ShadersMod (modified by karyonix) 1.21
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B6 --
    Release note
    - Fixed bright spider.
    - Added option to turn off cloud shadow.

    * ShadersMod (modified by karyonix) 1.20
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B6 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B5 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B4 --
    for Minecraft 1.4.6 - 1.4.7 OptiFine HD Ultra B2 --
    Release note
    - Added in-game shader switcher GUI (adapted from id_miner's GLSL Shaders OF).
    - Separate opaque and semi-transparent shadow depth buffers.

    * ShadersMod (modified by karyonix) 1.15
    for Minecraft 1.4.6 or 1.4.7 OptiFine HD Ultra B2 --
    for Minecraft 1.4.6 or 1.4.7 OptiFine HD Ultra B1 --
    for Minecraft 1.4.6 or 1.4.7 OptiFine HD Ultra A3 --
    Release note
    - Fixed abnormal slowness bug in v1.13-1.14.
    - Fixed deleteTexture.
    - Fixed Skeleton and Zombie Pigman damage rendering.
    - Change block damage rendering to use gbuffers_terrain.

    * ShadersMod (modified by karyonix) 1.12
    for Minecraft 1.4.6 OptiFine HD Ultra A3 --
    for Minecraft 1.4.6 OptiFine HD Ultra A2 --
    for Minecraft 1.4.5 OptiFine HD Ultra D7 --
    Release note
    - Use only with specified Minecraft version and Optifine version.
    - Fixed crash when use with ExtrabiomesXL
    - Fixed wrong texture on mod blocks (v1.11 bug)

    * ShadersMod (modified by karyonix) 1.10
    for Minecraft 1.4.6 OptiFine HD Ultra A2 --
    for Minecraft 1.4.5 OptiFine HD Ultra D7 --
    Release note
    - Use only with specified Minecraft version and Optifine version.
    - Fixed gaux4 bug

    * ShadersMod (modified by karyonix) 1.9
    for Minecraft 1.4.6 OptiFine HD Ultra A2 --
    for Minecraft 1.4.5 OptiFine HD Ultra D7 --
    Release note
    - Use only with specified Minecraft version and Optifine version.
    - Added default image for normal map, specular map
    - Added gaux4 ... has bug, cannot be used
    - Added composite1, composite2, composite3 programs
    - Fixed zero gbufferProjection bug
    - Fixed water normal vectors

    Installation for Minecraft v1.4.5-1.4.6 ShadersMod v1.9-1.15
    You need specified version of original minecraft.jar, Optifine.
    You need shaders (*.vsh, *.fsh). They are not currently included in mod zip.

    * Manual installation in minecraft.jar
    1. Make a backup of original minecraft.jar. (You may want it later.)
    2. Open minecraft.jar in WinRAR or 7-Zip or similar program.
    3. Delete META-INF in minecraft.jar.
    4. If you use Forge, copy files from Forge universal zip into minecraft.jar
    5. Copy files from OptiFine zip into minecraft.jar.
    6. Copy files from ShadersMod zip into minecraft.jar
    7. Copy *.fsh *.vsh files into minecraft.jar/shaders (or leave it empty and copy *.fsh *.vsh into .minecraft/shaders folder instead)
    8. Finished. Run minecraft.

    * Installation for use with Magic Launcher
    1. Open Magic Launcher.
    2. Click Setup button.
    3. Select or create configuration you want to use.
    4. If you use Forge, add Forge universal zip.
    5. Add OptiFine zip (below Forge universal if used together).
    6. Add ShadersMod zip below OptiFine.
    7. Add shaders zip file (which has *.fsh *.vsh in shaders folder inside zip)
    8. OK

    * How to use version 1.12-1.15 of ShadersMod with SEUS-v10rc6
    A. Manual install in minecraft.jar
    Open minecraft.jar in 7-Zip
    Delete META-INF
    Copy files from mod zip into minecraft.jar in this order
    : (forge), optifine, SEUS-v10rc6, newer ShadersMod
    B. Merge newer ShadersMod into SEUS-v10rc6 zip (for use with Magic Launcher)
    Replace .class files in SEUS-v10rc6 zip with .class files from newer ShadersMod.
    C. Simply use Magic Launcher
    Add SEUS-v10rc6 zip file below OptiFine and above newer ShadersMod.
    Add newer ShadersMod below SEUS-v10rc6.

    Nitrous patch releases (for Minecraft 1.4.2-1.4.5)
    * GLSL Shaders mod for Minecraft 1.4.5 modified by karyonix v1.1
    Download
    Release note
    - Add shader filename to log when there is compilation error.

    * GLSL Shaders mod for Minecraft 1.4.5 modified by karyonix v1.0
    Download
    Release note
    - Update for minecraft 1.4.5

    * GLSL Shaders mod for Minecraft 1.4.2 modified by karyonix v4
    Download
    Release note
    - Fixed gbuffers_water compatibility with Optifine.
    - Compatible with Default, Smooth, Multi-Core chunk loading in Optifine.
    - Not support anisotropic filtering, anti-aliasing, connected texture.
    - As a result of gbuffers_water fix, unmodified
    Sonic Ether's Unbelievable Shaders v10 rc5
    (not included in this mod) will not render its good-looking water. To restore water rendering of SEUSv10rc5, delete the supplied gbuffers_water.vsh and .fsh then duplicate gbuffers_textured_lit.vsh and .fsh and rename them to gbuffers_water.vsh and .fsh, replacing deleted files.
    - the included shaders files in this package is from daxnitro's package combined with "Waving Grass, Wheat, Leaves, Flowers, Fire, Lava, Vines, and Lily Pads" and "Waving Water" from
    Dax's wiki
    . It has no shadow or bump map/normal map feature.

    * GLSL Shaders mod for Minecraft 1.3.2 modified by karyonix v4
    Download
    Release note
    - Fixed gbuffers_water compatibility with Optifine.
    - Compatible with Default, Smooth, Multi-Core chunk loading in Optifine.
    - Not support anisotropic filtering, anti-aliasing, connected texture.
    - As a result of gbuffers_water fix, unmodified
    Sonic Ether's Unbelievable Shaders v10 rc5
    (not included in this mod) will not render its good-looking water. To restore water rendering of SEUSv10rc5, delete the supplied gbuffers_water.vsh and .fsh then duplicate gbuffers_textured_lit.vsh and .fsh and rename them to gbuffers_water.vsh and .fsh, replacing deleted files.
    - the included shaders files in this package is from daxnitro's package combined with "Waving Grass, Wheat, Leaves, Flowers, Fire, Lava, Vines, and Lily Pads" and "Waving Water" from
    Dax's wiki
    . It has no shadow or bump map/normal map feature.

    Installation for nitrous patch releases
    Installation (minecraft 1.4.2)
    - Make a copy of minecraft.jar v1.4.2
    - (Optional, recommended) Extract Optifine Ultra for Minecraft 1.4.2 to a folder. Use 7-zip or WinRAR to add all extracted files in your modded minecraft.jar
    (This mod can work without Optifine, but with limited functionality)
    - Extract GLSL mod package to a folder.
    - Run nitrous.jar in Shaders folder.
    If you cannot run it by double-click, you may run it from command-line or batch file.
    java -jar nitrous.jar
    - In nitrous, select Options tab. Browse for your modded minecraft.jar.
    - Select Local Mods tab. Click Install Mods.
    - View Log. Check for error message.
    - Replace .minecraft\bin\minecraft.jar with you modded minecraft.jar
    or use Magic Laucher to select your modded minecraft.jar and run it.

    Installation for use with SEUS v10 rc5 on Minecraft 1.4.2
    Sonic Ether's Unbelievable Shaders is a popular alternative shaders set. (not included in daxnitro's GLSL Shaders mod and this updated mod)
    It has shadow, normal mapping, specular, glossy reflection.
    It was availiable for download from Sonic Ether's facebook page.
    It comes with GLSL Shaders mod for Minecraft 1.3.1 .
    If you have a copy of Sonic Ether's Unbelievable Shaders v10rc5, you can install it together with this updated GLSL Shaders mod.
    1. Download
    1.1 Clean minecraft.jar version 1.4.2
    1.2 OptiFine HD A7 Ultra for Minecraft 1.4.2
    1.3 GLSL Shaders mod for Minecraft 1.4.2 modified by karyonix v4
    1.4 SEUS v10 RC5 for Minecraft 1.3.1
    1.5 texture pack : Ovo's Rustic Pack.

    2. Extract these files in separate folders.
    OptiFine_1.4.2_HD_U_A7.zip
    SEUS v10 RC5 for Minecraft 1.3.1.zip
    Shaders-2.1.6-mc1.4.2-mod4.zip

    3. Make a backup copy of original minecraft.jar, just in case.

    4. Install Optifine
    4.1 Make a copy of minecraft.jar, rename to minecraft-o.jar .
    4.2 Open minecraft-o.jar in WinRAR or 7-zip.
    4.3 Delete META-INF in minecraft-o.jar .
    4.4 Copy all files from extracted OptiFine_1.4.2_HD_U_A7\ into minecraft-o.jar .
    4.5 Close WinRAR or 7-zip.

    5. Prepare installer for GLSL Shader mod + SEUS
    5.1 Delete SEUS v10 RC5 for Minecraft 1.3.1\Shaders Only\gbuffers_water.vsh and gbuffers_water.fsh.
    5.2 Duplicate gbuffers_textured_lit.vsh and rename the copy to gbuffers_water.vsh, replacing deleted files.
    5.3 Duplicate gbuffers_textured_lit.fsh and rename the copy to gbuffers_water.fsh, replacing deleted files.
    5.4 Copy all files in SEUS v10 RC5 for Minecraft 1.3.1\Shaders Only\
    to Shaders-2.1.6-mc1.4.2-mod4\Shaders\mods\shaders\contents\files\shaders\ .

    6. Run nitrous
    6.1 Make a copy of minecraft-o.jar, rename to minecraft-seus.jar
    6.2 Run inst.exe or nitrous.jar in Shaders-2.1.6-mc1.4.2-mod4\Shaders\
    6.3 In nitrous, select tab Options. Browse for your minecraft-seus.jar
    6.4 Go back to tab Local Mod. There should be 1 mod.
    6.5 Make sure your minecraft-seus.jar is not opened in other programs.
    6.6 Click Install.
    6.7 Click View Log. Check error message.
    6.8 Close nitrous.

    7. Prepare texture
    7.1 Open Paint or GIMP or other program, create 16x16 pixels image filled with magenta(255,0,255), export/save as custom_water_still.png and custom_water_flowing.png .
    7.2 Make a copy of Ovo's Rustic pack, rename to Ovo's Rustic SEUS.zip
    7.3 Open Ovo's Rustic SEUS.zip in WinRAR or 7-zip
    7.4 Copy everything in SEUS v10 RC5 for Minecraft 1.3.1\Ovo's SEUS Patch to Ovo's Rustic SEUS.zip except terrain.png .
    7.5 Overwrite Ovo's Rustic SEUS.zip\custom_water_still.png and custom_water_flowing.png with the magenta images.
    7.6 Close WinRAR or 7-zip.

    8. If you use Magic Launcher, you can just click Setup and Select then browse for minecraft-seus.jar.
    If your want to run it from normal Minecraft Launcher, rename minecraft-seus.jar to minecraft.jar .

    9. Login and change settings.
    Texture Packs > Ovo's Rustic SEUS.zip
    Option... > Video Settings... >
    Chunk Loading: Default
    Option... > Video Settings... > Quality... >
    Mipmap Level: Max
    Mipmap Type: Linear
    Anisotropic Filtering: OFF
    Antialiasing: OFF
    Custom Colors: ON
    Connected Textures: OFF
    Natural Textures: OFF
    Done

    10. Optionally, add some files to your minecraft-seus.jar (or minecraft.jar) to reduce "too bright" problem with unsupported texture pack.
    { http://www.minecraftforum.net/topic/940974-125sonic-ethers-unbelievable-shaders-glsl-shaders-dynamic-shadows-more/page__st__11680#entry18603103 }
    If unsupported texture pack has its own lightmap, this does not work though.

    Related Pages

    GLSL Shaders Mod by daxnitro
    GLSL Shaders OF by id_miner
    GLSL Shaders Mod modified by karyonix
    OptiFine by sp614x
    Magic Launcher by sp614x
    Sonic Ether's Unbelievable Shaders
    Sonic Ether's facebook page



    Posted in: Minecraft Mods
  • View Benimatic's Profile

    1192

    Aug 19, 2011
    Benimatic posted a message on The Twilight Forest (v2.3.5: Wrecking Block)

    Imagine stepping through a portal into a twilight realm, filled with trees as far as they eye can see. Breathtaking vistas and amazing discoveries await you around every corner. But beware! Not all denizens of the forest respond to your intrusion lightly.

    Updated March 29th to version 2.3.5. This version supports Minecraft 1.7.10. New in this version, the Snow Queen rules over the Aurora Palace high atop the glacier, while trolls inhabit caves deep in the rock of the highlands. In addition to these new areas to explore, this version also revises the progression system to feature very visible weather effects in "locked" biomes, instead of less-visible magic effects. Version 2.3.4 adds a /tfprogress command to advance a player's progress, as well as hint monsters that may appear if you're struggling with the progression system. Version 2.3.5 fixes bugs, adds the knightmetal block-and-chain tool and adds a bit of new swamp scenery.

    If you haven't played one of the 2.0 versions, there is a new progression system. See the details on the wiki page.

    Download:

    Support:
    Support this mod on www.patreon.com/benimatic.
    Follow me on Twitter: @benimatic.

    Old Versions:

    Download v2.3.3 - universal mod package for Minecraft 1.7.10. Requires Minecraft Forge 10.13.2.1291 or higher. Uploaded 2/7/14

    Download v2.3.2 - universal mod package for Minecraft 1.7.10. Requires Minecraft Forge 10.13.0.1199 or higher. Uploaded 9/22/14

    Download v2.3.1 - universal mod package for Minecraft 1.7.10. Requires Minecraft Forge 10.13.0.1199 or higher. Uploaded 9/18/14

    Download v2.2.3 (mirror)- universal mod package for Minecraft 1.7.2. Also supports 1.7.10. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 7/17/14

    Download v2.2.1(mirror)- universal mod package for Minecraft 1.7.2. Also supports 1.7.10. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 7/12/14

    Download v2.2.0(mirror)- universal mod package for Minecraft 1.7.2. Also supports 1.7.10. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 6/29/14

    Download v2.1.1 - universal mod package for Minecraft 1.7.2. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 6/14/14

    Download v2.1.0 - universal mod package for Minecraft 1.7.2. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 6/8/14

    Download v2.0.3 - universal mod package for Minecraft 1.7.2. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 3/10/14

    Download v2.0.2 - universal mod package for Minecraft 1.7.2. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 3/6/14

    Download v2.0.1 - universal mod package for Minecraft 1.7.2. Requires Minecraft Forge 10.12.0.1024 or higher. Uploaded 3/4/14

    Download v1.20.4 - universal mod package for Minecraft 1.6.4. Requires Minecraft Forge 9.11.0.916 or higher. Uploaded 3/15/14

    Download v1.20.3 - universal mod package for Minecraft 1.6.4. Requires Minecraft Forge 9.11.0.916 or higher. Uploaded 11/26/13

    Download v1.20.2 - universal mod package for Minecraft 1.6.4. Requires Minecraft Forge 9.11.0.916 or higher. Uploaded 11/11/13

    Download v1.20.1 - universal mod package for Minecraft 1.6.4. Requires Minecraft Forge 9.11.0.916 or higher. Uploaded 10/7/13

    Download v1.20.0 - universal mod package for Minecraft 1.6.4. Requires Minecraft Forge 9.11.0.880 or higher. Uploaded 9/22/13

    Download v1.19.3 - universal mod package for Minecraft 1.6.2. Requires Minecraft Forge 9.10.0.804 or higher. Uploaded 9/8/13

    Download v1.19.0 - universal mod package for Minecraft 1.6.2. Requires Minecraft Forge 9.10.0.790 or higher. Uploaded 8/4/13

    Download v1.18.2 - universal mod package for Minecraft 1.5.2. Requires Minecraft Forge 7.8.0.684 or higher. Uploaded 6/30/13

    Download v1.18.1 - universal mod package for Minecraft 1.5.2. Requires Minecraft Forge 7.8.0.684 or higher. Uploaded 5/27/13

    Download v1.18.0 - universal mod package for Minecraft 1.5.2. Requires Minecraft Forge 7.8.0.684 or higher. Uploaded 5/11/13

    Download v1.17.2 - universal mod package for Minecraft 1.5.1 or 1.5.2. Requires Minecraft Forge 7.7.0.600 or higher. Uploaded 4/30/13

    Download v1.17.1 - universal mod package for Minecraft 1.5.1 or 1.5.2. Requires Minecraft Forge 7.7.0.600 or higher. Uploaded 3/30/13

    Download v1.17.0 - universal mod package for Minecraft 1.5.1 or 1.5.2. Requires Minecraft Forge 7.7.0.600 or higher. Uploaded 3/21/13

    Download v1.16.3 - universal package for Minecraft 1.5.0. Requires Minecraft Forge 7.7. Uploaded 3/20/13

    Download v1.16.2 - universal package for Minecraft 1.5.0. Requires Minecraft Forge 7.7. Uploaded 3/18/13

    Download v1.15.4 - universal package for Minecraft 1.4.7. Requires Minecraft Forge 6.6. Uploaded 3/2/13

    Download v1.15.3 (adf.ly link) - universal package for Minecraft 1.4.7. Requires Minecraft Forge 6.6. Uploaded 2/16/13

    Download v1.15.2 - universal package for Minecraft 1.4.7. Requires Minecraft Forge 6.6. Uploaded 2/10/13

    Download v1.15.1 - universal package for Minecraft 1.4.7. Requires Minecraft Forge 6.6. Uploaded 1/19/13

    Download v1.15.1 - universal package for Minecraft 1.4.7. Requires Minecraft Forge 6.6. Uploaded 1/12/13

    Download v1.14.0 - universal package for Minecraft 1.4.6. Requires Minecraft Forge 6.5. Uploaded 12/21/12

    Download v1.13.2 - universal package for Minecraft 1.4.5. Requires Minecraft Forge 6.4. Uploaded 12/16/12

    Download v1.13.1 - universal package for Minecraft 1.4.5. Requires Minecraft Forge 6.4. Uploaded 11/26/12

    Download v1.13.0 - universal package for Minecraft 1.4.4 or Minecraft 1.4.5. Requires Minecraft Forge 6.3 (for 1,4,4) or Forge 6.4 (for 1.4.5). Uploaded 11/14/12

    Download v1.12.3 - universal package for Minecraft 1.4.2. Requires Minecraft Forge 6.0.1.whatever. Uploaded 11/14/12

    Download v1.12.2 - universal package for Minecraft 1.4.2. Requires Minecraft Forge 6.0.1.whatever. Uploaded 11/5/12

    Download v1.12.0 - universal package for Minecraft 1.4.2. Requires Minecraft Forge. Uploaded 10/25/12

    Download v1.11.11 - package for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 10/19/12

    Download v1.11.10 - package for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 10/6/12

    Download v1.11.8 - package for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 9/27/12

    Download v1.11.5 - package for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 9/11/12

    Download v1.11.4 - universal files for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 9/3/12

    Download v1.11.3 - universal files for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 8/26/12

    Download v1.11.1 - universal files for Minecraft 1.3.2. Requires Minecraft Forge. Uploaded 8/20/12

    Download v1.10.1 - client files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 6/8/12

    Download v1.10.1 - server - server files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 6/8/12
    Download v1.10.0 - client files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 6/5/12


    Download v1.9.1 - client files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 6/3/12

    Download v1.9.1 - server - server files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 6/3/12


    Download v1.9.0 - client files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 5/1/12

    ]Download v1.9.0 - server - server files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 5/1/12

    Download v1.8.1 - client files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 4/19/12 Updated 4/22 - fixed a few stray pixels on the items and armors.

    Download v1.8.1 - server - server files for Minecraft 1.2.5. Requires Minecraft Forge. It is highly recommended that you update your forge to 3.1.2.90 or newer. Uploaded 4/19/12

    Download v1.8.0 - client files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 4/8/12

    Download v1.8.0 - server - server files for Minecraft 1.2.5. Requires Minecraft Forge. Uploaded 4/8/12


    Download v1.7.2 - client files for Minecraft 1.2.4. Requires Minecraft Forge (& ModLoader & ModloaderMp). Uploaded 4/1/12 (Re-uploaded on 4/3 to fix a bug causing more-than-usual lag in SMP. Download the file again if you're having that problem.)

    Download v1.7.2 - server - server files for Minecraft 1.2.4. Requires Minecraft Forge (& ModloaderMp). Uploaded 4/1/12
    Download v1.7.1 - client files for Minecraft 1.2.3. Requires Minecraft Forge. Uploaded 3/13/12

    Download v1.7.1 - server - server files for Minecraft 1.2.3. Requires Minecraft Forge. Uploaded 3/13/12

    Download v1.7.0 - client files for Minecraft 1.2.3. Uploaded 3/8/12

    Download v1.6r2 - client files for Minecraft 1.1. Uploaded 1/26/12

    Download Server v1.6r2 - server files for Minecraft 1.1. Only needed for a multiplayer server, of course. Uploaded 1/26/12

    Download v1.6 - for Minecraft 1.1. Uploaded 1/20/12

    Download v1.5 - for Minecraft 1.0. Uploaded 11/29/11

    Download v1.4 - for Minecraft 1.8.1. Uploaded 11/02/11

    Download v1.3 - for Minecraft 1.8.1. Uploaded 10/04/11

    Download v1.2 - for Minecraft 1.8.1. Uploaded 9/27/11

    Download v0.1p4 -updated 08/22 - for Minecraft 1.7.3. Note that saves from previous updates are not fully compatible so you will have to start a new game.

    Download server mod 0.1p4 - for Minecraft 1.7.3. Only needed if you are running an SMP server. To install, drop files into the minecraft_server.jar. Note that it replaces the normal world, so you will need to generate a new world to use this.

    Change Log:
    View the change log on the wiki.

    FAQ:
    View the FAQ on the wiki.

    Installation Instructions:
    View the installation instructions on the wiki.

    Getting There:
    To make a portal to the Twilight Forest, make a 2 x 2 shallow pool (4 squares) of water in a grassy area, and surround it entirely with natural stuff. Flowers, mushrooms or tall grass. Then throw a diamond in (with the "Q" key, by default) and stand back!

    It should look a little like this:



    Videos:

    Loooks has a great video showing some scenes from the mod here. Very tranquil.

    Direwolf20's wonderful mod spotlight video should whet your appetite for some exploration:

    The Yogscast explores the Twilight Forest, Part 1:

    Yogscast Part 2:

    Yogscast Part 3:
    Lots more videos in this spoiler tag here! Some installation guides and some more mod showcases.
    Paulsoaresjr takes on the Twilight Forest in his Man vs. Minecraft series. Episode 1 below, but check out the whole series.

    Loooks has a great video spotlighting some of the new features here. Very tranquil.

    Minecraftmoe shows you some views of the Twilight Forest with some epic music.
    GameChap and Bertie are always entertaining. Here is their video showcasing the latest version:


    Installation guide by SCMowns:

    RoosterInASuit does a nice install guide/spotlight:

    Runemaster96 does a very nice job with a mod showcase here:

    Piedudeaus's Mod Spotlight:

    GeraldoCockerhan fights the naga and wins!

    Elliothawk has an in-depth exploration video:

    MinecraftScorpion does a Mod Showcase:

    Spelunkstar has a two-part video:


    Older (but still good) Videos
    Etalyx's Mod Spotlight:







    Mod Pack Policy:
    Please note that I don't usually have the time to respond to mod pack requests (or private messages in general).

    You have permission to include the Twilight Forest mod in any mod pack, as long as the following conditions are met:
    1. Provide a link to this forum post
    2. Properly credit the author, Benimatic
    3. You cannot make any money off of the mod pack
    4. Remove the mod from your pack if I specifically request it
    Texture Packs:
    The Twilight Forest is fully supported in the Zekocraft texture pack. I love it!

    Also there's the strange and wonderful Ruinex texture pack has textures for this mod.

    Please let me know about other texture packs.

    Banner:
    KensuleNL made a great banner for your signature:

    <a href="http://www.minecraftforum.net/topic/561673-100the-twilight-forest-v15"><img src='http://i.imgur.com/sEFug.png' /></a>
    [represent]

    Posted in: Minecraft Mods
  • View RealLan's Profile

    36

    Oct 26, 2012
    RealLan posted a message on [1.5.2] RealLan (Better Lan Servers) More Commands and fixes!

    The original LAN mod. There are some mods which we gave permission to use some of our code.
    ______________________________________________________________________________________


    UPDATED TO 1.5.2!
    RealLan is a minecraft mod that adds more to your lan server. It gives you many necessary commands like /ban,/kick,/whitelist,/op, and all other real Minecraft Server commands.

    Over 20,000 Downloads! :)

    Also, RealLan fixes the "You logged in from another location" vulnerability that will take down your lan server and it lets people not from your local network connect to your server with port forwarding or a VPN client (eg LogMeIn Hamachi) like a real minecraft server. It will always open on port 25565 by default or you can choose to open to another port.

    Magic Launcher compatible!

    The owner of the LAN Server is automatically Opped, where they have the permission to op other players.

    NEW! Chat colours! Made to be the same as the bukkit color codes. http://ess.khhq.net/mc/

    Current list of commands:
    For op:
    - /back
    - /ban
    - /ban-ip (You can put the person's name and it will ban their IP)
    - /bank
    - /bank-balance
    - /bank-create
    - /bank-pay
    - /bank-set
    - /banlist
    - /broadcast
    - /buy (No blocks, only items)
    - /clear
    - /debug
    - /defaultgamemode
    - /deop
    - /difficulty
    - /dragonnuke
    - /effect
    - /emergencyunfreeze
    - /enchant
    - /explode
    - /feed
    - /fireworks
    - /fog
    - /gamemode
    - /gamerule
    - /give
    - /gm
    - /god
    - /heal
    - /help
    - /home
    - /kick
    - /kill
    - /killall
    - /kittycannon
    - /list
    - /listall
    - /me
    - /nick
    - /ninja (I know its not clear in the name, but this creates a controlled explosion)
    - /ninjafill
    - /op
    - /pardon
    - /pardon-ip
    - /powertool
    - /prefix
    - /pvp
    - /resetlogin
    - /safezone
    - /save-all
    - /save-off
    - /save-on
    - /say
    - /scoreboard
    - /seed
    - /sell
    - /sethome
    - /setspawn
    - /setwarp
    - /spawn
    - /spawnmob
    - /spawnpoint
    - /stop
    - /tell
    - /time
    - /toggledownfall
    - /tp
    - /weather
    - /tpa
    - /unban
    - /unbanip
    - /vanish
    - /warp
    - /weather
    - /whitelist
    - /whois
    - /xp

    + There is also a GUI where you can select what commands non-Op players can use.


    How to install:
    1) Download the latest version from here (http://adf.ly/E4Z0G)
    2) Copy the files into your minecraft.jar that is in your Bin directory
    -> [Windows: %appdata%/.minecraft/bin ]
    -> [Mac: ~/Library/Application Support/minecraft ]
    -> [Linux: (your user directory)/.minecraft/bin ] (In linux, your minecraft folder is hidden by default to help your folder look less packed. You may need to do CTRL+H to see hidden folders)
    3) Delete META-INF from your minecraft.jar
    4) Open your minecraft with your ordinary Minecraft launcher
    5) Start a lan server as usual


    Latest version:
    - MC 1.5.2 - (http://adf.ly/E4Z0G)
    Older versions of the mod:
    - MC 1.5.1 (http://adf.ly/OYDE5)
    - MC 1.5 (http://adf.ly/LiOE8)
    - MC 1.4.6/7 - (http://adf.ly/KvQWc)
    - MC 1.4.4/5 - (http://adf.ly/GFCiD)
    - MC 1.4.2 - (http://adf.ly/Es0Zm)


    These are the links you are looking for!


    Since it is taking a while for me to make the next version, I have decided not to make you guys wait and post a nightly development build with the most stable version of the day. You can download the latest build here:
    Latest dev build: 1.5.1 http://adf.ly/978822/reallandevbuild


    Videos:
    English




    Portuguese




    NOTE: You can reply to this thread with commands you want to see in future updates, problems you want us to fix, bugs we didn't notice or really anything you want to tell us and we will acknowledge each and every reply.

    This is a non-profit mod and the only reason we use adf.ly as our host is to track the number of downloads.

    Team:
    Zach Itzcovitch - Main developer

    Jdembo - Forge compatibility (NOT YET MADE)
    Aziz Hazanain - Helped with the GUIs


    Feel free to comment any bugs, problems, questions, or anything of relation.

    If RealLan has helped you, please donate. Every cent counts!




    TERMS AND CONDITIONS

    TERMS AND CONDITIONS
    0. USED TERMS
    MOD - modification, plugin, a piece of software that interfaces with the Minecraft client to extend, add, change or remove original capabilities.
    MOJANG - Mojang AB
    OWNER - Zachary Itzcovitch, Original author(s) of the MOD. Under the copyright terms accepted when purchasing Minecraft (
    http://minecraft.net/copyright.jsp) the OWNER has full rights over their MOD despite use of MOJANG code.
    USER - End user of the mod, person installing the mod.

    1. LIABILITY
    THIS MOD IS PROVIDED 'AS IS' WITH NO WARRANTIES, IMPLIED OR OTHERWISE. THE OWNER OF THIS MOD TAKES NO RESPONSIBILITY FOR ANY DAMAGES INCURRED FROM THE USE OF THIS MOD. THIS MOD ALTERS FUNDAMENTAL PARTS OF THE MINECRAFT GAME, PARTS OF MINECRAFT MAY NOT WORK WITH THIS MOD INSTALLED. ALL DAMAGES CAUSED FROM THE USE OR MISUSE OF THIS MOD FALL ON THE USER.

    2. USE
    Use of this MOD to be installed, manually or automatically, is given to the USER without restriction.

    3. REDISTRIBUTION
    This MOD may only be distributed where uploaded, mirrored, or otherwise linked to by the OWNER solely. All mirrors of this mod must have advance written permission from the OWNER. ANY attempts to make money off of this MOD (selling, selling modified versions, adfly, sharecash, etc.) are STRICTLY FORBIDDEN, and the OWNER may claim damages or take other action to rectify the situation.

    4. DERIVATIVE WORKS/MODIFICATION
    This mod is provided freely and may be decompiled and modified for private use, either with a decompiler or a bytecode editor. Public distribution of modified versions of this MOD require advance written permission of the OWNER and may be subject to certain terms.




    © copyright 2012-11-01 13:46:19 UTC - All Rights Reserved
    Posted in: Minecraft Mods
  • View zomb69's Profile

    1

    Dec 12, 2012
    zomb69 posted a message on GLSL Shaders OF
    i have pretty much finished textures for Vondoomcraft bumpmap and detailed reflections check it out

    Posted in: Minecraft Mods
  • View Randomness3333's Profile

    1

    Nov 28, 2012
    Randomness3333 posted a message on Imagine the above avatar as the ruler of the world...
    slenderman ruling the world. WHY ME!?!?!?!?!?

    and this
    Posted in: Forum Games
  • View SCMowns's Profile

    6

    Nov 23, 2012
    SCMowns posted a message on Familiars *new* Herobrine, Notch, Chuck Norris
    Epic mod! I had so much fun xD

    I have made a review / tutorial for your mod!
    Congrats on popular! I know I'm early, but i'm sure you'll hit it after this video!

    Posted in: Minecraft Mods
  • View LuisAdeur's Profile

    1

    Nov 22, 2012
    LuisAdeur posted a message on How far have you gotten in Hardcore mode?
    I was already with a big place in the overworld all full of machines and stuff from mods and in the nether had a base for ore processing and lava processing. i had like 1000+ days in minecraft days. and then i went to the end and when i spawned a enderman push me to the void and died ...
    but i manage to save the file. when you die don't put delete world . close minecraft and if the world got deleted go to %appdata% / .minecraft in saves> right click > properties > previous versions > restore from last day and it will show same day but like 10 minutes before you died.
    Posted in: Survival Mode
  • View Kovu's Profile

    12

    Nov 17, 2012
    Kovu posted a message on General Java Tutorials
    Hey, welcome to my general Java Tutorials.

    Before you mod, you should have at least a basic understanding of how Java works, and the basic syntax of methods and classes. This will be a large expansion of text-based Java tutorials that will help prepare you for venturing into the world of modding. This will help with jbond98's modding tutorials.

    This will be in multiple parts, ranging from the basics to advanced topics.

    ALL of these tutorials will be done under Java 6, although they should all work correctly if you have Java 7 installed on your computer. I will not be teaching you how to set up your IDE and download the correct JDK, you should have those as prerequisites already. Most of these are from Oracle's tutorials, but I moved some here for easy access.

    Each category, (Basic, Beginner, Intermediate, Advanced, User Requests), will be separated. Also, note that the Basic tutorials will be mostly reading and conceptual ideas that are central in Java.

    Thanks to Lord_Ralex to helping me format this.

    Table of Contents:

    Basic Tutorials

    • Data Types

    • boolean
    • byte
    • short
    • int
    • long
    • float
    • double
    • char
    • String
    • Variables

    • Local
    • Instance
    • Class
    • Parameter
    • Naming
    • Default Values
    • Classes
    • Objects
    • Inheritance
    • Packages
    • Literals

    • Integer
    • Floating Point
    • Character and String
    • Class
    • Using Underscores
    • Arrays
    • Expressions, Statements, and Blocks
    • If and Else Statements
    • Switch Statements
    Beginner Tutorials
    Intermediate Tutorials

    Advanced Tutorials
    • Reflection
    User Requested Tutorials
    • Annotations (@)











    --------------------------------------
    Basic Tutorial
    ---------------------------------------



    --------------------------------------
    Data Types:
    --------------------------------------

    The Java programming language is statically-typed, which means that all variables must first be declared before they can be used. This involves stating the variable's type and name, as you've already seen:
    int cpus = 1;


    Doing so tells your program that a field named "cpus" exists, holds numerical data, and has an initial value of "1". A variable's data type determines the values it may contain, plus the operations that may be performed on it. In addition to int, the Java programming language supports seven other primitive data types. A primitive type is predefined by the language and is named by a reserved keyword. Primitive values do not share state with other primitive values. The eight primitive data types supported by the Java programming language are:

    boolean
    The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.

    byte
    The byte data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters. They can also be used in place of int where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation.

    short
    The short data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive). As with byte, the same guidelines apply: you can use a short to save memory in large arrays, in situations where the memory savings actually matters.

    int
    The int data type is a 32-bit signed two's complement integer. It has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive). For integral values, this data type is generally the default choice unless there is a reason (like the above) to choose something else. This data type will most likely be large enough for the numbers your program will use, but if you need a wider range of values, use long instead.

    long
    The long data type is a 64-bit signed two's complement integer. It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (inclusive). Use this data type when you need a range of values wider than those provided by int.

    float
    The float data type is a single-precision 32-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in the Floating-Point Types, Formats, and Values section of the Java Language Specification. As with the recommendations for byte and short, use a float (instead of double) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead. Numbers and Strings covers BigDecimal and other useful classes provided by the Java platform.

    double
    The double data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in the Floating-Point Types, Formats, and Values section of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency.

    char
    The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive).

    String
    In addition to the eight primitive data types listed above, the Java programming language also provides special support for character strings via the java.lang.String class. Enclosing your character string within double quotes will automatically create a new String object; for example, String s = "this is a string";. String objects are immutable, which means that once created, their values cannot be changed. The String class is not technically a primitive data type, but considering the special support given to it by the language, you'll probably tend to think of it as such. You'll learn more about the String class in Simple Data Objects


    --------------------------------------
    Variables:
    --------------------------------------

    An object stores its state in fields.
    int cadence = 0;
    int speed = 0;
    int gear = 1;


    In the Java programming language, the terms "field" and "variable" are both used; this is a common source of confusion among new developers, since both often seem to refer to the same thing.

    The Java programming language defines the following kinds of variables:

    Local
    Similar to how an object stores its state in fields, a method will often store its temporary state in local variables. The syntax for declaring a local variable is similar to declaring a field (for example, int count = 0;). There is no special keyword designating a variable as local; that determination comes entirely from the location in which the variable is declared — which is between the opening and closing braces of a method. As such, local variables are only visible to the methods in which they are declared; they are not accessible from the rest of the class.

    Instance
    Technically speaking, objects store their individual states in "non-static fields", that is, fields declared without the static keyword. Non-static fields are also known as instance variables because their values are unique to each instance of a class (to each object, in other words); the currentSpeed of one computer is independent from the currentSpeed of another.

    Class
    A class variable is any field declared with the static modifier; this tells the compiler that there is exactly one copy of this variable in existence, regardless of how many times the class has been instantiated. A field defining the number of CPUs for a particular kind of computer could be marked as static since conceptually the same number of CPUs will apply to all instances. The code static int numCPUs = 6; would create such a static field. Additionally, the keyword final could be added to indicate that the number of CPUs will never change.

    Parameter
    You've already seen examples of parameters, in the Computer class. Recall that the signature for the main method is public static void main(String[] args). Here, the args variable is the parameter to this method. The important thing to remember is that parameters are always classified as "variables" not "fields". This applies to other parameter-accepting constructs as well (such as constructors and exception handlers) that you'll learn about later in the tutorial.

    Having said that, the remainder of this tutorial uses the following general guidelines when discussing fields and variables. If we are talking about "fields in general" (excluding local variables and parameters), we may simply say "fields". If the discussion applies to "all of the above", we may simply say "variables". If the context calls for a distinction, we will use specific terms (static field, local variables, etc.) as appropriate. You may also occasionally see the term "member" used as well. A type's fields, methods, and nested types are collectively called its members.


    --------------------------------------
    Naming:
    --------------------------------------

    Every programming language has its own set of rules and conventions for the kinds of names that you're allowed to use, and the Java programming language is no different. The rules and conventions for naming your variables can be summarized as follows:

    Variable names are case-sensitive. A variable's name can be any legal identifier — an unlimited-length sequence of Unicode letters and digits, beginning with a letter, the dollar sign "$", or the underscore character "_". The convention, however, is to always begin your variable names with a letter, not "$" or "_". Additionally, the dollar sign character, by convention, is never used at all. You may find some situations where auto-generated names will contain the dollar sign, but your variable names should always avoid using it. A similar convention exists for the underscore character; while it's technically legal to begin your variable's name with "_", this practice is discouraged. White space is not permitted.

    Subsequent characters may be letters, digits, dollar signs, or underscore characters. Conventions (and common sense) apply to this rule as well. When choosing a name for your variables, use full words instead of cryptic abbreviations. Doing so will make your code easier to read and understand. In many cases it will also make your code self-documenting; fields named cadence, speed, and gear, for example, are much more intuitive than abbreviated versions, such as s, c, and g. Also keep in mind that the name you choose must not be a keyword or reserved word.

    If the name you choose consists of only one word, spell that word in all lowercase letters. If it consists of more than one word, capitalize the first letter of each subsequent word. The names cpuRatio and currentCPU are prime examples of this convention. If your variable stores a constant value, such as static final int NUM_CPUS = 6, the convention changes slightly, capitalizing every letter and separating subsequent words with the underscore character. By convention, the underscore character is never used elsewhere.


    --------------------------------------
    Default Values:
    --------------------------------------

    It's not always necessary to assign a value when a field is declared. Fields that are declared but not initialized will be set to a reasonable default by the compiler. Generally speaking, this default will be zero or null, depending on the data type. Relying on such default values, however, is generally considered bad programming style.

    The following chart summarizes the default values for the above data types.

    Data Type | Default Value (for fields)
    byte | 0
    short |0
    int |0
    long |0L
    float |0.0f
    double |0.0d
    char |'\u0000'
    String (or any object) | null
    boolean | false

    Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable. If you cannot initialize your local variable where it is declared, make sure to assign it a value before you attempt to use it. Accessing an uninitialized local variable will result in a compile-time error.


    --------------------------------------
    Classes:
    --------------------------------------

    In real life, you'll find many instances of a specific object. For example, computers. All computers do the fundamentally same thing, but they have different specific parts. Each computer is built from blueprints, and then slightly modified to fit the user's needs. In object-oriented terms, we say that your computer is an instance of the class of objects known as computers. A class is the blueprint from which individual objects are created.

    For example, look at the following. (You do not need to be able to understand it, just read it)
    class Computer {
    int numOfScreens = 1;
    int numOfGPUs = 1;
    int clockSpeed = 3;
    
    public void checkScreens(int numOfScreens) {
    numOfScreens = newValue;
    }
    
    public void clockGPUs(int numOfGPUs) {
    int newSpeed = numOfGPUs + 1 * clockSpeed;
    System.out.println(newSpeed);
    }
    }


    The syntax will look alien, but it's really not that bad. The fields numOfScreens, numOfGPUs, and clockSpeed represent the Object's state, and the methods checkSums and clockGPUs define it's interactions with other classes and objects. This code, on it's own, does not run, as it does not contain the main() method. This is just a blueprint for each computer you want to run. It's the responsibility of creating and using new Computer objects belongs to some different class in your application.

    Here's an example that WILL run:
    class ComputerDemo {
    public static void main(String[] args) {
    
    //Create two different Computer Objects
    Computer com1 = new Computer();
    Computer com2 = new Computer();
    
    //Invoke methods on these objects
    com1.clockGPUs(100);
    com2.clockGPUs(321);
    }
    }


    This code, combined with the example above, will run. Look in the console to see what it prints.


    --------------------------------------
    Objects:
    --------------------------------------

    Objects are the fundemental basics of Java. Java is an object oreinted language, and deals with objects. Objects have state and behavior. The State of an object are all of the variables and their values that are set within the object's class. It's behavior are the methods you program into it to allow it to function in your program or mod.

    For example, say you have a Dog object. It has multiple states. Breed, gender, height, width are all states of the Dog object, for example. The dog object also has a few behaviors, or methods. It can bark(), run(), chaseCat() and eat(). The states (variables) all affect what the object can, or cannot do.
    Objects have 4 main benefits:

    • Modularity: The source code for the object can be maintained without fear of messing up any existing code, and can be passed around the program easily.
    • Information-Hiding: Because you only interact directly with methods, the internal structure of how things work is hidden from the outside world, or any plugins that are created, unless you want it to be seen.
    • Re-Usable Code: If the object already exists in the code, or is written by someone else, you can use it in your program. This allows you to only write what you absolutely need, and not more.
    • Plug, chug, and debug: If something you write turns out to be bad or problematic, you can simply remove it, and plug in a default dummy object or method in it's place. If something breaks in Runtime, it's easily fixable.

    --------------------------------------
    Inheritance:
    --------------------------------------

    Different kinds of objects often have things in common with others. Gaming computers, general computers, and work computer all are computers, but have slightly different things about them. Gaming computers are high quality, regular computers are regular, and work computers are ergonomic. Object oriented programming allows classes and objects to inherit other objects properties. There would be a Superclass Computer, with the subclasses of gaming, regular, and work computers, as they have specific functions.

    The syntax for doing this is simple.
    class GamingComputer extends Computer {
    
    //new fields and methods defining a gaming computer
    }


    This gives GamingComputer all of the same fields and methods as Computer, but allows the class to only focus on exactly what makes it different. This makes the code very easy and simple to read. You must take care to make sure that you document your files, otherwise it will be horrendously confusing to the programmers that you work with. The superclass code will not appear in the subclass directly, but will be useable.


    --------------------------------------
    Packages:
    --------------------------------------

    Packages are quite simple. Think of them as a folder. You have a folder for the GUI code, a folder for the sound code, and a folder for the network code. Each of those "folders" are packages. They allow the coders to be able to quickly identify different parts of the code.


    --------------------------------------
    Literals:
    --------------------------------------

    You may have noticed that the new keyword isn't used when initializing a variable of a primitive type. Primitive types are special data types built into the language; they are not objects created from a class. A literal is the source code representation of a fixed value; literals are represented directly in your code without requiring computation. As shown below, it's possible to assign a literal to a variable of a primitive type:
    boolean result = true;
    char capitalC = 'C';
    byte b = 100;
    short s = 10000;
    int i = 100000;


    Integer Literals:
    An integer literal is of type long if it ends with the letter L or l; otherwise it is of type int. It is recommended that you use the upper case letter L because the lower case letter l is hard to distinguish from the digit 1.

    Values of the integral types byte, short, int, and long can be created from int literals. Values of type long that exceed the range of int can be created from long literals. Integer literals can be expressed by these number systems:

    Decimal: Base 10, whose digits consists of the numbers 0 through 9; this is the number system you use every day

    Hexadecimal: Base 16, whose digits consist of the numbers 0 through 9 and the letters A through F

    Binary: Base 2, whose digits consists of the numbers 0 and 1 (you can create binary literals in Java SE 7 and later)

    For general-purpose programming, the decimal system is likely to be the only number system you'll ever use. However, if you need to use another number system, the following example shows the correct syntax. The prefix 0x indicates hexadecimal and 0b indicates binary:
    // The number 26, in decimal
    int decVal = 26;
    // The number 26, in hexadecimal
    int hexVal = 0x1a;
    // The number 26, in binary
    int binVal = 0b11010;


    Floating-Point Literals:
    A floating-point literal is of type float if it ends with the letter F or f; otherwise its type is double and it can optionally end with the letter D or d.

    The floating point types (float and double) can also be expressed using E or e (for scientific notation), F or f (32-bit float literal) and D or d (64-bit double literal; this is the default and by convention is omitted).
    double d1 = 123.4;
    // same value as d1, but in scientific notation
    double d2 = 1.234e2;
    float f1 = 123.4f;


    Character and String Literals:
    Literals of types char and String may contain any Unicode (UTF-16) characters. If your editor and file system allow it, you can use such characters directly in your code. If not, you can use a "Unicode escape" such as '\u0108' (capital C with circumflex), or "S\u00ED Se\u00F1or" (Sí Señor in Spanish). Always use 'single quotes' for char literals and "double quotes" for String literals. Unicode escape sequences may be used elsewhere in a program (such as in field names, for example), not just in char or String literals.

    The Java programming language also supports a few special escape sequences for char and String literals: \b (backspace), \t (tab), \n (line feed), \f (form feed), \r (carriage return), \" (double quote), \' (single quote), and \\ (backslash).

    There's also a special null literal that can be used as a value for any reference type. null may be assigned to any variable, except variables of primitive types. There's little you can do with a null value beyond testing for its presence. Therefore, null is often used in programs as a marker to indicate that some object is unavailable.

    Class Literal:
    Finally, there's also a special kind of literal called a class literal, formed by taking a type name and appending ".class"; for example, String.class. This refers to the object (of type Class) that represents the type itself.

    Using Underscore Characters in Numeric Literals:
    In Java SE 7 and later, any number of underscore characters (_) can appear anywhere between digits in a numerical literal. This feature enables you, for example. to separate groups of digits in numeric literals, which can improve the readability of your code.

    For instance, if your code contains numbers with many digits, you can use an underscore character to separate digits in groups of three, similar to how you would use a punctuation mark like a comma, or a space, as a separator.

    The following example shows other ways you can use the underscore in numeric literals:
    long creditCardNumber = 1234_5678_9012_3456L;
    long socialSecurityNumber = 999_99_9999L;
    float pi = 3.14_15F;
    long hexBytes = 0xFF_EC_DE_5E;
    long hexWords = 0xCAFE_BABE;
    long maxLong = 0x7fff_ffff_ffff_ffffL;
    byte nybbles = 0b0010_0101;
    long bytes = 0b11010010_01101001_10010100_10010010;

    You can place underscores only between digits; you cannot place underscores in the following places:

    • At the beginning or end of a number
    • Adjacent to a decimal point in a floating point literal
    • Prior to an F or L suffix
    • In positions where a string of digits is expected
    The following examples demonstrate valid and invalid underscore placements (which are highlighted) in numeric literals:
    // Invalid: cannot put underscores
    // adjacent to a decimal point
    float pi1 = 3_.1415F;
    // Invalid: cannot put underscores
    // adjacent to a decimal point
    float pi2 = 3._1415F;
    // Invalid: cannot put underscores
    // prior to an L suffix
    long socialSecurityNumber1 = 999_99_9999_L;
    
    // This is an identifier,
    //not a numeric literal
    int x1 = _52;
    // OK (decimal literal)
    int x2 = 5_2;
    // Invalid: cannot put underscores
    // At the end of a literal
    int x3 = 52_;
    // OK (decimal literal)
    int x4 = 5_______2;
    
    // Invalid: cannot put underscores
    // in the 0x radix prefix
    int x5 = 0_x52;
    // Invalid: cannot put underscores
    // at the beginning of a number
    int x6 = 0x_52;
    // OK (hexadecimal literal)
    int x7 = 0x5_2;
    // Invalid: cannot put underscores
    // at the end of a number
    int x8 = 0x52_;



    --------------------------------------
    Arrays:
    --------------------------------------


    An array is a container object that holds a fixed number of values of a single type. The length of an array is established when the array is created. After creation, its length is fixed.

    Each item in an array is called an element, and each element is accessed by its numerical index. As shown in the above illustration, numbering begins with 0. The 9th element, for example, would therefore be accessed at index 8.

    The following program, ArrayDemo, creates an array of integers, puts some values in it, and prints each value to standard output.

    class ArrayDemo {
    public static void main(String[] args) {
    // declares an array of integers
    int[] anArray;
    
    // allocates memory for 10 integers
    anArray = new int[10];
    
    // initialize first element
    anArray[0] = 100;
    // initialize second element
    anArray[1] = 200;
    // etc.
    anArray[2] = 300;
    anArray[3] = 400;
    anArray[4] = 500;
    anArray[5] = 600;
    anArray[6] = 700;
    anArray[7] = 800;
    anArray[8] = 900;
    anArray[9] = 1000;
    
    System.out.println("Element at index 0: "
    + anArray[0]);
    System.out.println("Element at index 1: "
    + anArray[1]);
    System.out.println("Element at index 2: "
    + anArray[2]);
    System.out.println("Element at index 3: "
    + anArray[3]);
    System.out.println("Element at index 4: "
    + anArray[4]);
    System.out.println("Element at index 5: "
    + anArray[5]);
    System.out.println("Element at index 6: "
    + anArray[6]);
    System.out.println("Element at index 7: "
    + anArray[7]);
    System.out.println("Element at index 8: "
    + anArray[8]);
    System.out.println("Element at index 9: "
    + anArray[9]);
    }
    }


    The output from this program is:

    Element at index 0: 100
    Element at index 1: 200
    Element at index 2: 300
    Element at index 3: 400
    Element at index 4: 500
    Element at index 5: 600
    Element at index 6: 700
    Element at index 7: 800
    Element at index 8: 900
    Element at index 9: 1000


    In a real-world programming situation, you'd probably use one of the supported looping constructs to iterate through each element of the array, rather than write each line individually as shown above. However, this example clearly illustrates the array syntax.

    The above program declares anArray with the following line of code:

    // declares an array of integers
    int[] anArray;


    Like declarations for variables of other types, an array declaration has two components: the array's type and the array's name. An array's type is written as type[], where type is the data type of the contained elements; the square brackets are special symbols indicating that this variable holds an array. The size of the array is not part of its type (which is why the brackets are empty). An array's name can be anything you want, provided that it follows the rules and conventions as previously discussed in the naming section. As with variables of other types, the declaration does not actually create an array — it simply tells the compiler that this variable will hold an array of the specified type.

    Similarly, you can declare arrays of other types:

    byte[] anArrayOfBytes;
    short[] anArrayOfShorts;
    long[] anArrayOfLongs;
    float[] anArrayOfFloats;
    double[] anArrayOfDoubles;
    boolean[] anArrayOfBooleans;
    char[] anArrayOfChars;
    String[] anArrayOfStrings;


    You can also place the square brackets after the array's name:

    // this form is discouraged
    float anArrayOfFloats[];


    However, convention discourages this form; the brackets identify the array type and should appear with the type designation.

    One way to create an array is with the new operator. The next statement in the ArrayDemo program allocates an array with enough memory for ten integer elements and assigns the array to the anArray variable.

    // create an array of integers
    anArray = new int[10];


    If this statement were missing, the compiler would print an error like the following, and compilation would fail:

    ArrayDemo.java:4: Variable anArray may not have been initialized.


    The next few lines assign values to each element of the array:

    anArray[0] = 100; // initialize first element
    anArray[1] = 200; // initialize second element
    anArray[2] = 300; // etc.


    Each array element is accessed by its numerical index:

    System.out.println("Element 1 at index 0: " + anArray[0]);
    System.out.println("Element 2 at index 1: " + anArray[1]);
    System.out.println("Element 3 at index 2: " + anArray[2]);


    Alternatively, you can use the shortcut syntax to create and initialize an array:

    int[] anArray = {
    100, 200, 300,
    400, 500, 600,
    700, 800, 900, 1000
    };


    Here the length of the array is determined by the number of values provided between { and }.

    You can also declare an array of arrays (also known as a multidimensional array) by using two or more sets of square brackets, such as String[][] names. Each element, therefore, must be accessed by a corresponding number of index values.

    In the Java programming language, a multidimensional array is simply an array whose components are themselves arrays. This is unlike arrays in C or Fortran. A consequence of this is that the rows are allowed to vary in length, as shown in the following MultiDimArrayDemoprogram:

    class MultiDimArrayDemo {
    public static void main(String[] args) {
    String[][] names = {
    {"Mr. ", "Mrs. ", "Ms. "},
    {"Smith", "Jones"}
    };
    // Mr. Smith
    System.out.println(names[0][0] + names[1][0]);
    // Ms. Jones
    System.out.println(names[0][2] + names[1][1]);
    }
    }


    The output from this program is:

    Mr. Smith
    Ms. Jones


    Finally, you can use the built-in length property to determine the size of any array. The code

    System.out.println(anArray.length);


    will print the array's size to standard output.

    The System class has an arraycopy method that you can use to efficiently copy data from one array into another:

    public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)


    The two Object arguments specify the array to copy from and the array to copy to. The three int arguments specify the starting position in the source array, the starting position in the destination array, and the number of array elements to copy.

    The following program, ArrayCopyDemo, declares an array of char elements, spelling the word "decaffeinated". It uses arraycopy to copy a subsequence of array components into a second array:

    class ArrayCopyDemo {
    public static void main(String[] args) {
    char[] copyFrom = { 'd', 'e', 'c', 'a', 'f', 'f', 'e',
    'i', 'n', 'a', 't', 'e', 'd' };
    char[] copyTo = new char[7];
    
    System.arraycopy(copyFrom, 2, copyTo, 0, 7);
    System.out.println(new String(copyTo));
    }
    }


    The output from this program is:

    caffein



    --------------------------------------
    Expressions, Statements, and Blocks:
    --------------------------------------


    It's time to learn about expressions, statements, and blocks. Operators may be used in building expressions, which compute values; expressions are the core components of statements; statements may be grouped into blocks.

    An expression is a construct made up of variables, operators, and method invocations, which are constructed according to the syntax of the language, that evaluates to a single value.

    int cadence = 0;
    anArray[0] = 100;
    System.out.println("Element 1 at index 0: " + anArray[0]);
    
    int result = 1 + 2; // result is now 3
    if (value1 == value2)
    System.out.println("value1 == value2");


    The data type of the value returned by an expression depends on the elements used in the expression. The expression cadence = 0 returns an int because the assignment operator returns a value of the same data type as its left-hand operand; in this case, cadence is an int. As you can see from the other expressions, an expression can return other types of values as well, such as boolean or String.

    The Java programming language allows you to construct compound expressions from various smaller expressions as long as the data type required by one part of the expression matches the data type of the other. Here's an example of a compound expression:

    1 * 2 * 3


    In this particular example, the order in which the expression is evaluated is unimportant because the result of multiplication is independent of order; the outcome is always the same, no matter in which order you apply the multiplications. However, this is not true of all expressions. For example, the following expression gives different results, depending on whether you perform the addition or the division operation first:

    x + y / 100 // ambiguous


    You can specify exactly how an expression will be evaluated using balanced parenthesis: ( and ). For example, to make the previous expression unambiguous, you could write the following:

    (x + y) / 100 // unambiguous, recommended


    If you don't explicitly indicate the order for the operations to be performed, the order is determined by the precedence assigned to the operators in use within the expression. Operators that have a higher precedence get evaluated first. For example, the division operator has a higher precedence than does the addition operator. Therefore, the following two statements are equivalent:

    x + y / 100
    
    x + (y / 100) // unambiguous, recommended


    When writing compound expressions, be explicit and indicate with parentheses which operators should be evaluated first. This practice makes code easier to read and to maintain.

    Statements are roughly equivalent to sentences in natural languages. A statement forms a complete unit of execution. The following types of expressions can be made into a statement by terminating the expression with a semicolon ( ;) .

    // assignment statement
    aValue = 8933.234;
    // increment statement
    aValue++;
    // method invocation statement
    System.out.println("Hello World!");
    // object creation statement
    Computer myComputer = new Computer();


    In addition to expression statements, there are two other kinds of statements: declaration statements and control flow statements. A declaration statement declares a variable. You've seen many examples of declaration statements already:

    // declaration statement
    double aValue = 8933.234;


    Finally, control flow statements regulate the order in which statements get executed.

    A block is a group of zero or more statements between balanced braces and can be used anywhere a single statement is allowed. The following example, BlockDemo, illustrates the use of blocks:

    class BlockDemo {
    public static void main(String[] args) {
    boolean condition = true;
    if (condition) { // begin block 1
    System.out.println("Condition is true.");
    } // end block one
    else { // begin block 2
    System.out.println("Condition is false.");
    } // end block 2
    }
    }



    --------------------------------------
    If and Else:
    --------------------------------------


    The if-then statement is the most basic of all the control flow statements. It tells your program to execute a certain section of code only if a particular test evaluates to true. One possible implementation of the turnonGPU method could be as follows:

    void turnonGPU {
    // the "if" clause: GPU must be on
    if (isRunning){
    // the "then" clause: increase ison by 1
    ison1++;
    }
    }


    If this test evaluates to false (meaning that the GPU not running), control jumps to the end of the if-then statement.

    In addition, the opening and closing braces are optional, provided that the "then" clause contains only one statement:

    void turnonGPU() {
    // same as above, but without braces
    if (ison)
    ison1++;
    }


    Deciding when to omit the braces is a matter of personal taste. Omitting them can make the code more brittle. If a second statement is later added to the "then" clause, a common mistake would be forgetting to add the newly required braces. The compiler cannot catch this sort of error; you'll just get the wrong results.

    The if-then-else statement provides a secondary path of execution when an "if" clause evaluates to false. You could use an if-then-else statement in the isGPUOn method to take some action if the whatevers are applied when the GPU is not on. In this case, the action is to simply print an error message stating that the GPU has already started.

    void isGPUOn() {
    if (ison) {
    ison1++;
    } else {
    System.err.println("The GPU has " + "been already On!");
    }
    }


    The following program, IfElseDemo, assigns a grade based on the value of a test score: an A for a score of 90% or above, a B for a score of 80% or above, and so on.

    class IfElseDemo {
    public static void main(String[] args) {
    
    int testscore = 76;
    char grade;
    
    if (testscore >= 90) {
    grade = 'A';
    } else if (testscore >= 80) {
    grade = 'B';
    } else if (testscore >= 70) {
    grade = 'C';
    } else if (testscore >= 60) {
    grade = 'D';
    } else {
    grade = 'F';
    }
    System.out.println("Grade = " + grade);
    }
    }


    The output from the program is:

    Grade = C
    You may have noticed that the value of testscore can satisfy more than one expression in the compound statement: 76 >= 70 and 76 >= 60. However, once a condition is satisfied, the appropriate statements are executed (grade = 'C' ;) and the remaining conditions are not evaluated.


    --------------------------------------
    Switches
    --------------------------------------
    Unlike if-then and if-then-else statements, the switch statement can have a number of possible execution paths. A switch works with the byte, short, char, and int primitive data types. It also works with enumerated types, the String class, and a few special classes that wrap certain primitive types: Character, Byte, Short, and Integer.

    The following code example, SwitchDemo, declares an int named month whose value represents a month. The code displays the name of the month, based on the value of month, using the switch statement.

    public class SwitchDemo {
    public static void main(String[] args) {
    
    int month = 8;
    String monthString;
    switch (month) {
    case 1: monthString = "January";
    break;
    case 2: monthString = "February";
    break;
    case 3: monthString = "March";
    break;
    case 4: monthString = "April";
    break;
    case 5: monthString = "May";
    break;
    case 6: monthString = "June";
    break;
    case 7: monthString = "July";
    break;
    case 8: monthString = "August";
    break;
    case 9: monthString = "September";
    break;
    case 10: monthString = "October";
    break;
    case 11: monthString = "November";
    break;
    case 12: monthString = "December";
    break;
    default: monthString = "Invalid month";
    break;
    }
    System.out.println(monthString);
    }
    }


    In this case, August is printed.

    The body of a switch statement is known as a switch block. A statement in the switch block can be labeled with one or more case or default labels. The switch statement evaluates its expression, then executes all statements that follow the matching case label.

    You could also display the name of the month with if-then-else statements:

    int month = 8;
    if (month == 1) {
    System.out.println("January");
    } else if (month == 2) {
    System.out.println("February");
    }
    ... // and so on


    Deciding whether to use if-then-else statements or a switch statement is based on readability and the expression that the statement is testing. An if-then-else statement can test expressions based on ranges of values or conditions, whereas a switch statement tests expressions based only on a single integer, enumerated value, or String object. They both have their uses.

    Another point of interest is the break statement. Each break statement terminates the enclosing switch statement. Control flow continues with the first statement following the switch block. The break statements are necessary because without them, statements in switch blocks fall through: All statements after the matching case label are executed in sequence, regardless of the expression of subsequent case labels, until a break statement is encountered. The program SwitchDemoFallThrough shows statements in a switch block that fall through. The program displays the month corresponding to the integer month and the months that follow in the year:

    public class SwitchDemoFallThrough {
    
    public static void main(String args[]) {
    java.util.ArrayList<String> futureMonths =
    new java.util.ArrayList<String>();
    
    int month = 8;
    
    switch (month) {
    case 1: futureMonths.add("January");
    case 2: futureMonths.add("February");
    case 3: futureMonths.add("March");
    case 4: futureMonths.add("April");
    case 5: futureMonths.add("May");
    case 6: futureMonths.add("June");
    case 7: futureMonths.add("July");
    case 8: futureMonths.add("August");
    case 9: futureMonths.add("September");
    case 10: futureMonths.add("October");
    case 11: futureMonths.add("November");
    case 12: futureMonths.add("December");
    break;
    default: break;
    }
    
    if (futureMonths.isEmpty()) {
    System.out.println("Invalid month number");
    } else {
    for (String monthName : futureMonths) {
    System.out.println(monthName);
    }
    }
    }
    }


    This is the output from the code:

    August
    September
    October
    November
    December


    Technically, the final break is not required because flow falls out of the switch statement. Using a break is recommended so that modifying the code is easier and less error prone. The default section handles all values that are not explicitly handled by one of the case sections.

    The following code example, SwitchDemo2, shows how a statement can have multiple case labels. The code example calculates the number of days in a particular month:

    class SwitchDemo2 {
    public static void main(String[] args) {
    
    int month = 2;
    int year = 2000;
    int numDays = 0;
    
    switch (month) {
    case 1: case 3: case 5:
    case 7: case 8: case 10:
    case 12:
    numDays = 31;
    break;
    case 4: case 6:
    case 9: case 11:
    numDays = 30;
    break;
    case 2:
    if (((year % 4 == 0) &&
    !(year % 100 == 0))
    || (year % 400 == 0))
    numDays = 29;
    else
    numDays = 28;
    break;
    default:
    System.out.println("Invalid month.");
    break;
    }
    System.out.println("Number of Days = "
    + numDays);
    }
    }


    This is the output from the code:

    Number of Days = 29


    In Java SE 7 and later, you can use a String object in the switch statement's expression. The following code example, StringSwitchDemo, displays the number of the month based on the value of the String named month:

    public class StringSwitchDemo {
    
    public static int getMonthNumber(String month) {
    
    int monthNumber = 0;
    
    if (month == null) {
    return monthNumber;
    }
    
    switch (month.toLowerCase()) {
    case "january":
    monthNumber = 1;
    break;
    case "february":
    monthNumber = 2;
    break;
    case "march":
    monthNumber = 3;
    break;
    case "april":
    monthNumber = 4;
    break;
    case "may":
    monthNumber = 5;
    break;
    case "june":
    monthNumber = 6;
    break;
    case "july":
    monthNumber = 7;
    break;
    case "august":
    monthNumber = 8;
    break;
    case "september":
    monthNumber = 9;
    break;
    case "october":
    monthNumber = 10;
    break;
    case "november":
    monthNumber = 11;
    break;
    case "december":
    monthNumber = 12;
    break;
    default:
    monthNumber = 0;
    break;
    }
    
    return monthNumber;
    }
    
    public static void main(String[] args) {
    
    String month = "August";
    
    int returnedMonthNumber =
    StringSwitchDemo.getMonthNumber(month);
    
    if (returnedMonthNumber == 0) {
    System.out.println("Invalid month");
    } else {
    System.out.println(returnedMonthNumber);
    }
    }
    }


    The output from this code is 8.

    The String in the switch expression is compared with the expressions associated with each case label as if the String.equals method were being used. In order for the StringSwitchDemo example to accept any month regardless of case, month is converted to lowercase (with the toLowerCase method), and all the strings associated with the case labels are in lowercase.






    ---------------------------------------
    Beginner Tutorial
    ---------------------------------------

    Coming Soon!



    ---------------------------------------
    Intermediate Tutorial
    ---------------------------------------




    Coming Soon!







    ---------------------------------------
    Advanced Tutorial
    ---------------------------------------


    --------------------------------------
    Reflection:
    --------------------------------------


    Reflection is commonly used by programs which require the ability to examine or modify the runtime behavior of applications running in the Java virtual machine. This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible.

    Extensibility Features:

    An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.

    A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.

    Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.

    Drawbacks of Reflection:

    Reflection is powerful, but should not be used indiscriminately. If it is possible to perform an operation without using reflection, then it is preferable to avoid using it. The following concerns should be kept in mind when accessing code via reflection. Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications.

    Reflection requires a runtime permission which may not be present when running under a security manager. This is in an important consideration for code which has to run in a restricted security context, such as in an Applet. Since reflection allows code to perform operations that would be illegal in non-reflective code, such as accessing private fields and methods, the use of reflection can result in unexpected side-effects, which may render code dysfunctional and may destroy portability. Reflective code breaks abstractions and therefore may change behavior with upgrades of the platform.


    Since methods of a class either consists of arguments or do not have any argument. So in case of no-argument method noting to worry just simply get class of that object (as we have taken "String" in our example) and after getting class , get that particular method and to invoke this method we have to use invoke() method.

    Here is the example code of CallingMethod :

    import java.lang.reflect.*;
    
    public class CallingMethod {
    public static void main(String[] args) {
    String firstName= new String("Deepak");
    String lastName=new String("Kumar");
    String result = new String("");
    Class cls = String.class;
    Class[] parametertype = new Class[] {String.class};
    Object[] arguments = new Object[] {lastName};
    try {
    Method concatMethod =
    cls.getMethod("concat", parametertype);
    result = (String)
    concatMethod.invoke(firstName,arguments);
    System.out.println(" Concatenated String is =>
    "+result);
    }catch (Exception e) {
    System.out.println(e);
    }
    }
    }






    ---------------------------------------
    User Requested Tutorials
    ---------------------------------------


    --------------------------------------
    Annotations! (@):
    --------------------------------------

    Annotations provide data about a program that is not part of the program itself. They have no direct effect on the operation of the code they annotate.

    Annotations have a number of uses, among them:
    1. Information for the compiler — Annotations can be used by the compiler to detect errors or suppress warnings.
    2. Compiler-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.
    3. Runtime processing — Some annotations are available to be examined at runtime.
    4. Annotations can be applied to a program's declarations of classes, fields, methods, and other program elements.
    The annotation appears first, often (by convention) on its own line, and may include elements with named or unnamed values:

    @Author(
    name = "Erik Melton",
    date = "1/2/2013"
    )
    class MyClass() { }


    or

    @SuppressWarnings(value = "unchecked")
    void myMethod() { }


    If there is just one element named "value," then the name may be omitted, as in:

    @SuppressWarnings("unchecked")
    void myMethod() { }


    Also, if an annotation has no elements, the parentheses may be omitted, as in:

    @Override
    void mySuperMethod() { }


    Many annotations replace what would otherwise have been comments in code.

    For example:

    public class LMFAO extends LMAO {
    
    // Author: Erik Melton
    // Date: 1/2/2013
    // Current revision: 6
    // Last modified: 1/3/2013
    // By: Erik Melton
    // Reviewers: Citricsquid, Lord_Ralex, Jbond98
    
    // class code goes here
    
    }


    To add this same metadata with an annotation, you must first define the annotation type. The syntax for doing this is:

    @interface ClassPreamble {
    String author();
    String date();
    int currentRevision() default 1;
    String lastModified() default "N/A";
    String lastModifiedBy() default "N/A";
    // Note use of array
    String[] reviewers();
    }


    The annotation type definition looks somewhat like an interface definition where the keyword interface is preceded by the @ character (@ = "AT" as in Annotation Type). Annotation types are, in fact, a form of interface, which will be covered in a later lesson. For the moment, you do not need to understand interfaces.

    The body of the annotation definition above contains annotation type element declarations, which look a lot like methods. Note that they may define optional default values.

    Once the annotation type has been defined, you can use annotations of that type, with the values filled in, like this:

    @ClassPreamble (
    author = "John Doe",
    date = "3/17/2002",
    currentRevision = 6,
    lastModified = "4/12/2004",
    lastModifiedBy = "Jane Doe",
    // Note array notation
    reviewers = {"Alice", "Bob", "Cindy"}
    )
    public class LMFAO extends LMAO {
    
    // class code goes here
    
    }


    Note: To make the information in @ClassPreamble appear in Javadoc-generated documentation, you must annotate the @ClassPreamble definition itself with the @Documented annotation:

    // import this to use @Documented
    import java.lang.annotation.*;
    
    @Documented
    @interface ClassPreamble {
    
    // Annotation element definitions
    
    }


    There are three annotation types that are predefined by the language specification itself: @Deprecated, @Override, and @SuppressWarnings.

    @Deprecated:
    The @Deprecated annotation indicates that the marked element is deprecated and should no longer be used. The compiler generates a warning whenever a program uses a method, class, or field with the @Deprecated annotation. When an element is deprecated, it should also be documented using the Javadoc @deprecated tag, as shown in the following example. The use of the "@" symbol in both Javadoc comments and in annotations is not coincidental — they are related conceptually. Also, note that the Javadoc tag starts with a lowercase "d" and the annotation starts with an uppercase "D".

    // Javadoc comment follows
    /**
    * @deprecated
    * explanation of why it
    * was deprecated
    */
    @Deprecated
    static void deprecatedMethod() { }
    }


    @Override
    The @Override annotation informs the compiler that the element is meant to override an element declared in a superclass (overriding methods will be discussed in the the lesson titled "Interfaces and Inheritance").

    // mark method as a superclass method
    // that has been overridden
    @Override
    int overriddenMethod() { }


    While it's not required to use this annotation when overriding a method, it helps to prevent errors. If a method marked with @Override fails to correctly override a method in one of its superclasses, the compiler generates an error.

    @SuppressWarnings
    The @SuppressWarnings annotation tells the compiler to suppress specific warnings that it would otherwise generate. In the example below, a deprecated method is used and the compiler would normally generate a warning. In this case, however, the annotation causes the warning to be suppressed.

    // use a deprecated method and tell
    // compiler not to generate a warning
    @SuppressWarnings("deprecation")
    void useDeprecatedMethod() {
    // deprecation warning
    // - suppressed
    objectOne.deprecatedMethod();
    }


    Every compiler warning belongs to a category. The Java Language Specification lists two categories: "deprecation" and "unchecked." The "unchecked" warning can occur when interfacing with legacy code written before the advent of generics (discussed in the lesson titled "Generics"). To suppress more than one category of warnings, use the following syntax:

    @SuppressWarnings({"unchecked", "deprecation"})


    The more advanced uses of annotations include writing an annotation processor that can read a Java program and take actions based on its annotations. It might, for example, generate auxiliary source code, relieving the programmer of having to create boilerplate code that always follows predictable patterns. To facilitate this task, release 5.0 of the JDK includes an annotation processing tool, called apt. In release 6 of the JDK, the functionality of apt is a standard part of the Java compiler. Useful if you know how to use it.

    To make annotation information available at runtime, the annotation type itself must be annotated with @Retention(RetentionPolicy.RUNTIME), as follows:

    import java.lang.annotation.*;
    
    @Retention(RetentionPolicy.RUNTIME)
    @interface AnnotationForRuntime {
    
    // Elements that give information
    // for runtime processing
    
    }


    That's all you need to know. ;)


    [represent]
    Posted in: Tutorials
  • View jbond98's Profile

    193

    Aug 16, 2012
    jbond98 posted a message on [1.4.7] Jbond98's Beginner/Advanced ModLoader Minecraft Modding Tutorials! -Everything Updated to 1.4.7! [Updated 1/23/2013]
    Looks like I ran out of space! I'll be adding tutorials on this page from now on!

    Tutorial 16 - Crafting Recipes With Dyes! - Updated

    ModLoader.addRecipe(new ItemStack(cobblestone, 1), new Object [] {" #", Character.valueOf('#'), new ItemStack(Item.dyePowder, 1, 12)});
    What this would do is make one piece of light blue dye give me one piece of cobblestone in the crafting grid.

    Look at crafting with dyes this way:
    Character.valueOf('#'), new ItemStack(Item.dyePowder, amount, damageValue)});
    The amount is how much needs to be present, or the amount. You still have to keep this even if it is as a crafting ingredient. The damage value is what determines the color of the dye. Please refer to this chart for the damage or ID values of each dye:


    Credits to RedPoptarts





    Please click that little right below this post, it will make my day :)
    Posted in: Tutorials
  • View jbond98's Profile

    655

    Aug 16, 2012
    jbond98 posted a message on [1.4.7] Jbond98's Beginner/Advanced ModLoader Minecraft Modding Tutorials! -Everything Updated to 1.4.7! [Updated 1/23/2013]

    ModLoader 1.4 Compatible


    These tutorials now have their very own IRC channel on esper.net! Please ask your questions there first, because we will be able to help you easier.

    Go to: http://esper.net/publicirc.php
    Enter a nickname
    Do not check "Login to Services"
    Type in the channel name: #jbondmodding

    *OPs: jbond98, Alrien, Kovu, PirateCody
    *If you would like to be an OP on the IRC chat please PM me. We really need more people to help us out!


    These tutorials now have their very own subreddit!
    Please ask your questions there, and I will try to help you.

    http://www.reddit.com/r/jbondmodding

    *If you would like to help moderate /r/jbondmodding please PM me. We really need more people to help us out!


    Hello, my name is jbond98, I am a YouTuber and Minecraft Modder, and welcome to my modding tutorials! You can check out my YouTube Channel, and my most popular mod, The Wolfestone Mod if you would like.

    I'm going to start off fresh, and perfect for beginners, but eventually I'll have some advanced tutorials here too! My goal is to share my modding knowledge with other minecraft modders, and to eliminate some of the problems that Minecraft 1.3.1+ is causing modders. I will also try to explain everything in as much detail as possible, so not only will you be able to see what to do, you'll also learn what to do!

    You can now download these tutorials in a PDF file! It's a bit of a rough copy, but I'll try to work out the kinks, and I'll update it periodically:

    Jbond98's Modding Tutorials PDF


    Setting Up MCP 7.22 with ModLoader 1.4.4 and Eclipse Juno 4.2

    Introduction
    In order to ensure maximum efficiency and comfortably whilst modding, it is highly recommended to use a java IDE, such as NetBeans or Eclipse with your Minecraft MCP. An IDE is an Integrated Development Environment which makes creating classes, testing features in your mod, and bug fixing a lot more convenient. Eclipse and NetBeans also have error highlighting and error quickfix features which make fixing problems much easier. Although I personally recommend Eclipse, I haven't really had much experience with NetBeans.

    Notepad++

    You may use Notepad++ if you don't want to use an IDE for minecraft modding. Notepad++ is a freeware source code editor that supports many different programming languages, most importantly java. It does not have a built-in way to test your game, so you will have to use startclient.bat in your MCP folder to test your mod in-game.

    MCP 1.4.2 and Eclipse Juno 4.2 and ModLoader
    I
    n order to correctly use Eclipse on your computer, you have to first set up your PATH variable. First, download the Java JDK link on the far left "Java Platform (JDK) 7u7", and then follow the instructions below:

    The following is an example of a PATH environment variable:

    C:\Java\jdk1.7.0\bin;C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem


    It is useful to set the PATH environment variable permanently so it will persist after rebooting. To make a permanent change to the PATH variable, use the System icon in the Control Panel. The exact procedure varies depending on the version of Windows:

    Windows XP:
    1. Select Start, select Control Panel. double click System, and select the Advanced tab.

    2. Click Environment Variables. In the section System Variables, find the PATH environment variable and select it. Click Edit. If the PATH environment variable does not exist, click New.

    3. In the Edit System Variable (or New System Variable) window, specify the value of the PATH environment variable. Click OK. Close all remaining windows by clicking OK.
    Windows Vista:
    1. From the desktop, right click the My Computer icon.

    2. Choose Properties from the context menu.

    3. Click the Advanced tab (Advanced system settings link in Vista).

    4. Click Environment Variables. In the section System Variables, find the PATH environment variable and select it. Click Edit. If the PATH environment variable does not exist, click New.

    5. In the Edit System Variable (or New System Variable) window, specify the value of the PATH environment variable. Click OK. Close all remaining windows by clicking OK.
    Windows 7:
    1. From the desktop, right click the Computer icon.

    2. Choose Properties from the context menu.

    3. Click the Advanced system settings link.

    4. Click Environment Variables. In the section System Variables, find the PATH environment variable and select it. Click Edit. If the PATH environment variable does not exist, click New.

    5. In the Edit System Variable (or New System Variable) window, specify the value of the PATH environment variable. Click OK. Close all remaining windows by clicking OK.
    Alright, now the hard part is over. You've set your PATH variable! Now to set up MCP 1.4.2 with Eclipse Juno 4.2:
    • Download MCP 1.4.2 (MCP 7.19 for Minecraft 1.4.2)
    • Now you'll need to decompile your minecraft sources. Go to http://www.minecraft.net and log-in to your account. You'll need to download a fresh minecraft_server.jar for 1.4.2. Now go to your minecraft client. You'll need to force and update. After getting a fresh minecraft client, go to the ModLoader Download Page and download the most recent version of ModLoader. (Note: If there is no ModLoader 1.4.2, in this case wait for modloader to update or this will all crash!) Install ModLoader as you would a regular mod. Now go to your .minecraft folder and copy your bin and resources folders.
    • Now, put all three of these things (minecraft_server.jar, bin, resources) inside of your jars folder inside of your MCP 1.4.2 folder.
    • Now click the decompile.bat in your MCP folder. Wait until the decompiling process is finished. This might take a while!
    • Now run your eclipse.exe, it is inside of the eclipse folder (You get this at the end of installing eclipse). Set the eclipse workspace to your MCP folder/eclipse.
    • That's it! You're now ready to make that dream mod that you've always wanted! Go to the client -> src -> net.minecraft.src package and make your mod_*** file in that package.
    Programs Needed:
    • Eclipse Juno 4.2: http://www.eclipse.org/downloads/ Click the first link from the top "Eclipe IDE for Java EE Developers
    • MCP 7.19 for Minecraft 1.4.2: http://mcp.ocean-lab...hp/MCP_Releases Scroll down and find the download for mcp72.zip for Minecraft 1.4.2
    • Java JDK: http://www.oracle.co...oads/index.html Download the first link on the left "Java Platform (JDK) 7u7 (Or the most recent version of the JDK)
    • ModLoader 1.4.2: http://www.minecraft...minary-updates/ These tutorials will work with ModLoader 1.3.2 also!
    Optional Programs (To Replace Eclipse):
    • NetBeans: http://netbeans.org/ Download NetBeans IDE 7.2
    • (Not Recommended) Notepad++: http://notepad-plus-plus.org/ Download Notepad++ 6.1.6


    ModLoader Basic Template


    Any mod_*** file:
    package net.minecraft.src;
    
    import java.util.Random;
    			
    public class mod_*** extends BaseMod
    {			
    	 public void load()	
    	 {			
    			
    	 }
    	
    	 public String getVersion()
    	 {			
    return "1.4.2";
    	 }
    	
    }
    This is a simple ModLoader mod_*** file template. This is how you will start off all of your mod_*** files.


    What's in the code:
    package net.minecraft.src;
    This tells minecraft what package your class is located in.This line is very important and should be at the top of every class that you ever create.


    import java.util.Random;
    This line is very important if you want to generate ores in the game, or anything like that. This imports java's Random function/methods library. You will see many other types of imports in the game such as import java.util.Map, importa java.util.List and so on. Just remember to do this or you will get many errors in the long run.

    public class mod_*** extends BaseMod
    All this line does is define this class as a public class, which means it can be referenced from anywhere, even outside of the package. Protected would mean that it can be referenced only inside of the package, and private would mean that it can be referenced only inside of the class. You would change mod_*** to mod_NameOfYourMod. The extends BaseMod allows you to use methods outside of the mod_*** class, in this case, the main ModLoader methods located in BaseMod.java.


    public void load()
    	 {		
    		
    	 }
    This is ModLoader's main constructor. All ModLoader functions will go inside of the two curly braces. That means anything starting with "ModLoader.", anything else will go outside of this method. That means mehtods starting with "public static void" and the likes.


    public String getVersion()
    	 {
    return "1.4.2";
    	 }
    This function returns the version of your mod. You can simply put "1.4.2" here or something like "MyMod V2.0 Minecraft 1.4.1" It doesn't really matter. This is what is going to show up in the console when ModLoader loads your mod.


    Modding Tutorials

    All tutorials are 1.4 ModLoader Compatible!

    Minecraft modding doesn't require much previous knowledge, but before diving into the world of Minecraft modding, I highly recommend reading Kovu's general Java tutorials. All of the terminology and information that any beginner needs to know before starting an in-depth Java project.


    Tutorial 1 - How to Make a New Block​ - Updated

    mod_*** File
    package net.minecraft.src;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    public class mod_wolfestone extends BaseMod
    {
    public static final Block oreWolfestone = new BlockWolfestoneOre(160, 0).setStepSound(Block.soundStoneFootstep).setBlockName("oreWolfestone").setHardness(4.5F).setResistance(5F).setLightValue(0.375F);
    public void load()
    {
    oreWolfestone.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/Wolfestone Ore.png");
    ModLoader.registerBlock(oreWolfestone);
    ModLoader.addName(oreWolfestone, "Wolfestone Ore");
    }
    public String getVersion()
    {
    return "Wolfestone Mod V2.0 Minecraft 1.3.2";
    }
    }


    What's in the code:
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    These are probably all of the imports that you will possibly need in your mod_*** file. Adding an import that you don't need won't hurt you, but forgetting to add one that you do need will cause some serious problems. In my various tutorials I will be showing what imports are needed for the specific tutorial, and for this one you don't need any of them. It is still good practice to put those at the top though. To name a few of them, java.util,Arrays; is a java library that includes Array functions, java.util.Map is for adding renderers to the map, but you don't need to worry about that right now.

    public static final Block oreWolfestone = new BlockWolfestoneOre(160, 0).setStepSound(Block.soundStoneFootstep).setBlockName("oreWolfestone").setHardness(4.5F).setResistance(5F).setLightValue(0.375F);
    This is the function that tells ModLoader to add your blocks to Minecraft. I will go over each part in greater detail below:

    public static final Block oreWolfestone = new BlockWolfestoneOre
    public static final Block is the actual function, and oreWolfestone is whatever you want the coding name for your block to be. This is not the name that will show up for the ore in-game. That comes later.

    new BlockWolfestoneOre
    This is the class that all of your block data is located it. You would change BlockWolfestoneOre to the class where you block data is stored. Usually block classes start of with Block*** but this is just an organizational preference. More information about the Block*** file is further down the tutorial.

    (160, 0)
    The number on the left, "160" is the block ID that you want your block to be registered to. To stay safe, start at 160, but make sure to pick numbers above 138(The last minecraft block ID that is in use by real minecraft blocks) and lower than 256(This is where item IDs start. I will explain this later.) The 0 used to tell minecraft where your item texture appears on the terrain.png. In this tutorial we will be setting the number to 0 because we will be overriding the terrain.png using ModLoader's override function, and making our own texture.

    .setStepSound(Block.soundStoneFootstep)
    This tells ModLoader what sound to tie to your block. It is crucial to put Block in front of the .soundStoneFootstep because it is not referenced in your class. You can put many other sounds here, .soundGrassFootstep and .soundMetalFootstep, to name a few. Look in the Block.java class for the full list of sounds.

    .setBlockName("oreWolfestone")
    This is only the coding name used for your block, not the name that will appear in-game. Use the same name you put at the beginning of the function.

    .setHardness(4.5F)
    This sets your block's hardness. Since the number is a float, you will need to put "F" after the number. This number can be positive or negative. If you put a negative number here, that will make your block unbreakable in Survival Mode, like bedrock. (In java, a float is any number with a decimal point. An integer on the other hand, or an int has no decimal points and is a positive or negative number.)

    .setResistance(5F)
    This sets your block's resistance to TNT or any other explosives. Normal blocks have any where from 1 to about 5 resistance. Obsidian has a resistance of 2000, which makes it immune to explosive damage.

    .setLightValue(0.375F)
    This sets your block's light value. Since it is a float it can be a decimal number. Light values in minecraft range from 0F to 1F. 0 Meaning no light, 1 meaning full light. Light values cannot be negative numbers, and if you go over 1, nothing will happen because minecraft will not recognize anything over 1F. Note: If you decide to set your light value to 0, you do not need this .setLightValue function, and you can remove it. Same goes for .setResistance and .setHardness

    oreWolfestone.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/Wolfestone Ore.png");
    This will set your block's texture in minecraft, and override the terrain.png, meaning that you will not have to put your textures in that file. You will now need 16x16 pixel textures for each block in your mod. When you have those textures put them inside a folder, I named mine textures. You don't have to but it helps organize your textures, so they are not cluttered in the main bin folder. The /texture/WolfestoneOre.png is where you have placed your texture inside of the minecraft.jar file. Mine is inside of a textures folder.

    ModLoader.registerBlock(oreWolfestone);
    This code registers your block. If you do not do this, your game will crash! Also, make sure that it is inside of your public void load method. All you have to do here is change oreWolfestone to the coding name of your new block.

    ModLoader.addName(oreWolfestone, "Wolfestone Ore");
    This is where you will set the in-game name of your block. Change oreWolfestone to the coding name of your block, and change "Wolfestone Ore" to what you want the in-game name of your block to be. Make sure it is in quotations! Or else java will not read this as a string, and give you problems

    public String getVersion()
    {
    return "Wolfestone Mod V2.0 Minecraft 1.3.2";
    }
    This is the version of your mod. You can pretty much put anything here, as long as it is in quotations. I put the version of my mod along with what Minecraft version that it runs in. This is what will show up in the console when ModLoader loads your mod.


    Block*** File
    package net.minecraft.src;
    import java.util.Random;
    public class BlockWolfestoneOre extends Block
    {
    public BlockWolfestoneOre(int par1, int par2)
    {
    	 super(par1, par2, Material.rock);
    	 this.setCreativeTab(CreativeTabs.tabBlock);
    }
    
    public int quantityDropped(int par1)
    {
    	 return (1);
    }
    
    public int idDropped(int par1, Random par2Random, int par3)
    {
    	 return mod_wolfestone.wolfestone.shiftedIndex;
    }
    }


    What's in the code:
    I won't go into too much detail about this class, but here is what you need to know:

    public class BlockWolfestoneOre extends Block
    This is your main method. It names the class, and tells minecraft that it extends the Block.java class, which means that you'll be able to use many functions from Block.java in your own Block*** class.

    public BlockWolfestoneOre(int par1, int par2)
    This is your class constructor, and it is telling your mod_*** that it takes two parameters, int par1 and int par2. par1 and par2 are two different integer variables.

    super(par1, par2, Material.rock);
    This is the super constructor, all you need to do here is change Material.rock to whatever material you want. Material.glass and Material.wood, to name a few. Each different material has different properties, and they are all listed in the Materials.java class.

    this.setCreativeTab(CreativeTabs.tabBlock);
    This sets your block to the "Blocks" tab in Creative mode. You can also use .tabMaterials or .tabTools instead of .tabBlock, to name a few. The full list of Creative tabs is in the CreativeTabs.java class.

    public int quantityDropped(int par1)
    {
    	 return (1);
    }
    This is telling minecraft to drop one of 'whatever it drops' ('whatever it drops' is set in the next function). You can change this to whatever you want, as long as it is an integer. You can also set this to a random number, but I won't really get into that. If you really want to know, ask me of look in the code for lapis lazuli.

    public int idDropped(int par1, Random par2Random, int par3)
    {
    	 return mod_wolfestone.wolfestone.shiftedIndex;
    }
    This is what the block will drop once you break it. Here it is a wolfestone gem, but you can literally put anything. If it is an item, make sure to put Item. in front of it. If it is in your mod_*** class, put mod_***. in front of it, and same goes for blocks, put Block. in front of it. The .shiftedIndex only works for items, so if you want it to drop a block, make sure to put .blockID after your item.

    If you do not want to create a separate Block*** file:
    If your block doesn't really do anything too special, you don't have to make a separate Block*** class for it! In your mod_*** class, just change the following:

    public static final Block oreWolfestone = new BlockWolfestoneOre(160, 0).setStepSound(Block.soundStoneFootstep).setBlockName("oreWolfestone").setHardness(4.5F).setResistance(5F).setLightValue(0.375F);


    public static final Block oreWolfestone = new Block(160, 0).setStepSound(Block.soundStoneFootstep).setBlockName("oreWolfestone").setHardness(4.5F).setResistance(5F).setLightValue(0.375F);
    All this does is change the class extension for oreWolfestone to Block, instead of BlockWolfestoneOre. This is useful for simple blocks that don't really need much customization.

    You can not add your block to the creative inventory if it doesn't have a separate class!

    This should do it for the adding a new block tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 2 - How to Make a New Item - Updated​

    mod_***
    package net.minecraft.src;
    import java.util.Random;
    public class mod_YourMod extends BaseMod
    {
    public static final Item yourItem = new ItemYourItem(5000).setItemName("yourItem");
    public void load()
    {
    yourItem.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourItem.png");
    
    ModLoader.addName(yourItem, "Your Item");
    
    yourItem.setCreativeTabs(CreativeTabs.tabMaterials);
    }
    
    public String getVersion()
    {
    return "1.3.2";
    }
    }


    What's in the code:
    public static final Item yourItem = new ItemYourItem(5000).setItemName("yourItem");
    This method adds your item to Minecraft. new ItemYourItem(5000) is the item ID, and ItemYourItem is the class that your item will extend, you can put "Item" here instead if your items doesn't have any special characteristics. I chose 5000 for the ID just to be safe. .setItemName("yourItem") sets the coding name for your item. This should be the same as the name here: public static final Item yourItem.

    wolfestone.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/Wolfestone.png");
    This overrides the regular items.png with your custom texture. I put my textures in a folder named textures. This folder would go inside of your minecraft.jar

    ModLoader.addName(yourItem, "Your Item");
    This sets the in-game name for your item.

    yourItem.setCreativeTabs(CreativeTabs.tabMaterials);
    This will set your new item to the Creative inventory tab "Materials." Use this only if you don't have a separate class that extends your item. Look at my Creative Inventory tutorial for more information.

    This should do it for the adding a new item tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 3 - How to Add Items/Blocks to the Creative Inventory - Updated

    Everyone having problems with adding items to the creative inventory, swap "setTabToDisplayOn" with "setCreativeTabs" The code has changed in 1.4.2!

    Block***/Item*** File
    package net.minecraft.src;
    import java.util.Random;
    public class BlockWolfestoneOre extends Block
    {
    public BlockWolfestoneOre(int par1, int par2)
    {
    	 super(par1, par2, Material.rock);
    	 this.setCreativeTab(CreativeTabs.tabBlock);
    }
    
    public int quantityDropped(int par1)
    {
    	 return (1);
    }
    
    public int idDropped(int par1, Random par2Random, int par3)
    {
    	 return mod_wolfestone.wolfestone.shiftedIndex;
    }
    }
    Now, in 1.3.2, adding items to the Creative Inventory is very easy! All you have to do is add one line in your Block***/Item*** file! This will work for both.

    this.setCreativeTabs(CreativeTabs.tabBlock);
    All you need to do is add this line in your main Block***/Item*** constructor function. Right below the super constructor. What this line of code will do is add your block to the Blocks tab. You can change CreativeTabs.tabBlock to any tab you want, such as .tabMaterials or .tabTools. The full list is in the CreativeTabs.java class.

    If you do not have separate classes for Items:
    If you do not have separate classes for your Items you can still add them to the Creative Inventory by putting this line of code inside of the public void load method inside of your mod_*** class:
    YourItem.setCreativeTabs(CreativeTabs.tabMaterials);
    In this case you would change YourItem to the item that you would like to add to the Creative inventory.

    This should do it for the adding items/blocks to the creative inventory tutorial! Ask any questions below, or tell me what to add to this tutorial.[

    Tutorial 4 - Adding Textures to your Items and Blocks - Updated

    Adding Custom Textures to Items:
    yourItem.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/YourItem.png");
    This ModLoader method overrides the in-game items.png, so that you can use your own textures without worrying about compatibility problems with other mods. Replace yourItem with the coding name of your item. Now, all you have to do is tell ModLoader where the texture is. putting "/YourItem.png" as the second parameter to the .addOverride function will tell ModLoader that your item is on the root directory of the minecraft.jar, but if you put it in a folder, such as textures, it will be more organized, which is what I did here.

    Adding Custom Textures to Blocks:
    yourBlock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/YourBlock.png");
    Adding custom textures to blocks is almost identical to adding textures to items, just instead of .iconIndex, it is .blockIndexInTexture. Same rules apply for the rest of the function.

    Remember that both the item and block texture override methods go INSIDE of the public void load method!

    This should do it for the adding textures to your blocks/items tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 5 - Adding New Crafting Recipes (Including Dyes!) - Updated

    Adding new recipes is easy with ModLoader. Just add the following code from this tutorial to your mod_*** file in the public void load() method.
    ModLoader.addRecipe(new ItemStack(blockWolfestone, 1), new Object [] {"###", "###", "###", Character.valueOf('#'), mod_wolfestone.wolfestone});
    Adding new crafting recipes with ModLoader is easy! I'll be using some recipes from The Wolfestone Mod in this tutorial. Imagine the the "###", "###, "###", as the minecraft crafting grid.

    "###",
    "###",
    "###",
    Like this. This is how you will input your new crafting recipes. Top row is first, then second row, and last row.

    Character.valueOf('#'), mod_wolfestone.wolfestone
    This function tells ModLoader what the # is supposed to be in the recipe. You can use almost any character for this, but try to keep it down to simple symbols and letters.

    The crafting recipe listed above is one for a Wolfestone Block, but that is pretty easy. Let's try a crafting recipe that is a little bit harder.

    ModLoader.addRecipe(new ItemStack(wolfestoneBow, 1), new Object [] {" #X", "M X", " #X", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.silk, Character.valueOf('M'), mod_wolfestone.wolfestoneShard});
    Here is a recipe that is a bit more complicated. Look at how there are now three different symbols in the crafting grid. You have to tell ModLoader what each of them are, so you have to make a new Character.valueOf() function for each new symbol.

    ModLoader.addRecipe(new ItemStack(wolfestoneShard, 4), new Object [] {"#", Character.valueOf('#'), mod_wolfestone.wolfestone});
    Some recipes are shapeless, meaning that you can put them anywhere on the grid and they will still work. So for this recipe as long as there is one piece of wolfestone in the crafting grid, whether it is the 2x2 or 3x3, it will still produce four wolfestone shards.

    ModLoader.addShapelessRecipe(new ItemStack(wolfestoneShard, 4), new Object[]{ wolfestone });
    This is another way to add a shapeless recipe. As long as there is a piece of wolfestone in the crafting grid, it will give me 4 wolfestone shards.

    ModLoader.addRecipe(new ItemStack(torchWolfestone, 8), new Object [] {"#", "X", Character.valueOf('#'), mod_wolfestone.wolfestoneShard, Character.valueOf('X'), Item.stick});
    Same goes with torches.

    Look at the CraftingManager.java to get a better idea of crafting recipes, and what they look like for every craftable item in the game. Now you know how to make your very own crafting recipes!

    Are you wondering where my adding crafting recipes with dyes tutorial went? Well it moved to the next post! Click Here

    This should do it for the adding new crafting recipes tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 6 - Adding A New Food - Updated

    mod_***
    package net.minecraft.src;
    public class mod_YourModName extends BaseMod
    {
    public static final Item nameHere = new ItemFood(5000, 6, 1F, true).setItemName("anyNameHere");
    
    public void load()
    {
    foodNameHere.iconIndex = ModLoader.addOverride("/gui/items.png", "/image.png");
    	
    ModLoader.addName(foodNameHere, "My Food");
    }
    public String getVersion()
    {
    			 return "1.3.1 MyModDescription";
    }
    }
    There are no new lines of code here. The only part that you would need to change is where you initialize your item. And no, you can not make blocks edible! In the case of my own mod, I made it so that you can craft an edible item out of the block. If anyone needs further explanation, I can add it to this tutorial.

    What's in the code:
    public static final Item nameHere = new ItemFood(5000, 6, 1F, true).setItemName("anyNameHere");
    The only thing that is new here is the ItemFood(5000, 6, 1F, true). You MUST make your item extend the class ItemFood! The 5000 is your item ID, the 6 stands for how many half food icons that your food can heal, not hearts! These are the icons that resemble a corndog right next to your regular hearts. This item will heal 3 full 'food icons.' The 1F stands for how long you can go before you get hungry again, the food saturation level. Lastly, true is a boolean that tells minecraft if your food can be fed to wolves. I put true here just for kicks.

    This should do it for the adding new food tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 7 - Adding New Smelting Recipes - Updated

    Adding New Smelting Recipes For Items:
    ModLoader.addSmelting(yourItem.shiftedIndex, new ItemStack(yourSmeltedItem, 1), 1.0F);
    If you want to add new smelting recipes to your mod you will need to add this line of code above, into your public void load() method in your mod_*** class. It takes three parameters:
    1. yourItem.shiftedIndex, this parameter has to be an integer, so we would use .shiftedIndex to find the item ID of our item. Put the name of your item you want to input into your furnace where it says yourItem.
    2. new ItemStack(yourSmeltedItem, 1), this parameter takes a new instance of the class ItemStack, which takes two more parameters: yourSmeltedItem which is what the furnace will output once the input is smelted, and 1, this number is the amount you will get of the output once it is smelted.
    3. 1.0F, the last parameter is a float, which means that it can be a decimal number. This is how much XP you will receive after each successful smelt.
    Adding New Smelting Recipes For Blocks:
    ModLoader.addSmelting(yourBlock.blockID, new ItemStack(yourSmeltedBlock, 1), 1.0F);
    Adding smelting recipes for blocks is almost identical to adding smelting recipes for items. The only thing that changes is the first parameter:
    1. yourBlock.blockID, this parameter has to be an integer, so we would use .blockID to find the block ID of our block. This is the only difference between items and blocks. Put the name of your item you want to input into your furnace where it says yourBlock.
    2. new ItemStack(yourSmeltedBlock, 1), this parameter takes a new instance of the class ItemStack, which takes two more parameters: yourSmeltedBlock which is what the furnace will output once the input is smelted, and 1, this number is the amount you will get of the output once it is smelted. Even though this references the class ItemStack, this still works for Blocks!
    3. 1.0F, the last parameter is a float, which means that it can be a decimal number. This is how much XP you will receive after each successful smelt.
    This should do it for the adding new smelting recipes tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 8 - Adding New Fuels - Updated

    public int addFuel(int par1, int par2)
    {
    if(par1 == yourFuelItem.shiftedIndex)
    {
    return 9600;
    }
    if(par1 == yourFuelBlock.blockID)
    {
    return 14400;
    }
    	 return 0;
    }
    In order to add new fuels to your mod you need to put this function in your mod_*** file. Make sure that it is NOT inside of the public void load() method! A fuel is and item or block that will power a furnace, such as coal or a block of wood, for example.

    If you want to add a new fuel that is an item:
    if(par1 == yourFuelItem.shiftedIndex)
    {
    return 9600;
    }
    If you want to add a new fuel that is an item, use this if-statement inside of the public int addFuel() function. yourFuelItem.shiftedIndex is the item that you want to be a fuel. Since this requires an integer, and we are dealing with items, we will be using .shiftedIndex. return 9600 returns the amount of ticks the furnace fuel will last. The number of ticks required to smelt one item is 200. Coal smelts for 1600 ticks. This particular item will smelt 48 blocks.


    If you want to add a new fuel that is an item:
    if(par1 == yourFuelBlock.blockID)
    {
    return 14400;
    }
    If you want to add a new fuel that is a block, use this if-statement inside of the public int addFuel() function. yourFuelBlock.blockID is the block that you want to be a fuel. Since this requires an integer, and we are dealing with blocks, we will be using .blockID. return 14400 returns the amount of ticks the furnace fuel will last. The number of ticks required to smelt one item is 200. Coal smelts for 1600 ticks. This particular item will smelt 72 blocks.

    This should do it for the adding new fuels tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 9 - How To Generate Your Own Ore In The Overworld - Updated

    public void generateSurface(World world, Random random, int i, int j)
    {
    for(int k = 0; k < 5; k++)
    {
    	 int randPosX = i + random.nextInt(16);
    	 int randPosY = random.nextInt(128);
    	 int randPosZ = j + random.nextInt(16);
    	 (new WorldGenMinable(yourOreBlockName.blockID, 17)).generate(world, random, randPosX, randPosY, randPosZ);
    }
    }
    In order to generate your own ore on the surface (overworld) you will need to use this code outside of the public void load() method.

    public void generateSurface(World world, Random random, int i, int j)
    This is the ModLoader function that allows modders to generate ores in the overworld.

    for(int k = 0; k < 5; k++)
    This is the initialization for your 'for-loop' The only thing that you need to change here is the k < 5, to any number that you want. This number changes the amount of times that your ore vein can generate per chunk. In laymen's terms, this number controls the rarity of your ore.

    int randPosX = i + random.nextInt(16);
    	 int randPosY = random.nextInt(128);
    	 int randPosZ = j + random.nextInt(16);
    This code is used to find a random x, y, and z variable to spawn the ore vein. Since the y and z coordinates are "flipped" in minecraft (usually the height would be a z coordinate, but here y is the height coordinate) you will have to use the y coordinate as your height coordinate.

    Basically, this code will find random coordinates in a chunk (16 X 16 X 128) to spawn your ore in. If you want your ore to be found only in underground areas, consider changing int randPosY = random.nextInt(128); to something more like int randPosY = random.nextInt(48); Diamond is found at int randPosY = random.nextInt(16); for reference.

    (new WorldGenMinable(yourOreBlockName.blockID, 17)).generate(world, random, randPosX, randPosY, randPosZ);
    This code uses the information above (the random x, y, and coordinate) as well as the WorldGenMineable class to find the most suitable place to generate your ore. The only thing that you would need to change here is this: (yourOreBlockName.blockID, 17), you would put the name of your block, with .blockID here. The 17 is the maximum amount of ore that can spawn in each vein. Diamond is 7, for reference.

    This should do it for the generating your own ore in the overworld tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 10 - How To Generate Your Own Ore In The Nether - Updated

    Generating an ore in the nether is simple, and almost identical to generating an ore in the overworld! The only difference are some parts in the function.

    public void generateNether(World world, Random rand, int i, int j)
    {
    	 for(int m = 0; m < 7; m++)
    	 {
    		 int randPosX = i + rand.nextInt(16);
    		 int randPosY = rand.nextInt(128);
    		 int randPosZ = j + rand.nextInt(16);
    		 (new NetherGenMinable(yourNetherOre.blockID, 15)).generate(world, rand, randPosX, randPosY, randPosZ);
    	 }
    }
    I won't go into too much detail on this function. Look at the previous tutorial if you want a full explanation. What you have to do here is change int randPosY = rand.nextInt(128); to the maximum height you want your ore to generate in the nether.

    (new NetherGenMinable(yourNetherOre.blockID, 15)), this is the key to properly generating your ore in the nether. Change the 15 to what you want the max vein size to be.Also, you must create a new class. Call if whatever you want, but I called mine NetherGenMinable.

    NetherGenMinable
    package net.minecraft.src;
    import java.util.Random;
    public class NetherGenMinable extends WorldGenerator
    {
    /** The block ID of the ore to be placed using this generator. */
    private int minableBlockId;
    /** The number of blocks to generate. */
    private int numberOfBlocks;
    public NetherGenMinable(int par1, int par2)
    {
    	 this.minableBlockId = par1;
    	 this.numberOfBlocks = par2;
    }
    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
    {
    	 float var6 = par2Random.nextFloat() * (float)Math.PI;
    	 double var7 = (double)((float)(par3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
    	 double var9 = (double)((float)(par3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
    	 double var11 = (double)((float)(par5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
    	 double var13 = (double)((float)(par5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
    	 double var15 = (double)(par4 + par2Random.nextInt(3) - 2);
    	 double var17 = (double)(par4 + par2Random.nextInt(3) - 2);
    	 for (int var19 = 0; var19 <= this.numberOfBlocks; ++var19)
    	 {
    		 double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks;
    		 double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks;
    		 double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks;
    		 double var26 = par2Random.nextDouble() * (double)this.numberOfBlocks / 16.0D;
    		 double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
    		 double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
    		 int var32 = MathHelper.floor_double(var20 - var28 / 2.0D);
    		 int var33 = MathHelper.floor_double(var22 - var30 / 2.0D);
    		 int var34 = MathHelper.floor_double(var24 - var28 / 2.0D);
    		 int var35 = MathHelper.floor_double(var20 + var28 / 2.0D);
    		 int var36 = MathHelper.floor_double(var22 + var30 / 2.0D);
    		 int var37 = MathHelper.floor_double(var24 + var28 / 2.0D);
    		 for (int var38 = var32; var38 <= var35; ++var38)
    		 {
    			 double var39 = ((double)var38 + 0.5D - var20) / (var28 / 2.0D);
    			 if (var39 * var39 < 1.0D)
    			 {
    				 for (int var41 = var33; var41 <= var36; ++var41)
    				 {
    					 double var42 = ((double)var41 + 0.5D - var22) / (var30 / 2.0D);
    					 if (var39 * var39 + var42 * var42 < 1.0D)
    					 {
    						 for (int var44 = var34; var44 <= var37; ++var44)
    						 {
    							 double var45 = ((double)var44 + 0.5D - var24) / (var28 / 2.0D);
    							 if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && par1World.getBlockId(var38, var41, var44) == Block.netherrack.blockID)
    							 {
    								 par1World.setBlock(var38, var41, var44, this.minableBlockId);
    							 }
    						 }
    					 }
    				 }
    			 }
    		 }
    	 }
    	 return true;
    }
    }
    This seems like a very complicated class, but don't worry, it is. Luckily you don't have to do anything! Just use this class for your own mod. If you want to know how I created it, all I did was copy the WorldGenMinable class, and changed the part where is says == Block.stone.blockID to == Block.netherrack.blockID. What this does is let minecraft search for an optimal place to put your ore in netherrack, instead of stone.

    This should do it for the generating your own ore in the nether tutorial! Ask any questions below, or tell me what to add to this tutorial.



    Tutorial 11 - How To Create/Add Your Own Custom Achievements - Updated

    Creating and adding your own achievements to the Achievement map is pretty easy! In order to initiate your achievement use the following code:
    public static final Achievement achievementName = new Achievement(5000, "achievementName", 4, 9, Item.diamond, null).registerAchievement();
    This initializes your new achievement. Make sure to place this code outside of your public void load() method!

    Change achievementName to the coding name of your achievement. Now, i'll explain (5000, "achievementName", 4, 9, Item.diamond, null) in greater detail:
    • 5000 is your achievement ID. Try to go over 5,000 just to be safe.
    • "achievementName" this is again, just the coding name of your achievement. Make sure that is the same as the achievementName before it.
    • 4, 9, is the position of your achievement on the achievement grid. You'll pretty much have to just guess and check this one.
    • Item.diamond this is what the achievement image will look like when you get it. You can change this to anything you want.
    • null keep this as is for now, I'll explain what this does further in the tutorial.
    Now, inside of your public void load() method, you need to put this line of code:
    ModLoader.addAchievementDesc(achievementName, "Achievement Name", "Achievement Description");
    This is a ModLoader function for adding a new achievement name and description to your achievement:
    • Where it says achievementName you must put the coding name of your achievement.
    • Change "Achievement Name" to what you want the actual in-game name of the achievement to be when you get it.
    • Lastly, change "Achievement Description" this is what will be underneath your achievement name in the achievement grid; moreover, the achievement description. Try not to make this too long.
    Finally, underneath your public void load() method, you want to add:
    public void takenFromCrafting(EntityPlayer entityplayer, ItemStack itemstack, IInventory iinventory)
    {
    if(itemstack.itemID == Block.blockDiamond.blockID)
    {
    	 entityplayer.addStat(achievementName, 1);
    }
    }
    What this does is trigger the achievement when something is crafted, more specifically a diamond block. This is one of the many ways to trigger an achievement. Some of the others are a bit more complicated.
    • Change Block.blockDiamond.blockID to the block or item that you want to trigger the achievement once crafted.
    • Lastly, change achievementName to the coding name of your achievement.
    Making An Achievement Require Another Achievement:
    This will make it so that you need to trigger another achievement first, before getting your own achievement. I will be using the "Build Better Pickaxe" in-game achievement for this tutorial:
    static Achievement buildBetterPickaxe = AchievementList.buildBetterPickaxe;
    This sets up a variable for the in-game achievement so that it can be used inside of your mod_ class. You can change the buildBetterPickaxe in both cases to any achievement in the game, or even some of your own custom achievements (if you have multiple custom achievements). Look in AchievementList.java for the whole list of minecraft achievements.

    public static final Achievement achievementName = new Achievement(5000, "achievementName", 4, 9, Item.diamond, null).registerAchievement();
    Now we can go back and change our original achievement declaration. Rembember the 'null' part that I was talking about? Well you can now change null to the name of the achievement that you want yours to "offspring" off of, or, in this case make it so that in order to get your achievement, it requires the "Build Better Pickaxe" achievement first:

    public static final Achievement achievementName = new Achievement(5000, "achievementName", 4, 9, Item.diamond, buildBetterPickaxe).registerAchievement();


    Making An Achievement Special:
    This means that the achievement will have a spiky frame around it in the achievement GUI, or grid, as I call it. All that you have to do is add the following code to your achievement initiation:
    .setSpecial()


    The finished code will look like this in your initiation:
    public static final Achievement achievementName = new Achievement(5000, "achievementName", 4, 9, Item.diamond, buildBetterPickaxe).setSpecial().registerAchievement();


    This should do it for the creating and adding your own achievement tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 12 - How To Create Your Own Tool Set - Updated
    Note: This tutorial will require you to edit base classes!

    mod_***
    package net.minecraft.src;
    public class mod_yourMod extends BaseMod
    {
    public static final Item yourPickaxe = (new ItemPickaxe(200, EnumToolMaterial.MATERIALNAME)).setItemName("yourPickaxe");
    public static final Item yourAxe = (new ItemAxe(201, EnumToolMaterial.MATERIALNAME)).setItemName("yourAxe");
    public static final Item yourShovel = (new ItemSpade(202, EnumToolMaterial.MATERIALNAME)).setItemName("yourShovel");
    public static final Item yourSword = (new ItemSword(203, EnumToolMaterial.MATERIALNAME)).setItemName("yourSword");
    public static final Item yourHoe = (new ItemHoe(204, EnumToolMaterial.MATERIALNAME)).setItemName("yourHoe");
    
    public void load()
    {
    yourPickaxe.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourPickaxe.png");
    yourAxe.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourAxe.png");
    yourShovel.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourShovel.png");
    yourSword.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourSword.png");
    yourHoe.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourHoe.png");
    
    ModLoader.addRecipe(new ItemStack(yourPickaxe, 1), new Object [] {"###", " X ", " X ", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourShovel, 1), new Object [] {"#", "X", "X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourSword, 1), new Object [] {"#", "#", "X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourAxe, 1), new Object [] {"##", "#X ", " X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourAxe, 1), new Object [] {"##", "X#", "X ", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourHoe, 1), new Object [] {"##", " X", " X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourHoe, 1), new Object [] {"##", "X ", "X ", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    
    ModLoader.addName(yourPickaxe, "Pickaxe Name");
    ModLoader.addName(yourAxe, "Axe Pickaxe Name");
    ModLoader.addName(yourShovel, "Shovel Pickaxe Name");
    ModLoader.addName(yourSword, "Sword Pickaxe Name");
    ModLoader.addName(yourHoe, "Hoe Pickaxe Name");
    }
    
    public String getVersion()
    {
    return "1.3.2";
    }
    }
    You guys should already be familiar with most of the coding here if you have read my earlier tutorials.

    public static final Item yourPickaxe = new ItemPickaxe(200, EnumToolMaterial.MATERIALNAME).setItemName("yourPickaxe");
    public static final Item yourAxe = new ItemAxe(201, EnumToolMaterial.MATERIALNAME).setItemName("yourAxe");
    public static final Item yourShovel = new ItemSpade(202, EnumToolMaterial.MATERIALNAME.setItemName("yourShovel");
    public static final Item yourSword = new ItemSword(203, EnumToolMaterial.MATERIALNAME).setItemName("yourSword");
    public static final Item yourHoe = new ItemHoe(204, EnumToolMaterial.MATERIALNAME).setItemName("yourHoe");
    These are your tool item initiations:
    • Change yourPickaxe/Axe/Shovel/Sword/Hoe to the name of your tools.
    • EnumToolMaterial.MATERIALNAME is going to be the material that your tools are made of, change this to whatever you want.
    • The rest should be very familiar to your other item initiations.
    yourPickaxe.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourPickaxe.png");
    yourAxe.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourAxe.png");
    yourShovel.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourShovel.png");
    yourSword.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourSword.png");
    yourHoe.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourHoe.png");
    These are your tool textures, and this should also be very familiar to you. Just change the appropriate names.

    ModLoader.addRecipe(new ItemStack(yourPickaxe, 1), new Object [] {"###", " X ", " X ", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourShovel, 1), new Object [] {"#", "X", "X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourSword, 1), new Object [] {"#", "#", "X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourAxe, 1), new Object [] {"##", "#X ", " X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourAxe, 1), new Object [] {"##", "X#", "X ", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourHoe, 1), new Object [] {"##", " X", " X", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    ModLoader.addRecipe(new ItemStack(yourHoe, 1), new Object [] {"##", "X ", "X ", Character.valueOf('#'), yourItem, Character.valueOf('X'), Item.stick});
    These are your tool crafting recipes. Note that there are 7 crafting recipes, and only 5 tools. This is because the axe and the hoe can also be crafted when the recipe is flipped, so I added that in too.

    ModLoader.addName(yourPickaxe, "Pickaxe Name");
    ModLoader.addName(yourAxe, "Axe Pickaxe Name");
    ModLoader.addName(yourShovel, "Shovel Pickaxe Name");
    ModLoader.addName(yourSword, "Sword Pickaxe Name");
    ModLoader.addName(yourHoe, "Hoe Pickaxe Name");
    Add the names of your items, and you're done with the mod_*** file.


    EnumToolMaterial (You are going to have to edit this base class for this tutorial to work)
    package net.minecraft.src;
    public enum EnumToolMaterial
    {
    WOOD(0, 59, 2.0F, 0, 15),
    STONE(1, 131, 4.0F, 1, 5),
    IRON(2, 250, 6.0F, 2, 14),
    EMERALD(3, 1561, 8.0F, 3, 10),
    GOLD(0, 32, 12.0F, 0, 22),
    MATERIALNAME(3, 1248, 6F, 3, 10);
    /**
    	 * The level of material this tool can harvest (3 = DIAMOND, 2 = IRON, 1 = STONE, 0 = IRON/GOLD)
    	 */
    private final int harvestLevel;
    /**
    	 * The number of uses this material allows. (wood = 59, stone = 131, iron = 250, diamond = 1561, gold = 32)
    	 */
    private final int maxUses;
    /**
    	 * The strength of this tool material against blocks which it is effective against.
    	 */
    private final float efficiencyOnProperMaterial;
    /** Damage versus entities. */
    private final int damageVsEntity;
    /** Defines the natural enchantability factor of the material. */
    private final int enchantability;
    private EnumToolMaterial(int par3, int par4, float par5, int par6, int par7)
    {
    	 this.harvestLevel = par3;
    	 this.maxUses = par4;
    	 this.efficiencyOnProperMaterial = par5;
    	 this.damageVsEntity = par6;
    	 this.enchantability = par7;
    }
    /**
    	 * The number of uses this material allows. (wood = 59, stone = 131, iron = 250, diamond = 1561, gold = 32)
    	 */
    public int getMaxUses()
    {
    	 return this.maxUses;
    }
    /**
    	 * The strength of this tool material against blocks which it is effective against.
    	 */
    public float getEfficiencyOnProperMaterial()
    {
    	 return this.efficiencyOnProperMaterial;
    }
    /**
    	 * Damage versus entities.
    	 */
    public int getDamageVsEntity()
    {
    	 return this.damageVsEntity;
    }
    /**
    	 * The level of material this tool can harvest (3 = DIAMOND, 2 = IRON, 1 = STONE, 0 = IRON/GOLD)
    	 */
    public int getHarvestLevel()
    {
    	 return this.harvestLevel;
    }
    /**
    	 * Return the natural enchantability factor of the material.
    	 */
    public int getEnchantability()
    {
    	 return this.enchantability;
    }
    }
    The only line of code that you have to worry about in this class is here:

    MATERIALNAME(3, 1248, 6F, 3, 10);
    This is what defines your material, and it's properties
    • Replace MATERIALNAME with the name of your material. (Caps is proper syntax for this)
    • 3 is the harvest level of your tool material. This is the level of material this tool can harvest (3 = DIAMOND, 2 = IRON, 1 = STONE, 0 = IRON/GOLD)
    • 1248 is the number of uses this material allows before it breaks. (wood = 59, stone = 131, iron = 250, diamond = 1561, gold = 32)
    • 6F is how fast this material can mine blocks that it is supposed to mine; such as how fast a pickaxe mines stone.
    • 3 is how many half hearts of damage your tool will do to a mob or enemy. This will do 1.5 full hearts of damage.
    • 10 is the natural enchantability factor. You'll have to play around with this one.
    I will try to make a tutorial that doesn't edit any base classes eventually, but I'm still trying to figure that out.

    This should do it for the creating your own tool set tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 13 - How To Create Your Own Armor Set - Updated
    Note: This tutorial will require you to edit base classes, but this is the only way to make your armor show up in-game!

    mod_***
    package net.minecraft.src;
    public class mod_yourMod extends BaseMod
    {
    public static final Item yourHelmet = new ItemArmor(5001, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 0).setItemName("yourHelmet");
    public static final Item yourChestplate = new ItemArmor(5002, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 1).setItemName("yourChestplate");
    public static final Item yourLeggings = new ItemArmor(5003, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 2).setItemName("yourLeggings");
    public static final Item yourBoots = new ItemArmor(5004, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 3).setItemName("yourBoots");
    
    public void load()
    {
    yourHelmet.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourHelmet.png");
    yourChestplate.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourChestplate.png");
    yourLeggings.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourLeggings.png");
    yourBoots.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/yourBoots.png");
    
    ModLoader.addRecipe(new ItemStack(yourHelmet, 1), new Object [] {"###", "# #", Character.valueOf('#'), yourItem});
    ModLoader.addRecipe(new ItemStack(yourChestplate, 1), new Object [] {"# #", "###", "###", Character.valueOf('#'), yourItem});
    ModLoader.addRecipe(new ItemStack(yourLeggings, 1), new Object [] {"###", "# #", "# #", Character.valueOf('#'), yourItem});
    ModLoader.addRecipe(new ItemStack(yourBoots, 1), new Object [] {"# #", "# #", Character.valueOf('#'), yourItem});
    ModLoader.addName(yourHelmet, "Helmet");
    ModLoader.addName(yourChestplate, "Chestplate");
    ModLoader.addName(yourLeggings, "Leggings");
    ModLoader.addName(yourBoots, "Boots");
    }
    
    public String getVersion()
    {
    return "1.3.2";
    }
    }
    Most of this code should be familiar to you, so I won't go into too much detail. Change things as needed.


    public static final Item yourHelmet = new ItemArmor(5001, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 0).setItemName("yourHelmet");
    public static final Item yourChestplate = new ItemArmor(5002, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 1).setItemName("yourChestplate");
    public static final Item yourLeggings = new ItemArmor(5003, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 2).setItemName("yourLeggings");
    public static final Item yourBoots = new ItemArmor(5004, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 3).setItemName("yourBoots");
    Here you need to change the following:

    new ItemArmor(5001, EnumArmorMaterial.ARMORMATERIAL, ModLoader.addArmor("yourarmor"), 0)
    This part of the code creates a new instance of ItemArmor and registers your armor with ModLoader.
    • Change EnumArmorMaterial.ARMORMATERIAL to whatever armor material you are planning on making your armor out of.
    • Change ModLoader.addArmor("yourarmor") to whatever you want the prefix of the armor overlay textures to be. You will have to make new png files called yourarmor_1 and yourarmor_2 in order for the overlay to show up in-game. An example of these textures can be found in the bin/minecraft.jar/armor folder.
    EnumArmorMaterial (You are going to have to edit this base class for this tutorial to work)
    package net.minecraft.src;
    public enum EnumArmorMaterial
    {
    CLOTH(5, new int[]{1, 3, 2, 1}, 15),
    CHAIN(15, new int[]{2, 5, 4, 1}, 12),
    IRON(15, new int[]{2, 6, 5, 2}, 9),
    GOLD(7, new int[]{2, 5, 3, 1}, 25),
    DIAMOND(33, new int[]{3, 8, 6, 3}, 10),
    ARMORMATERIAL(38, new int[]{4, 12, 8, 4}, 18);
    /**
    	 * Holds the maximum damage factor (each piece multiply this by it's own value) of the material, this is the item
    	 * damage (how much can absorb before breaks)
    	 */
    private int maxDamageFactor;
    /**
    	 * Holds the damage reduction (each 1 points is half a shield on gui) of each piece of armor (helmet, plate, legs
    	 * and boots)
    	 */
    private int[] damageReductionAmountArray;
    /** Return the enchantability factor of the material */
    private int enchantability;
    private EnumArmorMaterial(int par3, int[] par4ArrayOfInteger, int par5)
    {
    	 this.maxDamageFactor = par3;
    	 this.damageReductionAmountArray = par4ArrayOfInteger;
    	 this.enchantability = par5;
    }
    /**
    	 * Returns the durability for a armor slot of for this type.
    	 */
    public int getDurability(int par1)
    {
    	 return ItemArmor.getMaxDamageArray()[par1] * this.maxDamageFactor;
    }
    /**
    	 * Return the damage reduction (each 1 point is a half a shield on gui) of the piece index passed (0 = helmet, 1 =
    	 * plate, 2 = legs and 3 = boots)
    	 */
    public int getDamageReductionAmount(int par1)
    {
    	 return this.damageReductionAmountArray[par1];
    }
    /**
    	 * Return the enchantability factor of the material.
    	 */
    public int getEnchantability()
    {
    	 return this.enchantability;
    }
    }
    This class controls all of the functions of your new armor material.


    ARMORMATERIAL(38, new int[]{4, 12, 8, 4}, 18);
    • The 38 is the overall damage factor that your armor can absorb before it breaks.
    • The new int[]{4, 12, 8, 4} controls the damage factor per item of armor. Helmet, Chestplate, Leggings, Boots.
    • The 18 controls the max enchantibility factor of the armor.
    This should do it for the creating your own armor set tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 14 - How To Add Custom Trees/Saplings - Updated
    Making a new tree is a very complicated process. For this tutorial, I will be creating a new tree and sapling that will generate in the Forest. Later on I will show you how to make the tree generate in your own biome and even in your own dimension. Note that this tutorial is only for generating your tree in a pre-made minecraft biome in the overworld.

    mod_***
    In order to get your tree to generate in a specific biome, you will need to put this code under the public void load() method in your mod_ file. If you already have a generateSurface() method, make sure to add the code inside of it to your already made method. Make sure that you have defined a new type of wood, leaf, and sapling in your mod_ class also. I go over how to initiate blocks and items in my earlier tutorials.

    public void generateSurface(World world, Random rand, int chunkX, int chunkZ)
    {
    BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(chunkX, chunkZ);
    WorldGenYourTree tree = new WorldGenYourTree(); //Change this to the World Gens or your tree and make sure that the parameters match if you get errors!
    if(biome instanceof BiomeGenForest)
    {
    for(int c = 0; c < 3; c++)
    {
    int Xcoord = chunkX + rand.nextInt(16);
    int Zcoord = chunkZ + rand.nextInt(16);
    	int i = world.getHeightValue(Xcoord, Zcoord);
    	tree.generate(world, rand, Xcoord, i, Zcoord);
    }
    }
    }
    What this code will do is find a random X and Z location within a chunk and generate a tree there. This will generate 3 trees within any given chunk. Lowering the c < 3 will result in less trees, and vice versa.

    In order to actually generate anything you will need a new WorldGenYourTree class.
    WorldGenYourTree
    package net.minecraft.src;
    
    import java.util.Random;
    
    public class WorldGenYourTree extends WorldGenerator
    {
    public WorldGenYourTree()
    {
    }
    
    public boolean generate(World world, Random random, int i, int j, int k)
    {
    	 int l = random.nextInt(1) + 4;
    	 boolean flag = true;
    	 if(j < 1 || j + l + 1 > 256)
    	 {
    		 return false;
    	 }
    	 for(int i1 = j; i1 <= j + 1 + l; i1++)
    	 {
    		 byte byte0 = 1;
    		 if(i1 == j)
    		 {
    			 byte0 = 0;
    		 }
    		 if(i1 >= (j + 1 + l) - 2)
    		 {
    			 byte0 = 2;
    		 }
    		 for(int i2 = i - byte0; i2 <= i + byte0 && flag; i2++)
    		 {
    			 for(int l2 = k - byte0; l2 <= k + byte0 && flag; l2++)
    			 {
    				 if(i1 >= 0 && i1 < 256)
    				 {
    					 int j3 = world.getBlockId(i2, i1, l2);
    					 if(j3 != 0 && j3 != mod_yourMod.yourLeaf.blockID) //Change this to your leaf block.
    					 {
    						 flag = false;
    					 }
    				 } else
    				 {
    					 flag = false;
    				 }
    			 }
    		 }
    	 }
    	 if(!flag)
    	 {
    		 return false;
    	 }
    	 int j1 = world.getBlockId(i, j - 1, k);
    	 if(j1 != Block.grass.blockID && j1 != Block.dirt.blockID || j >= 256 - l - 1) //This determines on what blocks your tree can generate.
    	 {
    		 return false;
    	 }
    	 world.setBlock(i, j - 1, k, Block.dirt.blockID); //Also determines what block your tree can generate on.
    	 for(int k1 = (j - 3) + l; k1 <= j + l; k1++)
    	 {
    		 int j2 = k1 - (j + l);
    		 int i3 = 1 - j2 / 2;
    		 for(int k3 = i - i3; k3 <= i + i3; k3++)
    		 {
    			 int l3 = k3 - i;
    			 for(int i4 = k - i3; i4 <= k + i3; i4++)
    			 {
    				 int j4 = i4 - k;
    				 if((Math.abs(l3) != i3 || Math.abs(j4) != i3 || random.nextInt(2) != 0 && j2 != 0) && !Block.opaqueCubeLookup[world.getBlockId(k3, k1, i4)])
    				 {
    					 setBlockAndMetadata(world, k3, k1, i4, mod_yourMod.yourLeaf.blockID, 0); //Change to your leaf block.
    				 }
    			 }
    		 }
    	 }
    	 for(int l1 = 0; l1 < l; l1++)
    	 {
    		 int k2 = world.getBlockId(i, j + l1, k);
    		 if(k2 == 0 || k2 == mod_yourMod.yourLeaf.blockID)
    		 {
    			 setBlockAndMetadata(world, i, j + l1, k, mod_yourMod.yourWood.blockID, 0); //Change to your wood block.
    		 }
    	 }
    	 return true;
    }
    }
    This class determines the shape of your tree, and what types of leaves it will use and what type of wood it will use to generate your tree. It also determines what blocks your tree can spawn on. All that you need to do here is change some of the names around, and the rest is explained in the comments.

    In order to make your own type of wood log you will need the following class
    BlockYourLog
    package net.minecraft.src;
    
    import java.util.Random;
    
    
    public class BlockYourLog extends Block
    {
    protected BlockYourLog(int i)
    {
    	 super(i, Material.wood);
    }
    
    
    public int quantityDropped(Random random)
    {
    	 return 1;
    }
    
    public int idDropped(int i, Random random, int j)
    {
    	 return mod_yourMod.yourLog.blockID; //Change to your wood block
    }
    
    
    public void harvestBlock(World world, EntityPlayer entityplayer, int i, int j, int k, int l)
    {
    	 super.harvestBlock(world, entityplayer, i, j, k, l);
    }
    
    public void onBlockRemoval(World world, int i, int j, int k)
    {
    	 byte byte0 = 4;
    	 int l = byte0 + 1;
    	 if(world.checkChunksExist(i - l, j - l, k - l, i + l, j + l, k + l))
    	 {
    		 for(int i1 = -byte0; i1 <= byte0; i1++)
    		 {
    			 for(int j1 = -byte0; j1 <= byte0; j1++)
    			 {
    				 for(int k1 = -byte0; k1 <= byte0; k1++)
    				 {
    					 int l1 = world.getBlockId(i + i1, j + j1, k + k1);
    					 if(l1 != mod_yourMod.yourLeaf.blockID) //Change to your leaf block.
    					 {
    						 continue;
    					 }
    					 int i2 = world.getBlockMetadata(i + i1, j + j1, k + k1);
    					 if((i2 & 8) == 0)
    					 {
    						 world.setBlockMetadata(i + i1, j + j1, k + k1, i2 | 8);
    					 }
    				 }
    			 }
    		 }
    	 }
    }
    
    public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
    	 if(i == 0)
    return mod_yourMod.yourLogBottom;
    if(i == 1)
    return mod_yourMod.yourLogBottom;
    if(i == 2)
    return mod_yourMod.yourLogSide;
    if(i == 3)
    return mod_yourMod.yourLogSide;
    if(i == 4)
    return mod_yourMod.yourLogSide;
    if(i == 5)
    return mod_yourMod.yourLogSide;
    
    	 if(j == 1)
    	 {
    		 return 116;
    	 }
    	 return j != 2 ? 20 : 117;
    }
    
    
    public int damageDropped(int i)
    {
    	 return i;
    }
    }
    The getBlockTextureFromSideAndMetadata() method is something new, and is something that I will go over in my multi-textured blocks tutorial. That is coming up soon. Basically what this class does it get the texture of your wood block, and it also gets the ID of the item that your block drops, which is the wood block itself.

    Next you will need a new leaves class.
    BlockYourLeaf
    package net.minecraft.src;
    import java.util.Random;
    public class BlockYourLeaf extends BlockLeavesBase
    {
    private int baseIndexInPNG;
    int adjacentTreeBlocks[];
    
    protected BlockYourLeaf(int i, int j)
    {
    	 super(i, j, Material.leaves, false);
    	 setTickRandomly(true);
    }
    
    public int getBlockColor()
    {
    	 double d = 0.5D;
    	 double d1 = 1.0D;
    	 return 0;
    }
    public void onBlockRemoval(World world, int i, int j, int k)
    {
    	 int l = 1;
    	 int i1 = l + 1;
    	 if(world.checkChunksExist(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1))
    	 {
    		 for(int j1 = -l; j1 <= l; j1++)
    		 {
    			 for(int k1 = -l; k1 <= l; k1++)
    			 {
    				 for(int l1 = -l; l1 <= l; l1++)
    				 {
    					 int i2 = world.getBlockId(i + j1, j + k1, k + l1);
    					 if(i2 == mod_yourMod.yourSapling.blockID) //Change to your sapling block.
    					 {
    						 int j2 = world.getBlockMetadata(i + j1, j + k1, k + l1);
    						 world.setBlockMetadata(i + j1, j + k1, k + l1, j2 | 8);
    					 }
    				 }
    			 }
    		 }
    	 }
    }
    public void updateTick(World world, int i, int j, int k, Random random)
    {
    	 if(world.isRemote)
    	 {
    		 return;
    	 }
    	 int l = world.getBlockMetadata(i, j, k);
    	 if((l & 8) != 0 && (l & 4) == 0)
    	 {
    		 byte byte0 = 4;
    		 int i1 = byte0 + 1;
    		 byte byte1 = 32;
    		 int j1 = byte1 * byte1;
    		 int k1 = byte1 / 2;
    		 if(adjacentTreeBlocks == null)
    		 {
    			 adjacentTreeBlocks = new int[byte1 * byte1 * byte1];
    		 }
    		 if(world.checkChunksExist(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1))
    		 {
    			 for(int l1 = -byte0; l1 <= byte0; l1++)
    			 {
    				 for(int k2 = -byte0; k2 <= byte0; k2++)
    				 {
    					 for(int i3 = -byte0; i3 <= byte0; i3++)
    					 {
    						 int k3 = world.getBlockId(i + l1, j + k2, k + i3);
    						 if(k3 == mod_yourMod.yourLog.blockID) //Change to your wood block.
    						 {
    							 adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = 0;
    							 continue;
    						 }
    						 if(k3 == mod_yourMod.yourLeaf.blockID) //Change to your leaf block.
    						 {
    							 adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = -2;
    						 } else
    						 {
    							 adjacentTreeBlocks[(l1 + k1) * j1 + (k2 + k1) * byte1 + (i3 + k1)] = -1;
    						 }
    					 }
    				 }
    			 }
    			 for(int i2 = 1; i2 <= 4; i2++)
    			 {
    				 for(int l2 = -byte0; l2 <= byte0; l2++)
    				 {
    					 for(int j3 = -byte0; j3 <= byte0; j3++)
    					 {
    						 for(int l3 = -byte0; l3 <= byte0; l3++)
    						 {
    							 if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] != i2 - 1)
    							 {
    								 continue;
    							 }
    							 if(adjacentTreeBlocks[((l2 + k1) - 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] == -2)
    							 {
    								 adjacentTreeBlocks[((l2 + k1) - 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] = i2;
    							 }
    							 if(adjacentTreeBlocks[(l2 + k1 + 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] == -2)
    							 {
    								 adjacentTreeBlocks[(l2 + k1 + 1) * j1 + (j3 + k1) * byte1 + (l3 + k1)] = i2;
    							 }
    							 if(adjacentTreeBlocks[(l2 + k1) * j1 + ((j3 + k1) - 1) * byte1 + (l3 + k1)] == -2)
    							 {
    								 adjacentTreeBlocks[(l2 + k1) * j1 + ((j3 + k1) - 1) * byte1 + (l3 + k1)] = i2;
    							 }
    							 if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1 + 1) * byte1 + (l3 + k1)] == -2)
    							 {
    								 adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1 + 1) * byte1 + (l3 + k1)] = i2;
    							 }
    							 if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + ((l3 + k1) - 1)] == -2)
    							 {
    								 adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + ((l3 + k1) - 1)] = i2;
    							 }
    							 if(adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + (l3 + k1 + 1)] == -2)
    							 {
    								 adjacentTreeBlocks[(l2 + k1) * j1 + (j3 + k1) * byte1 + (l3 + k1 + 1)] = i2;
    							 }
    						 }
    					 }
    				 }
    			 }
    		 }
    		 int j2 = adjacentTreeBlocks[k1 * j1 + k1 * byte1 + k1];
    		 if(j2 >= 0)
    		 {
    			 world.setBlockMetadata(i, j, k, l & -9);
    		 } else
    		 {
    			 removeLeaves(world, i, j, k);
    		 }
    	 }
    }
    private void removeLeaves(World world, int i, int j, int k)
    {
    	 dropBlockAsItem(world, i, j, k, world.getBlockMetadata(i, j, k), 0);
    	 world.setBlockWithNotify(i, j, k, 0);
    }
    public int quantityDropped(Random random)
    {
    	 return random.nextInt(20) != 0 ? 0 : 1;
    }
    public int idDropped(int i, Random random, int j)
    {
    	 return mod_yourMod.yourSapling.blockID; //Makes your leaves drop your type of sapling.
    }
    public void dropBlockAsItemWithChance(World world, int i, int j, int k, int l, float f, int i1)
    {
    	 super.dropBlockAsItemWithChance(world, i, j, k, l, f, i1);
    	 if (!world.isRemote && (l & 3) == 0 && world.rand.nextInt(50) == 0)
    	 {
    		 dropBlockAsItem_do(world, i, j, k, new ItemStack(Item.apple.shiftedIndex, 1, 0)); //Makes your leaf have a 1/50 chance to drop an apple.
    	 }
    }
    public void harvestBlock(World world, EntityPlayer entityplayer, int i, int j, int k, int l)
    {
    	 if (!world.isRemote && entityplayer.getCurrentEquippedItem() != null && entityplayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex)
    	 {
    		 entityplayer.addStat(StatList.mineBlockStatArray[blockID], 1);
    		 dropBlockAsItem_do(world, i, j, k, new ItemStack(Block.leaves.blockID, 1, l & 3));
    	 }
    	 else
    	 {
    		 super.harvestBlock(world, entityplayer, i, j, k, l);
    	 }
    }
    public int damageDropped(int i)
    {
    	 return i & 3;
    }
    public boolean isOpaqueCube()
    {
    	 return !graphicsLevel;
    }
    public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
    	 if((j & 3) == 1)
    	 {
    		 return blockIndexInTexture;
    	 }else{
    		 return blockIndexInTexture;		
    	 }
    }
    public void setGraphicsLevel(boolean flag)
    {
    	 graphicsLevel = flag;
    }
    public void onEntityWalking(World world, int i, int j, int k, Entity entity)
    {
    	 super.onEntityWalking(world, i, j, k, entity);
    }
    }
    This creates all of the technical things for your new leaf block.

    Lastly, you need a new sapling block
    BlockYourSapling
    package net.minecraft.src;
    
    import java.util.Random;
    
    public class BlockYourSapling extends BlockFlower
    {
    protected BlockYourSapling(int i, int j)
    {
    	 super(i, j);
    	 float f = 0.4F;
    	 setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f);
    }
    
    protected boolean canThisPlantGrowOnThisBlockID(int i)
    {
    	 return i == Block.grass.blockID; //Makes this grow on grass.
    }
    
    
    public void updateTick(World world, int i, int j, int k, Random random)
    {
    	 if(world.isRemote)
    	 {
    		 return;
    	 }
    	 super.updateTick(world, i, j, k, random);
    	
    	 if(world.getBlockLightValue(i, j + 1, k) >= 9 && random.nextInt(7) == 0)
    	 {
    		 int l = world.getBlockMetadata(i, j, k);
    		 if((l & 8) == 0)
    		 {
    			 world.setBlockMetadataWithNotify(i, j, k, l | 8);
    		 } else
    		 {
    			 growTree(world, i, j, k, random);
    		 }
    	 }
    }
    public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
    	 j &= 3;
    	 if(j == 1)
    	 {
    		 return blockIndexInTexture; //63
    	 }
    	 if(j == 2)
    	 {
    		 return blockIndexInTexture; //79
    	 } else
    	 {
    		 return blockIndexInTexture;
    	 }
    }
    public void growTree(World world, int i, int j, int k, Random random)
    {
    	 int l = world.getBlockMetadata(i, j, k) & 3;
    	 world.setBlock(i, j, k, 0);
    	 Object obj = null;
    	 obj = new WorldGenYourTree();
    	 if(!((WorldGenerator) (obj)).generate(world, random, i, j, k))
    	 {
    		 world.setBlockAndMetadata(i, j, k, blockID, l);
    	 }
    }
    public int damageDropped(int i)
    {
    	 return i & 3;
    }
    }
    This creates everything you need for a new sapling.

    This tutorial will not cover how to make an object instantly grow your tree from your sapling! That will be explained at a later date.

    This should do it for the creating and generating a new tree/sapling tutorial! Ask any questions below, or tell me what to add to this tutorial.

    Tutorial 15 - How To Create A New Biome - Updated
    Creating a new biome is an interesting, but not very complex process. I will show you the basics, and you can add on to this on your own to make the new biome yours. This tutorial will show how to generate the biome in the overworld using your own top and filler block and also show you how to generate your own tree from the previous tutorial inside of the biome. This tutorial will not show you how to generate your biome in your new dimension, that is for the next tutorial.

    mod_***
    First off, you will need the following lines of code inside of your mod_*** class.
    public static final BiomeGenBase biomeName = (new BiomeGenYourBiome(40)).setBiomeName("Biome Name");
    Put this code outside of the public void load() method.
    • Change biomeName to the coding name of your biome.
    • (new BiomeGenYourBiome(40) casts your BiomeGen class upon a new Biome ID. Make sure that the number you put here is lower than 127 because of java's byte limit.
    • .setBiomeName("biomeName") sets the in-game name of your biome. This is only visible from the F3 (debug) menu when you're in that biome.
    ModLoader.addBiome(nameHere);
    Put this code inside of the public void load() method. This is the ModLoader function for adding a new biome to the world generation list.

    public static void generateSurface(World world, Random rand, int chunkX, int chunkZ)
    {
    BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(chunkX, chunkZ);
    	
    	 WorldGenYourTree tree = new WorldGenYourTree();
    	
    	 if(biome instanceof BiomeGenYourBiome)
    	 {
    		 for(int x = 0; x < 8; x++)
    		 {
    		 tree = new WorldGenYourTree();
    		 int Xcoord = chunkX + rand.nextInt(16);
    		 int Zcoord = chunkZ + rand.nextInt(16);
    		 int i = world.getHeightValue(Xcoord, Zcoord);
    		 tree.generate(world, rand, Xcoord, i, Zcoord);
    		 }
    	 }
    }
    Put this code outside of your public void load() method. If you already have a generateSurface() method with ore generation and such inside of it, then make sure to add the contents of this one to it. Make sure to change the names of the WorldGens to fit your trees. for(int x = 0; x < 8; x++) is the rarity of your trees per chunk. Change the 8 to fit your needs.

    Make sure that you also add two new blocks, a new type of grass and dirt, to your mod_*** file following my new block tutorial. To make the new type of grass, make sure to use code from BlockGrass.java and my multi-textured block tutorial.

    BiomeGenYourBiome
    package net.minecraft.src;
    import java.util.Random;
    public class BiomeGenWolfeland extends BiomeGenBase
    {
    public BiomeGenWolfeland(int par1)
    {
    	 super(par1);
    	 this.spawnableCreatureList.clear();
    	 this.spawnableMonsterList.clear();
    	 this.spawnableWaterCreatureList.clear();
    	 this.topBlock = (byte)mod_wolfestone.wolfeGrass.blockID;
    	 this.fillerBlock = (byte)mod_wolfestone.wolfeDirt.blockID;
    	 this.minHeight = -0.4F;
    	 this.maxHeight = 0.54F;
    }
    This class handles all of the little details included in a biome.
    • this.spawnableCreatureList.clear(); This clears any passive mobs from spawning in your biome.
    • this.spawnableMonsterList.clear(); This clears any monsters from spawning in your biome at night.
    • this.spawnableWaterCreatureList.clear(); This clears squid from spawning in your biome. If you want to know how to spawn a specific creature in the biome, have a look at the other BiomeGen classes.
    • this.topBlock = (byte)mod_yourMod.yourGrass.blockID; Sets the top block for your biome. This is the first layer that you see, such as grass in most biomes. This will work for any block. You can even set this to lava, but it will get really messy...
    • this.fillerBlock = (byte)mod_yourMod.yourDirt.blockID; This sets the filler block for your biome. The filler block is the block 4-5 layers deep after the top block. This is usually dirt in most cases, but again, you can set this to anything you like.
    • this.minHeight = -0.4F; This sets the minimum height for you biome. Setting this below 0F, makes lakes able to generate in your biome.
    • this.maxHeight = 0.54F; Sets the maximum height for you biome. If you want large mountains, try setting larger numbers.
    And that's it! You have now created your own custom biome. Please test this tutorial, and tell me if it works in the comments below. If you are having a problem with this tutorial, please tell me and I will fix it. The Dimension tutorial should come out soon.

    This should do it for the creating your own biome tutorial! Ask any questions below, or tell me what to add to this tutorial.

    _____________________

    Please STOP asking for mob tutorials. There is going to be no mob tutorial soon or in the near future. If you decide to ask for one, your comment will be ignored. If you decide to try other tutorials, I wish you the best of luck in your modding endeavors and in finding a mob tutorial that suits you.

    _____________________

    Please click that little right below this post, it will make my day :)
    [represent]
    Posted in: Tutorials
  • To post a comment, please login.
  • 1
  • 2
  • Next

Social Media

Services

Sign In

Help

Advertise

Resources

Terms of Service

Privacy Policy

Our Communities

  • MMO-Champion
  • HearthPwn
  • Minecraft Forum
  • Overframe
  • MTG Salvation
  • DiabloFans

© 2021 MagicFind, Inc. All rights reserved.

Mobile View