From 70c1354a4a96698758a88c032866288f79de6f5a Mon Sep 17 00:00:00 2001 From: Benjamin Culkin Date: Sat, 24 Aug 2024 08:16:37 -0400 Subject: Initial commit --- .../java/jp/plusplus/fbs/spirit/ISpiritTool.class | Bin 0 -> 375 bytes .../java/jp/plusplus/fbs/spirit/ISpiritTool.java | 37 ++ .../jp/plusplus/fbs/spirit/ItemSwordSpirit.class | Bin 0 -> 7590 bytes .../jp/plusplus/fbs/spirit/ItemSwordSpirit.java | 187 +++++++++ .../plusplus/fbs/spirit/SkillManager$Skill.class | Bin 0 -> 1182 bytes .../fbs/spirit/SkillManager$SkillData.class | Bin 0 -> 1454 bytes .../fbs/spirit/SkillManager$SkillEntry.class | Bin 0 -> 2645 bytes .../java/jp/plusplus/fbs/spirit/SkillManager.class | Bin 0 -> 3709 bytes .../java/jp/plusplus/fbs/spirit/SkillManager.java | 208 ++++++++++ .../fbs/spirit/SpiritManager$ToolEntry.class | Bin 0 -> 2682 bytes .../jp/plusplus/fbs/spirit/SpiritManager.class | Bin 0 -> 13927 bytes .../java/jp/plusplus/fbs/spirit/SpiritManager.java | 385 ++++++++++++++++++ .../spirit/SpiritStatus$Configuration$Pair.class | Bin 0 -> 1230 bytes .../fbs/spirit/SpiritStatus$Configuration.class | Bin 0 -> 3007 bytes .../java/jp/plusplus/fbs/spirit/SpiritStatus.class | Bin 0 -> 10862 bytes .../java/jp/plusplus/fbs/spirit/SpiritStatus.java | 437 +++++++++++++++++++++ .../jp/plusplus/fbs/spirit/model/ModelAlice.class | Bin 0 -> 4483 bytes .../jp/plusplus/fbs/spirit/model/ModelAlice.java | 175 +++++++++ .../plusplus/fbs/spirit/render/RenderAlice.class | Bin 0 -> 5547 bytes .../jp/plusplus/fbs/spirit/render/RenderAlice.java | 179 +++++++++ 20 files changed, 1608 insertions(+) create mode 100644 src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.java create mode 100644 src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.java create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SkillManager$Skill.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SkillManager.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SkillManager.java create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritManager$ToolEntry.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritManager.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritManager.java create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration$Pair.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java create mode 100644 src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.java create mode 100644 src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.class create mode 100644 src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.java (limited to 'src/main/java/jp/plusplus/fbs/spirit') diff --git a/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class b/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class new file mode 100644 index 0000000..e475ba9 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.java b/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.java new file mode 100644 index 0000000..919283a --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.java @@ -0,0 +1,37 @@ +package jp.plusplus.fbs.spirit; + +import net.minecraft.item.ItemStack; + +/** + * Created by plusplus_F on 2015/11/02. + * 精霊武器であることを示すインターフェース + */ +public interface ISpiritTool { + /** + * 攻撃力を計算する + * @param ss + * @return + */ + public float calcDamage(SpiritStatus ss); + + /** + * 採掘レベルを計算する + * @param ss + * @return + */ + public int calcDigLv(SpiritStatus ss); + + /** + * 耐久度を計算する + * @param ss + * @return + */ + public int calcDurable(SpiritStatus ss); + + /** + * 使用した素材アイテムによって、初期値を決定する + * @param ss + * @param material + */ + public void calcInitialValue(SpiritStatus ss, ItemStack material); +} diff --git a/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.class b/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.class new file mode 100644 index 0000000..dafddb2 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.java b/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.java new file mode 100644 index 0000000..80c79b7 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.java @@ -0,0 +1,187 @@ +package jp.plusplus.fbs.spirit; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import jp.plusplus.fbs.AchievementRegistry; +import jp.plusplus.fbs.exprop.SanityManager; +import jp.plusplus.fbs.item.ItemBase; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import java.util.List; + +/** + * Created by plusplus_F on 2015/11/02. + */ +public class ItemSwordSpirit extends ItemBase implements ISpiritTool { + public ItemSwordSpirit() { + setCreativeTab(null); + setUnlocalizedName("spiritSword"); + setTextureName("spiritSword"); + setMaxStackSize(1); + setNoRepair(); + } + + @Override + public boolean hitEntity(ItemStack itemStack, EntityLivingBase target, EntityLivingBase player) { + if(player instanceof EntityPlayer){ + SpiritStatus ss=SpiritStatus.readFromNBT(itemStack.getTagCompound()); + + int dur=calcDurable(ss); + ss.addItemDamage(1); + if(ss.getItemDamage()>dur){ + ss.setItemDamage(dur); + } + if(ss.getItemDamage()==dur){ + ((EntityPlayer) player).triggerAchievement(AchievementRegistry.evil); + } + if(ss.getItemDamage()0; + //return true; + } + @Override + public boolean isItemTool(ItemStack p_77616_1_) { + return true; + } + @Override + public boolean showDurabilityBar(ItemStack stack) { + return isDamaged(stack); + } + + //-------------------------------------------------------------------------------- + @Override + public float calcDamage(SpiritStatus ss) { + if(ss.getItemDamage()>=calcDurable(ss)) return 0.5f; + return 3.5f+ss.getMaxDamage()*ss.calcRatio(ss.getStrength()); + } + + @Override + public int calcDigLv(SpiritStatus ss) { + return 0; + } + + @Override + public int calcDurable(SpiritStatus ss) { + return 1000+(int)(ss.getMaxDurability()*ss.calcRatio(ss.getToughness())); + } + + @Override + public void calcInitialValue(SpiritStatus ss, ItemStack material){ + ItemSword sword=(ItemSword)material.getItem(); + ToolMaterial tm=ToolMaterial.valueOf(sword.getToolMaterialName()); + + //最大攻撃力は武器の攻撃力の10倍 + float maxDamage=(tm.getDamageVsEntity())*10; + + //最大耐久力は武器の耐久*10+10000 + float maxDurabity=tm.getMaxUses()*10+10000; + + ss.setMaxStatus(maxDamage, 0, maxDurabity); + ss.addStrength(MathHelper.ceiling_float_int(tm.getDamageVsEntity() / (ss.getMaxDamage() / 255.f))); + ss.addToughness(MathHelper.ceiling_float_int(tm.getMaxUses()/(ss.getMaxDurability()/255.f))); + } +} diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager$Skill.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$Skill.class new file mode 100644 index 0000000..8f57aa3 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$Skill.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class new file mode 100644 index 0000000..bee1c87 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class new file mode 100644 index 0000000..a4a1f21 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager.class new file mode 100644 index 0000000..dd12e75 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SkillManager.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager.java b/src/main/java/jp/plusplus/fbs/spirit/SkillManager.java new file mode 100644 index 0000000..1f499d5 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SkillManager.java @@ -0,0 +1,208 @@ +package jp.plusplus.fbs.spirit; + +import net.minecraft.util.StatCollector; + +import java.util.ArrayList; + +/** + * Created by plusplus_F on 2015/11/02. + * 精霊武器のスキルを管理するクラス + */ +public class SkillManager { + private static SkillManager instance=new SkillManager(); + + private int uId=0; + private ArrayList skills=new ArrayList(); + private ArrayList skillEntries=new ArrayList(); + + private SkillManager(){} + + public static void register(){ + //congenital + registerSkill("fbs.precocious", 1); + registerSkill("fbs.lateBloomer", 1); + + //demerit + registerSkill("fbs.blood", 1); + registerSkill("fbs.end", 1); + registerSkill("fbs.insanity", 1); + + //passive + registerSkill("fbs.soulBind", 1); + registerSkill("fbs.contract", 1); + registerSkill("fbs.knowledge", 1); + + //battle + registerSkill("fbs.fire", 5); + registerSkill("fbs.vampire", 5); + registerSkill("fbs.poison", 5); + registerSkill("fbs.sonic", 5); + registerSkill("fbs.knockback", 5); + registerSkill("fbs.infinity", 1); + registerSkill("fbs.critical", 5); + registerSkill("fbs.hero", 5); + registerSkill("fbs.lucky", 5); + registerSkill("fbs.headhunt", 5); + registerSkill("fbs.smite", 3); + registerSkill("fbs.arthropods", 3); + + //harvest + + //------------------------------------------------------------------------------------------------- + + addSkillEntry(new SkillEntry(getSkill("fbs.soulBind"), new int[]{10})); + addSkillEntry(new SkillEntry(getSkill("fbs.contract"), new int[]{15})); + addSkillEntry(new SkillEntry(getSkill("fbs.knowledge"), new int[]{8})); + + addSkillEntry(new SkillEntry(getSkill("fbs.fire"), new int[]{5,8,11,14,17})); + addSkillEntry(new SkillEntry(getSkill("fbs.blood"), new int[]{10,14,18,22,26})); + addSkillEntry(new SkillEntry(getSkill("fbs.poison"), new int[]{5,8,11,14,17})); + addSkillEntry(new SkillEntry(getSkill("fbs.sonic"), new int[]{10,14,18,22,26})); + addSkillEntry(new SkillEntry(getSkill("fbs.knockback"), new int[]{5,8,11,14,17})); + addSkillEntry(new SkillEntry(getSkill("fbs.infinity"), new int[]{35})); + addSkillEntry(new SkillEntry(getSkill("fbs.critical"), new int[]{5,8,11,14,17})); + addSkillEntry(new SkillEntry(getSkill("fbs.hero"), new int[]{10,14,18,22,26})); + addSkillEntry(new SkillEntry(getSkill("fbs.lucky"), new int[]{10,14,18,22,26})); + addSkillEntry(new SkillEntry(getSkill("fbs.headhunt"), new int[]{20,25,30,35,40})); + addSkillEntry(new SkillEntry(getSkill("fbs.smite"), new int[]{3,6,9,12,15})); + addSkillEntry(new SkillEntry(getSkill("fbs.arthropods"), new int[]{3,6,9,12,15})); + } + + /** + * 精霊武器のスキルのデータを登録する。 + * @param name スキル名 + * @param max 最大レベル + * @return + */ + public static int registerSkill(String name, int max){ + instance.skills.add(new Skill(++instance.uId, name, max)); + return instance.uId; + } + + /** + * IDからスキルのデータを取得する + * @param id + * @return + */ + public static Skill getSkill(int id){ + if(id<=0 || id>instance.skills.size()) return null; + return instance.skills.get(id-1); + } + public static Skill getSkill(String name){ + for(Skill s : instance.skills){ + if(s.getName().equals(name)) return s; + } + return null; + } + + public static void addSkillEntry(SkillEntry se){ + instance.skillEntries.add(se); + } + + public static ArrayList getSkillEntiries(){ + return instance.skillEntries; + } + + /** + * スキルのデータのクラス + */ + public static class Skill{ + private int id; + private String name; + private int lvMax; + + public Skill(int id, String name, int max){ + this.id=id; + this.name=name; + lvMax=max; + } + + + + public String getLocalizedName(){ + return StatCollector.translateToLocal("spirit.skill."+name); + } + + public int getId() { + return id; + } + + public int getLvMax() { + return lvMax; + } + + public String getName(){ + return name; + } + } + + public static class SkillEntry{ + private Skill skill; + private int[] minLv; + private SkillData[] parents; + + public SkillEntry(Skill skill, int[] minLv){ + this(skill, minLv, new SkillData[0]); + } + public SkillEntry(Skill skill, int[] minLv, SkillData[] parents){ + this.skill=skill; + this.minLv=minLv; + this.parents=parents; + } + + public boolean canLearn(SpiritStatus status){ + //精霊レベル + int nowLv=status.getSkillLevel(skill.getId())+1; + if(nowLv>=skill.getLvMax()) return false; + if(status.getLv()0){ + for(int i=0;i characterMale=new ArrayList(); + private ArrayList characterFemale=new ArrayList(); + private ArrayList tools=new ArrayList(); + + private SpiritManager(){} + + public static void register(){ + registerTool(ItemCore.spiritSword, ItemSword.class); + + registerSpiritCharacter(false, "fbs.alice"); + registerSpiritCharacter(false, "fbs.tama"); + registerSpiritCharacter(false, "fbs.hiyo"); + registerSpiritCharacter(false, "fbs.kako"); + registerSpiritCharacter(true, "fbs.d"); + registerSpiritCharacter(true, "fbs.kouta"); + + SkillManager.register(); + } + + public static void openGui(EntityPlayer player){ + int x= MathHelper.floor_double(player.posX); + int y= MathHelper.floor_double(player.posY); + int z= MathHelper.floor_double(player.posZ); + + player.openGui(FBS.instance, FBS.GUI_SPIRIT_MAIN_ID, player.worldObj, x,y,z); + } + + public static int findSpiritToolIndex(EntityPlayer player){ + int size=player.inventory.getSizeInventory(); + for(int i=0;i tool){ + instance.tools.add(new ToolEntry(spiritTool, tool)); + } + public static ToolEntry getTool(Item item){ + for(ToolEntry te : instance.tools){ + if(te.matches(item)){ + return te; + } + } + return null; + } + public static boolean isTool(Item item){ + return getTool(item)!=null; + } + + /** + * 契約可能な精霊の人格を登録する + * @param isMale trueの場合、それは男性であることを示す + * @param character 精霊の内部名 + */ + public static void registerSpiritCharacter(boolean isMale, String character){ + if(isMale) instance.characterMale.add(character); + else instance.characterFemale.add(character); + } + + /** + * 契約可能な精霊の名前をランダムで取得する + * @param isMale trueの場合、それは男性であることを示す + * @return 精霊の内部名 + */ + public static String getRandomCharacter(boolean isMale){ + if(isMale){ + return instance.characterMale.get(instance.rand.nextInt(instance.characterMale.size())); + } + else{ + return instance.characterFemale.get(instance.rand.nextInt(instance.characterFemale.size())); + } + } + + /** + * 精霊武器アイテムスタックのNBTを更新する + * @param itemStack + * @param status + */ + public static void updateNBT(ItemStack itemStack, SpiritStatus status){ + NBTTagCompound nbt=new NBTTagCompound(); + SpiritStatus.writeToNBT(status, nbt); + itemStack.setTagCompound(nbt); + } + + /** + * ゲーム中に表示される精霊武器の名前を取得する + * @param itemStack + * @return + */ + public static String getSpiritDisplayName(ItemStack itemStack){ + SpiritStatus ss=SpiritStatus.readFromNBT(itemStack.getTagCompound()); + if(ss==null) return "Unnamed"; + return StatCollector.translateToLocal("item.fbs.spirit.name").replaceAll("%owner%", ss.getOwnerName()).replaceAll("%spirit%", ss.getName()); + } + + /** + * プレイヤーに対し精霊が話しかける。 + * メッセージは最大で10行(0-9) + * @param player 対象プレイヤー + * @param character 人格 + * @param event イベント + * @param params その他引数 + */ + public static void talk(EntityPlayer player, String character, String event, @Nullable ItemStack spiritToolStack, Object ... params){ + if(player.worldObj.isRemote) return; + + ItemStack itemStack=null; + SpiritStatus status=null; + + if(spiritToolStack!=null){ + itemStack=spiritToolStack; + } + else{ + itemStack=findSpiritTool(player); + } + if(itemStack==null) return; + status=SpiritStatus.readFromNBT(itemStack.getTagCompound()); + if(status==null) return; + + if(!status.isOwner(player)) return; + + //設定を確認する + if(event.equals("morning") || event.equals("noon") || event.equals("night")){ + if(!status.getConfiguration().get("enableTimeSignalMessage") && !status.getConfiguration().get("enableMessage")) return; + } + else if(!status.getConfiguration().get("enableMessage")){ + return; + } + + SpiritTalkEvent ste=new SpiritTalkEvent(player, character, event, params); + boolean isCanceled=MinecraftForge.EVENT_BUS.post(ste); + if(!isCanceled){ + + for(int i=0;i<10;i++){ + String m="spirit.talk."+character+"."+event+"."+i; + if(!StatCollector.canTranslate(m)) break; + + m=translateString(m, status); + player.addChatComponentMessage(new ChatComponentText("<"+spiritToolStack.getDisplayName()+">"+m)); + } + } + } + + /** + * いい感じにローカライズする + * @param key + * @param status + * @return + */ + public static String translateString(String key, SpiritStatus status, Object ... params){ + String m=StatCollector.translateToLocal(key); + m=m.replaceAll("%spirit%", status.getName()); + m=m.replaceAll("%owner%", status.getOwnerName()); + return m; + } + + public static void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean flag){ + ISpiritTool ist=(ISpiritTool)itemStack.getItem(); + SpiritStatus ss=SpiritStatus.readFromNBT(itemStack.getTagCompound()); + + list.add("[Status]"); + list.add("Level:"+ss.getLv()); + list.add(String.format("Damage:%.1f", ist.calcDamage(ss)+0.5)); + list.add("Harvest Level:"+ist.calcDigLv(ss)); + + int t=ist.calcDurable(ss); + list.add("Durability:"+(t-ss.getItemDamage())+"/"+t); + } + + /** + * 精霊の祝福 + * @param player + */ + public static void bless(EntityPlayer player, ItemStack tool){ + SpiritStatus status=SpiritStatus.readFromNBT(tool.getTagCompound()); + //もうめんどくさいんでハードコード + + //ライフ・満腹度・水分・スタミナのいずれか + int r=instance.rand.nextInt(FBS.cooperatesSS2?4:2); + switch (r){ + case 0: + player.heal(player.getMaxHealth()); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("spirit.bless.fbs.health"))); + break; + + case 1: + FoodStats fs=player.getFoodStats(); + fs.addStats(20, 1.f); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("spirit.bless.fbs.food"))); + break; + + case 2: + instance.blessForSS2(player, 0); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("spirit.bless.fbs.moisture"))); + break; + + case 3: + instance.blessForSS2(player, 1); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("spirit.bless.fbs.stamina"))); + break; + } + + + //さらに、マイナス効果を全て打ち消しランダムでエンチャント効果 + ItemStack dummy=new ItemStack(Items.milk_bucket); + player.curePotionEffects(dummy); + + Potion p; + switch (instance.rand.nextInt(13)){ + case 0: p=Potion.damageBoost; break; + case 1: p=Potion.digSpeed; break; + case 2: p=Potion.fireResistance; break; + case 3: p=Potion.invisibility; break; + case 4: p=Potion.moveSpeed; break; + case 5: p=Potion.jump; break; + case 6: p=Potion.nightVision; break; + case 7: p=Potion.nightVision; break; + case 8: p=Potion.regeneration; break; + case 9: p=Potion.resistance; break; + case 10: p=Potion.waterBreathing; break; + case 11: p=Registry.potionCleverness; break; + case 12: p=Registry.potionContract; break; + default: p=Potion.heal; break; + } + + player.addPotionEffect(new PotionEffect(p.getId(), 20*(60+3*status.getLv()), status.getLv()/15)); + status.updateLastBlessDate(player.worldObj.getCurrentDate().get(Calendar.DATE)); + + NBTTagCompound nbt=new NBTTagCompound(); + SpiritStatus.writeToNBT(status, nbt); + tool.setTagCompound(nbt); + + //精霊の涙 + ItemStack tear=AlchemyRegistry.getItemStack(ItemCore.alchemyMaterial, status.hasSkill("fbs.sentimental")?2:1, 40); + if(player.inventory.addItemStackToInventory(tear) && tear.stackSize>0){ + player.entityDropItem(tear, 0); + } + + talk(player, status.getCharacter(), "bless", tool); + } + + /** + * 精霊の修理 + * @param player + * @param tool + * @param potionIndex + */ + public static void repair(EntityPlayer player, ItemStack tool, int potionIndex){ + if(potionIndex==-1){ + int s=player.inventory.getSizeInventory(); + for(int i=0;i cbs=AlchemyRegistry.ReadCharacteristicFromNBT(potion.getTagCompound()); + for(CharacteristicBase cb :cbs){ + if(cb instanceof CharacteristicQuality){ + scale=cb.getMPScale(); + break; + } + } + + //回復する + SpiritStatus status=SpiritStatus.readFromNBT(tool.getTagCompound()); + status.repair((int)(500*scale)); + + //更新 + NBTTagCompound nbt1=new NBTTagCompound(); + SpiritStatus.writeToNBT(status, nbt1); + tool.setTagCompound(nbt1); + } + + public void blessForSS2(EntityPlayer player, int type){ + if(type==0){ + SextiarySectorAPI.addMoistureStats(player, 20, 20); + } + else{ + SextiarySectorAPI.addStaminaStats(player, 100, 50); + } + + if(player instanceof EntityPlayerMP) SSPacketHandler.INSTANCE.sendTo(new PacketPlayerData(EntityPlayerManager.getCustomPlayerData(player)), (EntityPlayerMP)player); + } + + /** + * 使用した武器と精霊武器のクラスを関連付ける。 + */ + public static class ToolEntry{ + private Class tool; + private Item spiritTool; + + public ToolEntry(Item spiritTool, Class tool){ + this.spiritTool=spiritTool; + this.tool=tool; + } + + public boolean matches(Item item){ + return tool.isAssignableFrom(item.getClass()); + } + + public ItemStack getSpiritToolStack(boolean isMale, String character, String name, EntityPlayer owner, ItemStack material){ + ItemStack ret=new ItemStack(spiritTool); + SpiritStatus ss=new SpiritStatus(isMale, character, name, owner); + + //先天スキルの設定 + float r=new Random().nextFloat(); + if(r<0.05f) ss.setSkill("fbs.precocious", 0); + else if(r<0.10f) ss.setSkill("fbs.lateBloomer", 0); + else if(r<0.15f) ss.setSkill("fbs.hero", 0); + else if(r<0.20f) ss.setSkill("fbs.skillful", 0); + else if(r<0.25f) ss.setSkill("fbs.sentimental", 0); + + ((ISpiritTool) spiritTool).calcInitialValue(ss, material); + updateNBT(ret, ss); + + SanityManager.setSpirit(owner, ss.getName(), ss.getLv()); + + return ret; + } + } +} diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration$Pair.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration$Pair.class new file mode 100644 index 0000000..381a538 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration$Pair.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class new file mode 100644 index 0000000..da19ab1 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class new file mode 100644 index 0000000..3f37c00 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java new file mode 100644 index 0000000..3517218 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.java @@ -0,0 +1,437 @@ +package jp.plusplus.fbs.spirit; + +import jp.plusplus.fbs.exprop.FBSEntityProperties; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.MathHelper; + +import java.util.ArrayList; +import java.util.Random; + +/** + * Created by plusplus_F on 2015/11/02. + * 精霊武器のステータスクラス + * NBTで読み書きする + */ +public class SpiritStatus { + private static Random random=new Random(); + private static float log255=2.40654f; + + public static final short LEVEL_MAX=50; + public static final short STATUS_MAX=255; + public static final short FOOD_LEVEL_MAX=128; + + //基本 + private boolean isMale; + private String character; //人格名 + private String name; //プレイヤーのつけた名前 + private String owner; //所有者の名前 + private short level=1; + private double next; + private double exp; + private int itemDamage; //減ってる耐久値 + private short skillPoint; + private int lastBlessDate=-1; + private short foodLevel=FOOD_LEVEL_MAX; + + /** + * ダメージとか採掘レベルに関係する + */ + private short strength; + private float maxDamage; + private float maxHarvestLevel; + + /** + * 最大耐久に関係 + */ + private short toughness; + private float maxDurability; + + /** + * 精霊の所持スキル + */ + private ArrayList skills=new ArrayList(); + + /** + * 精霊の設定 + */ + private Configuration configuration=new Configuration(); + + public SpiritStatus(boolean isMale, String character, String name, EntityPlayer owner){ + this(); + this.isMale=isMale; + this.character=character; + this.name=name; + this.owner=owner.getDisplayName(); + } + public SpiritStatus(){ + level=0; + levelUp(); + } + + public static SpiritStatus readFromNBT(NBTTagCompound nbt){ + if(nbt==null) return null; + SpiritStatus ss=new SpiritStatus(); + + ss.isMale=nbt.getBoolean("isMale"); + ss.character=nbt.getString("character"); + ss.name=nbt.getString("name"); + ss.owner=nbt.getString("owner"); + ss.level=nbt.getShort("level"); + ss.next=nbt.getDouble("next"); + ss.exp=nbt.getDouble("exp"); + ss.itemDamage=nbt.getInteger("itemDamage"); + ss.skillPoint=nbt.getShort("skillPt"); + ss.lastBlessDate=nbt.getInteger("lastBlessDate"); + ss.foodLevel=nbt.getShort("FoodLevel"); + + ss.strength=nbt.getShort("strength"); + ss.toughness=nbt.getShort("toughness"); + ss.maxDamage=nbt.getFloat("maxDamage"); + ss.maxHarvestLevel=nbt.getFloat("maxHarvestLevel"); + ss.maxDurability=nbt.getFloat("maxDurability"); + + NBTTagList list=(NBTTagList)nbt.getTag("skills"); + for(int i=0;i=next && level0 && level%10==0 && random.nextFloat()<0.125f){ + setSkill("fbs.blood", 0); + } + } + + public void addStrength(int p){ + if(p<0) return; + strength+=p; + if(strength>STATUS_MAX) strength=STATUS_MAX; + } + public void addToughness(int p){ + if(p<0) return; + toughness+=p; + if(toughness>STATUS_MAX) toughness=STATUS_MAX; + } + public void addItemDamage(int p) { + if (p < 0) return; + itemDamage += p; + } + public void setItemDamage(int p){ + if (p < 0) return; + itemDamage=p; + } + + public void reduceSkillPoint(){ + if(skillPoint>0) skillPoint--; + } + + public void updateLastBlessDate(int d){ lastBlessDate=d; } + public void repair(int r){ + if(r<0) return; + itemDamage-=r; + if(itemDamage<0) itemDamage=0; + } + + /** + * 各種最大値を設定する。 + * 先天スキルの影響を受ける + * @param maxDamage + * @param maxHarvestLevel + * @param maxDurability + */ + public void setMaxStatus(float maxDamage, float maxHarvestLevel, float maxDurability){ + float rate=1.f; + float rateDamage=1.f; + float rateHL=1.f; + float rateDurability=1.f; + for(SkillManager.SkillData se : getSkills()){ + if(se.getSkill().getName().equals("fbs.precocious")){ + rate=0.75f; + break; + } + else if(se.getSkill().getName().equals("fbs.lateBloomer")){ + rate=1.25f; + break; + } + else if(se.getSkill().getName().equals("fbs.skillful")){ + rate=0.80f; + break; + } + else if(se.getSkill().getName().equals("fbs.hero")){ + rateDamage=1.5f; + rateHL=1.25f; + rateDurability=0.75f; + break; + } + else if(se.getSkill().getName().equals("fbs.patient")){ + rateDamage=0.75f; + rateDurability=1.5f; + break; + } + else if(se.getSkill().getName().equals("fbs.sentimental")){ + rate=0.8f; + break; + } + } + + this.maxDamage=maxDamage*rate*rateDamage; + this.maxHarvestLevel=maxHarvestLevel*rate*rateHL; + this.maxDurability=maxDurability*rate*rateDurability; + } + + /** + * ステータス最大値(255)との割合を計算する。 + * このとき、各種先天スキルの影響を受ける。 + * @param param + * @return + */ + public float calcRatio(int param){ + int type=0; + for(SkillManager.SkillData se : getSkills()){ + if(se.getSkill().getName().equals("fbs.precocious")){ + type=1; + break; + } + else if(se.getSkill().getName().equals("fbs.lateBloomer")){ + type=2; + break; + } + } + + float rate=0; + switch (type){ + case 1: + rate=(param==0?0:(float)Math.log(param)/log255); + break; + + case 2: + rate=(float)(param*param)/(float)(STATUS_MAX*STATUS_MAX); + break; + + default: + rate=(float)param/STATUS_MAX; + } + + return rate; + } + + public short getLv(){ return level; } + public short getStrength(){ return strength; } + public float getMaxDamage(){ return maxDamage; } + public float getMaxHarvestLevel(){ return maxHarvestLevel; } + public short getToughness(){ return toughness; } + public float getMaxDurability(){ return maxDurability; } + public String getName(){ return name; } + public String getOwnerName(){ return owner; } + public String getCharacter(){ return character; } + public int getItemDamage(){ return itemDamage; } + public int getLastBlessDate(){ return lastBlessDate; } + public short getSkillPoint(){ return skillPoint; } + public short getFoodLevel(){ return foodLevel; } + + public void setFoodLevel(int food){ + this.foodLevel=(short)food; + } + + /** + * スキルをセットする + * @param name + * @param lv + */ + public void setSkill(String name, int lv){ + SkillManager.Skill skill=SkillManager.getSkill(name); + if(skill==null) return; + if(lv>=skill.getLvMax()) lv=skill.getLvMax()-1; + + //すでにそのスキルを所持している場合上書き + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(skill)){ + se.lv=lv; + return; + } + } + + //そうでないなら新しく + skills.add(new SkillManager.SkillData(skill.getId(), lv)); + } + + /** + * そのスキルを所持しているか判定する + * @param name + * @return + */ + public boolean hasSkill(String name){ + SkillManager.Skill skill=SkillManager.getSkill(name); + if(skill==null) return false; + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(skill)){ + return true; + } + } + return false; + } + + /** + * そのスキルのレベルを得る + * @param name + * @return スキルを所持していない場合-1 + */ + public int getSkillLevel(String name){ + SkillManager.Skill skill=SkillManager.getSkill(name); + if(skill==null) return -1; + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(skill)){ + return se.lv; + } + } + return -1; + } + public int getSkillLevel(int id){ + for(SkillManager.SkillData se : skills){ + if(se.isSkillEqual(id)){ + return se.lv; + } + } + return -1; + } + + public ArrayList getSkills(){ return skills; } + public Configuration getConfiguration(){ return configuration; } + + /** + * 精霊武器の設定 + */ + public static class Configuration{ + private ArrayList configs=new ArrayList(); + + public Configuration(){ + add("enableMessage", true); + add("enableTimeSignalMessage", true); + } + + public void add(String key){ + add(key, false); + } + public void add(String key, boolean value){ + configs.add(new Pair(key, value)); + } + public void update(String key, boolean value){ + for(Pair p : configs){ + if(p.key.equals(key)){ + p.value=value; + break; + } + } + } + public boolean get(String key){ + for(Pair p : configs){ + if(p.key.equals(key)){ + return p.value; + } + } + return false; + } + public ArrayList getKeys(){ + ArrayList ret=new ArrayList(); + for(Pair p : configs){ + ret.add(p.key); + } + return ret; + } + + public void writeToNBT(NBTTagCompound nbt){ + for(Pair p : configs){ + nbt.setBoolean(p.key, p.value); + } + } + public void readFromNBT(NBTTagCompound nbt){ + for(Pair p :configs){ + update(p.key, nbt.getBoolean(p.key)); + } + } + + private class Pair{ + private String key; + private boolean value; + public Pair(String key, boolean value){ + this.key=key; + this.value=value; + } + } + } +} diff --git a/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.class b/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.class new file mode 100644 index 0000000..ce0de0b Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.java b/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.java new file mode 100644 index 0000000..46bd2f5 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.java @@ -0,0 +1,175 @@ +// Date: 2016/03/03 11:24:46 +// Template version 1.1 +// Java generated by Techne +// Keep in mind that you still need to fill in some blanks +// - ZeuX + +package jp.plusplus.fbs.spirit.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelAlice extends ModelBase { + //fields + ModelRenderer body1; + ModelRenderer ornaments; + ModelRenderer hair; + ModelRenderer head; + ModelRenderer body; + ModelRenderer rightarm; + ModelRenderer leftarm; + ModelRenderer rightleg; + ModelRenderer leftleg; + ModelRenderer body2; + ModelRenderer ornaments1; + + public ModelAlice() { + textureWidth = 128; + textureHeight = 64; + + body1 = new ModelRenderer(this, 32, 0); + body1.addBox(-5F, 7F, -3F, 10, 6, 6); + body1.setRotationPoint(0F, 0F, 0F); + body1.setTextureSize(128, 64); + body1.mirror = true; + setRotation(body1, 0F, 0F, 0F); + ornaments = new ModelRenderer(this, 0, 47); + ornaments.addBox(-6F, -9F, -2F, 3, 2, 1); + ornaments.setRotationPoint(0F, 0F, 0F); + ornaments.setTextureSize(128, 64); + ornaments.mirror = true; + setRotation(ornaments, 0F, 0F, 0F); + hair = new ModelRenderer(this, 64, 0); + hair.addBox(-4F, 0F, 3F, 8, 10, 1); + hair.setRotationPoint(0F, 0F, 0F); + hair.setTextureSize(128, 64); + hair.mirror = true; + setRotation(hair, 0F, 0F, 0F); + head = new ModelRenderer(this, 0, 0); + head.addBox(-4F, -8F, -4F, 8, 8, 8); + head.setRotationPoint(0F, 0F, 0F); + head.setTextureSize(128, 64); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + body = new ModelRenderer(this, 16, 16); + body.addBox(-4F, 0F, -2F, 8, 7, 4); + body.setRotationPoint(0F, 0F, 0F); + body.setTextureSize(128, 64); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + rightarm = new ModelRenderer(this, 56, 16); + rightarm.addBox(-3F, -2F, -2F, 4, 12, 4); + rightarm.setRotationPoint(-5F, 2F, 0F); + rightarm.setTextureSize(128, 64); + rightarm.mirror = true; + setRotation(rightarm, 0F, 0F, 0F); + leftarm = new ModelRenderer(this, 40, 16); + leftarm.addBox(-1F, -2F, -2F, 4, 12, 4); + leftarm.setRotationPoint(5F, 2F, 0F); + leftarm.setTextureSize(128, 64); + leftarm.mirror = true; + setRotation(leftarm, 0F, 0F, 0F); + rightleg = new ModelRenderer(this, 0, 16); + rightleg.addBox(-2F, 0F, -2F, 4, 12, 4); + rightleg.setRotationPoint(-2F, 12F, 0F); + rightleg.setTextureSize(128, 64); + rightleg.mirror = true; + setRotation(rightleg, 0F, 0F, 0F); + leftleg = new ModelRenderer(this, 0, 16); + leftleg.addBox(-2F, 0F, -2F, 4, 12, 4); + leftleg.setRotationPoint(2F, 12F, 0F); + leftleg.setTextureSize(128, 64); + leftleg.mirror = true; + setRotation(leftleg, 0F, 0F, 0F); + body2 = new ModelRenderer(this, 0, 32); + body2.addBox(-6F, 10F, -4F, 12, 7, 8); + body2.setRotationPoint(0F, 3F, 0F); + body2.setTextureSize(128, 64); + body2.mirror = true; + setRotation(body2, 0F, 0F, 0F); + ornaments1 = new ModelRenderer(this, 0, 50); + ornaments1.addBox(3F, -9F, -2F, 3, 2, 1); + ornaments1.setRotationPoint(0F, 0F, 0F); + ornaments1.setTextureSize(128, 64); + ornaments1.mirror = true; + setRotation(ornaments1, 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, null); + body1.render(f5); + ornaments.render(f5); + hair.render(f5); + head.render(f5); + body.render(f5); + rightarm.render(f5); + leftarm.render(f5); + rightleg.render(f5); + leftleg.render(f5); + body2.render(f5); + ornaments1.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 p_78087_1_, float p_78087_2_, float p_78087_3_, float angleY, float angleX, float p_78087_6_, Entity entity) { + this.head.rotateAngleY = angleY / (180F / (float) Math.PI); + this.head.rotateAngleX = angleX / (180F / (float) Math.PI); + this.ornaments1.rotateAngleY = this.ornaments.rotateAngleY = this.head.rotateAngleY; + this.ornaments1.rotateAngleX = this.ornaments.rotateAngleX = this.head.rotateAngleX; + this.rightarm.rotateAngleX = MathHelper.cos(p_78087_1_ * 0.6662F + (float) Math.PI) * 2.0F * p_78087_2_ * 0.5F; + this.leftarm.rotateAngleX = MathHelper.cos(p_78087_1_ * 0.6662F) * 2.0F * p_78087_2_ * 0.5F; + this.rightarm.rotateAngleZ = 0.0F; + this.leftarm.rotateAngleZ = 0.0F; + this.rightleg.rotateAngleX = MathHelper.cos(p_78087_1_ * 0.6662F) * 1.4F * p_78087_2_; + this.leftleg.rotateAngleX = MathHelper.cos(p_78087_1_ * 0.6662F + (float) Math.PI) * 1.4F * p_78087_2_; + this.rightleg.rotateAngleY = 0.0F; + this.leftleg.rotateAngleY = 0.0F; + + this.rightarm.rotateAngleY = 0.0F; + this.leftarm.rotateAngleY = 0.0F; + float f6; + float f7; + + if (this.onGround > -9990.0F) { + f6 = this.onGround; + this.body2.rotateAngleY = this.body1.rotateAngleY = this.body.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(f6) * (float) Math.PI * 2.0F) * 0.2F; + this.rightarm.rotationPointZ = MathHelper.sin(this.body.rotateAngleY) * 5.0F; + this.rightarm.rotationPointX = -MathHelper.cos(this.body.rotateAngleY) * 5.0F; + this.leftarm.rotationPointZ = -MathHelper.sin(this.body.rotateAngleY) * 5.0F; + this.leftarm.rotationPointX = MathHelper.cos(this.body.rotateAngleY) * 5.0F; + this.rightarm.rotateAngleY += this.body.rotateAngleY; + this.leftarm.rotateAngleY += this.body.rotateAngleY; + this.leftarm.rotateAngleX += this.body.rotateAngleY; + f6 = 1.0F - this.onGround; + f6 *= f6; + f6 *= f6; + f6 = 1.0F - f6; + f7 = MathHelper.sin(f6 * (float) Math.PI); + float f8 = MathHelper.sin(this.onGround * (float) Math.PI) * -(this.head.rotateAngleX - 0.7F) * 0.75F; + this.rightarm.rotateAngleX = (float) ((double) this.rightarm.rotateAngleX - ((double) f7 * 1.2D + (double) f8)); + this.rightarm.rotateAngleY += this.body.rotateAngleY * 2.0F; + this.rightarm.rotateAngleZ = MathHelper.sin(this.onGround * (float) Math.PI) * -0.4F; + } + + this.body2.rotateAngleX = this.body1.rotateAngleX = this.body.rotateAngleX = 0.0F; + this.rightleg.rotationPointZ = 0.1F; + this.leftleg.rotationPointZ = 0.1F; + this.rightleg.rotationPointY = 12.0F; + this.leftleg.rotationPointY = 12.0F; + this.head.rotationPointY = 0.0F; + this.ornaments.rotationPointY = 0.0F; + + this.rightarm.rotateAngleZ += MathHelper.cos(p_78087_3_ * 0.09F) * 0.05F + 0.05F; + this.leftarm.rotateAngleZ -= MathHelper.cos(p_78087_3_ * 0.09F) * 0.05F + 0.05F; + this.rightarm.rotateAngleX += MathHelper.sin(p_78087_3_ * 0.067F) * 0.05F; + this.leftarm.rotateAngleX -= MathHelper.sin(p_78087_3_ * 0.067F) * 0.05F; + } +} diff --git a/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.class b/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.class new file mode 100644 index 0000000..2e97fc1 Binary files /dev/null and b/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.class differ diff --git a/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.java b/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.java new file mode 100644 index 0000000..aadcbca --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.java @@ -0,0 +1,179 @@ +package jp.plusplus.fbs.spirit.render; + +import jp.plusplus.fbs.FBS; +import jp.plusplus.fbs.spirit.model.ModelAlice; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderLivingEvent; +import net.minecraftforge.common.MinecraftForge; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +/** + * Created by plusplus_F on 2016/03/03. + */ +public class RenderAlice extends RendererLivingEntity { + private static final ResourceLocation rl = new ResourceLocation(FBS.MODID, "textures/entity/Alice.png"); + + public RenderAlice() { + super(new ModelAlice(), 0.5f); + renderManager= RenderManager.instance; + } + + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return rl; + } + + public float interpolateRotation(float p_77034_1_, float p_77034_2_, float p_77034_3_) { + float f3; + + for (f3 = p_77034_2_ - p_77034_1_; f3 < -180.0F; f3 += 360.0F) { + ; + } + + while (f3 >= 180.0F) { + f3 -= 360.0F; + } + + return p_77034_1_ + p_77034_3_ * f3; + } + + @Override + public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_CULL_FACE); + this.mainModel.onGround = this.renderSwingProgress(p_76986_1_, p_76986_9_); + + if (this.renderPassModel != null) { + this.renderPassModel.onGround = this.mainModel.onGround; + } + + this.mainModel.isRiding = false; + + if (this.renderPassModel != null) { + this.renderPassModel.isRiding = this.mainModel.isRiding; + } + + this.mainModel.isChild = false; + + if (this.renderPassModel != null) { + this.renderPassModel.isChild = this.mainModel.isChild; + } + + try { + float f2 = this.interpolateRotation(p_76986_1_.prevRenderYawOffset, p_76986_1_.renderYawOffset, p_76986_9_); + float f3 = this.interpolateRotation(p_76986_1_.prevRotationYawHead, p_76986_1_.rotationYawHead, p_76986_9_); + float f4; + + float f13 = p_76986_1_.prevRotationPitch + (p_76986_1_.rotationPitch - p_76986_1_.prevRotationPitch) * p_76986_9_; + this.renderLivingAt(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_); + f4 = this.handleRotationFloat(p_76986_1_, p_76986_9_); + this.rotateCorpse(p_76986_1_, f4, f2, p_76986_9_); + float f5 = 0.0625F; + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(-1.0F, -1.0F, 1.0F); + this.preRenderCallback(p_76986_1_, p_76986_9_); + GL11.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); + float f6 = p_76986_1_.prevLimbSwingAmount + (p_76986_1_.limbSwingAmount - p_76986_1_.prevLimbSwingAmount) * p_76986_9_; + float f7 = p_76986_1_.limbSwing - p_76986_1_.limbSwingAmount * (1.0F - p_76986_9_); + + if (f6 > 1.0F) { + f6 = 1.0F; + } + + GL11.glEnable(GL11.GL_ALPHA_TEST); + this.mainModel.setLivingAnimations(p_76986_1_, f7, f6, p_76986_9_); + this.renderModel(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + int j; + float f8; + float f9; + float f10; + + for (int i = 0; i < 4; ++i) { + j = this.shouldRenderPass(p_76986_1_, i, p_76986_9_); + + if (j > 0) { + this.renderPassModel.setLivingAnimations(p_76986_1_, f7, f6, p_76986_9_); + this.renderPassModel.render(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + + if ((j & 240) == 16) { + this.func_82408_c(p_76986_1_, i, p_76986_9_); + this.renderPassModel.render(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + } + + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + } + } + + GL11.glDepthMask(true); + this.renderEquippedItems(p_76986_1_, p_76986_9_); + float f14 = p_76986_1_.getBrightness(p_76986_9_); + j = this.getColorMultiplier(p_76986_1_, f14, p_76986_9_); + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glDisable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + + if ((j >> 24 & 255) > 0) { + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glDepthFunc(GL11.GL_EQUAL); + + if (p_76986_1_.hurtTime > 0 || p_76986_1_.deathTime > 0) { + GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); + this.mainModel.render(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + + for (int l = 0; l < 4; ++l) { + if (this.inheritRenderPass(p_76986_1_, l, p_76986_9_) >= 0) { + GL11.glColor4f(f14, 0.0F, 0.0F, 0.4F); + this.renderPassModel.render(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + } + } + } + + if ((j >> 24 & 255) > 0) { + f8 = (float) (j >> 16 & 255) / 255.0F; + f9 = (float) (j >> 8 & 255) / 255.0F; + float f15 = (float) (j & 255) / 255.0F; + f10 = (float) (j >> 24 & 255) / 255.0F; + GL11.glColor4f(f8, f9, f15, f10); + this.mainModel.render(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + + for (int i1 = 0; i1 < 4; ++i1) { + if (this.inheritRenderPass(p_76986_1_, i1, p_76986_9_) >= 0) { + GL11.glColor4f(f8, f9, f15, f10); + this.renderPassModel.render(p_76986_1_, f7, f6, f4, f3 - f2, f13, f5); + } + } + } + + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + } catch (Exception exception) { + FBS.logger.error("Couldn\'t render entity", exception); + } + + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glEnable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glPopMatrix(); + //this.passSpecialRender(p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_); + } +} -- cgit v1.2.3