Создание оружия

Перевод Создание оружия

Версия(и) Minecraft
1.7.10
Источник
https://emxtutorials.wordpress.com/creating-a-gun/
Создание оружия

Создание оружия не очень трудно дело, и не требует обширных знаний в области моддинга. Я буду создавать импульсное электромагнитное оружие, которое разрушает оборудование из красного камня и превращает блоки красного камня в каменные блоки в радиусе 4 блоков. Тем не менее, она не будет долговечной.

Сначала мы создаем предмет оружия. Это также как и создание обычного предмета, за исключением того, что вам нужно добавить несколько дополнительных материалов. Я использовал текстуру:
d1zdOLD.png

Java:
public class EMPGun extends Item
{
    public EMPGun()
    {
        setCreativeTab(CreativeTabs.tabCombat);
        setMaxStackSize(1);
        setMaxDamage(0);
    }

    @Override
    public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player)
    {
        if (player.capabilities.isCreativeMode || player.inventory.consumeInventoryItem(ModItems.emp))
        {
            player.swingItem();
            world.playSoundAtEntity(player, YourMod.MODID + ":emp_gun", 0.5F, 1.0F);
            if (!world.isRemote)
            {
                world.spawnEntityInWorld(new EntityEMP(world, player));
            }
        }
        return itemStack;
    }
}

То, что я добавил это метод onItemRightClick, название которого говорит само за себя. Это происходит следующим образом: если игрок находится в творческом режиме или у игрока есть снаряд (в данном случае импульсное электромагнитное оружие), воспроизводиться наш собственный звук и создаётся объект в виде снаряда.

Этот код выдаст вам ошибки, но это связано с тем, что мы не создали предмет импульсное электромагнитной оружие и снаряды для нашего импульсного электромагнитного оружия. Метод playSoundAtEntity принимает строковый параметр, соответствующий местоположению звука. Он принимает звуковые файлы формата .ogg. Если вы всё сделали, то вставьте ваш звуковой файл: " emp_gun.ogg” в папку, по данной директории “assets/yourmodid/sounds/”. Для того, чтобы ваш звуковой файл работал, вам нужно создать sounds.json в папке которая располагается по данной директории “assets/yourmodid/” .
В файл sounds.json добавьте следующие:
JSON:
{
"emp_gun": {"category": "master","sounds": [{"name": "emp_gun","stream": false}]}
}
//P.s. От переводчика: Если вас интересует пример создания и использования звуковых файлов для моддинга, то я смела приглашаю вас в мой туториал: Пример создания и добавления звука в игру Minecraft

