Туториал Forge [1.7.x/1.8] Создание пользовательской брони, которая добавляет эффекты зелья и многое другое

Nicolayka

Владелец
Команда форума
Регистрация
4 Апр 2025
Сообщения
24
Реакции
0
Баллы
1
Город
Санкт-Петербург
Веб-сайт
paxgame.ru
Discord
nicolayka
В этом туториале мы разберём возможность создания кастомной брони, которая может быть будет имунна к определённому виду урона, или которая будет иметь эффекты зелий.

Это руководство предполагает, что вы знаете основы Java, моддинга Minecraft. Для начала создайте новый класс, который расширяет ItemArmor и реализует ISpecialArmor.
Я не собираюсь держать вас за руку и писать это за вас строка за строкой. Я собираюсь показать вам код из мода, и объясню его в закомментированных строках.

Если вы просто хотите броню, которая добавляет эффект зелья, пропустите эту часть и прочитайте следующий раздел!

Очень важной частью этого будет некоторое «Armorperperties», это позволяет нам изменить урон, нанесенный игроку, который носит эту броню. Его конструктор имеет три части: Priority, AbsorbRatio, и AbsorbMax, в этом порядке. Priority определяет, какой кусок брони сначала повреждается, я обычно устанавливаю его на 1, поэтому все части будут повреждены одновременно. Я не совсем уверен, что делает Abristbratio (извините), а Abripmax - это максимальное количество урона, которое может поглотить один кусок брони.

Для этого примера мы собираемся использовать набор брони, который устойчив к огню, он называется Itempyrusarmor:
Java:
package me.tyler15555.metalworking.item;
import me.tyler15555.metalworking.util.Resources;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraftforge.common.ISpecialArmor;
public class ItemPyrusArmor extends ItemArmor implements ISpecialArmor {
public ItemPyrusArmor(ArmorMaterial p_i45325_1_, int p_i45325_2_, int p_i45325_3_) {
 super(p_i45325_1_, p_i45325_2_, p_i45325_3_);
}
// Это самый важный метод в этом классе! Это вызывается каждый раз, когда игрок, носящий ваши доспехи, получает урон, однако его вызывают до нанесения урона, чтобы вы могли изменить его.
@Override
public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) {
 if(source == source.inFire || source == source.lava || source == source.onFire) { // Проверьте на повреждение от огня, вы также можете использовать другие виды повреждений.
 return new ArmorProperties(1, 1, MathHelper.floor_double(damage * .25D));
 }
 return new ArmorProperties(0, 0, 0);
}
@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
 return 4; // Сколько половинок щита заполняет каждая часть брони на панели брони
}
@Override
public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
 stack.damageItem(damage * 2, entity); // Позволяет контролировать количество урона, наносимого каждой части брони, полезно для ослабления некоторых комплектов брони.

}

@Override // Это довольно понятно само по себе
public String getArmorTexture(ItemStack armor, Entity entity, int slot, String type) {
 if(armor.getItem() == MWItems.pyrusLegs) {
 return "metalworking:textures/armor/pyrus_2.png";
 } else {
 return "metalworking:textures/armor/pyrus_1.png";
 }
}

@Override
public CreativeTabs[] getCreativeTabs() {
 return new CreativeTabs[] {CreativeTabs.tabCombat, Resources.tabMW}; // Это позволяет мне разместить свою броню в столько вкладок, сколько я захочу, круто, не правда ли?
}

@Override
public boolean getIsRepairable(ItemStack armor, ItemStack stack) {
 return stack.getItem() == MWItems.ingotPyrus; // Разрешает определённым предметам чинить эту броню.
}
}

Эффекты зелья и броня
Броня выше довольно сложна в создании и требует внедрения новых классов, однако добавление эффектов зелий очень простое, и нужно переопределить всего один метод!

В этом примере мы будем использовать класс, который я создал, под названием ItemThoriteArmor, который замедляет игрока, пока он надет на него
Java:
@Override
public void onArmorTick(World world, EntityPlayer player, ItemStack armor) {
 player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 500, 4));
}
Это действительно так просто! Однако НЕ стоит делать ничего с игроком, что будет отключено после снятия брони. Например, не следует устанавливать player.capabilities.canFly в значение true, а затем пытаться установить его в false, когда игрок не носит броню, потому что метод больше не будет вызываться, когда броня снята.
Эффекты зелий — это нормально, потому что игра удаляет их, как только истекает время.

Как добавить эффект зелья к мечу?
Необходимо добавить этот код в класс ItemSword

Java:
@Override
public boolean hitEntity(ItemStack stack, EntityLivingBase hitEntity, EntityLivingBase attackingEntity) {
    hitEntity.addPotionEffect(YourPotionEffectHere);
}

Как добавить эффект зелья только после того, как вся броня будет надета?
Java:
if(player.getActivePotionEffects().contains(Your potion effect) && this instanceof YourHelmet) {
    ItemStack[] armor = new ItemStack[] {}; //Create a new itemstack with each piece of your armor
int gearCounter = 0;
for(int i = 1; i < 5; i++) {
     if(player.getEquipmentInSlot(i) == armor[i - 1] {
        gearCounter++;
     }
}
if(gearCounter == 4) {
    player.addPotionEffect();
    gearCounter = 0;
}
 
Последнее редактирование:
Главная Регистрация
Назад
Сверху