Exemple #1
0
    void GenWave(Wave wave, int waveIndex)
    {
        currentWave = wave;
        bool  gotFlagHolder = false;
        Enemy flagHolder    = null;

        foreach (var c in wave.characterTypes)
        {
            for (int i = 0; i < c.count; i++)
            {
                CharacterInfoData characterInfoData = (CharacterInfoData)c.characterData;
                Enemy             enemy             = (Enemy)GenCharacter(c.characterData, Character.Group.Enemy,
                                                                          characterInfoData.GetUpgrade(c.rankType, c.level));
                enemy.SetWaveIndex(waveIndex);
                if (!gotFlagHolder)
                {
                    flagHolder = enemy;
                    enemy.SetFlagHolder(true, flagHolder.transform);
                }
                gotFlagHolder = true;
            }
        }
        //EventDispatcher.Instance.Dispatch(EventName.GEN_WAVE, flagHolder);
    }
    private void CreateCharacterModel(AvatarModelData ai, int vocation, CharacterInfoData ci, Action loaded)
    {
        if (m_avatarList.ContainsKey(vocation) && loaded != null)
        {
            if (m_avatarList[vocation].actorParent != null)
            {
                loaded();
                return;
            }
            if (m_avatarList[vocation].gameObject != null)
            {
                AssetCacheMgr.ReleaseInstance(m_avatarList[vocation].gameObject);
            }
        }
        AssetCacheMgr.GetInstanceAutoRelease(ai.prefabName, (prefab, id, go) =>
        {
            var ety                      = new EtyAvatar();
            ety.vocation                 = vocation;
            ety.equipList                = ci.EquipList;
            ety.weapon                   = ci.Weapon;
            ety.CreatePosition           = ci.Location;
            var avatar                   = (go as GameObject);
            ety.gameObject               = avatar;
            avatar.name                  = vocation.ToString();
            var cc                       = avatar.GetComponent <Collider>() as CharacterController;
            cc.radius                    = 0.5f;
            ety.animator                 = avatar.GetComponent <Animator>();
            ety.animator.applyRootMotion = false;
            ety.PlayerShader             = PlayerShader;
            ety.FakeLightShader          = FakeLightShader;
            //MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1);

            if (vocation == 1)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, -0.4f, 0.01f, -0.5f);
            }
            else if (vocation == 2)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, 0, 0.01f, 0.2f);
            }
            else if (vocation == 3)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, 0, 0.01f, 0.2f);
            }
            else if (vocation == 4)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, 0, 0.01f, 0.2f);
            }
            else if (vocation == 3 || vocation == 4)
            {
                // �����ڴ�
                AssetCacheMgr.GetInstanceAutoRelease("fx_jqqd.prefab", (prefabb, idd, goo) =>
                {
                    GameObject goFX           = (GameObject)goo;
                    goFX.transform.parent     = avatar.transform;
                    goFX.transform.localScale = Vector3.one;

                    if (vocation == 3)
                    {
                        goFX.transform.localPosition = new Vector3(0, 2.2f, 0);
                    }
                    else
                    {
                        goFX.transform.localPosition = new Vector3(0, 2f, 0);
                    }
                });
            }

            #region ����

            if (m_Animators.ContainsKey(vocation))
            {
                m_Animators[vocation] = avatar.GetComponent <Animator>();
            }
            else
            {
                m_Animators.Add(vocation, avatar.GetComponent <Animator>());
            }

            #endregion

            avatar.transform.position   = ci.Location;
            avatar.transform.localScale = Vector3.one;

            ety.sfxHandler = avatar.AddComponent <SfxHandler>();

            #region ��Ч �� ��Чɾ��������ʱ��

            if (!m_sfxHandlers.ContainsKey(vocation))
            {
                SfxHandler handler = avatar.GetComponent <SfxHandler>();
                if (handler == null)
                {
                    handler = avatar.AddComponent <SfxHandler>();
                }
                m_sfxHandlers.Add(vocation, handler);
                uint timer = uint.MaxValue;
                m_fxTimes.Add(vocation, timer);
            }

            #endregion

            ety.actorParent = avatar.AddComponent <ActorParent>();
            ety.actorParent.SetNakedEquid(ai.nakedEquipList);
            ety.InitEquip();

            if (m_avatarList.ContainsKey(vocation))
            {
                m_avatarList[vocation].sfxHandler.RemoveAllFX();
                AssetCacheMgr.ReleaseInstance(m_avatarList[vocation].gameObject);
            }
            ety.Hide();
            m_avatarList[vocation] = ety;
            AssetCacheMgr.GetResource(ci.controller,
                                      (obj) =>
            {
                var controller = obj as RuntimeAnimatorController;
                if (ety.animator)
                {
                    ety.animator.runtimeAnimatorController = controller;
                }
                if (loaded != null)
                {
                    loaded();
                }
            });
        });
    }
