コード例 #1
0
ファイル: PlayerEntity.cs プロジェクト: Fortifier42/Voxalia
 public void NMTWOTryToJump(UserInputSet uis)
 {
     if (!InVehicle && uis.Upward && !uis.pup && !IsFlying && NMTWOCBody.SupportFinder.HasSupport)
     {
         NMTWOCBody.Jump();
         uis.pup = true;
     }
 }
コード例 #2
0
ファイル: PlayerEntity.cs プロジェクト: Fortifier42/Voxalia
        public void SetBodyMovement(CharacterController cc, UserInputSet uis)
        {
            Vector2 movement = InVehicle ? Vector2.Zero : new Vector2(uis.XMove, uis.YMove);

            if (movement.LengthSquared() > 0)
            {
                movement.Normalize();
            }
            cc.ViewDirection = Utilities.ForwardVector_Deg(uis.Direction.Yaw, uis.Direction.Pitch).ToBVector();
            cc.HorizontalMotionConstraint.MovementDirection = movement;
            if (uis.Downward)
            {
                cc.StanceManager.DesiredStance = Stance.Crouching;
            }
            else
            {
                cc.StanceManager.DesiredStance = DesiredStance;
            }
        }
コード例 #3
0
ファイル: PlayerEntity.cs プロジェクト: Fortifier42/Voxalia
 public void FlyForth(CharacterController cc, UserInputSet uis, double delta)
 {
     if (IsFlying)
     {
         Location move = new Location(-cc.HorizontalMotionConstraint.MovementDirection.Y, cc.HorizontalMotionConstraint.MovementDirection.X, 0);
         if (uis.Upward)
         {
             move.Z = 1;
             move   = move.Normalize();
         }
         else if (uis.Downward)
         {
             move.Z = -1;
             move   = move.Normalize();
         }
         Location forw = Utilities.RotateVector(move, Direction.Yaw * Utilities.PI180, Direction.Pitch * Utilities.PI180);
         cc.Body.Position += (forw * delta * CBStandSpeed * 4 * (new Vector2(uis.XMove, uis.YMove).Length())).ToBVector();
         cc.HorizontalMotionConstraint.MovementDirection = Vector2.Zero;
         cc.Body.LinearVelocity = new Vector3(0, 0, 0);
     }
 }
コード例 #4
0
ファイル: PlayerEntity.cs プロジェクト: Fortifier42/Voxalia
        public void AddUIS()
        {
            UserInputSet uis = new UserInputSet()
            {
                ID               = cPacketID++,
                Upward           = Upward,
                XMove            = XMove,
                YMove            = YMove,
                Direction        = Direction,
                Position         = GetPosition(),
                Velocity         = GetVelocity(),
                Downward         = Downward,
                GlobalTimeRemote = lGTT,
                pup              = pup,
                SprintOrWalk     = SprintOrWalk,
                GlobalTimeLocal  = TheRegion.GlobalTickTimeLocal
            };

            Input.Push(uis);
            lUIS = uis;
        }
コード例 #5
0
ファイル: PlayerEntity.cs プロジェクト: Fortifier42/Voxalia
        public void SetMoveSpeed(CharacterController cc, UserInputSet uis)
        {
            float speedmod = (float)new Vector2(uis.XMove, uis.YMove).Length() * 2;

            speedmod *= (1f + uis.SprintOrWalk * 0.5f);
            if (Click)
            {
                ItemStack  item = TheClient.GetItemForSlot(TheClient.QuickBarPos);
                bool       has  = item.SharedAttributes.ContainsKey("charge");
                BooleanTag bt   = has ? BooleanTag.TryFor(item.SharedAttributes["charge"]) : null;
                if (bt != null && bt.Internal && item.SharedAttributes.ContainsKey("cspeedm"))
                {
                    NumberTag nt = NumberTag.TryFor(item.SharedAttributes["cspeedm"]);
                    if (nt != null)
                    {
                        speedmod *= (float)nt.Internal;
                    }
                }
            }
            RigidTransform transf = new RigidTransform(Vector3.Zero, Body.Orientation);
            BoundingBox    box;

            cc.Body.CollisionInformation.Shape.GetBoundingBox(ref transf, out box);
            Location pos = new Location(cc.Body.Position) + new Location(0, 0, box.Min.Z);
            Material mat = TheRegion.GetBlockMaterial(pos + new Location(0, 0, -0.05f));

            speedmod         *= (float)mat.GetSpeedMod();
            cc.StandingSpeed  = CBStandSpeed * speedmod;
            cc.CrouchingSpeed = CBCrouchSpeed * speedmod;
            float frictionmod = 1f;

            frictionmod     *= (float)mat.GetFrictionMod();
            cc.SlidingForce  = CBSlideForce * frictionmod * Mass;
            cc.AirForce      = CBAirForce * frictionmod * Mass;
            cc.TractionForce = CBTractionForce * frictionmod * Mass;
            cc.VerticalMotionConstraint.MaximumGlueForce = CBGlueForce * Mass;
        }
コード例 #6
0
ファイル: PlayerEntity.cs プロジェクト: Morphan1/Voxalia
 public void SetMoveSpeed(CharacterController cc, UserInputSet uis)
 {
     float speedmod = (float)new Vector2(uis.XMove, uis.YMove).Length() * 2;
     speedmod *= (1f + uis.SprintOrWalk * 0.5f);
     if (Click)
     {
         ItemStack item = TheClient.GetItemForSlot(TheClient.QuickBarPos);
         bool has = item.SharedAttributes.ContainsKey("charge");
         BooleanTag bt = has ? BooleanTag.TryFor(item.SharedAttributes["charge"]) : null;
         if (bt != null && bt.Internal && item.SharedAttributes.ContainsKey("cspeedm"))
         {
             NumberTag nt = NumberTag.TryFor(item.SharedAttributes["cspeedm"]);
             if (nt != null)
             {
                 speedmod *= (float)nt.Internal;
             }
         }
     }
     RigidTransform transf = new RigidTransform(Vector3.Zero, Body.Orientation);
     BoundingBox box;
     cc.Body.CollisionInformation.Shape.GetBoundingBox(ref transf, out box);
     Location pos = new Location(cc.Body.Position) + new Location(0, 0, box.Min.Z);
     Material mat = TheRegion.GetBlockMaterial(pos + new Location(0, 0, -0.05f));
     speedmod *= (float)mat.GetSpeedMod();
     cc.StandingSpeed = CBStandSpeed * speedmod;
     cc.CrouchingSpeed = CBCrouchSpeed * speedmod;
     float frictionmod = 1f;
     frictionmod *= (float)mat.GetFrictionMod();
     cc.SlidingForce = CBSlideForce * frictionmod * Mass;
     cc.AirForce = CBAirForce * frictionmod * Mass;
     cc.TractionForce = CBTractionForce * frictionmod * Mass;
     cc.VerticalMotionConstraint.MaximumGlueForce = CBGlueForce * Mass;
 }
コード例 #7
0
ファイル: PlayerEntity.cs プロジェクト: Morphan1/Voxalia
 public void SetBodyMovement(CharacterController cc, UserInputSet uis)
 {
     Vector2 movement = InVehicle ? Vector2.Zero : new Vector2(uis.XMove, uis.YMove);
     if (movement.LengthSquared() > 0)
     {
         movement.Normalize();
     }
     cc.ViewDirection = Utilities.ForwardVector_Deg(uis.Direction.Yaw, uis.Direction.Pitch).ToBVector();
     cc.HorizontalMotionConstraint.MovementDirection = movement;
     if (uis.Downward)
     {
         cc.StanceManager.DesiredStance = Stance.Crouching;
     }
     else
     {
         cc.StanceManager.DesiredStance = DesiredStance;
     }
 }
コード例 #8
0
ファイル: PlayerEntity.cs プロジェクト: Morphan1/Voxalia
 public void NMTWOTryToJump(UserInputSet uis)
 {
     if (!InVehicle && uis.Upward && !uis.pup && !IsFlying && NMTWOCBody.SupportFinder.HasSupport)
     {
         NMTWOCBody.Jump();
         uis.pup = true;
     }
 }
コード例 #9
0
ファイル: PlayerEntity.cs プロジェクト: Morphan1/Voxalia
 public void FlyForth(CharacterController cc, UserInputSet uis, double delta)
 {
     if (IsFlying)
     {
         Location move = new Location(-cc.HorizontalMotionConstraint.MovementDirection.Y, cc.HorizontalMotionConstraint.MovementDirection.X, 0);
         if (uis.Upward)
         {
             move.Z = 1;
             move = move.Normalize();
         }
         else if (uis.Downward)
         {
             move.Z = -1;
             move = move.Normalize();
         }
         Location forw = Utilities.RotateVector(move, Direction.Yaw * Utilities.PI180, Direction.Pitch * Utilities.PI180);
         cc.Body.Position += (forw * delta * CBStandSpeed * 4 * (new Vector2(uis.XMove, uis.YMove).Length())).ToBVector();
         cc.HorizontalMotionConstraint.MovementDirection = Vector2.Zero;
         cc.Body.LinearVelocity = new Vector3(0, 0, 0);
     }
 }
