[1.6.4] Другая система здоровья

74
0
Решил перейти на 1.6.4 и переделать систему здоровья. Максимальное здоровье определяется уровнем персонажа и одетой на него броней. Сегодня весь день пытался реализовать, в EntityLivingBase нашел
Код:
public final float getMaxHealth()    {
        return (float)this.getEntityAttribute(SharedMonsterAttributes.maxHealth).getAttributeValue();
    }
Пробовал делать так, чтобы возвращал значение здоровья, которое рассчитывается в моем классе
Код:
package assets.samael.castlecraft;

import java.util.EnumSet;

import net.minecraft.client.Minecraft;
import cpw.mods.fml.common.ITickHandler;
import cpw.mods.fml.common.TickType;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import assets.samael.castlecraft.CastleCraftInf;
import cpw.mods.fml.server.FMLServerHandler;

public class TickEvent implements ITickHandler{
  //  private int slt = -1;
 private int tickcount = 0;
 private int maxHP;
 private int REGEN;
 public static int maxHPstatic;
 public static int HPstatic=0;
 public static int REGENstatic;

    @Override
    public void tickStart(EnumSet<TickType> type, Object... tickData) {    

    if(Minecraft.getMinecraft().theWorld != null)
    {
     maxHP=0;
     for(int i=1;i<5;i++)
        if(Minecraft.getMinecraft().thePlayer.getCurrentItemOrArmor(i)!=null) 
        {
          maxHP+=CastleCraftInf.getArmorHP(Minecraft.getMinecraft().thePlayer.getCurrentItemOrArmor(i).itemID);
        } 
    
         maxHP+=CastleCraftInf.getLevelMaxHealth(Minecraft.getMinecraft().thePlayer.experienceLevel);
         
        REGEN=Minecraft.getMinecraft().thePlayer.experienceLevel/3+2;
        REGENstatic=REGEN;
        
        maxHPstatic=maxHP;
        if(maxHPstatic==0) maxHPstatic=1;
        
        tickcount++;
        if(tickcount==39)
        {
         //Minecraft.getMinecraft().thePlayer.setHealth(Minecraft.getMinecraft().thePlayer.getHealth()+REGEN);
         tickcount=0;
        }
        else
        {
         tickcount++;
        }

    }           
    }

    @Override
    public void tickEnd(EnumSet<TickType> type, Object... tickData) {
        // TODO Auto-generated method stub      
    }

    @Override
    public EnumSet<TickType> ticks() {
        return EnumSet.of(TickType.CLIENT);
    }

    @Override
    public String getLabel() {
        return "MyTickHandler";   
    }
}
И все бы вроде работало, но максимальное здоровье всех игроков становится одинаковым. Тогда пробовал прямо в getMaxHealth просчитывать здоровье по броне и уровню, но сразу краш, делал проверку this instanceof EntityPlayer, но как понял, краш из-за попытки проверить есть ли броня.
Систему отдельного здоровья тоже пытался сделать, но, опять же, руки не дошли.

Нашел на форуме player.getEntityAttribute(SharedMonsterAttributes.maxHealth).setAttribute(100.0D);
Меняет только максимальное отображаемое число, здоровье не регенерируется выше 20.
 
Ну естественно, ты это все на клиенте меняешь.
Переходи на 1.7.10 лучше сразу.
Добавлять здоровье очень просто:
Код:
IAttributeInstance healthAttribute = player.getEntityAttribute(SharedMonsterAttributes.maxHealth);
        AttributeModifier health = new AttributeModifier(UUID.fromString("B1766C51-9526-4402-BC6F-2EE2A666D831"), "Your Heath Boost", 20.0D, 0);
        healthAttribute.removeModifier(health);
        healthAttribute.applyModifier(health);
        if(player.shouldHeal()){
            player.setHealth(player.getMaxHealth());
        }
Только имей ввиду, что после смерти оно обнулится.
 
Уже "переходил", мир превращается в нечто из адского камня и лазурита, CustomNPC все квесты переписывать и диалоги, а их там около 500. На 1.6.4 более-менее нормально. И если не ошибаюсь, там нельзя править исходники, а без них я вообще мало что смогу сделать)

От безысходности поставил свой плагин на 1.6.4 и все заработало, клиент сам получает здоровье и максимальное здоровье, я был приятно удивлен.
 
Назад
Сверху