Exemple #1
0
 public override void OnCombatEvent(CombatEvent Event)
 {
     if (Event is NpcDieEvent)
     {
         Fsm.ChangeToState(FsmStateName.Die, Event);
     }
 }
Exemple #2
0
    private void HandleFarmCombatEvent(CombatEvent ce_)
    {
        switch (ce_)
        {
        case CombatEvent.PlayerDied:
        {
            Player p = References.Instance._currentPlayer;
            p._health = p._maxHealth;
            p._isDead = false;
        }
        break;

        case CombatEvent.ClearWave:
        {
            Combat c = References.Instance._combat;
            c.TriggerNewWave();

            Player p = References.Instance._currentPlayer;
            p.Heal(p._maxHealth);
        }
        break;

        default:
            break;
        }
    }
Exemple #3
0
    public void CheckHit(Ray current, Ray previous, float range)
    {
        var hits = Physics.RaycastAll(current, range, LayerMask.GetMask("Actor", "PhysicsObject"));

        foreach (var hit in hits)
        {
            var go = hit.collider.gameObject;

            var entity = go.GetComponentInChildren <Entity>() ?? go.GetComponentInParent <Entity>();
            if (entity)
            {
                go = entity.gameObject;
            }

            if (_hitGameObjects.Contains(go))
            {
                continue;
            }

            if (entity && entity != _user.Actor)
            {
                var deltaOrigin       = current.origin - previous.origin;
                var directionAtOrigin = deltaOrigin.normalized;
                var directionAtEnd    = (current.direction - previous.direction).normalized;

                var t            = Vector3.Dot(hit.point - current.origin, current.direction * range);
                var hitDirection = Vector3.Slerp(directionAtOrigin, directionAtEnd, t);
                var combatEvent  = new CombatEvent(_user.Actor, entity, hit.point, hitDirection, _currentAttackData);

                _user.OnHitSomething(combatEvent);
            }

            _hitGameObjects.Add(go);
        }
    }
Exemple #4
0
    // Check all units to handle spells triggered by a combat event.
    internal void HandleCombatEvent(CombatEvent combatEvent)
    {
        CombatEventDispatcher dispatcher = new CombatEventDispatcher(this);

        foreach (PartyPosition position in SkillUsageOrder)
        {
            Skill offenseSkill = OffenseParty.GetAssignedSkill(position);
            if (offenseSkill != null && offenseSkill.SkillDefinition.PerformedPhase == CombatPhase.ReactionPhase)
            {
                ISkillTriggering triggering = offenseSkill.SkillDefinition.Triggering;
                if (triggering != null && triggering.CanReact(dispatcher, offenseSkill.Owner, combatEvent))
                {
                    // Trigger skill.
                    ResolveSkill(GetCombatUnit(CombatPartyType.Offense, position));
                }
            }

            Skill defenseSkill = DefenseParty.GetAssignedSkill(position);
            if (defenseSkill != null && defenseSkill.SkillDefinition.PerformedPhase == CombatPhase.ReactionPhase)
            {
                ISkillTriggering triggering = defenseSkill.SkillDefinition.Triggering;
                if (triggering != null && triggering.CanReact(dispatcher, defenseSkill.Owner, combatEvent))
                {
                    // Trigger skill.
                    ResolveSkill(GetCombatUnit(CombatPartyType.Defense, position));
                }
            }
        }
    }
Exemple #5
0
    private void ResolveExecuteEvent(CombatSkillExecuter executer)
    {
        Skill userSkill = executer.ExecutedSkill;

        // Execute effects on all targets.
        if (userSkill != null && userSkill.SkillDefinition.Effect != null)
        {
            CombatEventDispatcher dispatcher = new CombatEventDispatcher(this);
            CombatUnit            userUnit   = executer.Owner;

            foreach (CombatUnit target in executer.Targets)
            {
                CombatEventLog log = new CombatEventLog(userSkill);
                log.LogValues.Add("user", userUnit.Unit.Profile.Name);
                log.LogValues.Add("target", target.Unit.Profile.Name);
                log.LogValues.Add("skillname", userSkill.SkillDefinition.DisplayedName);

                userSkill.SkillDefinition.Effect.Apply(dispatcher, userUnit, target, log);
                _CombatEventLog.Add(log);
            }

            // Trigger execute event after skill usage.
            CombatEvent executeEvent = new CombatEvent(executer, CombatEventType.Apply, userUnit);
            HandleCombatEvent(executeEvent);
        }
    }
