protected void OnEnablerViewportExited(Godot.Object viewport) { if (TargetPlayer != null && TargetPlayer.TargetMob == this) { TargetPlayer.ReleaseTarget(); } }
protected void setStartVariables() { myTransform = transform; myRigidBody = GetComponent<Rigidbody>(); roomController = transform.parent.GetComponent<RoomController> (); moveSpeed = GetComponent<EnemyStats>().moveSpeed; p1_Object = GameObject.Find ("P1"); p2_Object = GameObject.Find ("P2"); timer = Random.Range(1, 50); foreach (Transform child in transform) { if (child.name != "SpawnParticles" && child.tag != "Hitspark") { enemyAnimator = child.GetComponent<Animator> (); } } Vector3 predictedPlayerPos1 = p1_Object.transform.position + p1_Object.GetComponent<Rigidbody>().velocity * Time.deltaTime; Vector3 predictedPlayerPos2 = p2_Object.transform.position + p2_Object.GetComponent<Rigidbody>().velocity * Time.deltaTime; Transform p1_Transform = p1_Object.transform; Transform p2_Transform = p2_Object.transform; // Predicted distance float dist_1 = Vector3.Distance(myTransform.position, predictedPlayerPos1); float dist_2 = Vector3.Distance(myTransform.position, predictedPlayerPos2); if (dist_1 < dist_2) { targetPlayer = new TargetPlayer(GameObject.Find ("P1"), p1_Transform, dist_1); } else { targetPlayer = new TargetPlayer(GameObject.Find ("P2"), p2_Transform, dist_2); } }
protected void setStartVariables() { myTransform = transform; myRigidBody = GetComponent <Rigidbody>(); roomController = transform.parent.GetComponent <RoomController> (); moveSpeed = GetComponent <EnemyStats>().moveSpeed; p1_Object = GameObject.Find("P1"); p2_Object = GameObject.Find("P2"); timer = Random.Range(1, 50); foreach (Transform child in transform) { if (child.name != "SpawnParticles" && child.tag != "Hitspark") { enemyAnimator = child.GetComponent <Animator> (); } } Vector3 predictedPlayerPos1 = p1_Object.transform.position + p1_Object.GetComponent <Rigidbody>().velocity *Time.deltaTime; Vector3 predictedPlayerPos2 = p2_Object.transform.position + p2_Object.GetComponent <Rigidbody>().velocity *Time.deltaTime; Transform p1_Transform = p1_Object.transform; Transform p2_Transform = p2_Object.transform; // Predicted distance float dist_1 = Vector3.Distance(myTransform.position, predictedPlayerPos1); float dist_2 = Vector3.Distance(myTransform.position, predictedPlayerPos2); if (dist_1 < dist_2) { targetPlayer = new TargetPlayer(GameObject.Find("P1"), p1_Transform, dist_1); } else { targetPlayer = new TargetPlayer(GameObject.Find("P2"), p2_Transform, dist_2); } }
void CheckIfHitTarget(string hitInfo, bool bLastHit = false) { string pattern = @"([\w\s]+)\\+(\d+\.?\d+)\\+(\d+\.?\d+)\\+(\d+\.?\d+)\\+(\d+\.?\d+)\\+(\d+)"; MatchCollection matches = Regex.Matches(hitInfo, pattern); AttackInfo info = new AttackInfo( matches[0].Groups[1].Value, float.Parse(matches[0].Groups[2].Value), float.Parse(matches[0].Groups[3].Value), float.Parse(matches[0].Groups[4].Value), float.Parse(matches[0].Groups[5].Value), (EKnockBackDirection)(int.Parse(matches[0].Groups[6].Value)) ); #if UNITY_EDITOR bDraw = true; pos = bones[info.BoneName].position; radius = info.Radius; #endif Collider[] cols = Physics.OverlapSphere(bones[info.BoneName].position, info.Radius); if (cols.Length != 0) { foreach (Collider c in cols) { if (c.name != this.name && c.tag == "Player") { if (TargetPlayer) { bHit = true; TargetPlayer.TakeDamage(info.Damage, bLastHit, info.KnockBackDis, info.KnockBackDur, info.Direction); } } } } }
/// <summary> /// Update the enemy's target list /// </summary> private void UpdateTargetList() { // Check if any players are missing from list foreach (GameObject player in PlayerManager.Instance.Players) { if (_targets.Count(p => p.Player == player) == 0) { TargetPlayer target = new TargetPlayer { Player = player, Stats = player.GetComponent <EntityStatsController>() }; _targets.Add(target); } } foreach (TargetPlayer target in _targets) { if (CanSee(target)) { // Set player to known state target.IsKnown = true; } else if (target.IsKnown) { // Reset player target's state if out of sight target.IsKnown = false; target.Aggro = 0f; } } }
/// <summary> /// Checks whether an enemy can see a target or not /// </summary> /// <returns>True if the enemy can see the target</returns> private bool CanSee(TargetPlayer target) { if (Physics.Linecast(transform.position + Vector3.up, target.Player.transform.position + Vector3.up, out RaycastHit hit)) { return((target.Player.transform.position - transform.position).sqrMagnitude <= aggroRadius * aggroRadius && hit.transform.gameObject == target.Player); } return(false); }
/// <summary> /// Update the aggro value of a certain target /// </summary> /// <param name="player">Player GameObject that is attacking the enemy</param> /// <param name="damageAmount">Amount to update the targets aggro value by</param> public void OnDamageTaken(GameObject player, float damageAmount) { // Update aggro value with amount of damage taken TargetPlayer target = _targets.Find(t => t.Player == player); target.Aggro += damageAmount; target.IsKnown = true; }
private void Start() { // Initialize target array _targets = new List <TargetPlayer>(); foreach (GameObject player in PlayerManager.Players) { TargetPlayer target = new TargetPlayer { Player = player, Stats = player.GetComponent <EntityStatsController>() }; _targets.Add(target); } }
private void btnHeal_Click(object sender, EventArgs e) { if (!CanDoHeal()) { return; } Arena.Self.AddActionPoints(-3); TargetPlayer.AddHealth(3); this.Refresh(); }
void OnTriggerEnter2D(Collider2D col) { TargetPlayer player = col.GetComponent <TargetPlayer>(); if (player != null) { player.TakeDamagePlayer(damage); } GameObject newObject = Instantiate(explosion, transform.position, Quaternion.identity) as GameObject; // instatiate the object newObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f); Destroy(); }
public bool IsInVisionOfPlayer(Transform transform) { TargetPlayer = null; foreach (var p in Manager.Players) { if (Vector3.Distance(transform.position, p.transform.position) < PlayerVisionRadius) { TargetPlayer = p; TargetPlayerCollider = TargetPlayer.GetComponent <Collider>(); TargetPlayerCamera = TargetPlayer.GetComponentInChildren <Camera>(); return(true); } } return(false); }
/// <summary> /// Find the nearest player to the enemy /// </summary> /// <returns>A target player object instance</returns> private TargetPlayer GetClosestTarget() { TargetPlayer targetPlayer = null; float minDist = Mathf.Infinity; foreach (TargetPlayer target in _targets) { float distance = (target.Player.transform.position - transform.position).sqrMagnitude; if (target.IsKnown && distance < minDist && CanSee(target)) { minDist = distance; targetPlayer = target; } } return(targetPlayer); }
/// <summary> /// Update the target player by prioritizing any attacking players /// </summary> /// <returns>A target player object instance</returns> private TargetPlayer GetTopAggroTarget() { TargetPlayer targetPlayer = null; float maxAggro = 0f; foreach (TargetPlayer target in _targets) { // Ensure the target is known, and has an aggro value over zero if (target.IsKnown && target.Aggro > maxAggro && CanSee(target)) { maxAggro = target.Aggro; targetPlayer = target; } } return(targetPlayer); }
// Update is called once per frame void Update() { if (CurrentReloadTimer < ReloadTimer && !reloaded) { CurrentReloadTimer += Time.deltaTime; } else { Reload(); CurrentReloadTimer = 0; } TargetPlayer.UpdatePosition(); if (ownPositionTimer <= 0) { ownPositionTimer = ownPositionFrequency; StartCoroutine(BlinkPlayer()); } else { ownPositionTimer -= Time.deltaTime; } MapCoordinates coordinates = MapCoordinates.ToMapCoordinates(GetPosition()); LocalPlayer.data.latitude = coordinates.Latitude; LocalPlayer.data.longitude = coordinates.Longitude; DebugText.text = coordinates.ToString(); if (Time.time > nextActionTime) { nextActionTime = Time.time + period; if (!waitingResponse && !string.IsNullOrEmpty(TargetPlayer.data.id)) { StartCoroutine(GetOpponentPosition(coordinates)); } } if (Input.GetMouseButtonDown(0)) { Tapped(); } }
private TargetPlayer GetClosestInFrontAndInRange() { TargetPlayer targetPlayer = null; float minDist = Mathf.Infinity; foreach (TargetPlayer target in AliveTargets) { float distance = (target.Player.transform.position - transform.position).sqrMagnitude; float angle = Vector3.SignedAngle(transform.forward, target.Player.transform.position - transform.position, Vector3.up); if (distance <= attackRadius * attackRadius && Mathf.Abs(angle) < 60f && distance < minDist) { minDist = distance; targetPlayer = target; } } return(targetPlayer); }
/// <summary> /// Decide which player to target /// </summary> private void MakeTargetDecision() { // 1. Prioritize top aggro value TargetPlayer newTarget = GetTopAggroTarget(); if (newTarget != null) { _currentTarget = newTarget; return; } // 2. Choose closest player newTarget = GetClosestTarget(); if (newTarget != null) { _currentTarget = newTarget; return; } // 3. No target _currentTarget = null; }
public MissionLogEventKill(MissionLogEventHeader header) : base(header) { AttackerId = RawParameters.GetInt("AID"); TargetId = RawParameters.GetInt("TID"); Position = RawParameters.GetVector3D("POS"); AttackerPlayer = Server.Players[AttackerId]; AttackerObject = Server.GameObjects[AttackerId]; TargetPlayer = Server.Players[TargetId]; TargetObject = Server.GameObjects[TargetId]; if (AttackerPlayer == null && AttackerObject == null && TargetPlayer != null && TargetPlayer.HitsSources.Count > 0) { AttackerPlayer = TargetPlayer.MostDamageByPlayer(); if (AttackerPlayer == null) { AttackerObject = TargetPlayer.MostDamageByObject(); } } }
public P_HuaMulan() : base("花木兰") { Sex = PSex.Female; Age = PAge.Renaissance; Index = 23; Cost = 20; Tips = "定位:爆发\n" + "难度:简单\n" + "史实:出自经典诗歌《木兰辞》。中国古代替父从军的女英雄。\n" + "攻略:\n花木兰是一名拥有不俗爆发能力的武将。【枭姬】的存在使得花木兰极度依赖装备牌,因此能够与唐寅、时迁等武将配合,同时也能够对这些武将形成强大的威慑力。【枭姬】往往能够提供绝地反杀的能力,或能使花木兰东山再起,因此在针对花木兰时必须注意其队伍的研究所或给牌武将,同时慎用【落凤弓】、【借刀杀人】等牌,从一定程度上来说提供了花木兰一定的防御力。【易装】是一个强大的爆发技能,不仅能与队友交换装备达成爆发,还能抢夺敌方的大量装备,形成局势逆转,因此可在一定程度上克制关羽。【易装】还可用来转换性别,从而使敌方的【百花裙】等装备失效。针对花木兰必须阻止其装备成形,因此吕蒙是一个不错的选择。"; PSkill XiaoJi = new PSkill("枭姬") { SoftLockOpen = true }; SkillList.Add(XiaoJi .AddTrigger((PPlayer Player, PSkill Skill) => { return(new PTrigger(XiaoJi.Name) { IsLocked = false, Player = Player, Time = PTime.Card.LeaveAreaTime, AIPriority = 200, Condition = (PGame Game) => { PMoveCardTag MoveCardTag = Game.TagManager.FindPeekTag <PMoveCardTag>(PMoveCardTag.TagName); return Player.Area.EquipmentCardArea.Equals(MoveCardTag.Source) && !Player.Equals(MoveCardTag.Destination.Owner); }, Effect = (PGame Game) => { XiaoJi.AnnouceUseSkill(Player); Game.GetCard(Player); Game.GetMoney(Player, 1500); } }); })); PPlayer YiZhuangTarget(PGame Game, PPlayer Player) { return(PMath.Max(Game.AlivePlayers(Player), (PPlayer TargetPlayer) => { int Profit = 0; PSex OriginalSex = Player.Sex; Player.Sex = PSex.Male; foreach (PCardType CardType in new PCardType[] { PCardType.WeaponCard, PCardType.DefensorCard, PCardType.TrafficCard }) { PCard Card = Player.GetEquipment(CardType); PCard TargetCard = TargetPlayer.GetEquipment(CardType); if (Card != null) { Profit += 2000; Profit -= Card.Model.AIInEquipExpectation(Game, Player); Profit += Card.Model.AIInEquipExpectation(Game, TargetPlayer) * (Player.TeamIndex == TargetPlayer.TeamIndex ? 1 : -1); } if (TargetCard != null) { Profit += TargetCard.Model.AIInEquipExpectation(Game, Player); Profit -= TargetCard.Model.AIInEquipExpectation(Game, TargetPlayer) * (Player.TeamIndex == TargetPlayer.TeamIndex ? 1 : -1); } } Player.Sex = OriginalSex; return Profit - 7500; }, true).Key); } PSkill YiZhuang = new PSkill("易装") { Initiative = true }; SkillList.Add(YiZhuang .AnnounceGameOnce() .AddTimeTrigger( new PTime[] { PPeriod.FirstFreeTime.During, PPeriod.SecondFreeTime.During }, (PTime Time, PPlayer Player, PSkill Skill) => { return(new PTrigger(YiZhuang.Name) { IsLocked = false, Player = Player, Time = Time, AIPriority = 280, CanRepeat = true, Condition = (PGame Game) => { return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Player.RemainLimit(YiZhuang.Name); }, AICondition = (PGame Game) => { if (Game.Teammates(Player).Exists((PPlayer _Player) => _Player.General is P_WuZhao)) { PPlayer _Player = Game.PlayerList.Find((PPlayer __Player) => __Player.General is P_WuZhao); if (_Player.RemainLimit("女权")) { return false; } else if (Player.Tags.ExistTag(P_WuZhao.NvQuanTag.Name)) { return false; } } return YiZhuangTarget(Game, Player) != null; }, Effect = (PGame Game) => { YiZhuang.AnnouceUseSkill(Player); PPlayer Target = null; if (Player.IsAI) { Target = YiZhuangTarget(Game, Player); } else { Target = PNetworkManager.NetworkServer.ChooseManager.AskForTargetPlayer(Player, PTrigger.Except(Player), YiZhuang.Name); } if (Target != null) { List <PCard> MulanEquipments = new List <PCard>(); foreach (PCard Card in Player.Area.EquipmentCardArea.CardList) { MulanEquipments.Add(Card); } List <PCard> TargetEquipements = new List <PCard>(); foreach (PCard Card in Target.Area.EquipmentCardArea.CardList) { TargetEquipements.Add(Card); } foreach (PCard Card in MulanEquipments) { Game.CardManager.MoveCard(Card, Player.Area.EquipmentCardArea, Game.CardManager.SettlingArea); } foreach (PCard Card in TargetEquipements) { Game.CardManager.MoveCard(Card, Target.Area.EquipmentCardArea, Game.CardManager.SettlingArea); } foreach (PCard Card in MulanEquipments) { Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Target.Area.EquipmentCardArea); } foreach (PCard Card in TargetEquipements) { Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Player.Area.EquipmentCardArea); } Player.Sex = PSex.Male; Player.Tags.CreateTag(new PTag(YiZhuang.Name)); YiZhuang.DeclareUse(Player); } } }); })); }
public void ProcessEffect(ActiveGame game) { switch (EffectType) { case EffectTypes.CombineHandAndGraveyardToLibrary: if (TargetPlayer != null) { TargetPlayer.CombineToLibrary(true, true); } break; case EffectTypes.CombineGraveyardToLibrary: if (TargetPlayer != null) { TargetPlayer.CombineToLibrary(false, true); } break; case EffectTypes.CombineHandToLibrary: if (TargetPlayer != null) { TargetPlayer.CombineToLibrary(true, false); } break; case EffectTypes.Damage: if (TargetPlayer != null) { TargetPlayer.AddDamage(game, Value, OriginCard); } else if (TargetCard != null) { TargetCard.AddDamage(game, Value, OriginCard); } break; case EffectTypes.Destroy: if (TargetCard != null) { Player player = game.Players.First(o => o.Id == TargetCard.ControllerId); player.Battlefield.Remove(TargetCard, TargetZone.Graveyard); } break; case EffectTypes.DiscardCard: if (TargetPlayer != null && TargetCard != null) { TargetPlayer.Hand.Remove(TargetCard, TargetZone.Graveyard); } break; case EffectTypes.DrawCard: if (TargetPlayer != null) { TargetPlayer.Library.Draw(Value); } break; case EffectTypes.PlaceCardInLibrary_Bottom: if (TargetPlayer != null && TargetCard != null) { TargetPlayer.Library.Insert(TargetCard, InsertLocation.Bottom); } break; case EffectTypes.PlaceCardInLibrary_Top: if (TargetPlayer != null && TargetCard != null) { TargetPlayer.Library.Insert(TargetCard, InsertLocation.Top); } break; case EffectTypes.ShuffleLibrary: if (TargetPlayer != null) { TargetPlayer.Library.Shuffle(); } break; case EffectTypes.TopCardOfLibraryFaceUp: if (TargetPlayer != null) { TargetPlayer.Library.ShowTopCard = Boolean; } break; case EffectTypes.RemoveFromGame: if (TargetCard != null) { Player player = game.Players.First(o => o.Id == TargetCard.ControllerId); player.Battlefield.Remove(TargetCard, TargetZone.None); player.Graveyard.Remove(TargetCard, TargetZone.None); player.Hand.Remove(TargetCard, TargetZone.None); } break; case EffectTypes.Exile: if (TargetCard != null) { Player player = game.Players.First(o => o.Id == TargetCard.ControllerId); player.Battlefield.Remove(TargetCard, TargetZone.None); game.Stack.Remove(TargetCard, TargetZone.None); } break; } throw new NotImplementedException("Effect.ProcessEffect"); }
public static KeyValuePair <PPlayer, int> AIExpect(PGame Game, PPlayer Player, int BaseValue = 4000) { return(PMath.Max(Game.PlayerList.FindAll((PPlayer TargetPlayer) => TargetPlayer.IsAlive && !TargetPlayer.Equals(Player) /* && !(TargetPlayer.General is P_ShiQian)*/), (PPlayer TargetPlayer) => { return PAiCardExpectation.FindMostValuableToGet(Game, Player, TargetPlayer, true, true, true).Value - BaseValue; }, true)); }
/// <summary> /// Decide which player to target /// </summary> private void MakeTargetDecision() { TargetPlayer newTarget; // If no players are alive, no target possible if (AliveTargets.Count == 0) { _currentTarget = null; return; } switch (targetStrategy) { case TargetStrategy.AggroTable: // 1. Prioritize top aggro value newTarget = GetTopAggroTarget(); if (newTarget != null) { _currentTarget = newTarget; return; } // 2. Choose closest player newTarget = GetClosestViewableTarget(); if (newTarget != null) { _currentTarget = newTarget; return; } // 3. If we should always have a target, select a player randomly (if there are any) if (alwaysHaveTarget) { _currentTarget = AliveTargets[Random.Range(0, AliveTargets.Count)]; return; } // 4. No target _currentTarget = null; break; case TargetStrategy.ClosestEasiest: // 1. Player within view and attack range newTarget = GetClosestInFrontAndInRange(); if (newTarget != null) { _currentTarget = newTarget; return; } // 2. Choose closest player newTarget = GetClosestTarget(); if (newTarget != null) { _currentTarget = newTarget; return; } // 3. No target _currentTarget = null; break; case TargetStrategy.Random: // Select living target randomly _currentTarget = AliveTargets.Count > 0 ? AliveTargets[Random.Range(0, AliveTargets.Count)] : null; break; } }