Вы можете скачать мой звуковой файл здесь и + здесь (//P.s. Переводчик: я на всякий случай сделал клон звукового файла).


Хорошо, теперь давайте создадим предмет в качестве снаряда. Вы не должны это делать, если у вас есть другая система для хранения снарядов, но сейчас, давайте сделаем это аналогично тому, как работает лук. Снаряд ничего не должен делать, поэтому я не буду освещать эту часть. Если вы снова захотите использовать мои текстуры, вот оно:
r3UPtql.png


Не забудьте зарегистрировать эти два элемента в своем классе ModItems!

Верно. Наконец-то мы закончили возиться с этими деталями. Теперь давайте сделаем снаряд, который на самом деле является сущностью. К счастью, существует класс, подходящий для наших нужд, который мы можем расширить, и это EntityThrowable. Так давайте расширим наш класс от этого, и добавим функций самостоятельно.
Java:
public class EntityEMP extends EntityThrowable
{
    public static final float explosionPower = 0.75F
    public static final int empRadius = 4;

    public EntityEMP(World world)
    {
        super(world);
    }

    public EntityEMP(World world, EntityLivingBase entity)
    {
        super(world, entity);
    }

    private void explode()
    {
        int bx = (int)posX;
        int by = (int)posY;
        int bz = (int)posZ;
        worldObj.createExplosion(this, posX, posY, posZ, 0.75F, true);

        for (int x = bx - empRadius; x <= empRadius; x++)
        {
            for (int y = by - empRadius; y <= by + empRadius; y++)
            {
                for (int z = bz - empRadius; z <= bz + empRadius; z++)
                {
                    Block block = worldObj.getBlock(x, y, z);
                    if (block == Blocks.redstone_wire || block instanceof BlockRedstoneDiode)
                    {
                        block.dropBlockAsItem(worldObj, x, y, z, worldObj.getBlockMetadata(x, y, z), 0);
                        worldObj.setBlockToAir(x, y, z);
                    }
                    if (block == Blocks.redstone_block)
                    {
                        worldObj.setBlock(x, y, z, Blocks.stone);
                    }
                }
            }
        }
        setDead();
    }
    @Override
    public void onUpdate()
    {
        super.onUpdate();
        if (ticksExisted > 20)
        {
            explode();
        }

        for (int i = 0; i < 10; i++)
        {
            double x = (double)(rand.nextInt(10) - 5) / 8.0D;
            double y = (double)(rand.nextInt(10) - 5) / 8.0D;
            double z = (double)(rand.nextInt(10) - 5) / 8.0D;
            worldObj.spawnParticle("fireworksSpark", posX, posY, posZ, x, y, z);
        }
    }

    @Override
    protected float getGravityVelocity()
    {
        return 0.005F;
    }

    @Override
    public void onImpact(MovingObjectPosition movingObjectPosition)
    {
        explode();
    }
}

Хорошо. Время пояснения! Мы установили две конечные переменных, explosionPower и empRadius, а explosionPower отвечает за мощность взрыва при ударе. Переменная empRadius отвечает за площадь, на которой уничтожиться Редстоун материал. После трех необходимых конструкторов, которые ничего особенного не делают, мы добавили несколько методов.

Во-первых, нестандартный способ взорвать наш снаряд. Что он делает, сначала он создает взрыв (Что вы молчите? :p), а затем он проверяет радиус 4-рёх блоков на материал красного камня и убирает его с предметами и заменяет блоки красного камня. Затем он уничтожает снаряд, потому что обычный материал умирает при взрыве, верно? Верно.

Теперь применим метод onUpdate(). Этот метод вызывается каждый игровой такт, что бы обновить объект. Не забудьте добавить super.onUpdate(); потому что у него есть некоторые вещи, которые ему нужно сделать, и, переопределяя это, мы не будем запускать оригинальный код и будем ломать игру, если, конечно, мы не назовем его super(). Следующая строка автоматически взрывает снаряд, если он проходит более 20 игровых тактов, т.е. за одну секунду. Вы можете изменить или удалить это по своему вкусу, но вы не хотели бы, чтобы сущности, летающие вечно нагружали ваш мир, из за того что они подгружают чанки. Кроме того, мы добавляем эффекты частиц к снаряду.

И затем метод, getGravityVelocity() это изменит нормальное значение траекторий полёта нашего снаряда от 0.03F до 0.005F, поэтому наш снаряд не падает так быстро.

Последним методом является onImpact(), который вызывается, когда... ну вы догадались... Когда он врезается во что-то. В нашем случае мы хотим, чтобы он взорвался когда врезается в блоки.

Теперь зарегистрируйте сущность с этой строкой в своем основном классе:
Java:
EntityRegistry.registerModEntity(EntityEMP.class, "EMP", 0, this, 64, 10, true);

Просто для удовольствия, я добавлю пользовательскую модель для своего снаряда. Модель сделана в Techne(//P.s. Приветик @Drovosek) и слегка отредактирована, вот что вышло:
Java:
public class ModelEMP extends ModelBase
{
    ModelRenderer Shape1;
    ModelRenderer Shape2;
    ModelRenderer Shape3;
    ModelRenderer Shape4;

    public ModelEMP()
    {
        textureWidth = 64;
        textureHeight = 32;

        Shape1 = new ModelRenderer(this, 0, 0);
        Shape1.addBox(0F, 0F, 0F, 4, 4, 4);
        Shape1.setRotationPoint(-2F, 19F, -2F);
        Shape1.setTextureSize(64, 32);
        Shape1.mirror = true;
        setRotation(Shape1, 0F, 0F, 0F);
        Shape2 = new ModelRenderer(this, 0, 0);
        Shape2.addBox(0F, 0F, 0F, 2, 6, 2);
        Shape2.setRotationPoint(-1F, 18F, -1F);
        Shape2.setTextureSize(64, 32);
        Shape2.mirror = true;
        setRotation(Shape2, 0F, 0F, 0F);
        Shape3 = new ModelRenderer(this, 0, 0);
        Shape3.addBox(0F, 0F, 0F, 6, 2, 2);
        Shape3.setRotationPoint(-3F, 20F, -1F);
        Shape3.setTextureSize(64, 32);
        Shape3.mirror = true;
        setRotation(Shape3, 0F, 0F, 0F);
        Shape4 = new ModelRenderer(this, 0, 0);
        Shape4.addBox(0F, 0F, 0F, 2, 2, 6);
        Shape4.setRotationPoint(-1F, 20F, -3F);
        Shape4.setTextureSize(64, 32);
        Shape4.mirror = true;
        setRotation(Shape4, 0F, 0F, 0F);
    }

    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
    {
        super.render(entity, f, f1, f2, f3, f4, f5);
        setRotationAngles(f, f1, f2, f3, f4, f5, entity);
        Shape1.render(f5);
        Shape2.render(f5);
        Shape3.render(f5);
        Shape4.render(f5);
    }

    private void setRotation(ModelRenderer model, float x, float y, float z)
    {
        model.rotateAngleX = x;
        model.rotateAngleY = y;
        model.rotateAngleZ = z;
    }

    public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity)
    {
        super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
    }
}

В идеале это должно быть сделано в отдельном пакете, мой - «модельный» пакет. Теперь мы должны создать класс рендеринга, и зарегистрировать текстуру на модель со следующим классом. С помощью этого кода текстуру следует поместить в папку по данной деректории "assets/yourmodid/textures/entity/”. Это моя текстура:
scme6ay.png

Java:
public class RenderEMP extends Render
{
    private static final ResourceLocation texture = new ResourceLocation(UtilityGuns.MODID, "textures/entity/emp.png");
    private ModelBase model;

    public RenderEMP()
    {
        model = new ModelEMP();
    }

    @Override
    public ResourceLocation getEntityTexture(Entity entity)
    {
        return texture;
    }

    @Override
    public void doRender(Entity entity, double x, double y, double z, float yaw, float partialTick)
    {
        GL11.glPushMatrix();
        bindTexture(texture);
        GL11.glTranslated(x, y - 1.25D, z);
        model.render(entity, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F);
        GL11.glPopMatrix();
    }
}

Теперь в ClientProxy добавьте эту строку, чтобы зарегистрировать класс, который вы только что создали:
Java:
RenderingRegistry.registerEntityRenderingHandler(EntityEMP.class, new RenderEMP());
И все готово! Поздравляю, ты сделал своё собственное оружие!

~~~
Пару слов от переводчика: Огромное спасибо за то что дочитали до этого момента! Я надеюсь что данный перевод вам помог/помогает/поможет!
Большая просьба если вы наткнулись на ошибки или какие-то неточности в переводе сообщите мне о них!
И ещё один вопрос: Как вы заметили это не первый мой перевод, и у меня возник к вам вопрос -Чувствуете ли вы улучшения в моём переводе?:whistle:) (ИМХО: Лично я просто стал при переводе этого туториала ощущать кое какие улучшения в моём переводе.)
  • Like
Реакции: Шиширон
Автор
Garik
Просмотры
2,943
Первый выпуск
Обновление
Оценка
5.00 звёзд 3 оценок

Другие ресурсы пользователя Garik

Последние рецензии

Ну хоть что-то годное начал переводить.
Мерси, полезно.
Garik
Garik
Oу! ТЫ меня удивил! ;)
Огромное спасибо за рецензию!
(P.s. Я сейчас кое что годное делаю (своё!))
Очень помогло, спасибо!
Garik
Garik
Не за что! ;) Всегда обращайтесь!
Спасибо за рецензию!
Очешуеть, скачаю кузницу на 1.7.10 срочно
Garik
Garik
Правильно! Не православное это дело на буржуазийских 1.8 и выше моды писать! 1.7.10 Ван лав!
Спасибо за рецензий!
Сверху