Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zaawansowane Tworzenie Modów


karol202

Rekomendowane odpowiedzi

  • Odpowiedzi 1,2 tys.
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

No to czekamy - sam już się nauczyłem to robić poprzez podpatrzenie głównego kodu - mhm ;P. Jak ktoś ma jakiś problem to mogę pomóc.

Opublikowano

Temat ciągle popularny ! :)

Ja wlasnie stworzylem swojego moda . Może go udostępnie :)

Wszystko jest bardzo ładnie opisane , są spoilery itp.

Liek.

asaprocky_gif-1422823049.gif
XDDD

banner1.png
| PostWriter | ExKidMod Mc | exKidMod CoD | exAdministrator CoD4 Mpcforum | ExMentor |
 

Opublikowano

ej Ktoś już zrobił własnego moda to niech zrobi o nim temat bo jestem ciekaw co zrobiliście

 

Mam 2 mody.

LINK

LINK

sygnatura niezgodna z regulaminem forum mpc rozdział II pkt. 7

Opublikowano

mam problem z Modelem krowy jak tworze nowy świat to po 2 s jest crash :


Minecraft has crashed!      
     ----------------------      

Minecraft has stopped running because it encountered a problem; Unexpected error
This error has been saved to C:\Users\Dawid\Desktop\Różne Pliki i Gry\MODOWANIE\mcp62\jars\.\crash-reports\crash-2012-08-25_11.31.10-client.txt for your convenience. Please include a copy of this file if you report this crash to anyone.



--- BEGIN ERROR REPORT 1f1be5aa --------
Generated 25.08.12 11:31

- Minecraft Version: 1.3.1
- Operating System: Windows 7 (amd64) version 6.1
- Java Version: 1.7.0_04, Oracle Corporation
- Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
- Memory: 844394280 bytes (805 MB) / 1056309248 bytes (1007 MB) up to 1056309248 bytes (1007 MB)
- JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
- ModLoader: Mods loaded: 2
ModLoader 1.3.1
mod_10Mod 1.3.1

- LWJGL: 2.4.2
- OpenGL: ATI Radeon HD 3200 Graphics     GL version 2.1.8918, ATI Technologies Inc.
- Is Modded: Probably not
- Type: Client
- Texture Pack: Default
- Profiler Position: N/A (disabled)
- World MpServer Entities: 59 total; [EntityClientPlayerMP['Player892'/350, l='MpServer', x=-181,46, y=67,62, z=259,30], EntityZK['entity.Zmutowana Krowa.name'/63, l='MpServer', x=-259,50, y=57,00, z=298,50], EntityCreeper['Creeper'/60, l='MpServer', x=-257,47, y=38,00, z=256,34], EntityZK['entity.Zmutowana Krowa.name'/64, l='MpServer', x=-256,50, y=57,00, z=299,50], EntityZK['entity.Zmutowana Krowa.name'/65, l='MpServer', x=-257,50, y=19,00, z=339,50], EntityZK['entity.Zmutowana Krowa.name'/66, l='MpServer', x=-260,50, y=28,00, z=337,50], EntityZK['entity.Zmutowana Krowa.name'/76, l='MpServer', x=-247,50, y=13,00, z=296,50], EntityZK['entity.Zmutowana Krowa.name'/77, l='MpServer', x=-249,50, y=57,00, z=291,50], EntityZK['entity.Zmutowana Krowa.name'/78, l='MpServer', x=-253,50, y=20,00, z=328,50], EntityZK['entity.Zmutowana Krowa.name'/79, l='MpServer', x=-251,50, y=20,00, z=327,50], EntityCow['Cow'/73, l='MpServer', x=-245,50, y=65,00, z=282,50], EntityCow['Cow'/74, l='MpServer', x=-243,50, y=66,00, z=285,50], EntityZK['entity.Zmutowana Krowa.name'/75, l='MpServer', x=-246,50, y=13,00, z=298,50], EntityZK['entity.Zmutowana Krowa.name'/81, l='MpServer', x=-241,50, y=15,00, z=339,50], EntityZK['entity.Zmutowana Krowa.name'/80, l='MpServer', x=-251,50, y=20,00, z=328,50], EntityZK['entity.Zmutowana Krowa.name'/82, l='MpServer', x=-242,50, y=14,00, z=337,50], EntityCow['Cow'/110, l='MpServer', x=-235,72, y=65,00, z=277,75], EntityItem['item.tile.rose'/111, l='MpServer', x=-224,72, y=64,13, z=297,81], EntityZK['entity.Zmutowana Krowa.name'/108, l='MpServer', x=-224,50, y=60,00, z=240,50], EntityCow['Cow'/109, l='MpServer', x=-235,22, y=66,00, z=282,44], EntityZK['entity.Zmutowana Krowa.name'/106, l='MpServer', x=-228,50, y=60,00, z=241,50], EntityZK['entity.Zmutowana Krowa.name'/107, l='MpServer', x=-226,50, y=60,00, z=240,50], EntityItem['item.item.Sztabka Aluminium'/104, l='MpServer', x=-224,13, y=44,13, z=216,09], EntityZK['entity.Zmutowana Krowa.name'/105, l='MpServer', x=-227,50, y=60,00, z=242,50], EntityZK['entity.Zmutowana Krowa.name'/113, l='MpServer', x=-244,09, y=12,00, z=332,56], EntityZK['entity.Zmutowana Krowa.name'/112, l='MpServer', x=-237,44, y=14,00, z=335,34], EntityEnderman['Enderman'/127, l='MpServer', x=-218,94, y=70,00, z=194,44], EntitySpider['Spider'/126, l='MpServer', x=-215,78, y=70,00, z=192,00], EntityEnderman['Enderman'/125, l='MpServer', x=-219,94, y=70,00, z=196,34], EntityEnderman['Enderman'/124, l='MpServer', x=-219,50, y=70,00, z=198,44], EntitySheep['Sheep'/136, l='MpServer', x=-198,50, y=66,00, z=331,50], EntityZK['entity.Zmutowana Krowa.name'/139, l='MpServer', x=-174,50, y=42,00, z=233,50], EntityZK['entity.Zmutowana Krowa.name'/141, l='MpServer', x=-161,50, y=38,00, z=313,50], EntitySheep['Sheep'/140, l='MpServer', x=-160,50, y=67,00, z=276,50], EntityZK['entity.Zmutowana Krowa.name'/142, l='MpServer', x=-164,50, y=26,00, z=329,50], EntityItem['item.tile.sapling.oak'/129, l='MpServer', x=-215,88, y=80,13, z=284,53], EntityZK['entity.Zmutowana Krowa.name'/128, l='MpServer', x=-216,50, y=57,00, z=252,50], EntitySheep['Sheep'/133, l='MpServer', x=-199,53, y=66,00, z=329,50], EntityZK['entity.Zmutowana Krowa.name'/132, l='MpServer', x=-193,50, y=15,00, z=335,50], EntitySheep['Sheep'/135, l='MpServer', x=-197,03, y=66,00, z=329,50], EntitySheep['Sheep'/134, l='MpServer', x=-198,34, y=66,00, z=329,50], EntityZK['entity.Zmutowana Krowa.name'/144, l='MpServer', x=-152,50, y=25,00, z=273,50], EntitySheep['Sheep'/145, l='MpServer', x=-157,50, y=66,00, z=280,09], EntitySheep['Sheep'/146, l='MpServer', x=-152,13, y=64,00, z=272,84], EntitySheep['Sheep'/147, l='MpServer', x=-158,81, y=66,00, z=278,19], EntityZK['entity.Zmutowana Krowa.name'/148, l='MpServer', x=-144,50, y=15,00, z=325,50], EntityZK['entity.Zmutowana Krowa.name'/149, l='MpServer', x=-144,50, y=15,00, z=327,50], EntityZK['entity.Zmutowana Krowa.name'/171, l='MpServer', x=-120,50, y=66,00, z=251,50], EntityPig['Pig'/170, l='MpServer', x=-127,50, y=66,00, z=244,50], EntityWolf['Wolf'/169, l='MpServer', x=-115,31, y=63,00, z=236,34], EntityPig['Pig'/174, l='MpServer', x=-116,13, y=63,00, z=293,25], EntityPig['Pig'/173, l='MpServer', x=-121,13, y=63,00, z=289,53], EntityPig['Pig'/172, l='MpServer', x=-126,50, y=63,00, z=290,50], EntityPig['Pig'/162, l='MpServer', x=-134,53, y=66,00, z=243,06], EntityPig['Pig'/161, l='MpServer', x=-143,22, y=66,00, z=248,81], EntityPig['Pig'/160, l='MpServer', x=-134,88, y=69,00, z=221,03], EntityWolf['Wolf'/184, l='MpServer', x=-105,88, y=64,00, z=225,38], EntityZK['entity.Zmutowana Krowa.name'/182, l='MpServer', x=-103,50, y=20,00, z=195,50], EntityZK['entity.Zmutowana Krowa.name'/183, l='MpServer', x=-110,50, y=19,00, z=197,50]]
- World MpServer Players: 1 total; [EntityClientPlayerMP['Player892'/350, l='MpServer', x=-181,46, y=67,62, z=259,30]]
- World MpServer Chunk Stats: MultiplayerChunkCache: 441
- Forced Entities: 62 total; [EntityZK['entity.Zmutowana Krowa.name'/63, l='MpServer', x=-259,50, y=57,00, z=298,50], EntityCreeper['Creeper'/60, l='MpServer', x=-257,47, y=38,00, z=256,34], EntityZK['entity.Zmutowana Krowa.name'/64, l='MpServer', x=-256,50, y=57,00, z=299,50], EntityZK['entity.Zmutowana Krowa.name'/65, l='MpServer', x=-257,50, y=19,00, z=339,50], EntityZK['entity.Zmutowana Krowa.name'/66, l='MpServer', x=-260,50, y=28,00, z=337,50], EntityZK['entity.Zmutowana Krowa.name'/76, l='MpServer', x=-247,50, y=13,00, z=296,50], EntityZK['entity.Zmutowana Krowa.name'/77, l='MpServer', x=-249,50, y=57,00, z=291,50], EntityZK['entity.Zmutowana Krowa.name'/78, l='MpServer', x=-253,50, y=20,00, z=328,50], EntityZK['entity.Zmutowana Krowa.name'/79, l='MpServer', x=-251,50, y=20,00, z=327,50], EntityCow['Cow'/73, l='MpServer', x=-245,50, y=65,00, z=282,50], EntityCow['Cow'/74, l='MpServer', x=-243,50, y=66,00, z=285,50], EntityZK['entity.Zmutowana Krowa.name'/75, l='MpServer', x=-246,50, y=13,00, z=298,50], EntityZK['entity.Zmutowana Krowa.name'/81, l='MpServer', x=-241,50, y=15,00, z=339,50], EntityZK['entity.Zmutowana Krowa.name'/80, l='MpServer', x=-251,50, y=20,00, z=328,50], EntityZK['entity.Zmutowana Krowa.name'/82, l='MpServer', x=-242,50, y=14,00, z=337,50], EntityCow['Cow'/110, l='MpServer', x=-235,72, y=65,00, z=277,75], EntityItem['item.tile.rose'/111, l='MpServer', x=-224,72, y=64,13, z=297,81], EntityZK['entity.Zmutowana Krowa.name'/108, l='MpServer', x=-224,50, y=60,00, z=240,50], EntityCow['Cow'/109, l='MpServer', x=-235,22, y=66,00, z=282,44], EntityClientPlayerMP['Player892'/350, l='MpServer', x=-181,46, y=67,62, z=259,30], EntityZK['entity.Zmutowana Krowa.name'/106, l='MpServer', x=-228,50, y=60,00, z=241,50], EntityZK['entity.Zmutowana Krowa.name'/107, l='MpServer', x=-226,50, y=60,00, z=240,50], EntityItem['item.item.Sztabka Aluminium'/104, l='MpServer', x=-224,13, y=44,13, z=216,09], EntityZK['entity.Zmutowana Krowa.name'/105, l='MpServer', x=-227,50, y=60,00, z=242,50], EntityZK['entity.Zmutowana Krowa.name'/113, l='MpServer', x=-244,09, y=12,00, z=332,56], EntityZK['entity.Zmutowana Krowa.name'/112, l='MpServer', x=-237,44, y=14,00, z=335,34], EntityEnderman['Enderman'/127, l='MpServer', x=-218,94, y=70,00, z=194,44], EntitySpider['Spider'/126, l='MpServer', x=-215,78, y=70,00, z=192,00], EntityEnderman['Enderman'/125, l='MpServer', x=-219,94, y=70,00, z=196,34], EntityEnderman['Enderman'/124, l='MpServer', x=-219,50, y=70,00, z=198,44], EntitySheep['Sheep'/136, l='MpServer', x=-198,50, y=66,00, z=331,50], EntityZK['entity.Zmutowana Krowa.name'/139, l='MpServer', x=-174,50, y=42,00, z=233,50], EntityZK['entity.Zmutowana Krowa.name'/141, l='MpServer', x=-161,50, y=38,00, z=313,50], EntitySheep['Sheep'/140, l='MpServer', x=-160,50, y=67,00, z=276,50], EntityItem['item.tile.sapling.oak'/129, l='MpServer', x=-215,88, y=80,13, z=284,53], EntityZK['entity.Zmutowana Krowa.name'/142, l='MpServer', x=-164,50, y=26,00, z=329,50], EntityItem['item.tile.sapling.oak'/129, l='MpServer', x=-215,88, y=80,13, z=284,53], EntityZK['entity.Zmutowana Krowa.name'/128, l='MpServer', x=-216,50, y=57,00, z=252,50], EntityItem['item.item.Sztabka Aluminium'/104, l='MpServer', x=-224,13, y=44,13, z=216,09], EntitySheep['Sheep'/133, l='MpServer', x=-199,53, y=66,00, z=329,50], EntityZK['entity.Zmutowana Krowa.name'/132, l='MpServer', x=-193,50, y=15,00, z=335,50], EntitySheep['Sheep'/135, l='MpServer', x=-197,03, y=66,00, z=329,50], EntitySheep['Sheep'/134, l='MpServer', x=-198,34, y=66,00, z=329,50], EntityItem['item.tile.rose'/111, l='MpServer', x=-224,72, y=64,13, z=297,81], EntityZK['entity.Zmutowana Krowa.name'/144, l='MpServer', x=-152,50, y=25,00, z=273,50], EntitySheep['Sheep'/145, l='MpServer', x=-157,50, y=66,00, z=280,09], EntitySheep['Sheep'/146, l='MpServer', x=-152,13, y=64,00, z=272,84], EntitySheep['Sheep'/147, l='MpServer', x=-158,81, y=66,00, z=278,19], EntityZK['entity.Zmutowana Krowa.name'/148, l='MpServer', x=-144,50, y=15,00, z=325,50], EntityZK['entity.Zmutowana Krowa.name'/149, l='MpServer', x=-144,50, y=15,00, z=327,50], EntityZK['entity.Zmutowana Krowa.name'/171, l='MpServer', x=-120,50, y=66,00, z=251,50], EntityPig['Pig'/170, l='MpServer', x=-127,50, y=66,00, z=244,50], EntityWolf['Wolf'/169, l='MpServer', x=-115,31, y=63,00, z=236,34], EntityPig['Pig'/174, l='MpServer', x=-116,13, y=63,00, z=293,25], EntityPig['Pig'/173, l='MpServer', x=-121,13, y=63,00, z=289,53], EntityPig['Pig'/172, l='MpServer', x=-126,50, y=63,00, z=290,50], EntityPig['Pig'/162, l='MpServer', x=-134,53, y=66,00, z=243,06], EntityPig['Pig'/161, l='MpServer', x=-143,22, y=66,00, z=248,81], EntityPig['Pig'/160, l='MpServer', x=-134,88, y=69,00, z=221,03], EntityWolf['Wolf'/184, l='MpServer', x=-105,88, y=64,00, z=225,38], EntityZK['entity.Zmutowana Krowa.name'/182, l='MpServer', x=-103,50, y=20,00, z=195,50], EntityZK['entity.Zmutowana Krowa.name'/183, l='MpServer', x=-110,50, y=19,00, z=197,50]]
- Retry Entities: 0 total; []

