spotlight.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. class Spotlight extends ItemBase
  2. {
  3. private bool m_IsFolded;
  4. private bool m_EvaluateDeployment;
  5. SpotlightLight m_Light;
  6. static vector m_LightLocalPosition;
  7. static vector m_LightLocalOrientation = "0 0 0";
  8. // Spotlight can be extended and compressed
  9. static const string SEL_REFLECTOR_COMP_U = "reflector";
  10. static const string SEL_CORD_FOLDED_U = "cord_folded";
  11. static const string SEL_CORD_PLUGGED_U = "cord_plugged";
  12. static const string SEL_CORD_PLUGGED_F = "spotlight_folded_cord_plugged";
  13. static const string SEL_CORD_FOLDED_F = "spotlight_folded_cord_folded";
  14. static const string SEL_INVENTORY = "inventory";
  15. static const string SEL_PLACING = "placing";
  16. static const string SEL_GLASS_F = "glass_folded";
  17. static const string SEL_GLASS_U = "glass_unfolded";
  18. static const string SEL_REFLECTOR_F = "reflector_folded";
  19. static const string SEL_REFLECTOR_U = "reflector_unfolded";
  20. static const int ID_GLASS_UNFOLDED = 3;
  21. static const int ID_REFLECTOR_UNFOLDED = 4;
  22. static const int ID_GLASS_FOLDED = 5;
  23. static const int ID_REFLECTOR_FOLDED = 6;
  24. static string LIGHT_OFF_GLASS = "dz\\gear\\camping\\Data\\spotlight_glass.rvmat";
  25. static string LIGHT_OFF_REFLECTOR = "dz\\gear\\camping\\Data\\spotlight.rvmat";
  26. static string LIGHT_ON_GLASS = "dz\\gear\\camping\\Data\\spotlight_glass_on.rvmat";
  27. static string LIGHT_ON_REFLECTOR = "dz\\gear\\camping\\Data\\spotlight_glass_on.rvmat";
  28. //sound
  29. const string SOUND_TURN_ON = "spotlight_turn_on_SoundSet";
  30. const string SOUND_TURN_OFF = "spotlight_turn_off_SoundSet";
  31. protected EffectSound m_SoundTurnOn;
  32. protected EffectSound m_SoundTurnOff;
  33. //Spotlight, folded and unfolded
  34. void Spotlight()
  35. {
  36. m_EvaluateDeployment = false;
  37. RegisterNetSyncVariableBool("m_IsFolded");
  38. }
  39. override bool IsElectricAppliance()
  40. {
  41. return true;
  42. }
  43. override void OnInitEnergy()
  44. {
  45. if (GetCompEM().IsPlugged())
  46. {
  47. if (!GetHierarchyRoot())
  48. Unfold();
  49. else
  50. Fold(true);
  51. }
  52. else
  53. Fold();
  54. UpdateAllSelections();
  55. }
  56. override void EOnInit(IEntity other, int extra)
  57. {
  58. if (!IsHologram())
  59. {
  60. UpdateAllSelections();
  61. HideSelection(SEL_CORD_FOLDED_F);
  62. }
  63. else
  64. {
  65. Unfold();
  66. }
  67. }
  68. //--- POWER EVENTS
  69. override void OnSwitchOn()
  70. {
  71. super.OnSwitchOn();
  72. SoundTurnOn();
  73. }
  74. override void OnSwitchOff()
  75. {
  76. super.OnSwitchOff();
  77. SoundTurnOff();
  78. if (m_Light)
  79. {
  80. m_Light.FadeOut(0.05);
  81. m_Light = null;
  82. }
  83. }
  84. override void OnWorkStart()
  85. {
  86. #ifndef SERVER
  87. m_Light = SpotlightLight.Cast(ScriptedLightBase.CreateLight(SpotlightLight, "0 0 0"));
  88. m_Light.AttachOnObject(this, m_LightLocalPosition, m_LightLocalOrientation);
  89. #endif
  90. UpdateAllSelections();
  91. }
  92. override void OnWorkStop()
  93. {
  94. #ifndef SERVER
  95. if (m_Light)
  96. m_Light.FadeOut();
  97. #endif
  98. UpdateAllSelections();
  99. }
  100. // Called when this device is picked up
  101. override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
  102. {
  103. super.OnItemLocationChanged(old_owner, new_owner);
  104. //skips folding of currently deployed spotlight
  105. if (m_EvaluateDeployment || IsBeingPlaced())
  106. {
  107. m_EvaluateDeployment = false;
  108. if (m_Light)
  109. {
  110. m_Light.AttachOnObject(this, m_LightLocalPosition, m_LightLocalOrientation);
  111. }
  112. Unfold();
  113. return;
  114. }
  115. // When the item is picked up by a player
  116. PlayerBase player = PlayerBase.Cast(new_owner);
  117. if (player && player.GetItemInHands() == this)
  118. {
  119. Fold(GetCompEM().IsPlugged());
  120. }
  121. }
  122. override void OnIsPlugged(EntityAI source_device)
  123. {
  124. Unfold();
  125. UpdateAllSelections();
  126. }
  127. protected void UpdateAllSelections()
  128. {
  129. bool isPlugged = GetCompEM().IsPlugged();
  130. PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
  131. bool isInHands = player && player.GetItemInHands() == this;
  132. HideAllSelections();
  133. m_LightLocalPosition = GetSelectionPositionLS("beamStart");
  134. if (IsFolded() || isInHands)
  135. {
  136. HideSelection(SEL_REFLECTOR_COMP_U);
  137. ShowSelection(SEL_INVENTORY);
  138. ShowSelection(SEL_GLASS_F);
  139. ShowSelection(SEL_REFLECTOR_F);
  140. if (isPlugged)
  141. {
  142. ShowSelection(SEL_CORD_PLUGGED_F);
  143. }
  144. else
  145. {
  146. ShowSelection(SEL_CORD_FOLDED_F);
  147. }
  148. if (!IsHologram())
  149. {
  150. if (GetCompEM().IsWorking())
  151. {
  152. SetObjectMaterial(ID_GLASS_UNFOLDED, LIGHT_ON_GLASS);
  153. SetObjectMaterial(ID_REFLECTOR_UNFOLDED, LIGHT_ON_REFLECTOR);
  154. SetObjectMaterial(ID_GLASS_FOLDED, LIGHT_ON_GLASS);
  155. SetObjectMaterial(ID_REFLECTOR_FOLDED, LIGHT_ON_REFLECTOR);
  156. }
  157. else
  158. {
  159. SetObjectMaterial(ID_GLASS_UNFOLDED, LIGHT_OFF_GLASS);
  160. SetObjectMaterial(ID_REFLECTOR_UNFOLDED, LIGHT_OFF_REFLECTOR);
  161. SetObjectMaterial(ID_GLASS_FOLDED, LIGHT_OFF_GLASS);
  162. SetObjectMaterial(ID_REFLECTOR_FOLDED, LIGHT_OFF_REFLECTOR);
  163. }
  164. }
  165. }
  166. else
  167. {
  168. ShowSelection(SEL_PLACING);
  169. ShowSelection(SEL_REFLECTOR_U);
  170. ShowSelection(SEL_GLASS_U);
  171. ShowSelection(SEL_REFLECTOR_COMP_U);
  172. if (isPlugged)
  173. {
  174. ShowSelection(SEL_CORD_PLUGGED_U);
  175. }
  176. else
  177. {
  178. ShowSelection(SEL_CORD_FOLDED_U);
  179. }
  180. if (!IsHologram())
  181. {
  182. if (GetCompEM().IsWorking())
  183. {
  184. SetObjectMaterial(ID_GLASS_UNFOLDED, LIGHT_ON_GLASS);
  185. SetObjectMaterial(ID_REFLECTOR_UNFOLDED, LIGHT_ON_REFLECTOR);
  186. }
  187. else
  188. {
  189. SetObjectMaterial(ID_GLASS_UNFOLDED, LIGHT_OFF_GLASS);
  190. SetObjectMaterial(ID_REFLECTOR_UNFOLDED, LIGHT_OFF_REFLECTOR);
  191. }
  192. }
  193. }
  194. }
  195. override void OnIsUnplugged(EntityAI last_energy_source)
  196. {
  197. Fold();
  198. UpdateAllSelections();
  199. }
  200. void Fold(bool keep_connected = false)
  201. {
  202. m_IsFolded = true;
  203. if (!keep_connected)
  204. {
  205. GetCompEM().SwitchOff();
  206. GetCompEM().UnplugThis();
  207. }
  208. UpdateAllSelections();
  209. SetSynchDirty();
  210. }
  211. void Unfold()
  212. {
  213. m_IsFolded = false;
  214. UpdateAllSelections();
  215. SetSynchDirty();
  216. }
  217. override void OnStoreSave(ParamsWriteContext ctx)
  218. {
  219. super.OnStoreSave(ctx);
  220. // Save folded/unfolded state
  221. ctx.Write(m_IsFolded);
  222. }
  223. override bool OnStoreLoad(ParamsReadContext ctx, int version)
  224. {
  225. if (!super.OnStoreLoad(ctx, version))
  226. return false;
  227. // Load folded/unfolded state
  228. bool b_is_folded = false;
  229. if (!ctx.Read(b_is_folded))
  230. b_is_folded = true;
  231. if (b_is_folded)
  232. {
  233. Fold();
  234. }
  235. else
  236. {
  237. Unfold();
  238. }
  239. return true;
  240. }
  241. override bool CanPutInCargo(EntityAI parent)
  242. {
  243. if (!super.CanPutInCargo(parent))
  244. return false;
  245. return !GetCompEM().IsPlugged();
  246. }
  247. override bool CanPutIntoHands(EntityAI parent)
  248. {
  249. if (!super.CanPutIntoHands(parent))
  250. {
  251. return false;
  252. }
  253. // Commented out so Reposition action is possible to execute
  254. return true;
  255. }
  256. bool IsFolded()
  257. {
  258. return m_IsFolded;
  259. }
  260. //================================================================
  261. // SOUNDS
  262. //================================================================
  263. protected void SoundTurnOn()
  264. {
  265. PlaySoundSet(m_SoundTurnOn, SOUND_TURN_ON, 0, 0);
  266. }
  267. protected void SoundTurnOff()
  268. {
  269. PlaySoundSet(m_SoundTurnOff, SOUND_TURN_OFF, 0, 0);
  270. }
  271. //================================================================
  272. // ADVANCED PLACEMENT
  273. //================================================================
  274. override void OnPlacementStarted(Man player)
  275. {
  276. super.OnPlacementStarted(player);
  277. array<string> selections = {
  278. SEL_CORD_PLUGGED_F,
  279. SEL_CORD_FOLDED_F
  280. };
  281. PlayerBase playerPB = PlayerBase.Cast(player);
  282. foreach (string selection : selections)
  283. {
  284. if (GetGame().IsMultiplayer() && GetGame().IsServer())
  285. playerPB.GetHologramServer().SetSelectionToRefresh(selection);
  286. else
  287. playerPB.GetHologramLocal().SetSelectionToRefresh(selection);
  288. }
  289. }
  290. override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
  291. {
  292. super.OnPlacementComplete(player, position, orientation);
  293. Unfold();
  294. m_EvaluateDeployment = true;
  295. }
  296. override void OnPlacementCancelled(Man player)
  297. {
  298. super.OnPlacementCancelled(player);
  299. Fold(true);
  300. }
  301. override bool IsDeployable()
  302. {
  303. return true;
  304. }
  305. override string GetDeploySoundset()
  306. {
  307. return "placeSpotlight_SoundSet";
  308. }
  309. override string GetLoopDeploySoundset()
  310. {
  311. return "spotlight_deploy_SoundSet";
  312. }
  313. override int GetViewIndex()
  314. {
  315. if (MemoryPointExists("invView2") && !m_IsFolded)
  316. {
  317. return 1;
  318. }
  319. return 0;
  320. }
  321. override void SetActions()
  322. {
  323. super.SetActions();
  324. RemoveAction(ActionTakeItemToHands);
  325. AddAction(ActionClapBearTrapWithThisItem);
  326. AddAction(ActionPlugIn);
  327. AddAction(ActionTogglePlaceObject);
  328. AddAction(ActionUnplugThisByCord);
  329. AddAction(ActionTurnOnSpotlight);
  330. AddAction(ActionTurnOffSpotlight);
  331. AddAction(ActionRepositionPluggedItem);
  332. AddAction(ActionDeployObject);
  333. AddAction(ActionTakeItemToHands);
  334. }
  335. //!DEPRECATED
  336. protected ref EffectSound m_DeployLoopSound; //DEPRECATED in favor of m_DeployLoopSoundEx
  337. void PlayDeployLoopSound(); //!DEPRECATED
  338. void StopDeployLoopSound(); //!DEPRECATED
  339. }