コード例 #10
0
ファイル: PlayerEntity.cs プロジェクト: Morphan1/Voxalia
 public void AddUIS()
 {
     UserInputSet uis = new UserInputSet()
     {
         ID = cPacketID++,
         Upward = Upward,
         XMove = XMove,
         YMove = YMove,
         Direction = Direction,
         Position = GetPosition(),
         Velocity = GetVelocity(),
         Downward = Downward,
         GlobalTimeRemote = lGTT,
         pup = pup,
         SprintOrWalk = SprintOrWalk,
         GlobalTimeLocal = TheRegion.GlobalTickTimeLocal
     };
     Input.Push(uis);
     lUIS = uis;
 }
コード例 #11
0
ファイル: PlayerEntity.cs プロジェクト: Fortifier42/Voxalia
        public void UpdateForPacketFromServer(double gtt, long ID, Location pos, Location vel, bool _pup)
        {
            ServerLocation = pos;
            if (ServerFlags.HasFlag(YourStatusFlags.INSECURE_MOVEMENT))
            {
                return;
            }
            if (InVehicle)
            {
                return;
            }
            // TODO: big solid entities!
            double now = TheRegion.GlobalTickTimeLocal;

            if (TheClient.CVars.n_movemode.ValueI == 2)
            {
                // TODO: Remove outsider chunks!
                for (int x = -1; x <= 1; x++)
                {
                    for (int y = -1; y <= 1; y++)
                    {
                        for (int z = -1; z <= 1; z++)
                        {
                            Vector3i ch    = TheRegion.ChunkLocFor(pos) + new Vector3i(x, y, z);
                            Chunk    chunk = TheRegion.GetChunk(ch);
                            if (chunk == null)
                            {
                                continue;
                            }
                            if (!NMTWOMeshes.ContainsKey(ch))
                            {
                                if (chunk.FCO != null)
                                {
                                    FullChunkObject im = new FullChunkObject(chunk.FCO.Position, chunk.FCO.ChunkShape);
                                    NMTWOWorld.Add(im);
                                    NMTWOMeshes[ch] = im;
                                }
                            }
                        }
                    }
                }
                AddUIS();
                int    xf       = 0;
                double jumpback = gtt - lGTT;
                if (jumpback < 0)
                {
                    return;
                }
                double       target = TheRegion.GlobalTickTimeLocal - jumpback;
                UserInputSet past   = null;
                while (xf < Input.Length)
                {
                    UserInputSet uis = Input[xf];
                    if (uis.GlobalTimeLocal < target)
                    {
                        past = uis;
                        Input.Pop();
                        continue;
                    }
                    else if (xf == 0)
                    {
                        double mult = Math.Max(Math.Min(jumpback / TheClient.CVars.n_movement_adjustment.ValueD, 1.0), 0.01);
                        NMTWOSetPosition(uis.Position + (pos - uis.Position) * mult);
                        NMTWOSetVelocity(uis.Velocity + (vel - uis.Velocity) * mult);
                    }
                    xf++;
                    double delta;
                    if (xf < 2)
                    {
                        if (past == null)
                        {
                            continue;
                        }
                        delta = uis.GlobalTimeLocal - target;
                        SetBodyMovement(NMTWOCBody, past);
                    }
                    else
                    {
                        UserInputSet prev = Input[xf - 2];
                        delta = uis.GlobalTimeLocal - prev.GlobalTimeLocal;
                        SetBodyMovement(NMTWOCBody, prev);
                    }
                    SetMoveSpeed(NMTWOCBody, uis);
                    if (!_pup)
                    {
                        NMTWOTryToJump(uis);
                    }
                    lPT = uis.GlobalTimeLocal;
                    NMTWOWorld.Update((float)delta);
                    FlyForth(NMTWOCBody, uis, delta); // TODO: Entirely disregard NWTWOWorld if flying?
                }
                AddUIS();
                SetPosition(NMTWOGetPosition());
                SetVelocity(new Location(NMTWOCBody.Body.LinearVelocity));
                pup  = _pup;
                lGTT = gtt;
            }
            else
            {
                double   delta = lPT - now;
                Location dir   = pos - TheClient.Player.GetPosition();
                if (dir.LengthSquared() < TheClient.CVars.n_movement_maxdistance.ValueF * TheClient.CVars.n_movement_maxdistance.ValueF)
                {
                    SetPosition(GetPosition() + dir / Math.Max(TheClient.CVars.n_movement_adjustment.ValueF / delta, 1));
                    Location veldir = vel - GetVelocity();
                    SetVelocity(GetVelocity() + veldir / Math.Max(TheClient.CVars.n_movement_adjustment.ValueF / delta, 1));
                }
                else
                {
                    TheClient.Player.SetPosition(pos);
                    TheClient.Player.SetVelocity(vel);
                }
                lPT = now;
            }
        }