missionbase.c 11 KB

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