DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ EOnPostFrame()

override void Car::EOnPostFrame ( IEntity other,
int extra )
inlineprotected

WheelContact

См. определение в файле CarScript.c строка 675

676 {
677 float carSpeed = GetVelocity(this).Length();
678 ParticleParamsOverrideData particleParamsData;
679
680 //FX only on Client and in Single
681 if ( !g_Game.IsHeadlessOrDedicatedServer() )
682 {
683 if (EngineIsOn())
684 {
685 if (!m_VFXComponent.IsEffectPlayed(EVehicleVFXEffect.EXHAUST_SMOKE))
686 {
687 particleParamsData = m_VFXComponent.GetParticleParamsOverrideData(EVehicleVFXEffect.EXHAUST_SMOKE);
688 particleParamsData.m_FloatModifiers.InsertAt(carSpeed, 0);
689 m_VFXComponent.PlayEffect(EVehicleVFXEffect.EXHAUST_SMOKE);
690 m_VFXComponent.SetEffectParticleState(EVehicleVFXEffect.EXHAUST_SMOKE, ParticleList.HATCHBACK_EXHAUST_SMOKE);
691 }
692
693 if (IsVitalRadiator() && GetFluidFraction(CarFluid.COOLANT) < 0.5)
694 {
695 if (!m_VFXComponent.IsEffectPlayed(EVehicleVFXEffect.COOLANT_STEAM))
696 m_VFXComponent.PlayEffect(EVehicleVFXEffect.COOLANT_STEAM);
697 else
698 {
699 if (GetFluidFraction(CarFluid.COOLANT) > 0)
700 m_VFXComponent.SetEffectParticleState(EVehicleVFXEffect.COOLANT_STEAM, ParticleList.HATCHBACK_COOLANT_OVERHEATING);
701 else
702 m_VFXComponent.SetEffectParticleState(EVehicleVFXEffect.COOLANT_STEAM, ParticleList.HATCHBACK_COOLANT_OVERHEATED);
703 }
704 }
705 else
706 m_VFXComponent.StopEffect(EVehicleVFXEffect.COOLANT_STEAM);
707 }
708 else
709 {
710 m_VFXComponent.StopEffect(EVehicleVFXEffect.EXHAUST_SMOKE);
711 m_VFXComponent.StopEffect(EVehicleVFXEffect.COOLANT_STEAM);
712 }
713
714 string surface;
715
716 if (carSpeed > EffVehicleDust.WHEEL_DUST_THRESHOLD)
717 {
718 particleParamsData = m_VFXComponent.GetParticleParamsOverrideData(EVehicleVFXEffect.DUST_BEHIND);
719 particleParamsData.m_FloatModifiers.InsertAt(carSpeed, 0);
720 particleParamsData.m_FloatModifiers.InsertAt(GetWeightCoef(), 1);
721 m_VFXComponent.PlayEffect(EVehicleVFXEffect.DUST_BEHIND);
722 }
723 else
724 m_VFXComponent.StopEffect(EVehicleVFXEffect.DUST_BEHIND);
725
726
727 int wheelCount = WheelCount();
728 TVectorArray wheelsPosition = new TVectorArray();
729
730 int i;
731 for (i = 0; i < wheelCount; ++i)
732 wheelsPosition.InsertAt(Vector(-1, -1, -1), i);
733
734 for (i = 0; i < wheelCount; ++i)
735 {
736 CarWheel wheel = CarWheel.Cast(WheelGetEntity(i));
737 if (!wheel)
738 break;
739
740 vector wheelPos;
741 if (m_VFXComponent.CanPlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE))
742 {
743 if (WheelHasContact(i))
744 {
745 float wheelSpeed = WheelGetAngularVelocity(i) * wheel.GetRadius();
746 wheelPos = WheelGetContactPosition(i);
747 wheelPos = WorldToModel(wheelPos);
748 wheelsPosition.Set(i, wheelPos);
749
750 vector wheelVel = dBodyGetVelocityAt(this, wheelPos);
751
752 vector transform[3];
753 transform[2] = WheelGetDirection(i);
754 transform[1] = vector.Up;
755 transform[0] = transform[2] * transform[1];
756
757 wheelVel = wheelVel.InvMultiply3(transform);
758
759 float bodySpeed = wheelVel[2];
760
761 bool applyWheelSmokeEffect = false;
762
763 if ((wheelSpeed > 0 && bodySpeed > 0) || (wheelSpeed < 0 && bodySpeed < 0))
764 applyWheelSmokeEffect = Math.AbsFloat(wheelSpeed) > Math.AbsFloat(bodySpeed) + EffWheelSmoke.WHEEL_SMOKE_THRESHOLD;
765 else
766 applyWheelSmokeEffect = Math.AbsFloat(wheelSpeed) > EffWheelSmoke.WHEEL_SMOKE_THRESHOLD;
767
768 if (applyWheelSmokeEffect)
769 {
770 m_VFXComponent.SetEffectGroupPositions(EVehicleVFXEffectGroup.WHEEL_SMOKE, wheelsPosition);
771 m_VFXComponent.PlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE);
772 }
773 else
774 m_VFXComponent.StopEffectGroup(EVehicleVFXEffectGroup.WHEEL_SMOKE);
775 }
776 }
777
778 // actual wheel position
779 wheelPos = WheelGetPositionLS(i);
780 wheelsPosition.Set(i, wheelPos);
781
782
784 {
785 if (m_VFXComponent.CanPlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT))
786 {
787 bool applyWheelContactEffect = Math.AbsFloat(wheelSpeed) > EffWheelContact.SPEED_THRESHOLD;
788
789 if (wheel && applyWheelContactEffect)
790 {
791 particleParamsData = m_VFXComponent.GetEffectGroupParticleParamsOverrideData(EVehicleVFXEffectGroup.WHEEL_CONTACT);
792 particleParamsData.m_FloatModifiers.InsertAt(carSpeed, 0);
793 particleParamsData.m_FloatModifiers.InsertAt(GetWeightCoef(), 1);
794 m_VFXComponent.SetSurfaceInfo(WheelGetSurface(i));
795 m_VFXComponent.SetEffectGroupPositions(EVehicleVFXEffectGroup.WHEEL_CONTACT, wheelsPosition);
796
797 m_VFXComponent.PlayEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT);
798 }
799 else
800 m_VFXComponent.StopEffectGroup(EVehicleVFXEffectGroup.WHEEL_CONTACT);
801 }
802 }
803 }
804 }
805 }
ReplaceWheelLambda CarWheel
CarFluid
Type of vehicle's fluid. (native, do not change or extend)
Определения Car.c:18
DayZGame g_Game
Определения DayZGame.c:4074
EVehicleVFXEffect
Identifiers of individual vehicle VFX effects.
Определения EVehicleVFXTypes.c:3
proto native vector WheelGetPositionLS(int wheelIdx)
proto native EntityAI WheelGetEntity(int wheelIdx)
proto native int WheelCount()
How many wheel can be attached to a motorbike (hubs only)
proto native bool WheelHasContact(int wheelIdx)
proto native bool EngineIsOn()
Returns true when engine is running, false otherwise.
proto native vector WheelGetDirection(int wheelIdx)
proto native float GetFluidFraction(MotorbikeFluid fluid)
proto native vector WheelGetContactPosition(int wheelIdx)
proto native SurfaceInfo WheelGetSurface(int wheelIdx)
proto native float WheelGetAngularVelocity(int wheelIdx)
override float GetWeightCoef()
bool IsVitalRadiator()
Определения CarScript.c:2206
ref VehicleVFXComponent m_VFXComponent
Определения CarScript.c:189
proto native float Length()
Returns length of vector (magnitude)
proto vector InvMultiply3(vector mat[3])
Invert-transforms vector.
static const vector Up
Определения EnConvert.c:120
array< vector > TVectorArray
Определения EnScript.c:738
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
proto native vector dBodyGetVelocityAt(notnull IEntity body, vector globalpos)
proto native vector GetVelocity(notnull IEntity ent)
Returns linear velocity.

Перекрестные ссылки Math::AbsFloat(), dBodyGetVelocityAt(), EngineIsOn(), g_Game, GetFluidFraction(), GetVelocity(), GetWeightCoef(), ParticleList::HATCHBACK_COOLANT_OVERHEATED, ParticleList::HATCHBACK_COOLANT_OVERHEATING, ParticleList::HATCHBACK_EXHAUST_SMOKE, vector::InvMultiply3(), CarScript::IsVitalRadiator(), vector::Length(), m_VFXComponent, EffWheelContact::SPEED_THRESHOLD, vector::Up, Vector(), EffVehicleDust::WHEEL_DUST_THRESHOLD, EffWheelSmoke::WHEEL_SMOKE_THRESHOLD, WheelCount(), WheelGetAngularVelocity(), WheelGetContactPosition(), WheelGetDirection(), WheelGetEntity(), WheelGetPositionLS(), WheelGetSurface() и WheelHasContact().