Пятница, 08 Ноября 2024, 09:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[ModLoader] Основы программирования для Minecraft [Часть 4]
EyeДата: Среда, 24 Августа 2011, 06:54 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Глава 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.7_03";
      }
         
      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;


Публичная текстуры с лица:
Code
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;
           }
       }


Ну и как бы бонус smile Вот эти пару строчек будут ставить блок к вам лицом. Если это нужно, то впишите их в конце.
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;


Иммунитет к огню (и к лаве smile ).
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 раз быстрее smile )
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;


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

У нашей команды есть своя официальная конференция в джаббере.
Там можно задать вопросы по моддингу - и получить быстрый ответ, поговорить с разработчиками учебника или просто пофлудить biggrin [spider]

Сервер - conference.jabber.ru
Комната - mc-guide

Регистрировать аккуант на jabber.ru, а качать лучшего всего клиент Psi.
Но сидеть в конфе можно и через квип.
Всем спасибки за внимание!

Учебник разрабатывается коллективом mc.salmons.ru!


ICQ: 422190728,
E-Mail: funnyalien@yandex.ru,
Jabber: funnyalien@jabber.ru,
Steam: funnyalienvalentine,
Twitter: MrFunnyAlien,
Skype: happyconsole,
ВКонтакте: vk.com/twinemen,
Мобильный: +79199212414.


Сообщение отредактировал Eye - Среда, 24 Августа 2011, 07:01
zahar998899Дата: Пятница, 11 Ноября 2011, 17:37 | Сообщение # 2
почетный гость
Сейчас нет на сайте
можешь скинуть скрин с файла BlockTex плиз я понять не могу


Minecraft Realistiks
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг