missionbase.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. class MissionBase extends MissionBaseWorld
  2. {
  3. PluginDeveloper m_ModuleDeveloper;
  4. PluginKeyBinding m_ModuleKeyBinding
  5. ref WidgetEventHandler m_WidgetEventHandler;
  6. ref WorldData m_WorldData;
  7. ref WorldLighting m_WorldLighting;
  8. ref array<PlayerBase> m_DummyPlayers = new array<PlayerBase>;
  9. autoptr ObjectSnapCallback m_InventoryDropCallback;
  10. protected ref DynamicMusicPlayer m_DynamicMusicPlayer;
  11. protected ref DynamicMusicPlayerRegistry m_DynamicMusicPlayerRegistry;
  12. void MissionBase()
  13. {
  14. SetDispatcher(new DispatcherCaller);
  15. PluginManagerInit();
  16. m_WidgetEventHandler = new WidgetEventHandler();
  17. m_InventoryDropCallback = new EntityPlacementCallback();
  18. SoundSetMap.Init();
  19. GetDayZGame().GetYieldDataInitInvoker().Insert(InitWorldYieldDataDefaults);
  20. InitialiseWorldData();
  21. #ifndef SERVER
  22. GetDayZGame().GetAnalyticsClient().RegisterEvents();
  23. m_WorldLighting = new WorldLighting();
  24. m_DynamicMusicPlayer = new DynamicMusicPlayer(m_DynamicMusicPlayerRegistry);
  25. #ifdef DIAG_DEVELOPER
  26. GetOnTimeChanged().Insert(m_DynamicMusicPlayer.SetTimeOfDate);
  27. #endif
  28. AmmoTypesAPI.Init();
  29. #endif
  30. if (GetGame().IsServer() || !GetGame().IsMultiplayer())
  31. {
  32. OutdoorThermometerManager.Init();
  33. }
  34. GetOnInputDeviceConnected().Insert(UpdateInputDevicesAvailability);
  35. GetOnInputDeviceDisconnected().Insert(UpdateInputDevicesAvailability);
  36. // There is a possibility different maps/servers may be using different effects
  37. SEffectManager.Cleanup();
  38. GetUApi().UpdateControls();
  39. }
  40. void ~MissionBase()
  41. {
  42. // prevent use after free with typename being destructed when switching mission / exitting game
  43. SetDispatcher(null);
  44. GetDayZGame().GetYieldDataInitInvoker().Remove(InitWorldYieldDataDefaults);
  45. PluginManagerDelete();
  46. if ( GetGame().IsClient() )
  47. {
  48. GetDayZGame().GetAnalyticsClient().UnregisterEvents();
  49. }
  50. TriggerEffectManager.DestroyInstance();
  51. if (GetGame().IsServer() || !GetGame().IsMultiplayer())
  52. {
  53. OutdoorThermometerManager.Cleanup();
  54. }
  55. #ifndef SERVER
  56. AmmoTypesAPI.Cleanup();
  57. ExplosivesBase.Cleanup();
  58. #endif
  59. }
  60. override ObjectSnapCallback GetInventoryDropCallback()
  61. {
  62. return m_InventoryDropCallback;
  63. }
  64. override void OnUpdate(float timeslice)
  65. {
  66. super.OnUpdate(timeslice);
  67. #ifndef SERVER
  68. m_DynamicMusicPlayer.OnUpdate(timeslice);
  69. #endif
  70. if (GetGame().IsServer() || !GetGame().IsMultiplayer())
  71. {
  72. OutdoorThermometerManager.Update(timeslice);
  73. }
  74. }
  75. override void OnEvent(EventType eventTypeId, Param params)
  76. {
  77. super.OnEvent(eventTypeId, params);
  78. m_DynamicMusicPlayer.OnGameEvent(eventTypeId, params);
  79. }
  80. void InitialiseWorldData()
  81. {
  82. string worldName = "empty";
  83. GetGame().GetWorldName(worldName);
  84. worldName.ToLower();
  85. switch (worldName)
  86. {
  87. case "chernarusplus":
  88. m_WorldData = new ChernarusPlusData();
  89. m_DynamicMusicPlayerRegistry = new DynamicMusicPlayerRegistryChernarus();
  90. break;
  91. case "enoch":
  92. m_WorldData = new EnochData();
  93. m_DynamicMusicPlayerRegistry = new DynamicMusicPlayerRegistryEnoch();
  94. break;
  95. case "sakhal":
  96. m_WorldData = new SakhalData();
  97. m_DynamicMusicPlayerRegistry = new DynamicMusicPlayerRegistrySakhal();
  98. break;
  99. #ifdef PLATFORM_CONSOLE
  100. case "mainmenuscenexbox":
  101. m_WorldData = new MainMenuWorldData();
  102. m_DynamicMusicPlayerRegistry = new DynamicMusicPlayerRegistry();
  103. break
  104. #endif
  105. default:
  106. m_WorldData = new ChernarusPlusData();
  107. m_DynamicMusicPlayerRegistry = new DynamicMusicPlayerRegistry();
  108. break;
  109. }
  110. }
  111. //! Used to initialize defaults to WorldData base class from 4_World module. For proper init of your custom world, use 'InitYieldBank' method in the inherited world data
  112. void InitWorldYieldDataDefaults(CatchYieldBank bank)
  113. {
  114. //catch yield data beyond 3_Game level, defaults used for ChernarusPlusData
  115. if (bank)
  116. {
  117. //fishies
  118. bank.RegisterYieldItem(new YieldItemCarp(42));
  119. bank.RegisterYieldItem(new YieldItemMackerel(42));
  120. bank.RegisterYieldItem(new YieldItemSardines(15));
  121. bank.RegisterYieldItem(new YieldItemBitterlings(15));
  122. //fishy junk
  123. bank.RegisterYieldItem(new YieldItemJunk(1,"Wellies_Brown"));
  124. bank.RegisterYieldItem(new YieldItemJunk(1,"Wellies_Grey"));
  125. bank.RegisterYieldItem(new YieldItemJunk(1,"Wellies_Green"));
  126. bank.RegisterYieldItem(new YieldItemJunk(1,"Wellies_Black"));
  127. bank.RegisterYieldItem(new YieldItemJunkEmpty(1,"Pot"));
  128. //non-fishies
  129. bank.RegisterYieldItem(new YieldItemDeadRabbit(4));
  130. bank.RegisterYieldItem(new YieldItemDeadRooster(1));
  131. bank.RegisterYieldItem(new YieldItemDeadChicken_White(1));
  132. bank.RegisterYieldItem(new YieldItemDeadChicken_Spotted(1));
  133. bank.RegisterYieldItem(new YieldItemDeadChicken_Brown(1));
  134. bank.RegisterYieldItem(new YieldItemDeadFox(2));
  135. }
  136. }
  137. override WorldLighting GetWorldLighting()
  138. {
  139. return m_WorldLighting;
  140. }
  141. override WorldData GetWorldData()
  142. {
  143. return m_WorldData;
  144. }
  145. override DynamicMusicPlayer GetDynamicMusicPlayer()
  146. {
  147. return m_DynamicMusicPlayer;
  148. }
  149. override UIScriptedMenu CreateScriptedMenu(int id)
  150. {
  151. UIScriptedMenu menu = NULL;
  152. switch (id)
  153. {
  154. case MENU_MAIN:
  155. #ifdef PLATFORM_CONSOLE
  156. menu = new MainMenuConsole;
  157. #else
  158. menu = new MainMenu;
  159. #endif
  160. break;
  161. case MENU_INGAME:
  162. #ifdef PLATFORM_CONSOLE
  163. menu = new InGameMenuXbox;
  164. #else
  165. menu = new InGameMenu;
  166. #endif
  167. break;
  168. case MENU_CHARACTER:
  169. menu = new CharacterCreationMenu;
  170. break;
  171. case MENU_OPTIONS:
  172. menu = new OptionsMenu;
  173. break;
  174. case MENU_STARTUP:
  175. menu = new StartupMenu;
  176. break;
  177. case MENU_LOADING:
  178. menu = new LoadingMenu;
  179. break;
  180. case MENU_INVENTORY:
  181. menu = new InventoryMenu;
  182. break;
  183. case MENU_INSPECT:
  184. menu = new InspectMenuNew;
  185. break;
  186. case MENU_EARLYACCESS:
  187. menu = new EarlyAccessMenu;
  188. break;
  189. case MENU_SCRIPTCONSOLE:
  190. menu = new ScriptConsole;
  191. break;
  192. case MENU_SCRIPTCONSOLE_DIALOG_PRESET_NAME:
  193. menu = new ScriptConsoleNewPresetDialog;
  194. break;
  195. case MENU_SCRIPTCONSOLE_DIALOG_PRESET_RENAME:
  196. menu = new ScriptConsoleRenamePresetDialog;
  197. break;
  198. case MENU_SCRIPTCONSOLE_UNIVERSAL_INFO_DIALOG:
  199. menu = new ScriptConsoleUniversalInfoDialog;
  200. break;
  201. case MENU_CHAT_INPUT:
  202. menu = new ChatInputMenu;
  203. break;
  204. case MENU_CONTROLS_PRESET:
  205. menu = new PresetsMenu;
  206. break;
  207. case MENU_NOTE:
  208. menu = new NoteMenu;
  209. break;
  210. case MENU_MAP:
  211. menu = new MapMenu;
  212. break;
  213. case MENU_BOOK:
  214. menu = new BookMenu;
  215. break;
  216. case MENU_SCENE_EDITOR:
  217. menu = new SceneEditorMenu;
  218. break;
  219. case MENU_HELP_SCREEN:
  220. menu = new HelpScreen;
  221. break;
  222. case MENU_GESTURES:
  223. menu = new GesturesMenu;
  224. break;
  225. case MENU_LOGOUT:
  226. menu = new LogoutMenu;
  227. break;
  228. case MENU_TITLE_SCREEN:
  229. menu = new TitleScreenMenu;
  230. break;
  231. case MENU_XBOX_CONTROLS:
  232. menu = new ControlsXboxNew;
  233. break;
  234. case MENU_RADIAL_QUICKBAR:
  235. menu = new RadialQuickbarMenu;
  236. break;
  237. case MENU_SERVER_BROWSER:
  238. menu = new ServerBrowserMenuNew;
  239. break;
  240. case MENU_LOGIN_QUEUE:
  241. menu = new LoginQueueBase;
  242. break;
  243. case MENU_LOGIN_TIME:
  244. menu = new LoginTimeBase;
  245. break;
  246. case MENU_CAMERA_TOOLS:
  247. menu = new CameraToolsMenu;
  248. break;
  249. case MENU_VIDEO:
  250. menu = new MainMenuVideo;
  251. break;
  252. case MENU_KEYBINDINGS:
  253. menu = new KeybindingsMenu;
  254. break;
  255. case MENU_TUTORIAL:
  256. menu = new TutorialsMenu;
  257. break;
  258. case MENU_CREDITS:
  259. menu = new CreditsMenu;
  260. break;
  261. case MENU_INVITE_TIMER:
  262. menu = new InviteMenu;
  263. break;
  264. case MENU_WARNING_ITEMDROP:
  265. menu = new ItemDropWarningMenu;
  266. break;
  267. case MENU_WARNING_INPUTDEVICE_DISCONNECT:
  268. menu = new InputDeviceDisconnectWarningMenu;
  269. break;
  270. case MENU_WARNING_TELEPORT:
  271. menu = new PlayerRepositionWarningMenu;
  272. break;
  273. case MENU_RESPAWN_DIALOGUE:
  274. menu = new RespawnDialogue;
  275. break;
  276. case MENU_CONNECT_ERROR:
  277. menu = new ConnectErrorScriptModuleUI;
  278. break;
  279. case MENU_LOC_ADD:
  280. menu = new ScriptConsoleAddLocation;
  281. break;
  282. case MENU_MISSION_LOADER:
  283. menu = new MissionLoader;
  284. break;
  285. case MENU_CONNECTION_DIALOGUE:
  286. menu = new ConnectionDialogue;
  287. break;
  288. }
  289. if (menu)
  290. {
  291. menu.SetID(id);
  292. }
  293. return menu;
  294. }
  295. void SpawnItems();
  296. void UpdateInputDevicesAvailability()
  297. {
  298. g_Game.RefreshMouseCursorVisibility();
  299. }
  300. override void OnKeyPress(int key)
  301. {
  302. super.OnKeyPress(key);
  303. #ifdef DIAG_DEVELOPER
  304. if ( PluginKeyBinding.instance )
  305. {
  306. PluginKeyBinding.instance.OnKeyPress(key);
  307. }
  308. #endif
  309. }
  310. int m_WidgetsTotal;
  311. int m_WidgetsInvisible;
  312. void DumpCurrentUILayout()
  313. {
  314. UIScriptedMenu current_menu = GetGame().GetUIManager().GetMenu();
  315. if ( current_menu )
  316. {
  317. Widget widget_root = current_menu.GetLayoutRoot();
  318. if ( widget_root )
  319. {
  320. m_WidgetsTotal = 0;
  321. m_WidgetsInvisible = 0;
  322. Print( widget_root.GetName() +" ("+ widget_root.GetTypeName() +")");
  323. DumpWidget(widget_root.GetChildren(), 1);
  324. Print( "Widgets TOTAL: "+ m_WidgetsTotal.ToString() +" INVISIBLE: "+ m_WidgetsInvisible.ToString() +" VISIBLE: "+ (m_WidgetsTotal - m_WidgetsInvisible).ToString() );
  325. }
  326. }
  327. }
  328. void DumpWidget(Widget w, int tabs)
  329. {
  330. if ( !w )
  331. {
  332. return;
  333. }
  334. m_WidgetsTotal++;
  335. string tmp;
  336. for (int i = 0; i < tabs; i++)
  337. {
  338. tmp += " ";
  339. }
  340. string invisible = "";
  341. if ( !w.IsVisibleHierarchy() )
  342. {
  343. invisible = "[invisible]";
  344. m_WidgetsInvisible++;
  345. }
  346. Print( tmp +"- "+ w.GetName() +" ("+ w.GetTypeName() +") "+ invisible );
  347. bool collapse = false;
  348. if ( w.GetChildren() )
  349. {
  350. collapse = true;
  351. Print(tmp +"{");
  352. }
  353. DumpWidget(w.GetChildren(), tabs + 1);
  354. if ( collapse )
  355. {
  356. Print(tmp +"}");
  357. }
  358. DumpWidget(w.GetSibling(), tabs);
  359. }
  360. override void OnKeyRelease(int key)
  361. {
  362. super.OnKeyRelease(key);
  363. if ( GetGame().IsDebug() )
  364. {
  365. if ( PluginKeyBinding.instance != NULL )
  366. {
  367. PluginKeyBinding.instance.OnKeyRelease(key);
  368. }
  369. }
  370. }
  371. override void OnMouseButtonPress(int button)
  372. {
  373. super.OnMouseButtonPress(button);
  374. if ( GetGame().IsDebug() )
  375. {
  376. if ( PluginKeyBinding.instance != NULL )
  377. {
  378. PluginKeyBinding.instance.OnMouseButtonPress(button);
  379. }
  380. }
  381. }
  382. override void OnMouseButtonRelease(int button)
  383. {
  384. super.OnMouseButtonRelease(button);
  385. if ( GetGame().IsDebug() )
  386. {
  387. if ( PluginKeyBinding.instance != NULL )
  388. {
  389. PluginKeyBinding.instance.OnMouseButtonRelease(button);
  390. }
  391. }
  392. }
  393. void OnLog(string msg_log)
  394. {
  395. if ( PluginDeveloper.GetInstance() )
  396. {
  397. if ( GetGame().IsServer() && !GetGame().IsMultiplayer() )
  398. {
  399. PluginDeveloper.GetInstance().PrintLogClient(msg_log);
  400. }
  401. else if ( GetGame().IsMultiplayer() && GetGame().IsClient() )
  402. {
  403. PluginDeveloper.GetInstance().PrintLogClient(msg_log);
  404. }
  405. }
  406. }
  407. void UpdateDummyScheduler()
  408. {
  409. for(int i = 0; i < m_DummyPlayers.Count(); i++)
  410. {
  411. if (m_DummyPlayers.Get(i))
  412. {
  413. m_DummyPlayers.Get(i).OnTick();
  414. }
  415. }
  416. }
  417. override void AddDummyPlayerToScheduler(Man player)
  418. {
  419. m_DummyPlayers.Insert(PlayerBase.Cast( player ));
  420. }
  421. #ifdef DIAG_DEVELOPER
  422. void UpdateInputDeviceDiag()
  423. {
  424. DisplayInputDebug(DiagMenu.GetBool(DiagMenuIDs.MISC_INPUT_DEVICE_DISCONNECT_DBG));
  425. }
  426. void DisplayInputDebug(bool show)
  427. {
  428. DbgUI.BeginCleanupScope();
  429. DbgUI.Begin("InputDeviceDebug", 60, 60);
  430. if (show)
  431. {
  432. DbgUI.Text("Gamepad: " + g_Game.GetInput().IsActiveGamepadSelected());
  433. DbgUI.Text("Mouse: " + g_Game.GetInput().IsMouseConnected());
  434. DbgUI.Text("Keyboard: " + g_Game.GetInput().IsKeyboardConnected());
  435. }
  436. DbgUI.End();
  437. DbgUI.EndCleanupScope();
  438. }
  439. #endif
  440. //! DEPRECATED
  441. PluginAdditionalInfo m_ModuleServerInfo;
  442. }
  443. class MissionDummy extends MissionBase
  444. {
  445. }