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); }
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); }
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; }