protected override void ClientUpdate(ClientUpdateData data) { base.ClientUpdate(data); var character = data.GameObject; var clientState = data.ClientState; var publicState = data.PublicState; ClientCharacterAnimationHelper.ClientUpdateAnimation( character, clientState, publicState); }
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); }
private static void ReplaceMobWithCorpse(ICharacter deadCharacter) { var position = deadCharacter.Position; var rotationAngleRad = deadCharacter.GetPublicState <ICharacterPublicState>().AppliedInput.RotationAngleRad; var isLeftOrientation = ClientCharacterAnimationHelper.IsLeftHalfOfCircle( angleDeg: rotationAngleRad * MathConstants.RadToDeg); var isFlippedHorizontally = !isLeftOrientation; var tilePosition = position.ToVector2Ushort(); Api.Server.World.DestroyObject(deadCharacter); var objectCorpse = Api.Server.World.CreateStaticWorldObject <ObjectCorpse>(tilePosition); ObjectCorpse.ServerSetupCorpse(objectCorpse, (IProtoCharacterMob)deadCharacter.ProtoCharacter, (Vector2F)(position - tilePosition.ToVector2D()), isFlippedHorizontally: isFlippedHorizontally); }
public virtual void ServerOnDeath(ICharacter character) { this.ServerSendDeathSoundEvent(character); ServerWorld.DestroyObject(character); var position = character.Position; var tilePosition = position.ToVector2Ushort(); var rotationAngleRad = character.GetPublicState <ICharacterPublicState>().AppliedInput.RotationAngleRad; var isLeftOrientation = ClientCharacterAnimationHelper.IsLeftHalfOfCircle( angleDeg: rotationAngleRad * MathConstants.RadToDeg); var isFlippedHorizontally = !isLeftOrientation; var objectCorpse = ServerWorld.CreateStaticWorldObject <ObjectCorpse>(tilePosition); ObjectCorpse.ServerSetupCorpse(objectCorpse, (IProtoCharacterMob)character.ProtoCharacter, (Vector2F)(position - tilePosition.ToVector2D()), isFlippedHorizontally: isFlippedHorizontally); }
protected override void ClientUpdate(ClientUpdateData data) { base.ClientUpdate(data); var character = data.GameObject; var clientState = data.ClientState; var publicState = data.SyncPublicState; ClientCharacterAnimationHelper.ClientUpdateAnimation( character, clientState, publicState); if (publicState.IsDead && clientState.HealthbarControl != null) { // character was alive but now is dead // TODO: redone this to work properly with death handling on the Client-side clientState.HealthbarControl.Destroy(); clientState.HealthbarControl = null; character.PhysicsBody.Reset(); } }
public virtual void ClientGetAimingOrientation( [CanBeNull] ICharacter character, double angleRad, ViewOrientation lastViewOrientation, out ViewOrientation viewOrientation, out float aimCoef) { var angleDeg = angleRad * MathConstants.RadToDeg; viewOrientation = new ViewOrientation( isUp: this.ClientIsOrientedUp(angleDeg), isLeft: ClientCharacterAnimationHelper.IsLeftHalfOfCircle(angleDeg)); if (viewOrientation.IsLeft == lastViewOrientation.IsLeft && viewOrientation.IsUp != lastViewOrientation.IsUp) { // switched up/down if (lastViewOrientation.IsUp) { // COMMENTED OUT - we don't need tolerance for keeping the up orientation //// if view orientation was up, but now down //if (lastViewOrientation.IsLeft) //{ // // if view orientation was up-left, but now down-left // if (angleDeg < 90 + toleranceUpVerticalFlipDeg) // { // // keep up-left orientation // viewOrientation.IsUp = true; // } //} //else // if view orientation was up-right, but now down-right //{ // if (angleDeg > 90 - toleranceUpVerticalFlipDeg) // { // // keep up-right orientation // viewOrientation.IsUp = true; // } //} } else { // if view orientation was down, but now up if (lastViewOrientation.IsLeft) { // if view orientation was down-left, but now up-left if (angleDeg > 180 - this.OrientationThresholdDownToUpFlipDeg) { // keep down-left orientation viewOrientation.IsUp = false; } } else // if view orientation was down-right, but now up-right { if (angleDeg < this.OrientationThresholdDownToUpFlipDeg) { // keep down-right orientation viewOrientation.IsUp = false; } } } } else if (viewOrientation.IsLeft != lastViewOrientation.IsLeft && viewOrientation.IsUp == lastViewOrientation.IsUp) { // switched left/right if (lastViewOrientation.IsUp) { if (lastViewOrientation.IsLeft) { // if view orientation was left-up, but now right-up if (angleDeg > 90 - this.OrientationThresholdUpHorizontalFlipDeg) { // keep up-left orientation viewOrientation.IsLeft = true; } } else { // if view orientation was right-up, but now left-up if (angleDeg < 90 + this.OrientationThresholdUpHorizontalFlipDeg) { // keep up-right orientation viewOrientation.IsLeft = false; } } } else { if (lastViewOrientation.IsLeft) { // if view orientation was left-down, but now right-down if (angleDeg < 270 + this.OrientationThresholdDownHorizontalFlipDeg && angleDeg > 270) { // keep down-left orientation viewOrientation.IsLeft = true; } } else { // if view orientation was right-down, but now left-down if (angleDeg > 270 - this.OrientationThresholdDownHorizontalFlipDeg && angleDeg < 270) { // keep down-right orientation viewOrientation.IsLeft = false; } } } } // let's calculate aim coef var aimAngle = angleDeg; if (viewOrientation.IsUp) { // offset angle aimAngle += 45; // calculated angle between 0 and 270 degrees aimAngle %= 360; // calculate coef (from 0 to 2) aimCoef = (float)(aimAngle / 180); if (viewOrientation.IsLeft) { // if left orientation, aimCoef values will be from 1 to 2 // remap them to values from 1 to 0 respectively aimCoef = 1.5f - aimCoef; } } else // if oriented down { if (aimAngle < 90) { // it means we're in first quarter, extend aimAngle // on 360 degrees to keep coordinates continuum (from 180*3/4 to 180*(2+(1/4))) aimAngle += 360; } // offset angle aimAngle -= 45; // calculated angle between 0 and 270 degrees aimAngle = 360 - aimAngle; // calculate coef (from 0 to 2) aimCoef = (float)(aimAngle / 180); if (viewOrientation.IsLeft) { // if left orientation, aimCoef values will be from 1 to 2 // remap them to values from 1 to 0 respectively aimCoef = 1.5f - aimCoef; } // invert coefficient aimCoef = 1f - aimCoef; } //Api.Logger.WriteDev( // $"AngleDeg: {angleDeg:F2}. Aiming coef: {aimCoef:F2}. Current view data: isUp={viewOrientation.IsUp} isLeft={viewOrientation.IsLeft}"); }