Exemple #6
0
    private void ResolveDeclareEvent(CombatSkillExecuter executer)
    {
        Skill      userSkill = executer.ExecutedSkill;
        CombatUnit user      = executer.Owner;

        // Check if the skill can be used (user is alive, skill is not used up, etc.)
        if (user == null || user.CombatStatus.SkillUsed)
        {
            executer.Interrupt();
        }
        else if (user.Unit == null || user.Unit.IsDead)
        {
            executer.Interrupt();
        }
        else if (userSkill == null || userSkill.SkillCurrentUsage == 0)
        {
            executer.Interrupt();
        }

        if (!executer.IsInterrupted)
        {
            executer.GenerateSkillTargets();

            // If we don't have valid targets, then this skill will not be triggered.
            if (executer.Targets.Count == 0)
            {
                executer.Interrupt();
            }
        }

        if (!executer.IsInterrupted)
        {
            // The skill is now triggered. Decrement skill usage times right now.
            // If another reaction skill cancels this skill, the skill will still be consumed.
            --userSkill.SkillCurrentUsage;
            user.CombatStatus.SkillUsed = true;

            // Check if any reactions are triggered.
            // Reactions may modify declareEvent, causing the attempt to use this skill to fail.
            // If this happens, the IsValid field on the event shall also be set to false.

            // React to declare event first.
            CombatEvent declareEvent = new CombatEvent(executer, CombatEventType.Declare, user);
            HandleCombatEvent(declareEvent);

            // Then react to targeting event for each target, if the skill execution is still valid.
            if (!executer.IsInterrupted)
            {
                foreach (CombatUnit targetUnit in executer.Targets)
                {
                    CombatEvent targetingEvent = new CombatEvent(executer, CombatEventType.Target, targetUnit);
                    HandleCombatEvent(targetingEvent);
                }
            }
        }
    }
 void Die()
 {
     if (currentHealth <= 0)
     {
         GiveExp();
         drop.ItemDropDeath(this.transform.position);
         CombatEvent.EnemyDied(this);
         Destroy(this.gameObject);
     }
 }
Exemple #8
0
 protected Entity(Dependencies dep)
 {
     Log          = dep.Log;
     _hitState    = new CombatEvent(this);
     _attackState = new CombatEvent(this);
     _battleState = new CombatEvent(this);
     _healStage   = new CombatEvent(this);
     State        = new BattleState(this);
     Name         = "";
 }
Exemple #9
0
        public void OnCombatEvent(CombatEvent Event)
        {
            foreach (var Handler in HandlerList_)
            {
                if (Handler.OnCombatEvent(Event))
                {
                    return;
                }
            }

            CurrentState_?.OnCombatEvent(Event);
        }
Exemple #10
0
        public void AddEvent()
        {
            Player  player1 = new Player(1);
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Outpost(new RftVector(map, 0, 0), player1, OutpostType.Generator);

            outpost.AddDrillers(10);
            Sub         sub         = new Sub(outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, new GameTick(), outpost.GetTargetPosition(sub.GetCurrentPosition(), sub.GetSpeed()));

            Game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(1, Game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, Game.TimeMachine.GetQueuedEvents()[0]);
        }
Exemple #11
0
    private void HandleTutorialCombatEvent(CombatEvent ce_)
    {
        switch (ce_)
        {
        case CombatEvent.PlayerDied:
            break;

        case CombatEvent.ClearWave:
            break;

        default:
            break;
        }
    }
Exemple #12
0
        public void AddEvent()
        {
            Player  player1 = new Player("1");
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Outpost("0", new RftVector(map, 0, 0), player1, OutpostType.Generator);

            outpost.AddDrillers(10);
            Sub         sub         = new Sub("1", outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, new GameTick());

            game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(1, game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, game.TimeMachine.GetQueuedEvents()[0]);
        }
Exemple #13
0
        public override void OnEnter(CombatEvent Event)
        {
            if (Fsm.Master.IsStatic)
            {
                Fsm.ChangeToIdleState();
                return;
            }

            BeginPos_      = Fsm.Master.Position;
            EndPos_        = (Event as NpcWalkEvent).TargetPos;
            MoveTime_      = 0;
            MoveTotalTime_ = (EndPos_ - BeginPos_).magnitude / Fsm.Master.CalcFinalAttr(NpcAttrIndex.Speed);
            IsMove_        = true;

            Fsm.Master.Actor.PlayAnimation("Walk", true);
            Fsm.Master.Actor.SetDirection(CombatHelper.CalcDirection(BeginPos_, EndPos_));
        }
