itemmanager.c 21 KB

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