sandstormexposure.c
class SandstormZoneSmall_TESTONLYclass SandstormExposureMdfrBaseclass SandstormExposureStaticMdfrclass SandstormExposureDynamicMdfr
class SandstormZoneSmall_TESTONLY : ContaminatedArea_Static
{
override void OnPlayerEnterServer(PlayerBase player, EffectTrigger trigger)
{
player.GetModifiersManager().ActivateModifier(eModifiers.MDF_SANDSTORM_EXPOSURE_STATIC);
}
override void OnPlayerExitServer(PlayerBase player, EffectTrigger trigger)
{
player.GetModifiersManager().DeactivateModifier(eModifiers.MDF_SANDSTORM_EXPOSURE_STATIC);
}
}
class SandstormExposureMdfrBase : ModifierBase
{
protected const float SILICOSIS_AGENTS_PER_SEC = 1.0;
protected const float EYES_IRRITATION_AGENTS_PER_SEC = 1.0;
private ref PluginTransmissionAgents m_AgentTransmision;
private ref SymptomBase m_SquintSymptom;
override void Init()
{
m_TrackActivatedTime = false;
m_AnalyticsStatsEnabled = true;
m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE_SHORT;
m_AgentTransmision = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
}
override void OnActivate(PlayerBase player)
{
m_SquintSymptom = player.GetSymptomManager().QueueUpSecondarySymptomEx(SymptomIDs.SYMPTOM_SQUINT);
TransmitAgents(eAgents.SILICOSIS, player, 1);
TransmitAgents(eAgents.EYES_IRRITATION, player, 1);
}
override void OnDeactivate(PlayerBase player)
{
player.GetSymptomManager().RemoveSecondarySymptom(SymptomIDs.SYMPTOM_SQUINT);
}
protected float TransmitAgents(int type, PlayerBase player, float count)
{
if (player.IsUnconscious())
return 0.0;
return m_AgentTransmision.TransmitAgentsEx(null, player, AGT_AIRBOURNE_SOLID, count, type);
}
}
class SandstormExposureStaticMdfr : SandstormExposureMdfrBase
{
override void Init()
{
super.Init();
m_ID = eModifiers.MDF_SANDSTORM_EXPOSURE_STATIC;
DisableActivateCheck();
DisableDeactivateCheck();
}
override bool ActivateCondition(PlayerBase player)
{
return false;
}
override bool DeactivateCondition(PlayerBase player)
{
return false;
}
override void OnTick(PlayerBase player, float deltaT)
{
TransmitAgents(eAgents.SILICOSIS, m_Player, SILICOSIS_AGENTS_PER_SEC * deltaT);
TransmitAgents(eAgents.EYES_IRRITATION, m_Player, EYES_IRRITATION_AGENTS_PER_SEC * deltaT);
}
}
class SandstormExposureDynamicMdfr : SandstormExposureMdfrBase
{
private const float COUGH_INTERVAL_MIN = 3.0; //! seconds
private const float COUGH_INTERVAL_MAX = 25.0; //! seconds
private ScriptedSandstormController m_SandstormController;
protected float m_CoughTimer;
override void Init()
{
super.Init();
m_ID = eModifiers.MDF_SANDSTORM_EXPOSURE_DYNAMIC;
m_SandstormController = ScriptedSandstormController.Cast(g_Game.GetWeather().GetSandstorm());
}
override bool ActivateCondition(PlayerBase player)
{
return (player && m_SandstormController.IsActive() && m_SandstormController.GetIntensityForPlayer(player) > 0.0);
}
override bool DeactivateCondition(PlayerBase player)
{
return (player && m_SandstormController.IsActive() && m_SandstormController.GetIntensityForPlayer(player) <= 0.0);
}
override void OnTick(PlayerBase player, float deltaT)
{
if (!m_SandstormController.IsActive())
return;
float sandstormIntensity = m_SandstormController.GetIntensityForPlayer(player);
HandleCoughing(player, sandstormIntensity, deltaT);
TransmitAgents(eAgents.SILICOSIS, player, sandstormIntensity * SILICOSIS_AGENTS_PER_SEC * deltaT);
TransmitAgents(eAgents.EYES_IRRITATION, player, sandstormIntensity * EYES_IRRITATION_AGENTS_PER_SEC * deltaT);
}
protected void HandleCoughing(PlayerBase player, float sandstormIntensity, float deltaTime)
{
CachedEquipmentStorageQuery query = new CachedEquipmentStorageQuery();
query.m_Category = ECachedEquipmentItemCategory.EYEWEAR|ECachedEquipmentItemCategory.MASK;
query.m_Placement = ECachedEquipmentPlacement.ATTACHMENT;
query.m_MaximumDepth = 2;
float protectionLevel = 0.0;
ItemBase coverItem = null;
array<Entity> coverItems = player.GetCachedEquipment().GetEntitiesByCategory(query);
int coverItemsCount = coverItems.Count();
for (int i = 0; i < coverItemsCount; ++i)
{
coverItem = ItemBase.Cast(coverItems[i]);
protectionLevel = coverItem.GetProtectionLevel(DEF_DUST_PARTICLE_BREATH);
if (protectionLevel > 0.0)
break;
}
float coughIntensity = Math.Clamp(sandstormIntensity - protectionLevel, 0.0, 1.0);;
float coughInterval = Math.Lerp(COUGH_INTERVAL_MAX, COUGH_INTERVAL_MIN, coughIntensity);
if (coughIntensity > 0.0)
m_CoughTimer += deltaTime;
else
m_CoughTimer = 0.0;
if (m_CoughTimer >= coughInterval)
{
m_CoughTimer = 0.0;
Math.Randomize(Math.RandomInt(1, 1000));
float rand = Math.RandomFloat01();
if (rand <= coughIntensity)
player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_COUGH);
}
}
}