• Страница 1 из 1
  • 1
Модератор форума: KHz, mef_prog, Mo3RiN  
[Modloader]Основы Программирования Для Minecraft Часть 4
KHzДата: Пятница, 28.10.2011, 22:26 | Сообщение # 1
Группа: Администраторы
Сообщений: 29
Награды: 0
Репутация: 5
Статус: Offline
Глава 10. Создание нового враждебного моба - Advanced.

Ожидайте.

Глава 11. Создание разностороннего блока.

Копируем данный код, он должен уже быть ясен вам. Если нет, то бегом зубрить предыдущие главы.

Cоздаем файл с именем mod_tex.java дабы не портить mod_gcc и не запутаться.

Code
package net.minecraft.src;
import java.util.Random;

public class mod_tex extends BaseMod
{
          public static Block Tex = new BlockTex(110, 0).setHardness(1.0F).setResistance(6000.0F).setBlockName("Tex");
}
            
     public String Version()
     {
                  return "1.8.1";
     }
       
     public mod_tex()
     {
          ModLoader.RegisterBlock(Tex);
          Tex.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/Tex.png");
          ModLoader.AddName(Tex, "Tex");
          ModLoader.AddRecipe(new ItemStack(Tex, 1), new Object[]{ "#", Character.valueOf('#'), Block.dirt,});
     }
}


Далее пишем под публичной блока:
Публичная текстуры с бока:

Code
public static int TexSide;

Публичная текстуры с лица:
public static int TexFront;


Сделали? Отлично! Теперь нам нужно указать TexSide и TexFront куда им ходить за текстурой. Пишем после рецепта:

Путь к текстуре, которя будет боковой:

Code
TexSide = ModLoader.addOverride("/terrain.png", "/textures/TexSide.png");


Путь к текстуре, которя будет лицевой:

Code
TexFront = ModLoader.addOverride("/terrain.png", "/textures/TexFront.png");


Front.



Side.



Обычная Tex.



Проверяем.



Двинемся далее. Cоздаем файл с именем BlockTex.java.
Вот код для отображении текстуры на нашем блоке. Думаю, что потом вам не составит труда отредактировать его для своего следующего блока. В общих словах, вся эта махина создает блок с текстурой Tex. Потом присваивает всем сторонам текстуру TexSide, а уже потом только лицевой стороне присваивается текстура TexFront.

Code
package net.minecraft.src;

import java.util.Random;

public class BlockTex extends Block
{

      public BlockTex(int i, int j)
      {
          super(i, j, Material.rock);
                  blockIndexInTexture = j;
      }
            
      public int idDropped(int i, int j)
      {
          return mod_tex.Tex.blockID;
      }
            
      public int quantityDropped(Random random)
      {
              return 2;
      }
                    
          public int getBlockTextureFromSideAndMetadata(int i, int j)
      {
          if(i == 1)
          {
              return blockIndexInTexture;
          }
          if(i == 0)
          {
              return blockIndexInTexture;
          }

          int k = mod_tex.TexFront;
            
          if(j == 2 && i == 2)
          {
              return k;
          }
          if(j == 3 && i == 5)
          {
              return k;
          }
          if(j == 0 && i == 3)
          {
              return k;
          }
          if(j == 1 && i == 4)
          {
              return k;
          } else
          {
              return mod_tex.TexSide;
          }
      }

      public int getBlockTextureFromSide(int i)     
      {
          if(i == 1)   
          {
              return blockIndexInTexture;
          }
          if(i == 0)
          {
              return blockIndexInTexture;
          }
          if(i == 3)
          {
                  return mod_tex.TexFront;
                
          } else
          {
              return mod_tex.TexSide;
          }
      }
}


Ну и как бы бонус. Вот эти пару строчек будут ставить блок к вам лицом. Если это нужно, то впишите их в конце.

Code
public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
      {
          int l = MathHelper.floor_double((double)((entityliving.rotationYaw * 4F) / 360F) + 2.5D) & 3;
          world.setBlockMetadataWithNotify(i, j, k, l);
      }


Скриншот из игры:



Глава 12. Создание нового моба-помощника. Лучник - Advanced.

Эта статья рассчитана на продвинутых пользователей умеющих делать простейшие моды для майнкрафта, и здесь я попытаюсь рассказать о том как сделать моба который будет вас защищать стоя на месте.

Итак начнем:

Создаем файл mod_BowMan.java в котором мы укажем блок спавна нашего защитника:

