public override AbilityStateDelta PollInput(AbilityInput input)
        {
            AbilityStateDelta delta = AbilityStateDelta.None;

            CacheInput(input);

            if (HasPersistentObjects)
            {
                UpdatePersistentObjects(input);
            }
            else if (Ability.currentAmmo > 0)
            {
                if (Ability.Behaviour.ShouldFire(input))
                {
                    Fire(input);

                    delta |= AbilityStateDelta.Fired;
                }
            }

            if (HasPersistentObjects)
            {
                delta |= AbilityStateDelta.HasPersistentObject;
            }

            return(delta);
        }
Esempio n. 2
0
    public void InvokeAbility(AbilityInput abilityInput)
    {
        //Do different things depending on the if this was pressed, held or released.
        switch (abilityInput)
        {
        default:
        {
            Debug.LogError("The ability input has not been given correctly.");
            return;
        }

        case AbilityInput.Down:
        {
            AbilityDown();
            return;
        }

        case AbilityInput.Hold:
        {
            AbilityHold();
            return;
        }

        case AbilityInput.Up:
        {
            AbilityUp();
            return;
        }
        }
    }
        private void CreateProjectiles(float angleToTarget, AbilityInput input)
        {
            foreach (Muzzle muzzle in Ability.Behaviour.Muzzles)
            {
                IAbilityObject abilityObject = muzzle.Spawner.Spawn(Ability, muzzle.Multiplier);
                abilityObject.GameObject.transform.position = Ability.Owner.transform.position;

                float   angle     = GetAngle(muzzle, angleToTarget);
                Vector2 direction = angle.GetDirection();

                if (Ability.Behaviour.UseOrthographicScaling)
                {
                    direction = Utility.ScaleToOrthographicVector(direction);
                }


                if (abilityObject is ISetTargetDirection directionSetter)
                {
                    directionSetter.SetTargetDirection(direction);
                }

                if (abilityObject is ISetTargetPosition positionSetter)
                {
                    positionSetter.SetTargetPosition(input.TargetPosition);
                }

                if (abilityObject is IPersistentAbilityObject persistentObject)
                {
                    PersistentObjects.Add(persistentObject);
                }
            }
        }
Esempio n. 4
0
 public AbilityResponse(AbilityInput ability, Vector3 startPosition)
 {
     _id             = ability.GetId();
     _type           = ability.GetAbilityType();
     _startPosition  = new PositionInfo(startPosition);
     _targetPosition = new PositionInfo(ability.GetTargetPosition());
 }
Esempio n. 5
0
    protected AbilityInput GetDefaultInput(Vector2 targetPosition)
    {
        AbilityInput input = GetDefaultInput();

        input.TargetPosition = targetPosition;

        return(input);
    }
Esempio n. 6
0
 public AbilityActor(Ability ability, Transform casterTransform)
 {
     this.ability      = ability;
     m_radius          = ability.GetCastRange();
     m_casterTransform = casterTransform;
     // 解析技能指示器
     m_abilityInput = CreateAbilityInput(ability);
 }
    public void Charge(AbilityInput input)
    {
        if (CurrentCharge == 0)
        {
            Effects.StartChargeEffects();
        }

        CurrentCharge = Mathf.Clamp(CurrentCharge + Time.deltaTime, 0, ChargeTime);
    }
Esempio n. 8
0
        public override AbilityStateDelta PollInput(AbilityInput input)
        {
            if (input.ShouldReload && !IsReloading)
            {
                StartReload();
                return(AbilityStateDelta.Reloading);
            }

            return(AbilityStateDelta.None);
        }
