• 11

    posted a message on [1.6.4] [Forge] [SSP/SMP/LAN] Glacier Ice [V 6.6] - Back in Blue! Capes! [Updated 9/28/13]
    By fisherman77

    Ever wished you could do some ice skating races, but the ice is to slow?Ever wanted to propel your self off a giant cliff?Or how about wanting to make a roller coaster?To make it simpler: This mod adds in Glacier Ice that propels you and bounces you!

    Index

    DownloadsGlacier Ice 6.6 (.jar)Minecraft Forge:http://files.minecraftforge.net/

    Blocks
    Blue Glacier Ice
    Blue Glacier Ice speeds you up whenever you walk on it.

    Green Glacier Ice
    Green Glacier Ice makes you bounce high when you walk/touch it.


    Textures
    Texture packs that decide to include mod support for Glacier Ice are heavily appreciated.(Click a picture for link)Syphax PureBD by Tazer4ever



    Maps
    Custom maps are always really fun to have and help showcase the mod. If you made a map that you don't see here, let me know.
    Hero5678's Glacier MapThe Glacier Ice Games
    Pip766's Glacier Map


    Credits
    Modder & Texturer: fisherman77
    Tutorials: Mr. Hobo & DeverionX
    Post Template: BalkondeurAlpha


    Videos
    Videos are fun to watch, so make one and I'll post it up here! They take up a lot of space on the page, and I've rewritten the thread to make it more concise and organized, so now they're all in a spoiler:

    I'll do this part later!
    Showcase
    Installation


    BannersIf you really like the mod and would like to support it, paste this code in your signature:

    [url=http://www.minecraftforum.net/topic/1107660-162-forge-sspsmplan-glacier-ice-v-65-back-in-blue-updated-72213/][img]https://dl.dropboxusercontent.com/u/43717161/Mods/Glacier%20Ice/Media/GlacierIceBanner.png[/img][/url]




    InstallationOnce you install Forge, installing Glacier Ice is as easy as going to the "minecraft" folder and dragging and dropping the .jar into the "mods" folder within the "minecraft" folder.


    ModpacksI've never said no to having Glacier Ice included in a modpack, but I do require that you ask me before I blindly give in.


    Troubleshooting
    I'll type here later. For now, if you have trouble, leave a reply.


    Changelog

    6.6:


    Updated to 1.6.4 Added Glacier Ice Capes - supporters will have an in-game cape for their fiscal, moral, or code contributions to help the Mod - works in SMP, I believe Reworked Blue Glacier Ice ID in config - should make update times even shorter now! :)
    6.5:
    • Updated to 1.6.2
    6.4:
    • Updated to 1.6.1
    6.3:
    • Updated to 1.5.2
    V 6.2
    • Updated to 1.5.1
    • Config for Blue Glacier Ice ID now works! Keep below 256 because its important to biome generation!
    • Fixed both blocks having the same name
    V 6.0
    • Updated to 1.5
    • Config fixed. You can now change the IDs of Glacier Ice to your own liking, in case you have another mod that uses those IDs
    • Textures are now individual pictures
    • Glacier Ice biome added back in (post some pictures when you find it!)
    • Note: I had to change the IDs of the blocks to fix the config. This will be the last ID change, but you might have to reload your worlds!
    V 5.6
    • Green Glacier Ice no longer deals damage and you no longer have to walk to be launched up, just touch it
    • Resized the Glacier Ice logo. You can now see it clearly in the Mods section when you start Minecraft
    V 5.5
    • Updated to 1.4.7
    • SMP compatible - make your own Glacier Ice Servers and connect to them (test server and server-side tutorial coming soon)
    V 5.0
    • Updated to 1.4.6
    • Added custom creative inventory tab for Glacier Ice
    • Removed Glacier Biome (sorry! read more below)
    • Moved to FML (Forge)
    V 4.5- updated to 1.3.2- added both green + blue to creative inventory (been needed for a long time)V4.0- updated to 1.3.1- added green glacier iceV 3.5- fixed the biome problem and potentially others!- hurray! let me know if there are still more- fool-proof (tested by me)V 3.0- added biomes - proved to be buggyV 2.0- updated to 1.2.4V 1.0- first release (1.2.3)



    Bugs and TodoOld Versions
    [1.6.1] Glacier Ice 6.4
    [1.5.2] Glacier Ice 6.3
    [1.5.1] Glacier Ice 6.2
    [1.5.0] Glacier Ice 6.0
    [1.4.7] Glacier Ice 5.6
    [1.4.7] Glacier Ice 5.5
    1.4.6 - Version 5.0 - also works on 1.4.7
    1.3.2 - Version 4.5
    1.3.1 - Version 4.0
    1.2.5 - Version 3.5
    1.2.4 - Version 2.0


    [represent]
    Posted in: Minecraft Mods
  • 9

    posted a message on [1.6.4] fisherman77's Modding Tutorials [Last Updated: 10/31/13] - NEW CUSTOM MODEL MOB TUT
    fisherman77's Modding Tutorials

    All should work for 1.6.4, with maybe some minor changes in method names in NPC. Let me know if you have problems.

    Hello again. Looks like we're back with an update that changes a lot. So I figured I mine as well document what I learn as I go. This is gonna be pretty relaxed, so I might write up a big, extensive tutorial documenting and explaining everything, I might just copy and paste another tutorial or some code, or I might just put a link to something helpful. The catch is I'm gonna do my best to keep everything updated.

    If you have any comments or questions (or requests, once we all get a little more comfortable in 1.6.2), please leave a reply. Also, I admire simo_415's way of doing things (as you can see from my tutorial list), so if you can, please leave a tutorial as a reply on this thread & I can link to it below:


    First Steps:

    Setting Up MCP & Forge
    Minecraft Version: 1.6.4
    Authors: Sprite99 (Original Author) & fisherman77

    Setting Up Eclipse
    Minecraft Version: 1.6.4
    Authors: Sprite99 (Original Author) & fisherman77

    Setting Up GitHub
    Minecraft Version: all
    Authors: fisherman77

    Creating a Basic Mod
    Minecraft Version: 1.6.4
    Authors: DeverionX (Original Author, I think) & fisherman77

    Packaging Your Mod for Distribution
    Minecraft Version: 1.6.4
    Authors: fisherman77


    Blocks:

    Creating a Basic Block
    Minecraft Version: 1.6.4
    Authors: fisherman77

    Crafting and Smelting Recipes
    Minecraft Version: 1.6.4
    Authors: fisherman77


    Items:

    Creating a Basic Item
    Minecraft Version: 1.6.4
    Authors: fisherman77

    Crafting and Smelting Recipes
    Minecraft Version: 1.6.4
    Authors: fisherman77


    Mobs:

    Creating a Basic NPC
    Minecraft Version: 1.6.4
    Authors: fisherman77

    Creating a Custom Modeled Mob
    Minecraft Version: 1.6.4
    Authors: fisherman77
    Posted in: Mapping and Modding Tutorials
  • 1

    posted a message on PaleoCraft -- Realistic Dinosaurs in Minecraft!
    Fixed it. Will be included in the massive bug-fix update/1.6.4 update that's just about done!
    Posted in: Minecraft Mods
  • 3

    posted a message on [1.6.4] fisherman77's Modding Tutorials [Last Updated: 10/31/13] - NEW CUSTOM MODEL MOB TUT
    Today, I'm going to show you how to create a basic biped mob in Minecraft. I know I skipped over stuff like armor, creative tabs, tools, etc., but I can do all of that later, putting aside the fact that every single tutorial on these forums as those things. Anyways, let's get started. So, for today, I'm going to give you straight out of my mod. In Zeuscraft, I've added an absurd amount of biped mobs (BTW, biped is basically the model for the player); nearly 18 bipeds. So I'm going to take one of them, Zeus, and show you how to create the biped mob. I call it NPC because it helps people envision it better, but an NPC is still a mob nonetheless.

    Creating a Biped NPC

    So I do this backwards from most people - we're going to start off by creating a render file. Now, render files usually are not that long for normal mobs, but for NPCs and players, we have to render stuff like their held item, their armor, etc., so it's going to be much longer than normal. So here is our first file, we're going to put it in a new package called fisherman77.zeuscraft.mobs.

    Optionally, if you know that you're going to have a ton of mobs, you can put all the render files in a separate package like fisherman77.zeuscraft.client.render, or you could group the entity (AI) files and render files in groups like in my case putting the immortals from Greek mythology in fisherman77.zeuscraft.olympians -- whatever works for you.



    RenderZeus.java:
    package fisherman77.zeuscraft.common.mobs.olympus;
    
    import com.google.common.collect.Maps;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    import java.util.Map;
    import net.minecraft.block.Block;
    import net.minecraft.client.model.ModelBiped;
    import net.minecraft.client.renderer.RenderBlocks;
    import net.minecraft.client.renderer.entity.RenderLiving;
    import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLiving;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.EnumArmorMaterial;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemArmor;
    import net.minecraft.item.ItemBlock;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.ResourceLocation;
    import org.lwjgl.opengl.GL11;
    import static net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED;
    import static net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D;
    import net.minecraftforge.client.ForgeHooksClient;
    import net.minecraftforge.client.IItemRenderer;
    import net.minecraftforge.client.MinecraftForgeClient;
    
    @SideOnly(Side.CLIENT)
    public class RenderZeus extends RenderLiving
    {
    protected ModelBiped modelBipedMain;
    protected float field_77070_b;
    protected ModelBiped field_82423_g;
    protected ModelBiped field_82425_h;
    private static final Map field_110859_k = Maps.newHashMap();
    
    private static final ResourceLocation skin = new ResourceLocation("zeuscraft", "textures/entities/olympus/zeus.png");
    
    /** List of armor texture filenames. */
    public static String[] bipedArmorFilenamePrefix = new String[] {"leather", "chainmail", "iron", "diamond", "gold"};
    
    public RenderZeus(ModelBiped par1ModelBiped, float par2)
    {
    this(par1ModelBiped, par2, 1.0F);
    }
    
    public RenderZeus(ModelBiped par1ModelBiped, float par2, float par3)
    {
    super(par1ModelBiped, par2);
    this.modelBipedMain = par1ModelBiped;
    this.field_77070_b = par3;
    this.func_82421_b();
    }
    
    protected void func_82421_b()
    {
    this.field_82423_g = new ModelBiped(1.0F);
    this.field_82425_h = new ModelBiped(0.5F);
    }
    
    @Deprecated //Use the more sensitve version getArmorResource below
    public static ResourceLocation func_110857_a(ItemArmor par0ItemArmor, int par1)
    {
    return func_110858_a(par0ItemArmor, par1, (String)null);
    }
    
    @Deprecated //Use the more sensitve version getArmorResource below
    public static ResourceLocation func_110858_a(ItemArmor par0ItemArmor, int par1, String par2Str)
    {
    String s1 = String.format("textures/models/armor/%s_layer_%d%s.png", new Object[] {bipedArmorFilenamePrefix[par0ItemArmor.renderIndex], Integer.valueOf(par1 == 2 ? 2 : 1), par2Str == null ? "" : String.format("_%s", new Object[]{par2Str})});
    ResourceLocation resourcelocation = (ResourceLocation)field_110859_k.get(s1);
    
    if (resourcelocation == null)
    {
    resourcelocation = new ResourceLocation(s1);
    field_110859_k.put(s1, resourcelocation);
    }
    
    return resourcelocation;
    }
    
    /**
    * More generic ForgeHook version of the above function, it allows for Items to have more control over what texture they provide.
    *
    * @param entity Entity wearing the armor
    * @param stack ItemStack for the armor
    * @param slot Slot ID that the item is in
    * @param type Subtype, can be null or "overlay"
    * @return ResourceLocation pointing at the armor's texture
    */
    public static ResourceLocation getArmorResource(Entity entity, ItemStack stack, int slot, String type)
    {
    ItemArmor item = (ItemArmor)stack.getItem();
    String s1 = String.format("textures/models/armor/%s_layer_%d%s.png",
    bipedArmorFilenamePrefix[item.renderIndex], (slot == 2 ? 2 : 1), type == null ? "" : String.format("_%s", type));
    
    s1 = ForgeHooksClient.getArmorTexture(entity, stack, s1, slot, type);
    ResourceLocation resourcelocation = (ResourceLocation)field_110859_k.get(s1);
    
    if (resourcelocation == null)
    {
    resourcelocation = new ResourceLocation(s1);
    field_110859_k.put(s1, resourcelocation);
    }
    
    return resourcelocation;
    }
    
    protected int func_130006_a(EntityZeus par1EntityLiving, int par2, float par3)
    {
    ItemStack itemstack = par1EntityLiving.func_130225_q(3 - par2);
    
    if (itemstack != null)
    {
    Item item = itemstack.getItem();
    
    if (item instanceof ItemArmor)
    {
    ItemArmor itemarmor = (ItemArmor)item;
    this.func_110776_a(getArmorResource(par1EntityLiving, itemstack, par2, null));
    ModelBiped modelbiped = par2 == 2 ? this.field_82425_h : this.field_82423_g;
    modelbiped.bipedHead.showModel = par2 == 0;
    modelbiped.bipedHeadwear.showModel = par2 == 0;
    modelbiped.bipedBody.showModel = par2 == 1 || par2 == 2;
    modelbiped.bipedRightArm.showModel = par2 == 1;
    modelbiped.bipedLeftArm.showModel = par2 == 1;
    modelbiped.bipedRightLeg.showModel = par2 == 2 || par2 == 3;
    modelbiped.bipedLeftLeg.showModel = par2 == 2 || par2 == 3;
    modelbiped = ForgeHooksClient.getArmorModel(par1EntityLiving, itemstack, par2, modelbiped);
    this.setRenderPassModel(modelbiped);
    modelbiped.onGround = this.mainModel.onGround;
    modelbiped.isRiding = this.mainModel.isRiding;
    modelbiped.isChild = this.mainModel.isChild;
    float f1 = 1.0F;
    
    //Move out of if to allow for more then just CLOTH to have color
    int j = itemarmor.getColor(itemstack);
    if (j != -1)
    {
    float f2 = (float)(j >> 16 & 255) / 255.0F;
    float f3 = (float)(j >> 8 & 255) / 255.0F;
    float f4 = (float)(j & 255) / 255.0F;
    GL11.glColor3f(f1 * f2, f1 * f3, f1 * f4);
    
    if (itemstack.isItemEnchanted())
    {
    return 31;
    }
    
    return 16;
    }
    
    GL11.glColor3f(f1, f1, f1);
    
    if (itemstack.isItemEnchanted())
    {
    return 15;
    }
    
    return 1;
    }
    }
    
    return -1;
    }
    
    protected void func_130013_c(EntityZeus par1EntityLiving, int par2, float par3)
    {
    ItemStack itemstack = par1EntityLiving.func_130225_q(3 - par2);
    
    if (itemstack != null)
    {
    Item item = itemstack.getItem();
    
    if (item instanceof ItemArmor)
    {
    this.func_110776_a(getArmorResource(par1EntityLiving, itemstack, par2, "overlay"));
    float f1 = 1.0F;
    GL11.glColor3f(f1, f1, f1);
    }
    }
    }
    
    public void doRenderLiving(EntityZeus par1EntityLiving, double par2, double par4, double par6, float par8, float par9)
    {
    float f2 = 1.0F;
    GL11.glColor3f(f2, f2, f2);
    ItemStack itemstack = par1EntityLiving.getHeldItem();
    this.func_82420_a(par1EntityLiving, itemstack);
    double d3 = par4 - (double)par1EntityLiving.yOffset;
    
    if (par1EntityLiving.isSneaking())
    {
    d3 -= 0.125D;
    }
    
    super.doRenderLiving(par1EntityLiving, par2, d3, par6, par8, par9);
    this.field_82423_g.aimedBow = this.field_82425_h.aimedBow = this.modelBipedMain.aimedBow = false;
    this.field_82423_g.isSneak = this.field_82425_h.isSneak = this.modelBipedMain.isSneak = false;
    this.field_82423_g.heldItemRight = this.field_82425_h.heldItemRight = this.modelBipedMain.heldItemRight = 0;
    }
    
    protected ResourceLocation func_110856_a(EntityZeus par1EntityZeus)
    {
    return null;
    }
    
    protected void func_82420_a(EntityZeus par1EntityLiving, ItemStack par2ItemStack)
    {
    this.field_82423_g.heldItemRight = this.field_82425_h.heldItemRight = this.modelBipedMain.heldItemRight = par2ItemStack != null ? 1 : 0;
    this.field_82423_g.isSneak = this.field_82425_h.isSneak = this.modelBipedMain.isSneak = par1EntityLiving.isSneaking();
    }
    
    protected void func_130005_c(EntityZeus par1EntityLiving, float par2)
    {
    float f1 = 1.0F;
    GL11.glColor3f(f1, f1, f1);
    super.renderEquippedItems(par1EntityLiving, par2);
    ItemStack itemstack = par1EntityLiving.getHeldItem();
    ItemStack itemstack1 = par1EntityLiving.func_130225_q(3);
    float f2;
    
    if (itemstack1 != null)
    {
    GL11.glPushMatrix();
    this.modelBipedMain.bipedHead.postRender(0.0625F);
    
    IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemstack1, EQUIPPED);
    boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, itemstack1, BLOCK_3D));
    
    if (itemstack1.getItem() instanceof ItemBlock)
    {
    if (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[itemstack1.itemID].getRenderType()))
    {
    f2 = 0.625F;
    GL11.glTranslatef(0.0F, -0.25F, 0.0F);
    GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(f2, -f2, -f2);
    }
    
    this.renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack1, 0);
    }
    else if (itemstack1.getItem().itemID == Item.skull.itemID)
    {
    f2 = 1.0625F;
    GL11.glScalef(f2, -f2, -f2);
    String s = "";
    
    if (itemstack1.hasTagCompound() && itemstack1.getTagCompound().hasKey("SkullOwner"))
    {
    s = itemstack1.getTagCompound().getString("SkullOwner");
    }
    
    TileEntitySkullRenderer.skullRenderer.func_82393_a(-0.5F, 0.0F, -0.5F, 1, 180.0F, itemstack1.getItemDamage(), s);
    }
    
    GL11.glPopMatrix();
    }
    
    if (itemstack != null)
    {
    GL11.glPushMatrix();
    
    if (this.mainModel.isChild)
    {
    f2 = 0.5F;
    GL11.glTranslatef(0.0F, 0.625F, 0.0F);
    GL11.glRotatef(-20.0F, -1.0F, 0.0F, 0.0F);
    GL11.glScalef(f2, f2, f2);
    }
    
    this.modelBipedMain.bipedRightArm.postRender(0.0625F);
    GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F);
    
    IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(itemstack, EQUIPPED);
    boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, itemstack, BLOCK_3D));
    
    if (itemstack.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[itemstack.itemID].getRenderType())))
    {
    f2 = 0.5F;
    GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
    f2 *= 0.75F;
    GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(-f2, -f2, f2);
    }
    else if (itemstack.itemID == Item.bow.itemID)
    {
    f2 = 0.625F;
    GL11.glTranslatef(0.0F, 0.125F, 0.3125F);
    GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(f2, -f2, f2);
    GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
    }
    else if (Item.itemsList[itemstack.itemID].isFull3D())
    {
    f2 = 0.625F;
    
    if (Item.itemsList[itemstack.itemID].shouldRotateAroundWhenRendering())
    {
    GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
    GL11.glTranslatef(0.0F, -0.125F, 0.0F);
    }
    
    this.func_82422_c();
    GL11.glScalef(f2, -f2, f2);
    GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
    GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
    }
    else
    {
    f2 = 0.375F;
    GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
    GL11.glScalef(f2, f2, f2);
    GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F);
    GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
    GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F);
    }
    
    this.renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack, 0);
    
    if (itemstack.getItem().requiresMultipleRenderPasses())
    {
    for (int x = 1; x < itemstack.getItem().getRenderPasses(itemstack.getItemDamage()); x++)
    {
    this.renderManager.itemRenderer.renderItem(par1EntityLiving, itemstack, x);
    }
    }
    
    GL11.glPopMatrix();
    }
    }
    
    protected void func_82422_c()
    {
    GL11.glTranslatef(0.0F, 0.1875F, 0.0F);
    }
    
    protected void func_82439_b(EntityLivingBase par1EntityLivingBase, int par2, float par3)
    {
    this.func_130013_c((EntityZeus)par1EntityLivingBase, par2, par3);
    }
    
    /**
    * Queries whether should render the specified pass or not.
    */
    protected int shouldRenderPass(EntityLivingBase par1EntityLivingBase, int par2, float par3)
    {
    return this.func_130006_a((EntityZeus)par1EntityLivingBase, par2, par3);
    }
    
    protected void renderEquippedItems(EntityLivingBase par1EntityLivingBase, float par2)
    {
    this.func_130005_c((EntityZeus)par1EntityLivingBase, par2);
    }
    
    public void renderPlayer(EntityLivingBase par1EntityLivingBase, double par2, double par4, double par6, float par8, float par9)
    {
    this.doRenderLiving((EntityZeus)par1EntityLivingBase, par2, par4, par6, par8, par9);
    }
    
    protected ResourceLocation func_110775_a(Entity par1Entity)
    {
    return skin;
    }
    
    /**
    * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then
    * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic
    * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1,
    * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that.
    */
    public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9)
    {
    this.doRenderLiving((EntityZeus)par1Entity, par2, par4, par6, par8, par9);
    }
    }

    Alright, now we have the important notes:
    texture: Up at the beginning of the class you probably see something like this:
    private static final ResourceLocation skin = new ResourceLocation("zeuscraft", "textures/entities/olympus/zeus.png");

    This is why we have a separate Render file for each mob/entity. It used to be to where textures were specified somewhere else, to where you could use the same render file multiple times for different mobs, but now the render files contain the textures. So, according to this, my texture file would be in:

    "Forge [MC Version]/forge/mcp/eclipse/Minecraft/bin/assets/zeuscraft/textures/entities/olympus/zeus.png"

    zeus.png (the texture file), should be in the same format as if you were applying a skin to your in-game player, due to the fact that we are using the same model. So what you can do, is you could even go to PMC and download a quality-made skin to use and title that zeus.png, instead of trying to make your own! Don't forget to give credits to the original author if you do.

    Now, we go to the entity file. In this file, we'll create the AI for our mob, so here we can make it do what we want to and act a certain way, whether its as cowardly as a pig, as fun to ride as a horse, or make it flying and beastly as a ender dragon. Simply put, this is where the magic happens, and this is why I like mobs so much. However, today, we'll just be creating a basic AI.

    EntityZeus.java:
    package fisherman77.zeuscraft.common.mobs.olympus;
    
    import java.util.Random;
    
    import fisherman77.zeuscraft.common.Zeuscraft;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.StepSound;
    import net.minecraft.enchantment.EnchantmentHelper;
    import net.minecraft.enchantment.EnchantmentThorns;
    import net.minecraft.entity.ai.EntityAIAttackOnCollide;
    import net.minecraft.entity.ai.EntityAINearestAttackableTarget;
    import net.minecraft.entity.ai.EntityAIPanic;
    import net.minecraft.entity.ai.EntityAISwimming;
    import net.minecraft.entity.ai.EntityAITempt;
    import net.minecraft.entity.ai.EntityAIWander;
    import net.minecraft.entity.ai.EntityAIWatchClosest;
    import net.minecraft.entity.monster.EntityMob;
    import net.minecraft.entity.passive.EntityAnimal;
    import net.minecraft.entity.passive.EntityChicken;
    import net.minecraft.entity.passive.EntityHorse;
    import net.minecraft.entity.passive.EntityVillager;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityAgeable;
    import net.minecraft.entity.EntityCreature;
    import net.minecraft.entity.EntityLiving;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.EnumCreatureAttribute;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.potion.Potion;
    import net.minecraft.util.DamageSource;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    
    
    public class EntityZeus extends EntityAnimal
    {
    
    public EntityZeus(World world)
    {
    super(world);
    
    this.setSize(1.0F, 1.75F);
    
    this.getNavigator().setAvoidsWater(true);
    
    
    this.tasks.addTask(0, new EntityAISwimming(this));
    this.tasks.addTask(1, new EntityAIWander(this, 0.5D));
    this.tasks.addTask(2, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F));
    this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true));
    }
    
    @Override
    protected void func_110147_ax() {
    super.func_110147_ax();
    
    func_110148_a(SharedMonsterAttributes.field_111263_d).func_111128_a(0.5); //moveSpeed
    func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(9); //maxHealth
    func_110148_a(SharedMonsterAttributes.field_111264_e).func_111128_a(10); //attackStrength
    }
    
    public EnumCreatureAttribute getCreatureAttribute()
    {
    return EnumCreatureAttribute.UNDEAD;
    }
    
    protected boolean isAIEnabled()
    {
    return true;
    }
    
    protected boolean canDespawn()
    {
    return true;
    }
    
    @Override
    public EntityAgeable createChild(EntityAgeable entityageable) {
    // TODO Auto-generated method stub
    return null;
    }
    
    }

    Now a little lot of explanation:
    this.setSize(1.0F, 1.75F); - this sets the hitbox for the entity. Normally, you would simply put 1.0F, 1.0F, but I found that the hitbox was a little messed up height-wise by default, therefore, I experimented with it until I got 1.75, which seems to work pretty solid. It goes (WIDTH, HEIGHT), just as you would do if I was plotting coordinates on a 2d plane, (X, Y).

    this.getNavigator().setAvoidsWater(true); - Do you want your entity to prefer not to walk on water when it's wandering around? Most land mobs have this as true, especially if they can't swim because you didn't add in the next line:

    Before I continue, a quick explanation of AI: It used to be to where you had to hard code stuff into each entity class using stuff like onLivingUpdate(), onUpdate(), and methods like that. Now, with the introduction of AI, you can simply list actions in the order of priority in which you want your entity to do them. This doesn't totally avert the situation, as mobs like squids still primarily rely on non-AI kinds of things, but it helps for most of your situations.

    As you review the AI section, you'll notice that the first number in the parentheses increases, starting at 0, and then 1, 2, 3, and so on. that's because that gives Minecraft the priorities it is supposed to value each action. To make it simpler, I put swimming as 1st priority, because if our mob is in water, we'd rather it focus on swimming and not sinking, rather than looking at the closest player, which is the 3rd priority. (Yes, it is confusing that the 1st priority has a 0 rather than a 1, but deal with it.)

    If the first action in the AI is not applicable, so in our case if the mob is on land, then this line will be skipped and we'll move on to the next one, which would be wandering, since it has a 1 after the parentheses, and then once a cycle or two of wandering is over, the mob will look to watch the nearest player. The first priority is always on call though, because if let's say I push a wandering Zeus into the water, it will use the first priority, which is swimming, and then continue down. On the other hand, if I were just to leave it be in-game, then it would look at me for a while, and then go back to the top of the list, skip swimming because it wouldn't be in water since I put in that method before that made it avoid water, and then it would start wandering again. If you're still confused, read this over, then continue reading the rest of the AI, and if you still don't get it, leave a reply on this thread. Now to continue AI:

    this.tasks.addTask(0, new EntityAISwimming(this)); - Do you want your mob to be able to swim, or sink to the bottom and eventually die of suffocation? Most of the time, you would want your mob to swim, but say if you have a desert mob, like the Citipati in Paleocraft, it shouldn't know how to swim, since it doesn't have life-threatening deep water in its natural environment. As long as this method is here in the first priority (0 is after the first parentheses), your mob will be sure to swim. If I didn't want my mob to be able to swim, then I would take this method out, but I would have to change the numbers of the following AI to start with 0.

    this.tasks.addTask(1, new EntityAIWander(this, 0.5D)); - Your mob will walk around randomly around, like almost all mobs do. 0.5D is the speed. To show you what numbers to speed is like, refer to the moveSpeed line in the upcoming sections

    this.tasks.addTask(2, new EntityAIWatchClosest(this, EntityPlayer.class, 6.0F)); - This makes it to where your mob will watch the nearest player. EntityPlayer.class specifies what entity to look at, so I could make it EntityChicken.class if I wanted to to make your mob stare at chickens. 6.0F is the distance at which it notices and starts to stare at the player, but you don't really need to worry at this, because heighten it and it might just get kind of weird when you've got mobs staring at you a mile away.

    I mean, I guess if you're doing a Herobrine thing it might be more scary, but anyways, onward.

    this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, true)); - It used to be that when you wanted to make a mob neutral (when I say neutral, I don't mean passive or aggressive, but attacks when attacked), you had to go into something like EntityZombiePigman or EntityWolf and use that code to help you, but now with this new AI stuff, we can simply put this method in here, and our mod will become neutral.

    You'll also notice that it now says "targetTasks" rather than"tasks" and that the numbering restarts at 1 after the parentheses. Well, that's because targetTasks has directly to do with other mobs/players, so some of the AI in target tasks would be like hostility to players or a specific type of mob, or following an owner if the mob has been tamed. Target tasks are a completely different group of AI, but don't worry, Minecraft is smart enough to know where it all belongs on the grand scheme of priorities for your mob's AI.

    func_110148_a(SharedMonsterAttributes.field_111263_d).func_111128_a(0.5); //moveSpeed - Well, I basically explained it for you with that comment. This line adds in the movespeed for the mob. The higher the number goes, the faster, the lower, the slower. Here's a quick reference that I kind of go by:

    0.2 to 0.3 = very slow
    0.4 = slow
    0.5 to 0.6 = normal
    0.7 = fast
    0.8 to 0.9 = very fast
    1.0 = a blur

    func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(9); //maxHealth - As the comment says, this sets the max health for the mob. That 9 is what sets it. Now how this works, is that each number is a half a heart, so 8 would mean the mob has 4 hearts of health, 9 means the mob has 4.5 hearts of health, and 10 means 5 hearts of health. As a quick reference, a chicken has 4 (2 hearts), a player has 20 (10 hearts), and and the wither has the most out of any mob in the game, 300 (150 hearts) (enderdragon has 200 = 100 hearts).

    For the full guide, go here and scroll down to the Mob Health section (I'm to lazy to get the anchor link): http://www.minecraft...net/wiki/Health

    func_110148_a(SharedMonsterAttributes.field_111264_e).func_111128_a(10); //attackStrength - This adds, as you might have guessed, adds the mob's damage. Again, it's the "half-heart system" where every number represents another half-heart. So this mob would deal 5 hearts of damage. Refer here for the full guide on damage: http://www.minecraft...net/wiki/Damage (there's a section called "Damage inflicted by mobs")

    public EnumCreatureAttribute getCreatureAttribute()
    {
    return EnumCreatureAttribute.UNDEAD;
    }

    I totally forgot what this does at the moment, hence it is unimportant, but I'll edit this later to tell you what it is, but you can keep it at UNDEAD. It's something to do with the way the mob reacts to potions.

    protected boolean isAIEnabled()
    {
    return true;
    }
    This enables the AI that we talked about before. If you turn it to false, or do not include this, you will not have any AI. Contrary to what you might expect, we do not always use this for more advanced AI, so we won't ALWAYS have this, but we certainly will for now.

    protected boolean canDespawn()
    {
    return false;
    }
    I just included this in this tutorial. It could be it's own tutorial, since it isn't 100% necessary, but I figured it's so small, why not? So if I turn this to true, as is with most creatures, then after some time, my mob will despawn. Otherwise, if I have an important mob, such as Zeus, where you're constantly interacting with him and doing quests (not in this tutorial), I don't want him to disappear into thin air, so I would set this to return false; and he will never despawn.

    NOTE: DO NOT SET THIS TO FALSE ON MOBS THAT DON'T NEED IT. MORE MOBS NEVER GOING AWAY = MORE COMPUTER POWER NEEDED = SLOWER GAME. IF YOU ARE SELFISH AND IGNORE THIS WARNING, I WILL MENTALLY SLAP YOU ACROSS THE FACE :) , AND YOUR MOD WILL UNNECESSARILY SLOW DOWN PEOPLE'S GAMES, MAKING IT LESS POPULAR.

    Now that we got that out of the way, let's move on to registering it in our main class.

    Zeuscraft.java:
    package fisherman77.zeuscraft.common; //The package your mod is in
    
    import net.minecraft.block.Block;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityEggInfo;
    import net.minecraft.entity.EntityList;
    import net.minecraft.entity.EntityLiving;
    import net.minecraft.entity.EnumCreatureType;
    import net.minecraft.item.Item;
    import net.minecraft.world.biome.BiomeGenBase;
    import net.minecraftforge.common.MinecraftForge;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.Init;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.Mod.PreInit;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.network.NetworkMod;
    import cpw.mods.fml.common.network.NetworkRegistry;
    import cpw.mods.fml.common.registry.EntityRegistry;
    import cpw.mods.fml.common.registry.GameRegistry;
    import cpw.mods.fml.common.registry.LanguageRegistry;
    import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler;
    import cpw.mods.fml.common.SidedProxy;
    import fisherman77.zeuscraft.common.mobs.olympus.EntityZeus;
    //need to import render class too. already deleted it up here for organization -- woops
    
    @NetworkMod(clientSideRequired=true,serverSideRequired=true, //Whether client side and server side are needed
    clientPacketHandlerSpec = @SidedPacketHandler(channels = {"Zeuscraft"}, packetHandler = ZeuscraftClientPacketHandler.class), //For clientside packet handling
    serverPacketHandlerSpec = @SidedPacketHandler(channels = {"Zeuscraft"}, packetHandler = ZeuscraftServerPacketHandler.class)) //For serverside packet handling
    
    //MOD BASICS
    @Mod(modid="Zeuscraft",name="Zeuscraft",version="Dev Build")
    
    public class Zeuscraft {
    
    @Instance("Zeuscraft") //The instance, this is very important later on
    public static Zeuscraft instance = new Zeuscraft();
    
    @SidedProxy(clientSide = "fisherman77.zeuscraft.client.ZeuscraftClientProxy", serverSide = "fisherman77.zeuscraft.common.ZeuscraftCommonProxy") //Tells Forge the location of your proxies
    public static ZeuscraftCommonProxy proxy;
    
    @PreInit
    public void PreInit(FMLPreInitializationEvent e){
    
    }
    
    @Init
    public void InitZeuscraft(FMLInitializationEvent event){ //Your main initialization method
    
    //MOBS
    proxy.registerRenderers();
    
    //NPCs
    //Zeus
    registerEntity(EntityZeus.class, "Zeus", 0xeaeae9, 0xc99a03);
    LanguageRegistry.instance().addStringLocalization("entity.Zeus.name", "Zeus");
    
    //MULTIPLAYER ABILITY
    NetworkRegistry.instance().registerGuiHandler(this, proxy); //Registers the class that deals with GUI data
    
    }
    
    public void registerEntity(Class<? extends Entity> entityClass, String entityName, int bkEggColor, int fgEggColor) {
    int id = EntityRegistry.findGlobalUniqueEntityId();
    
    EntityRegistry.registerGlobalEntityID(entityClass, entityName, id);
    EntityList.entityEggs.put(Integer.valueOf(id), new EntityEggInfo(id, bkEggColor, fgEggColor));
    }
    
    public void addSpawn(Class<? extends EntityLiving> entityClass, int spawnProb, int min, int max, BiomeGenBase[] biomes) {
    if (spawnProb > 0) {
    EntityRegistry.addSpawn(entityClass, spawnProb, min, max, EnumCreatureType.creature, biomes);
    }
    }
    }

    Now to explain the two lines of code that really matter for this:
    registerEntity(EntityZeus.class, "Zeus", 0xabcde9, 0xe98a03); - EntityZeus.class specifies the entity file that we're using, and if you've been following along, you should have to import it since it's from another package. The 0x... stuff is the colors for the eggs. They are HTML color codes. A good reference: http://www.w3schools...colorpicker.asp Just pick your color, and copy the 6 digit/letter code after the 0x. It does NOT have to be all uppercase. "Zeus" is the name that Minecraft will use as the mob's default name, which when it's all done comes out to be "entity.Zeus.name".

    LanguageRegistry.instance().addStringLocalization("entity.Zeus.name", "Zeus"); - We don't want it to be called "entity.Zeus.name" in Minecraft, so we use LanguageRegistry to replace that with simply "Zeus".

    Last file:
    ZeuscraftClientProxy.java:
    package fisherman77.zeuscraft.client;
    
    import cpw.mods.fml.client.registry.RenderingRegistry;
    import fisherman77.zeuscraft.common.mobs.olympus.EntityZeus;
    import fisherman77.zeuscraft.common.mobs.olympus.RenderZeus;
    import net.minecraft.client.model.ModelBiped;
    import net.minecraftforge.client.MinecraftForgeClient;
    
    public class ZeuscraftClientProxy extends ZeuscraftCommonProxy {
    
    public void registerRenderInformation(){
    
    }
    
    public void registerRenderers(){
    float shadowSize = 0.5F;
    
    //MOBS
    RenderingRegistry.registerEntityRenderingHandler(EntityZeus.class, new RenderZeus(new ModelBiped(), shadowSize));
    
    }
    
    }
    This ties everything all together. You'll have to import the classes into this class, as you can see that I've done at the very top. Now we tie together the AI (entity file -- EntityZeus.java), rendering/texture (render file -- RenderZeus.java), and the model (model file -- ModelBiped, which is already in the game, so we didn't have to do).

    Lastly, we have the shadowSize. as you can see above this line that it's a variable with the value 0.5F. The shadow is that gray circle that appears underneath mobs in-game that you've probably never noticed. I just do 0.5F for all my mobs that are normal-sized.

    And that's it. Now, before we launch it up, make sure that you have your textures in the eclipse/Minecaft/bin folder that I detailed earlier. Now, simply fire up the game and go to the creative menu. Search "spawn zeus" or go to the spawn eggs in the tab with all blocks and items. Now right click, and you should see your mob in-game. Have fun. The even better news - this is just the beginning, there's an unlimited amount of things you can do with mobs!
    Posted in: Mapping and Modding Tutorials
  • 1

    posted a message on PaleoCraft -- Realistic Dinosaurs in Minecraft!
    Quote from Epicdinoman123

    You don't both have the bary. They have the spinosaurus.

    Awesome. Ya I don't really play as much Minecraft as I do mod it, so I don't know too much about the content of other mods. Thanks for clearing that up.

    Quote from Dan_Wallace



    I'm not going to be able to sleep tonight.
    Posted in: Minecraft Mods
  • 2

    posted a message on [WIP] [1.6.2] Zeuscraft [V 0.6.9] - Greek Mythology in Minecraft

    By Zeuscraft Dev

    Ever wondered what Minecraft would be like with a bunch of pegasi flying around?
    Ever wished that you could fight a giant cyclops and a ridiculous amount of other creatures from Greek Mythology?
    Or how about visiting Olympus inside of Minecraft?
    Well, here's the answer - Zeuscraft! Zeuscraft is a Greek mythology mod dedicated to bringing you an awesome Minecraft experience by adding in tons of aspects from Greek mythology!

    This mod has been in the works for a very long time, but today begins a totally new phase - a recoding, retexturing, and remodeling.

    Index Downloads

    Zeuscraft 0.6.9
    Changelog

    Minecraft Forge:
    http://www.minecraft.../topic,5.0.html
    *Note: for the really old versions of Zeuscraft, you might need ModLoader


    Features
    All features of Zeuscraft are fully documented on the wiki.


    Credits
    Project Lead: jwdjwd & fisherman77
    Modeler & Model Texturer: thekarrybird
    Block/Item Texturer: asalt13
    Head Modder: fisherman77

    Videos
    Videos are fun to watch, so make one and I'll post it up here! They take up a lot of space on the page, and I've rewritten the thread to make it more concise and organized, so now they're all in a spoiler:

    I'll do this part later!
    Showcase

    Installation


    Banners
    I'll have a banner ready in just a little while.

    Installation
    Once you install Forge, installing Zeuscraft is as easy as going to the "minecraft" folder and dragging and dropping the .jar into the "mods" folder within the "minecraft" folder.

    Modpacks
    The Zeuscraft Team does require that you ask us about putting our mod in your mod pack before we blindly give in to your requests.

    Troubleshooting
    I'll type here later.

    Changelog

    0.6.0:
    - Base of a mod set up (doesn't do anything, but functional)
    - mcmod.info created
    - texture files organized

    0.6.1:
    - Added Thunderbolt
    - Added Marble

    0.6.2:
    - Fixed Minor Bugs

    0.6.3:
    - Added Trident
    - Added Smooth Marble
    - Marble now drops itself
    - Marble smeltable

    0.6.4:
    - Added Grapes
    - Added Goblet
    - Added Wine

    0.6.5:
    - Put everything that wasn't already in the Creative Menu in it
    - Added Grape Log
    - Added Grape Leaves
    - Added basic Altar Block
    - Added Demeter's Scepter
    - Added basic Reed Pipes
    - Added Nether Pearl
    - Added Thunder Pearl
    - Added Water Pearl

    0.6.6:
    - Added Pegasus (can't fly yet, but tamable same way as horse)

    0.6.7:
    - Removed Grape Tree Generation (world gen really buggy in Forge right now)
    - Added basic Theseus

    0.6.8:
    • Added basic Achilles
    • Added basic Aphrodite
    • Added basic Apollo
    • Added basic Ares
    • Added basic Artemis
    • Added basic Athena
    • Added basic Demeter
    • Added basic Dionysus
    • Added basic Hades
    • Added basic Helios
    • Added basic Hera
    • Added basic Hermes
    • Added basic Hestia
    • Added basic Poseidon
    • Added basic Zeus
    0.6.9:
    • fixed Scepter tooltip
    • new Trident icon
    • added Minotaur
    • added Satyr
    • added Cyclops
    • added Cyclops Eye

    Bugs and Todo
    Bugs & Feature requests can be reported and looked at on our Issue Tracker.

    Old Versions
    Old Versions are at the same download link, just scroll down!





    [represent]
    Posted in: WIP Mods
  • 2

    posted a message on PaleoCraft -- Realistic Dinosaurs in Minecraft!
    Quote from Epicdinoman123

    Dan_wallace or Bladeking68, Are you guys there? hello?


    Oh ya, and I'm here too, but that doesn't matter :)

    Anyways, I'm getting pretty far on the dinos. It should be done sometime in the next few days, if not later today.
    Posted in: Minecraft Mods
  • 2

    posted a message on PaleoCraft -- Realistic Dinosaurs in Minecraft!
    Quote from gjr888

    Have you guys thought of making a wiki? So new people can learn how to craft things, build the portal ect.

    Hmmm... Maybe that's already in progr- Nothing.
    Posted in: Minecraft Mods
  • 1

    posted a message on PaleoCraft -- Realistic Dinosaurs in Minecraft!
    Quote from gjr888

    So how is the mod doing guys?


    Finals :) Until next Thursday :)

    But once that's over...just wait...dinos will be in mass production (unless the AI's crazy), which even if it is, will still be awesome.
    Posted in: Minecraft Mods
  • 1

    posted a message on PaleoCraft -- Realistic Dinosaurs in Minecraft!
    New update is live on the site!

    For 1.5.2.
    Posted in: Minecraft Mods
  • To post a comment, please .