private void TickSound() { bool lastMotorOn = AKJetOn; AKJetOn = Intellect != null && Intellect.IsActive(); //sound on, off if (AKJetOn != lastMotorOn) { if (AKJetOn) { Sound sound = SoundWorld.Instance.SoundCreate(Type.SoundOn, SoundMode.Mode3D); if (sound != null) { soundOnChannel = SoundWorld.Instance.SoundPlay(sound, EngineApp.Instance.DefaultSoundChannelGroup, .7f, true); if (soundOnChannel != null) { soundOnChannel.Position = Position; soundOnChannel.Pause = false; } } //SoundPlay3D(Type.SoundOn, .7f, true); } else { EngineOff(); SoundPlay3D(Type.SoundOff, 0.7f, true); } } string needSoundName = null; if (AKJetOn) { needSoundName = Type.SoundIdle; } if (needSoundName != currentRotorSoundName) { currentRotorSoundName = needSoundName; if (!string.IsNullOrEmpty(needSoundName)) { Sound sound = SoundWorld.Instance.SoundCreate(needSoundName, SoundMode.Mode3D | SoundMode.Loop); if (sound != null) { rotorSoundChannel = SoundWorld.Instance.SoundPlay( sound, EngineApp.Instance.DefaultSoundChannelGroup, 1, true); rotorSoundChannel.Position = Position; rotorSoundChannel.Pause = false; } } } }
private void TickMotorSound() { bool lastMotorOn = motorOn; motorOn = Intellect != null && Intellect.IsActive(); //sound on, off if (motorOn != lastMotorOn) { if (!firstTick && Health != 0) { if (motorOn) { Sound sound = SoundWorld.Instance.SoundCreate(Type.SoundOn, SoundMode.Mode3D); if (sound != null) { soundOnChannel = SoundWorld.Instance.SoundPlay(sound, EngineApp.Instance.DefaultSoundChannelGroup, .7f, true); if (soundOnChannel != null) { soundOnChannel.Position = Position; soundOnChannel.Pause = false; } } //SoundPlay3D(Type.SoundOn, .7f, true); } else { SoundPlay3D(Type.SoundOff, .7f, true); } } } string needSoundName = null; if (motorOn && currentGear != null) { needSoundName = currentGear.SoundMotor; } if (needSoundName != currentMotorSoundName) { //change motor sound if (motorSoundChannel != null) { motorSoundChannel.Stop(); motorSoundChannel = null; } currentMotorSoundName = needSoundName; if (!string.IsNullOrEmpty(needSoundName)) { Sound sound = SoundWorld.Instance.SoundCreate(needSoundName, SoundMode.Mode3D | SoundMode.Loop); if (sound != null) { motorSoundChannel = SoundWorld.Instance.SoundPlay( sound, EngineApp.Instance.DefaultSoundChannelGroup, .3f, true); motorSoundChannel.Position = Position; motorSoundChannel.Pause = false; } } } //update motor channel position and pitch if (motorSoundChannel != null) { Range speedRangeAbs = currentGear.SpeedRange; if (speedRangeAbs.Minimum < 0 && speedRangeAbs.Maximum < 0) { speedRangeAbs = new Range(-speedRangeAbs.Maximum, -speedRangeAbs.Minimum); } Range pitchRange = currentGear.SoundMotorPitchRange; float speedAbs = Math.Abs(GetTracksSpeed()); float speedCoef = 0; if (speedRangeAbs.Size() != 0) { speedCoef = (speedAbs - speedRangeAbs.Minimum) / speedRangeAbs.Size(); } MathFunctions.Clamp(ref speedCoef, 0, 1); float carpitch; //update channel if (!OnGround) { if (Intellect.IsControlKeyPressed(GameControlKeys.Arrow_Up)) { carpitch = pitchRange.Minimum + pitchRange.Size(); } else { carpitch = pitchRange.Minimum; } } else { carpitch = pitchRange.Minimum + speedCoef * pitchRange.Size(); } motorSoundChannel.Pitch = carpitch; motorSoundChannel.Position = Position; } }
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 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); } }
void TickMotorSound() { bool last_motor_on = motor_on; motor_on = Intellect != null && Intellect.IsActive(); //sound on, off if (motor_on != last_motor_on) { if (!first_tick && Health != 0) { if (motor_on) { SoundPlay3D(Type.CONF.SoundOn, .7f, true); } else { SoundPlay3D(Type.CONF.SoundOff, .7f, true); } } } string need_sound_name = null; if (motor_on && current_gears != null) { need_sound_name = current_gears.SoundMotor; } if (need_sound_name != current_motor_sound_name) { //change motor sound if (motor_sound_channel != null) { motor_sound_channel.Stop(); motor_sound_channel = null; } current_motor_sound_name = need_sound_name; if (!string.IsNullOrEmpty(need_sound_name)) { Sound sound = SoundWorld.Instance.SoundCreate( RelativePathUtils.ConvertToFullPath(Path.GetDirectoryName(Type.FilePath), need_sound_name), SoundMode.Mode3D | SoundMode.Loop); if (sound != null) { motor_sound_channel = SoundWorld.Instance.SoundPlay( sound, EngineApp.Instance.DefaultSoundChannelGroup, .3f, true); motor_sound_channel.Position = Position; switch (Type.SoundRolloffMode) { case DynamicType.SoundRolloffModes.Logarithmic: motor_sound_channel.SetLogarithmicRolloff(Type.SoundMinDistance, Type.SoundMaxDistance, Type.SoundRolloffLogarithmicFactor); break; case DynamicType.SoundRolloffModes.Linear: motor_sound_channel.SetLinearRolloff(Type.SoundMinDistance, Type.SoundMaxDistance); break; } motor_sound_channel.Pause = false; } } } //update motor channel position and pitch if (motor_sound_channel != null) { Range speed_range_abs = current_gears.SpeedRange; if (speed_range_abs.Minimum < 0 && speed_range_abs.Maximum < 0) { speed_range_abs = new Range(-speed_range_abs.Maximum, -speed_range_abs.Minimum); } Range pitch_range = current_gears.SoundMotorPitchRange; float speed_abs = (PhysicsModel.Bodies[0].LinearVelocity.Length() * 3600.0f / 1000.0f); float speed_coef = 0; if (speed_range_abs.Size() != 0) { speed_coef = (speed_abs - speed_range_abs.Minimum) / speed_range_abs.Size(); } MathFunctions.Clamp(ref speed_coef, 0, 1); //update channel motor_sound_channel.Pitch = pitch_range.Minimum + speed_coef * pitch_range.Size(); motor_sound_channel.Position = Position; } }