Exemplo n.º 1
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            var character = data.GameObject;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                isRetreating: false,
                distanceRetreat: 0,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 10,
                out var movementDirection,
                out var rotationAngleRad);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);
        }
Exemplo n.º 2
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            var character    = data.GameObject;
            var currentStats = data.PublicState.CurrentStats;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                isRetreating: currentStats.HealthCurrent < currentStats.HealthMax / 3,
                distanceRetreat: 7,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 5,
                out var movementDirection,
                out var rotationAngleRad);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);
        }
Exemplo n.º 3
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            var character = data.GameObject;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                isRetreating: false,
                isRetreatingForHeavyVehicles: this.AiIsRunAwayFromHeavyVehicles,
                distanceRetreat: 0,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 4,
                movementDirection: out var movementDirection,
                rotationAngleRad: out var rotationAngleRad);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);
        }
Exemplo n.º 4
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            var character    = data.GameObject;
            var currentStats = data.PublicState.CurrentStats;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                isRetreating: currentStats.HealthCurrent < currentStats.HealthMax / 4,
                isRetreatingForHeavyVehicles: this.AiIsRunAwayFromHeavyVehicles,
                distanceRetreat: 10,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 8,
                movementDirection: out var movementDirection,
                rotationAngleRad: out var rotationAngleRad);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);
        }
Exemplo n.º 5
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            var character = data.GameObject;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                targetCharacter: ServerCharacterAiHelper.GetClosestTargetPlayer(character),
                isRetreating: false,
                isRetreatingForHeavyVehicles: false,
                distanceRetreat: 0,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 8,
                movementDirection: out var movementDirection,
                rotationAngleRad: out var rotationAngleRad,
                attackFarOnlyIfAggro: true);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);
        }
Exemplo n.º 6
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            var character = data.GameObject;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                targetCharacter: ServerCharacterAiHelper.GetClosestTargetPlayer(character),
                isRetreating: false,
                isRetreatingForHeavyVehicles: this.AiIsRunAwayFromHeavyVehicles,
                distanceRetreat: 0,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 10,
                movementDirection: out var movementDirection,
                rotationAngleRad: out var rotationAngleRad);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);

            IWorldServerService ServerWorldService = Api.IsServer ? Api.Server.World : null;
        }
Exemplo n.º 7
0
        protected override void ServerUpdateMob(ServerUpdateData data)
        {
            if (data.PublicState.IsDead)
            {
                return;
            }

            var character = data.GameObject;

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                isRetreating: false,
                isRetreatingForHeavyVehicles: false,
                distanceRetreat: 0,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 16,
                movementDirection: out var movementDirection,
                rotationAngleRad: out var rotationAngleRad);

            this.ServerSetMobInput(character, movementDirection, rotationAngleRad);
        }
Exemplo n.º 8
0
        protected virtual void ServerUpdateTurret(ServerUpdateData data, TurretMode turretMode)
        {
            var character    = data.GameObject;
            var privateState = data.PrivateState;
            var publicState  = GetPublicState(character);
            var weaponState  = privateState.WeaponState;

            if (privateState.WeaponState.ProtoWeapon is ProtoItemWeaponTurretWithAmmo protoItemWeaponTurretWithAmmo)
            {
                protoItemWeaponTurretWithAmmo.ServerUpdateCurrentAmmo(character, weaponState);
                // attack range may change if the ammo type has changed
                privateState.AttackRange = weaponState.WeaponCache?.RangeMax ?? 0;
            }

            ServerCharacterAiHelper.ProcessAggressiveAi(
                character,
                targetCharacter: ServerTurretAiHelper.GetClosestTargetPlayer(character, turretMode, privateState),
                isRetreating: false,
                isRetreatingForHeavyVehicles: false,
                distanceRetreat: 0,
                distanceEnemyTooClose: 1,
                distanceEnemyTooFar: 8,
                movementDirection: out _,
                rotationAngleRad: out var rotationAngleRad,
                attackFarOnlyIfAggro: true,
                customIsValidTargetCallback: IsValidTargetCallback);

            var currentRotationAngleRad = (double)publicState.AppliedInput.RotationAngleRad;

            rotationAngleRad = MathHelper.LerpAngle(currentRotationAngleRad,
                                                    rotationAngleRad,
                                                    data.DeltaTime,
                                                    this.BarrelRotationRate);

            publicState.AppliedInput.Set(
                new CharacterInput()
            {
                MoveModes        = CharacterMoveModes.None,
                RotationAngleRad = (float)rotationAngleRad
            },
                moveSpeed: 0);

            if (weaponState.SharedGetInputIsFiring() &&
                !ServerCharacterAiHelper.CanHitAnyTargetWithRangedWeapon(
                    character,
                    rotationAngleRad,
                    privateState,
                    isValidTargetCallback: IsValidTargetForceAttackNeutralsCallback))
            {
                // don't shoot as not pointing on the target right now
                weaponState.SharedSetInputIsFiring(false);
            }

            bool IsValidTargetCallback(IWorldObject worldObject)
            => ServerTurretAiHelper.IsValidTarget(character,
                                                  worldObject,
                                                  turretMode,
                                                  forceAttackNeutrals: false);

            bool IsValidTargetForceAttackNeutralsCallback(IWorldObject worldObject)
            => ServerTurretAiHelper.IsValidTarget(character,
                                                  worldObject,
                                                  turretMode,
                                                  forceAttackNeutrals: true);
        }