Exemple #3
0
 public static void BugFix_AttachPropsEffect(CharacterInfoData user)
 {
     user.UpgradeProperty(false);
 }
Exemple #4
0
        public static void NurturanceValueDisplay(CtrlNurturance __instance, WGNurturanceBtn btn)
        {
            if (!thresholdDisplay.Value)
            {
                return;
            }
            NurturanceOrderTree tree = btn.tree;

            if (tree == null)
            {
                return;
            }
            var Instance             = Traverse.Create(__instance);
            NurturanceUIInfo  uiInfo = Instance.Field("UIInfo").GetValue <NurturanceUIInfo>();
            CharacterInfoData player = Instance.Field("Player").GetValue <CharacterInfoData>();

            if (tree.Value.Fuction == NurturanceFunction.Skill)
            {
                if (!player.Skill.ContainsKey(tree.DoorPlate))
                {
                    return;
                }
                SkillData skillData    = player.Skill[tree.DoorPlate];
                int       playerStatus = Instance.Method("GetPlayerStatus", skillData.Item.RequireAttribute).GetValue <int>();
                float     traitEffect  = player.Trait.GetTraitEffect(TraitEffectType.SkillQuicken, (int)skillData.Item.Type);
                float     additionCoe  = Instance.Method("GetAdditionCoe", tree.Value).GetValue <float>();
                int       exp          = Instance.Method("CalculateAbilityExp", playerStatus, skillData.Item.RequireValue).GetValue <int>();
                exp = Instance.Method("GetValueByEmotion", (int)(exp * (traitEffect + additionCoe))).GetValue <int>();
                int req = 100 * (10 - skillData.Level) - skillData.Exp;
                if (req > exp && req <= Instance.Method("GetValueByEmotion", (int)(900f * (traitEffect + additionCoe))).GetValue <int>())
                {
                    int thresholdStatus = GetThresholdStatus(playerStatus, req, status =>
                    {
                        int value = Instance.Method("CalculateAbilityExp", status, skillData.Item.RequireValue).GetValue <int>();
                        value     = Instance.Method("GetValueByEmotion", (int)(value * (traitEffect + additionCoe))).GetValue <int>();
                        return(value);
                    });
                    uiInfo.TipInfos.Insert(2, new TipInfo {
                        type = WGTip.TipType.TitleValue, title = "一次练满需", value = thresholdStatus.ToString()
                    });
                    Instance.Field("view").GetValue <UINurturance>().ShowTip(uiInfo.TipInfos);
                }
            }
            else if (tree.Value.Fuction == NurturanceFunction.Mantra)
            {
                MantraData mantraData = player.Mantra[tree.DoorPlate];
                if (mantraData == null)
                {
                    return;
                }
                int   playerStatus2 = Instance.Method("GetPlayerStatus", mantraData.Item.RequireAttribute).GetValue <int>();
                float traitEffect2  = player.Trait.GetTraitEffect(TraitEffectType.MantraQuicken);
                float additionCoe2  = Instance.Method("GetAdditionCoe", tree.Value).GetValue <float>();
                int   exp2          = Instance.Method("CalculateAbilityExp", playerStatus2, mantraData.Item.RequireValue).GetValue <int>();
                exp2 = Instance.Method("GetValueByEmotion", (int)(exp2 * (traitEffect2 + additionCoe2))).GetValue <int>();
                int req2 = 100 * (10 - mantraData.Level) - mantraData.Exp;
                if (req2 > exp2 && req2 <= Instance.Method("GetValueByEmotion", (int)(900f * (traitEffect2 + additionCoe2))).GetValue <int>())
                {
                    int thresholdStatus = GetThresholdStatus(playerStatus2, req2, status =>
                    {
                        int value = Instance.Method("CalculateAbilityExp", status, mantraData.Item.RequireValue).GetValue <int>();
                        value     = Instance.Method("GetValueByEmotion", (int)(value * (traitEffect2 + additionCoe2))).GetValue <int>();
                        return(value);
                    });
                    uiInfo.TipInfos.Insert(2, new TipInfo {
                        type = WGTip.TipType.TitleValue, title = "一次练满需", value = thresholdStatus.ToString()
                    });
                    Instance.Field("view").GetValue <UINurturance>().ShowTip(uiInfo.TipInfos);
                }
            }
        }
        public static void NurturanceValueDisplay(CtrlNurturance __instance, WGNurturanceBtn btn)
        {
            if (!showThreshold.Value)
            {
                return;
            }
            NurturanceOrderTree tree = btn.tree;

            if (tree == null || (tree.Value.Fuction != NurturanceFunction.Skill && tree.Value.Fuction != NurturanceFunction.Mantra))
            {
                return;
            }
            var Instance             = Traverse.Create(__instance);
            NurturanceUIInfo  uiInfo = Instance.Field("UIInfo").GetValue <NurturanceUIInfo>();
            CharacterInfoData player = Instance.Field("Player").GetValue <CharacterInfoData>();
            int   playerStatus;
            int   requireStatus;
            int   requireExp;
            float traitEffect;
            float additionCoe;

            if (tree.Value.Fuction == NurturanceFunction.Skill)
            {
                if (!player.Skill.ContainsKey(tree.DoorPlate))
                {
                    return;
                }
                SkillData skillData = player.Skill[tree.DoorPlate];
                playerStatus  = Instance.Method("GetPlayerStatus", skillData.Item.RequireAttribute).GetValue <int>();
                requireStatus = skillData.Item.RequireValue;
                requireExp    = 100 * (10 - skillData.Level) - skillData.Exp;
                traitEffect   = player.Trait.GetTraitEffect(TraitEffectType.SkillQuicken, (int)skillData.Item.Type);
                additionCoe   = Instance.Method("GetAdditionCoe", tree.Value).GetValue <float>();
            }
            else// (tree.Value.Fuction == NurturanceFunction.Mantra)
            {
                MantraData mantraData = player.Mantra[tree.DoorPlate];
                if (mantraData == null)
                {
                    return;
                }
                playerStatus  = Instance.Method("GetPlayerStatus", mantraData.Item.RequireAttribute).GetValue <int>();
                requireStatus = mantraData.Item.RequireValue;
                requireExp    = 100 * (10 - mantraData.Level) - mantraData.Exp;
                traitEffect   = player.Trait.GetTraitEffect(TraitEffectType.MantraQuicken);
                additionCoe   = Instance.Method("GetAdditionCoe", tree.Value).GetValue <float>();
            }

            int expFromStatus(int status)
            {
                int value = Instance.Method("CalculateAbilityExp", status, requireStatus).GetValue <int>();

                value = Instance.Method("GetValueByEmotion", (int)(value * (traitEffect + additionCoe))).GetValue <int>();
                return(value);
            }

            int exp = expFromStatus(playerStatus);
            int n   = (requireExp + exp - 1) / exp;

            if (n > 1)
            {
                int    thresholdStatus = GetThresholdStatus(playerStatus, (requireExp + n - 2) / (n - 1), expFromStatus);
                string s = thresholdStatus < MAX_STATUS?thresholdStatus.ToString() : MAX_STATUS.ToString() + "+";

                s = playerStatus + "/" + s;
                uiInfo.TipInfos.Insert(2, new TipInfo {
                    type = WGTip.TipType.TitleValue, title = (n - 1) + "次练满需", value = s
                });
            }
            if (n > 0)
            {
                uiInfo.TipInfos.Insert(2, new TipInfo {
                    type = WGTip.TipType.TitleValue, title = "练满回合数", value = n.ToString()
                });
                Instance.Field("view").GetValue <UINurturance>().ShowTip(uiInfo.TipInfos);
            }
        }