Exemple #14
0
        public override void OnEnter(CombatEvent Event)
        {
            if (Fsm.Master.IsStatic)
            {
                Fsm.ChangeToIdleState();
                return;
            }

            Fsm.Master.Actor.PlayAnimation("Idle", true);
            var Evt = (Event as NpcBackEvent);

            StartPos_ = Fsm.Master.Position;
            BackPos_  = Evt.BackPos;
            BackTime_ = Evt.BackTime;
            Time_     = 0;
            IsEnd_    = false;
        }
Exemple #15
0
    public bool CanReact(CombatEventDispatcher dispatcher, Unit skillOwner, CombatEvent combatEvent)
    {
        // Triggered by Declare event.
        if (combatEvent.Event != CombatEventType.Declare)
        {
            return(false);
        }

        if (combatEvent.Party == dispatcher.GetUnitParty(skillOwner))
        {
            return(false);
        }
        bool isCastSkill = combatEvent.Skill.SkillDefinition.HasTag(SkillTag.Cast);

        // TODO: can only interrupt spells up to a certain level?
        return(isCastSkill);
    }
        public void CanRemoveEvents()
        {
            Player  player1 = new Player("1");
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Generator("0", new RftVector(map, 0, 0), player1);

            outpost.GetComponent <DrillerCarrier>().AddDrillers(10);
            Sub         sub         = new Sub("1", outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, new GameTick(5));

            _game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(2, _game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, _game.TimeMachine.GetQueuedEvents()[0]);

            _game.TimeMachine.RemoveEvent(arriveEvent);
            Assert.AreEqual(1, _game.TimeMachine.GetQueuedEvents().Count);
        }
Exemple #17
0
        public void EventsSwitchQueuesWhenPassedForward()
        {
            Player  player1 = new Player(1);
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Outpost(new RftVector(map, 0, 0), player1, OutpostType.Generator);

            outpost.AddDrillers(10);
            Sub         sub         = new Sub(outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, GameTick.FromTickNumber(5), outpost.GetTargetPosition(sub.GetCurrentPosition(), sub.GetSpeed()));

            Game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(1, Game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, Game.TimeMachine.GetQueuedEvents()[0]);

            // Go past the tick
            Game.TimeMachine.Advance(6);
            Assert.AreEqual(0, Game.TimeMachine.GetQueuedEvents().Count);
        }
    public void AddTargetToRecentlyHitList(CombatEvent combatEvent)
    {
        var trackable = combatEvent.Target.GetComponent <Trackable>();

        if (!trackable || !trackable.Health)
        {
            return;
        }

        if (RecentlyHit.TryAdd(trackable, Time.time))
        {
            ChangedRecentlyHitList?.Invoke();
        }
        else
        {
            RecentlyHit[trackable] = Time.time;
        }
    }
Exemple #19
0
        public void SubLaunchCreatesCombatEvents()
        {
            Outpost outpost1          = Game.TimeMachine.GetState().GetOutposts()[0];
            Outpost outpost2          = Game.TimeMachine.GetState().GetOutposts()[2];
            int     outpostOneInitial = outpost1.GetDrillerCount();
            int     outpostTwoInitial = outpost2.GetDrillerCount();

            LaunchEvent launch1 = new LaunchEvent(new GameTick(), outpost1, 1, outpost2);
            LaunchEvent launch2 = new LaunchEvent(new GameTick(), outpost2, 1, outpost1);

            Assert.AreEqual(true, launch1.ForwardAction());
            Assert.AreEqual(true, launch2.ForwardAction());

            // Ensure the sub was launched, outpost lost drillers, etc.
            Assert.AreEqual(2, Game.TimeMachine.GetState().GetSubList().Count);
            Assert.AreEqual(outpostOneInitial - 1, outpost1.GetDrillerCount());
            Assert.AreEqual(outpostTwoInitial - 1, outpost2.GetDrillerCount());

            // Ensure a combat event has been added that includes both subs.
            int         subToSubBattles     = 0;
            int         subToOutpostBattles = 0;
            GameEvent   arriveEvent         = null;
            CombatEvent combatEvent         = null;

            foreach (GameEvent gameEvent in Game.TimeMachine.GetQueuedEvents())
            {
                if (gameEvent is CombatEvent)
                {
                    combatEvent = (CombatEvent)gameEvent;
                    if (combatEvent.GetCombatants()[0] is Sub && combatEvent.GetCombatants()[1] is Sub)
                    {
                        subToSubBattles++;
                    }
                    else
                    {
                        subToOutpostBattles++;
                        arriveEvent = gameEvent;
                    }
                }
            }
            // There should be 3 combats, one on each outpost, one on both subs.
            Assert.AreEqual(1, subToSubBattles);
            Assert.AreEqual(2, subToOutpostBattles);
        }
