123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- // Item for raycast debugging. It's also fun to play around with at night.
- class Raycaster extends ItemBase
- {
- protected ref Timer m_Timer;
-
- override void OnWorkStart()
- {
- if ( !GetGame().IsServer() || !GetGame().IsMultiplayer() ) // Client side
- {
- StartPeriodicMeasurement();
- }
- }
-
- void StartPeriodicMeasurement()
- {
- if( !m_Timer )
- {
- m_Timer = new Timer;
- }
-
- m_Timer.Run( 0.01, this, "PrepareMeasurement", null, true );
- }
-
- void PrepareMeasurement()
- {
- DoMeasurement();
- DoMeasurement();
- }
-
- void DoMeasurement()
- {
- float dispersion = 80;
-
- vector from = GetPosition() + ( GetMemoryPointPos("beamStart") + ((GetOrientation()+Vector(90,0,0)).AnglesToVector()*0.3) );
- vector ori = GetOrientation() + Vector(90,0,0) + Vector(dispersion/2 - Math.RandomFloat(0, dispersion) , dispersion/2 - Math.RandomFloat(0, dispersion) , dispersion/2 - Math.RandomFloat(0, dispersion) );
- vector to = from + (ori.AnglesToVector() )* 30;
- vector contact_pos;
- vector contact_dir;
- int contactComponent;
-
- bool is_collision = DayZPhysics.RaycastRV( from, to, contact_pos, contact_dir, contactComponent, NULL , NULL, GetHierarchyRootPlayer(), false, false, ObjIntersectIFire);
-
- if (is_collision)
- {
- vector hit_normal = contact_dir.VectorToAngles();
- hit_normal[1] = hit_normal[1] + 90;
-
- // Generate result
- Particle p = ParticleManager.GetInstance().PlayInWorld(ParticleList.DEBUG_DOT, contact_pos);
- p.SetOrientation(hit_normal);
- }
- }
-
- void StopPeriodicMeasurement()
- {
- if( m_Timer )
- {
- m_Timer.Stop();
- }
- }
- override void OnWorkStop()
- {
- if ( !GetGame().IsServer() || !GetGame().IsMultiplayer() ) // Client side
- {
- StopPeriodicMeasurement();
- }
- }
-
- override void SetActions()
- {
- super.SetActions();
-
- AddAction(ActionTurnOnWhileInHands);
- AddAction(ActionTurnOffWhileInHands);
- }
- }
|