pperequesterbank.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /**
  2. \brief Requester bank contains all registered type instances as singletons. Creating new instances outside of bank might be a bad idea (and a way to memory leakage)
  3. */
  4. class PPERequesterBank extends Managed
  5. {
  6. private static ref map<int,ref PPERequesterBase> m_Instances;
  7. private static bool m_Initialized = false;
  8. static int m_lastID = -1;
  9. static const int INVALID = -1;
  10. static const int REQ_INVENTORYBLUR = RegisterRequester(PPERequester_InventoryBlur);
  11. static const int REQ_CONTROLLERDISCONNECT = RegisterRequester(PPERequester_ControllerDisconnectBlur);
  12. static const int REQ_GLASSESSPORTBLACK = RegisterRequester(PPERequester_GlassesSportBlack);
  13. static const int REQ_GLASSESSPORTBLUE = RegisterRequester(PPERequester_GlassesSportBlue);
  14. static const int REQ_GLASSESSPORTGREEN = RegisterRequester(PPERequester_GlassesSportGreen);
  15. static const int REQ_GLASSESSPORTORANGE = RegisterRequester(PPERequester_GlassesSportOrange);
  16. static const int REQ_GLASSESAVIATOR = RegisterRequester(PPERequester_GlassesAviator);
  17. static const int REQ_GLASSESDESIGNER = RegisterRequester(PPERequester_GlassesDesignerBlack);
  18. static const int REQ_GLASSESTACTICAL = RegisterRequester(PPERequester_TacticalGoggles);
  19. static const int REQ_MOTOHELMETBLACK = RegisterRequester(PPERequester_MotoHelmetBlack);
  20. static const int REQ_GLASSESWELDING = RegisterRequester(PPERequester_WeldingMask);
  21. static const int REQ_CAMERANV = RegisterRequester(PPERequester_CameraNV);
  22. static const int REQ_CAMERAADS = RegisterRequester(PPERequester_CameraADS);
  23. static const int REQ_BLOODLOSS = RegisterRequester(PPERequester_BloodLoss);
  24. static const int REQ_DEATHEFFECTS = RegisterRequester(PPERequester_DeathDarkening);
  25. static const int REQ_UNCONEFFECTS = RegisterRequester(PPERequester_UnconEffects);
  26. static const int REQ_TUNELVISSION = RegisterRequester(PPERequester_TunnelVisionEffects);
  27. static const int REQ_BURLAPSACK = RegisterRequester(PPERequester_BurlapSackEffects);
  28. static const int REQ_INTROCHROMABB = RegisterRequester(PPERequester_IntroChromAbb);
  29. static const int REQ_FEVEREFFECTS = RegisterRequester(PPERequester_FeverEffects);
  30. static const int REQ_FLASHBANGEFFECTS = RegisterRequester(PPERequester_FlashbangEffects);
  31. static const int REQ_SHOCKHITEFFECTS = RegisterRequester(PPERequester_ShockHitReaction);
  32. static const int REQ_HEALTHHITEFFECTS = RegisterRequester(PPERequester_HealthHitReaction);
  33. static const int REQ_MENUEFFECTS = RegisterRequester(PPERequester_MenuEffects);
  34. static const int REQ_CONTROLLERBLUR = RegisterRequester(PPERequester_ControlsBlur);
  35. static const int REQ_SERVERBROWSEREFFECTS = RegisterRequester(PPERequester_ServerBrowserBlur);
  36. static const int REQ_TUTORIALEFFECTS = RegisterRequester(PPERequester_TutorialMenu);
  37. static const int REQ_CONTAMINATEDAREA = RegisterRequester(PPERequester_ContaminatedAreaTint);
  38. static const int REQ_SPOOKYAREA = RegisterRequester(PPERequester_SpookyAreaTint);
  39. static const int REQ_PAINBLUR = RegisterRequester(PPERequester_PainBlur);
  40. static const int REQ_UNDERGROUND = RegisterRequester(PPERUndergroundAcco);
  41. static const int REQ_DROWNING = RegisterRequester(PPERequester_Drowning);
  42. //static const int REQ_HMP_LVL3 = RegisterRequester(PPERequester_HeavyMetalPoisoning_3);
  43. static const int REQ_HMP_GHOST = RegisterRequester(PPERequester_HMPGhosts);
  44. private static ref PPERequesterRegistrations m_Registrations; //more registrations to be placed here
  45. static void Init()
  46. {
  47. m_Registrations = new PPERequesterRegistrations;
  48. if (!m_Instances)
  49. m_Instances = new map<int,ref PPERequesterBase>;
  50. m_Initialized = true;
  51. }
  52. static void Cleanup()
  53. {
  54. if (m_Initialized)
  55. {
  56. delete m_Registrations;
  57. m_Instances.Clear();
  58. }
  59. }
  60. /**
  61. \brief Returns an instance (singleton) of a requester based on typename.
  62. \param type \p typename Typename of the requester.
  63. \return \p PPERequesterBase Requester singleton.
  64. \note Returns only already registered instances, does not register anything.
  65. */
  66. static PPERequesterBase GetRequester(typename type)
  67. {
  68. if (!type)
  69. {
  70. Error("Requested type is NULL!");
  71. return null;
  72. }
  73. PPERequesterBase temp;
  74. PPERequesterBase ret;
  75. for (int i = 0; i < m_Instances.Count(); i++)
  76. {
  77. temp = m_Instances.GetElement(i);
  78. if (temp.Type() == type)
  79. {
  80. Class.CastTo(ret,temp);
  81. break;
  82. }
  83. }
  84. if (!ret)
  85. {
  86. Debug.Log("'" + type.ToString() + "' not found in bank! Register first in 'RegisterRequester' method.");
  87. }
  88. return ret;
  89. }
  90. /**
  91. \brief Returns an instance (singleton) of a requester based on index.
  92. \param index \p int Index of the registered requester.
  93. \return \p PPERequesterBase Requester singleton.
  94. \note Returns only already registered instances, does not register anything.
  95. */
  96. static PPERequesterBase GetRequester(int index)
  97. {
  98. PPERequesterBase ret = m_Instances.Get(index);
  99. if (!ret)
  100. {
  101. Debug.Log("Requester idx '" + index + "' not found in bank! Register first in 'RegisterRequester' method.");
  102. }
  103. return ret;
  104. }
  105. /**
  106. \brief Returns an ID of a requester type.
  107. \param type \p typename Typename of the requester.
  108. \return \p int Requester ID.
  109. \note Returns '-1' if not found.
  110. */
  111. static int GetRequesterID(typename type)
  112. {
  113. int ret = -1;
  114. PPERequesterBase temp;
  115. for (int i = 0; i < m_Instances.Count(); i++)
  116. {
  117. temp = m_Instances.GetElement(i);
  118. if (temp.Type() == type)
  119. {
  120. ret = m_Instances.GetKey(i);
  121. }
  122. }
  123. if ( ret == -1 )
  124. {
  125. Debug.Log("Requester instance of the '" + type.ToString() + "' type not found in bank! Register first in 'RegisterRequester' method.");
  126. }
  127. return ret;
  128. }
  129. /**
  130. \brief Returns a typename from a requester ID.
  131. \param index \p int ID of the requester.
  132. \return \p typename Requester typename.
  133. */
  134. static typename GetRequesterTypename(int index)
  135. {
  136. typename ret;
  137. PPERequesterBase temp = m_Instances.Get(index);
  138. if ( !temp )
  139. {
  140. Debug.Log("No requester exists under idx '" + index + "' in bank! Register first in 'RegisterRequester' method.");
  141. }
  142. else
  143. {
  144. ret = temp.Type();
  145. }
  146. return ret;
  147. }
  148. /**
  149. \brief Registers new requester type.
  150. \note Performed only on game start. New requesters can be registered in 'PPERequesterRegistrations'
  151. */
  152. static int RegisterRequester(typename type)
  153. {
  154. if (!m_Instances)
  155. m_Instances = new map<int,ref PPERequesterBase>;
  156. if ( GetRequester(type) != null )
  157. {
  158. //Error("Trying to register an already existing requester type: " + type);
  159. Debug.Log("Trying to register an already existing requester type: " + type);
  160. return -1;
  161. }
  162. m_lastID++;
  163. PPERequesterBase req;
  164. req = PPERequesterBase.Cast(type.Spawn());
  165. req.SetRequesterIDX(m_lastID);
  166. m_Instances.Set(m_lastID,req);
  167. return m_lastID;
  168. }
  169. //! Verifies the instance
  170. static bool VerifyRequester(PPERequesterBase req)
  171. {
  172. if (!m_Initialized) //initial registrations are fair game
  173. {
  174. return true;
  175. }
  176. PPERequesterBase temp;
  177. for (int i = 0; i < m_Instances.Count(); i++)
  178. {
  179. temp = m_Instances.GetElement(i);
  180. if (temp == req)
  181. {
  182. return true;
  183. }
  184. }
  185. //Error("Requester instance " + req + " not valid! Please use registered instances from PPERequesterBank.");
  186. Debug.Log("Requester instance '" + req + "' not valid! Please use registered instances from PPERequesterBank.");
  187. return false;
  188. }
  189. /*static void DumpInstances()
  190. {
  191. Print("DumpInstances");
  192. for (int i = 0; i < m_Instances.Count(); i++)
  193. {
  194. Print(m_Instances.GetKey(i));
  195. Print(m_Instances.GetElement(i));
  196. }
  197. }*/
  198. }
  199. //! Mod this, if you wish to register custom requesters
  200. class PPERequesterRegistrations extends Managed
  201. {
  202. void PPERequesterRegistrations()
  203. {
  204. //PPERequesterBank.RegisterRequester(TestReq);
  205. }
  206. }
  207. /*modded class PPERequesterRegistrations extends Managed
  208. {
  209. void PPERequesterRegistrations()
  210. {
  211. PPERequesterBank.RegisterRequester(TestReq2);
  212. }
  213. }*/