private void TickLadder() { //!!!!!â òèï? const float ladderClimbingSpeedWalk = 1.5f; const float ladderClimbingSpeedRun = 3; SphereDir lookDirection = SphereDir.Zero; { PlayerIntellect playerIntellect = Intellect as PlayerIntellect; if (playerIntellect != null) { lookDirection = playerIntellect.LookDirection; } } bool wantMove = Intellect.IsControlKeyPressed(GameControlKeys.Forward) || Intellect.IsControlKeyPressed(GameControlKeys.Backward) || Intellect.IsControlKeyPressed(GameControlKeys.Left) || Intellect.IsControlKeyPressed(GameControlKeys.Right); Ladder ladder = FindLadder(currentLadder != null, wantMove, lookDirection); if (ladder != currentLadder) { SetCurrentLadder(ladder); } if (currentLadder != null) { Line line = currentLadder.GetClimbingLine(); Vec3 projected = MathUtils.ProjectPointToLine(line.Start, line.End, Position); Vec3 newPosition = projected; float climbingSpeed = IsNeedRun() ? ladderClimbingSpeedRun : ladderClimbingSpeedWalk; Vec3 moveVector = Vec3.Zero; float lookingSide = new Radian(lookDirection.Vertical).InDegrees() > -20 ? 1 : -1; moveVector.Z += Intellect.GetControlKeyStrength(GameControlKeys.Forward) * lookingSide; moveVector.Z -= Intellect.GetControlKeyStrength(GameControlKeys.Backward) * lookingSide; newPosition += moveVector * (TickDelta * climbingSpeed); Position = newPosition; if (mainBody != null) { mainBody.LinearVelocity = Vec3.Zero; mainBody.AngularVelocity = Vec3.Zero; } } }
protected override void OnTick() { base.OnTick(); ResetCar(); TickCurrentGear(); TickMotorSound(); if (Type.CONF.Deformation) { if (attached_mesh != null) { attached_mesh.MeshObject.Mesh.SubMeshes[0].VertexData.GetSomeGeometry(ref changeable_vertex_pos, ref changeable_vertex_norm); if (changeable_vertex_pos.Count != 0) { if (Type.CONF.ParallelComputing) { DeformationMeshParallel(); } else { DeformationMesh(); } } } } if (PhysicsModel != null) { float handbrake = 0; if (Intellect != null) { handbrake = Intellect.GetControlKeyStrength(GameControlKeys.VehicleHandbrake); } else { handbrake = 1; } if (!IsInAir() & handbrake != 0 & (PhysicsModel.Bodies[0].LinearVelocity.Length() * 3600.0f / 1000.0f) > 30) { SoundPlay3D(Type.CONF.SoundBrake, .7f, true); foreach (RibbonTrail rt in rtbrake) { rt.Visible = true; } } else { foreach (RibbonTrail rt in rtbrake) { rt.Visible = false; } } } first_tick = false; }
void TickIntellect() { //horizontalMotor { float throttle = 0; throttle += Intellect.GetControlKeyStrength(GameControlKeys.Left); throttle -= Intellect.GetControlKeyStrength(GameControlKeys.Right); GearedMotor motor = PhysicsModel.GetMotor("horizontalMotor") as GearedMotor; if (motor != null) { motor.Throttle = throttle; } } //gibbetMotor { ServoMotor motor = PhysicsModel.GetMotor("gibbetMotor") as ServoMotor; if (motor != null) { Radian needAngle = motor.DesiredAngle; needAngle += Intellect.GetControlKeyStrength(GameControlKeys.Forward) * .004f; needAngle -= Intellect.GetControlKeyStrength(GameControlKeys.Backward) * .004f; MathFunctions.Clamp(ref needAngle, new Degree(-20.0f).InRadians(), new Degree(40.0f).InRadians()); motor.DesiredAngle = needAngle; } } //Change player LookDirection at rotation PlayerIntellect intellect = Intellect as PlayerIntellect; if (intellect != null) { Vec3 lookVector = intellect.LookDirection.GetVector(); lookVector *= OldRotation.GetInverse(); lookVector *= Rotation; intellect.LookDirection = SphereDir.FromVector(lookVector); } }
private void TickChassis() { bool onGround = leftTrack.onGround || rightTrack.onGround; OnGround = onGround; float leftTrackThrottle = 0; float rightTrackThrottle = 0; if (Intellect != null) { Reset(false); Wheels(); ShiftBooster(); GearchangeDtime(); //force for stability float speedkmph = GetRealSpeed() * 3; float speedpure = speedkmph - (speedkmph % 1); MapObjectAttachedBillboard ta1 = GetFirstAttachedObjectByAlias("tail1") as MapObjectAttachedBillboard; MapObjectAttachedBillboard ta2 = GetFirstAttachedObjectByAlias("tail2") as MapObjectAttachedBillboard; MapObjectAttachedBillboard ta3 = GetFirstAttachedObjectByAlias("tail3") as MapObjectAttachedBillboard; MapObjectAttachedBillboard ta4 = GetFirstAttachedObjectByAlias("tail4") as MapObjectAttachedBillboard; bool backlightred = false; bool backlightw = false; { ServoMotor THREF = PhysicsModel.GetMotor("FB") as ServoMotor; Radian FB = 0; float forward = Intellect.GetControlKeyStrength(GameControlKeys.Forward); leftTrackThrottle += forward; rightTrackThrottle += forward; float backward = Intellect.GetControlKeyStrength(GameControlKeys.Backward); leftTrackThrottle -= backward; rightTrackThrottle -= backward; if (Intellect.IsControlKeyPressed(GameControlKeys.Forward)) { if (GetRealSpeed() < 0.01) { backlightred = true; } FB++; } else if (Intellect.IsControlKeyPressed(GameControlKeys.Backward)) { FB--; if (GetRealSpeed() > 0.5) { backlightred = true; } if (GetRealSpeed() < 0.01) { backlightw = true; } } MathFunctions.Clamp(ref FB, new Degree(-1.0f).InRadians(), new Degree(1.0f).InRadians()); THREF.DesiredAngle = FB; if (ta1 != null) { ta1.Visible = backlightred; ta2.Visible = backlightred; ta3.Visible = backlightw; ta4.Visible = backlightw; } } { ServoMotor wmotor = PhysicsModel.GetMotor("wheel") as ServoMotor; ServoMotor wmotor_2 = PhysicsModel.GetMotor("wheel2") as ServoMotor; Radian needAngle = wmotor.DesiredAngle; float left = Intellect.GetControlKeyStrength(GameControlKeys.Left); float right = Intellect.GetControlKeyStrength(GameControlKeys.Right); if (left > 0) { needAngle -= 0.06f; } else if (right > 0) { needAngle += 0.06f; } else { needAngle = 0f; } float TBaseForce = 0; float Pspeed = GetRealSpeed(); if (Pspeed < 0) { Pspeed = -Pspeed; } TBaseForce = left + (-right); float speedcoef = 1; if (GetRealSpeed() < 10 && GetRealSpeed() > -10) { speedcoef = GetRealSpeed() / 10; } if (speedcoef < 0) { speedcoef = -speedcoef; } if (!Intellect.IsControlKeyPressed(GameControlKeys.Forward) && !Intellect.IsControlKeyPressed(GameControlKeys.Backward) && speedcoef != 1) { TBaseForce = TBaseForce * 1.5f; } if (GetRealSpeed() < 0) { TBaseForce = -TBaseForce; } float SpeedD = 120 / GetRealSpeed(); MathFunctions.Clamp(ref SpeedD, 1, 1.6f); float TMainForce = TBaseForce * chassisBody.Mass * SpeedD * 10; if (OnGround) { chassisBody.AddForce(ForceType.LocalTorque, TickDelta, new Vec3(0, 0, TMainForce * speedcoef * 2), Vec3.Zero); } MathFunctions.Clamp(ref needAngle, new Degree(-29.0f).InRadians(), new Degree(29.0f).InRadians()); if (wmotor != null) { wmotor.DesiredAngle = needAngle; wmotor_2.DesiredAngle = needAngle; } } } Vec3 localLinearVelocity = chassisBody.LinearVelocity * chassisBody.Rotation.GetInverse(); //add drive force float slopeForwardForceCoeffient; float slopeBackwardForceCoeffient; float slopeLinearDampingAddition; { Vec3 dir = chassisBody.Rotation.GetForward(); Radian slopeAngle = MathFunctions.ATan(dir.Z, dir.ToVec2().Length()); Radian maxAngle = MathFunctions.PI / 4;//new Degree(45) slopeForwardForceCoeffient = 1; if (slopeAngle > maxAngle) { slopeForwardForceCoeffient = 0; } slopeBackwardForceCoeffient = 1; if (slopeAngle < -maxAngle) { slopeBackwardForceCoeffient = 0; } MathFunctions.Clamp(ref slopeForwardForceCoeffient, 0, 1); MathFunctions.Clamp(ref slopeBackwardForceCoeffient, 0, 1); slopeLinearDampingAddition = localLinearVelocity.X > 0 ? slopeAngle : -slopeAngle; //slopeLinearDampingAddition *= 1; if (slopeLinearDampingAddition < 0) { slopeLinearDampingAddition = 0; } } if (leftTrack.onGround) { if (leftTrackThrottle > 0 && localLinearVelocity.X < Type.MaxForwardSpeed) { float force = localLinearVelocity.X > 0 ? currentGear.GearDriveForwardForce + NOSBoost + DownPower : currentGear.GearBrakeForce; force *= leftTrackThrottle; force *= slopeForwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, tracksPositionYOffset, 0)); } if (leftTrackThrottle < 0 && (-localLinearVelocity.X) < Type.MaxBackwardSpeed) { float force = currentGear.GearBrakeForce; //: Type.DriveBackwardForce; force *= leftTrackThrottle; force *= slopeBackwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, tracksPositionYOffset, 0)); } } if (rightTrack.onGround) { if (rightTrackThrottle > 0 && localLinearVelocity.X < Type.MaxForwardSpeed) { float force = localLinearVelocity.X > 0 ? currentGear.GearDriveForwardForce + NOSBoost + DownPower : currentGear.GearBrakeForce; force *= rightTrackThrottle; force *= slopeForwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, -tracksPositionYOffset, 0)); } if (rightTrackThrottle < 0 && (-localLinearVelocity.X) < Type.MaxBackwardSpeed) { float force = currentGear.GearBrakeForce; //: Type.DriveBackwardForce; force *= rightTrackThrottle; force *= slopeBackwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, -tracksPositionYOffset, 0)); } } //LinearVelocity if (onGround && localLinearVelocity != Vec3.Zero) { Vec3 velocity = localLinearVelocity; velocity.Y = 0; chassisBody.LinearVelocity = chassisBody.Rotation * velocity; } bool stop = false; // onGround && leftTrackThrottle == 0 && rightTrackThrottle == 0; bool noLinearVelocity = chassisBody.LinearVelocity.Equals(Vec3.Zero, .2f); bool noAngularVelocity = chassisBody.AngularVelocity.Equals(Vec3.Zero, .2f); //AngularDamping if (onGround) { //LinearDamping float linearDamping; if (stop) { linearDamping = noLinearVelocity ? 1 : 1; } else { linearDamping = .15f; } chassisBody.LinearDamping = linearDamping + slopeLinearDampingAddition; if (stop && noAngularVelocity) { chassisBody.AngularDamping = 5; } else { chassisBody.AngularDamping = 1; } } else { chassisBody.AngularDamping = 0.55f; chassisBody.LinearDamping = 0.05f; } }
private void TickIntellect(Intellect intellect) { Vec2 forceVec = Vec2.Zero; if (forceMoveVectorTimer != 0) { forceVec = forceMoveVector; } else { Vec2 vec = Vec2.Zero; vec.X += intellect.GetControlKeyStrength(GameControlKeys.Forward); vec.X -= intellect.GetControlKeyStrength(GameControlKeys.Backward); vec.Y += intellect.GetControlKeyStrength(GameControlKeys.Left); vec.Y -= intellect.GetControlKeyStrength(GameControlKeys.Right); forceVec = (new Vec3(vec.X, vec.Y, 0) * Rotation).ToVec2(); if (forceVec != Vec2.Zero) { float length = forceVec.Length(); if (length > 1) forceVec /= length; } } if (forceVec != Vec2.Zero) { float velocityCoefficient = 1; if (FastMoveInfluence != null) velocityCoefficient = FastMoveInfluence.Type.Coefficient; float maxVelocity; float force; if (IsOnGround()) { maxVelocity = Type.WalkMaxVelocity; force = Type.WalkForce; } else { maxVelocity = Type.FlyControlMaxVelocity; force = Type.FlyControlForce; } maxVelocity *= forceVec.Length(); //velocityCoefficient maxVelocity *= velocityCoefficient; force *= velocityCoefficient; if (mainBody.LinearVelocity.Length() < maxVelocity) mainBody.AddForce(ForceType.Global, 0, new Vec3(forceVec.X, forceVec.Y, 0) * force * TickDelta, Vec3.Zero); } if (!Z) return; CapsuleShape maincap = mainBody.Shapes[1] as CapsuleShape; CapsuleShape downcap = mainBody.Shapes[2] as CapsuleShape; if (Intellect.IsControlKeyPressed(GameControlKeys.Croutch)) { croutch = true; Type.Height = Type.HeightMax / 3; } else if (Type.FPSCameraOffset != new Vec3(0, 0, -0.5f)) { Type.Height = Type.HeightMax; croutch = false; } float length2 = Type.Height - Type.Radius * 2 - Type.WalkUpHeight; if (croutch) { Type.FPSCameraOffset = Vec3.Zero; Type.WalkMaxVelocity = 3; Type.WalkForce = 3000f; maincap.Position = new Vec3(0, 0, -0.5f); maincap.Length = length2 / 2; downcap.Position = new Vec3(0, 0, -0.5f); downcap.Length = 1.2f; } else if (!croutch && Type.FPSCameraOffset != new Vec3(0, 0, -0.5f)) { Type.WalkMaxVelocity = 7; Type.WalkForce = 6000f; Type.FPSCameraOffset = new Vec3(0, 0, 0.5f); maincap.Length = length2; maincap.Position = Vec3.Zero; downcap.Length = Type.Height - Type.BottomRadius * 2; downcap.Position = new Vec3(0, 0, (Type.Height - Type.WalkUpHeight) / 2 - Type.Height / 2); } TickRun(); lastTickForceVector = forceVec; //Update Run energy if (EntitySystemWorld.Instance.IsServer() && Type.NetworkType == EntityNetworkTypes.Synchronized) { Server_SendUpdateRunEnergyToClients( EntitySystemWorld.Instance.RemoteEntityWorlds); } }
private void TickIntellect() { //GUItest(); JetEngineBooster(); VSI = AKJetBody.LinearVelocity.Z - (AKJetBody.LinearVelocity.Z % 1); float speed = GetRealSpeed(); float ControlersRatio; MapObjectAttachedParticle ENBoosterParticle2 = GetFirstAttachedObjectByAlias("JetFire") as MapObjectAttachedParticle; AKunit akunit = GetPlayerUnit() as AKunit; Vec3 dir = AKJetBody.Rotation.GetForward(); AKJetOn = Intellect != null && Intellect.IsActive(); MASS = 0; foreach (Body body in PhysicsModel.Bodies) { MASS += body.Mass; } // controlers Ratio if (speed > 0) { ControlersRatio = speed / 80; if (ControlersRatio > 1) { ControlersRatio = 1; } } else { ControlersRatio = 0; } // controlers Ratio //////////////////////// WING WING WING WING WING WING WING WING WING WING WING ///////////////////////////////// //wing General Angles BodyAngles = Rotation.GetInverse().ToAngles(); float normalizeRoll = BodyAngles.Roll; if (normalizeRoll < 0) { normalizeRoll = -normalizeRoll; } float PitchUp = -BodyAngles.Pitch; if (PitchUp < 0) { PitchUp = 0; } if (PitchUp > 90) { PitchUp = 90 - (PitchUp - 90); } float PitchDown = BodyAngles.Pitch; if (PitchDown < 0) { PitchDown = 0; } if (PitchDown > 90) { PitchDown = 90 - (PitchDown - 90); } //End of Wing GENERAL //Wing Anti Gravity Force & Stall float WingUpForce; if (speed < 40f) { //stall if (VSI < 0 && PitchUp > 35f) { Stall = true; } else { Stall = false; } //force WingUpForce = ((speed / 4f) - 0.2f); } else if (speed > 40f) { WingUpForce = -PhysicsWorld.Instance.MainScene.Gravity.Z; //WingUpForce = 9.8f; //TODO:Incin change to map gravity } else { WingUpForce = 0; } //antigrav AKJetBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKJetBody.Rotation * new Vec3(0, 0, WingUpForce) * MASS, Vec3.Zero); //antivelo AKJetBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKJetBody.Rotation * new Vec3((-WingUpForce * PitchUp / 9) / 4, 0, 0) * MASS, Vec3.Zero); //END oF Wing Anit Gravity Force & Stall //Wing Decenging Force float DecendSpeedForce; if (VSI < 0 && PitchUp == 0) { DecendSpeedForce = (180 - normalizeRoll) + PitchDown; AKJetBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKJetBody.Rotation * new Vec3(DecendSpeedForce / 20, 0, 0) * MASS, Vec3.Zero); } //End of Wing Decenging Force /////// END END END ///OF OF OF/// WING WING WING WING WING WING WING WING WING WING WING ////////////////////////////// //engine force + sound pitch control if (Intellect.IsControlKeyPressed(GameControlKeys.Jump)) { if (akunit != null) { akunit.GunsTryFire(false); } } if (Intellect.IsControlKeyPressed(GameControlKeys.Forward)) { force += forceadd; } if (Intellect.IsControlKeyPressed(GameControlKeys.Backward)) { force -= forceadd; } if (ENBoosterParticle2 != null) { if (force > 85f) { ENBoosterParticle2.Visible = true; } else { ENBoosterParticle2.Visible = false; } } enpitch = (force / 80f); MathFunctions.Clamp(ref force, 0.1f, 100); MathFunctions.Clamp(ref enpitch, 0.8f, 1.3f); //update jet channel position and pitch if (rotorSoundChannel != null) { //update channel rotorSoundChannel.Pitch = enpitch; rotorSoundChannel.Volume = 1; rotorSoundChannel.Position = Position; //rotorSoundChannel.MinDistance = 10; } //end of engine force + sound pitch control //Forces //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //start jet Pitch (Y turn) if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Up) || Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Down)) { float AUp = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Up) / 2; float ADown = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Down) / 2; Hpitch += (AUp - ADown); MathFunctions.Clamp(ref Hpitch, -10, 10); } else { if (Hpitch != 0) { Hpitch -= Hpitch / 5; if ((Hpitch - (Hpitch % 1)) == 0) { Hpitch = 0; } } else { float mammadpitch = (AKJetBody.AngularVelocity * AKJetBody.Rotation.GetInverse()).Y * 2; MathFunctions.Clamp(ref mammadpitch, -10f, 10); AKJetBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKJetBody.Rotation * new Vec3(0, 0, -mammadpitch) * MASS, new Vec3(-8, 0, 0)); } } if (Hpitch != 0) { AKJetBody.AddForce(ForceType.GlobalTorque, TickDelta, AKJetBody.Rotation * new Vec3(0, ((Hpitch) * ControlersRatio), 0) * MASS, Vec3.Zero); } //end of jet pitch (Y turn) //start jet Z turn if (Intellect.IsControlKeyPressed(GameControlKeys.Right) || Intellect.IsControlKeyPressed(GameControlKeys.Left)) { float right = Intellect.GetControlKeyStrength(GameControlKeys.Right) / 2; float left = Intellect.GetControlKeyStrength(GameControlKeys.Left) / 2; TrunZ += (left - right); MathFunctions.Clamp(ref TrunZ, -10, 10); } else { if (TrunZ != 0) { TrunZ -= TrunZ / 5; if ((TrunZ - (TrunZ % 1)) == 0) { TrunZ = 0; } } } if (TrunZ != 0) { AKJetBody.AddForce(ForceType.GlobalTorque, TickDelta, AKJetBody.Rotation * new Vec3(0, 0, (TrunZ * 2) * ControlersRatio) * MASS, Vec3.Zero); } //end of jet Z turn //start jet X turn if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Right) || Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Left)) { float rightX = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Right) / 2; float leftX = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Left) / 2; TrunX += (rightX - leftX); MathFunctions.Clamp(ref TrunX, -10, 10); } else { if (TrunX != 0) { TrunX -= TrunX / 5; if ((TrunX - (TrunX % 1)) == 0) { TrunX = 0; } } } if (TrunX != 0) { AKJetBody.AddForce(ForceType.GlobalTorque, TickDelta, AKJetBody.Rotation * new Vec3(((TrunX * 2) * ControlersRatio), 0, 0) * MASS, Vec3.Zero); } //Pitch on Turn Pitch //float TurnPitch = AKJetBody.Rotation.GetInverse().ToAngles().Roll; //1 - Rotation.GetUp().Z; //if (TurnPitch < 0) TurnPitch = -TurnPitch; //if (TurnPitch > 90) TurnPitch = 90 - (TurnPitch - 90); //AKJetBody.AddForce(ForceType.GlobalTorque, TickDelta, // AKJetBody.Rotation * new Vec3(0, ((-TurnPitch /90) * ControlersRatio), 0) * MASS, Vec3.Zero); //End of Pitch on Turn //end of jet X turn //start of adding main Engine force MathFunctions.Clamp(ref force, 0.1f, 100); //if Max Alt is not reached add jet motor force if (AKJetBody.Position.Z < Type.MaxAlt) { float FinalEngineForce = (force / 2f) - ((PitchUp / 90) * 30); AKJetBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(FinalEngineForce, 0, 0) * MASS, Vec3.Zero); } //dampings AKJetBody.AngularDamping = 2f + (speed / 60); AKJetBody.LinearDamping = 0.4f; }
private void TickIntellect() { GUIshit(); MapObjectAttachedParticle JetFire1 = GetFirstAttachedObjectByAlias("JetFire1") as MapObjectAttachedParticle; MapObjectAttachedParticle JetFire2 = GetFirstAttachedObjectByAlias("JetFire2") as MapObjectAttachedParticle; float speed = GetRealSpeed(); AKunit akunit = GetPlayerUnit() as AKunit; Vec3 dir = AKVTOLBody.Rotation.GetForward(); Radian slopeAngle = MathFunctions.ATan(dir.Z, dir.ToVec2().Length()); MASS = 0; foreach (Body body in PhysicsModel.Bodies) { MASS += body.Mass; } ShiftBooster(); AKVTOLOn = Intellect != null && Intellect.IsActive(); // GUItest(); ALTray(); //engine force + sound pitch control if (Intellect.IsControlKeyPressed(GameControlKeys.Jump)) { if (akunit != null) { akunit.GunsTryFire(false); } } if (Intellect.IsControlKeyPressed(GameControlKeys.Forward)) { force += forceadd; } else if (Intellect.IsControlKeyPressed(GameControlKeys.Backward)) { force -= forceadd; } else { } if (Intellect.IsControlKeyPressed(GameControlKeys.VerticleTakeOff_L_EngineUp)) { EngineDir += 2f; } else if (Intellect.IsControlKeyPressed(GameControlKeys.VerticleTakeOff_L_EngineDown)) { EngineDir -= 2f; } else { } MathFunctions.Clamp(ref EngineDir, 0, 90); EngineApp.Instance.ScreenGuiRenderer.AddText("Throttle: " + force, new Vec2(.6f, .1f)); if (JetFire1 != null && JetFire2 != null) { if (force > 85f) { JetFire1.Visible = true; JetFire2.Visible = true; } else { JetFire1.Visible = false; JetFire2.Visible = false; } } enpitch = 0.8f + (0.6f * (force / 100)); MathFunctions.Clamp(ref force, 0.1f, 100); MathFunctions.Clamp(ref enpitch, 0.8f, 1.4f); //update jet channel position and pitch if (rotorSoundChannel != null) { //update channel rotorSoundChannel.Pitch = enpitch; rotorSoundChannel.Volume = 1; rotorSoundChannel.Position = Position; //rotorSoundChannel.MinDistance = 10; } //end of engine force + sound pitch control //Forces //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //start VTOL Pitch (Y turn) if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Up) || Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Down)) { float AUp = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Up) / 2; float ADown = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Down) / 2; Hpitch += (AUp - ADown); MathFunctions.Clamp(ref Hpitch, -10, 10); } else { if (Hpitch != 0) { Hpitch -= Hpitch / 5; if ((Hpitch - (Hpitch % 1)) == 0) { Hpitch = 0; } } else { float mammadpitch = (AKVTOLBody.AngularVelocity * AKVTOLBody.Rotation.GetInverse()).Y * 2; MathFunctions.Clamp(ref mammadpitch, -10f, 10); AKVTOLBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKVTOLBody.Rotation * new Vec3(0, 0, -mammadpitch) * MASS, new Vec3(-8, 0, 0)); EngineApp.Instance.ScreenGuiRenderer.AddText("MammadPitch: " + mammadpitch.ToString(), new Vec2(.1f, .2f)); } } if (Hpitch != 0) { AKVTOLBody.AddForce(ForceType.GlobalTorque, TickDelta, AKVTOLBody.Rotation * new Vec3(0, Hpitch, 0) * MASS, Vec3.Zero); } //end of VTOL pitch (Y turn) //start jet Z turn if (Intellect.IsControlKeyPressed(GameControlKeys.Right) || Intellect.IsControlKeyPressed(GameControlKeys.Left)) { float right = Intellect.GetControlKeyStrength(GameControlKeys.Right) / 2; float left = Intellect.GetControlKeyStrength(GameControlKeys.Left) / 2; TrunZ += (left - right); MathFunctions.Clamp(ref TrunZ, -10, 10); AKVTOLBody.AddForce(ForceType.LocalTorque, TickDelta, new Vec3(0, 0, TrunZ * 2) * MASS, Vec3.Zero); } else { TrunZ = 0; } //end of jet Z turn //start jet X turn if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Right) || Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Left)) { float rightX = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Right) / 2; float leftX = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Left) / 2; TrunX += (rightX - leftX); MathFunctions.Clamp(ref TrunX, -10, 10); AKVTOLBody.AddForce(ForceType.GlobalTorque, TickDelta, AKVTOLBody.Rotation * new Vec3(TrunX * 2, 0, 0) * MASS, Vec3.Zero); } else { TrunX = 0; } float SHOOT = AKVTOLBody.Rotation.GetInverse().ToAngles().Roll; //1 - Rotation.GetUp().Z; if (SHOOT < 0) { SHOOT = -SHOOT; } if (SHOOT > 90) { SHOOT = 90 - (SHOOT - 90); } AKVTOLBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKVTOLBody.Rotation * new Vec3(0, 0, -SHOOT / 180) * MASS, new Vec3(-8, 0, 0)); //end of jet X turn ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //adding anty Y movment force float Yshit = (AKVTOLBody.LinearVelocity * Rotation.GetInverse()).Y; EngineApp.Instance.ScreenGuiRenderer.AddText("Yshit: " + Yshit.ToString(), new Vec2(.6f, .3f)); EngineApp.Instance.ScreenGuiRenderer.AddText("roll: " + Rotation.ToAngles().Roll, new Vec2(.6f, .35f)); EngineApp.Instance.ScreenGuiRenderer.AddText("roll: " + (Rotation.GetInverse().ToAngles()).ToString(), new Vec2(.6f, .4f)); EngineApp.Instance.ScreenGuiRenderer.AddText("Edir: " + EngineDir.ToString(), new Vec2(.1f, .6f)); //start of adding force MathFunctions.Clamp(ref force, 0.1f, 100); EngineApp.Instance.ScreenGuiRenderer.AddText("speed: " + GetRealSpeed().ToString(), new Vec2(.6f, .15f)); GUItest(); //anti gravity when jet have speed (wings force) float antyshityforcy = GetRealSpeed() / 10; float slopeangleshit = 1.5f; MathFunctions.Clamp(ref antyshityforcy, 0, 10); if (slopeAngle > 0) { slopeangleshit = 1.5f - slopeAngle; } else { slopeangleshit = 0.5f; } if (GetRealSpeed() > 0) { AKVTOLBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(0, 0, antyshityforcy * slopeangleshit) * MASS, Vec3.Zero); } //if Max Alt is not reached add jet motor force if (AKVTOLBody.Position.Z < Type.MaxAlt) { AKVTOLBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, AKVTOLBody.Rotation * new Vec3(force / 2f * ((90 - EngineDir) / 90), 0, force / 8f * (EngineDir / 90)) * MASS, Vec3.Zero); } //dampings AKVTOLBody.AngularDamping = 2f + (speed / 60); AKVTOLBody.LinearDamping = 0.6f; ServoMotor Lenginem = PhysicsModel.GetMotor("LEngineM") as ServoMotor; ServoMotor Renginem = PhysicsModel.GetMotor("REngineM") as ServoMotor; if (Lenginem != null && Renginem != null) { float EngingDirRad = EngineDir * MathFunctions.PI / 180; Renginem.DesiredAngle = EngingDirRad; Lenginem.DesiredAngle = EngingDirRad; } }
private void TickChassis() { bool onGround = leftTrack.onGround || rightTrack.onGround; float leftTrackThrottle = 0; float rightTrackThrottle = 0; if (Intellect != null) { float forward = Intellect.GetControlKeyStrength(GameControlKeys.Forward); leftTrackThrottle += forward; rightTrackThrottle += forward; float backward = Intellect.GetControlKeyStrength(GameControlKeys.Backward); leftTrackThrottle -= backward; rightTrackThrottle -= backward; float left = Intellect.GetControlKeyStrength(GameControlKeys.Left); leftTrackThrottle -= left * 2; rightTrackThrottle += left * 2; float right = Intellect.GetControlKeyStrength(GameControlKeys.Right); leftTrackThrottle += right * 2; rightTrackThrottle -= right * 2; MathFunctions.Clamp(ref leftTrackThrottle, -1, 1); MathFunctions.Clamp(ref rightTrackThrottle, -1, 1); } //return if no throttle and sleeping if (chassisBody.Sleeping && rightTrackThrottle == 0 && leftTrackThrottle == 0) { return; } Vec3 localLinearVelocity = chassisBody.LinearVelocity * chassisBody.Rotation.GetInverse(); //add drive force float slopeForwardForceCoeffient; float slopeBackwardForceCoeffient; float slopeLinearDampingAddition; { Vec3 dir = chassisBody.Rotation.GetForward(); Radian slopeAngle = MathFunctions.ATan(dir.Z, dir.ToVec2().Length()); Radian maxAngle = MathFunctions.PI / 4;//new Degree(45) slopeForwardForceCoeffient = 1; if (slopeAngle > maxAngle) { slopeForwardForceCoeffient = 0; } slopeBackwardForceCoeffient = 1; if (slopeAngle < -maxAngle) { slopeBackwardForceCoeffient = 0; } MathFunctions.Clamp(ref slopeForwardForceCoeffient, 0, 1); MathFunctions.Clamp(ref slopeBackwardForceCoeffient, 0, 1); slopeLinearDampingAddition = localLinearVelocity.X > 0 ? slopeAngle : -slopeAngle; //slopeLinearDampingAddition *= 1; if (slopeLinearDampingAddition < 0) { slopeLinearDampingAddition = 0; } } if (leftTrack.onGround) { if (leftTrackThrottle > 0 && localLinearVelocity.X < Type.MaxForwardSpeed) { float force = localLinearVelocity.X > 0 ? Type.DriveForwardForce : Type.BrakeForce; force *= leftTrackThrottle; force *= slopeForwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, tracksPositionYOffset, 0)); } if (leftTrackThrottle < 0 && (-localLinearVelocity.X) < Type.MaxBackwardSpeed) { float force = localLinearVelocity.X > 0 ? Type.BrakeForce : Type.DriveBackwardForce; force *= leftTrackThrottle; force *= slopeBackwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, tracksPositionYOffset, 0)); } } if (rightTrack.onGround) { if (rightTrackThrottle > 0 && localLinearVelocity.X < Type.MaxForwardSpeed) { float force = localLinearVelocity.X > 0 ? Type.DriveForwardForce : Type.BrakeForce; force *= rightTrackThrottle; force *= slopeForwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, -tracksPositionYOffset, 0)); } if (rightTrackThrottle < 0 && (-localLinearVelocity.X) < Type.MaxBackwardSpeed) { float force = localLinearVelocity.X > 0 ? Type.BrakeForce : Type.DriveBackwardForce; force *= rightTrackThrottle; force *= slopeBackwardForceCoeffient; chassisBody.AddForce(ForceType.LocalAtLocalPos, TickDelta, new Vec3(force, 0, 0), new Vec3(0, -tracksPositionYOffset, 0)); } } //LinearVelocity if (onGround && localLinearVelocity != Vec3.Zero) { Vec3 velocity = localLinearVelocity; velocity.Y = 0; chassisBody.LinearVelocity = chassisBody.Rotation * velocity; } bool stop = onGround && leftTrackThrottle == 0 && rightTrackThrottle == 0; bool noLinearVelocity = chassisBody.LinearVelocity.Equals(Vec3.Zero, .2f); bool noAngularVelocity = chassisBody.AngularVelocity.Equals(Vec3.Zero, .2f); //LinearDamping float linearDamping; if (stop) { linearDamping = noLinearVelocity ? 5 : 1; } else { linearDamping = .15f; } chassisBody.LinearDamping = linearDamping + slopeLinearDampingAddition; //AngularDamping if (onGround) { if (stop && noAngularVelocity) { chassisBody.AngularDamping = 5; } else { chassisBody.AngularDamping = 1; } } else { chassisBody.AngularDamping = .15f; } //sleeping if (!chassisBody.Sleeping && stop && noLinearVelocity && noAngularVelocity) { chassisSleepTimer += TickDelta; if (chassisSleepTimer > 1) { chassisBody.Sleeping = true; } } else { chassisSleepTimer = 0; } }
private Vec2 GetMovementByControlKeys() { Vec2 localVector = Vec2.Zero; if (EntitySystemWorld.Instance.IsServer() || EntitySystemWorld.Instance.IsDedicatedServer()) { PlayerManager.ServerOrSingle_Player player = null; player = PlayerManager.Instance.ServerOrSingle_GetPlayer(Intellect); if (GameMap.Instance != null && player.Intellect == Intellect) //PlayerIntellect.Instance == Intellect) { localVector.X -= Intellect.GetControlKeyStrength(GameControlKeys.Forward); // +this.Type.SpeedForward; localVector.X += Intellect.GetControlKeyStrength(GameControlKeys.Backward); // +this.Type.SpeedBackward; localVector.Y -= Intellect.GetControlKeyStrength(GameControlKeys.Left); // +this.Type.SpeedLeft; localVector.Y += Intellect.GetControlKeyStrength(GameControlKeys.Right); // +this.Type.SpeedRight; if (localVector != Vec2.Zero) { Vec2 diff = Position.ToVec2() - TurnToPosition.ToVec2();;// *Rotation.GetForward().ToVec2();//RendererWorld.Instance.DefaultCamera.Position.ToVec2(); Degree angle = new Radian(MathFunctions.ATan(diff.Y, diff.X)); Degree vecAngle = new Radian(MathFunctions.ATan(-localVector.Y, localVector.X)); Quat rot = new Angles(0, 0, vecAngle - angle).ToQuat(); Vec2 vector = (rot * new Vec3(1, 0, 0)).ToVec2(); return(vector); } else { return(Vec2.Zero); } } return(Vec2.Zero); } else if (EntitySystemWorld.Instance.IsSingle()) { if (GameMap.Instance != null && PlayerIntellect.Instance == Intellect) { localVector.X -= Intellect.GetControlKeyStrength(GameControlKeys.Forward); // +this.Type.SpeedForward; localVector.X += Intellect.GetControlKeyStrength(GameControlKeys.Backward); // +this.Type.SpeedBackward; localVector.Y -= Intellect.GetControlKeyStrength(GameControlKeys.Left); // +this.Type.SpeedLeft; localVector.Y += Intellect.GetControlKeyStrength(GameControlKeys.Right); // +this.Type.SpeedRight; if (localVector != Vec2.Zero) { Vec2 diff = Position.ToVec2() - TurnToPosition.ToVec2();;// *Rotation.GetForward().ToVec2();//RendererWorld.Instance.DefaultCamera.Position.ToVec2(); Degree angle = new Radian(MathFunctions.ATan(diff.Y, diff.X)); Degree vecAngle = new Radian(MathFunctions.ATan(-localVector.Y, localVector.X)); Quat rot = new Angles(0, 0, vecAngle - angle).ToQuat(); Vec2 vector = (rot * new Vec3(1, 0, 0)).ToVec2(); return(vector); } else { return(Vec2.Zero); } } return(Vec2.Zero); } return(Vec2.Zero); //// if (localVector != Vec2.Zero) //// { //// localVector.Normalize(); //// //calculate force vector with considering camera orientation //// Vec2 diff = Position.ToVec2() - RendererWorld.Instance.DefaultCamera.Position.ToVec2(); //// //new Vec3( RendererWorld.Instance.DefaultCamera.Position.X,RendererWorld.Instance.DefaultCamera.Position.Y, Damager_Ball_Player.Position.Z); //// //diff.Z += this.Type.BallRadius; //// Degree angle = new Radian(MathFunctions.ATan(diff.Y, diff.X)); //// Degree vecAngle = new Radian(MathFunctions.ATan(-vec.Y, vec.X)); //// Quat rot = new Angles(0, 0, vecAngle - angle).ToQuat(); //// Vec2 forceVector2 = (rot * new Vec3(1, 0, 0)).ToVec2(); //// Vec2 forceVector = new Vec2(forceVector2.X, forceVector2.Y); //// return forceVector; //// } //// else return vec; ////} ////else //// return vec; }
private void TickIntellect() { ShiftBooster(); HelliOn = Intellect != null && Intellect.IsActive(); // GUItest(); //finding motors GearedMotor main = PhysicsModel.GetMotor("hellimain") as GearedMotor; GearedMotor back = PhysicsModel.GetMotor("helliback") as GearedMotor; if (HelliOn) { main.Enabled = true; back.Enabled = true; } //engine force + sound pitch control if (Intellect.IsControlKeyPressed(GameControlKeys.Forward)) { force += forceadd; enpitch += 0.02f; } else if (Intellect.IsControlKeyPressed(GameControlKeys.Backward)) { dec = true; force -= forceadd; enpitch -= 0.02f; } else { dec = false; enpitch -= 0.01f; if (force > 50) { force -= forceadd; } if (force < 50) { force += forceadd; } } MathFunctions.Clamp(ref force, 0.1f, 100 + Type.MaxForce); MathFunctions.Clamp(ref enpitch, 0.8f, 1.3f); //update helli channel position and pitch if (rotorSoundChannel != null) { //update channel rotorSoundChannel.Pitch = enpitch; rotorSoundChannel.Volume = 1; rotorSoundChannel.Position = Position; //rotorSoundChannel.MinDistance = 10; } //end of engine force + sound pitch control //Forces //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //start helli Pitch if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Up) || Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Down)) { float AUp = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Up) / 2; float ADown = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Down) / 2; Hpitch += (AUp - ADown); MathFunctions.Clamp(ref Hpitch, -10, 10); HelliBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, HelliBody.Rotation * new Vec3(0, 0, Hpitch / 2) * HelliBody.Mass, new Vec3(-2, 0, 0)); } else { Hpitch = 0; } //end of helli pitch //start helli Z turn if (Intellect.IsControlKeyPressed(GameControlKeys.Right) || Intellect.IsControlKeyPressed(GameControlKeys.Left)) { float right = Intellect.GetControlKeyStrength(GameControlKeys.Right) / 2; float left = Intellect.GetControlKeyStrength(GameControlKeys.Left) / 2; TrunZ += (left - right); MathFunctions.Clamp(ref TrunZ, -10, 10); HelliBody.AddForce(ForceType.GlobalTorque, TickDelta, HelliBody.Rotation * new Vec3(0, 0, TrunZ) * HelliBody.Mass, Vec3.Zero); } else { TrunZ = 0; } //end of helli Z turn //start helli X turn if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Right) || Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Left)) { float rightX = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Right) / 2; float leftX = Intellect.GetControlKeyStrength(GameControlKeys.Arrow_Left) / 2; TrunX += (rightX - leftX); MathFunctions.Clamp(ref TrunX, -10, 10); HelliBody.AddForce(ForceType.GlobalTorque, TickDelta, HelliBody.Rotation * new Vec3(TrunX / 5, 0, 0) * HelliBody.Mass, Vec3.Zero); } else { TrunX = 0; } //end of helli X turn ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //start of adding force MathFunctions.Clamp(ref force, 0.1f, 100); //anti gravity when helli is not decending if (dec == false) { HelliBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, new Vec3(0, 0, 2) * HelliBody.Mass, Vec3.Zero); } //if Max Alt is not reached add helli motor force if (GetRealAlt() < Type.MaxAlt) { HelliBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, HelliBody.Rotation * 2 * new Vec3(0, 0, force / 7) * HelliBody.Mass, Vec3.Zero); } //dampings HelliBody.AngularDamping = 1.5f; HelliBody.LinearDamping = 0.4f; //another anti gravity force if (HelliBody.LinearVelocity.Z < 0) { HelliBody.AddForce(ForceType.GlobalAtLocalPos, TickDelta, HelliBody.Rotation * new Vec3(0, 0, -HelliBody.LinearVelocity.Z) * HelliBody.Mass, Vec3.Zero); } }
Vec2 GetMovementVectorByControlKeys() { //use specified force move vector if (forceMoveVectorTimer != 0) { return(forceMoveVector); } //TPS arcade specific //vector is depending on camera orientation if (GameMap.Instance != null && GameMap.Instance.GameType == GameMap.GameTypes.TPSArcade && PlayerIntellect.Instance == Intellect) { //this is not adapted for networking. //using RendererWorld.Instance.DefaultCamera is bad. Vec2 localVector = Vec2.Zero; localVector.X += Intellect.GetControlKeyStrength(GameControlKeys.Forward); localVector.X -= Intellect.GetControlKeyStrength(GameControlKeys.Backward); localVector.Y += Intellect.GetControlKeyStrength(GameControlKeys.Left); localVector.Y -= Intellect.GetControlKeyStrength(GameControlKeys.Right); if (localVector != Vec2.Zero) { Vec2 diff = Position.ToVec2() - RendererWorld.Instance.DefaultCamera.Position.ToVec2(); Degree angle = new Radian(MathFunctions.ATan(diff.Y, diff.X)); Degree vecAngle = new Radian(MathFunctions.ATan(-localVector.Y, localVector.X)); Quat rot = new Angles(0, 0, vecAngle - angle).ToQuat(); Vec2 vector = (rot * new Vec3(1, 0, 0)).ToVec2(); return(vector); } else { return(Vec2.Zero); } } //PlatformerDemo specific if (GameMap.Instance != null && GameMap.Instance.GameType == GameMap.GameTypes.PlatformerDemo && PlayerIntellect.Instance == Intellect) { Vec2 vector = Vec2.Zero; vector.X -= Intellect.GetControlKeyStrength(GameControlKeys.Left); vector.X += Intellect.GetControlKeyStrength(GameControlKeys.Right); return(vector); } //default behaviour { Vec2 localVector = Vec2.Zero; localVector.X += Intellect.GetControlKeyStrength(GameControlKeys.Forward); localVector.X -= Intellect.GetControlKeyStrength(GameControlKeys.Backward); localVector.Y += Intellect.GetControlKeyStrength(GameControlKeys.Left); localVector.Y -= Intellect.GetControlKeyStrength(GameControlKeys.Right); Vec2 vector = (new Vec3(localVector.X, localVector.Y, 0) * Rotation).ToVec2(); if (vector != Vec2.Zero) { float length = vector.Length(); if (length > 1) { vector /= length; } } return(vector); } }
private void TickIntellect(Intellect intellect) { Vec2 forceVec = Vec2.Zero; if (forceMoveVectorTimer != 0) { forceVec = forceMoveVector; } else { Vec2 vec = Vec2.Zero; vec.X += intellect.GetControlKeyStrength(GameControlKeys.Forward); vec.X -= intellect.GetControlKeyStrength(GameControlKeys.Backward); vec.Y += intellect.GetControlKeyStrength(GameControlKeys.Left); vec.Y -= intellect.GetControlKeyStrength(GameControlKeys.Right); forceVec = (new Vec3(vec.X, vec.Y, 0) * Rotation).ToVec2(); if (forceVec != Vec2.Zero) { float length = forceVec.Length(); if (length > 1) { forceVec /= length; } } } if (forceVec != Vec2.Zero) { float velocityCoefficient = 1; if (FastMoveInfluence != null) { velocityCoefficient = FastMoveInfluence.Type.Coefficient; } float maxVelocity; float force; if (IsOnGround()) { maxVelocity = Type.WalkMaxVelocity; force = Type.WalkForce; } else { maxVelocity = Type.FlyControlMaxVelocity; force = Type.FlyControlForce; } maxVelocity *= forceVec.Length(); //velocityCoefficient maxVelocity *= velocityCoefficient; force *= velocityCoefficient; if (mainBody.LinearVelocity.Length() < maxVelocity) { mainBody.AddForce(ForceType.Global, 0, new Vec3(forceVec.X, forceVec.Y, 0) * force * TickDelta, Vec3.Zero); } } if (!Z) { return; } CapsuleShape maincap = mainBody.Shapes[1] as CapsuleShape; CapsuleShape downcap = mainBody.Shapes[2] as CapsuleShape; if (Intellect.IsControlKeyPressed(GameControlKeys.Croutch)) { croutch = true; Type.Height = Type.HeightMax / 3; } else if (Type.FPSCameraOffset != new Vec3(0, 0, -0.5f)) { Type.Height = Type.HeightMax; croutch = false; } float length2 = Type.Height - Type.Radius * 2 - Type.WalkUpHeight; if (croutch) { Type.FPSCameraOffset = Vec3.Zero; Type.WalkMaxVelocity = 3; Type.WalkForce = 3000f; maincap.Position = new Vec3(0, 0, -0.5f); maincap.Length = length2 / 2; downcap.Position = new Vec3(0, 0, -0.5f); downcap.Length = 1.2f; } else if (!croutch && Type.FPSCameraOffset != new Vec3(0, 0, -0.5f)) { Type.WalkMaxVelocity = 7; Type.WalkForce = 6000f; Type.FPSCameraOffset = new Vec3(0, 0, 0.5f); maincap.Length = length2; maincap.Position = Vec3.Zero; downcap.Length = Type.Height - Type.BottomRadius * 2; downcap.Position = new Vec3(0, 0, (Type.Height - Type.WalkUpHeight) / 2 - Type.Height / 2); } TickRun(); lastTickForceVector = forceVec; //Update Run energy if (EntitySystemWorld.Instance.IsServer() && Type.NetworkType == EntityNetworkTypes.Synchronized) { Server_SendUpdateRunEnergyToClients( EntitySystemWorld.Instance.RemoteEntityWorlds); } }