1.5.2 Добавление брони (items)

Проблема вот такая возникла, при регистрации подчеркивает .register пробовал 
MinecraftForge.EVENT_BUS.register(new Elements());
Подключал 
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.EventBus;
Не помогает.

Исправил.
 
В общем, придумал я, как реализовать это. 
При активации эвента, определять статы доп. дамага аткующего и статы доп. защиты атакованного и если урон превышает защиту, наносить дополнительные повреждения.
Код:
@ForgeSubscribe
public void WeightingS(LivingHurtEvent event) {
if(event.source.getSourceOfDamage()!=null && event.source.getSourceOfDamage() instanceof EntityPlayer)
    {
        int arm=// Получение брони
        int dmg=// Получение урона
        String a = event.source.getDamageType();
        if(a=="player")
           if(arm<dmg)
              {
              event.entityLiving.heal(arm-dmg);    
              }
    }
}
            
Я понял, как узнать предмет в слоте брони, думаю методом перебора всей брони определить характеристику брони, затем по нику узнать, чем персонажа атакуют и усиливает ли одетая на атакующего броня его урон?

Теперь вот, что мне нужно узнать, как определить по нику чем наносится урон и что одето на том игроке?
Вот с помощью этого я буду получать информацию о атакующем, преобразованием строки выделю ник.
event.source.getSourceOfDamage()
 
Проверить что у атакующего в руке?
attacker.getCurrentEquippedItem();
Как-то так...
 
А как на 1.5.2 реализовывается attacker.getCurrentArmor() или attacker.getCurrentEquippedItem();?
 
Тебе же не броню надо проверить, правильно?
Код:
attacker.getCurrentEquippedItem();
 
А что нужно импортировать? Ошибку выдает (attacker подчеркивает) и не предлагает вариантов
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget;
Поиском нашелattacker, заимпортил, не помогло.
 
attacker это переменная, то-есть твой игрок, который атакует :D
 
svk написал(а):
attacker это переменная, то-есть твой игрок, который атакует :D
Даже если и так, все равно не работает, пишу
EntityAIAttackOnCollide.attacker.getCurrentEquippedItem()
Он не видит переменную и предлагает добавить public к attacker, (The field EntityAIAttackOnCollide.attacker is not visible) если добавляю, то уже выдает (Cannot make a static reference to the non-static field EntityAIAttackOnCollide.attacker), и вот что с этим делать...
Выложу весь код
Код:
package mods.samael.castlecraft;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.event.entity.player.AttackEntityEvent;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget;
import net.minecraft.entity.EntityLiving;

public class Elements {
    long time1;
        @ForgeSubscribe
        public void WeightingS(LivingHurtEvent event) {
            if(time1<System.currentTimeMillis()/1000)
            {
            time1=System.currentTimeMillis()/1000;
                    int arm=2;
                    int dmg=4;
                    String a = event.source.getDamageType();
                    if(a=="player")
                    if(arm<dmg)
                    {
                        event.entityLiving.heal(0);    
                        Minecraft.getMinecraft().thePlayer.sendChatMessage(EntityAIAttackOnCollide.attacker.getCurrentEquippedItem());
                        Minecraft.getMinecraft().thePlayer.sendChatMessage(Long.toString(System.currentTimeMillis()));

            }
            }
            }
            public void WeightingS1(AttackEntityEvent event) {
                Minecraft.getMinecraft().thePlayer.sendChatMessage("1 "+event.entity.getEntityName());
                }

}
 
*** ну что ты делаешь!? Из эвента достаёшь того, кто атакует и выполняешь в нём этот чёртов метод!
 
Я эвенты использую первый раз, моддингом занимаюсь тоже, я не знаю как нужно делать по нормальному, подскажи плиз, я уже второй день голову грею...
 
event - переменная эвента , в нём может быть игрок который тебя атакует. 
Пишешь event ставишь точку, и тебе высвечивает список доступных переменных, там ищи переменную которая тебе нужна, понять должен по названию.
 
Но таким образом я могу получить только ник, я уже перебрал почти все, там нету attacker, В event.entityLiving и  event.entity тоже нету.
Может быть дело в версии? У меня ведь 1.5.2.
Я тут подумал, клиент ведь отрисовывает броню на каждом персонаже, а значит может быть можно при активации эвента сделать запрос по нику и получить то, что по сути отрисовано в данный момент? Или так не получится?
 
Боже, убейся об стену. Иди учить java. Это-же основы основ.

Стоп, это эвент не когда тебя атакуют, а когда ты атакуешь? Если да - event.entity.getCurrentEquippedItem(); проверь, это тот, кто атакует или тот кого атакуют. Я уже сам запутался...
 
Это эвент, когда кто-то получает дамаг, может гореть крипер, может игрок атаковать другого игрока, но я выбрал в качестве источника урона игрока.
Код:
String a = event.source.getDamageType();
                    if(a=="player")
 
Код:
a=="player"
Homer_simpsonwoohooo.gif
 
Я экспериментировал с типами урона, потом сокращу)

В общем, нету там такого, есть
4a449294a7fb.png

И есть
47dc0b880d9d.png

Может быть я не прав, но тут нету получения брони, можно надеть на атакующего предмет, но не получить.
event.entity.getCurrentEquippedItem() так же отсутствует.
85dea683cdb8.png

Возможно дело в том, что я не могу написать EntityPlayer attacker = event.source.getSourceOfDamage();
по причине того, что атакующий может быть не игроком,а у мобов слота просто нету.
 
Да, теперь все работает как нужно, теперь в броне осталось реализовать повышение максимального значения здоровья в момент одевания брони и снижение в момент снятия.
Посоветуйте, как лучше это реализовать, я для этого создал в EntityPlayer метод

Код:
public void setMaxHealth(int setMaxHP)
    {
        maxHealth=getMaxHealth()+setMaxHP;
    }


Теперь его нужно вызвать один раз в момент одевания брони и в момент снятия (для уменьшения здоровья)
Есть ли для этого какой-нибудь эвент, или придется в каждый момент времени проверять, одета ли броня?
И еще хочу спросить, не будет ли конфликта при установке на сервер мода с измененным EntityPlayer, просто когда я менял систему получения опыта, в клиент закинул измененный class, а для сервера пришлось отдельно делать (У меня 1.5.2 MCPC+).
 
Подскажите пожалуйста, куда можно вставить код, чтобы он выполнялся каждый такт, TickEvent отсутствует, вот результаты поиска.
c359f6d2b758.png
 
public void TickEvent(TickEvent.WorldTickEvent e) 
import cpw.mods.fml.common.gameevent.TickEvent;
 
Назад
Сверху