125 【战斗】战斗系统 Boss战 &血条(表现待优化) &闪避 &子弹问题
| | |
| | | HB427_tagSCUseSkill skill = packList[0] as HB427_tagSCUseSkill; |
| | | packList.Remove(skill); |
| | | BattleObject _caster = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID); |
| | | |
| | | // BattleDebug.LogError("_caster == null : " + (_caster == null) + " skill.ObjID : " + skill.ObjID); |
| | | |
| | | SkillRecordAction skillAction = new SkillRecordAction(battleField, _caster, skill, packList); |
| | | return skillAction; |
| | | } |
| | |
| | | base.Done(vNetPack); |
| | | H0418_tagObjInfoRefresh vNetData = vNetPack as H0418_tagObjInfoRefresh; |
| | | |
| | | // 0 - NPC(武将或怪物) |
| | | // 1 - 玩家(主公) |
| | | // 2 - NPC(武将或怪物) |
| | | |
| | | switch (vNetData.ObjType) |
| | | { |
| | | case 1: |
| | | Update0418(vNetData); |
| | | break; |
| | | case 2: |
| | | case 0: |
| | | UpdateBattleField(vNetData); |
| | | break; |
| | | default: |
| | |
| | | // B4 18 对象属性刷新展示 #tagSCObjPropertyRefreshView |
| | | |
| | | public class DTCB418_tagSCObjPropertyRefreshView : DtcBasic { |
| | | public override void Done(GameNetPackBasic vNetPack) { |
| | | public override void Done(GameNetPackBasic vNetPack) |
| | | { |
| | | base.Done(vNetPack); |
| | | HB418_tagSCObjPropertyRefreshView vNetData = vNetPack as HB418_tagSCObjPropertyRefreshView; |
| | | |
| | | BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID); |
| | | if (null != battleField) |
| | | { |
| | | battleField.ObjPropertyRefreshView(vNetData); |
| | | battleField.DistributeNextPackage(); |
| | | } |
| | | } |
| | | } |
| | |
| | | BattleField battleField = BattleManager.Instance.CreateBattleField(guid, (int)vNetData.MapID, (int)vNetData.FuncLineID, extendData, redTeamList, blueTeamList); |
| | | BattleStartAction battleStartAction = new BattleStartAction(battleField); |
| | | battleField.recordPlayer.PlayRecord(battleStartAction); |
| | | |
| | | BattleDebug.LogError("创建战场 guid:" + guid + " MapID:" + vNetData.MapID + " FuncLineID:" + vNetData.FuncLineID + " " + battleField.GetType().ToString()); |
| | | |
| | | BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>(); |
| | | if (null != battleWin) |
| | | { |
| | | battleWin.SetBattleField(battleField); |
| | | } |
| | | } |
| | | } |
| | |
| | | using System.Collections; |
| | | using System; |
| | | using System.Text; |
| | | using System.Collections.Generic; |
| | | // B4 30 查看战报结果 #tagSCTurnFightReportRet |
| | | |
| | | |
| | | public class DTCB430_tagSCTurnFightReport : DtcBasic { |
| | | public class DTCB430_tagSCTurnFightReport : DtcBasic |
| | | { |
| | | |
| | | static byte[] vCmdBytes = new byte[2]; |
| | | |
| | |
| | | int vLeavingLeng = 0; |
| | | int vBodyLeng = 0; |
| | | int vTotalLeng = vNetData.reportBytes.Length; |
| | | |
| | | List<GameNetPackBasic> vPackList = new List<GameNetPackBasic>(); |
| | | |
| | | while (vReadIndex < vTotalLeng) |
| | | { |
| | |
| | | |
| | | if (PackageRegedit.Contain(cmd)) |
| | | { |
| | | GameNetPackBasic vNetpack = PackageRegedit.TransPack(ServerType.B430, cmd, vPackBytes); |
| | | if (vNetpack != null) |
| | | GameNetPackBasic npk = PackageRegedit.TransPack(ServerType.B430, cmd, vPackBytes); |
| | | if (npk != null) |
| | | { |
| | | BattleManager.Instance.PushPackage(guid, vNetpack); |
| | | vPackList.Add(npk); |
| | | BattleManager.Instance.PushPackUID(guid, npk.packUID); |
| | | isRegist = true; |
| | | } |
| | | } |
| | |
| | | #endif |
| | | } |
| | | } |
| | | |
| | | vPackList = AnalysisPackQueueAndDistribute(guid, vPackList); |
| | | |
| | | for (int i = 0; i < vPackList.Count; i++) |
| | | { |
| | | BattleManager.Instance.PushPackage(guid, vPackList[i]); |
| | | } |
| | | |
| | | BattleManager.Instance.DistributeNextReportPackage(guid); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Debug.LogErrorFormat("DTCB430_tagSCTurnFightReport 解包异常:{0}", e); |
| | | } |
| | | } |
| | | |
| | | |
| | | protected List<GameNetPackBasic> AnalysisPackQueueAndDistribute(string guid, List<GameNetPackBasic> vPackList) |
| | | { |
| | | // 建议前端做一个防范机制:当连续多次请求得到空的战斗片段封包时(不包含B425标记的开始跟结束封包,即开始跟中间没有任何封包),强制自动帮玩家回城休息, |
| | | // 原因可能前后端数据不一致bug(比如战锤可能后端没有了,前端认为还有)或者 后端有bug导致没有处理战斗 |
| | | // 为防止死循环,可强制回城休息,让玩家重新点击关卡战斗或挑战boss, |
| | | // 正常情况下在战锤足够时理论上都可以一直循环刷怪,如果连续多次没有战斗片段封包,比如限制个连续10次以内,就可以理解为异常了 |
| | | |
| | | const int MaxContinousEmptyCount = 10; // 连续空包最大次数 |
| | | |
| | | List<GameNetPackBasic> packQueueSnapshot = new List<GameNetPackBasic>(vPackList); |
| | | |
| | | List<GameNetPackBasic> newPackList = new List<GameNetPackBasic>(); |
| | | HashSet<int> skipIndexes = new HashSet<int>(); |
| | | |
| | | // 这里已经是按照Dequeue的顺序了 |
| | | for (int i = 0; i < packQueueSnapshot.Count; i++) |
| | | { |
| | | if (skipIndexes.Contains(i)) continue; |
| | | |
| | | GameNetPackBasic pack = packQueueSnapshot[i]; |
| | | |
| | | // 碰到B421 截断 往下收集b421里的全部内容 |
| | | if (pack is HB421_tagMCTurnFightObjAction) |
| | | { |
| | | HB421_tagMCTurnFightObjAction b421Pack = pack as HB421_tagMCTurnFightObjAction; |
| | | |
| | | List<GameNetPackBasic> b421PackList = new List<GameNetPackBasic>(); |
| | | i++; // 跳过当前的B421包 |
| | | |
| | | // 收集所有非B421包,直到遇到下一个B421或队列结束 |
| | | for (; i < packQueueSnapshot.Count; i++) |
| | | { |
| | | GameNetPackBasic nextPack = packQueueSnapshot[i]; |
| | | if (nextPack is HB421_tagMCTurnFightObjAction) |
| | | { |
| | | i--; // 回退一个位置,留给外层循环处理 |
| | | break; |
| | | } |
| | | else |
| | | { |
| | | b421PackList.Add(nextPack); |
| | | skipIndexes.Add(i); // 标记已被合包 |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | // 合并所有相关包 |
| | | CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(guid, b421PackList); |
| | | |
| | | newPackList.Add(actionPack); |
| | | } |
| | | else |
| | | { |
| | | newPackList.Add(pack); |
| | | } |
| | | } |
| | | |
| | | |
| | | List<GameNetPackBasic> returnList = new List<GameNetPackBasic>(); |
| | | for (int i = 0; i < newPackList.Count; i++) |
| | | { |
| | | var pack = newPackList[i]; |
| | | |
| | | returnList.Add(pack); |
| | | } |
| | | return returnList; |
| | | } |
| | | } |
| | |
| | | |
| | | if (winFaction == 1) |
| | | { |
| | | Debug.LogError("战斗胜利"); |
| | | Debug.LogError(guid + " : 战斗胜利"); |
| | | // 战斗胜利 |
| | | } |
| | | else |
| | | { |
| | | // 战斗失败 |
| | | Debug.LogError("战斗失败"); |
| | | Debug.LogError(guid + " : 战斗失败"); |
| | | } |
| | | |
| | | IsBattleFinish = true; |
| | |
| | | public override void Run() |
| | | { |
| | | base.Run(); |
| | | |
| | | DoNext(); |
| | | } |
| | | |
| | | public override void DoNext() |
| | | { |
| | | base.DoNext(); |
| | | |
| | | // if (!playing()) |
| | | // packs.Dequeue(); |
| | | // actions = pack.Distribute(); |
| | | |
| | | // recordPlayer.Play(actions); |
| | | if (battleField.IsBattleEnd()) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (!battleField.recordPlayer.IsPlaying()) |
| | | { |
| | | battleField.DistributeNextPackage(); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | using UnityEngine; |
| | | using System.Collections.Generic; |
| | | |
| | | public class DodgeFinishAction : RecordAction |
| | | { |
| | | private bool isRun = false; |
| | | |
| | | public DodgeFinishAction(BattleField _battleField, BattleObject _dodgeObj) |
| | | : base(RecordActionType.DodgeFinish, _battleField, null) |
| | | { |
| | | |
| | | } |
| | | |
| | | public override bool IsFinished() |
| | | { |
| | | return isFinish; |
| | | } |
| | | |
| | | |
| | | public override void Run() |
| | | { |
| | | base.Run(); |
| | | |
| | | if (isRun) |
| | | return; |
| | | |
| | | battleObject.OnDodgeEnd(); |
| | | isFinish = true; |
| | | isRun = true; |
| | | } |
| | | |
| | | public override void ForceFinish() |
| | | { |
| | | //正常开始之后到界面出现之前都点不了 所以这边不用强制完成 接口留着 |
| | | |
| | | base.ForceFinish(); |
| | | // 完成就开始显示UI |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | fileFormatVersion: 2 |
| | | guid: 7099a0a534efb71459ccf57d9a8bc393 |
| | | MonoImporter: |
| | | externalObjects: {} |
| | | serializedVersion: 2 |
| | | defaultReferences: [] |
| | | executionOrder: 0 |
| | | icon: {instanceID: 0} |
| | | userData: |
| | | assetBundleName: |
| | | assetBundleVariant: |
| | |
| | | public SkillRecordAction(BattleField _battleField, BattleObject _caster, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> packList) |
| | | : base(RecordActionType.Skill, _battleField, _caster) |
| | | { |
| | | // Debug.LogError("_caster == null : " + (_caster == null)); |
| | | |
| | | skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField); |
| | | } |
| | | |
New file |
| | |
| | | using System; |
| | | using LitJson; |
| | | using UnityEngine; |
| | | using System.Collections.Generic; |
| | | |
| | | |
| | | public class StoryBossBattleField : BattleField |
| | | { |
| | | protected int chapter;// 章节 |
| | | protected int wave;// 波数 |
| | | protected int level;// 关卡 |
| | | protected JsonData extendData; |
| | | |
| | | protected MainChapterConfig chapterConfig; |
| | | |
| | | protected MainLevelConfig levelConfig; |
| | | |
| | | |
| | | public StoryBossBattleField(string _guid) : base(_guid) |
| | | { |
| | | |
| | | } |
| | | |
| | | public override void Init(int MapID, int FuncLineID, JsonData _extendData, |
| | | List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList) |
| | | { |
| | | base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList); |
| | | |
| | | chapter = FuncLineID / 10000; |
| | | wave = MapID == 1 ? FuncLineID % 100 : 1;//第几波怪 |
| | | level = (FuncLineID % 10000) / 100; |
| | | |
| | | extendData = _extendData; |
| | | chapterConfig = MainChapterConfig.Get(chapter); |
| | | levelConfig = MainLevelConfig.Get(level); |
| | | |
| | | SetBattleMode(BattleMode.Record); |
| | | } |
| | | |
| | | public override void Release() |
| | | { |
| | | base.Release(); |
| | | } |
| | | |
| | | |
| | | public override void AutoSetBattleMode() |
| | | { |
| | | SetBattleMode(BattleMode.Record); |
| | | } |
| | | |
| | | public override void TurnFightState(int TurnNum, int State, |
| | | uint FuncLineID, JsonData extendData) |
| | | { |
| | | base.TurnFightState(TurnNum, State, FuncLineID, extendData); |
| | | |
| | | switch (State) |
| | | { |
| | | // 起始状态标记 |
| | | case 0: |
| | | break; |
| | | case 1://准备完毕 |
| | | break; |
| | | case 2://战斗中 |
| | | break; |
| | | case 3://战斗结束 |
| | | break; |
| | | case 4://结算奖励 |
| | | break; |
| | | case 5://结束状态标记 |
| | | break; |
| | | default: |
| | | BattleDebug.LogError("recieve a unknown State"); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | protected override void OnSettlement(JsonData turnFightStateData) |
| | | { |
| | | base.OnSettlement(turnFightStateData); |
| | | } |
| | | |
| | | |
| | | public override void HaveRest() |
| | | { |
| | | // 主线BOSS战斗没有休息 |
| | | } |
| | | |
| | | |
| | | // public override void OnBattleEnd(JsonData turnFightStateData) |
| | | // { |
| | | // base.OnBattleEnd(turnFightStateData); |
| | | // // HaveRest(); |
| | | // } |
| | | |
| | | public override void Run() |
| | | { |
| | | if (operationAgent == null) |
| | | { |
| | | //防范异常 |
| | | return; |
| | | } |
| | | base.Run(); |
| | | } |
| | | |
| | | public override void DistributeNextPackage() |
| | | { |
| | | if (IsBattleFinish) |
| | | return; |
| | | |
| | | // 不要调用base的函数 |
| | | BattleManager.Instance.DistributeNextReportPackage(guid); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | fileFormatVersion: 2 |
| | | guid: 15d8291560cdd1449be24332792c7379 |
| | | MonoImporter: |
| | | externalObjects: {} |
| | | serializedVersion: 2 |
| | | defaultReferences: [] |
| | | executionOrder: 0 |
| | | icon: {instanceID: 0} |
| | | userData: |
| | | assetBundleName: |
| | | assetBundleVariant: |
| | |
| | | switch (MapID) |
| | | { |
| | | case 1: |
| | | case 2: |
| | | battleField = new StoryBattleField(); |
| | | break; |
| | | case 2: |
| | | battleField = new StoryBossBattleField(guid); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | |
| | | if (!battleReportDict.TryGetValue(guid, out queue)) |
| | | { |
| | | queue = new Queue<GameNetPackBasic>(); |
| | | battleReportDict.Add(guid, queue); |
| | | } |
| | | |
| | | queue.Enqueue(vNetPack); |
| | |
| | | battlePackRelationList.Add(guid, uidList); |
| | | } |
| | | |
| | | uidList.Add(vNetPack.packUID); |
| | | if (!uidList.Contains(vNetPack.packUID)) |
| | | { |
| | | uidList.Add(vNetPack.packUID); |
| | | } |
| | | } |
| | | |
| | | public void PushPackUID(string guid, ulong packUID) |
| | | { |
| | | List<ulong> uidList = null; |
| | | |
| | | if (!battlePackRelationList.TryGetValue(guid, out uidList)) |
| | | { |
| | | uidList = new List<ulong>(); |
| | | battlePackRelationList.Add(guid, uidList); |
| | | } |
| | | |
| | | if (!uidList.Contains(packUID)) |
| | | { |
| | | uidList.Add(packUID); |
| | | } |
| | | } |
| | | |
| | | public BattleField GetBattleField(ulong packUID) |
| | |
| | | { |
| | | Queue<GameNetPackBasic> queue = null; |
| | | |
| | | |
| | | if (!battleReportDict.TryGetValue(guid, out queue)) |
| | | { |
| | | BattleDebug.LogError("DistributeNextReportPackage could not find queue for guid : " + guid); |
| | |
| | | |
| | | var pack = queue.Dequeue(); |
| | | |
| | | PackageRegedit.Distribute(pack); |
| | | // Debug.LogError("DistributeNextReportPackage for guid : " + guid + " pack type : " + pack.GetType()); |
| | | |
| | | try |
| | | { |
| | | if (pack is CustomHB426CombinePack combinePack) |
| | | { |
| | | combinePack.Distribute(); |
| | | } |
| | | else if (pack is CustomB421ActionPack actionPack) |
| | | { |
| | | actionPack.Distribute(); |
| | | } |
| | | else |
| | | { |
| | | PackageRegedit.Distribute(pack); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Debug.LogError("DistributeNextPackage: 分发包异常 " + ex); |
| | | // 出错时主动移除当前包,防止死循环 |
| | | if (packQueue.Count > 0) |
| | | { |
| | | packQueue.Dequeue(); |
| | | } |
| | | } |
| | | |
| | | if (queue.Count <= 0) |
| | | { |
| | |
| | | return; |
| | | } |
| | | |
| | | onBattleFieldDestroy?.Invoke(battleField.guid, battleField); |
| | | battleField.Release(); |
| | | |
| | | string guid = battleField.guid; |
| | | |
| | | if (battleFields.ContainsKey(guid)) |
| | | { |
| | | battleFields.Remove(guid); |
| | | } |
| | | battleFields.Remove(guid); |
| | | battleReportDict.Remove(guid); |
| | | battlePackRelationList.Remove(guid); |
| | | |
| | | if (storyBattleField == battleField) |
| | | { |
| | |
| | | } |
| | | |
| | | GameObject.DestroyImmediate(battleField.battleRootNode.gameObject); |
| | | |
| | | onBattleFieldDestroy?.Invoke(battleField.guid, battleField); |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | var heroInfoBarScale = heroInfoBar.transform.localScale; |
| | | heroInfoBarScale.x *= Camp == BattleCamp.Red ? 1 : -1; |
| | | heroInfoBar.transform.localScale = heroInfoBarScale; |
| | | |
| | | |
| | | heroInfoBar.SetActive(true); |
| | | } |
| | | |
| | | |
| | |
| | | break; |
| | | case PlayerDataType.MaxHP: |
| | | teamHero.maxHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx); |
| | | heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp); |
| | | break; |
| | | case PlayerDataType.XP: |
| | | long toXp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx); |
| | | heroInfoBar.UpdateHP(teamHero.rage, toXp, 100); |
| | | heroInfoBar.UpdateXP(teamHero.rage, toXp, 100); |
| | | teamHero.rage = (int)GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx); |
| | | break; |
| | | default: |
| | | Debug.LogError("BattleObject.ObjInfoRefresh 出现意外类型 " + _refreshInfo.RefreshType.ToString()); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | public void ObjPropertyRefreshView(HB418_tagSCObjPropertyRefreshView vNetData) |
| | | { |
| | | switch ((PlayerDataType)vNetData.RefreshType) |
| | | { |
| | | case PlayerDataType.HP: |
| | | long toHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx); |
| | | heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp); |
| | | teamHero.curHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx); |
| | | break; |
| | | case PlayerDataType.MaxHP: |
| | | teamHero.maxHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx); |
| | | heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp); |
| | | break; |
| | | case PlayerDataType.XP: |
| | | long toXp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx); |
| | | heroInfoBar.UpdateXP(teamHero.rage, toXp, 100); |
| | | teamHero.rage = (int)GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx); |
| | | break; |
| | | default: |
| | | Debug.LogError("BattleObject.ObjPropertyRefreshView 出现意外类型 " + vNetData.RefreshType.ToString()); |
| | | break; |
| | | } |
| | | } |
| | |
| | | |
| | | public virtual void Hurt(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig) |
| | | { |
| | | PopDamage(damageValues, hurt, skillConfig); |
| | | PopDamage(damageValues, _totalDamage, hurt, skillConfig); |
| | | |
| | | motionBase.PlayAnimation(MotionName.hit, false); |
| | | |
| | | // 扣血流给别的敌方刷新好了 |
| | | teamHero.curHp -= _totalDamage; |
| | | } |
| | | |
| | | public void SuckHp(uint suckHP, SkillConfig skillConfig) |
| | |
| | | { |
| | | float pingpongTime = 0.2f; |
| | | RectTransform rectTrans = heroRectTrans; |
| | | var tween = rectTrans.DOAnchorPos(new Vector3(-50, 50, 0), pingpongTime) |
| | | var tween = rectTrans.DOAnchorPos(new Vector3(-30, 0, 0), pingpongTime) |
| | | .SetEase(Ease.OutCubic); |
| | | |
| | | battleField.battleTweenMgr.OnPlayTween(tween); |
| | | } |
| | | |
| | | // 闪避结束 |
| | | public virtual void OnDodgeEnd() |
| | | public virtual void OnDodgeEnd(Action _complete = null) |
| | | { |
| | | float pingpongTime = 0.2f; |
| | | RectTransform rectTrans = heroRectTrans; |
| | |
| | | var tween = rectTrans.DOAnchorPos(Vector3.zero, pingpongTime) |
| | | .SetEase(Ease.OutCubic); |
| | | |
| | | tween.onComplete += () => |
| | | { |
| | | _complete?.Invoke(); |
| | | }; |
| | | |
| | | battleField.battleTweenMgr.OnPlayTween(tween); |
| | | } |
| | | |
| | | public virtual void OnDeath(Action _onDeathAnimationComplete) |
| | | { |
| | | onDeathAnimationComplete = _onDeathAnimationComplete; |
| | | motionBase.PlayAnimation(MotionName.dead, false); |
| | | motionBase.PlayAnimation(MotionName.dead, false, () => |
| | | { |
| | | teamHero.isDead = true; |
| | | OnDeadAnimationComplete(); |
| | | _onDeathAnimationComplete?.Invoke(); |
| | | }); |
| | | } |
| | | |
| | | // 不一定可靠 有时候会插入其他动作就完了 |
| | | protected virtual void OnAnimationComplete(string motionName) |
| | | { |
| | | if (motionName == MotionName.dead.ToString().ToLower()) |
| | | { |
| | | OnDeadAnimationComplete(); |
| | | onDeathAnimationComplete?.Invoke(); |
| | | onDeathAnimationComplete = null; |
| | | } |
| | | |
| | | } |
| | | |
| | | protected virtual void OnDeadAnimationComplete() |
| | |
| | | } |
| | | |
| | | // 伤害还要看 是否闪避 暴击 and so on 需要有一个DamageType 服务器应该会给 |
| | | protected virtual void PopDamage(List<long> damageValues, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig) |
| | | protected virtual void PopDamage(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig) |
| | | { |
| | | BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, hurt, skillConfig); |
| | | |
| | | if (battleDmgInfo.IsType(DamageType.Dodge)) |
| | | { |
| | | OnDodgeBegin(); |
| | | DodgeFinishAction dodgeFinish = new DodgeFinishAction(battleField, this); |
| | | battleField.recordPlayer.InsertRecord(dodgeFinish); |
| | | } |
| | | |
| | | heroInfoBar.UpdateHP(teamHero.curHp, Math.Max(0, teamHero.curHp - _totalDamage), teamHero.maxHp); |
| | | teamHero.curHp = Math.Max(0, teamHero.curHp - _totalDamage); |
| | | |
| | | // YYL TODO 是否需要挂在在自身的follow点上 |
| | | EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo); |
| | |
| | | // 休息状态 |
| | | // 多一个zzz的一个特效 |
| | | heroGo.SetActive(true); |
| | | motionBase.PlayAnimation(MotionName.idle, true); |
| | | motionBase.HaveRest(); |
| | | heroRectTrans.anchoredPosition = Vector2.zero; |
| | | |
| | | heroInfoBar.SetActive(false); |
| | | } |
| | | |
| | | public void PushDropItems(BattleDrops _battleDrops) |
| | |
| | | |
| | | public virtual void Release() |
| | | { |
| | | trackEntryCompleteDict.Clear(); |
| | | if (spineAnimationState != null) |
| | | { |
| | | spineAnimationState.Complete -= OnAnimationComplete; |
| | |
| | | skeletonGraphic.timeScale = MotionTimeScale; |
| | | } |
| | | |
| | | public void HaveRest() |
| | | { |
| | | trackEntryCompleteDict.Clear(); |
| | | PlayAnimation(MotionName.idle, true); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | |
| | | } |
| | |
| | | BuffMount,//挂载增益 |
| | | |
| | | BattleStart,//战斗开始 |
| | | |
| | | DodgeFinish,//闪避完成 |
| | | } |
| | |
| | | |
| | | private bool isWaitingNextAction = false; |
| | | private float waitTimer = 0f; |
| | | private const float waitInterval = 0.2f; |
| | | private const float waitInterval = 0f; |
| | | |
| | | public void Init(BattleField _battleField) |
| | | { |
| | |
| | | DashCast(OnAttackFinish); |
| | | break; |
| | | default: |
| | | Debug.LogError("暂时不支持其他的方式释放 有需求请联系策划 技能id:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition); |
| | | OnSkillFinished(); |
| | | Debug.LogError("强制结束技能 暂时不支持其他的方式释放 有需求请联系策划 技能id:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition); |
| | | ForceFinished(); |
| | | break; |
| | | } |
| | | |
| | |
| | | protected void DashCast(Action _onComplete) |
| | | { |
| | | Debug.LogError("DashCast 还没实现"); |
| | | ForceFinished(); |
| | | // YYL TODO |
| | | |
| | | // var entry = caster.motionBase.PlayAnimation(skillConfig.GetMotionName(), false); |
| | |
| | | case 5: |
| | | SelfShoting(); |
| | | break; |
| | | default: |
| | | Debug.LogError("子弹特效没有配置正确的TagAim,强制结束子弹特效 TagAim: " + skillConfig.TagAim); |
| | | ForceFinished(); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | |
| | | private void VerticalRowShoting() |
| | | { |
| | | // 纵排分别为1、4,2、5,3、6,三组纵排,按对位规则选择,默认1号、2号或3号为主目标,前排1、2、3号位置全部死完后,4号、5号或6号为主目标 |
| | | BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp(); |
| | | // 攻击mininumIndex目标 |
| | | int minimumIndex = int.MaxValue; |
| | | foreach (var hurt in tagUseSkillAttack.HurtList) |
| | | { |
| | | BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID); |
| | | if (target == null) |
| | | { |
| | | Debug.LogError("特效目标为空 target == null ObjId : " + hurt.ObjID); |
| | | continue; |
| | | } |
| | | |
| | | ShotEachTargets(); |
| | | minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex); |
| | | } |
| | | |
| | | if (minimumIndex != int.MaxValue) |
| | | { |
| | | ShotToIndex(battleCamp, minimumIndex); |
| | | } |
| | | else |
| | | { |
| | | Debug.LogError("纵排攻击没有目标 强制结束子弹特效"); |
| | | ForceFinished(); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | |
| | | protected List<string> messages = new List<string>(); |
| | | |
| | | public BasicHeroInfoContainer heroInfoContainer; |
| | | |
| | | |
| | | public BattleTips textTips; |
| | | |
| | | protected Tween hpTween; |
| | |
| | | battleObject = _battleObject; |
| | | heroInfoContainer.SetHeroInfo(battleObject.teamHero); |
| | | RefreshBuff(buffList); |
| | | UpdateHP(battleObject.teamHero.curHp, battleObject.teamHero.curHp, battleObject.teamHero.maxHp, false); |
| | | UpdateXP(battleObject.teamHero.rage, battleObject.teamHero.rage, 100, false); |
| | | } |
| | | |
| | | public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas) |
| | |
| | | } |
| | | |
| | | |
| | | public void UpdateHP(long fromHp, long toHp, long maxHp) |
| | | public void UpdateHP(long fromHp, long toHp, long maxHp, bool tween = true) |
| | | { |
| | | // 做hp增加或者减少的动画 |
| | | // sliderHp.value = ((float)fromHp) / ((float)maxHp); |
| | |
| | | { |
| | | battleObject.battleField.battleTweenMgr.OnKillTween(hpTween); |
| | | } |
| | | hpTween = sliderHp.DOValue((float)toHp / maxHp, 0.3f); |
| | | battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween); |
| | | |
| | | if (tween) |
| | | { |
| | | hpTween = sliderHp.DOValue((float)toHp / (float)maxHp, 0.3f); |
| | | battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween); |
| | | } |
| | | else |
| | | { |
| | | sliderHp.value = ((float)toHp) / ((float)maxHp); |
| | | } |
| | | |
| | | BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp); |
| | | } |
| | | |
| | | public void UpdateXP(long fromXp, long toXp, long maxXp) |
| | | public void UpdateXP(long fromXp, long toXp, long maxXp, bool tween = true) |
| | | { |
| | | // 做Xp增加或者减少的动画 |
| | | // sliderXp.value = ((float)fromXp) / ((float)maxXp); |
| | |
| | | { |
| | | battleObject.battleField.battleTweenMgr.OnKillTween(xpTween); |
| | | } |
| | | xpTween = sliderHp.DOValue((float)toXp / maxXp, 0.2f); |
| | | battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween); |
| | | |
| | | if (tween) |
| | | { |
| | | xpTween = sliderXp.DOValue((float)toXp / (float)maxXp, 0.2f); |
| | | battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween); |
| | | } |
| | | else |
| | | { |
| | | sliderXp.value = ((float)toXp) / ((float)maxXp); |
| | | } |
| | | |
| | | BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp); |
| | | } |
| | | |
| | |
| | | |
| | | public bool isDead |
| | | { |
| | | get |
| | | { |
| | | return curHp <= 0; |
| | | } |
| | | } |
| | | get; |
| | | set; |
| | | } = false; |
| | | |
| | | } |