Пример #1
0
        public override void OnEnter()
        {
            base.OnEnter();

            RenderMessage rm = new RenderMessage();

            rm.ownerId   = owner.id;
            rm.direction = owner.direction.vector3;
            rm.type      = RenderMessage.Type.SummonedUnitDeath;
            owner.PostRenderMessage(rm);
        }
Пример #2
0
        public override void Update(int deltaTime)
        {
            base.Update(deltaTime);

            LogicUnit target = owner.target;

            if (target != null && target.Alive())
            {
                long distance = FixVector3.SqrDistance(target.position, owner.position);
                if (distance < owner.attackRadius)
                {
                    if (inFightInterval)
                    {
                        fightIntervalTimer += deltaTime;

                        if (fightIntervalTimer >= fightInterval)
                        {
                            fightState         = FightState.StartSwingPoint;
                            fightIntervalTimer = 0;
                            inFightInterval    = false;
                        }
                    }
                    else
                    {
                        fightState          = GetCurrentState(fightDurationTimer);
                        fightDurationTimer += deltaTime;

                        if (fightState == FightState.StartSwingPoint)
                        {
                            owner.direction = target.position - owner.position;

                            RenderMessage rm = new RenderMessage();
                            rm.ownerId   = owner.id;
                            rm.direction = owner.direction.vector3;
                            rm.type      = RenderMessage.Type.SummonedUnitAttack;
                            owner.PostRenderMessage(rm);
                        }
                        else if (fightState == FightState.HitPoint)
                        {
                            owner.damage = Formula.GetAttackFloatingValue(owner.physicalAttack, owner.GetRandomNumber(), owner.GetRandomNumber(owner.physicalAttackVar));

                            List <LogicUnit> targets = owner.FindOpponent();

                            for (int i = 0; i < targets.Count; i++)
                            {
                                LogicUnit t = targets[i];

                                // Check target state and still in the attack range
                                if (t != null && t.Alive())
                                {
                                    t.Hurt(owner.damage, AttackPropertyType.PhysicalAttack, false, owner.ownerSoldier);
                                }
                            }
                        }
                        else if (fightState == FightState.FightEnd)
                        {
                            inFightInterval    = true;
                            fightDurationTimer = 0;
                        }
                    }
                }
                else
                {
                    owner.Idle();
                }
            }
            else
            {
                owner.Idle();
            }
        }