java.lang.ClassCastException: net.minecraft.src.EntityZK cannot be cast to net.minecraft.src.EntityCow
at net.minecraft.src.RenderCow.doRender(RenderCow.java:28)
at net.minecraft.src.RenderManager.renderEntityWithPosYaw(RenderManager.java:185)
at net.minecraft.src.RenderManager.renderEntity(RenderManager.java:172)
at net.minecraft.src.RenderGlobal.renderEntities(RenderGlobal.java:438)
at net.minecraft.src.EntityRenderer.renderWorld(EntityRenderer.java:1070)
at net.minecraft.src.EntityRenderer.updateCameraAndRender(EntityRenderer.java:931)
at net.minecraft.src.EntityRendererProxy.updateCameraAndRender(EntityRendererProxy.java:20)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:898)
at net.minecraft.client.Minecraft.run(Minecraft.java:795)
at java.lang.Thread.run(Unknown Source)
--- END ERROR REPORT 8ba57285 ----------

 

mój kod

 

EntityZK.java

 

 


package net.minecraft.src;


import java.util.Random;

public class EntityZK extends EntityMob
{
public EntityZK(World world)
{
super(world);
texture = "/10Mod/ZK.png";
moveSpeed = 1.0F;
getNavigator().setAvoidsWater(true);
tasks.addTask(1, new EntityAIOpenDoor(this, true));
}
public int getMaxHealth()
{
return 4;
}

public boolean isAIEnabled()
{
return true;
}

protected String getLivingSound()
{
return "mob.MOB.default";
}
protected String getHurtSound()
{
return "mob.MOB.defaulthurt";
}
protected String getDeathSound()
{
return "mob.MOB.defaultdeath";
}
protected int getDropItemId()
{
return mod_10Mod.IgnotAluminium.shiftedIndex;
}

protected boolean canDespawn()
{
return false;
}
}

 

 

 

 

mod_10Mod.java

 

 


package net.minecraft.src;

import java.util.Map;
import java.util.Random;

public class mod_10Mod extends BaseMod {

public static Block BlockAluminium = new BlockAluminium(156, 0).setHardness(3.0F).setResistance(2.5F).setBlockName("Aluminium").setLightValue(0.4F);
public static Block BlockOreAluminium = (new BlockOreAluminium(157, 0)).setBlockName("BlockCristal").setHardness(10F).setResistance(50F);
public static Item IgnotAluminium = new ItemIgnot(501).setItemName("Sztabka Aluminium");

public String getVersion()
{
return "1.3.1";
}

@Override
public void load () {
ModLoader.addBiome(BiomeGenCz.czer);
ModLoader.registerEntityID(EntityZK.class, "Zmutowana Krowa", 15);
ModLoader.addSpawn(EntityZK.class, 14, 5, 15, EnumCreatureType.monster);

}
public mod_10Mod()
    {
           /*Nazwy*/
            ModLoader.addName(BlockOreAluminium, "Aluminium Ore");
            ModLoader.addName(IgnotAluminium, "Aluminium Ignot");
            ModLoader.addName(BlockAluminium, "Block Aluminium");

            //Textury
            BlockAluminium.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/10Mod/BlockAluminium.png");
            BlockOreAluminium.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/10Mod/OreAluminium.png");
            IgnotAluminium.iconIndex = ModLoader.addOverride("/gui/items.png", "/10Mod/IgnotAluminium.png");


            //Bloki
            ModLoader.registerBlock(BlockOreAluminium);
            ModLoader.registerBlock(BlockAluminium);

            //Przepalanie
            ModLoader.addSmelting(157, new ItemStack(IgnotAluminium, 1), 8);

            //Crafting
            ModLoader.addRecipe(new ItemStack(BlockAluminium, 1), new Object[]
                    {
                            "XXX", "XXX", "XXX",  'X', mod_10Mod.IgnotAluminium
                    });

    }

public void generateSurface(World world, Random random, int i, int j)
    {
            for (int k = 0; k < 15; k++)
            {
                    int x = i + random.nextInt(16);
                    int y = random.nextInt(19);
                    int z = j + random.nextInt(16);
                    (new WorldGenMinable(BlockOreAluminium.blockID, 9)).generate(world, random, x, y, z);
            }

   }
public void addRenderer(Map map)
{
map.put(EntityZK.class, new RenderCow(new ModelCow(), 0.5F));
}


};

 

 

Opublikowano

@up niedługo będzie tut o modelach teraz mogę tylko poradzić żebyś zrobił nowe pliki RenderZK i ModelZK i pozamieniał EntityCow na EntityZK w tych plikach, ale nie wiem czy to zadziała.

Opublikowano

mam problem bo chcem żeby z bloku wypadało 9 Steków ale wypada 3 mój kod


package net.minecraft.src;

import java.util.Random;

