class VicinityContainer: CollapsibleContainer
{
ref VicinitySlotsContainer m_VicinityIconsContainer;
ref map<EntityAI, ref Container> m_ShowedItems = new map<EntityAI, ref Container>;
ref map<int, ref Container> m_ShowedItemsIDs = new map<int, ref Container>;
ref array<EntityAI> m_ShowedItemIcons = new array<EntityAI>;
ref map<CargoBase, ref Container> m_ShowedCargos = new map<CargoBase, ref Container>;
protected bool m_IsProcessing = false; // Prevents refreshing every time a child is added while it is still processing
#ifndef PLATFORM_CONSOLE
protected ScrollWidget m_CargoScrollWidget;
#endif
const float DISTANCE_TO_ENTITIES = 1.0;
const float DISTANCE_TO_THE_REST = 0.5;
const int ITEMS_PER_COLUMN_MAX = 8;
const float VICINITY_CARGO_SCROLLER_HEIGHT_MIN = 0.77;
const float VICINITY_CARGO_SCROLLER_HEIGHT_MID = 0.78;
const float VICINITY_CARGO_SCROLLER_HEIGHT_MAX = 0.87;
void VicinityContainer( LayoutHolder parent, int sort = -1 )
{
m_VicinityIconsContainer = new VicinitySlotsContainer( this );
m_Body.Insert( m_VicinityIconsContainer );
m_VicinityIconsContainer.GetRootWidget().SetColor(166 << 24 | 120 << 16 | 120 << 8 | 120);
#ifndef PLATFORM_CONSOLE
LeftArea leftArea = LeftArea.Cast(GetParent());
if (leftArea)
{
m_CargoScrollWidget = leftArea.GetScrollWidget();
if (m_CargoScrollWidget)
{
bool hasScrollerExactSize = m_CargoScrollWidget.GetFlags() & WidgetFlags.EXACTSIZE;
if (!hasScrollerExactSize)
{
m_CargoScrollWidget.SetFlags(WidgetFlags.IGNOREPOINTER);
}
}
leftArea.GetSlotsHeader().AddChild(GetHeader().GetRootWidget());
leftArea.GetSlotsArea().AddChild(m_VicinityIconsContainer.GetRootWidget());
}
#endif
m_MainWidget = m_RootWidget.FindAnyWidget( "body" );
WidgetEventHandler.GetInstance().RegisterOnChildAdd( m_MainWidget, this, "OnChildAdd" );
WidgetEventHandler.GetInstance().RegisterOnChildRemove( m_MainWidget, this, "OnChildRemove" );
RecomputeOpenedContainers();
m_CollapsibleHeader.SetName("#container_vicinity");
LoadDefaultState();
}
bool IsVicinityContainerIconsActive()
{
return m_VicinityIconsContainer.IsActive();
}
VicinitySlotsContainer GetVicinityIconsContainer()
{
return m_VicinityIconsContainer;
}
bool IsContainerWithCargoActive()
{
return ( ContainerWithCargo.Cast( GetFocusedContainer() ) != null );
}
bool IsItemWithAttachmentsActive()
{
return ( ContainerWithCargoAndAttachments.Cast( GetFocusedContainer() ) != null );
}
bool IsItemWithCategoriesActive()
{
return ( AttachmentCategoriesContainer.Cast( GetFocusedContainer() ) != null );
}
void TraverseShowedItems()
{
map<string, bool> serialized_types = new map<string, bool>();
for ( int i = 0; i < m_ShowedItems.Count(); i++ )
{
EntityAI entity = m_ShowedItems.GetKey( i );
Container container = m_ShowedItems.GetElement( i );
string type = entity.GetType();
if ( container.IsInherited( ContainerWithCargo ) )
{
if ( !serialized_types.Contains( type ) )
{
ContainerWithCargo item_with_cargo = ContainerWithCargo.Cast( container );
serialized_types.Insert( type, item_with_cargo.IsOpened() );
}
}
}
if ( serialized_types.Count() > 0 )
{
FileSerializer file = new FileSerializer();
if ( file.Open( "inventory_state.save", FileMode.APPEND ) )
{
file.Write( serialized_types.Count() );
for ( i = 0; i < serialized_types.Count(); i++ )
{
file.Write( serialized_types.GetKey( i ) );
file.Write( serialized_types.GetElement( i ) );
}
}
file.Close();
}
}
override void DraggingOverHeader( Widget w, int x, int y, Widget receiver )
{
if ( w == null )
{
return;
}
ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
if ( !ipw )
{
string name = w.GetName();
name.Replace( "PanelWidget", "Render" );
ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
}
if ( !ipw && ItemPreviewWidget.Cast( w ) )
{
ipw = ItemPreviewWidget.Cast( w );
}
if ( !ipw || !ipw.GetItem() )
{
return;
}
if ( ipw.GetItem() && g_Game.GetPlayer().CanDropEntity( ipw.GetItem() ) && ipw.GetItem().GetInventory().CanRemoveEntity() && m_ShowedItemIcons.Find( ipw.GetItem() ) == -1 )
{
ColorManager.GetInstance().SetColor( w, ColorManager.GREEN_COLOR );
ItemManager.GetInstance().HideDropzones();
ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
#ifndef PLATFORM_CONSOLE
bool ignorePointer = ItemManager.GetInstance().GetLeftSlotsScroller().GetFlags() & WidgetFlags.IGNOREPOINTER;
if (!ignorePointer)
{
ItemManager.GetInstance().GetLeftSlotsScroller().SetFlags(WidgetFlags.IGNOREPOINTER);
}
#endif
}
else
{
ColorManager.GetInstance().SetColor( w, ColorManager.RED_COLOR );
ItemManager.GetInstance().ShowSourceDropzone( ipw.GetItem() );
}
}
void DraggingOverIcon( Widget w, int x, int y, Widget receiver )
{
string name = receiver.GetName();
name.Replace("PanelWidget", "Render");
ItemPreviewWidget receiver_iw = ItemPreviewWidget.Cast( receiver.FindAnyWidget(name) );
EntityAI receiver_item = receiver_iw.GetItem();
ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
if ( !ipw )
{
name = w.GetName();
name.Replace( "PanelWidget", "Render" );
ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
}
if ( !ipw && ItemPreviewWidget.Cast( w ) )
{
ipw = ItemPreviewWidget.Cast( w );
}
if (!ipw)
{
return;
}
if ( !ItemBase.Cast( receiver_item ) || !ipw.GetItem() )
{
return;
}
if ( ipw.GetItem().GetInventory().CanRemoveEntity() || m_ShowedItemIcons.Find( ipw.GetItem() ) > -1 )
{
if ( ( ItemBase.Cast( receiver_item ) ).CanBeCombined( ItemBase.Cast( ipw.GetItem() ) ) )
{
ColorManager.GetInstance().SetColor( w, ColorManager.COMBINE_COLOR );
ItemManager.GetInstance().HideDropzones();
ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
return;
}
else if ( GameInventory.CanSwapEntitiesEx( receiver_item, ipw.GetItem() ) )
{
ColorManager.GetInstance().SetColor( w, ColorManager.SWAP_COLOR );
ItemManager.GetInstance().HideDropzones();
ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
return;
}
/*else if( g_Game.GetPlayer().CanDropEntity( ipw.GetItem() ) )
{
ColorManager.GetInstance().SetColor( w, ColorManager.GREEN_COLOR );
ItemManager.GetInstance().HideDropzones();
ItemManager.GetInstance().GetLeftDropzone().SetAlpha( 1 );
return;
}*/
}
ColorManager.GetInstance().SetColor( w, ColorManager.RED_COLOR );
ItemManager.GetInstance().ShowSourceDropzone( ipw.GetItem() );
}
void OnDropReceivedFromIcon( Widget w, int x, int y, Widget receiver )
{
string name = receiver.GetName();
name.Replace("PanelWidget", "Render");
ItemPreviewWidget receiver_iw = ItemPreviewWidget.Cast( receiver.FindAnyWidget(name) );
EntityAI receiver_item = receiver_iw.GetItem();
ItemPreviewWidget ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( "Render" ) );
if ( !ipw )
{
name = w.GetName();
name.Replace( "PanelWidget", "Render" );
ipw = ItemPreviewWidget.Cast( w.FindAnyWidget( name ) );
}
if ( !ItemBase.Cast( receiver_item ) || !ipw.GetItem() )
{
return;
}
EntityAI item = ipw.GetItem();
bool equal_typed = item.GetType() == receiver_item.GetType();
if ( !receiver_item.IsInherited( ItemBase ) || item == null )
{
return;
}
PlayerBase player = PlayerBase.Cast( g_Game.GetPlayer() );
if ( !item.GetInventory().CanRemoveEntity() )
return;
if ( ( ItemBase.Cast( receiver_item ) ).CanBeCombined( ItemBase.Cast( item ) ) )
{
( ItemBase.Cast( receiver_item ) ).CombineItemsClient( ItemBase.Cast( item ) );
}
else if( GameInventory.CanSwapEntitiesEx( receiver_item, item ) )
{
InventoryLocation il1 = new InventoryLocation;
InventoryLocation il2 = new InventoryLocation;
receiver_item.GetInventory().GetCurrentInventoryLocation( il1 );
item.GetInventory().GetCurrentInventoryLocation( il2 );
if( !receiver_item.GetInventory().CanRemoveEntity() || ( il1.GetType() == InventoryLocationType.GROUND && il2.GetType() == InventoryLocationType.GROUND ) )
return;
player.PredictiveSwapEntities( item, receiver_item );
}
ItemManager.GetInstance().HideDropzones();
ItemManager.GetInstance().SetIsDragging( false );
PrepareOwnedTooltip(item);
InventoryMenu menu = InventoryMenu.Cast( g_Game.GetUIManager().FindMenu( MENU_INVENTORY ) );
if ( menu )
{
menu.RefreshQuickbar();
}
}
void OnLeftPanelDropReceived( Widget w, int x, int y, Widget receiver )
{
OnDropReceivedFromHeader( w, x, y, receiver );
}
void OnDropReceivedFromEmptySpace( Widget w, int x, int y, Widget receiver )
{
OnDropReceivedFromHeader( w, x, y, receiver );
}
override void OnDropReceivedFromHeader(Widget w, int x, int y, Widget receiver)
{
if (!w)
return;
ItemManager.GetInstance().HideDropzones();
ItemManager.GetInstance().SetIsDragging(false);
ItemPreviewWidget ipw = ItemPreviewWidget.Cast(w.FindAnyWidget("Render"));
if (!ipw)
{
string name = w.GetName();
name.Replace("PanelWidget", "Render");
ipw = ItemPreviewWidget.Cast(w.FindAnyWidget(name));
}
if (!ipw)
{
ipw = ItemPreviewWidget.Cast(w);
if (!ipw)
return;
}
EntityAI item = ipw.GetItem();
if (!ipw.IsInherited(ItemPreviewWidget) || !item)
return;
if (!item.GetInventory().CanRemoveEntity() || m_ShowedItemIcons.Find(item) > -1)
return;
PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
if (player.CanDropEntity(item))
{
ItemBase itemBase = ItemBase.Cast(item);
if (itemBase)
{
if (itemBase.GetTargetQuantityMax() < itemBase.GetQuantity())
itemBase.SplitIntoStackMaxClient(null, -1);
else
player.PhysicalPredictiveDropItem(itemBase);
}
}
InventoryMenu menu = InventoryMenu.Cast( g_Game.GetUIManager().FindMenu( MENU_INVENTORY ) );
if ( menu )
{
menu.RefreshQuickbar();
}
}
override void UpdateInterval()
{
PlayerBase player = PlayerBase.Cast( g_Game.GetPlayer() );
if (!player)
return;
super.UpdateInterval();
EntityAI eai;
vector pos = player.GetPosition();
array<EntityAI> objects;
VicinityItemManager.GetInstance().Update( player.GetDeltaT() );
objects = VicinityItemManager.GetInstance().GetVicinityItems();
//GetItemsShowableInInventory
array<EntityAI> showable_items = new array<EntityAI>;
bool isUsedMicromanagment = false;
EntityAI selectesItem = ItemManager.GetInstance().GetSelectedItem();
int m_OldShowedItemIconsCount = m_ShowedItemIcons.Count();
if (selectesItem && ItemManager.GetInstance().IsMicromanagmentMode())
{
if (m_ShowedItemIcons.Find(selectesItem) != -1)
{
isUsedMicromanagment = true;
}
}
m_ShowedItemIcons.Clear();
GameInventory game_inventory = player.GetInventory();
for ( int i = 0; i < objects.Count(); i++ )
{
eai = objects.Get( i );
if ( eai == null || game_inventory.IsPlaceholderEntity( eai ) )
continue; // noproxy: ignore body placeholder
BaseBuildingBase base_building = BaseBuildingBase.Cast(eai);
if (base_building && !base_building.IsPlayerInside(player,""))
continue;
if (eai.IsInventoryVisible())
{
showable_items.Insert(eai);
if (!eai.DisableVicinityIcon())
{
m_ShowedItemIcons.Insert(eai);
}
}
}
if (isUsedMicromanagment && m_ShowedItemIcons.Find(selectesItem) == -1 )
{
//ItemManager.GetInstance().SetItemMicromanagmentMode(false);
ItemManager.GetInstance().SetSelectedItemEx(null, null, null);
isUsedMicromanagment = false;
}
//MW HOTFIX - old containers must be removed before new one are added (part of initialize are refreshed whole structure - need proper fix to avoid it)
map<EntityAI, ref Container> new_showed_items = new map<EntityAI, ref Container>;
Container con;
for ( i = 0; i < showable_items.Count(); i++ )
{
new_showed_items.Insert(showable_items[i],null);
}
bool need_update_focus = false;
for ( i = 0; i < m_ShowedItems.Count(); i++ )
{
EntityAI ent = m_ShowedItems.GetKey( i );
m_ShowedItems.GetElement( i ).UpdateInterval();
con = m_ShowedItems.GetElement( i );
if ( !new_showed_items.Contains( ent ) )
{
if ( selectesItem && selectesItem.GetHierarchyRoot() == ent)
{
//ItemManager.GetInstance().SetItemMicromanagmentMode(false);
ItemManager.GetInstance().SetSelectedItemEx(null, null, null);
}
GetMainWidget().Update();
if ( con.IsActive() )
need_update_focus = true;
Container.Cast( GetParent() ).Remove( con );
Remove( con );
}
else
{
UpdateHeader(ent,con,player); //squeezed here, the map is iterated over enough already..
}
}
//////////
bool accessInventory = PlayerBase.DEBUG_INVENTORY_ACCESS;
accessInventory |= FreeDebugCamera.GetInstance() && FreeDebugCamera.GetInstance().IsActive();
//map<EntityAI, ref Container> new_showed_items = new map<EntityAI, ref Container>;
new_showed_items.Clear();
map<int, ref Container> showed_items_IDs = new map<int, ref Container>;
for ( i = 0; i < showable_items.Count(); i++ )
{
EntityAI entity = showable_items.Get( i );
if ( entity )
{
if ( game_inventory && !m_ShowedItems.Contains( entity ) )
{
string config = "CfgVehicles " + entity.GetType() + " GUIInventoryAttachmentsProps";
if ( g_Game.ConfigIsExisting( config ) )
{
AttachmentCategoriesContainer ac = new AttachmentCategoriesContainer( m_Parent, -1 );
ac.SetEntity( entity );
new_showed_items.Insert( entity, ac );
showed_items_IDs.Insert( entity.GetID(), ac);
}
else if ( entity.GetSlotsCountCorrect() > 0 && entity.GetInventory().GetCargo() )
{
if ( entity.IsInherited( DayZInfected ) )
{
if ( entity.IsAlive() )
{
continue;
}
ZombieContainer zmb_cnt = new ZombieContainer( m_Parent, -1 );
zmb_cnt.SetEntity( entity );
new_showed_items.Insert( entity, zmb_cnt );
showed_items_IDs.Insert( entity.GetID(), zmb_cnt );
Container.Cast( GetParent() ).Insert( zmb_cnt );
}
else
{
ContainerWithCargoAndAttachments iwca = new ContainerWithCargoAndAttachments( this, -1 );
iwca.SetEntity( entity, false );
new_showed_items.Insert( entity, iwca );
showed_items_IDs.Insert( entity.GetID(), iwca );
}
}
else if ( entity.GetInventory().GetCargo() )
{
ContainerWithCargo iwc = new ContainerWithCargo( this, -1 );
iwc.SetEntity( entity, 0, false );
new_showed_items.Insert( entity, iwc );
showed_items_IDs.Insert( entity.GetID(), iwc );
iwc.UpdateInterval();
}
else if ( entity.GetSlotsCountCorrect() > 0 )
{
if ( entity.HasEnergyManager() )
{
ContainerWithElectricManager iwem = new ContainerWithElectricManager( this, -1 );
iwem.SetEntity( entity, false );
new_showed_items.Insert( entity, iwem );
showed_items_IDs.Insert( entity.GetID(), iwem );
}
else
{
if ( entity.IsInherited( PlayerBase ) )
{
//! Allow view access of inventory if in free camera. Write access is elsewhere
if (accessInventory == false)
{
if ( entity.IsAlive() && ( !PlayerBase.Cast( entity ).IsUnconscious() && !PlayerBase.Cast( entity ).IsRestrained() ) )
{
continue;
}
}
PlayerContainer plyr_cnt = new PlayerContainer( m_Parent, false );
plyr_cnt.SetPlayer( PlayerBase.Cast( entity ) );
Container.Cast( GetParent() ).Insert( plyr_cnt );
( Container.Cast( m_Parent ) ).Refresh();
new_showed_items.Insert( entity, plyr_cnt );
showed_items_IDs.Insert( entity.GetID(), plyr_cnt);
}
else
{
ContainerWithCargoAndAttachments iwcas = new ContainerWithCargoAndAttachments( this, -1 );
iwcas.SetEntity( entity, false );
new_showed_items.Insert( entity, iwcas );
showed_items_IDs.Insert( entity.GetID(), iwcas );
iwcas.UpdateInterval();
}
}
}
}
else
{
//TODO MW: remove old containers on one spot (hotfix)
con = m_ShowedItems.Get( entity );
if ( con )
{
if ( entity.IsInherited( PlayerBase ) )
{
//! Allow view access of inventory if in free camera. Write access is elsewhere
if ( !accessInventory && entity.IsAlive() && ( !PlayerBase.Cast( entity ).IsUnconscious() && !PlayerBase.Cast( entity ).IsRestrained() ) )
{
GetMainWidget().Update();
if ( con.IsActive() )
need_update_focus = true;
Container.Cast( GetParent() ).Remove( con );
Remove( con );
continue;
}
}
if ( entity.IsInherited( BaseBuildingBase ) )
{
if ( !BaseBuildingBase.Cast(entity).IsPlayerInside(player,""))
{
GetMainWidget().Update();
if ( con.IsActive() )
need_update_focus = true;
Container.Cast( GetParent() ).Remove( con );
Remove( con );
continue;
}
}
new_showed_items.Insert( entity, m_ShowedItems.Get( entity ) );
showed_items_IDs.Insert( entity.GetID(), m_ShowedItemsIDs.Get( entity.GetID() ) );
}
}
}
}
map<CargoBase, ref Container> new_showed_cargos = new map<CargoBase, ref Container>;
auto cargoes = VicinityItemManager.GetInstance().GetVicinityCargos();
for ( i = 0; i < cargoes.Count(); i++ )
{
CargoBase cgo = cargoes.Get( i );
if ( cgo )
{
if (game_inventory && !m_ShowedCargos.Contains( cgo ) )
{
ContainerWithCargo pxc = new ContainerWithCargo( this, -1 );
pxc.SetEntity( cgo.GetCargoOwner(), cgo.GetOwnerCargoIndex(), false );
new_showed_cargos.Insert( cgo, pxc );
pxc.UpdateInterval();
}
else
{
if ( m_ShowedCargos.Get( cgo ) )
{
new_showed_cargos.Insert( cgo, m_ShowedCargos.Get( cgo ) );
}
}
}
}
for ( int ic = 0; ic < m_ShowedCargos.Count(); ic++ )
{
CargoBase cgo2 = m_ShowedCargos.GetKey( ic );
m_ShowedCargos.GetElement( ic ).UpdateInterval();
if ( !new_showed_cargos.Contains( cgo2 ) )
{
Container con2 = m_ShowedCargos.GetElement( ic );
if( con2.IsActive() )
need_update_focus = true;
GetMainWidget().Update();
Container.Cast( GetParent() ).Remove( con2 );
Remove( con2 );
}
}
m_ShowedItems = new_showed_items;
m_ShowedItemsIDs = showed_items_IDs;
m_ShowedCargos = new_showed_cargos;
//Because WTF (zombie container)
Container.Cast( GetParent() ).RecomputeOpenedContainers();
if (need_update_focus)
SetFirstActive();
//RecomputeOpenedContainers();
UpdateCollapseButtons();
m_VicinityIconsContainer.ShowItemsInContainers( m_ShowedItemIcons );
if ( m_ShowedItemIcons.Count() != m_OldShowedItemIconsCount )
{
Inventory in = Inventory.Cast( GetRoot() );
if ( in )
in.UpdateConsoleToolbar();
}
#ifndef PLATFORM_CONSOLE
//! Adjust left cargo container scroller height depending on visible items in the vicinity
if (m_CargoScrollWidget)
{
float width, height;
m_CargoScrollWidget.GetSize(width, height);
if (showable_items.Count() >= ITEMS_PER_COLUMN_MAX * 2)
{
m_CargoScrollWidget.SetSize(width, VICINITY_CARGO_SCROLLER_HEIGHT_MIN);
}
else if (showable_items.Count() >= ITEMS_PER_COLUMN_MAX)
{
m_CargoScrollWidget.SetSize(width, VICINITY_CARGO_SCROLLER_HEIGHT_MID);
}
else
{
m_CargoScrollWidget.SetSize(width, VICINITY_CARGO_SCROLLER_HEIGHT_MAX);
}
}
#endif
}
void ToggleContainer( Widget w, EntityAI item )
{
SlotsIcon slots_icon;
Container c;
w.GetUserData(slots_icon);
if ( item )
{
c = Container.Cast( m_ShowedItems.Get( item ) );
}
if (c)
{
ToggleContainer(c);
}
}
override bool CanOpenCloseContainerEx(EntityAI focusedEntity)
{
if (focusedEntity)
{
ClosableContainer c = ClosableContainer.Cast( m_ShowedItems.Get( focusedEntity ) );
if (c && c.IsDisplayable())
{
return true;
}
}
return false;
}
//Call from ExpandCollapseContainer - not call
void ToggleContainer( notnull Container conta )
{
conta.Toggle();
}
override void ExpandCollapseContainer()
{
EntityAI item = GetFocusedItem();
Container conta;
if (m_ShowedItems && item)
{
conta = m_ShowedItems.Get( item );
if (conta)
{
ToggleContainer( conta );
}
}
}
override bool OnChildRemove( Widget w, Widget child )
{
w.Update();
float x, y;
w.GetScreenSize( x, y );
if ( w == GetMainWidget() )
{
GetMainWidget().Update();
m_Parent.OnChildRemove( w, child );
}
return true;
}
override bool OnChildAdd( Widget w, Widget child )
{
if ( w == GetMainWidget() )
{
GetMainWidget().Update();
m_Parent.OnChildAdd( w, child );
}
return true;
}
override void CollapseButtonOnMouseButtonDown(Widget w)
{
super.CollapseButtonOnMouseButtonDown(w);
ItemManager.GetInstance().SetDefaultHeaderOpenState( "VICINITY", !m_Hidden );
}
//! Updates header dragability to be consistent with current 'icon' behaviour
void UpdateHeader(EntityAI entity, Container cont, PlayerBase player)
{
bool draggable = ItemManager.GetInstance().EvaluateContainerDragabilityDefault(entity);
if (cont.GetHeader())
{
if (GetDragWidget() == cont.GetHeader())
{
CancelWidgetDragging();
}
ItemManager.GetInstance().SetWidgetDraggable(cont.GetHeader().GetMainWidget(),draggable);
}
}
}