LiveWatcher.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "LiveWatcher.h"
  2. LiveWatcher::LiveWatcher()
  3. {
  4. }
  5. LiveWatcher::~LiveWatcher()
  6. {
  7. }
  8. //Инициализировать объект
  9. bool LiveWatcher::Create(MOPReader & reader)
  10. {
  11. ConstString objId = reader.String();
  12. if(!FindObject(objId, object))
  13. {
  14. LogicDebugError("Mission object \"%s\" not found, skip LiveWatcher creation", objId.c_str());
  15. return false;
  16. }
  17. triggerHP = reader.Float()*0.01f;
  18. trigger.Init(reader);
  19. Activate(reader.Bool());
  20. return true;
  21. }
  22. //Активировать
  23. void LiveWatcher::Activate(bool isActive)
  24. {
  25. MissionObject::Activate(isActive);
  26. if(!EditMode_IsOn())
  27. {
  28. if(IsActive())
  29. {
  30. LogicDebug("Activate");
  31. SetUpdate(&LiveWatcher::Work, ML_TRIGGERS);
  32. }else{
  33. LogicDebug("Deactivate");
  34. DelUpdate(&LiveWatcher::Work);
  35. }
  36. }else{
  37. DelUpdate(&LiveWatcher::Work);
  38. }
  39. }
  40. //Инициализировать объект
  41. bool LiveWatcher::EditMode_Create(MOPReader & reader)
  42. {
  43. return true;
  44. }
  45. //Обновить параметры
  46. bool LiveWatcher::EditMode_Update(MOPReader & reader)
  47. {
  48. return true;
  49. }
  50. //Работа детектора
  51. void _cdecl LiveWatcher::Work(float dltTime, long level)
  52. {
  53. if(!object.Validate())
  54. {
  55. LogicDebugError("Lost object pointer, detector is off");
  56. object.Reset();
  57. Activate(false);
  58. return;
  59. }
  60. float hp = object.Ptr()->GetHP();
  61. float maxhp = object.Ptr()->GetMaxHP();
  62. if(maxhp > 0.0f)
  63. {
  64. float level = hp/maxhp;
  65. if(level < triggerHP)
  66. {
  67. LogicDebug("Triggering with object HP = %f", level*100.0f);
  68. trigger.Activate(Mission(), false);
  69. Activate(false);
  70. return;
  71. }
  72. }else{
  73. LogicDebugError("Invalidate object (\"%s\") MaxHP (%f<=0), detector is off", object.Ptr()->GetObjectID().c_str(), maxhp);
  74. object.Reset();
  75. Activate(false);
  76. return;
  77. }
  78. }
  79. MOP_BEGINLISTCG(LiveWatcher, "Live watcher", '1.00', 0x0fffffff, "This detector watching object HP and triggering when HP down more then setting", "Logic")
  80. MOP_STRING("Object id", "")
  81. MOP_FLOATEXC("HP", 50.0f, 0.0f, 100.0f, "Relative HP value in percents when decector triggering")
  82. MOP_MISSIONTRIGGERG("Trigger", "")
  83. MOP_BOOL("Active", true)
  84. MOP_ENDLIST(LiveWatcher)