public class BlockSteak extends Block
{
       public BlockSteak(int i, int j)
       {
        super(i, j, Material.glass);
        func_71849_a(CreativeTabs.field_78030_;
       }

       public int idDropped(int par1, Random par2Random, int par3)
       {
           return ItemFood.beefCooked.shiftedIndex;
       }
       public int quantityDropped(Random par1Random)
       {
           return par1Random.nextInt(15);
       }
}

Opublikowano

ej karol202 kiedy zrobisz następną Lekcje?

 

@Edit

Mam Problem z Zombie

 

Errory

Description	Resource	Path	Location	Type
joint cannot be resolved or is not a field	EntityZombie.java	/Client/src/net/minecraft/src	line 63	Java Problem

2.
Description	Resource	Path	Location	Type
marihuana cannot be resolved or is not a field	EntityZombie.java	/Client/src/net/minecraft/src	line 59	Java Problem

 

Tam Gdzie Jest Error

protected boolean isAIEnabled()
   {
       return true;
   }
   protected void dropFewItems(boolean par1, int par2)
   {
       int i = rand.nextInt(3) + rand.nextInt(1 + par2);

       for (int j = 0; j < i; j++)
       {
           dropItem(Item.rottenFlesh.shiftedIndex, 1);
       }

       if (isBurning())
       {
           dropItem(mod_joint.marihuana.shiftedIndex, 1);
       }                                     ^
       else
       {
           dropItem(mod_joint.joint.shiftedIndex, 1);
       }                                    ^
   }

 

Cały Kod

 

 

 

package net.minecraft.src;

import java.util.Random;

public class EntityZombie extends EntityMob
{
   public EntityZombie(World par1World)
   {
       super(par1World);
       texture = "/mob/zombie.png";
       moveSpeed = 0.23F;
       attackStrength = 4;
       getNavigator().setBreakDoors(true);
       tasks.addTask(0, new EntityAISwimming(this));
       tasks.addTask(1, new EntityAIBreakDoor(this));
       tasks.addTask(2, new EntityAIAttackOnCollide(this, net.minecraft.src.EntityPlayer.class, moveSpeed, false));
       tasks.addTask(3, new EntityAIAttackOnCollide(this, net.minecraft.src.EntityVillager.class, moveSpeed, true));
       tasks.addTask(4, new EntityAIMoveTwardsRestriction(this, moveSpeed));
       tasks.addTask(5, new EntityAIMoveThroughVillage(this, moveSpeed, false));
       tasks.addTask(6, new EntityAIWander(this, moveSpeed));
       tasks.addTask(7, new EntityAIWatchClosest(this, net.minecraft.src.EntityPlayer.class, 8F));
       tasks.addTask(7, new EntityAILookIdle(this));
       targetTasks.addTask(1, new EntityAIHurtByTarget(this, false));
       targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, net.minecraft.src.EntityPlayer.class, 16F, 0, true));
       targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, net.minecraft.src.EntityVillager.class, 16F, 0, false));
   }

   public int getMaxHealth()
   {
       return 20;
   }

   /**
    * Returns the current armor value as determined by a call to InventoryPlayer.getTotalArmorValue
    */
   public int getTotalArmorValue()
   {
       return 2;
   }

   /**
    * Returns true if the newer Entity AI code should be run
    */
   protected boolean isAIEnabled()
   {
       return true;
   }
   protected void dropFewItems(boolean par1, int par2)
   {
       int i = rand.nextInt(3) + rand.nextInt(1 + par2);

       for (int j = 0; j < i; j++)
       {
           dropItem(Item.rottenFlesh.shiftedIndex, 1);
       }

       if (isBurning())
       {
           dropItem(mod_joint.marihuana.shiftedIndex, 1);
       }
       else
       {
           dropItem(mod_joint.joint.shiftedIndex, 1);
       }
   }

   /**
    * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
    * use this to react to sunlight and start to burn.
    */
   public void onLivingUpdate()
   {
       if (worldObj.isDaytime() && !worldObj.isRemote)
       {
           float f = getBrightness(1.0F);

           if (f > 0.5F && worldObj.canBlockSeeTheSky(MathHelper.floor_double(posX), MathHelper.floor_double(posY), MathHelper.floor_double(posZ)) && rand.nextFloat() * 30F < (f - 0.4F) * 2.0F)
           {
               setFire(8);
           }
       }

       super.onLivingUpdate();
   }

   /**
    * Returns the sound this mob makes while it's alive.
    */
   protected String getLivingSound()
   {
       return "mob.zombie";
   }

   /**
    * Returns the sound this mob makes when it is hurt.
    */
   protected String getHurtSound()
   {
       return "mob.zombiehurt";
   }

   /**
    * Returns the sound this mob makes on death.
    */
   protected String getDeathSound()
   {
       return "mob.zombiedeath";
   }

   /**
    * Returns the item ID for the item the mob drops on death.
    */
   protected int getDropItemId()
   {
       return Item.rottenFlesh.shiftedIndex;
   }

   /**
    * Get this Entity's EnumCreatureAttribute
    */
   public EnumCreatureAttribute getCreatureAttribute()
   {
       return EnumCreatureAttribute.UNDEAD;
   }

   protected void dropRareDrop(int par1)
   {
       switch (rand.nextInt(4))
       {
           case 0:
               dropItem(Item.swordSteel.shiftedIndex, 1);
               break;

           case 1:
               dropItem(Item.helmetSteel.shiftedIndex, 1);
               break;

           case 2:
               dropItem(Item.ingotIron.shiftedIndex, 1);
               break;

           case 3:
               dropItem(Item.shovelSteel.shiftedIndex, 1);
               break;
       }
   }
}

 

 

Opublikowano

masz

 

 

 

package net.minecraft.src;

import java.awt.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Random;

public class mod_10Mod extends BaseMod {

public static int wait = 0;
public static int highTime = 0;
public static int highStart = 0;
private ArrayList highMobs = new ArrayList();
private Object BaseX;
private Object BaseZ;

public static Block BlockAluminium = new BlockAluminium(156, 0).setHardness(3.0F).setResistance(5.0F).setBlockName("Aluminium").setLightValue(0.4F);
public static Block BlockOreAluminium = (new BlockOreAluminium(157, 0)).setBlockName("BlockCristal").setHardness(10F).setResistance(50F);
public static Item IgnotAluminium = new ItemIgnot(501).setItemName("Sztabka Aluminium");
public static Item Jajecznica = new ItemFood(502, 4, true).setItemName("Jajecznica");
public static Block WT = new BlockWT(158, 0, true).setHardness(0.5F).setResistance(0.5F).setLightValue(0.9999F).setRequiresSelfNotify().setBlockName("Mocna Pochodnia");
public static Block AButton = new BlockAButton(159, Block.glowStone.blockIndexInTexture).setResistance(0.5F).setLightValue(1.0F).setRequiresSelfNotify().setBlockName("Aluminium Button");
public static Item CocaCola = new ItemCola(503).setPotionEffect("Potion.weakness.id, 1, 0, 1F").setItemName("Coca Cola");
public static Block Steak = new BlockSteak(160, 0).setResistance(0.0F).setHardness(0.0F).setBlockName("Steak Block");
public static Item joint = new ItemFood(505, 10, false).setItemName("joint").setPotionEffect("Potion.confusion.id, 90, 0, 1F");
   public static Item marihuana = new ItemFood(506, 5, false).setItemName("marihuana").setPotionEffect("Potion.weakness.id, 60, 1, 1F");

public String getVersion()
{
	return "1.3.1";
}

@Override
public void load () {
	ModLoader.addBiome(BiomeGenCz.czer);
	ModLoader.registerEntityID(EntityZK.class, "Zmutowana Krowa", 15);
	ModLoader.addSpawn(EntityZK.class, 14, 5, 15, EnumCreatureType.monster);
}



 public mod_10Mod()
    {
           /*Nazwy*/
            ModLoader.addName(BlockOreAluminium, "Aluminium Ore");
            ModLoader.addName(Steak, "Block Steak");
            ModLoader.addName(CocaCola, "Coca Cola");
            ModLoader.addName(AButton, "Glowstone Button");
            ModLoader.addName(WT, "Strong Torch");
            ModLoader.addName(Jajecznica, "Jajecznica");
            ModLoader.addName(IgnotAluminium, "Aluminium Ignot");
            ModLoader.addName(BlockAluminium, "Block Aluminium");
            ModLoader.addName(joint, "joint");
            ModLoader.addName(marihuana, "Marihuana");

            //Textury
            BlockAluminium.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/10Mod/BlockAluminium.png");
            BlockOreAluminium.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/10Mod/OreAluminium.png");
            Steak.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/10Mod/Steak.png");
            WT.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/10Mod/StrongTorch.png");
            IgnotAluminium.iconIndex = ModLoader.addOverride("/gui/items.png", "/10Mod/IgnotAluminium.png");
            Jajecznica.iconIndex = ModLoader.addOverride("/gui/items.png", "/10Mod/Jajo.png");
            CocaCola.iconIndex = ModLoader.addOverride("/gui/items.png", "/10Mod/cocoa.png");
            joint.iconIndex = ModLoader.addOverride("/gui/items.png", "/gui/joint.png");
            marihuana.iconIndex = ModLoader.addOverride("/gui/items.png", "/gui/ganja.png");

            //Bloki
            ModLoader.registerBlock(BlockOreAluminium);
            ModLoader.registerBlock(WT);
            ModLoader.registerBlock(AButton);
            ModLoader.registerBlock(BlockAluminium);
            ModLoader.registerBlock(Steak);


            //Przepalanie
            ModLoader.addSmelting(157, new ItemStack(IgnotAluminium, 1), 8);
            ModLoader.addSmelting(344, new ItemStack(Jajecznica, 3), 0);
            //Crafting
            ModLoader.addRecipe(new ItemStack(BlockAluminium, 1), new Object[]
                    {
                            "XXX", "XXX", "XXX",  'X', mod_10Mod.IgnotAluminium
                    });
            ModLoader.addRecipe(new ItemStack(Steak, 1), new Object[]
                    {
                            "XXX", "XXX", "XXX", 'X', Item.beefCooked
                    });
            ModLoader.addRecipe(new ItemStack(CocaCola, 1), new Object[]
                    {
           	              "YOY", "YCY", "YMY", 'C', Item.sugar, 'Y', Block.thinGlass, 'M', Item.bucketMilk, 'O', Item.ingotIron, 
                    });
            ModLoader.addRecipe(new ItemStack(WT, 1), new Object[]
                    {
                            "X", "C", 'X', Block.torchWood, 'C', Block.torchRedstoneActive
                    });
            ModLoader.addRecipe(new ItemStack(joint, 1), new Object[]
                    {

               " X ", " F ", 'X', Item.paper, 'F', mod_joint.marihuana
                    });
            ModLoader.addRecipe(new ItemStack(AButton, 1), new Object[]
                    {
                            "X", 'X', mod_10Mod.IgnotAluminium
                    });

            ModLoader.addRecipe(new ItemStack(IgnotAluminium, 9), new Object[]
                    {
                            "X",  'X', mod_10Mod.BlockAluminium
                    });
    }  


 public void generateSurface(World world, Random random, int i, int j)
    {
            for (int k = 0; k < 7; k++)
            {
                    int x = i + random.nextInt(16);
                    int y = random.nextInt(27);
                    int z = j + random.nextInt(16);
                    (new WorldGenMinable(BlockOreAluminium.blockID, 7)).generate(world, random, x, y, z);
            }

   }
 public void addRenderer(Map map)
	{
					map.put(EntityZK.class, new RenderBiped(new ModelBiped(), 0.7F)); 
	}

};

 

 

Opublikowano

Poradnik jak tworzyć mody do minecraft.

Wiem że na forum jet pełno tutoriali jak robić mody, ale są albo do starej wersji, albo opisane tylko podstawy.

Aby tworzyć mody potrzebna jest chociaż bardzo mała znajomość javy, i angielskiego.

 

Poradnik na wersje minecrafta: 1.3.1

 

1.Instalacja MCP i JDK

 

 

1.Pobieramy JDK tu dla odpowiedniego systemu.

2.Instalujemy to co pobraliśmy.

3.Dodajemy zmienną środowiskową dla javy: Komputer > PPM na tle > Właściwości > Zaawansowane > Zmienne środowiskowe > Do path dodajemy ścieżkę do javy.

4.Uruchamiamy wiersz poleceń i wpisujemy javac. Jeśli wyświetla się lista to możecie robić dalsze punkty :). Jeśli konsola nie rozpozna polecenia, sprawdź czy dobrze dodałeś zmienną środowiskową.

5.Pobieramy MCP 7.x tu

6.Tworzymy gdzieś folder i kopiujemy do niego zawartość pobranego MCP.

7.Włączamy minecrafta i przed logowaniem w opcjach ustawiamy force update (pobierzemy czystego minecrafta), logujemy się.

8.Pobieramy ModLoader tu

9.Wchodzimy w appdata > .minecraft > bin > minecraft.jar, usuwamy META-INF, przenosimy pliki ModLoadera do minecraft.jar.

10.Kopiujemy foldery bin i resources z .minecraft do jars w folderze z MCP.

11.Pobieramy minecraft_server.jar z minecraft.net i kopiujemy go do jars w folderze z MCP.

12.W folderze z MCP uruchamiamy decompile.bat.

13.Pobierz Eclipse Classic 4.2 tu

14.Uruchom go i ustaw workspace na folder eclipse w folderze z mcp.

 

Po lewej stronie okna są pliki minecrafta.

 

Aby sprawdzić czy mod działa zapisz go i włącz Run>Run last launched w górnym menu. Wtedy włączy się minecraft z modem.

 

Aby zkompilować kod uruchom recompile.bat

Aby uzyskać zkompilowane pliki moda włącz reobfuscate.bat , pliki będą w folderze reobfuscate\minecraft .

 

 

 

