Raycaster.c
// 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 ( !g_Game.IsServer() || !g_Game.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 ( !g_Game.IsServer() || !g_Game.IsMultiplayer() ) // Client side
{
StopPeriodicMeasurement();
}
}
override void SetActions()
{
super.SetActions();
AddAction(ActionTurnOnWhileInHands);
AddAction(ActionTurnOffWhileInHands);
}
}