Esempio n. 9
0
    protected override void HandlePacket(Packet packet)
    {
        BitBuffer bitBuffer = new BitBuffer();

        bitBuffer.PutBytes(packet.getData());
        bitBuffer.Flip();
        PlayerInput input = PlayerInput.fromBytes(bitBuffer);

        switch (input.GetInputType())
        {
        case InputType.MOVEMENT:
            _players[input.GetId()].SetTargetPosition(((MovementInput)input).GetPosition());
            break;

        case InputType.ABILITY:
            AbilityInput ability = (AbilityInput)input;
            Vector3      abilityStartPosition = Vector3.zero;
            switch (ability.GetAbilityType())
            {
            case AbilityType.AUTOATTACK:
                abilityStartPosition = _players[ability.GetId()].transform.position;
                AutoAttack autoAttack = SpawnAutoAttack(ability.GetId(), abilityStartPosition, ability.GetTargetPosition());
                _lastAbilityId = (_lastAbilityId + 1) % 255;
                _autoAttacks.Add(_lastAbilityId, autoAttack);
                break;

            case AbilityType.FREEZE:
                _players[ability.GetId()].SpawnFreeze(ability.GetTargetPosition());
                break;

            case AbilityType.FLASH:
                _players[ability.GetId()].MoveTo(ability.GetTargetPosition());
                _players[ability.GetId()].CancelMovement();
                break;

            case AbilityType.EXPLOSION:
                CreateExplosion(ability.GetTargetPosition());
                break;
            }
            _channel.SendAll(new AbilityResponse(ability, abilityStartPosition), true);
            break;

        case InputType.START_GAME:
            _lastPlayerId++;
            Vector3 startPosition = new Vector3(2f, 1.2f, 0f);
            Player  player        = CreateServerPlayer(new PlayerInfo(_lastPlayerId, startPosition));
            _players.Add(_lastPlayerId, player);
            _channel.Send(new PlayerInfoBroadcast(_lastPlayerId, _players), packet.getAddress(), true);
            PlayerInfo playerInfo = new PlayerInfo(_lastPlayerId, player.GetHealth(), new PositionInfo(startPosition));
            _channel.SendAllExcluding(new NewPlayerEvent(playerInfo), packet.getAddress(), true);
            break;
        }
        packet = _channel.GetPacket();
        bitBuffer.Clear();
    }
 public override bool ShouldFire(AbilityInput input)
 {
     if (singleFire)
     {
         return(ShouldFireSingle(input));
     }
     else
     {
         return(ShouldFireContinuous(input));
     }
 }
        private void Fire(AbilityInput input)
        {
            LastFireTime = Time.time;
            Ability.CurrentAmmo--;

            Vector2 delta         = (TargetPosition - (Vector2)Ability.Owner.transform.position).normalized;
            float   angleToTarget = Mathf.Atan2(delta.y, delta.x) * Mathf.Rad2Deg;

            CreateProjectiles(angleToTarget, input);
            Ability.OnFired();
        }
    private void Update()
    {
        if (InputSuppressor.IsSuppressed || PauseState.IsPaused)
        {
            return;
        }

        AbilityInput input = GetInput();

        DebugInput(input);
        currentAbility.Value.UpdateState(input);
    }
    public AbilityStateDelta UpdateState(AbilityInput input)
    {
        AbilityStateDelta delta = AbilityStateDelta.None;

        delta |= Reloader.PollInput(input);

        if (Reloader.IsReloading)
        {
            delta |= Reloader.DoReload();
        }
        else
        {
            delta |= Activator.PollInput(input);
        }

        return(delta);
    }
Esempio n. 14
0
    public static PlayerInput fromBytes(BitBuffer bitBuffer)
    {
        int       id   = bitBuffer.GetByte();
        InputType type = (InputType)bitBuffer.GetByte();

        switch (type)
        {
        case InputType.MOVEMENT:
            return(MovementInput.FromBytes(id, bitBuffer));

        case InputType.ABILITY:
            return(AbilityInput.FromBytes(id, bitBuffer));

        case InputType.START_GAME:
            return(GameStartInput.FromBytes(id, bitBuffer));
        }
        return(null);
    }
        private void UpdatePersistentObjects(AbilityInput input)
        {
            for (int i = PersistentObjects.Count - 1; i >= 0; i--)
            {
                Vector2 direction = TargetPosition - (Vector2)Ability.Owner.transform.position;

                if (PersistentObjects[i] is ISetTargetDirection directionSetter)
                {
                    directionSetter.SetTargetDirection(direction);
                }

                if (PersistentObjects[i] is ISetTargetPosition positionSetter)
                {
                    positionSetter.SetTargetPosition(Ability.Owner.transform.position);
                }

                if (PersistentObjects[i].ShouldBeDestroyed())
                {
                    PersistentObjects.RemoveAt(i);
                }
            }
        }
    private bool ShouldFireContinuous(AbilityInput input)
    {
        if (input.FireButtonStay)
        {
            UpdateChargeEffect(input);

            if (CurrentCharge >= ChargeTime)
            {
                return(base.ShouldFire(input));
            }
            else
            {
                Charge(input);
            }
        }
        else
        {
            RemoveCharge();
        }

        return(false);
    }
    private bool ShouldFireSingle(AbilityInput input)
    {
        if (IsCooldownReady)
        {
            if (CurrentCharge >= ChargeTime)
            {
                UpdateChargeEffect(input);

                return(input.FireButtonReleased);
            }
            else if (input.FireButtonStay)
            {
                UpdateChargeEffect(input);

                Charge(input);
            }
            else
            {
                CurrentCharge = 0;
            }
        }

        return(false);
    }
    protected override AbilityStateDelta UseAbility()
    {
        AbilityInput input = GetDefaultInput(TargetPosition);

        return(Ability.UpdateState(input));
    }
