public void NMTWOTryToJump(UserInputSet uis) { if (!InVehicle && uis.Upward && !uis.pup && !IsFlying && NMTWOCBody.SupportFinder.HasSupport) { NMTWOCBody.Jump(); uis.pup = true; } }
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; } }
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); } }
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; }
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; }
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; } }