// In this file you will find both Static and Dynamic contaminated area triggers
class ContaminatedTrigger extends EffectTrigger
{
const float DAMAGE_TICK_RATE = 10;//deal damage every n-th second
override string GetDisplayName()
{
return "#STR_contaminatedarea";
}
// ----------------------------------------------
// TRIGGER EVENTS
// ----------------------------------------------
override void OnEnterServerEvent( TriggerInsider insider )
{
super.OnEnterServerEvent( insider );
//Print("Entered A " + GetType());
if ( insider )
{
DayZCreatureAI creature = DayZCreatureAI.Cast( insider.GetObject() );
if (creature)
creature.IncreaseEffectTriggerCount();
}
}
override void OnLeaveServerEvent( TriggerInsider insider )
{
super.OnLeaveServerEvent( insider );
//Print("Left A " + GetType());
if ( insider )
{
DayZCreatureAI creature = DayZCreatureAI.Cast( insider.GetObject() );
if (creature)
creature.DecreaseEffectTriggerCount();
}
}
override void OnEnterClientEvent( TriggerInsider insider )
{
super.OnEnterClientEvent( insider );
}
override void OnLeaveClientEvent( TriggerInsider insider )
{
super.OnLeaveClientEvent( insider );
}
override void OnStayStartServerEvent(int nrOfInsiders)
{
m_TimeAccuStay += m_DeltaTime;
if (m_TimeAccuStay > DAMAGE_TICK_RATE)
{
m_DealDamageFlag = true;
//this is where we would normally reset the m_TimeAccuStay, but we need the value as deltaT when dealing damage to the insiders, so we reset it only after the insider update in OnStayFinishServerEvent
}
}
override void OnStayFinishServerEvent()
{
if(m_DealDamageFlag)//the flag was previously set to true, the insiders have been updated at this point, reset the flag and the timer as well
{
m_TimeAccuStay = 0;
m_DealDamageFlag = false;
}
}
override void OnStayServerEvent(TriggerInsider insider, float deltaTime)
{
if ( m_DealDamageFlag )
{
DayZCreatureAI creature = DayZCreatureAI.Cast( insider.GetObject());
if(creature && creature.m_EffectTriggerCount != 0)
creature.DecreaseHealth("", "", GameConstants.AI_CONTAMINATION_DMG_PER_SEC * m_TimeAccuStay / creature.m_EffectTriggerCount);// we devide by m_EffectTriggerCount for multiple trigger presence(overlapping triggers)
}
}
override string GetAmbientSoundsetName()
{
return "ContaminatedArea_SoundSet";
}
}
class ContaminatedTrigger_Dynamic : ContaminatedTrigger
{
protected int m_AreaState; // Used to get the state from linked area and update effects
void ContaminatedTrigger_Dynamic()
{
RegisterNetSyncVariableInt("m_AreaState");
// Register in the trigger effect manager
m_Manager = TriggerEffectManager.GetInstance();
m_Manager.RegisterTriggerType( this );
}
void SetAreaState( int state )
{
m_AreaState = state;
SetSynchDirty();
}
override protected void OnStayClientEvent(TriggerInsider insider, float deltaTime)
{
//no super, overriding parent behaviour
if ( insider.GetObject().IsMan() )
{
PlayerBase playerInsider = PlayerBase.Cast( insider.GetObject() );
// We will only handle the controlled player, as effects are only relevant to this player instance
if ( playerInsider.IsControlledPlayer() )
{
// We check if we are not in the standard LIVE state
bool nonDefaultState = m_AreaState > eAreaDecayStage.LIVE;
if ( nonDefaultState )
{
// if not we check the specific state and update local effect values
int localPartBirthRate;
if ( m_AreaState == eAreaDecayStage.DECAY_START )
localPartBirthRate = 20;
else
localPartBirthRate = 10;
playerInsider.RequestTriggerEffect(this, m_PPERequester, m_AroundPartId, m_TinyPartId, GetAmbientSoundsetName(), nonDefaultState, localPartBirthRate );
}
else
playerInsider.RequestTriggerEffect(this, m_PPERequester, m_AroundPartId, m_TinyPartId, GetAmbientSoundsetName() );
}
}
}
override void OnVariablesSynchronized()
{
super.OnVariablesSynchronized();
// Is the controlled player inside when trigger is synchronized
for ( int i = 0; i < GetInsiders().Count(); i++ )
{
PlayerBase playerInsider = PlayerBase.Cast( m_insiders.Get( i ).GetObject() );
if ( playerInsider )
{
if ( playerInsider.IsControlledPlayer() )
{
// Update Local particle effects
bool nonDefaultState = m_AreaState > eAreaDecayStage.LIVE;
if ( nonDefaultState )
{
int localPartBirthRate;
if ( m_AreaState == eAreaDecayStage.DECAY_START )
localPartBirthRate = 20;
else
localPartBirthRate = 10;
//Update the local effects
playerInsider.RequestTriggerEffect(this, m_PPERequester, m_AroundPartId, m_TinyPartId, GetAmbientSoundsetName(), nonDefaultState, localPartBirthRate, true );
}
return;
}
}
}
}
}
class ContaminatedTrigger_Local : ContaminatedTrigger
{
override string GetAmbientSoundsetName()
{
return "";
}
}
Esc
↑↓ to navigate · ↵ to open · type Class.member to scope