Code
package net.minecraft.src;

public class mod_BowMan extends BaseMod
{

public static final Block BowManEgg = (new BlockBowManEgg(164, 0)).setHardness(0.0F).setResistance(0.0F).setBlockName("BowManegg");

      public mod_BowMan()
      {
          ModLoader.RegisterBlock(BowManEgg);
          ModLoader.AddName(BowManEgg, "Bowman Egg");
          BowManEgg.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/bowmanegg.png");
          ModLoader.AddRecipe(new ItemStack(BowManEgg, 1), new Object[] { "X", Character.valueOf('X'), Block.dirt});
          ModLoader.RegisterEntityID(net.minecraft.src.EntityBowMan.class, "entityBowMan", ModLoader.getUniqueEntityId());
      }

      public String Version()
      {
          return "Guard Mob Tutorial by Perpetual Motion Team";
      }
            
}


Теперь создаем файл EntityBowMan.java
Начало такое-же как и в создании нейтрала

Code
package net.minecraft.src;

import java.util.List;
import java.util.Random;

public class EntityBowMan extends EntityAnimal
{

      public EntityBowMan(World world)
      {
          super(world);
          texture = "/mob/char.png";
          moveSpeed = 0.0F;
          health = 50;
          isImmuneToFire = true;
      }


Но появляется пара новых строчек.

Скорость передвижения моба(0.7F - скорость игрока, 0.0F - моб стоит на месте), у нас будет лучник, поэтому скорость 0.

Code
moveSpeed = 0.0F;


Жизни моба(1 жизнь - пол-сердца, у игрока 20 жизней).

Code
  health = 50;


Иммунитет к огню (и к лаве ).

Code
  isImmuneToFire = true;


Теперь дописываем дальше:

Чтоб наш моб не пропадал.

Code
    protected boolean canDespawn()
      {
          return false;
      }


Теперь надо чтоб лучник находил врагов:

Здесь в каждую переменную типа list записывается данный о враждебных мобах.

Code
    protected void updatePlayerActionState()
      {
          if(playerToAttack == null)
          {
              List list;
              list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntityMob.class, AxisAlignedBB.getBoundingBoxFromPool(posX - 16.0D, posY - 4.0D, posZ - 16.0D, posX + 17.0D, posY + 5.0D, posZ + 17.0D));
              if(list.isEmpty())
              {
                  list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntityMob.class, AxisAlignedBB.getBoundingBoxFromPool(posX - 16.0D, posY - 12.0D, posZ - 16.0D, posX + 17.0D, posY - 4.0D, posZ + 17.0D));
                  if(list.isEmpty())
                  {
                  list = worldObj.getEntitiesWithinAABB(net.minecraft.src.EntityMob.class, AxisAlignedBB.getBoundingBoxFromPool(posX - 16.0D, posY - 20.0D, posZ - 16.0D, posX + 17.0D, posY - 12.0D, posZ + 17.0D));                       
                  }
              }
              if(!list.isEmpty())
              {
                  setTarget((Entity)list.get(worldObj.rand.nextInt(list.size())));
              }
          }
          super.updatePlayerActionState();
      }


Теперь обрабатываем событие на атаку:

Code
protected void attackEntity(Entity entity, float f)
      {
          if(f < 240F)
          {
              double d = entity.posX - posX;
              double d1 = entity.posZ - posZ;
              if(attackTime == 0)
              {
                  EntityArrow entityarrow = new EntityArrow(worldObj, this);
                  entityarrow.posY += 0.1999999761581421D;
                  double d2 = (entity.posY + (double)entity.getEyeHeight()) - 0.20000000298023224D - entityarrow.posY;
                  float f1 = MathHelper.sqrt_double(d * d + d1 * d1) * 0.2F;
                  worldObj.playSoundAtEntity(this, "random.bow", 1.0F, 1.0F / (rand.nextFloat() * 0.4F + 0.8F));
                  worldObj.entityJoinedWorld(entityarrow);
                  entityarrow.setArrowHeading(d, d2 + (double)f1, d1, 1.5F, 12F);
                  attackTime = 2;
              }
              rotationYaw = (float)((Math.atan2(d1, d) * 180D) / 3.1415927410125732D) - 90F;
              hasAttacked = true;
          }
      }


Если умеете нормально программировать, то можете поменять здесь код на свою обработку.
А так объясню только 1 переменную:

