WaterLevel.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //============================================================================================
  2. // Spirenkov Maxim, 2006
  3. //============================================================================================
  4. // Mission objects
  5. //============================================================================================
  6. // WaterLevel
  7. //============================================================================================
  8. #include "WaterLevel.h"
  9. WaterLevelAccessor::WaterLevelAccessor()
  10. {
  11. };
  12. //Инициализировать объект
  13. bool WaterLevelAccessor::Create(MOPReader & reader)
  14. {
  15. level = reader.Float();
  16. bool activateState = reader.Bool();
  17. connectID = reader.String();
  18. Activate(activateState);
  19. return true;
  20. }
  21. //Активировать
  22. void WaterLevelAccessor::Activate(bool isActive)
  23. {
  24. static const GroupId waterLevelGroup = MG_WATERLEVEL;
  25. MissionObject::Activate(isActive);
  26. IWaterLevel::GetWaterLevel(Mission(), ptr);
  27. if(isActive)
  28. {
  29. Registry(waterLevelGroup);
  30. Assert(ptr.Validate());
  31. ((WaterLevel *)ptr.Ptr())->SetLevel(level);
  32. if(connectID.NotEmpty())
  33. {
  34. UpdateLevel(0.0f, 0);
  35. SetUpdate(&WaterLevelAccessor::UpdateLevel, ML_EXECUTE9);
  36. }
  37. }else{
  38. DelUpdate();
  39. Unregistry(waterLevelGroup);
  40. MGIObject it(GroupIterator(waterLevelGroup, _FL_));
  41. if(it.IsDone())
  42. {
  43. ((WaterLevel *)ptr.Ptr())->SetLevel(0.0f);
  44. }else{
  45. ((WaterLevel *)ptr.Ptr())->SetLevel(((WaterLevelAccessor *)it.Get())->level);
  46. }
  47. }
  48. }
  49. //Привязка к объекту
  50. void _cdecl WaterLevelAccessor::UpdateLevel(float dltTime, long level)
  51. {
  52. Assert(connectID.NotEmpty());
  53. if(connect.Validate())
  54. {
  55. float lvl = connect.SPtr()->GetMatrix(Matrix()).pos.y;
  56. ((WaterLevel *)ptr.SPtr())->SetLevel(lvl);
  57. }else{
  58. FindObject(connectID, connect);
  59. }
  60. }
  61. void WaterLevel::SetLevel(float lvl)
  62. {
  63. level = lvl;
  64. }
  65. MOP_BEGINLISTCG(WaterLevelAccessor, "Water level", '1.00', 0x0, "Set current water level", "Managment")
  66. MOP_FLOAT("Level", 0.0f)
  67. MOP_BOOLC("Active", false, "Active object in start mission time")
  68. MOP_STRING("Connect to object", "")
  69. MOP_ENDLIST(WaterLevelAccessor)
  70. MOP_BEGINLIST(WaterLevel, "", '1.00', 0)
  71. MOP_ENDLIST(WaterLevel)