コード例 #1
0
        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);
        }
コード例 #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
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
        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}");
        }