Exemple #20
0
 public override void OnCombatEvent(CombatEvent Event)
 {
     if (Event is NpcWalkEvent)
     {
         Fsm.ChangeToState(FsmStateName.Walk, Event);
     }
     else if (Event is NpcSkillEvent)
     {
         Fsm.ChangeToState(FsmStateName.Skill, Event);
     }
     else if (Event is NpcDieEvent)
     {
         Fsm.ChangeToState(FsmStateName.Die, Event);
     }
     else if (Event is NpcBackEvent)
     {
         Fsm.ChangeToState(FsmStateName.Back, Event);
     }
 }
Exemple #21
0
    public void HandleCombatEvent(CombatEvent ce_)
    {
        switch (_gameMode)
        {
        case GameMode.Quest:
            HandleQuestCombatEvent(ce_);
            break;

        case GameMode.Farm:
            HandleFarmCombatEvent(ce_);
            break;

        case GameMode.Tutorial:
            HandleTutorialCombatEvent(ce_);
            break;

        default:
            break;
        }
    }
    public void GetNextEvent()
    {
        //Debug.Log("GetNextEvent()");
        if (m_PriorityEvent != null)
        {
            m_CurrentCombatEvent = m_PriorityEvent;
            m_PriorityEvent = null;
        }
        else if (m_EventQueue.Count > 0)
        {
            m_CurrentCombatEvent = m_EventQueue.Dequeue();
        }
        else
        {
            m_CurrentCombatEvent = m_CombatManager.GetNextCharacterTurn();
        }

        Debug.Log("Initializing next event.");
        m_CurrentCombatEvent.Init();
    }
Exemple #23
0
        public void Combat()
        {
            IWowPlayer weakestPlayer = Bot.GetNearEnemies <IWowPlayer>(Bot.Player.Position, 30.0f).OrderBy(e => e.Health).FirstOrDefault();

            if (weakestPlayer != null)
            {
                double distance  = weakestPlayer.Position.GetDistance(Bot.Player.Position);
                double threshold = Bot.CombatClass.IsMelee ? 3.0 : 28.0;

                if (distance > threshold)
                {
                    Bot.Movement.SetMovementAction(MovementAction.Move, weakestPlayer.Position);
                }
                else if (CombatEvent.Run())
                {
                    // StateMachine.Get<StateCombat>().Mode = CombatMode.Force;
                    Bot.Wow.ChangeTarget(weakestPlayer.Guid);
                }
            }
            else
            {
            }
        }
Exemple #24
0
        public void EventsSwitchQueuesWhenRewind()
        {
            Player  player1 = new Player("1");
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Outpost("0", new RftVector(map, 0, 0), player1, OutpostType.Generator);

            outpost.AddDrillers(10);
            Sub         sub         = new Sub("1", outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, new GameTick(5));

            game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(1, game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, game.TimeMachine.GetQueuedEvents()[0]);

            // Go past the tick
            game.TimeMachine.Advance(6);
            Assert.AreEqual(0, game.TimeMachine.GetQueuedEvents().Count);

            // Rewind back
            game.TimeMachine.Rewind(6);
            Assert.AreEqual(1, game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, game.TimeMachine.GetQueuedEvents()[0]);
        }
