poisoning.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. class PoisoningMdfr : ModifierBase
  2. {
  3. static const int AGENT_THRESHOLD_ACTIVATE = 1;
  4. static const int AGENT_THRESHOLD_DEACTIVATE = 40;
  5. static const int VOMIT_OCCURRENCES_MIN = 2;
  6. static const int VOMIT_OCCURRENCES_MAX = 5;
  7. static const int WATER_DRAIN_FROM_VOMIT = 70;
  8. static const int ENERGY_DRAIN_FROM_VOMIT = 55;
  9. private float m_ExhaustionTimer;
  10. private bool m_Exhaustion;
  11. override void Init()
  12. {
  13. m_TrackActivatedTime = true;
  14. m_AnalyticsStatsEnabled = true;
  15. m_IsPersistent = true;
  16. m_ID = eModifiers.MDF_POISONING;
  17. m_TickIntervalInactive = DEFAULT_TICK_TIME_INACTIVE;
  18. m_TickIntervalActive = DEFAULT_TICK_TIME_ACTIVE;
  19. }
  20. override string GetDebugText()
  21. {
  22. return ("Activate threshold: "+AGENT_THRESHOLD_ACTIVATE + "| " +"Deativate threshold: "+AGENT_THRESHOLD_DEACTIVATE);
  23. }
  24. override bool ActivateCondition(PlayerBase player)
  25. {
  26. return (player.GetSingleAgentCount(eAgents.FOOD_POISON) >= AGENT_THRESHOLD_ACTIVATE);
  27. }
  28. override bool DeactivateCondition(PlayerBase player)
  29. {
  30. return !ActivateCondition(player);
  31. }
  32. override void OnActivate(PlayerBase player)
  33. {
  34. player.IncreaseDiseaseCount();
  35. }
  36. override void OnReconnect(PlayerBase player)
  37. {
  38. this.OnActivate(player);
  39. }
  40. override void OnDeactivate(PlayerBase player)
  41. {
  42. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  43. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  44. m_Exhaustion = false;
  45. m_ExhaustionTimer = 0;
  46. player.DecreaseDiseaseCount();
  47. }
  48. override void OnTick(PlayerBase player, float deltaT)
  49. {
  50. int agentCount = player.m_AgentPool.GetSingleAgentCount(eAgents.FOOD_POISON);
  51. if (agentCount <= AGENT_THRESHOLD_DEACTIVATE)
  52. return;
  53. int agentMax = PluginTransmissionAgents.GetAgentMaxCount(eAgents.FOOD_POISON);
  54. float invertedAgentCountValue = Math.InverseLerp(0, agentMax, agentCount);
  55. float chance = Math.Lerp(VOMIT_OCCURRENCES_MIN, VOMIT_OCCURRENCES_MAX, invertedAgentCountValue);
  56. chance = (chance / 300) * deltaT;
  57. if (Math.RandomFloat01() < chance)
  58. {
  59. SymptomBase symptom = player.GetSymptomManager().QueueUpPrimarySymptom(SymptomIDs.SYMPTOM_VOMIT);
  60. if (symptom)
  61. {
  62. CachedObjectsParams.PARAM1_FLOAT.param1 = 30.0 * invertedAgentCountValue;
  63. symptom.SetParam(CachedObjectsParams.PARAM1_FLOAT);
  64. symptom.SetDuration(Math.Max(3.0, 10 * invertedAgentCountValue));
  65. //player.m_AgentPool.ReduceAgent(eAgents.FOOD_POISON, 100.0 * invertedAgentCountValue);
  66. player.m_AgentPool.ReduceAgent(eAgents.FOOD_POISON, 60);
  67. if (m_Player.GetStatWater().Get() > (WATER_DRAIN_FROM_VOMIT))
  68. m_Player.GetStatWater().Add(-1 * WATER_DRAIN_FROM_VOMIT);
  69. if (m_Player.GetStatEnergy().Get() > (ENERGY_DRAIN_FROM_VOMIT))
  70. m_Player.GetStatEnergy().Add(-1 * ENERGY_DRAIN_FROM_VOMIT);
  71. player.GetStaminaHandler().ActivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  72. player.GetStaminaHandler().ActivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  73. m_Exhaustion = true;
  74. m_ExhaustionTimer = 0;
  75. }
  76. }
  77. if (m_Exhaustion)
  78. {
  79. m_ExhaustionTimer += deltaT;
  80. if (m_ExhaustionTimer >= 30 * invertedAgentCountValue)
  81. {
  82. player.GetStaminaHandler().DeactivateRecoveryModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  83. player.GetStaminaHandler().DeactivateDepletionModifier(EStaminaMultiplierTypes.VOMIT_EXHAUSTION);
  84. m_Exhaustion = false;
  85. }
  86. }
  87. }
  88. //! DEPRECATED
  89. static const int VOMIT_OCCURRENCES_PER_HOUR_MIN = 60;
  90. static const int VOMIT_OCCURRENCES_PER_HOUR_MAX = 120;
  91. }