itemmanager.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871
  1. class ItemManager
  2. {
  3. private ref static ItemManager m_Instance;
  4. protected bool m_IsDragging;
  5. protected EntityAI m_HoveredItem;
  6. protected bool m_SlotInfoShown;
  7. protected EntityAI m_DraggedItem;
  8. protected Icon m_DraggedIcon;
  9. protected ref Widget m_TooltipWidget;
  10. protected ref Widget m_TooltipSlotWidget;
  11. protected ref Widget m_TooltipCategoryWidget;
  12. protected ItemPreviewWidget m_ItemPreviewWidget;
  13. protected Widget m_RootWidget;
  14. protected ref map<string, bool> m_DefautOpenStates;
  15. protected ref map<string, bool> m_DefautHeaderOpenStates;
  16. protected int m_HandsDefaultOpenState;
  17. protected ref Timer m_ToolTipTimer;
  18. protected ref Timer m_TooltipSlotTimer;
  19. protected EntityAI m_SelectedItem;
  20. protected Container m_SelectedContainer;
  21. protected Widget m_SelectedWidget;
  22. protected SlotsIcon m_SelectedIcon;
  23. protected LayoutHolder m_SelectedBaseIcon;
  24. protected HandsPreview m_HandsPreview;
  25. protected bool m_ItemMicromanagmentMode;
  26. protected Widget m_LeftDropzone;
  27. protected Widget m_CenterDropzone;
  28. protected Widget m_RightDropzone;
  29. protected int m_TooltipPosX;
  30. protected int m_TooltipPosY;
  31. protected Widget m_TooltipSourceWidget; //stored here for tooltip position updates
  32. protected ScrollWidget m_LeftSlotsScroller;
  33. #ifndef PLATFORM_CONSOLE
  34. protected const float TOOLTIP_DELAY = 0.25; // in seconds
  35. #else
  36. protected const float TOOLTIP_DELAY = 1.5; // in seconds
  37. #endif
  38. void ItemManager( Widget root )
  39. {
  40. m_Instance = this;
  41. m_RootWidget = root;
  42. m_DefautOpenStates = new map<string, bool>;
  43. m_DefautHeaderOpenStates = new map<string, bool>;
  44. m_SlotInfoShown = false;
  45. #ifdef PLATFORM_CONSOLE
  46. m_TooltipWidget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/inventory_new/day_z_inventory_new_tooltip_xbox.layout", root );
  47. m_TooltipSlotWidget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/inventory_new/day_z_inventory_new_tooltip_slot_xbox.layout", root );
  48. #else
  49. m_TooltipWidget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/inventory_new/day_z_inventory_new_tooltip.layout", root );
  50. m_TooltipSlotWidget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/inventory_new/day_z_inventory_new_tooltip_slot.layout", root );
  51. #endif
  52. m_TooltipWidget.Show( false );
  53. m_TooltipSlotWidget.Show( false );
  54. }
  55. void SetItemMicromanagmentMode( bool item_micromanagment_mode )
  56. {
  57. m_ItemMicromanagmentMode = item_micromanagment_mode;
  58. Inventory.GetInstance().UpdateConsoleToolbar();
  59. }
  60. bool IsMicromanagmentMode()
  61. {
  62. return m_ItemMicromanagmentMode;
  63. }
  64. HandsPreview GetHandsPreview()
  65. {
  66. return m_HandsPreview;
  67. }
  68. void SetHandsPreview( HandsPreview hansd_preview )
  69. {
  70. m_HandsPreview = hansd_preview;
  71. }
  72. EntityAI GetSelectedItem()
  73. {
  74. return m_SelectedItem;
  75. }
  76. Container GetSelectedContainer()
  77. {
  78. return m_SelectedContainer;
  79. }
  80. Widget GetSelectedWidget()
  81. {
  82. return m_SelectedWidget;
  83. }
  84. SlotsIcon GetSelectedIcon()
  85. {
  86. return m_SelectedIcon;
  87. }
  88. void SetSelectedItem( EntityAI selected_item, Container selected_container, Widget selected_widget, SlotsIcon selected_icon )
  89. {
  90. m_SelectedItem = selected_item;
  91. m_SelectedContainer = selected_container;
  92. m_SelectedWidget = selected_widget;
  93. m_SelectedIcon = selected_icon;
  94. }
  95. void SetSelectedItemEx( EntityAI selected_item, Container selected_container, LayoutHolder selected_icon )
  96. {
  97. SlotsIcon sIcon;
  98. Icon icon;
  99. m_SelectedItem = selected_item;
  100. m_SelectedContainer = selected_container;
  101. if (m_SelectedBaseIcon)
  102. {
  103. sIcon = SlotsIcon.Cast(m_SelectedBaseIcon);
  104. icon = Icon.Cast(m_SelectedBaseIcon);
  105. if (sIcon)
  106. {
  107. sIcon.GetMicromanagedPanel().Show(false);
  108. }
  109. else if (icon)
  110. {
  111. icon.GetMicromanagedPanel().Show(false);
  112. }
  113. }
  114. if (selected_icon)
  115. {
  116. sIcon = SlotsIcon.Cast(selected_icon);
  117. icon = Icon.Cast(selected_icon);
  118. if (sIcon)
  119. {
  120. m_SelectedWidget = sIcon.GetCursorWidget();
  121. sIcon.GetMicromanagedPanel().Show(true);
  122. }
  123. else if (icon)
  124. {
  125. m_SelectedWidget = icon.GetCursorWidget();
  126. icon.GetMicromanagedPanel().Show(true);
  127. }
  128. }
  129. else
  130. {
  131. m_SelectedWidget = null;
  132. }
  133. m_SelectedBaseIcon = selected_icon;
  134. }
  135. void ClearDefaultOpenStates()
  136. {
  137. m_DefautOpenStates.Clear();
  138. }
  139. void ClearDefaultHeaderOpenStates()
  140. {
  141. m_DefautHeaderOpenStates.Clear();
  142. }
  143. void SetDefaultOpenState( string type, bool is_opened )
  144. {
  145. m_DefautOpenStates.Set( type, is_opened );
  146. }
  147. void SetDefaultHeaderOpenState( string type, bool is_opened )
  148. {
  149. m_DefautHeaderOpenStates.Set( type, is_opened );
  150. }
  151. void SetDefaultOpenStateHands( bool is_opened )
  152. {
  153. m_HandsDefaultOpenState = is_opened;
  154. int hands_default_open_state = m_HandsDefaultOpenState; //from bool to int for easier parsing
  155. GetGame().SetProfileString( "defaultOpenStateHands", hands_default_open_state.ToString() );
  156. GetGame().SaveProfile();
  157. }
  158. bool GetDefaultOpenStateHands( )
  159. {
  160. string value;
  161. GetGame().GetProfileString( "defaultOpenStateHands", value );
  162. m_HandsDefaultOpenState = value.ToInt();
  163. return m_HandsDefaultOpenState;
  164. }
  165. void SerializeDefaultHeaderOpenStates()
  166. {
  167. TStringArray serialized_types = new TStringArray;
  168. for ( int i = 0; i < m_DefautHeaderOpenStates.Count(); i++ )
  169. {
  170. int is_opened = m_DefautHeaderOpenStates.GetElement( i ); //from bool to int for easier parsing
  171. serialized_types.Insert( m_DefautHeaderOpenStates.GetKey( i ) + "," + is_opened );
  172. }
  173. if( serialized_types.Count() > 0 )
  174. {
  175. GetGame().SetProfileStringList( "defaultHeaderOpenStates", serialized_types );
  176. }
  177. }
  178. void DeserializeDefaultHeaderOpenStates()
  179. {
  180. ClearDefaultHeaderOpenStates();
  181. TStringArray serialized_types = new TStringArray;
  182. GetGame().GetProfileStringList( "defaultHeaderOpenStates", serialized_types );
  183. for( int i = 0; i < serialized_types.Count(); i++ )
  184. {
  185. TStringArray strs = new TStringArray;
  186. serialized_types.Get( i ).Split( ",", strs );
  187. bool is_opened = strs.Get( 1 ).ToInt();
  188. SetDefaultHeaderOpenState( strs.Get( 0 ), is_opened );
  189. }
  190. }
  191. void SerializeDefaultOpenStates()
  192. {
  193. TStringArray serialized_types = new TStringArray;
  194. for ( int i = 0; i < m_DefautOpenStates.Count(); i++ )
  195. {
  196. int is_opened = m_DefautOpenStates.GetElement( i ); //from bool to int for easier parsing
  197. serialized_types.Insert( m_DefautOpenStates.GetKey( i ) + "," + is_opened );
  198. }
  199. if( serialized_types.Count() > 0 )
  200. {
  201. GetGame().SetProfileStringList( "defaultOpenStates", serialized_types );
  202. }
  203. }
  204. void DeserializeDefaultOpenStates()
  205. {
  206. ClearDefaultOpenStates();
  207. TStringArray serialized_types = new TStringArray;
  208. GetGame().GetProfileStringList( "defaultOpenStates", serialized_types );
  209. for( int i = 0; i < serialized_types.Count(); i++ )
  210. {
  211. TStringArray strs = new TStringArray;
  212. serialized_types.Get( i ).Split( ",", strs );
  213. bool is_opened = strs.Get( 1 ).ToInt();
  214. SetDefaultOpenState( strs.Get( 0 ), is_opened );
  215. }
  216. }
  217. bool GetDefaultOpenState( string type )
  218. {
  219. if( m_DefautOpenStates.Contains( type ) )
  220. {
  221. return m_DefautOpenStates.Get( type );
  222. }
  223. else
  224. {
  225. return true;
  226. }
  227. }
  228. bool GetDefaultHeaderOpenState( string type )
  229. {
  230. if( m_DefautHeaderOpenStates.Contains( type ) )
  231. {
  232. return m_DefautHeaderOpenStates.Get( type );
  233. }
  234. else
  235. {
  236. return true;
  237. }
  238. }
  239. static ItemManager GetInstance()
  240. {
  241. return m_Instance;
  242. }
  243. void HideDropzones()
  244. {
  245. GetRightDropzone().SetAlpha( 0 );
  246. GetLeftDropzone().SetAlpha( 0 );
  247. GetCenterDropzone().SetAlpha( 0 );
  248. #ifndef PLATFORM_CONSOLE
  249. bool ignorePointer = GetLeftSlotsScroller().GetFlags() & WidgetFlags.IGNOREPOINTER;
  250. if (ignorePointer)
  251. {
  252. GetLeftSlotsScroller().ClearFlags(WidgetFlags.IGNOREPOINTER);
  253. }
  254. #endif
  255. }
  256. void ShowSourceDropzone( EntityAI item )
  257. {
  258. EntityAI owner = item.GetHierarchyParent();
  259. PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
  260. if (item == player)
  261. {
  262. GetRightDropzone().SetAlpha(1);
  263. }
  264. else if (owner && owner != player)
  265. {
  266. ShowSourceDropzone(owner);
  267. }
  268. else
  269. {
  270. InventoryLocation inv_loc_src = new InventoryLocation;
  271. item.GetInventory().GetCurrentInventoryLocation(inv_loc_src);
  272. int loc_type = inv_loc_src.GetType();
  273. HideDropzones();
  274. if (loc_type == InventoryLocationType.GROUND)
  275. {
  276. GetLeftDropzone().SetAlpha(1);
  277. }
  278. else if (loc_type == InventoryLocationType.HANDS)
  279. {
  280. GetCenterDropzone().SetAlpha(1);
  281. }
  282. else
  283. {
  284. GetRightDropzone().SetAlpha(1);
  285. }
  286. }
  287. }
  288. Widget GetLeftDropzone()
  289. {
  290. if (!m_LeftDropzone)
  291. m_LeftDropzone = m_RootWidget.FindAnyWidget("LeftPanel").FindAnyWidget("DropzoneX");
  292. return m_LeftDropzone;
  293. }
  294. Widget GetRightDropzone()
  295. {
  296. if( !m_RightDropzone )
  297. m_RightDropzone = m_RootWidget.FindAnyWidget("RightPanel").FindAnyWidget("DropzoneX");
  298. return m_RightDropzone;
  299. }
  300. Widget GetCenterDropzone()
  301. {
  302. if( !m_CenterDropzone )
  303. m_CenterDropzone = m_RootWidget.FindAnyWidget("HandsPanel").FindAnyWidget("DropzoneX");
  304. return m_CenterDropzone;
  305. }
  306. EntityAI GetHoveredItem()
  307. {
  308. return m_HoveredItem;
  309. }
  310. void SetDraggedItem( EntityAI dragged_item )
  311. {
  312. m_DraggedItem = dragged_item;
  313. }
  314. EntityAI GetDraggedItem()
  315. {
  316. return m_DraggedItem;
  317. }
  318. void SetDraggedIcon( Icon dragged_icon )
  319. {
  320. m_DraggedIcon = dragged_icon;
  321. }
  322. Icon GetDraggedIcon()
  323. {
  324. return m_DraggedIcon;
  325. }
  326. void SetIsDragging( bool is_dragging )
  327. {
  328. m_IsDragging = is_dragging;
  329. if( !is_dragging )
  330. {
  331. SetDraggedItem( null );
  332. SetDraggedIcon( null );
  333. }
  334. }
  335. bool IsDragging()
  336. {
  337. return m_IsDragging;
  338. }
  339. void HideTooltip()
  340. {
  341. m_TooltipWidget.Show( false );
  342. m_HoveredItem = null;
  343. delete m_ToolTipTimer;
  344. HideTooltipSlot();
  345. }
  346. void HideTooltipSlot()
  347. {
  348. if ( m_SlotInfoShown )
  349. {
  350. m_TooltipSlotWidget.Show( false );
  351. m_SlotInfoShown = false;
  352. delete m_TooltipSlotTimer;
  353. }
  354. }
  355. static int GetItemHealthColor(int pHealthLevel)
  356. {
  357. switch (pHealthLevel)
  358. {
  359. case -1:
  360. break;
  361. case GameConstants.STATE_PRISTINE:
  362. return Colors.COLOR_PRISTINE;
  363. case GameConstants.STATE_WORN:
  364. return Colors.COLOR_WORN;
  365. case GameConstants.STATE_DAMAGED:
  366. return Colors.COLOR_DAMAGED;
  367. case GameConstants.STATE_BADLY_DAMAGED:
  368. return Colors.COLOR_BADLY_DAMAGED;
  369. case GameConstants.STATE_RUINED:
  370. return Colors.COLOR_RUINED;
  371. }
  372. return 0x00FFFFFF;
  373. }
  374. static int GetItemHealthColor(EntityAI item, string zone = "")
  375. {
  376. if (item)
  377. {
  378. switch (item.GetHealthLevel(zone))
  379. {
  380. case -1:
  381. break;
  382. case GameConstants.STATE_PRISTINE:
  383. return Colors.COLOR_PRISTINE;
  384. case GameConstants.STATE_WORN:
  385. return Colors.COLOR_WORN;
  386. case GameConstants.STATE_DAMAGED:
  387. return Colors.COLOR_DAMAGED;
  388. case GameConstants.STATE_BADLY_DAMAGED:
  389. return Colors.COLOR_BADLY_DAMAGED;
  390. case GameConstants.STATE_RUINED:
  391. return Colors.COLOR_RUINED;
  392. }
  393. }
  394. return 0x00FFFFFF;
  395. }
  396. static int ColorFromFloat( float fraction )
  397. {
  398. if( fraction > 1 || fraction < 0 )
  399. return 0x00FFFFFF;
  400. else if( fraction > 0.80 )
  401. return Colors.COLOR_PRISTINE;
  402. else if( fraction > 0.6 )
  403. return Colors.COLOR_WORN;
  404. else if( fraction > 0.4 )
  405. return Colors.COLOR_DAMAGED;
  406. else if( fraction > 0.2 )
  407. return Colors.COLOR_BADLY_DAMAGED;
  408. else
  409. return Colors.COLOR_RUINED;
  410. }
  411. // still used by SlotsIcon calls, different architecture!
  412. void SetTemperature(EntityAI item, Widget item_w)
  413. {
  414. if (item_w)
  415. {
  416. bool colorSet = false;
  417. string name = item_w.GetName();
  418. name.Replace("Render", "Temperature");
  419. Widget temperature_widget = item_w.GetParent().FindAnyWidget(name);
  420. if (item && item.IsInherited(ItemBase) && item.CanHaveTemperature())
  421. {
  422. ObjectTemperatureState temperatureState = ObjectTemperatureState.GetStateData(item.GetTemperature());
  423. if (temperatureState && temperatureState.m_State != EObjectTemperatureState.NEUTRAL)
  424. {
  425. colorSet = true;
  426. temperature_widget.SetColor(temperatureState.m_Color);
  427. temperature_widget.SetAlpha(0.3);
  428. }
  429. }
  430. temperature_widget.Show(colorSet);
  431. }
  432. }
  433. void SetIconTemperature(EntityAI item, Widget item_w)
  434. {
  435. if (item_w)
  436. {
  437. bool colorSet = false;
  438. Widget temperatureColorWidget = item_w.FindAnyWidget("Temperature");
  439. if (item && item.IsInherited(ItemBase) && item.CanHaveTemperature())
  440. {
  441. ObjectTemperatureState temperatureState = ObjectTemperatureState.GetStateData(item.GetTemperature());
  442. if (temperatureState && temperatureState.m_State != EObjectTemperatureState.NEUTRAL)
  443. {
  444. colorSet = true;
  445. temperatureColorWidget.SetColor(temperatureState.m_Color);
  446. temperatureColorWidget.SetAlpha(0.3);
  447. }
  448. }
  449. temperatureColorWidget.Show(colorSet);
  450. }
  451. }
  452. void PrepareTooltip(EntityAI item, int x = 0, int y = 0)
  453. {
  454. if( IsDragging() || !item )
  455. {
  456. return;
  457. }
  458. if ( item.IsInherited( InventoryItem ) )
  459. {
  460. HideTooltip();
  461. m_HoveredItem = item;
  462. InspectMenuNew.UpdateItemInfo( m_TooltipWidget, item );
  463. int screen_w, screen_h;
  464. float w, h;
  465. GetScreenSize(screen_w, screen_h);
  466. m_TooltipWidget.GetScreenSize(w,h);
  467. if (x == -1)//set by icon focusing
  468. {
  469. x = screen_w/2 - w/2;
  470. float x1,y1;
  471. m_RootWidget.FindAnyWidget("InventoryFrameWidget").GetScreenPos(x1,y1); //allign to the same height
  472. y = y1;
  473. }
  474. else if (x == 0 && y == 0 && GetGame().GetInput().IsEnabledMouseAndKeyboardEvenOnServer())
  475. {
  476. GetMousePos(x,y);
  477. }
  478. //minimal edge distance adjustments..
  479. screen_w -= 10;
  480. screen_h -= 10;
  481. int rightEdge = x + w;
  482. if (rightEdge > screen_w)
  483. {
  484. x = screen_w - w;
  485. }
  486. int bottomEdge = y + h;
  487. if (bottomEdge > screen_h)
  488. {
  489. y = screen_h - h;
  490. }
  491. m_TooltipWidget.SetPos(x, y);
  492. m_ToolTipTimer = new Timer();
  493. m_ToolTipTimer.Run( TOOLTIP_DELAY, this, "ShowTooltip" );
  494. Widget preview_frame = m_TooltipWidget.FindAnyWidget("ItemFrameWidget");
  495. if (preview_frame)
  496. {
  497. m_ItemPreviewWidget = ItemPreviewWidget.Cast( preview_frame );
  498. m_ItemPreviewWidget.SetItem(item);
  499. m_ItemPreviewWidget.SetView( item.GetViewIndex() );
  500. }
  501. }
  502. }
  503. //! position is currentlycalculated from the owning 'm_TooltipSourceWidget' directly
  504. void PrepareSlotsTooltip(string name, string desc, int x = 0, int y = 0)
  505. {
  506. InspectMenuNew.UpdateSlotInfo( m_TooltipSlotWidget, name, desc );
  507. HideTooltip();
  508. if (name != "")
  509. {
  510. m_SlotInfoShown = true;
  511. //CalculateTooltipSlotPosition(x,y);
  512. m_TooltipSlotTimer = new Timer();
  513. m_TooltipSlotTimer.Run( TOOLTIP_DELAY, this, "ShowTooltipSlot" );
  514. }
  515. }
  516. void CalculateTooltipSlotPosition(int x = 0, int y = 0)
  517. {
  518. int screen_w, screen_h;
  519. float w, h;
  520. GetScreenSize(screen_w, screen_h);
  521. //m_TooltipSlotWidget.GetScreenSize(w,h);
  522. m_TooltipSlotWidget.GetSize(w,h);
  523. int slot_normal_w = SlotsIcon.GetNormalWidth();
  524. int slot_normal_h = SlotsIcon.GetNormalHeight();
  525. //minimal edge distance adjustments..
  526. screen_w -= 10;
  527. screen_h -= 10;
  528. #ifndef PLATFORM_CONSOLE
  529. x += 5;
  530. y += slot_normal_h + 5;
  531. #else
  532. x += 5;
  533. y += 15;
  534. #endif
  535. Widget scrollerWidget = m_TooltipSourceWidget.GetParent();
  536. while (scrollerWidget)
  537. {
  538. if (ScrollWidget.Cast(scrollerWidget))
  539. {
  540. break;
  541. }
  542. else
  543. {
  544. scrollerWidget = scrollerWidget.GetParent();
  545. }
  546. }
  547. int rightEdge = x + w;
  548. if (rightEdge > screen_w)
  549. {
  550. x = screen_w - w;
  551. }
  552. int bottomEdge = y + h;
  553. if (scrollerWidget)
  554. {
  555. float scrollerX, scrollerY, scrollerSizeX, scrollerSizeY;
  556. scrollerWidget.GetScreenPos(scrollerX,scrollerY);
  557. scrollerWidget.GetScreenSize(scrollerSizeX,scrollerSizeY);
  558. int scroller_bottom = scrollerY + scrollerSizeY;
  559. if (bottomEdge > scroller_bottom)
  560. {
  561. y = scroller_bottom - slot_normal_h;
  562. bottomEdge = y + h;
  563. }
  564. }
  565. /*else
  566. {
  567. ErrorEx("No scroller widget! | m_TooltipSourceWidget: " + m_TooltipSourceWidget);
  568. }*/
  569. if (bottomEdge > screen_h) //should mostly never proc now
  570. {
  571. y = screen_h - h;
  572. }
  573. m_TooltipPosX = x;
  574. m_TooltipPosY = y;
  575. }
  576. void UpdateTooltipSlotPosition()
  577. {
  578. float x, y;
  579. m_TooltipSourceWidget.GetScreenPos(x,y);
  580. CalculateTooltipSlotPosition(x,y);
  581. }
  582. void SetTooltipWidget(Widget w)
  583. {
  584. m_TooltipSourceWidget = w;
  585. }
  586. bool EvaluateContainerDragabilityDefault(EntityAI entity)
  587. {
  588. if ( !ItemBase.Cast( entity ) )
  589. return false;
  590. bool draggable;
  591. PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
  592. draggable = !player.GetInventory().HasInventoryReservation( entity, null ) && !player.IsItemsToDelete();
  593. draggable = draggable && entity.CanPutIntoHands( GetGame().GetPlayer() );
  594. draggable = draggable && entity.GetInventory().CanRemoveEntity();
  595. return draggable;
  596. }
  597. void SetWidgetDraggable( Widget w, bool draggable )
  598. {
  599. if (w)
  600. {
  601. if ( draggable )
  602. w.SetFlags( WidgetFlags.DRAGGABLE );
  603. else
  604. w.ClearFlags( WidgetFlags.DRAGGABLE );
  605. }
  606. }
  607. void ShowTooltip()
  608. {
  609. if( m_ItemPreviewWidget )
  610. {
  611. m_TooltipWidget.Show( true );
  612. }
  613. }
  614. void ShowTooltipSlot()
  615. {
  616. UpdateTooltipSlotPosition();
  617. m_TooltipSlotWidget.SetPos(m_TooltipPosX, m_TooltipPosY);
  618. m_TooltipSlotWidget.Show( true );
  619. }
  620. static int GetChosenCombinationFlag( EntityAI selectedEntity, EntityAI targetEntity, int relevantFlags, out InventoryLocation dst = null)
  621. {
  622. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  623. if (!selectedEntity || !targetEntity)
  624. return InventoryCombinationFlags.NONE;
  625. ItemBase selectedItem = ItemBase.Cast(selectedEntity);
  626. ItemBase targetItem = ItemBase.Cast(targetEntity);
  627. //EntityAI itemInHands = m_player.GetHumanInventory().GetEntityInHands();
  628. ActionManagerClient amc = ActionManagerClient.Cast(player.GetActionManager());
  629. if (relevantFlags & InventoryCombinationFlags.PERFORM_ACTION)
  630. {
  631. if (amc.CanPerformActionFromInventory(targetItem, selectedItem))
  632. return InventoryCombinationFlags.PERFORM_ACTION;
  633. }
  634. if (relevantFlags & InventoryCombinationFlags.SET_ACTION)
  635. {
  636. if (amc.CanSetActionFromInventory(targetItem, selectedItem))
  637. return InventoryCombinationFlags.SET_ACTION;
  638. }
  639. if (relevantFlags & InventoryCombinationFlags.COMBINE_QUANTITY2)
  640. {
  641. if (targetEntity.CanBeCombined(selectedEntity))
  642. {
  643. return InventoryCombinationFlags.COMBINE_QUANTITY2;
  644. }
  645. }
  646. if (relevantFlags & InventoryCombinationFlags.ADD_AS_ATTACHMENT)
  647. {
  648. if (targetEntity.GetInventory().CanAddAttachment(selectedEntity))
  649. {
  650. return InventoryCombinationFlags.ADD_AS_ATTACHMENT;
  651. }
  652. }
  653. if (relevantFlags & InventoryCombinationFlags.ADD_AS_CARGO)
  654. {
  655. if (!targetEntity.GetInventory().HasEntityInInventory(selectedEntity) && targetEntity.GetInventory().CanAddEntityInCargo( selectedEntity, selectedEntity.GetInventory().GetFlipCargo() ))
  656. {
  657. return InventoryCombinationFlags.ADD_AS_CARGO;
  658. }
  659. }
  660. if (relevantFlags & InventoryCombinationFlags.SWAP_MAGAZINE)
  661. {
  662. Magazine mag = Magazine.Cast(targetEntity);
  663. Weapon_Base wpn = Weapon_Base.Cast(targetEntity.GetHierarchyParent());
  664. if (wpn && mag)
  665. {
  666. if (player.GetWeaponManager().CanSwapMagazine(wpn, Magazine.Cast(selectedEntity)))
  667. {
  668. return InventoryCombinationFlags.SWAP_MAGAZINE;
  669. }
  670. }
  671. }
  672. if (relevantFlags & InventoryCombinationFlags.SWAP)
  673. {
  674. if (GameInventory.CanSwapEntitiesEx(selectedEntity, targetEntity))
  675. {
  676. return InventoryCombinationFlags.SWAP;
  677. }
  678. }
  679. if (relevantFlags & InventoryCombinationFlags.FSWAP)
  680. {
  681. if (GameInventory.CanForceSwapEntitiesEx(selectedEntity, null, targetEntity, dst))
  682. {
  683. return InventoryCombinationFlags.FSWAP;
  684. }
  685. }
  686. return InventoryCombinationFlags.NONE;
  687. }
  688. static int GetCombinationFlags( EntityAI entity1, EntityAI entity2 )
  689. {
  690. int flags = 0;
  691. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  692. if (!entity1 || !entity2)
  693. return flags;
  694. if (entity1.IsInherited( ItemBase ) && entity2.IsInherited( ItemBase ))
  695. {
  696. ItemBase ent1 = ItemBase.Cast( entity1 );
  697. if (ent1.CanBeCombined( ItemBase.Cast( entity2 ) ))
  698. flags = flags | InventoryCombinationFlags.COMBINE_QUANTITY2;
  699. }
  700. InventoryLocation il = new InventoryLocation();
  701. entity1.GetInventory().FindFreeLocationFor( entity2, FindInventoryLocationType.ATTACHMENT, il );
  702. if (il.IsValid() && !entity1.GetInventory().FindAttachment(il.GetSlot()))
  703. {
  704. if (!entity1.IsInherited( ZombieBase ) && !entity1.IsInherited( Car ) && !entity2.IsInherited( ZombieBase ) && !entity2.IsInherited( Car ))
  705. {
  706. flags = flags | InventoryCombinationFlags.ADD_AS_ATTACHMENT;
  707. }
  708. }
  709. if (!entity1.GetInventory().HasEntityInInventory(entity2) && entity1.GetInventory().CanAddEntityInCargo( entity2, entity2.GetInventory().GetFlipCargo() )) flags = flags | InventoryCombinationFlags.ADD_AS_CARGO;
  710. if (entity1 == player.GetHumanInventory().GetEntityInHands() || entity2 == player.GetHumanInventory().GetEntityInHands())
  711. {
  712. ActionManagerClient amc;
  713. Class.CastTo(amc, player.GetActionManager());
  714. if (entity1 == player.GetHumanInventory().GetEntityInHands())
  715. {
  716. if (amc.CanPerformActionFromInventory( ItemBase.Cast(entity1), ItemBase.Cast(entity2) ))
  717. {
  718. flags = flags | InventoryCombinationFlags.PERFORM_ACTION;
  719. }
  720. else if (amc.CanSetActionFromInventory( ItemBase.Cast(entity1), ItemBase.Cast(entity2) ))
  721. {
  722. flags = flags | InventoryCombinationFlags.SET_ACTION;
  723. }
  724. }
  725. else
  726. {
  727. if (amc.CanPerformActionFromInventory( ItemBase.Cast(entity2), ItemBase.Cast(entity1) ))
  728. {
  729. flags = flags | InventoryCombinationFlags.PERFORM_ACTION;
  730. }
  731. else if (amc.CanSetActionFromInventory( ItemBase.Cast(entity2), ItemBase.Cast(entity1) ))
  732. {
  733. flags = flags | InventoryCombinationFlags.SET_ACTION;
  734. }
  735. }
  736. }
  737. return flags;
  738. }
  739. static int GetRecipeCount(bool recipe_anywhere, EntityAI entity1, EntityAI entity2)
  740. {
  741. PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin( PluginRecipesManager ));
  742. return plugin_recipes_manager.GetValidRecipes( ItemBase.Cast( entity1 ), ItemBase.Cast( entity2 ), NULL, PlayerBase.Cast( GetGame().GetPlayer() ) );
  743. }
  744. ScrollWidget GetLeftSlotsScroller()
  745. {
  746. if (!m_LeftSlotsScroller)
  747. m_LeftSlotsScroller = ScrollWidget.Cast(m_RootWidget.FindAnyWidget("LeftPanel").FindAnyWidget("ScrollerSlotsContent"));
  748. return m_LeftSlotsScroller;
  749. }
  750. }