예제 #1
0
        public static InputCount Count(int prev, int cur)
        {
            var c = new InputCount()
            {
                Presses = 0, Releases = 0
            };

            prev &= SnapshotPlayerInput.StateMask;
            cur  &= SnapshotPlayerInput.StateMask;
            var i = prev;

            while (i != cur)
            {
                i = (i + 1) & SnapshotPlayerInput.StateMask;
                if ((i & 1) != 0)
                {
                    c.Presses++;
                }
                else
                {
                    c.Releases++;
                }
            }

            return(c);
        }
예제 #2
0
        protected virtual bool CanFire()
        {
            var fullAuto = ActiveWeapon == Weapon.GRENADE ||
                           ActiveWeapon == Weapon.SHOTGUN ||
                           ActiveWeapon == Weapon.RIFLE;

            var willFire = InputCount.Count(LatestPrevInput.Fire, LatestInput.Fire).Presses != 0 ||
                           fullAuto && (LatestInput.Fire & 1) != 0 && Weapons[(int)ActiveWeapon].Ammo != 0;

            if (!willFire)
            {
                return(false);
            }

            if (Weapons[(int)ActiveWeapon].Ammo == 0)
            {
                ReloadTimer = 125 * Server.TickSpeed / 1000;
                if (LastNoAmmoSound + Server.TickSpeed <= Server.Tick)
                {
                    GameContext.CreateSound(Position, Sound.WEAPON_NOAMMO);
                    LastNoAmmoSound = Server.Tick;
                }
                return(false);
            }

            return(true);
        }
예제 #3
0
        protected override bool CanFire()
        {
            var fullAuto = ActiveWeapon == Weapon.Grenade ||
                           ActiveWeapon == Weapon.Shotgun ||
                           ActiveWeapon == Weapon.Laser;

            var willFire = InputCount.Count(LatestPrevInput.Fire, LatestInput.Fire).Presses != 0 ||
                           fullAuto && (LatestInput.Fire & 1) != 0 && Weapons[(int)ActiveWeapon].Ammo != 0;

            if (!willFire)
            {
                return(false);
            }

            if (Weapons[(int)ActiveWeapon].Ammo == 0)
            {
                ReloadTimer = 125 * Server.TickSpeed / 1000;
                if (LastNoAmmoSound + Server.TickSpeed <= Server.Tick)
                {
                    GameContext.CreateSound(Position, Sound.WeaponNoAmmo);
                    LastNoAmmoSound = Server.Tick;
                }
                return(false);
            }

            return(true);
        }
예제 #4
0
        public static InputCount Count(int prev, int cur)
        {
            var c = new InputCount()
            {
                Presses = 0, Releases = 0
            };

            prev &= SnapObj_PlayerInput.INPUT_STATE_MASK;
            cur  &= SnapObj_PlayerInput.INPUT_STATE_MASK;
            var i = prev;

            while (i != cur)
            {
                i = (i + 1) & SnapObj_PlayerInput.INPUT_STATE_MASK;
                if ((i & 1) != 0)
                {
                    c.Presses++;
                }
                else
                {
                    c.Releases++;
                }
            }

            return(c);
        }
예제 #5
0
        protected override void HandleWeaponSwitch()
        {
            var wantedWeapon = ActiveWeapon;

            if (QueuedWeapon != (Weapon)(-1))
            {
                wantedWeapon = QueuedWeapon;
            }

            var next = InputCount.Count((int)LatestPrevInput.NextWeapon,
                                        (int)LatestInput.NextWeapon).Presses;
            var prev = InputCount.Count((int)LatestPrevInput.PreviousWeapon,
                                        (int)LatestInput.PreviousWeapon).Presses;

            if (next < 128)
            {
                while (next != 0)
                {
                    wantedWeapon = (Weapon)((int)(wantedWeapon + 1) % (int)Weapon.NumWeapons);
                    if (Weapons[(int)wantedWeapon].Got)
                    {
                        next--;
                    }
                }
            }

            if (prev < 128)
            {
                while (prev != 0)
                {
                    wantedWeapon = wantedWeapon - 1 < 0
                        ? Weapon.NumWeapons - 1
                        : wantedWeapon - 1;
                    if (Weapons[(int)wantedWeapon].Got)
                    {
                        prev--;
                    }
                }
            }

            if (LatestInput.WantedWeapon != 0)
            {
                wantedWeapon = (Weapon)(Input.WantedWeapon - 1);
            }

            if (wantedWeapon >= 0 &&
                wantedWeapon < Weapon.NumWeapons &&
                wantedWeapon != ActiveWeapon &&
                Weapons[(int)wantedWeapon].Got)
            {
                QueuedWeapon = wantedWeapon;
            }

            DoWeaponSwitch();
        }