Exemple #6
0
 private void LoadCharacterStats()
 {
     mCharacterInfoData = Resources.Load <CharacterInfoData>(CHARACTER_DATA_PATH);
 }
    private void CreateCharacterModel(AvatarModelData ai, int vocation, CharacterInfoData ci, Action loaded)
    {
        if (m_avatarList.ContainsKey(vocation) && loaded != null)
        {
            if (m_avatarList[vocation].actorParent != null)
            {
                loaded();
                return;
            }
            if (m_avatarList[vocation].gameObject != null)
            {
                AssetCacheMgr.ReleaseInstance(m_avatarList[vocation].gameObject);
            }
        }
        AssetCacheMgr.GetInstanceAutoRelease(ai.prefabName, (prefab, id, go) =>
        {
            var ety = new EtyAvatar();
            ety.vocation = vocation;
            ety.equipList = ci.EquipList;
            ety.weapon = ci.Weapon;
            ety.CreatePosition = ci.Location;
            var avatar = (go as GameObject);
            ety.gameObject = avatar;
            avatar.name = vocation.ToString();
            var cc = avatar.collider as CharacterController;
            cc.radius = 0.5f;
            ety.animator = avatar.GetComponent<Animator>();
            ety.animator.applyRootMotion = false;
            ety.PlayerShader = PlayerShader;
            ety.FakeLightShader = FakeLightShader;
            //MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1);

            if (vocation == 1)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, -0.4f, 0.01f, -0.5f);
            }
            else if (vocation == 2)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, 0, 0.01f, 0.2f);
            }
            else if(vocation == 3)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, 0, 0.01f, 0.2f);
            }
            else if (vocation == 4)
            {
                MogoFXManager.Instance.AttachShadow(avatar, string.Concat(avatar.name, "_Shadow"), 0, 0, 0, 1.5f, 1.5f, 1, 0, 0.01f, 0.2f);
            }
            else if (vocation == 3 || vocation == 4)
            {
                // 敬请期待
                AssetCacheMgr.GetInstanceAutoRelease("fx_jqqd.prefab", (prefabb, idd, goo) =>
                    {
                        GameObject goFX = (GameObject)goo;
                        goFX.transform.parent = avatar.transform;
                        goFX.transform.localScale = Vector3.one;

                        if (vocation == 3)
                        {
                            goFX.transform.localPosition = new Vector3(0, 2.2f, 0);
                        }
                        else
                        {
                            goFX.transform.localPosition = new Vector3(0, 2f, 0);
                        }
                    });
            }

            #region 动作

            if (m_Animators.ContainsKey(vocation))
                m_Animators[vocation] = avatar.GetComponent<Animator>();
            else
                m_Animators.Add(vocation, avatar.GetComponent<Animator>());

            #endregion

            avatar.transform.position = ci.Location;
            avatar.transform.localScale = Vector3.one;

            ety.sfxHandler = avatar.AddComponent<SfxHandler>();

            #region 特效 和 特效删除函数定时器

            if (!m_sfxHandlers.ContainsKey(vocation))
            {
                SfxHandler handler = avatar.GetComponent<SfxHandler>();
                if (handler == null)
                    handler = avatar.AddComponent<SfxHandler>();
                m_sfxHandlers.Add(vocation, handler);
                uint timer = uint.MaxValue;
                m_fxTimes.Add(vocation, timer);
            }

            #endregion

            ety.actorParent = avatar.AddComponent<ActorParent>();
            ety.actorParent.SetNakedEquid(ai.nakedEquipList);
            ety.InitEquip();

            if (m_avatarList.ContainsKey(vocation))
            {
                m_avatarList[vocation].sfxHandler.RemoveAllFX();
                AssetCacheMgr.ReleaseInstance(m_avatarList[vocation].gameObject);
            }
            ety.Hide();
            m_avatarList[vocation] = ety;
            AssetCacheMgr.GetResource(ci.controller,
           (obj) =>
           {
               var controller = obj as RuntimeAnimatorController;
               if (ety.animator)
                   ety.animator.runtimeAnimatorController = controller;
               if (loaded != null)
                   loaded();
           });
        });
    }