2.Nowy blok

 

 

W tej części zrobisz własny blok!

Udaj się do Client/src/net.minecraft.src, stwórz teraz plik główny moda mod_NAZWAMODA.java, nazwa musi się zaczynać od mod_.

 

NAZWAMODA zastąp nazwą moda.

Edytuj go i napisz:

package net.minecraft.src;

public class mod_NAZWAMODA extends BaseMod
{
public static Block NAZWABLOKU = new BlockNAZWAPLIKUBLOKU(ID, 0).setBlockName("NAZWABLOKU").setHardness(TWARDOŚĆ).setResistance(ODPORNOŚĆ);
public String getVersion()
{
	return "WERSJA";
}
public void load() {}
public mod_NAZWAMODA()
{
	NAZWABLOKU.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/ŚĆIEŻKADOTEKSTUR");
	ModLoader.registerBlock(NAZWABLOKU);
	ModLoader.addName(NAZWABLOKU, "NAZWAWGRZE");
}
}

Pierwsza linijka nigdy się nie zmienia.W trzeciej zastąp mod_NAZWAMODA nazwą którą nazwałeś plik. Piąta linijka to deklaracja bloku, wszystkie NAZWABLOKU zastąp nazwą bloku który chcesz stworzyć(muszą być takie same).NAZWAPLIKUBLOKU zostaw na poźniej. ID zamień na id bloku w grze(dla bloków od 130 do 255).TWARDOŚĆ oznacza jak długo musimy kopać ten blok, np. kamień-1.5F, bruk-2F,

piasek-0.5F. ODPORNOŚĆ oznacza jak dużej siły wybuchu(tnt, crepper) potrzeba by zniszczyć ten blok. Na końcu TWARDOŚĆ i ODPORNOŚĆ stawiamy F ! WERSJA zastąp wersją moda. ŚĆIEŻKADOTEKSTUR zastępujemy ścieżka do tekstury tego bloku w formacie .png(zakończ na .png). NAZWAWGRZE zastąp nazwą jaką ma mieć blok w grze.

NAZWABLOKU.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/ŚĆIEŻKADOTEKSTUR");

To ustalanie textury bloku.

ModLoader.registerBlock(NAZWABLOKU);

To rejestrowanie bloku

Teraz stworzysz plik bloku BlockNAZWABLOKU.java :

package net.minecraft.src;
import java.util.Random;
public class BlockNAZWABLOKU extends Block
{
public BlockNAZWABLOKU(int i, int j)
{
	super(i, j, Material.MATERIAŁ);
 this.setCreativeTab(CreativeTabs.TAB);
}
public int idDropped(int i, Random j, int k)
{
	return mod_NAZWAMODA.NAZWA.blockID;
}
}

NAZWABLOKU(w nazwie też) zamień na nazwę bloku. Materiał zastąp materiałem z którego jest blok, różne materiały kopie się różnym narzędziem. Niektóre materiały: wood-drewno, rock-kamień, glass-szkło, cloth-wełna, sand-piasek. NAZWAMODA zastąp nazwą swojego moda, a NAZWA nazwą bloku/itemu który ma wypaść z bloku po zniszczeniu. Zapisz ten plik. Teraz przejdź do mod_NAZWAMODA, zmień NAZWAPLIKUBLOKU na nazwę pliku który tworzyłeś przed chwilą.

TAB zamień nazwę karty w której wyświetlany będzie ten blok(popacz na inne bloki i zobacz co tu można wpisać.

To już koniec :)

 

Teraz pokaże gotowy plik przykładowego moda:

package net.minecraft.src;
public class mod_tv extends BaseMod
{
public static Block tv = new BlockTV(131, 0).setBlockName("tv").setHardness(0.5F).setResistance(3F);
public String getVersion()
{
	return "1.0";
}
public void load() {}
public mod_tv()
{
	tv.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/ModTV/blockTV.png");
	ModLoader.registerBlock(tv);
	ModLoader.addName(tv, "Telewizor");
}
}

package net.minecraft.src;
public class BlockTV extends Block
{
public BlockTV(int i, int j)
{
	super(i, j, Material.glass);
 this.setCreativeTab(CreativeTabs.tabBlock);
}
}

 

 

 

2a.Specjalne właściwości bloków

 

 

W tej części pokaże specjalne właściwości bloków, np. niezniszczalność(bedrock), świecenie(glowstone).

Większość fragmentów kodu o właściwościach które tu zamieszcze wklejać po linijce deklarującej blok, przed średnikiem.

Przykład:

public static Block tv = new BlockTV(160, 0).setBlockName("tv").setHardness(1F).setResistance(10F).setBlockUnbreakable();

Niezniszczalność:

 

 

.setBlockUnbreakable();

Sprawia że blok jest nie zniszczalny tak jak bedrock.

Jeśli dajesz to, nie dawaj .setHardness() .

 

 

Świecenie:

 

 

.setLightValue(WARTOŚĆ)

Blok będzie świecił tak jak glowstone lub pochodnia. WARTOŚĆ zastąp jasnością świecenia, na końcu wartości daj F. Maksymalna wartość to 1F.

 

 

Dźwięk chodzenia:

 

 

.setStepSound(Block.DZWIEK)

Ustawia dźwięk chodzenia po tym bloku. Dostępne dźwięki to:

  • soundStoneFootstep
  • soundGrassFootstep
  • soundWoodFootstep
  • soundMetalFootstep
  • soundGlassFootstep
  • soundClothFootstep
  • soundSandFootstep
  • soundGravelFootstep

Ich nazwy troche mówią jak brzmią.

 

 

 

Wyłączenie statystyk:

 

 

Jeśli zbierzesz lub postawisz taki blok statystyki postawionych/zniszczonych bloków nie zmienią sie, np. woda.

.disableStats()

 

 

Inne wymiary bloku:

 

 

W konstruktorze pliku bloku dodaj tą linijkę:

setBlockBounds(mx, my, mz, xx, xy, xz);

mx - x tego gdzie blok się zaczyna

my - y tego gdzie blok się zaczyna

mz - z tego gdzie blok się zaczyna

xx - x tego gdzie blok się kończy

xy - y tego gdzie blok się kończy

xz - z tego gdzie blok się kończy

Standardowo dla bloków to:

setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F);

Dla podwójnej skrzyni:

setBlockBounds(0F, 0F, 0F, 2F, 2F, 2F);

 

 

 

 

 

2b.Rudy

 

 

W tej części sprawisz żę blok będzie występował w naturze(bedzie rudą). Musimy importować klasę Random, po

package net.minecraft.src;

dajemy

import java.util.Random;

Oto kod który trzeba wkleić jako osobną funkcje:

public void generateSurface(World world, Random random, int i, int j)
{
	for (int k = 0; k < 3; k++)
	{
		int x = i + random.nextInt(CZE);
		int y = MIN + random.nextInt(WYS);
		int z = j + random.nextInt(CZE);
		(new WorldGenMinable(BLOK.blockID, ILOSC)).generate(world, random, x, y, z);
	}
}

Domyślnie CZE zamień na 16, jeśli chcesz żeby generowało się rzadziej daj 24 albo 36. Nie moge znaleźść pliku w którym są zapisane wartości CZE każdej rudy, jak znajdę to powiem.

MIN zamień na minimalną wysokość na której generuje się blok, WYS to liczba warst na których generuje się blok od dołu(np. MIN to 10, a WYS to 30, to blok generuje się od wysokości 10 do 40). Jeśli nie chcesz minimalnej wysokości, zamień MIN na 0.

BLOK zamień na blok który ma się generować, ILOSC zamień na maksymalną ilość bloków wygenerowaną koło siebie za jednym razem.

Przykładowy plik główny moda:

package net.minecraft.src;
import java.util.Random;
public class mod_Cristal extends BaseMod
{
public static Block BlockCristal = new BlockCristal(200, 0).setBlockName("BlockCristal").setHardness(10F).setResistance(50F);

public String getVersion()
{
 return "1.0";
}

public void load(){}

public mod_Cristal()
{
			BlockCristal.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod_Cristal/blockCristal.png")
			ModLoader.addName(BlockCristal, "Kryształ");
			ModLoader.registerBlock(BlockCristal);
}
public void generateSurface(World world, Random random, int i, int j)
{
	for (int k = 0; k < 3; k++)
	{
		int x = i + random.nextInt(16);
		int y = 10 + random.nextInt(20);
		int z = j + random.nextInt(16);
		(new WorldGenMinable(BlockCristal.blockID, 4)).generate(world, random, x, y, z);
	}
}
}

Blok Cristal będzie się generował na warstwach od 10 do 30 w ilości od 1 do 4 na raz.

 

 

 

2c.Materiały wybuchowe

 

 

W tej części zrobisz blok który będzie wybuchał. Do pliku głównego moda dodaj blok i to:

public void addRenderer(Map map)
{

	 map.put(net.minecraft.src.EB.class, new RB());
}

EB zastąp nazwą pliku z działaniem bomby(EntityNAZWAPrimed) który za chwilę stworzysz.

RB zastąp nazwą pliku z renderowaniem bomby(RenderNAZWA) który za chwilę stworzysz.

Jeśli masz już funkcje addRenderer() dodaj tylko jej treść.

 

Oto kod pliku bloku bomby:

package net.minecraft.src;

import java.util.Random;

public class BlockNAZWA extends Block
{
public BlockNAZWA(int par1, int par2)
{
 super(par1, par2, Material.tnt);
}


public void onBlockAdded(World par1World, int par2, int par3, int par4)
{
 super.onBlockAdded(par1World, par2, par3, par4);

 if (par1World.isBlockIndirectlyGettingPowered(par2, par3, par4))
 {
	 onBlockDestroyedByPlayer(par1World, par2, par3, par4, 1);
	 par1World.setBlockWithNotify(par2, par3, par4, 0);
 }
}

/**
 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
 * their own) Args: x, y, z, neighbor blockID
 */
public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
{
 if (par5 > 0 && Block.blocksList[par5].canProvidePower() && par1World.isBlockIndirectlyGettingPowered(par2, par3, par4))
 {
	 onBlockDestroyedByPlayer(par1World, par2, par3, par4, 1);
	 par1World.setBlockWithNotify(par2, par3, par4, 0);
 }
}

/**
 * Returns the quantity of items to drop on block destruction.
 */
public int quantityDropped(Random par1Random)
{
 return 1;
}

/**
 * Called upon the block being destroyed by an explosion
 */
public void onBlockDestroyedByExplosion(World par1World, int par2, int par3, int par4)
{
 if (par1World.isRemote)
 {
	 return;
 }
 else
 {
	 ER entitytntprimed = new ER(par1World, (float)par2 + 0.5F, (float)par3 + 0.5F, (float)par4 + 0.5F);
	 entitytntprimed.fuse = par1World.rand.nextInt(entitytntprimed.fuse / 4) + entitytntprimed.fuse / 8;
	 par1World.spawnEntityInWorld(entitytntprimed);
	 return;
 }
}

/**
 * Called right before the block is destroyed by a player. Args: world, x, y, z, metaData
 */
public void onBlockDestroyedByPlayer(World par1World, int par2, int par3, int par4, int par5)
{
 if (par1World.isRemote)
 {
	 return;
 }

 if ((par5 & 1) == 0)
 {
	 dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(Block.tnt.blockID, 1, 0));
 }
 else
 {
	 ER entitytntprimed = new ER(par1World, (float)par2 + 0.5F, (float)par3 + 0.5F, (float)par4 + 0.5F);
	 par1World.spawnEntityInWorld(entitytntprimed);
	 par1World.playSoundAtEntity(entitytntprimed, "random.fuse", 1.0F, 1.0F);
 }
}

