@@ -47,7 +47,8 @@ GUIInventoryList::GUIInventoryList(gui::IGUIEnvironment *env,
47
47
m_fs_menu(fs_menu),
48
48
m_options(options),
49
49
m_font(font),
50
- m_hovered_i(-1 )
50
+ m_hovered_i(-1 ),
51
+ m_already_warned(false )
51
52
{
52
53
}
53
54
@@ -58,20 +59,27 @@ void GUIInventoryList::draw()
58
59
59
60
Inventory *inv = m_invmgr->getInventory (m_inventoryloc);
60
61
if (!inv) {
61
- warningstream << " GUIInventoryList::draw(): "
62
- << " The inventory location "
63
- << " \" " << m_inventoryloc.dump () << " \" doesn't exist anymore"
64
- << std::endl;
62
+ if (!m_already_warned) {
63
+ warningstream << " GUIInventoryList::draw(): "
64
+ << " The inventory location "
65
+ << " \" " << m_inventoryloc.dump () << " \" doesn't exist"
66
+ << std::endl;
67
+ m_already_warned = true ;
68
+ }
65
69
return ;
66
70
}
67
71
InventoryList *ilist = inv->getList (m_listname);
68
72
if (!ilist) {
69
- warningstream << " GUIInventoryList::draw(): "
70
- << " The inventory list \" " << m_listname << " \" @ \" "
71
- << m_inventoryloc.dump () << " \" doesn't exist anymore"
72
- << std::endl;
73
+ if (!m_already_warned) {
74
+ warningstream << " GUIInventoryList::draw(): "
75
+ << " The inventory list \" " << m_listname << " \" @ \" "
76
+ << m_inventoryloc.dump () << " \" doesn't exist"
77
+ << std::endl;
78
+ m_already_warned = true ;
79
+ }
73
80
return ;
74
81
}
82
+ m_already_warned = false ;
75
83
76
84
video::IVideoDriver *driver = Environment->getVideoDriver ();
77
85
Client *client = m_fs_menu->getClient ();
@@ -80,9 +88,11 @@ void GUIInventoryList::draw()
80
88
core::rect<s32> imgrect (0 , 0 , m_slot_size.X , m_slot_size.Y );
81
89
v2s32 base_pos = AbsoluteRect.UpperLeftCorner ;
82
90
91
+ const s32 list_size = (s32)ilist->getSize ();
92
+
83
93
for (s32 i = 0 ; i < m_geom.X * m_geom.Y ; i++) {
84
94
s32 item_i = i + m_start_item_i;
85
- if (item_i >= (s32)ilist-> getSize () )
95
+ if (item_i >= list_size )
86
96
break ;
87
97
88
98
v2s32 p ((i % m_geom.X ) * m_slot_spacing.X ,
@@ -192,10 +202,19 @@ bool GUIInventoryList::OnEvent(const SEvent &event)
192
202
193
203
s32 GUIInventoryList::getItemIndexAtPos (v2s32 p) const
194
204
{
205
+ // no item if no gui element at pointer
195
206
if (!IsVisible || AbsoluteClippingRect.getArea () <= 0 ||
196
207
!AbsoluteClippingRect.isPointInside (p))
197
208
return -1 ;
198
209
210
+ // there can not be an item if the inventory or the inventorylist does not exist
211
+ Inventory *inv = m_invmgr->getInventory (m_inventoryloc);
212
+ if (!inv)
213
+ return -1 ;
214
+ InventoryList *ilist = inv->getList (m_listname);
215
+ if (!ilist)
216
+ return -1 ;
217
+
199
218
core::rect<s32> imgrect (0 , 0 , m_slot_size.X , m_slot_size.Y );
200
219
v2s32 base_pos = AbsoluteRect.UpperLeftCorner ;
201
220
@@ -210,7 +229,8 @@ s32 GUIInventoryList::getItemIndexAtPos(v2s32 p) const
210
229
211
230
rect.clipAgainst (AbsoluteClippingRect);
212
231
213
- if (rect.getArea () > 0 && rect.isPointInside (p))
232
+ if (rect.getArea () > 0 && rect.isPointInside (p) &&
233
+ i + m_start_item_i < (s32)ilist->getSize ())
214
234
return i + m_start_item_i;
215
235
216
236
return -1 ;
0 commit comments