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"); }