/**
 * Called when the block is clicked by a player. Args: x, y, z, entityPlayer
 */
public void onBlockClicked(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer)
{
 super.onBlockClicked(par1World, par2, par3, par4, par5EntityPlayer);
}

/**
 * Called upon block activation (left or right click on the block.). The three integers represent x,y,z of the
 * block.
 */
public boolean blockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer)
{
 if (par5EntityPlayer.getCurrentEquippedItem() != null && par5EntityPlayer.getCurrentEquippedItem().itemID == Item.flintAndSteel.shiftedIndex)
 {
	 onBlockDestroyedByPlayer(par1World, par2, par3, par4, 1);
	 par1World.setBlockWithNotify(par2, par3, par4, 0);
	 return true;
 }
 else
 {
	 return super.blockActivated(par1World, par2, par3, par4, par5EntityPlayer);
 }
}

/**
 * Returns an item stack containing a single instance of the current block type. 'i' is the block's subtype/damage
 * and is ignored for blocks which do not support subtypes. Blocks which cannot be harvested should return null.
 */
protected ItemStack createStackedBlock(int par1)
{
 return null;
}

 

Oto kod pliku z działaniem bomby(EntityNAZWAPrimed):

package net.minecraft.src;

public class EntityNAZWAPrimed extends Entity
{

public EntityNAZWAPrimed (World world)
{
super(world);
fuse = 0;
preventEntitySpawning = true;
setSize(0.98F, 0.98F);//sila
yOffset = height / 2.0F;
}

public EntityNAZWAPrimed (World world, double d, double d1, double d2)
{
this(world);
setPostion (d, d1, d2);
float f = (float)(Math.random()* 3.141592741012732D * 2D);
motionX = -MathHelper.sin((f * 3.141593F) / 180F) * 0.02F;
motionY = 0.20000000298023224D;
motionZ = -MathHelper.cos(( f * 3.141593F) / 180F) * 0.02F;
fuse = LONT;
prevPosX = d;
prevPosY = d1;
prevPosZ = d2;


}

protected void entityUnit()
{

}

protected boolean canTriggerWalking()
{
return false;
}

public boolean canBeCollidedWith()
{
return !isDead;
}

public void onUpdate()
{

prevPosX = posX;
prevPosY = posY;
prevPosZ = posZ;
motionY -= 0.039999999105930328D;
moveEntity(motionX, motionY, motionZ);
motionX *= 0.98000001907348633D;
motionY *= 0.98000001907348633D;
motionZ *= 0.98000001907348633D;

if(onGround)
{
motionX *= 0.69999998807907104D;
motionZ *= 0.69999998807907104D;
motionY += -0.5D;
}

if(fuse -- <= 0)
{
setDead();
explode();
}
else
{
worldObj.spawnParticle("smoke", posX, posY + 0.5D, posZ, 0.0D, 0.0D, 0.0D);
}

}

private void explode()
{
float f = MOC;
worldObj.createExplosion(null, posX, posY, posZ, f);
}

protected void writeEntityToNBT(NBTTagCompound tut)
{
tut.setByte("Fuse", (byte)fuse);
}

protected void readEntityFromNBT(NBTTagCompound tut)
{
fuse = tut.getByte("Fuse");
}

public float getShadowSize()
{
return 0.0F;
}

public int fuse;


protected void entityInit()
{


}
}

MOC zamień na moc bomby. TNT ma 4F, na końcu musi być F .

LONT zamień na długość czekania na wybuch, TNT ma 80.

 

Oto kod pliku renderowania bomby(RenderNAZWA):

package net.minecraft.src;

import org.lwjgl.opengl.GL11;

public class RenderNAZWA extends Render
{

private RenderBlocks blockRenderer;

public RenderNAZWA()
{
 blockRenderer = new RenderBlocks();
 shadowSize = 0.5F;
}

public void func_153_a(ER entityfirebombprimed, double d, double d1, double d2,
	 float f, float f1)
{
 GL11.glPushMatrix();
 GL11.glTranslatef((float)d, (float)d1, (float)d2);
 if(((float)entityfirebombprimed.fuse - f1) + 1.0F < 10F)
 {
	 float f2 = 1.0F - (((float)entityfirebombprimed.fuse - f1) + 1.0F) / 10F;
	 if(f2 < 0.0F)
	 {
		 f2 = 0.0F;
	 }
	 if(f2 > 1.0F)
	 {
		 f2 = 1.0F;
	 }
	 f2 *= f2;
	 f2 *= f2;
	 float f4 = 1.0F + f2 * 0.3F;
	 GL11.glScalef(f4, f4, f4);
 }
 float f3 = (1.0F - (((float)entityfirebombprimed.fuse - f1) + 1.0F) / 100F) * 0.8F;
 loadTexture("/terrain.png");
 blockRenderer.renderBlockAsItem(mod_NAZWAMODA.NAZWA, 0, entityfirebombprimed.getBrightness(f1));
 if((entityfirebombprimed.fuse / 5) % 2 == 0)
 {
	 GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
	 GL11.glDisable(2896 /*GL_LIGHTING*/);
	 GL11.glEnable(3042 /*GL_BLEND*/);
	 GL11.glBlendFunc(770, 772);
	 GL11.glColor4f(1.0F, 1.0F, 1.0F, f3);
	 blockRenderer.renderBlockAsItem(Block.tnt, 0, 1.0F);
	 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
	 GL11.glDisable(3042 /*GL_BLEND*/);
	 GL11.glEnable(2896 /*GL_LIGHTING*/);
	 GL11.glEnable(3553 /*GL_TEXTURE_2D*/);
 }
 GL11.glPopMatrix();
}

public void doRender(Entity entity, double d, double d1, double d2,
	 float f, float f1)
{
 func_153_a((ER)entity, d, d1, d2, f, f1);
}
}

 

W najbliższym czasie postaram się dodać jakiś przykład moda.

 

Autorzy:

- karol202

-Minecraft Maniak

 

 

 

3.Przedmiot

 

 

W tej części zrobisz własny przedmiot. Oto wzór pliku głównego:

package net.minecraft.src;
public class mod_NAZWAMODA extends BaseMod
{
public static Item NAZWAPRZEDMIOTU = new Item(ID).setItemName("NAZWAPRZEDMIOTU");
public String getVersion()
{
	return "WERSJA";
}
public void load(){}
public mod_NAZWAMODA()
{
	NAZWAPRZEDMIOTU.iconIndex = ModLoader.addOverride("/gui/items.png", "/ŚCIEŻKA DO TEKSTUR");
	ModLoader.addName(NAZWAPRZEDMIOTU, "NAZWAWGRZE");
}
}

NAZWAPRZEDMIOTU zastąp nazwą przedmiotu. ID dla przedmiotów to 255 i w góre, ja radzę zacząć od 500. Reszta tak jak w cz.2.

NAZWAPRZEDMIOTU.iconIndex = ModLoader.addOverride("/gui/items.png", "/ŚCIEŻKA DO TEKSTUR");

to ustalanie ikony przedmiotu. Przedmioty nie muszą być rejestrowane.

Oto przykładowy plik moda z przedmiotem:

package net.minecraft.src;
public class mod_tv extends BaseMod
{
public static Item pilot = new Item(500).setItemName("pilot");
public String getVersion()
{
	return "1.0";
}
public void load(){}
public mod_tv()
{
	pilot.iconIndex = ModLoader.addOverride("/gui/items.png", "/ModTV/itemPilot.png");
	ModLoader.addName(pilot, "Pilot od telewizora");
}
}

 

 

 

3a.Jedzenie

 

 

Tworzenie jedzenia różni się od tworzenia itemu, jedynie linijką deklarującą item.

To linijka deklarująca jedzenie:

public static Item NAZWAITEMU = new ItemFood(ID, WARTOSC, ULUBIONE).setItemName("NAZWAITEMU");

WARTOSC zastępujemy ilością odnawianych jednostek jedzenia(2 jednostki to jedna ikonka mięsa, człowiek ma 20 jednostek), jeśli tym jedzeniem będzie można oswajać wilki to ULUBIONE zastępujemy true, jeśli nie false. Pozostałe rzeczy do wpisania zostały opisane w części 3.Przedmiot .

 

 

 

3b.Narzędzia

 

 

Aby dodać do moda narzędzia potrzeba:

  • pliku rodzaju narzędzia danego typu dziedziczący po klasie typu narzędzia(nie każda klasa rodzaju narzędzia dziedziczy po klasie typu narzędzia)
  • pliku typu narzędzia dziedziczącego po klasie zwykłego przedmiotu
  • pliku z typem wyliczeniowym wytrzymałości, szybkości itd. danego typu narzędzia

Nie rozumiesz? Nie szkodzi.

Tutaj omówię jak będę używał niektórych słów w tej części:

  • rodzaj - np. kilof, łopata, miecz itd.
  • typ - to materiał z którego wykonane jest narzędzie np. diamentowe, drewniane itd.

Oto kod pliku z typem wyliczeniowym który nazwij EnumTYPToolMaterial, gdzie TYP zastąp typem narzędzia:

package net.minecraft.src;

public enum EnumTYPToolMaterial
{
TyP( LEV, UZY, MOC, ODP, A5);

private final int harvestLevel;
private final int maxUses;
private final float efficiencyOnProperMaterial;
private final int damageVsEntity;
private final int enchantability;

private EnumTYPToolMaterial(int k, int l, float f, int i1, int j1)
{
	harvestLevel = k;
	maxUses = l;
	efficiencyOnProperMaterial = f;
	damageVsEntity = i1;
	enchantability = j1;
}

public int getMaxUses()
{
	return maxUses;
}

public float getEfficiencyOnProperMaterial()
{
	return efficiencyOnProperMaterial;
}

public int getDamageVsEntity()
{
	return damageVsEntity;
}

public int getHarvestLevel()
{
	return harvestLevel;
}

public int getEnchantability()
{
	return enchantability;
}
}

LEV zastąp poziomem narzędzia. Niektóre bloki np. obsydian, ruda diamentu można zniszczyć tylko określonym poziomem narzędzia, albo lepszym, oto poziomy narzędzi:

 

-drewniane - 0

-kamienne - 1

-żelaznne - 2

-diamentowe - 3

-złote - 0

 

Nie będę wypisywał wszystkich bloków i minimalnego poziomu narzędzia potrzebnego do ich wydobycia, ale wypisze przykład:

 

-obsydian - 3

-ruda diamentu 2 i wyżej

 

UZY zamień na maksymalną ilość użyć.

Szybkość wydobywania bloków zależy od MOC, oto lista wartości MOC w standardowych typach narzędzi:

 

-drewniane - 2F

-kamienne - 4F

-żelaznne - 6F

-diamentowe - 8F

-złote - 12F

 

ODP to ilość żyć zabieranych mobowi/graczowi(w multipleyer) przy ataku, jedno serce przy gui z wyborem przedmiotu to 2 życia(człowiek ma 20 żyć).

A5 zastąp 14, nie wiem co to jest za wartość, jeśli ktoś sprawdzi i powie mi to nagrodzę plusem.

TYP zastąp typem narzędzia.

TyP zastąp typem narzęzia napisanym dużymi literami.

 

Oto kod pliku z typem narzędzia:

package net.minecraft.src;

