public override void AutoTarget(AbilityInstance abilityInstance) { List <Character> enemyCharacters = abilityInstance.Caster.Team.EnemyTeam.Characters; abilityInstance.Targets.AddRange(enemyCharacters.Where( character => character.PositionHandler.Position == TeamPosition.Melee)); }
/// <summary> /// 设置所属玩家 /// </summary> /// <param name="_player"></param> public void SetPlayer(PlayerBase _player) { player = _player; defaultAbilityList.Clear(); defaultAbilityCount = 0; curDefaultAbilityIndex = 0; if (player == null) { return; } PlayerConfig playerRef = ConfigMng.Instance.GetPlayerConfig(player.Prof); if (playerRef != null) { List <int> list = playerRef.mormalSkillList; foreach (var item in list) { AbilityInstance abilityInstance = new AbilityInstance(item, 1, player, null); defaultAbilityList.Add(abilityInstance); } defaultAbilityCount = defaultAbilityList.Count; curDefaultAbilityIndex = 0; if (playerRef.roundSkill != 0) { roundAbility = new AbilityInstance(playerRef.roundSkill, 1, player, null); } } }
/// <summary> /// 技能移动,一般是后台确认后才能调用该方法 by吴江 /// </summary> /// <param name="_instance"></param> public virtual void AbilityMove(AbilityInstance _instance) { if (moveFSM != null) { moveFSM.UseAbility(_instance); } }
/// <summary> /// 使用急救术 /// </summary> /// <param name="_instance"></param> public void C2S_UseAddHpAbility(AbilityInstance _instance) { Debug.logger.Log("使用急救术"); pt_scene_skill_c005 msg = new pt_scene_skill_c005(); msg.oid = (uint)_instance.UserActor.id; msg.skill = (uint)_instance.AbilityID; msg.lev = 1; msg.target_id = _instance.TargetActor == null ? 0 : (uint)_instance.TargetActor.id; msg.target_x = _instance.TargetPostion.x; msg.target_y = _instance.TargetPostion.y; msg.target_z = _instance.TargetPostion.z; msg.x = _instance.UserPostion.x; msg.y = _instance.UserPostion.y; msg.z = _instance.UserPostion.z; msg.dir = _instance.DirY; msg.seq = NetMsgMng.CreateNewUnLockSerializeID(); _instance.LastTryTime = Time.time; NetMsgMng.SendMsg(msg); _instance.serializeID = msg.seq; _instance.OnTringEnd += OnAbilityInstanceTringEnd; waitServerConfirmAbilityDic[msg.seq] = _instance; if (OnMainPlayerUseAbility != null && _instance.UserActor.id == GameCenter.curMainPlayer.id) { OnMainPlayerUseAbility(); } }
public void UseAbility(AbilityInstance _instance, System.Action _shake, System.Action _finish) { if (animFSM != null) { animFSM.DoPreviewAnim(_instance, fxCtrl, _shake, _finish); } }
IEnumerator CouPreloadModel() { while (ConfigMng.Instance.Pendings > 0) { yield return(new WaitForFixedUpdate()); } if (GameCenter.loginMng.createPlayerInfoDic.Count == 0) { GameCenter.loginMng.InitCreatePlayerInfo(); foreach (PlayerBaseInfo item in GameCenter.loginMng.createPlayerInfoDic.Values) { CreatePlayer preloadPlayer = CreatePlayer.CreateDummy(item); preloadPlayer.StartAsyncCreate(() => { preloadPlayer.transform.position = new Vector3(-1000, -1000, -1000); }); AbilityInstance ability = new AbilityInstance(item.CreateAbilityID, 1, null, null); if (ability != null) { string effectName = ability.ProcessEffectList.Count > 0 ? ability.ProcessEffectList[0] : string.Empty; if (!string.IsNullOrEmpty(effectName)) { AssetMng.GetEeffctAssetObject(effectName, (x) => { }); //AssetMng.GetEffectInstance(effectName, null);//预加载特效 } } } } }
public List <Character> GetAITargets(AbilityInstance abInst) { AbilityTargeting targeting = abInst.Ability.Template.Targeting; List <Character> candidates = targeting.GetCandidates(abInst.Caster); int numTargetsReq = targeting.NumTargetsRequired; if (candidates.Count == 0 || (candidates.Count < numTargetsReq && targeting.CannotRepeatSelection)) { return(null); } List <Character> prioritizedCandidates = candidates.OrderByDescending(GetSelector(firstPriority)). ThenBy(GetSelector(secondPriority)).ToList(); tempTargets.Clear(); for (int i = 0; i < numTargetsReq; i++) { for (int j = 0; j < prioritizedCandidates.Count; j++) { if (j == prioritizedCandidates.Count - 1 || HelperMethods.CheckChance(1 - priorityDeviation)) { tempTargets.Add(prioritizedCandidates[j]); if (targeting.CannotRepeatSelection) { tempTargets.Remove(prioritizedCandidates[j]); } break; } } } return(tempTargets); }
public override void ActivateAbility(List <Target> targets, AbilityInstance instance) { if (instance.owner.owner.resources.value >= instance.owner.cost) { GameSystem.Instance.resourceSystem.WithdrawResources(instance.owner.owner, instance.owner.cost); int counter = 0; if (damageAmounts != null && targets != null) //check for nulls { if (targets.Count > 0) //check that there are any targets { new SpellCardActivateCommand(instance.owner.cardView).AddToQueue(); foreach (Target target in targets) //perform actions on all targets { if (counter < damageAmounts.Count) //if there is a damage value for the next target { GameSystem.Instance.actionSystem.ExecuteAction(new AttackAction(target, instance.owner, damageAmounts[counter])); //target.Damage(damageAmounts[counter]); //apply damage counter++; //increment counter of damage values to apply to targets } } } } instance.owner.RemoveCard(); } }
public void SetCurPlayer(PlayerBaseInfo _info) { if (originalPosition != Vector3.zero && camera != null) { camera.transform.localPosition = originalPosition; } if (curCreatePlayer != null) { DestroyImmediate(curCreatePlayer.gameObject); curCreatePlayer = null; } if (_info == null) { return; } if (dragRotation != null) { dragRotation.SetObjRotY(180); dragRotation.SetEnable(false);//震动中不让拖动旋转,否则相机位置会偏差很大 } curCreatePlayer = CreatePlayer.CreateDummy(_info); curCreatePlayer.transform.position = positionTransform.position; curCreatePlayer.StartAsyncCreate(() => { AbilityInstance ability = new AbilityInstance(_info.CreateAbilityID, 1, curCreatePlayer, null); curCreatePlayer.UseAbility(ability, () => { ShakeCamera(ability.ProcessShakeV3, (ability.ProcessShakePowerList.Count > 0 ? ability.ProcessShakePowerList[0] : 0.2f)); }, FinishAbility); }); }
public void Show() { Self = Object.Instantiate( _loadObjectsManager.GetObjectByPath <GameObject>("Prefabs/UI/Popups/OverlordAbilityPopup")); Self.transform.SetParent(_uiManager.Canvas3.transform, false); _continueButton = Self.transform.Find("Button_Continue").GetComponent <Button>(); _cancelButton = Self.transform.Find("Button_Cancel").GetComponent <Button>(); _continueButton.onClick.AddListener(ContinueButtonOnClickHandler); _cancelButton.onClick.AddListener(CancelButtonOnClickHandler); _title = Self.transform.Find("Title").GetComponent <TextMeshProUGUI>(); _skillName = Self.transform.Find("SkillName").GetComponent <TextMeshProUGUI>(); _skillDescription = Self.transform.Find("SkillDescription").GetComponent <TextMeshProUGUI>(); _abilitiesGroup = Self.transform.Find("Abilities").gameObject; _heroImage = Self.transform.Find("HeroImage").GetComponent <Image>(); _abilities.Clear(); for (int i = 0; i < AbilityListSize; i++) { AbilityInstance abilityInstance = new AbilityInstance(_abilitiesGroup.transform); abilityInstance.SelectionChanged += AbilityInstanceOnSelectionChanged; _abilities.Add(abilityInstance); } }
/// <summary> /// 被技能影响 by吴江 /// </summary> /// <param name="_info"></param> public virtual void BeInfluencedByOther(AbilityInstance _instance, st.net.NetBase.skill_effect _result) { if (IsActor) { return; } unFinishedAbilityResultList.Add(new AbilityResultInfo(_instance, _result)); }
public bool IsRoundAbility(AbilityInstance _abilityInstance) { if (roundAbility != null && _abilityInstance != null && _abilityInstance.AbilityID == roundAbility.AbilityID) { return(true); } return(false); }
public CardInstance(Card card) { //TODO : write method to generate unique instance IDs this.card = card; this.power = card.power; this.cost = card.cost; if (card.ability != null) { this.abilityInstance = card.ability.GetInstance(this); } }
public void OnClickSkillBtnActon(int _btnIndex) { if (PlayerInputListener.isDragingRockerItem)//如果在拖动摇杆移动不能释放技能 add by黄洪兴 { return; } if (!GameCenter.curMainPlayer.inputListener.CheckLock()) { GameCenter.messageMng.AddClientMsg(58); return; //如果是锁定操作状态,那么不能使用技能 add by吴江 } //测试技能 if (!SkillButton[_btnIndex].HadLearn) { GameCenter.messageMng.AddClientMsg(42); return; } if (!SkillButton[_btnIndex].HadMp) { GameCenter.messageMng.AddClientMsg(43); return; } if (SkillButton[_btnIndex].IsDown != true) { if (GameCenter.curMainPlayer.isRigidity) { return; } if (SkillButton [_btnIndex].skillInfo == null) { return; } int ID = SkillButton [_btnIndex].skillInfo.SkillID; //AbilityInstance curInstance = GameCenter.curMainPlayer.curTryUseAbility; AbilityInstance thisInstance = GameCenter.skillMng.abilityDic[ID]; if (GameCenter.curMainPlayer.IsSilent && thisInstance.thisSkillMode == SkillMode.CLIENTSKILL) { GameCenter.messageMng.AddClientMsg(59); return; //如果是沉默状态,那么不能使用技能 add by吴江 } //if (curInstance != null && curInstance == thisInstance && curInstance.TargetActor == GameCenter.curMainPlayer.CurTarget && !curInstance.HasServerConfirm) //{ // return; //} GameCenter.curMainPlayer.CancelCommands(); thisInstance.ResetResult(GameCenter.curMainPlayer.CurTarget as SmartActor); thisInstance.SetActor(GameCenter.curMainPlayer, GameCenter.curMainPlayer.CurTarget as SmartActor); GameCenter.curMainPlayer.TryUseAbility(thisInstance, true); // if (GameCenter.curMainPlayer.AttakType != MainPlayer.AttackType.AUTOFIGHT) // { // GameCenter.curMainPlayer.GoNormalFight(); // } } }
public void DoPreviewAnim(AbilityInstance curCastAbility, FXCtrl _fxCtrl, System.Action _shake, System.Action _finish) { animName = curCastAbility.ProcessAnimationNameList.Count > 0?curCastAbility.ProcessAnimationNameList[0]:string.Empty; effectName = curCastAbility.ProcessEffectList.Count > 0?curCastAbility.ProcessEffectList[0]:string.Empty; shakeTimeList = new List <int>(curCastAbility.ProcessShakeTimeList);//需要新构造一个,否则会被Remove到长度0 fxCtrl = _fxCtrl; OnShakeEvent = _shake; OnFinish = _finish; //Debug.Log("animName:"+animName+",effectName:"+effectName); stateMachine.Send((int)EventType.SelectedEnd); }
///// <summary> ///// 服务端通知使用技能 by吴江 ///// </summary> ///// <param name="_info"></param> //public void UseAbility(AbilityInfo _info) //{ // if (_info == null) return; // StopMovingTo(); // if (_info.MoveType != AbilityType.Normal) // { // waitForActMoveAbilityList.Add(new AbilityMoveData(_info, this.gameObject)); // stateMachine.Send((int)EventType.ABILITYMOVE); // } //} /// <summary> /// 客户端通知使用技能 by吴江 /// </summary> /// <param name="_info"></param> public void UseAbility(AbilityInstance _instance) { if (!_instance.HasServerConfirm || (_instance.endPosX == 0 && _instance.endPosZ == 0)) { return; } if (_instance.PerformanceRef.selfShiftType != SelfShiftType.NO) { waitForActMoveAbilityList.Add(new AbilityMoveData(_instance, this.gameObject)); stateMachine.Send((int)EventType.ABILITYMOVE); } }
public AbilityBallisticCurveInfo(AbilityInstance _data) { lockData = _data; configID = (int)_data.ArrowID; instanceID = CreateLockInstanceID(); target = _data.TargetActor; isLock = true; if (target != null) { direction = (target.transform.position - startPos).normalized; } }
public virtual bool SelectTargetCheck(Character selected, AbilityInstance abilityInstance) { Character caster = abilityInstance.Caster; return(!selected.HealthHandler.Dead && (canSelectAllies || selected.Team != caster.Team) && (canSelectEnemies && selected.Targetable || selected.Team == caster.Team) && (canSelectMelee || selected.PositionHandler.Position != TeamPosition.Melee) && (canSelectSupport || selected.PositionHandler.Position != TeamPosition.Support) && (!cannotSelectSelf || selected == caster) && (!cannotSelectLastMelee || selected.PositionHandler.CanDoRepositionAction) && (!cannotRepeatSelection || !abilityInstance.Targets.Contains(selected))); }
public static AbilityInstance NewAbility(Ability ability = null, Character caster = null) { AbilityInstance instance = GetNextInstance(); instance.Ability = ability; instance.Caster = caster; instance.Targets.Clear(); instance.OnStart.RemoveAllListeners(); instance.OnComplete.RemoveAllListeners(); instance.OnCancel.RemoveAllListeners(); instance.isActive = true; return(instance); }
/// <summary> /// 强制结束技能,限制切换场景的时候使用 /// </summary> public virtual void ForceCancelAbility() { if (moveFSM != null) { moveFSM.CancelAbility(); } if (animFSM != null) { animFSM.StopCast(); } curTryUseAbility = null; TickAnimation(); }
void ManualTarget(AbilityInstance abilityInstance) { TargetingController targetingController = abilityInstance.Caster.Team.TargetingController; targetingController.ChooseNewTargets(Template.Targeting.NumTargetsRequired, character => Template.Targeting.SelectTargetCheck(character, abilityInstance), targets => { abilityInstance.Targets.AddRange(targets); abilityInstance.Execute(); }, abilityInstance.Cancel); }
void UseAITargets(AbilityInstance abilityInstance, TargetingAI aiTargeting = null) { if (aiTargeting == null) { return; } List <Character> targets = aiTargeting.GetAITargets(abilityInstance); if (targets != null) { abilityInstance.Targets.AddRange(targets); } }
protected void OnAbilityInstanceTringEnd(uint _serializeID) { if (waitServerConfirmAbilityDic.ContainsKey(_serializeID)) { AbilityInstance ins = waitServerConfirmAbilityDic[_serializeID] as AbilityInstance; if (ins != null) { ins.OnTringEnd -= OnAbilityInstanceTringEnd; ins.serializeID = 0; } waitServerConfirmAbilityDic.Remove(_serializeID); } }
/// <summary> /// 尝试战斗 by吴江 /// </summary> /// <param name="_curType">当前状态</param> /// <param name="_nextType">下一顺位的状态</param> protected void TryFight(EventType _curType, EventType _nextType, float _checkRange) { if (CheckNeedTeleport()) { return; } if (lastNormalAbilityInstance != null && !lastNormalAbilityInstance.HasServerConfirm && !lastNormalAbilityInstance.IsTringEnd) { return; } if ((thisPlayer.transform.position - owner.transform.position).sqrMagnitude > _checkRange * _checkRange) { stateMachine.Send((int)_nextType); return; } if (thisTarget == null || thisTarget.isDead) { thisTarget = TryTarget(_curType); } if (thisTarget == null || thisTarget.isDead) { stateMachine.Send((int)_nextType); } else { if (IsUseLoseHitAbility) { return; } if (thisTarget != null) { TryTalk(EntourageTalkType.ATTACK); if (!thisPlayer.isRigidity && !thisPlayer.IsProtecting && !commandMng.HasCommand()) { if (lastNormalAbilityInstance != null && !lastNormalAbilityInstance.HasServerConfirm) { Debug.LogError("Catch: 捕捉到上一次普通攻击尚未获得后台确认,前台即发动下一次普通攻击!"); } AbilityInstance instance = thisPlayer.abilityMng.GetNextEntourageAbility(thisTarget); //Debug.Log("TryUseAbility:"+(instance==null?"null":instance.AbilityName)+",Time:"+Time.realtimeSinceStartup); if (instance != null) { thisPlayer.TryUseAbility(instance, true); lastNormalAbilityInstance = instance; startNoTargetTime = Time.time; } } } } return; }
/// <summary> /// 禁止外部使用 /// </summary> /// <param name="_instance"></param> public override void UseAbility(AbilityInstance _instance) { if (isDead) { return; } if (_instance.thisSkillMode != SkillMode.NORMALSKILL && isSilent) { return; } curTryUseAbility = null; base.UseAbility(_instance); abilityMng.C2S_UseAbility(_instance); }
public bool CastAbility(AbilityType abilityType, TargetingAI aiTargeting = null) { if (!Character.Available) { Debug.Log("Character busy, not active, or incapacitated"); return(false); } if (casting.Value) { Debug.Log("Already casting a spell"); return(false); } Ability ability = GetAbility(abilityType); if (ability == null) { Debug.LogError("Ability doesn't exist"); return(false); } if (!ability.CanCast) { Debug.Log("Ability can't cast"); return(false); } AbilityInstance abInst = ability.GetNewInstance(Character); abInst.OnStart.AddListener(() => { casting.Value = true; Character.ActionPointHandler.UseActionPoints(ability.Template.ActionPointCost); }); abInst.OnComplete.AddListener(() => { casting.Value = false; Character.Mover.DoneInMelee(); }); abInst.OnCancel.AddListener(() => { casting.Value = false; Character.Mover.DoneInMelee(); }); return(ability.StartCasting(aiTargeting)); }
/// <summary> /// 获取下一次普通攻击的类型 /// </summary> /// <returns></returns> public AbilityInstance GetNextDefaultAbility(SmartActor _target) { if (LastDefaultAbility != null && LastDefaultAbility.RestCD <= 0) { ResetDefaultAbility(); //普攻CD结束,则重置到第一个普攻 } int curIndex = CountCurIndex(curDefaultAbilityIndex, defaultAbilityCount); AbilityInstance instance = defaultAbilityList[curIndex]; if (instance != null) { instance.ResetResult(_target); return(instance); } return(null); }
protected void S2C_OnAbilityCancelWarnning(Pt _info) { pt_scene_skill_aleret_cancel_c022 msg = _info as pt_scene_skill_aleret_cancel_c022; if (msg != null) { ObjectType type = (ObjectType)msg.obj_sort; SmartActor user = null; switch (type) { case ObjectType.Player: if ((int)msg.oid == GameCenter.mainPlayerMng.MainPlayerInfo.ServerInstanceID) { user = GameCenter.curMainPlayer; } else { user = GameCenter.curGameStage.GetOtherPlayer((int)msg.oid) as SmartActor; } break; case ObjectType.MOB: user = GameCenter.curGameStage.GetMOB((int)msg.oid) as SmartActor; break; case ObjectType.Entourage: user = GameCenter.curGameStage.GetEntourage((int)msg.oid) as EntourageBase; break; default: break; } if (user != null) { AbilityInstance instance = user.curTryUseAbility; if (instance == null) { return; } if (instance.AbilityID == msg.skill && instance.RuneID == msg.skill_rune && instance.Level == msg.lev && instance.NeedPrepare && !instance.HasServerConfirm) { user.CancelAbility(); } } } }
public void AddCDTime(AbilityInstance _ability) { ability = _ability; if (ability.HasServerConfirm) { CurTime = ability.RestCD; if (ability.RestCD > 0) { isdown = true; } } else { CurTime = CoolingTime; } // Debug.Log("当前冷却时间为" + CurTime); }
public override void ActivateAbility(List <Target> targets, AbilityInstance instance) { if (instance.owner.owner.resources.value >= instance.owner.cost) { if (targets != null && targets.Count > 0) { GameSystem.Instance.resourceSystem.WithdrawResources(instance.owner.owner, instance.owner.cost); foreach (Target target in targets) { target.Heal(healAmount); } new SpellCardActivateCommand(instance.owner.cardView).AddToQueue(); instance.owner.RemoveCard(); } } }