Esempio n. 19
0
 public abstract AbilityStateDelta PollInput(AbilityInput input);
 private void CacheInput(AbilityInput input)
 {
     TargetPosition = input.TargetPosition;
 }
Esempio n. 21
0
    // Update is called once per frame
    public override void Update()
    {
        // if not local player, ignore an controller inputs!!!!
        if (!isLocalPlayer)
        {
            return;
        }

        shipInputs = new ShipInputs();

        // check for controller assignment to the player
        if (!inputIsAttached)
        {
            // check for an available device
            foreach (InputDevice device in InputManager.Devices)
            {
                if (device.Action1.WasPressed && !devicesInUse.Contains(device))
                {
                    SetInput(device);
                    break;
                }
            }
        }

        // if you have an attached controller
        if (inputIsAttached)
        {
            // get inputs from the controller and save them
            shipInputs.warp.isPressed     = actions.warp.IsPressed;
            shipInputs.boost.isPressed    = actions.boost.IsPressed;
            shipInputs.special.isPressed  = actions.special.IsPressed;
            shipInputs.flipShot.isPressed = actions.flipShot.IsPressed;
            shipInputs.start.isPressed    = actions.start.IsPressed;

            shipInputs.warp.wasPressed     = actions.warp.WasPressed;
            shipInputs.boost.wasPressed    = actions.boost.WasPressed;
            shipInputs.special.wasPressed  = actions.special.WasPressed;
            shipInputs.flipShot.wasPressed = actions.flipShot.WasPressed;
            shipInputs.start.wasPressed    = actions.start.WasPressed;

            shipInputs.warp.wasReleased     = actions.warp.WasReleased;
            shipInputs.boost.wasReleased    = actions.boost.WasReleased;
            shipInputs.special.wasReleased  = actions.special.WasReleased;
            shipInputs.flipShot.wasReleased = actions.flipShot.WasReleased;
            shipInputs.start.wasReleased    = actions.start.WasReleased;

            float grindVal = actions.grind.Value;
            if (grindVal < GRIND_RELEASE_VAL)
            {
                shipInputs.grind.wasReleased = true;
                shipInputs.grind.isPressed   = shipInputs.grind.wasPressed = false;
            }
            else
            {
                shipInputs.grind.wasPressed = !shipInputs.grind.isPressed ? true : false;
                shipInputs.grind.isPressed  = true;
            }

            shipInputs.direction.x = actions.movement.X;
            shipInputs.direction.y = actions.movement.Y;

            // send movement inputs to the server
            CmdUploadMovementInput(shipInputs.direction);

            // send ability inputs to the server
            AbilityInput abilityInputs = new AbilityInput(shipInputs);
            if (abilityInputs != prevAbilityInputs)
            {
                CmdUploadAbilityInput(abilityInputs);
            }

            /*
             * if (cmdTimer.Update(Time.deltaTime))
             * {
             *  CmdUploadInput(shipInputs);
             *  cmdTimer.Activate();
             * }
             */

            prevAbilityInputs = abilityInputs;
        }
    }
 private void DebugInput(AbilityInput input)
 {
     Debug.DrawLine(transform.position, input.TargetPosition, Color.cyan);
 }
 /// <summary>
 /// Is called when the ability handler wants to fire, but needs permission from the behaviour
 /// </summary>
 public virtual bool ShouldFire(AbilityInput input)
 {
     return(IsCooldownReady && input.FireButtonStay);
 }
Esempio n. 24
0
 private void CmdUploadAbilityInput(AbilityInput abilites)
 {
     // server recieves inputs from client
     shipInputs.boost = abilites.boost;
     //Debug.Log("boost cmd recieved");
 }
 private void UpdateChargeEffect(AbilityInput input)
 {
     Effects.UpdateChargeEffects(input.TargetPosition);
     Effects.UpdateColor(LifetimeColor);
 }