public class ItemTYPTool extends Item
{
private Block blocksEffectiveAgainst[];
protected float efficiencyOnProperMaterial;
private int damageVsEntity;
protected EnumTYPToolMaterial toolMaterial;

protected ItemTYPTool(int i, int j, EnumTYPToolMaterial enumTYPtoolmaterial, Block ablock[])
{
	super(i);
	efficiencyOnProperMaterial = 4F;
	toolMaterial = enumTYPtoolmaterial;
	blocksEffectiveAgainst = ablock;
	maxStackSize = 1;
	setMaxDamage(enumTYPtoolmaterial.getMaxUses());
	efficiencyOnProperMaterial = enumTYPtoolmaterial.getEfficiencyOnProperMaterial();
	damageVsEntity = j + enumTYPtoolmaterial.getDamageVsEntity();
}

/**
 * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
 * sword
 */
public float getStrVsBlock(ItemStack itemstack, Block block)
{
	for (int i = 0; i < blocksEffectiveAgainst.length; i++)
	{
		if (blocksEffectiveAgainst[i] == block)
		{
			return efficiencyOnProperMaterial;
		}
	}

	return 1.0F;
}

/**
 * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise
 * the damage on the stack.
 */
public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
{
	itemstack.damageItem(2, entityliving1);
	return true;
}

public boolean onBlockDestroyed(ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving)
{
	itemstack.damageItem(1, entityliving);
	return true;
}

/**
 * Returns the damage against a given entity.
 */
public int getDamageVsEntity(Entity entity)
{
	return damageVsEntity;
}

/**
 * Returns True is the item is renderer in full 3D when hold.
 */
public boolean isFull3D()
{
	return true;
}

/**
 * Return the enchantability factor of the item, most of the time is based on material.
 */
public int getItemEnchantability()
{
	return toolMaterial.getEnchantability();
}
}

 

Dla każdego rodzaju narzędzia potrzeba inny kod.

Oto kod kilofu:

package net.minecraft.src;

public class ItemTYPPickaxe extends ItemTYPTool
{
private static Block blocksEffectiveAgainst[];

protected ItemTYPPickaxe(int i, EnumTYPToolMaterial enumTYPtoolmaterial)
{
	super(i, 2, enumTYPtoolmaterial, blocksEffectiveAgainst);
}

/**
 * Returns if the item (tool) can harvest results from the block type.
 */
public boolean canHarvestBlock(Block block)
{
	if (block == Block.obsidian)
	{
		return toolMaterial.getHarvestLevel() == 3;
	}

	if (block == Block.blockDiamond || block == Block.oreDiamond)
	{
		return toolMaterial.getHarvestLevel() >= 2;
	}

	if (block == Block.blockGold || block == Block.oreGold)
	{
		return toolMaterial.getHarvestLevel() >= 2;
	}

	if (block == Block.blockSteel || block == Block.oreIron)
	{
		return toolMaterial.getHarvestLevel() >= 1;
	}

	if (block == Block.blockLapis || block == Block.oreLapis)
	{
		return toolMaterial.getHarvestLevel() >= 1;
	}

	if (block == Block.oreRedstone || block == Block.oreRedstoneGlowing)
	{
		return toolMaterial.getHarvestLevel() >= 2;
	}

	if (block.blockMaterial == Material.rock)
	{
		return true;
	}
	else
	{
		return block.blockMaterial == Material.iron;
	}
}

/**
 * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
 * sword
 */
public float getStrVsBlock(ItemStack itemstack, Block block)
{
	if (block != null && (block.blockMaterial == Material.iron || block.blockMaterial == Material.rock))
	{
		return efficiencyOnProperMaterial;
	}
	else
	{
		return super.getStrVsBlock(itemstack, block);
	}
}

static
{
	blocksEffectiveAgainst = (new Block[]
			{
				Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold,
				Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.netherrack, Block.oreLapis, Block.blockLapis, Block.oreRedstone, Block.oreRedstoneGlowing, Block.rail,
				Block.railDetector, Block.railPowered
			});
}
}

Kod łopaty:

package net.minecraft.src;

public class ItemTYPSpade extends ItemTYPTool
{
private static Block blocksEffectiveAgainst[];

public ItemTYPSpade(int i, EnumTYPToolMaterial enumTYPtoolmaterial)
{
	super(i, 1, enumTYPtoolmaterial, blocksEffectiveAgainst);
}

/**
 * Returns if the item (tool) can harvest results from the block type.
 */
public boolean canHarvestBlock(Block block)
{
	if (block == Block.snow)
	{
		return true;
	}
	else
	{
		return block == Block.blockSnow;
	}
}

static
{
	blocksEffectiveAgainst = (new Block[]
			{
				Block.grass, Block.dirt, Block.sand, Block.gravel, Block.snow, Block.blockSnow, Block.blockClay, Block.tilledField, Block.slowSand, Block.mycelium
			});
}
}

Kod siekiery:

package net.minecraft.src;

public class ItemTYPAxe extends ItemTYPTool
{
private static Block blocksEffectiveAgainst[];

protected ItemTYPAxe(int i, EnumTYPToolMaterial enumTYPtoolmaterial)
{
	super(i, 3, enumTYPtoolmaterial, blocksEffectiveAgainst);
}

/**
 * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
 * sword
 */
public float getStrVsBlock(ItemStack itemstack, Block block)
{
	if (block != null && block.blockMaterial == Material.wood)
	{
		return efficiencyOnProperMaterial;
	}
	else
	{
		return super.getStrVsBlock(itemstack, block);
	}
}

static
{
	blocksEffectiveAgainst = (new Block[]
			{
				Block.planks, Block.bookShelf, Block.wood, Block.chest, Block.stairDouble, Block.stairSingle, Block.pumpkin, Block.pumpkinLantern
			});
}
}

Kod motyki:

package net.minecraft.src;

public class ItemTYPHoe extends Item
{
public ItemTYPHoe(int i, EnumTYPToolMaterial enumTYPtoolmaterial)
{
	super(i);
	maxStackSize = 1;
	setMaxDamage(enumTYPtoolmaterial.getMaxUses());
}

/**
 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS !
 */
public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int i, int j, int k, int l)
{
	if (!entityplayer.canPlayerEdit(i, j, k))
	{
		return false;
	}

	int i1 = world.getBlockId(i, j, k);
	int j1 = world.getBlockId(i, j + 1, k);

	if (l != 0 && j1 == 0 && i1 == Block.grass.blockID || i1 == Block.dirt.blockID)
	{
		Block block = Block.tilledField;
		world.playSoundEffect((float)i + 0.5F, (float)j + 0.5F, (float)k + 0.5F, block.stepSound.getStepSound(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F);

		if (world.isRemote)
		{
			return true;
		}
		else
		{
			world.setBlockWithNotify(i, j, k, block.blockID);
			itemstack.damageItem(1, entityplayer);
			return true;
		}
	}
	else
	{
		return false;
	}
}

/**
 * Returns True is the item is renderer in full 3D when hold.
 */
public boolean isFull3D()
{
	return true;
}
}

Kod miecza:

package net.minecraft.src;

public class ItemTYPSword extends Item
{
private int weaponDamage;
private final EnumTYPToolMaterial toolMaterial;

public ItemTYPSword(int i, EnumTYPToolMaterial TYPenumtoolmaterial)
{
	super(i);
	toolMaterial = enumTYPtoolmaterial;
	maxStackSize = 1;
	setMaxDamage(enumTYPtoolmaterial.getMaxUses());
	weaponDamage = 4 +enumTYPtoolmaterial.getDamageVsEntity();
}

/**
 * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if
 * sword
 */
public float getStrVsBlock(ItemStack itemstack, Block block)
{
	return block.blockID == Block.web.blockID ? 15F : 1.5F;
}

/**
 * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise
 * the damage on the stack.
 */
public boolean hitEntity(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1)
{
	itemstack.damageItem(1, entityliving1);
	return true;
}

public boolean onBlockDestroyed(ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving)
{
	itemstack.damageItem(2, entityliving);
	return true;
}

/**
 * Returns the damage against a given entity.
 */
public int getDamageVsEntity(Entity entity)
{
	return weaponDamage;
}

/**
 * Returns True is the item is renderer in full 3D when hold.
 */
public boolean isFull3D()
{
	return true;
}

/**
 * returns the action that specifies what animation to play when the items is being used
 */
public EnumAction getItemUseAction(ItemStack itemstack)
{
	return EnumAction.block;
}

/**
 * How long it takes to use or consume an item
 */
public int getMaxItemUseDuration(ItemStack itemstack)
{
	return 0x11940;
}

/**
 * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
 */
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
{
	entityplayer.setItemInUse(itemstack, getMaxItemUseDuration(itemstack));
	return itemstack;
}

/**
 * Returns if the item (tool) can harvest results from the block type.
 */
public boolean canHarvestBlock(Block block)
{
	return block.blockID == Block.web.blockID;
}

/**
 * Return the enchantability factor of the item, most of the time is based on material.
 */
public int getItemEnchantability()
{
	return toolMaterial.getEnchantability();
}
}

Teraz opisze co zmienić w pliku głównym moda. Narzędzie to przedmiot, więc w pliku głównym dodaje go się tak samo jak przedmiot, z wyjątkiem linijki deklarującej przedmiot, powinna ona wyglądać tak:

public static Item NAZWA = new ItemTYPRODZAJ(ID, EnumTYPToolMaterial.TyP).setItemName("NAZWA");

NAZWA zamień na nazwę przedmiotu, TYP na typ przedmiotu, ID na id, a TyP zamień na typ narzędzia pisany dużymi literami.

To już prawie koniec dodawania narzędzia. Teraz musisz podporządkować bloki które stworzyłeś w modzie do konkretnego rodzaju narzędzia, np. stworzyłeś blok OreCristal, jeśli chcesz żeby szybciej niszczyło się go kilofem musisz go dodać do listy przedmiotów w klasie danego rodzaju przedmiotu tzn.

znajdź kawałek kodu