Exemple #8
0
        private static bool AddLuaParams(Script script, T item)
        {
            if (!UserData.IsTypeRegistered(typeof(T)))
            {
                UserData.RegisterType(typeof(T));
            }
            if (item.GetType() != typeof(Npc))
            {
                script.Globals["item"] = item;
            }
            else
            {
                // 传NPC信息没太大用处,改传CharacterInfo的信息
                Npc npc = item as Npc;
                try
                {
                    CharacterExteriorData exterior = null;
                    CharacterInfoData     info     = null;
                    if (!npc.ExteriorId.IsNullOrEmpty())
                    {
                        exterior = Game.GameData.Exterior[npc.ExteriorId];
                    }
                    if (exterior != null && !exterior.InfoId.IsNullOrEmpty())
                    {
                        info = Game.GameData.Character[exterior.InfoId];
                    }
                    else if (!npc.CharacterInfoId.IsNullOrEmpty())
                    {
                        info = Game.GameData.Character[npc.CharacterInfoId];
                    }

                    if (info == null || info.Id.IsNullOrEmpty())
                    {
                        return(false);
                    }
                    if (info.Property[CharacterProperty.Max_HP].Value <= 0)
                    {
                        return(false);
                    }

                    if (!UserData.IsTypeRegistered <CharacterInfoData>())
                    {
                        UserData.RegisterType <CharacterInfoData>(InteropAccessMode.Default, null);
                    }
                    script.Globals["item"] = info;

                    foreach (object obj in Enum.GetValues(typeof(CharacterUpgradableProperty)))
                    {
                        CharacterUpgradableProperty prop = (CharacterUpgradableProperty)obj;
                        int value = info.GetUpgradeableProperty(prop);
                        script.Globals[obj.ToString().ToLower()] = value;
                    }
                    foreach (object obj2 in Enum.GetValues(typeof(CharacterProperty)))
                    {
                        CharacterProperty prop2 = (CharacterProperty)obj2;
                        int value2 = info.Property[prop2].Value;
                        script.Globals[obj2.ToString().ToLower()] = value2;
                    }
                }
                catch
                {
                    Console.WriteLine(string.Format("NPC信息出错 npc={0}, exId={1}, infoId={2}", npc.Id, npc.ExteriorId, npc.CharacterInfoId));
                    return(false);
                }
            }
            return(true);
        }
        public static void openElementUI()
        {
            Heluo.Logger.LogError("openElementUI start");
            if (nonbattleChangeElement.Value)
            {
                //show结束时ctrlMartialArts还没当前角色数据,需要从ctrlhome处获得

                List <CharacterMapping> characterMapping = Traverse.Create(homeController).Field("characterMapping").GetValue <List <CharacterMapping> >();
                int communityIndex = Traverse.Create(homeController).Field("communityIndex").GetValue <int>();

                CharacterMapping mapping = characterMapping[communityIndex];
                characterInfoData = Game.GameData.Character[mapping.InfoId];
                clickSkill        = characterInfoData.GetSkill(characterInfoData.SpecialSkill);

                //不是切换功体或召唤技能
                if (clickSkill == null || (clickSkill.Item.DamageType != DamageType.ChangeElement && clickSkill.Item.DamageType != DamageType.Summon))
                {
                    return;
                }
                //mp不足
                if (characterInfoData.MP < clickSkill.Item.RequestMP)
                {
                    string text2 = Game.Data.Get <StringTable>("SecondaryInterface1207").Text;
                    Game.UI.AddMessage(text2, UIPromptMessage.PromptType.Normal);
                    return;
                }

                //切换功体
                if (clickSkill.Item.DamageType == DamageType.ChangeElement)
                {
                    Game.MusicPlayer.Current_Volume = 0.5f;

                    //从uibattle处获得五行盘ui
                    UIBattle      uiBattle     = Game.UI.Open <UIBattle>();
                    WgBattleRound battle_round = uiBattle.battle_round;
                    battle_round.gameObject.SetActive(false);//隐藏右上角的回合数
                    UIAttributeList attr_list = Traverse.Create(uiBattle).Field("attr_list").GetValue <UIAttributeList>();

                    //图层设置为最前,否则会被挡住
                    Game.UI.SetParent(attr_list.transform, UIForm.Depth.Front);
                    attr_list.transform.SetAsLastSibling();

                    attr_list.Show();
                    attr_list.SetOriginElement((int)characterInfoData.Element, new Action <int>(OnElementSelect), delegate
                    {
                        Game.MusicPlayer.Current_Volume = 1f;
                    });
                }
                //召唤小熊猫,开启乖乖技能列表
                else if (nonbattleUseHealSkill.Value && clickSkill.Item.DamageType == DamageType.Summon)
                {
                    CharacterInfoData  characterInfoData = Game.GameData.Character["in91001"];
                    CharacterSkillData skill             = characterInfoData.Skill;
                    Props equip = characterInfoData.Equip.GetEquip(EquipType.Weapon);
                    if (equip == null)
                    {
                        return;
                    }
                    List <SkillData> list          = new List <SkillData>();
                    PropsCategory    propsCategory = equip.PropsCategory;
                    foreach (string key in skill.Keys)
                    {
                        SkillData skillData = skill[key];
                        if (skillData.Item == null)
                        {
                            Debug.LogError("Skill表中找不到" + skillData.Id + "的文本");
                        }
                        else if (!(skillData.Item.Id == characterInfoData.SpecialSkill))
                        {
                            list.Add(skillData);
                        }
                    }
                    if (list.Count > 0)
                    {
                        MartialArtsWindowInfo martialArtsWindowInfo = new MartialArtsWindowInfo();
                        martialArtsWindowInfo.Mapping = new CharacterMapping();
                        Npc npc = Game.Data.Get <Npc>("in91001");
                        martialArtsWindowInfo.Mapping.Id         = "in91001";
                        martialArtsWindowInfo.Mapping.InfoId     = npc.CharacterInfoId;
                        martialArtsWindowInfo.Mapping.ExteriorId = npc.ExteriorId;
                        martialArtsWindowInfo.Sort        = list;
                        martialArtsWindowInfo.SkillColumn = (CtrlMartialArts.UISkillColumn) 5;
                        Game.UI.Open <UIMartialArtsWindow>().OpenWindow(martialArtsWindowInfo, null);
                        return;
                    }
                }
            }
        }
        public static void nonbattleUseHealSkillAction(UITeamMember uiTeamMember, CharacterInfoData attacker, List <CharacterInfoData> defender, int index, SkillData skill)
        {
            Heluo.Logger.LogError("nonbattleUseHealSkillAction start");

            //mp不足
            if (attacker.MP < skill.Item.RequestMP)
            {
                string text2 = Game.Data.Get <StringTable>("SecondaryInterface1207").Text;
                Game.UI.AddMessage(text2, UIPromptMessage.PromptType.Normal);
                return;
            }

            //最小距离大于0则不能给自己治疗
            if (selectSkill.Item.MinRange > 0 && defender[index] == attacker)
            {
                Game.UI.AddMessage("该技能不能给自己治疗", UIPromptMessage.PromptType.Normal);
                return;
            }

            //最大距离等于0则只能给自己治疗
            if (selectSkill.Item.MaxRange == 0 && defender[index] != attacker)
            {
                Game.UI.AddMessage("该技能只能给自己治疗", UIPromptMessage.PromptType.Normal);
                return;
            }


            //是否群体回复
            int startIndex = index;
            int endIndex   = index + 1;

            if (skill.Item.TargetArea == TargetArea.Fan || skill.Item.TargetArea == TargetArea.LineGroup || skill.Item.TargetArea == TargetArea.RingGroup)
            {
                startIndex = 0;
                endIndex   = defender.Count;
            }

            //所有加血对象是否已满血
            bool isAllFullHp = true;

            for (int i = startIndex; i < endIndex; i++)
            {
                if (defender[i].HP < defender[i].Property[CharacterProperty.Max_HP].Value)
                {
                    isAllFullHp = false;
                    break;
                }
            }
            if (isAllFullHp)
            {
                Game.UI.AddMessage("HP已满", UIPromptMessage.PromptType.Normal);
                return;
            }

            BattleComputer        battleComputer         = Singleton <BattleComputer> .Instance;
            BattleComputerFormula BattleComputerFormula  = Traverse.Create(battleComputer).Field("BattleComputerFormula").GetValue <BattleComputerFormula>();
            BattleFormulaProperty BattleComputerProperty = Traverse.Create(battleComputer).Field("BattleComputerProperty").GetValue <BattleFormulaProperty>();

            attacker.MP -= skill.Item.RequestMP;

            for (int i = startIndex; i < endIndex; i++)
            {
                //原代码用WuxiaUnit参与计算,涉及Grid格子数据,直接调用比较麻烦,所以我这边就把逻辑抄一遍
                //只留下和回复技能有关的数据(删来删去发现好像只剩下暴击了),如果有遗漏以后再补(真的会有人发现么)
                battleComputer.Initialize();

                AttachBattleComputerProperty(attacker, defender[i]);              //记录攻击者和防御者的属性

                float basic_damage = battleComputer.Calculate_Basic_Damage(true); //基础回复值


                float num = BattleComputerFormula["critical_rate"].Evaluate(BattleComputerProperty.GetDictionary());
                num = Mathf.Clamp(num, 0f, 100f);
                int  probability = UnityEngine.Random.Range(1, 100);;
                bool IsCritical  = probability <= num;//是否暴击


                float skill_coefficient = battleComputer.Calculate_Skill_Coefficient(skill);//技能倍率

                float num2 = IsCritical ? BattleComputerFormula["damage_coefficient_of_critical"].Evaluate(BattleComputerProperty.GetDictionary()) : 1f;

                float num7 = basic_damage * num2;

                int final_damage = 1;
                //实际上回血技能应该都是+倍率
                if (skill.Item.Algorithm == Algorithm.Addition)
                {
                    final_damage = (int)(num7 + skill_coefficient);
                }
                else
                {
                    final_damage = (int)(num7 * skill_coefficient);
                }

                if (selectSkill.Item.DamageType == DamageType.Heal)
                {
                    defender[i].HP += final_damage;
                }
                else if (selectSkill.Item.DamageType == DamageType.MpRecover)
                {
                    defender[i].MP += final_damage;
                }
            }


            //刷新左侧ui
            CtrlTeamMember controller = Traverse.Create(uiTeamMember).Field("controller").GetValue <CtrlTeamMember>();

            controller.OnShow();

            //刷新主界面角色信息
            homeController.UpdateCharacterProperty(true);

            Heluo.Logger.LogError("nonbattleUseHealSkillAction end");
        }
        //显示左侧队友UI
        public static void showUITeamMember(CharacterInfoData source, SkillData selectSkill)
        {
            Heluo.Logger.LogError("showUITeamMember start");
            //先销毁原UI
            if (uiTeamMember != null)
            {
                UnityEngine.Object.DestroyImmediate(uiTeamMember.gameObject);
            }

            //如果是恢复技能且伤害公式不为0
            if ((selectSkill.Item.DamageType == DamageType.Heal || selectSkill.Item.DamageType == DamageType.MpRecover) && selectSkill.Item.Damage != "nodamage" && selectSkill.Item.Damage != "0damage")
            {
                List <CharacterInfoData> list = new List <CharacterInfoData>();
                //暂时不做养成界面的非队友治疗,角色太多左边UI放不下,界面更新也麻烦
                //养成界面队伍中只有自己,但应该可以互相治疗

                /* if (Game.GameData.Round.CurrentStage == Heluo.Manager.TimeStage.Free)
                 * {
                 *   foreach (KeyValuePair<string,CommunityData> community in Game.GameData.Community)
                 *   {
                 *       CharacterInfoData target = Game.GameData.Character[community.Key];
                 *       list.Add(target);
                 *   }
                 * }
                 * //大地图的话只有队伍中能互相治疗
                 * else
                 * {*/
                //获得当前队友
                foreach (string text in Game.GameData.Party)
                {
                    CharacterInfoData target = Game.GameData.Character[text];
                    list.Add(target);
                }
                //}

                //如果当前角色不在队伍中则不能用恢复技能,防止远程治疗。如果是乖乖的回血技能则看锺若昕是否在队伍中
                if (!list.Contains(source) && (source.Id == "in91001" && !list.Contains(Game.GameData.Character["in0103"])))
                {
                    return;
                }


                //展示左侧的队友列表UI
                uiTeamMember = Game.UI.Open <UITeamMember>();

                //给每个队友的头像加上按钮和点击事件
                List <UITeamMemberInfo> infos = Traverse.Create(uiTeamMember).Field("infos").GetValue <List <UITeamMemberInfo> >();
                for (int i = 0; i < infos.Count; i++)
                {
                    GameObject buttonGO = new GameObject("buttonGO");
                    buttonGO.transform.SetParent(infos[i].Protrait.transform, false);
                    Button button = buttonGO.AddComponent <Button>();

                    //给按钮随便添加一个透明的图,否则没法点击
                    Image image = buttonGO.AddComponent <Image>();
                    image.sprite = Game.Resource.Load <Sprite>("Image/UI/UIAlchemy/alchemy_stove.png");
                    image.color  = new Color(255, 255, 255, 0);

                    int partyIndex = i;//临时变量存储,否则下一步addListener传不过去

                    button.onClick.AddListener(delegate {
                        nonbattleUseHealSkillAction(uiTeamMember, source, list, partyIndex, selectSkill);
                    });
                }
            }
            Heluo.Logger.LogError("showUITeamMember end");
        }