using CommonAI.RTS; using CommonLang.Vector; using CommonAI.Zone.Helper; using CommonAI.Zone.Formula; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CommonAI.Zone.Instance { /// /// 中立AI /// public class InstanceNature : InstanceUnit { private Vector2 mBasePos = new Vector2(); private HateSystem mHateSystem; private StateFollowAndAttack mTracing; override public bool IsNature { get { return true; } } public InstanceNature(InstanceZone zone, UnitInfo info, string name, int force, int level) : base(zone, info, name, force, level) { mHateSystem = TemplateManager.Factory.CreateHateSystem(this); } override protected void onResetAI() { mTracing = null; mHateSystem.Clear(); doSomething(); } public bool followAndAttack(InstanceUnit src, AttackReason reason) { if (IsNoneSkill) { return false; } if (src != null) { if (Parent.IsAttackable(this, src, SkillTemplate.CastTarget.Enemy, reason, Info)) { mHateSystem.Add(src); if ((mTracing == null) || (mTracing.Target != src)) { mTracing = new StateFollowAndAttack(this, src); } changeState(mTracing); return true; } else { mHateSystem.Remove(src); } } return false; } protected override void onAdded(bool pointLv) { mBasePos.SetX(X); mBasePos.SetY(Y); base.onAdded(pointLv); } override protected void onUpdate(bool slowRefresh) { base.onUpdate(slowRefresh); } protected override void onStateChanged(State old_state, State state) { if (state is StateIdle) { followAndAttack(mHateSystem.GetHated(), AttackReason.Tracing); } } protected override void onMoveBlockWithObject(InstanceZoneObject obj) { if (obj is InstanceUnit) { var unit = obj as InstanceUnit; if (unit is InstancePet) { followAndAttack((unit as InstancePet).Master, AttackReason.MoveBlocked); return; } followAndAttack(obj as InstanceUnit, AttackReason.MoveBlocked); } } protected override void onDamaged(InstanceUnit attacker, AttackSource attack, int reduceHP) { if (attacker is InstancePet) { attacker = (attacker as InstancePet).Master; } mHateSystem.OnHitted(attacker, attack, reduceHP); followAndAttack(attacker, AttackReason.Damaged); } } //-------------------------------------------------------------------------------------------------------- }