static
{
	blocksEffectiveAgainst = (new Block[]
			{

w pliku rodzaju narzędzia, po nim jest lista bloków które łatwiej niszczyć włąśnie tym rodzajem narzędzia, na końcu listy dodaj to:

, mod_NAZWAMODA.BLOK

gdzie NAZWAMODA to nazwa moda, a BLOK to blok który ma być lepiej niszczony rodzajem narzędzia którego plik edytujesz.

 

 

 

3c. Efekty mikstur

 

 

To dowiesz się jak dodać efekty mikstur po zjedzeniu przedmiotu(jedzenia).

W pliku głównym moda w linijce dodającej jedzenie przed ; dodaj

.setPotionEffect(Potion.EFEKT.id, CZAS, POZIOM, SZANSA)

EFEKT to nazwa efektu mikstury(zobacz w itemach w pliku Item.java).

CZAS to czas działania mikstury podany w sekundach.

POZIOM to poziom ulepszenia mikstury(domyślnie 0).

SZANSA to szansa na wystąpienie efektu po zjedzeniu(na końcu musi być F , jeśli efekt ma wystąpić zawsze po zjedzeniu to daj 1F).

 

 

 

4.Receptury craftingu

 

 

W tej części zrobisz recepturę craftowania. Oto kod który trzeba wkleić tam gdzie dodaje się nazwy przedmiotów/bloków(mod_NAZWAMODA(){ }):

ModLoader.addRecipe(new ItemStack(WYNIK, ILOSC), new Object[]
			{
				UŁOŻENIEDOCRAFTOWANIA
			});

WYNIK zastąp tym co ma być wynikiem craftowania, a ILOSC ilością wyniku.

W UŁOŻENIEDOCRAFTOWANIA znajduje się ułożenie bloków/przedmiotów do craftowania, np.

-żelazny hełm:

ModLoader.addRecipe(new ItemStack(Item.helmetSteel, 1), new Object[]
			{
				"XXX", "X X", 'X', Item.ingotIron
			});

-zapalniczka

ModLoader.addRecipe(new ItemStack(Item.flintAndSteel, 1), new Object[]
			{
				"S ", " F", 'S', Item.ingotIron, 'F', Item.flint
			});

Jeśli blok/przedmiot jest stworzony w modzie w którym dodajesz recepture, nie dawaj przed nim nic. Jeśli nie jest daj przed nim Block. , lub Item. Np.

ModLoader.addRecipe(new ItemStack(TV, 1), new Object[]
			{
				"GGG", "GRG", "GGG", 'G', Block.glass, 'R', Item.redstone
			});

Przed TV nie dałem nic i jest dobrze.

 

Teraz dowiesz się jak robić poprawne ulózenie przedmiotów/bloków do craftowania. Najpierw piszesz ułożenie z różnych znaków, a potem opisujesz jaki materiał oznacza każdy znak. Spacja zawsze oznacza że teen slot w craftowaniu ma być pusty.

Oto wzór ułożenia do craftowania:

"GOR", "SRO", "DOL", Itemy użyte do craftowania

GOR to górna linia slotów w craftingu, SRO to środkowa, DOL to dolna. Jeśli nie dasz jakiejś linia to oznacza że górna może być też środkową, a środkowa może być dolną. Jeśli zostawisz spację w ułożeniu, oznacza to że ten slot musi być pusty.

 

 

 

4a.ShapelessRecipes

 

 

ShapelessRecipes to receptura craftowania w której nie ważne jest ułożenie składników, ale tylko jakie są składniki tej receptury, więc możesz ułożyć je dowolnie. Oto kod który trzeba wkleić tam gdzie zwykłe receptuty craftowania(konstruktor klasy moda):

ModLoader.addShapelessRecipe(new ItemStack(WYNIK, ILOSC), new Object[]
{
	SKŁADNIKI
});

SKŁADNIKI zastąp składnikami oddzielonymi przecinkami. Jeśli składnik to blok poprzedź go Block. , jeśli to przedmiot poprzedź go Item. , a jeśli jest on stworzony w modzie w którym robiony jest ten crafting nie poprzedzaj go niczym.

 

 

 

5.Receptury przetapiania

 

 

Aby dodać recepturę przetapiania wklej to:

ModLoader.addSmelting(ID, new ItemStack(WYNIK, ILOSC), EXP);

do mod_NAZWAMODA() { } (czyli tam gdzie receptury craftowania, ustalanie nazw bloków).

ID zastąp id tym co wkładasz do pieca, WYNIK tym czym chcesz dostać po przetopieniu, ILOSC to ilość wyniku.

EXP to ilość expa przy przepalaniu, na końcu F , najlepiej zastąp 0.2F .

 

 

 

6.Mob

 

 

Teraz opiszę zmiany w pliku głównym moda. Dodaj te linijki do funkcji load():

ModLoader.registerEntityID(EntityNAZWAMOBA.class, "NAZWAMOBA", ID);
ModLoader.addSpawn(EntityNAZWAMOBA.class, SZANSA, MIN, MAKS, EnumCreatureType.TYP);

NAZWAMOBA zamień na nazwę moba. SZANSA zamień na szansę wystąpienia moba liczbą od 1 do 15. MIN to minimalna ilość zespawnowanych mobów

na chunk. MAKS to maksymalna ilość zespawnowanych mobów na chunk.

ID to id moba - jakaś losowa liczba od 50 do 150

TYP to typ moba:

  • creature - mob pasywny(nigdy nie atakuje, spawnuje się w świetle)
  • watercreature - mob pasywny, spawnuje się w wodzie
  • monster - potwór(spawnuje się w nocy i atakuje)

Teraz dodaj nową funkcje:

public void addRenderer(Map map)
			{
							map.put(EntityNAZWAMOBA.class, new RenderBiped(new ModelBiped(), 0.5F));
			}

Teraz zaimportuj(dodaj linijkę po net.minecraft.src;):

import java.util.Map;

Teraz stwórz plik EntityNAZWAMOBA.java . Jego kod:

package net.minecraft.src;


import java.util.Random;

public class EntityNAZWAMOBA extends EntityTYP2
{
			public EntityNAZWAMOBA(World world)
			{
							super(world);
							texture = "ŚCIEŻKADOTEKSTUR";
							moveSpeed = SZYBKOSC;
							getNavigator().setAvoidsWater(true);
							LISTA UMIEJĘTNOŚCI
			}
			public int getMaxHealth()
			{
							return ŻYCIE;
			}

			public boolean isAIEnabled()
			{
				return true;
			}

			protected String getLivingSound()
			{
							return "mob.MOB.default";
			}
			protected String getHurtSound()
			{
							return "mob.MOB.defaulthurt";
			}
			protected String getDeathSound()
			{
							return "mob.MOB.defaultdeath";
			}
			protected int getDropItemId()
			{
							return DROP.shiftedIndex;
			}

			protected boolean canDespawn()
			{
							return DES;
			}
}

TYP2 można zamienić na:

  • EntityAnimal - mob pasywny
  • EntityMob - mob agresywny
  • EntityWaterMob - pasywny mob wodny

SCIEŻKADOTEKSTUR zamień na scieżkę do tekstur moba.

SZYBKOSC zamień na szybkość z jaką porusza się mob(człowiek ma 1F, a krowa 0.5F)

ŻYCIE zamień na ilość żyć moba(człowiek ma 20 żyć, jedno serce to dwa życia).

MOB zamień na nazwę moba którego dźwięki będzie wydawał ten mob(w przyszłości zrobię jak dodać własny dźwięk).

DROP zamień na nazwę itemu który może wypaść z tego moba przy zabiciu. Jeśli ten item został dodany w modzie to przed nazwą wpisz

mod_NAZWAMODA.

, jeśli jest to oryginalny item daj przed nim Item. , a jeśli oryginalny blok to Block. .

Jeśli mob może znikać zmień DES na true, a jeśli nie to na false .

Teraz dodaj umiejętności w miejscu gdzie LISTAUMIEJĘTNOŚĆI . Wzór umiejętności:

tasks.addTask(LP, new UMIEJĘTNOSC(PARAMETRY));

LP to liczba porządkowa umiejętności, zacznij od 0. Każda natępna umiejętność w losowej kolejności ma numer większy niż umiejętność linijkę wyżej. Wszystkie umiejętności są w plikach zaczynających się na EntityAI, więc każda nazwa umiejętności zaczyna się od EntityAI.

Każdy plik to jedna umiejętność. Oto kilka przykładowych umiejętności:

  • EntityAIWander(this, 0.25F) - losowe chodzenie moba(wszystkie oryginalne moby to mają)
  • EntityAISwimming(this) - pływanie(jeśli tego nie ma i mob wejdzie do wody to utonie i się udusi)
  • EntityAIPanic(this, 0.38F) - panika po uderzeniu(jeśli uderzysz tego moba on zacznie uciekać)
  • EntityAITempt(this, 0.25F, ITEM, false) - chodzenie za jedzeniem(np. świnia chodzi za zbożem). ITEM zamień na to zaczym moby będą chodziły. Działa tylko w przypadku mobów pasywnych. Potrzebne do rozmnażania
  • EntityAIFollowParent(this, 0.28F) - rozmnażanie itemem wybranym w EntityAITempt. Potrzebne do rozmnażania
  • EntityAIMate(this, 0.25F) - potrzebne do rozmnażania
  • EntityAIOpenDoor(this, true) - otwieranie drzwi
  • EntityAIAvoidEntity(this, net.minecraft.src.EntityNAZWAMOBA2.class, 8F, 0.3F, 0.35F) - uciekanie przed mobem. NAZWAMOBA2 zamień na nazwę moba przed którym ten ma uciekać.

Do rozmnażania potrzebne są umiejętności EntityAITempt , EntityAIFollowParent , EntityAIMate i funkcja

public EntityAnimal spawnBabyAnimal(EntityAnimal par1EntityAnimal)
{
	return new EntityNAZWAMOBA(worldObj);
}

i mob musi być mobem pasywnym.

 

Postaram się uzupełniać listę przykładowych umiejętności.

 

Teraz dam kawałek pliku z wartościami które trzeba było wpisać w pliku głównym moda(częstość, min, max spawnu na chunk)

	spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntitySheep.class, 12, 4, 4));
	spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntityPig.class, 10, 4, 4));
	spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntityChicken.class, 10, 4, 4));
	spawnableCreatureList.add(new SpawnListEntry(net.minecraft.src.EntityCow.class, 8, 4, 4));
	spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntitySpider.class, 10, 4, 4));
	spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntityZombie.class, 10, 4, 4));
	spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntitySkeleton.class, 10, 4, 4));
	spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntityCreeper.class, 10, 4, 4));
	spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntitySlime.class, 10, 4, 4));
	spawnableMonsterList.add(new SpawnListEntry(net.minecraft.src.EntityEnderman.class, 1, 1, 4));
	spawnableWaterCreatureList.add(new SpawnListEntry(net.minecraft.src.EntitySquid.class, 10, 4, 4));

to nie wszystkie moby, ale potem dam wszystkie.

 

Na koniec dam przykładowy mod z mobem:

mod_Test.java

package net.minecraft.src;

import java.util.Map;


public class mod_Test extends BaseMod
{
public void load()
{
	ModLoader.registerEntityID(EntityTest.class, "Test", ModLoader.getUniqueEntityId());
	ModLoader.addSpawn(EntityTest.class, 12, 4, 4, EnumCreatureType.creature);
}

public void addRenderer(Map map)
{
				map.put(EntityTest.class, new RenderBiped(new ModelBiped(), 0.5F));
}

public String getVersion()
{
	return "v1.0";
}

public mod_Test()
{

}
}

EntityTest.java

package net.minecraft.src;

import java.util.Random;

public class EntityTest extends EntityAnimal
{
			public EntityTest(World world)
			{
							super(world);
							texture = "	est\mobTest.png";
							moveSpeed = 1F;
							getNavigator().func_48664_a(true);
							tasks.addTask(0, new EntityAITempt(this, 0.25F, Item.wheat.shiftedIndex, false));
							tasks.addTask(1, new EntityAIFollowParent(this, 0.28F));
							tasks.addTask(2, new EntityAIMate(this, 0.25F));
							tasks.addTask(3, new EntityAIAvoidEntity(this, net.minecraft.src.EntityPig.class, 8F, 0.3F, 0.35F));
							tasks.addTask(4, new EntityAISwimming(this));
							tasks.addTask(5, new EntityAIPanic(this, 0.38F));
							tasks.addTask(6, new EntityAIWander(this, 0.25F));
			}
			public int getMaxHealth()
			{
							return 5;
			}

			public boolean isAIEnabled()
			{
				return true;
			}

			protected String getLivingSound()
			{
							return "mob.Pig.default";
			}
			protected String getHurtSound()
			{
							return "mob.Pig.defaulthurt";
			}
			protected String getDeathSound()
			{
							return "mob.Pig.defaultdeath";
			}
			protected int getDropItemId()
			{
							return Item.diamond.shiftedIndex;
			}

			protected boolean canDespawn()
			{
							return false;
			}

			public EntityAnimal spawnBabyAnimal(EntityAnimal par1EntityAnimal)
			{
				return new EntityPig(worldObj);
			}
}

Narazie moby będą korzystały z modelu człowieka.

 

 

 

7.Biomy

 

 

Teraz zrobisz biom. W pliku głownym moda w funkcji load() dodaj to

ModLoader.addBiome(BG);

BG zastąp nazwą pliku biomu który za chwilę stworzysz.

 

Utwórz nowy plik BiomeGenNAZWA gdzie nazwa to nazwa biomu. Będzie to główny plik biomu.

Jego kod:

package net.minecraft.src;

