예제 #1
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var character    = data.GameObject;
            var publicState  = data.PublicState;
            var privateState = data.PrivateState;

            publicState.IsOnline = character.IsOnline;

            // update selected hotbar item
            SharedRefreshSelectedHotbarItem(character, privateState);

            if (publicState.IsDead)
            {
                // dead - stops processing character
                Server.Characters.SetMoveSpeed(character, 0);
                Server.Characters.SetVelocity(character, Vector2D.Zero);
                return;
            }

            // character is alive
            this.ServerRebuildFinalCacheIfNeeded(privateState, publicState);
            this.SharedApplyInput(character, privateState, publicState);

            // update weapon state (fires the weapon if needed)
            WeaponSystem.SharedUpdateCurrentWeapon(character, privateState.WeaponState, data.DeltaTime);
            // update current action state (if any)
            privateState.CurrentActionState?.SharedUpdate(data.DeltaTime);
            // update crafting queue
            CraftingMechanics.ServerUpdate(privateState.CraftingQueue, data.DeltaTime);
            // consumes/restores stamina
            CharacterStaminaSystem.SharedUpdate(character, publicState, privateState, (float)data.DeltaTime);
        }
예제 #2
0
        protected override void ClientUpdate(ClientUpdateData data)
        {
            var character   = data.GameObject;
            var clientState = data.ClientState;
            var publicState = data.PublicState;

            if (!character.IsCurrentClientCharacter)
            {
                ClientCharacterEquipmentHelper.ClientRefreshEquipment(character, clientState, publicState);
                base.ClientUpdate(data);
                return;
            }

            // next code is only for the current client character
            var privateState = data.PrivateState;

            if (!publicState.IsDead)
            {
                SharedRefreshSelectedHotbarItem(character, privateState);
            }

            ClientCharacterEquipmentHelper.ClientRefreshEquipment(character, clientState, publicState);

            this.ServerRebuildFinalCacheIfNeeded(privateState, publicState);
            this.SharedApplyInput(character, privateState, publicState);

            ClientCharacterAnimationHelper.ClientUpdateAnimation(
                character,
                clientState,
                publicState);

            if (publicState.IsDead)
            {
                // dead - stops processing character
                WindowRespawn.EnsureOpened();
                return;
            }

            // character is alive - can process its actions
            WindowRespawn.EnsureClosed();
            // update weapon state (fires the weapon if needed)
            WeaponSystem.SharedUpdateCurrentWeapon(character, privateState.WeaponState, data.DeltaTime);
            // update current action state (if any)
            privateState.CurrentActionState?.SharedUpdate(data.DeltaTime);
            // consumes/restores stamina
            CharacterStaminaSystem.SharedUpdate(character, publicState, privateState, data.DeltaTime);
        }
예제 #3
0
        protected override void ServerUpdate(ServerUpdateData data)
        {
            var character    = data.GameObject;
            var publicState  = data.PublicState;
            var privateState = data.PrivateState;

            publicState.IsOnline = character.ServerIsOnline;

            // update selected hotbar item
            SharedRefreshSelectedHotbarItem(character, privateState);

            if (publicState.IsDead)
            {
                VehicleSystem.ServerCharacterExitCurrentVehicle(character, force: true);

                // dead - stops processing character
                var world = Server.World;
                world.SetDynamicObjectMoveSpeed(character, 0);
                world.SetDynamicObjectPhysicsMovement(character,
                                                      accelerationVector: Vector2D.Zero,
                                                      targetVelocity: 0);
                character.PhysicsBody.Friction = 100000;
                world.StopPhysicsBody(character.PhysicsBody);
                return;
            }

            // character is alive
            this.ServerRebuildFinalCacheIfNeeded(privateState, publicState);
            this.SharedApplyInput(character, privateState, publicState);

            // update weapon state (fires the weapon if needed)
            WeaponSystem.SharedUpdateCurrentWeapon(character, privateState.WeaponState, data.DeltaTime);
            // update current action state (if any)
            privateState.CurrentActionState?.SharedUpdate(data.DeltaTime);
            // update crafting queue
            CraftingMechanics.ServerUpdate(privateState.CraftingQueue, data.DeltaTime);
            // consumes/restores stamina
            CharacterStaminaSystem.SharedUpdate(character, publicState, privateState, data.DeltaTime);
        }
        /// <summary>
        /// Set stamina - it will be clamped automatically.
        /// </summary>
        public void SharedSetStaminaCurrent(float stamina, bool notifyClient = true)
        {
            this.SharedTryRefreshFinalCache();

            stamina = MathHelper.Clamp(stamina, min: 0, max: this.StaminaMax);
            var deltaStamina = stamina - this.StaminaCurrent;

            if (deltaStamina == 0)
            {
                return;
            }

            if (notifyClient &&
                Api.IsServer)
            {
                var character = (ICharacter)this.GameObject;
                if (!character.IsNpc)
                {
                    CharacterStaminaSystem.ServerNotifyClientStaminaChange(character, deltaStamina);
                }
            }

            this.StaminaCurrent = stamina;
        }