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(); } }); }); }
public static void BugFix_AttachPropsEffect(CharacterInfoData user) { user.UpgradeProperty(false); }
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); } }
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(); }); }); }
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"); }