public class BiomeGenNAZWA extends BiomeGenBase
{
public BiomeGenZombieLand(int par1)
{
super(par1);
this.topBlock = (byte) BLOK1.blockID;
this.fillerBlock = (byte) BLOK2.blockID;
}
}

BLOK1 zastąp blokiem który występuje na górze(w większości biomów trawa).

BLOK2 zastąp blokiem który występuje pod górnym blokiem(w większości biomów ziemia, nie chodzi tu o kamień bo on jest jeszcze niżej).

Przed BLOK1 i BLOK2 należy wpisać Block. lub mod_NAZWAMODA. w zależności gdzie został stworzony.

W biomach będą spawnowały się domyślne zwierzęta(świnia, krowa, owca, creeper, zombie, szkielet, kurczak, itd.), jeśli chcesz to zmienić po

this.fillerBlock = (byte) BLOK2.blockID;

dodaj

spawnableCreatureList.clear();

- usunięcie spawnu zwierząt

spawnableWaterCreatureList.clear();

- usunięcie spawnu zwierząt wodnych

spawnableMonsterList.clear();

- usunięcie spawnu potworów

Możesz też dodać spawn określonego moba:

spawnableTYPList.add(new SpawnListEntry(EntityMOB.class, W1, W2, W3));

TYP zamień na typ moba:

  • Creature - zwierzę
  • WaterCreature - mob wodny
  • Monster - potwór

MOB zamień na nazwę moba który będzie się spawnował.

W1, W2, W3 to właściwości które opisane są w części o mobach

Takich linijek może być wiele, każda doda jakiegoś moba.

 

Można zmienić liczbę różnych rzeczy generowanych w biomie:

this.theBiomeDecorator.ZMIENNA = ILOŚĆ;

ZMIENNA to zmienna która jest w pliku BiomeDecorator określająca ilość czegoś generowanego(np. drzew, kaktusów, kwiatków, czciny cukrowej).

ILOŚĆ to liczba tego generowanego na chunk(16x16x256).

ZMIENNA musi być zadeklarowana w pliku BiomeDecorator i musi kończyć się na PerChunk .

 

Teraz będziesz edytował plik vanila(domyślny minecraftowy) BiomeGenBase.java .

Po linijce

public static final BiomeGenBase jungleHills = (new BiomeGenJungle(22)).setColor(2900485).setBiomeName("JungleHills").func_76733_a(5470985).setTemperatureRainfall(1.2F, 0.9F).setMinMaxHeight(1.8F, 0.5F);

(prawdopodobnie 48 linijka) dodaj linijkę

public static final BiomeGenBase NAZWABIOMU = (new BG(ID)).setBiomeName("NAZWABIOMU").func_76733_a(5470985)FUNKCJE;

ID to id biomu, dżunglowe góry mają 22 więc używaj od 23 w góre.

FUNKCJE zamień na dodatkowe rzeczy którymi zmieniasz właściwości biomu, przykładowe to:

.setColor(LICZBA)

- ustalanie koloru trawy, gdzie liczba to liczba koloru(zobacz na inne biomy i poeksperymentuj).

.setTemperatureRainfall(T1, T2)

- zmiana temperatury(od tego zależy zamarzanie wody i śnieg), gdzie T1 i T2 to temperatury(zobacz na inne biomy i poeksperymentuj).

 

Biom już gotowy, teraz pokażę przykład modu z biomem.

mod_CreepLand

package net.minecraft.src;

public class mod_CreepLand extends BaseMod
{
public void load()
{
 ModLoader.addBiome(BiomeGenCreepLand);
}

public String getVersion()
{
return "1.0";
}

public mod_CreepLand()
{
}
}

BiomeGenCreepLand:

package net.minecraft.src;

public class BiomeGenCreepLand extends BiomeGenBase
{
public BiomeGenCreepLand(int par1)
{
super(par1);
spawnableCreatureList.clear();
spawnableWaterCreatureList.clear();
spawnableMonsterList.clear();
spawnableMonsterList.add(new SpawnListEntry(EntityCreeper.class, 15, 2, 4));
this.topBlock = (byte) Block.stone.blockID;
this.fillerBlock = (byte) Block.dirt.blockID;
}
}

BiomeGenBase:

package net.minecraft.src;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public abstract class BiomeGenBase
{
/** An array of all the biomes, indexed by biome id. */
public static final BiomeGenBase[] biomeList = new BiomeGenBase[256];
public static final BiomeGenBase ocean = (new BiomeGenOcean(0)).setColor(112).setBiomeName("Ocean").setMinMaxHeight(-1.0F, 0.4F);
public static final BiomeGenBase plains = (new BiomeGenPlains(1)).setColor(9286496).setBiomeName("Plains").setTemperatureRainfall(0.8F, 0.4F);
public static final BiomeGenBase desert = (new BiomeGenDesert(2)).setColor(16421912).setBiomeName("Desert").setDisableRain().setTemperatureRainfall(2.0F, 0.0F).setMinMaxHeight(0.1F, 0.2F);
public static final BiomeGenBase extremeHills = (new BiomeGenHills(3)).setColor(6316128).setBiomeName("Extreme Hills").setMinMaxHeight(0.3F, 1.5F).setTemperatureRainfall(0.2F, 0.3F);
public static final BiomeGenBase forest = (new BiomeGenForest(4)).setColor(353825).setBiomeName("Forest").func_76733_a(5159473).setTemperatureRainfall(0.7F, 0.8F);
public static final BiomeGenBase taiga = (new BiomeGenTaiga(5)).setColor(747097).setBiomeName("Taiga").func_76733_a(5159473).setEnableSnow().setTemperatureRainfall(0.05F, 0.8F).setMinMaxHeight(0.1F, 0.4F);
public static final BiomeGenBase swampland = (new BiomeGenSwamp(6)).setColor(522674).setBiomeName("Swampland").func_76733_a(9154376).setMinMaxHeight(-0.2F, 0.1F).setTemperatureRainfall(0.8F, 0.9F);
public static final BiomeGenBase river = (new BiomeGenRiver(7)).setColor(255).setBiomeName("River").setMinMaxHeight(-0.5F, 0.0F);
public static final BiomeGenBase hell = (new BiomeGenHell(8)).setColor(16711680).setBiomeName("Hell").setDisableRain().setTemperatureRainfall(2.0F, 0.0F);

/** Is the biome used for sky world. */
public static final BiomeGenBase sky = (new BiomeGenEnd(9)).setColor(8421631).setBiomeName("Sky").setDisableRain();
public static final BiomeGenBase frozenOcean = (new BiomeGenOcean(10)).setColor(9474208).setBiomeName("FrozenOcean").setEnableSnow().setMinMaxHeight(-1.0F, 0.5F).setTemperatureRainfall(0.0F, 0.5F);
public static final BiomeGenBase frozenRiver = (new BiomeGenRiver(11)).setColor(10526975).setBiomeName("FrozenRiver").setEnableSnow().setMinMaxHeight(-0.5F, 0.0F).setTemperatureRainfall(0.0F, 0.5F);
public static final BiomeGenBase icePlains = (new BiomeGenSnow(12)).setColor(16777215).setBiomeName("Ice Plains").setEnableSnow().setTemperatureRainfall(0.0F, 0.5F);
public static final BiomeGenBase iceMountains = (new BiomeGenSnow(13)).setColor(10526880).setBiomeName("Ice Mountains").setEnableSnow().setMinMaxHeight(0.3F, 1.3F).setTemperatureRainfall(0.0F, 0.5F);
public static final BiomeGenBase mushroomIsland = (new BiomeGenMushroomIsland(14)).setColor(16711935).setBiomeName("MushroomIsland").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(0.2F, 1.0F);
public static final BiomeGenBase mushroomIslandShore = (new BiomeGenMushroomIsland(15)).setColor(10486015).setBiomeName("MushroomIslandShore").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(-1.0F, 0.1F);

/** Beach biome. */
public static final BiomeGenBase beach = (new BiomeGenBeach(16)).setColor(16440917).setBiomeName("Beach").setTemperatureRainfall(0.8F, 0.4F).setMinMaxHeight(0.0F, 0.1F);

/** Desert Hills biome. */
public static final BiomeGenBase desertHills = (new BiomeGenDesert(17)).setColor(13786898).setBiomeName("DesertHills").setDisableRain().setTemperatureRainfall(2.0F, 0.0F).setMinMaxHeight(0.3F, 0.8F);

/** Forest Hills biome. */
public static final BiomeGenBase forestHills = (new BiomeGenForest(18)).setColor(2250012).setBiomeName("ForestHills").func_76733_a(5159473).setTemperatureRainfall(0.7F, 0.8F).setMinMaxHeight(0.3F, 0.7F);

/** Taiga Hills biome. */
public static final BiomeGenBase taigaHills = (new BiomeGenTaiga(19)).setColor(1456435).setBiomeName("TaigaHills").setEnableSnow().func_76733_a(5159473).setTemperatureRainfall(0.05F, 0.8F).setMinMaxHeight(0.3F, 0.8F);

/** Extreme Hills Edge biome. */
public static final BiomeGenBase extremeHillsEdge = (new BiomeGenHills(20)).setColor(7501978).setBiomeName("Extreme Hills Edge").setMinMaxHeight(0.2F, 0.8F).setTemperatureRainfall(0.2F, 0.3F);

/** Jungle biome identifier */
public static final BiomeGenBase jungle = (new BiomeGenJungle(21)).setColor(5470985).setBiomeName("Jungle").func_76733_a(5470985).setTemperatureRainfall(1.2F, 0.9F).setMinMaxHeight(0.2F, 0.4F);
public static final BiomeGenBase jungleHills = (new BiomeGenJungle(22)).setColor(2900485).setBiomeName("JungleHills").func_76733_a(5470985).setTemperatureRainfall(1.2F, 0.9F).setMinMaxHeight(1.8F, 0.5F);

public static final BiomeGenBase creepLand = (new BiomeGenCreepLand(23)).setColor(2900485).setBiomeName("CreepLand").setDisableRain();

 

 

 

Jeśli dodajesz kilka rzeczy w jednym modzie(prawie w każdym tak jest), rób to tak:

package net.minecraft.src;
public class mod_NAZWAMODA extends BaseMod
{
public static Block NAZWABLOKU = new BlockNAZWAPLIKUBLOKU(ID, 0).setBlockName("NAZWABLOKU").setHardness(TWARDOŚĆ).setResistance(ODPORNOŚĆ);
public static Block NAZWABLOKU = new BlockNAZWAPLIKUBLOKU(ID, 0).setBlockName("NAZWABLOKU").setHardness(TWARDOŚĆ).setResistance(ODPORNOŚĆ);
public String getVersion()
{
	return "WERSJA";
}
public void load() {}
public mod_NAZWAMODA()
{
	NAZWABLOKU.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/ŚĆIEŻKADOTEKSTUR");
	NAZWABLOKU.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/ŚĆIEŻKADOTEKSTUR");
	ModLoader.registerBlock(NAZWABLOKU);
	ModLoader.registerBlock(NAZWABLOKU);
	ModLoader.addName(NAZWABLOKU, "NAZWAWGRZE");
	ModLoader.addName(NAZWABLOKU, "NAZWAWGRZE");
}
}

 

Tutorial będę często rozwijał.

Oto lista rzeczy które zamierzam dodać:

  • Zbroje
  • GUI
  • Model moba
  • Zadawanie obrażeń
  • Własny rodzaj narzędzia

Proszę o podawanie błędów(jeśli je zrobiłem).

Liczę na plusy.

wlasny rodzaj narzedzia jest prosty tak jak i zbroja wazniejszy jest wlasny model moba :)

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...