Inverter.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //===========================================================================================================================
  2. // Spirenkov Maxim, 2003
  3. //===========================================================================================================================//
  4. // Mission objects
  5. //===========================================================================================================================
  6. // Inverter
  7. //============================================================================================
  8. #include "Inverter.h"
  9. //============================================================================================
  10. Inverter::Inverter() : objects(_FL_),
  11. commands(_FL_)
  12. {
  13. }
  14. Inverter::~Inverter()
  15. {
  16. }
  17. //============================================================================================
  18. //Инициализировать объект
  19. bool Inverter::Create(MOPReader & reader)
  20. {
  21. objects.DelAll();
  22. commands.DelAll();
  23. isDown = false;
  24. target.Reset();
  25. ignoreDistance = 5.0f;
  26. if(!DetectorObject::Create(reader)) return false;
  27. //Получим идентификатор объекта
  28. targetID = reader.String();
  29. //Получим позицию
  30. Vector pos = reader.Position();
  31. //Получим направление
  32. Vector ang = reader.Angles();
  33. mtx.Build(ang, pos);
  34. //Плоскость
  35. plane.normal = mtx.vz;
  36. plane.Move(pos);
  37. //Матрица преобразования
  38. imtx = mtx;
  39. imtx.Inverse();
  40. //Получим размеры
  41. width05 = reader.Float()*0.5f;
  42. height05 = reader.Float()*0.5f;
  43. //Состояние
  44. Activate(reader.Bool());
  45. long count = reader.Array();
  46. bool state = false;
  47. for(long i = 0; i < count; i++)
  48. {
  49. Element & elm = objects[objects.Add()];
  50. elm.pointer.Reset();
  51. elm.objectId = reader.String();
  52. elm.forward.changeShow = reader.TripleLogic(state);
  53. elm.forward.show = state;
  54. elm.back.changeShow = reader.TripleLogic(state);
  55. elm.back.show = state;
  56. elm.forward.changeActive = reader.TripleLogic(state);
  57. elm.forward.active = state;
  58. elm.back.changeActive = reader.TripleLogic(state);
  59. elm.back.active = state;
  60. elm.commandsIndex = commands;
  61. elm.commandsCount = reader.Array();
  62. commands.AddElements(elm.commandsCount*2);
  63. for(long j = 0; j < elm.commandsCount*2; j++)
  64. {
  65. Command & cmd = commands[elm.commandsIndex + j];
  66. cmd.command = reader.String().c_str();
  67. cmd.paramsCount = reader.Array();
  68. Assert(cmd.paramsCount <= 8);
  69. for(long k = 0; k < 8; k++)
  70. {
  71. if(k < cmd.paramsCount)
  72. {
  73. cmd.params[k] = reader.String().c_str();
  74. }else{
  75. cmd.params[k] = null;
  76. }
  77. }
  78. }
  79. UpdateObject(elm);
  80. }
  81. //Сбрасывать ли состояние после срабатывания
  82. autoReset = true;
  83. //Одно или двух сторонний
  84. isDoubleSide = true;
  85. //
  86. ignoreDistance = reader.Float();
  87. //Ищим объект среди существующих
  88. return UpdateTarget();
  89. }
  90. //Активация детектора
  91. void Inverter::ActivateDetector(const char * initiatorID)
  92. {
  93. if(!EditMode_IsOn())
  94. {
  95. long isBack;
  96. if(plane*targetPos < 0.0f)
  97. {
  98. LogicDebug("Set forward states");
  99. isBack = 0;
  100. }else{
  101. LogicDebug("Set back states");
  102. isBack = 1;
  103. }
  104. for(long i = 0; i < objects; i++)
  105. {
  106. Element & elm = objects[i];
  107. if(UpdateObject(elm))
  108. {
  109. LittleTrigger & trg = isBack ? elm.back : elm.forward;
  110. if(trg.changeShow)
  111. {
  112. elm.pointer.Ptr()->Show(trg.show);
  113. }
  114. if(trg.changeActive)
  115. {
  116. elm.pointer.Ptr()->Activate(trg.active);
  117. }
  118. for(long j = 0; j < elm.commandsCount; j++)
  119. {
  120. Command & cmd = commands[elm.commandsIndex + j*2 + isBack];
  121. elm.pointer.Ptr()->Command(cmd.command, cmd.paramsCount, cmd.params);
  122. }
  123. }
  124. }
  125. }
  126. }
  127. //Обновить цель
  128. bool Inverter::UpdateObject(Element & elm)
  129. {
  130. if(elm.pointer.Validate())
  131. {
  132. return true;
  133. }
  134. return FindObject(elm.objectId, elm.pointer);
  135. }
  136. //============================================================================================
  137. //Параметры инициализации
  138. //============================================================================================
  139. MOP_BEGINLISTCG(Inverter, "Inverter", '1.00', 0x0fffffff, "Detector invert states if mission object intersection it.", "Logic")
  140. MOP_STRING("Object id", "Player")
  141. MOP_POSITION("Position", Vector(0.0f))
  142. MOP_ANGLES("Angles", Vector(0.0f))
  143. MOP_FLOATEX("Width", 1.0f, 0.01f, 1000000.0f)
  144. MOP_FLOATEX("Height", 1.0f, 0.01f, 1000000.0f)
  145. MOP_BOOL("Active", true)
  146. MOP_ARRAYBEG("Objects", 0, 100)
  147. MOP_STRING("Object id", "")
  148. MOP_ENUMTL("Show forward")
  149. MOP_ENUMTL("Show back")
  150. MOP_ENUMTL("Activate forward")
  151. MOP_ENUMTL("Activate back")
  152. MOP_ARRAYBEG("Commands", 0, 100)
  153. MOP_STRINGC("Forward", "", "Forward direction command")
  154. MOP_ARRAYBEG("Forward params", 0, 8)
  155. MOP_STRING("Param", "")
  156. MOP_ARRAYEND
  157. MOP_STRINGC("Back", "", "Back direction command")
  158. MOP_ARRAYBEG("Back params", 0, 8)
  159. MOP_STRING("Param", "")
  160. MOP_ARRAYEND
  161. MOP_ARRAYEND
  162. MOP_ARRAYEND
  163. MOP_FLOATEXC("Ignore distance", 5.0f, 0.1f, 1000000.0f, "If length of target path per frame more then this distance, detector ignore that moving")
  164. MOP_ENDLIST(Inverter)