diff options
| author | Benjamin Culkin <scorpress@gmail.com> | 2024-08-24 08:16:37 -0400 |
|---|---|---|
| committer | Benjamin Culkin <scorpress@gmail.com> | 2024-08-24 08:16:37 -0400 |
| commit | 70c1354a4a96698758a88c032866288f79de6f5a (patch) | |
| tree | eca51294e84b90a4cb3230bc2c7900469e784184 /src/main/java/jp/plusplus/fbs/spirit | |
Diffstat (limited to 'src/main/java/jp/plusplus/fbs/spirit')
20 files changed, 1608 insertions, 0 deletions
diff --git a/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class b/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class Binary files differnew file mode 100644 index 0000000..e475ba9 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/ISpiritTool.class 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 Binary files differnew file mode 100644 index 0000000..dafddb2 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/ItemSwordSpirit.class 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()<dur && ss.isOwner((EntityPlayer)player) && ss.addExp(1)){
+ SpiritManager.talk((EntityPlayer)player, ss.getCharacter(), "lvup", itemStack);
+ SanityManager.setSpiritLevel((EntityPlayer)player, ss.getLv());
+
+ if(!((EntityPlayer) player).worldObj.isRemote && ss.getLv()==50) ((EntityPlayer) player).triggerAchievement(AchievementRegistry.best);
+ }
+ SpiritManager.updateNBT(itemStack, ss);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onBlockDestroyed(ItemStack itemStack, World world, Block block, int x, int y, int z, EntityLivingBase p_150894_7_) {
+ if ((double) block.getBlockHardness(world, x, y, z) != 0.0D) {
+ SpiritStatus ss=SpiritStatus.readFromNBT(itemStack.getTagCompound());
+
+ ss.addItemDamage(2);
+ SpiritManager.updateNBT(itemStack, ss);
+ }
+
+ return true;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean isFull3D() {
+ return true;
+ }
+
+ @Override
+ public EnumAction getItemUseAction(ItemStack p_77661_1_) {
+ return EnumAction.block;
+ }
+
+ @Override
+ public int getMaxItemUseDuration(ItemStack p_77626_1_) {
+ return 72000;
+ }
+
+ @Override
+ public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
+ if(player.isSneaking()){
+ SpiritStatus status=SpiritStatus.readFromNBT(itemStack.getTagCompound());
+ if(status.getOwnerName().equals(player.getDisplayName())){
+ SpiritManager.openGui(player);
+ }
+ }
+ else{
+ player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack));
+ }
+
+ return itemStack;
+ }
+
+ @Override
+ public boolean func_150897_b(Block p_150897_1_) {
+ return p_150897_1_ == Blocks.web;
+ }
+
+ @Override
+ public int getItemEnchantability() {
+ return 0;
+ }
+
+ @Override
+ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean flag) {
+ SpiritManager.addInformation(itemStack, player, list, flag);
+ }
+
+ @Override
+ public String getItemStackDisplayName(ItemStack p_77653_1_) {
+ return SpiritManager.getSpiritDisplayName(p_77653_1_);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean hasEffect(ItemStack p_77636_1_) {
+ return true;
+ }
+
+ @Override
+ public double getDurabilityForDisplay(ItemStack stack) {
+ SpiritStatus ss=SpiritStatus.readFromNBT(stack.getTagCompound());
+ return (double) ss.getItemDamage() / calcDurable(ss);
+ }
+
+ @Override
+ public boolean isDamaged(ItemStack stack) {
+ if(!stack.hasTagCompound()) return false;
+ return SpiritStatus.readFromNBT(stack.getTagCompound()).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 Binary files differnew file mode 100644 index 0000000..8f57aa3 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$Skill.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class Binary files differnew file mode 100644 index 0000000..bee1c87 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillData.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class Binary files differnew file mode 100644 index 0000000..a4a1f21 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SkillManager$SkillEntry.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SkillManager.class b/src/main/java/jp/plusplus/fbs/spirit/SkillManager.class Binary files differnew file mode 100644 index 0000000..dd12e75 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SkillManager.class 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<Skill> skills=new ArrayList<Skill>();
+ private ArrayList<SkillEntry> skillEntries=new ArrayList<SkillEntry>();
+
+ 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<SkillEntry> 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()<minLv[nowLv]) return false;
+
+ //前提スキルの判定
+ for(SkillData sd : parents){
+ int now=status.getSkillLevel(sd.getSkill().getName());
+ if(sd.lv<now) return false;
+ }
+
+ return true;
+ }
+
+ public int getSkillId(){ return skill.getId(); }
+ public String getString(int lv){
+ String ret="Lv"+(lv+1)+" "+skill.getLocalizedName();
+ ret+="\n"+StatCollector.translateToLocal("spirit.gui.fbs.need")+":Lv"+minLv[lv];
+ if(parents.length>0){
+ for(int i=0;i<parents.length;i++){
+ ret+=","+parents[i].getString();
+ }
+ }
+ return ret;
+ }
+ }
+
+ /**
+ * 精霊武器が持つスキル情報
+ */
+ public static class SkillData{
+ public int id;
+ public int lv;
+
+ public SkillData(int id, int lv){
+ this.id=id;
+ this.lv=lv;
+ }
+
+ public Skill getSkill(){
+ return SkillManager.getSkill(id);
+ }
+
+ public boolean isSkillEqual(Skill skill){
+ return id==skill.getId();
+ }
+ public boolean isSkillEqual(int id){
+ return this.id==id;
+ }
+
+ public String getString() {
+ return "Lv"+(lv + 1) + " " + getSkill().getLocalizedName();
+ }
+ }
+}
diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritManager$ToolEntry.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritManager$ToolEntry.class Binary files differnew file mode 100644 index 0000000..0247925 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritManager$ToolEntry.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritManager.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritManager.class Binary files differnew file mode 100644 index 0000000..568fea7 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritManager.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritManager.java b/src/main/java/jp/plusplus/fbs/spirit/SpiritManager.java new file mode 100644 index 0000000..1eb7880 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritManager.java @@ -0,0 +1,385 @@ +package jp.plusplus.fbs.spirit;
+
+import jp.plusplus.fbs.FBS;
+import jp.plusplus.fbs.Registry;
+import jp.plusplus.fbs.alchemy.AlchemyRegistry;
+import jp.plusplus.fbs.alchemy.characteristic.CharacteristicBase;
+import jp.plusplus.fbs.alchemy.characteristic.CharacteristicQuality;
+import jp.plusplus.fbs.api.event.SpiritTalkEvent;
+import jp.plusplus.fbs.exprop.SanityManager;
+import jp.plusplus.fbs.item.ItemCore;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemSword;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.potion.Potion;
+import net.minecraft.potion.PotionEffect;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.FoodStats;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.common.MinecraftForge;
+import shift.sextiarysector.SextiarySector;
+import shift.sextiarysector.api.SextiarySectorAPI;
+import shift.sextiarysector.packet.PacketPlayerData;
+import shift.sextiarysector.packet.SSPacketHandler;
+import shift.sextiarysector.player.CustomPlayerData;
+import shift.sextiarysector.player.EntityPlayerManager;
+import shift.sextiarysector.player.MoistureStats;
+import shift.sextiarysector.player.StaminaStats;
+
+import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Created by plusplus_F on 2015/11/02.
+ * 精霊の人格の管理、メッセージの表示などを扱う
+ */
+public class SpiritManager {
+ private static SpiritManager instance=new SpiritManager();
+
+ private Random rand=new Random();
+ private ArrayList<String> characterMale=new ArrayList<String>();
+ private ArrayList<String> characterFemale=new ArrayList<String>();
+ private ArrayList<ToolEntry> tools=new ArrayList<ToolEntry>();
+
+ 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<size;i++){
+ ItemStack is=player.inventory.getStackInSlot(i);
+ if(is!=null && is.getItem() instanceof ISpiritTool){
+ return i;
+ }
+ }
+ return -1;
+ }
+ public static ItemStack findSpiritTool(EntityPlayer player){
+ int i=findSpiritToolIndex(player);
+ return i==-1?null:player.inventory.getStackInSlot(i);
+ }
+
+ public static void registerTool(Item spiritTool, Class<? extends Item> 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<s;i++){
+ ItemStack is=player.inventory.getStackInSlot(i);
+ if(is==null) continue;
+ if(is.getItem()==ItemCore.alchemyPotion && is.getItemDamage()==2){
+ potionIndex=i;
+ break;
+ }
+ }
+ }
+ if(potionIndex==-1) return;
+
+ //回復量を得る
+ float scale=1.f;
+ ItemStack potion=player.inventory.getStackInSlot(potionIndex);
+ ArrayList<CharacteristicBase> 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<? extends Item> tool;
+ private Item spiritTool;
+
+ public ToolEntry(Item spiritTool, Class<? extends Item> 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 Binary files differnew file mode 100644 index 0000000..381a538 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration$Pair.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class Binary files differnew file mode 100644 index 0000000..da19ab1 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus$Configuration.class diff --git a/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class Binary files differnew file mode 100644 index 0000000..3f37c00 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/SpiritStatus.class 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<SkillManager.SkillData> skills=new ArrayList<SkillManager.SkillData>();
+
+ /**
+ * 精霊の設定
+ */
+ 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<list.tagCount();i++){
+ NBTTagCompound n=list.getCompoundTagAt(i);
+ int id=n.getInteger("id");
+ if(SkillManager.getSkill(id)!=null){
+ ss.skills.add(new SkillManager.SkillData(id, n.getInteger("lv")));
+ }
+ }
+
+ ss.configuration.readFromNBT(nbt.getCompoundTag("config"));
+
+ return ss;
+ }
+ public static void writeToNBT(SpiritStatus ss, NBTTagCompound nbt){
+ nbt.setBoolean("isMale", ss.isMale);
+ nbt.setString("character", ss.character);
+ nbt.setString("name", ss.name);
+ nbt.setString("owner", ss.owner);
+ nbt.setShort("level", ss.level);
+ nbt.setDouble("next", ss.next);
+ nbt.setDouble("exp", ss.exp);
+ nbt.setInteger("itemDamage", ss.itemDamage);
+ nbt.setShort("skillPt", ss.skillPoint);
+ nbt.setInteger("lastBlessDate", ss.lastBlessDate);
+ nbt.setShort("FoodLevel", ss.foodLevel);
+
+ nbt.setShort("strength", ss.strength);
+ nbt.setShort("toughness", ss.toughness);
+ nbt.setFloat("maxDamage", ss.maxDamage);
+ nbt.setFloat("maxHarvestLevel", ss.maxHarvestLevel);
+ nbt.setFloat("maxDurability", ss.maxDurability);
+
+ NBTTagList list=new NBTTagList();
+ for(SkillManager.SkillData se : ss.skills){
+ NBTTagCompound n=new NBTTagCompound();
+ n.setInteger("id", se.id);
+ n.setInteger("lv", se.lv);
+ list.appendTag(n);
+ }
+ nbt.setTag("skills", list);
+
+ NBTTagCompound nbt1=new NBTTagCompound();
+ ss.configuration.writeToNBT(nbt1);
+ nbt.setTag("config", nbt1);
+ }
+
+ public boolean isOwner(EntityPlayer player){
+ if(!player.getDisplayName().equals(getOwnerName())) return false;
+ FBSEntityProperties prop=FBSEntityProperties.get(player);
+ String t=prop.getSpiritToolName();
+ if(t==null || !t.equals(getName())) return false;
+ return true;
+ }
+
+ public boolean addExp(double e){
+ if(e<=0) return false;
+
+ boolean flag=false;
+ exp+=e;
+ while(exp>=next && level<LEVEL_MAX){
+ exp-=next;
+ levelUp();
+ flag=true;
+ }
+ return flag;
+ }
+ public void levelUp(){
+ level++;
+ next+= MathHelper.ceiling_double_int(8 * level + 0.5f * next);
+ //next+=1;
+
+ //ここで器用の効果発動
+ if(level%(hasSkill("fbs.skillful")?2:3)==0){
+ skillPoint++;
+ }
+
+ addStrength(3+random.nextInt(3));
+ addToughness(3 + random.nextInt(3));
+
+ //ここでデメリット判定
+ if(level>0 && 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<SkillManager.SkillData> getSkills(){ return skills; }
+ public Configuration getConfiguration(){ return configuration; }
+
+ /**
+ * 精霊武器の設定
+ */
+ public static class Configuration{
+ private ArrayList<Pair> configs=new ArrayList<Pair>();
+
+ 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<String> getKeys(){
+ ArrayList<String> ret=new ArrayList<String>();
+ 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 Binary files differnew file mode 100644 index 0000000..ce0de0b --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/model/ModelAlice.class 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 Binary files differnew file mode 100644 index 0000000..2e97fc1 --- /dev/null +++ b/src/main/java/jp/plusplus/fbs/spirit/render/RenderAlice.class 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_);
+ }
+}
|