Время до следующей атаки (у скелета время = 30, а у нас в 15 раз быстрее )

Code
  attackTime = 2;


И наконец дописываем концовку:

Code
protected String getLivingSound()
      {
          return "mob.skeleton";
      }

      protected String getHurtSound()
      {
          return "mob.skeletonhurt";
      }

      protected String getDeathSound()
      {
          return "mob.skeletondeath";
      }

      private int angerLevel;
      private int randomSoundDelay;
}


Теперь нам надо сделать файл BlockBowManEgg.java:

Code
package net.minecraft.src;

import java.io.PrintStream;
import java.util.Random;

public class BlockBowManEgg extends Block
{

      protected BlockBowManEgg(int i, int j)
      {
          super(i, j, Material.ground);
      }

      public int quantityDropped(Random random)
      {
          return 1;
      }

      public int tickRate()
      {
          return 30;
      }

      public void onBlockClicked(World world, int i, int j, int k, EntityPlayer entityplayer)
      {
          double d = i;
          double d1 = j;
          double d2 = k;
          EntityBowMan entitybowman = new EntityBowMan(world);
          entitybowman.setLocationAndAngles(d, d1, d2, world.rand.nextFloat() * 360F, 0.0F);
          world.entityJoinedWorld(entitybowman);
      }
}


Здесь все просто - по нажатию левой кнопкой мыши блок ломается (потому-что крепкость 0) и вызывает на это место лучника.
Остались только текстуры:
Текстура лучника - не требуется (в коде вписана стандартная текстура игрока).
Текстура bowmanegg.png - берем любой файл 16*16 и кидаем в папку textures в minecraft.jar с именем bowmanegg.png.

Ну вот стрелок и готов.

Автор 12 главы: DarkMan.

Мини-глава. Нормальное стекло.

Многие встречались с проблемой, когда после создания "прозрачной" текстуры, через блок можно было смотреть через весь мир, типа X-Ray мода.
Данная проблема решается строчками, которые добавляются в .java блока.

Code
public boolean isOpaqueCube()
      {
          return false;
      }

      public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l)
      {
          int i1 = iblockaccess.getBlockId(i, j, k);
          if(!localFlag && i1 == blockID)
          {
              return false;
          } else
          {
              return super.shouldSideBeRendered(iblockaccess, i, j, k, l);
          }
      }

      private boolean localFlag;


Вот и все. После чего у вас будет красивое подобие стекла.
Удачи!

Глава 13. Создание новой брони на основе стандартных материалов.

Добавим к пабликам следующее и разберем:

public static Item titanHelmet = new ItemArmor(3003, 3, ModLoader.AddArmor("titan"), 0).setItemName("titanHelmet");

Название.

Code
Item titanHelmet


ID.

Code
3003


0 = кожа, 1 = золото и кольчуга, 2 = железо, 3 = алмаз.
В нашем случае алмаз.
Code
3[/code]

Вот тут самое интересное. Для вашей брони придется подписывать везде вот так, т.к это получается целый набор.

[code]ModLoader.AddArmor("titan")


0 = шлем, 1 = нагрудник, 2 = штанишки, 3 = ботинки.
В нашем случае шлем.

Code
0[/code]

Опять повторяем название.

[code]"titanHelmet"


Сначала делаем текстуры для инвентаря.
Все как обычно. Текстура должна быть 16x16.

Code
titanHelmet.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/helmet.png");


Для красоты я взял текстуру железного шлема и затемнил.

(размеры не изменять!)

Ну и теперь нам нужно добавить текстуру для самой брони на игроке.
Заходим в RenderPlayer.java и крутим в самый конец до строки:

Code
"cloth", "chain", "iron", "diamond", "gold"


Добавим наш титан:

Code
"cloth", "chain", "iron", "diamond", "gold", "titan"


И кинем текстуры снизу в minecraft.jar/armor.

Первая текстура. Обязательно назовите ее titan_1 - т.к префикс "titan".

(размеры не изменять!)

Вторая текстура. Название - titan_2.

(размеры не изменять!)

Игровые названия делаются не для всего набора брони, а отдельно для каждого предмета из набора (например шлем).
Ну и рецепт так же.

Теперь осталось добавить остальную броню и протестировать.
Удачи!

© FunnyAlien


[Skype][Steam][Portfolio][CodHacks.ru]
 
  • Страница 1 из 1
  • 1
Поиск:

 

Полная статистика форума

Ваш текст ну или чего хотите