Exemple #25
0
        public void Combat()
        {
            WowPlayer weakestPlayer = WowInterface.ObjectManager.GetNearEnemies <WowPlayer>(WowInterface.ObjectManager.Player.Position, 30.0).OrderBy(e => e.Health).FirstOrDefault();

            if (weakestPlayer != null)
            {
                double distance  = weakestPlayer.Position.GetDistance(WowInterface.ObjectManager.Player.Position);
                double threshold = WowInterface.CombatClass.IsMelee ? 3.0 : 28.0;

                if (distance > threshold)
                {
                    WowInterface.MovementEngine.SetMovementAction(MovementAction.Move, weakestPlayer.Position);
                }
                else if (CombatEvent.Run())
                {
                    WowInterface.Globals.ForceCombat = true;
                    WowInterface.HookManager.WowTargetGuid(weakestPlayer.Guid);
                }
            }
            else
            {
            }
        }
Exemple #26
0
        public override bool OnCombatEvent(CombatEvent Event)
        {
            /*var Evt = Event as NpcHitTargetEvent;
             * if (Evt == null)
             * {
             *  return false;
             * }
             *
             * var Attacker = NpcManager.FindNpc(Evt.MasterTeam, Evt.MasterID);
             * if (Attacker == null)
             * {
             *  return false;
             * }
             *
             * if (Evt.TargetList == null || Evt.TargetList.Count == 0)
             * {
             *  return false;
             * }
             *
             * var Skill = Attacker.GetSkill(Evt.SkillID);
             * if (!(Skill is NpcSkill))
             * {
             *  return false;
             * }
             *
             * if ((Skill as NpcSkill).Use(new Dictionary<string, object>(){{"HitSfx", Evt.HitSfx}, {"TargetList", Evt.TargetList}}))
             * {
             *  if (Skill.SkillID != 3001)
             *  {
             *      LabelManager.AddStringLabel(Attacker.Position, Skill.Name, Color.green, 30);
             *  }
             *
             *  return true;
             * }*/

            return(false);
        }
Exemple #27
0
        public override void OnEnter(CombatEvent Event)
        {
            var Evt = Event as NpcSkillEvent;

            SkillID_ = Evt.SkillID;
            Skill_   = Fsm.Master.Skill.GetSkill(SkillID_) as NpcSkill;
            if (Skill_ == null)
            {
                Fsm.ChangeToIdleState();
                return;
            }

            Args_ = Evt.Args ?? Fsm.Master.Skill.CreateSkillArgs(SkillID_);

            if (Fsm.Master.Actor.HasAnimation("Attack"))
            {
                Fsm.Master.Actor.PlayAnimation("Attack", false);

                if (!Mathf.Approximately(0, Args_.Direction.sqrMagnitude))
                {
                    Fsm.Master.Actor.FaceToPosition(Fsm.Master.Position + Args_.Direction);
                }
                else if (!Mathf.Approximately(0, Args_.Position.sqrMagnitude))
                {
                    Fsm.Master.Actor.FaceToPosition(Args_.Position);
                }
                else if (Fsm.Master.Action.IsValidTarget())
                {
                    Fsm.Master.Actor.FaceToPosition(Fsm.Master.Action.TargetNpc.Position);
                }
            }
            else
            {
                OnAtkMsg();
                Fsm.ChangeToIdleState();
            }
        }
Exemple #28
0
 public void Add(CombatEvent action)
 {
     events.Add(action);
 }
Exemple #29
0
 public void AddCombatEvent(CombatEvent listn)
 {
     this.listener = listn;
 }
 public void QueueEvent(CombatEvent _combatEvent)
 {
     m_EventQueue.Enqueue(_combatEvent);
 }
    /// <summary>
    /// Add an event immediately after the current event.
    /// Useful for chaining events that are contingent on the current event, such as action and then target selection.
    /// </summary>
    /// <param name="_combatEvent">_combat event.</param>
    public void QueuePriorityEvent(CombatEvent _combatEvent)
    {
        if (m_PriorityEvent != null)
            //Debug.LogWarning("Overwriting previous priority event.");

        m_PriorityEvent = _combatEvent;
    }
Exemple #32
0
 public void LogEvent(CombatEvent attack)
 {
     savedData.Instance.Add(attack);
 }
 protected virtual void OnQueueEvent(CombatEvent _event)
 {
     QueueEventAction handler = QueueEvent;
     if (handler != null)
         handler(_event);
 }
Exemple #34
0
 public void Die()
 {
     CombatEvent.EnemyDied(this);
     Destroy(gameObject);
 }
 public void OnEventComplete()
 {
     m_CurrentCombatEvent = null;
 }