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; } }
Ну и как бы бонус Вот эти пару строчек будут ставить блок к вам лицом. Если это нужно, то впишите их в конце. 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.
Жизни моба(1 жизнь - пол-сердца, у игрока 20 жизней).
Иммунитет к огню (и к лаве ). 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 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;
Вот и все. После чего у вас будет красивое подобие стекла. Удачи!
У нашей команды есть своя официальная конференция в джаббере. Там можно задать вопросы по моддингу - и получить быстрый ответ, поговорить с разработчиками учебника или просто пофлудить [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
|
|
| |