raycaster.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Item for raycast debugging. It's also fun to play around with at night.
  2. class Raycaster extends ItemBase
  3. {
  4. protected ref Timer m_Timer;
  5. override void OnWorkStart()
  6. {
  7. if ( !GetGame().IsServer() || !GetGame().IsMultiplayer() ) // Client side
  8. {
  9. StartPeriodicMeasurement();
  10. }
  11. }
  12. void StartPeriodicMeasurement()
  13. {
  14. if( !m_Timer )
  15. {
  16. m_Timer = new Timer;
  17. }
  18. m_Timer.Run( 0.01, this, "PrepareMeasurement", null, true );
  19. }
  20. void PrepareMeasurement()
  21. {
  22. DoMeasurement();
  23. DoMeasurement();
  24. }
  25. void DoMeasurement()
  26. {
  27. float dispersion = 80;
  28. vector from = GetPosition() + ( GetMemoryPointPos("beamStart") + ((GetOrientation()+Vector(90,0,0)).AnglesToVector()*0.3) );
  29. 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) );
  30. vector to = from + (ori.AnglesToVector() )* 30;
  31. vector contact_pos;
  32. vector contact_dir;
  33. int contactComponent;
  34. bool is_collision = DayZPhysics.RaycastRV( from, to, contact_pos, contact_dir, contactComponent, NULL , NULL, GetHierarchyRootPlayer(), false, false, ObjIntersectIFire);
  35. if (is_collision)
  36. {
  37. vector hit_normal = contact_dir.VectorToAngles();
  38. hit_normal[1] = hit_normal[1] + 90;
  39. // Generate result
  40. Particle p = ParticleManager.GetInstance().PlayInWorld(ParticleList.DEBUG_DOT, contact_pos);
  41. p.SetOrientation(hit_normal);
  42. }
  43. }
  44. void StopPeriodicMeasurement()
  45. {
  46. if( m_Timer )
  47. {
  48. m_Timer.Stop();
  49. }
  50. }
  51. override void OnWorkStop()
  52. {
  53. if ( !GetGame().IsServer() || !GetGame().IsMultiplayer() ) // Client side
  54. {
  55. StopPeriodicMeasurement();
  56. }
  57. }
  58. override void SetActions()
  59. {
  60. super.SetActions();
  61. AddAction(ActionTurnOnWhileInHands);
  62. AddAction(ActionTurnOffWhileInHands);
  63. }
  64. }