potinho
Advanced OT User
Some player is kicking out my server, i believe some bug related with a lot of containers, someone can help? follow gdb
C++:
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
set = {__val = {0, 0, 4602678819172646912, 0, 13716376884794897337, 0, 4341932892451373056, 0, 4412963585358036992, 0, 0, 0, 0, 0, 6876827780418335343,
8245937412990725737}}
pid = <optimized out>
tid = <optimized out>
ret = <optimized out>
#1 0x00007f62697bb921 in __GI_abort () at abort.c:79
save_stage = 1
act = {__sigaction_handler = {sa_handler = 0x7f6269b67680 <_IO_2_1_stderr_>, sa_sigaction = 0x7f6269b67680 <_IO_2_1_stderr_>}, sa_mask = {__val = {
140060653544077, 17, 140060657088128, 3432, 1, 140060657088259, 140060653551649, 11, 140060657088128, 10, 140058549655568, 0, 94352247898256,
140729211427024, 140060653552851, 140060657088128}}, sa_flags = 1780170112, sa_restorer = 0x55d017ba1091}
sigs = {__val = {32, 0 <repeats 15 times>}}
__cnt = <optimized out>
__set = <optimized out>
__cnt = <optimized out>
__set = <optimized out>
#2 0x00007f626a1ae957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#3 0x00007f626a1b4ae6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#4 0x00007f626a1b4b21 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#5 0x00007f626a1b4d54 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#6 0x000055d0178ff4ae in boost::throw_exception<boost::bad_weak_ptr> (e=...) at /usr/include/boost/throw_exception.hpp:69
No locals.
#7 0x000055d0178f9e22 in boost::detail::shared_count::shared_count (this=0x7f6264d9b878, r=...) at /usr/include/boost/smart_ptr/detail/shared_count.hpp:640
No locals.
#8 0x000055d017b3f653 in boost::shared_ptr<ServicePort>::shared_ptr<ServicePort> (this=0x7f6264d9b870, r=...) at /usr/include/boost/smart_ptr/shared_ptr.hpp:429
No locals.
#9 0x000055d017b3d675 in boost::enable_shared_from_this<ServicePort>::shared_from_this (this=0x7f625a8fa6d8)
at /usr/include/boost/smart_ptr/enable_shared_from_this.hpp:50
__PRETTY_FUNCTION__ = "boost::shared_ptr<X> boost::enable_shared_from_this<T>::shared_from_this() [with T = ServicePort]"
p = {px = 0x7f6264d9bbd8, pn = {pi_ = 0x7f625a8f8fd0}}
#10 0x000055d017b3912a in ServicePort::handle (this=0x7f625a8fa6d0, acceptor=..., socket=0x7f61ec2bf140, error=...) at server.cpp:168
error = {m_val = 0, m_cat = 0x7f626b43d100}
ip = {impl_ = {data_ = {base = {sa_family = 2, sa_data = "\307.\277`\341\320\000\000\000\000\000\000\000"}, v4 = {sin_family = 2, sin_port = 11975,
sin_addr = {s_addr = 3504431295}, sin_zero = "\000\000\000\000\000\000\000"}, v6 = {sin6_family = 2, sin6_port = 11975, sin6_flowinfo = 3504431295,
sin6_addr = {__in6_u = {__u6_addr8 = '\000' <repeats 15 times>, __u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, __u6_addr32 = {0, 0, 0, 0}}},
sin6_scope_id = 0}}}}
remoteIp = 3504431295
connection = {px = 0x0, pn = {pi_ = 0x0}}
#11 0x000055d017b46914 in boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_se---Type <return> to continue, or q <return> to quit---bt full
rvice<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>::operator() (this=0x7f6264d9bbb0, p=0x7f625a8fa6d0, a1=..., a2=0x7f61ec2bf140, a3=...) at /usr/include/boost/bind/mem_fn_template.hpp:393
No locals.
#12 0x000055d017b46699 in boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()>::operator()<boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::rrlist1<boost::system::error_code const&> > (this=0x7f6264d9bbc0, f=..., a=...)
at /usr/include/boost/bind/bind.hpp:463
No locals.
#13 0x000055d017b46403 in boost::_bi::bind_t<void, boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()> >::operator()<boost::system::error_code const&> (this=0x7f6264d9bbb0, a1=...)
at /usr/include/boost/bind/bind.hpp:1306
a = {a1_ = @0x7f6264d9bbe0}
#14 0x000055d017b46226 in boost::asio::detail::binder1<boost::_bi::bind_t<void, boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()> >, boost::system::error_code>::operator() (this=0x7f6264d9bbb0)
at /usr/include/boost/asio/detail/bind_handler.hpp:47
No locals.
#15 0x000055d017b45e5a in boost::asio::asio_handler_invoke<boost::asio::detail::binder1<boost::_bi::bind_t<void, boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()> >, boost::system::error_code> > (
function=...) at /usr/include/boost/asio/handler_invoke_hook.hpp:69
No locals.
#16 0x000055d017b4527e in boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder1<boost::_bi::bind_t<void, boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()> >, boost::system::error_code>, boost::_bi::bind_t<void, boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()> > > (function=..., context=...) at /usr/include/boost/asio/detail/handler_invoke_helpers.hpp:37
No locals.
#17 0x000055d017b44396 in boost::asio::detail::reactive_socket_accept_op<boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio:---Type <return> to continue, or q <return> to quit---bt full
:ip::tcp> >, boost::asio::ip::tcp, boost::_bi::bind_t<void, boost::_mfi::mf3<void, ServicePort, boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&>, boost::_bi::list4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()> > >::do_complete (owner=0x55d018383900, base=0x7f61ec2dbd30)
at /usr/include/boost/asio/detail/reactive_socket_accept_op.hpp:123
b = {<boost::asio::detail::noncopyable> = {<No data fields>}, <No data fields>}
o = 0x7f61ec2dbd30
p = {h = 0x7f6264d9bbb0, v = 0x0, p = 0x0}
handler = {handler_ = {f_ = {f_ = (void (ServicePort::*)(ServicePort * const,
boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >,
boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > *,
const boost::system::error_code &)) 0x55d017b38fdc <ServicePort::handle(boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > >, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*, boost::system::error_code const&)>},
l_ = {<boost::_bi::storage4<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*>, boost::arg<1> (*)()>> = {<boost::_bi::storage3<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > >, boost::_bi::value<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >*> >> = {<boost::_bi::storage2<boost::_bi::value<ServicePort*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::socket_acceptor_service<boost::asio::ip::tcp> > > > >> = {<boost::_bi::storage1<boost::_bi::value<ServicePort*> >> = {a1_ = {t_ = 0x7f625a8fa6d0}}, a2_ = {t_ = {px = 0x7f625a8fa440, pn = {pi_ = 0x7f625a8f89b0}}}}, a3_ = {
t_ = 0x7f61ec2bf140}}, <No data fields>}, <No data fields>}}, arg1_ = {m_val = 0, m_cat = 0x7f626b43d100}}
#18 0x000055d017b3a4ef in boost::asio::detail::task_io_service_operation::complete (this=0x7f61ec2dbd30, owner=..., ec=..., bytes_transferred=0)
at /usr/include/boost/asio/detail/task_io_service_operation.hpp:38
No locals.
#19 0x000055d017b3ae6b in boost::asio::detail::epoll_reactor::descriptor_state::do_complete (owner=0x55d018383900, base=0x7f623180a960, ec=..., bytes_transferred=1)
at /usr/include/boost/asio/detail/impl/epoll_reactor.ipp:704
op = 0x7f61ec2dbd30
descriptor_data = 0x7f623180a960
events = 1
#20 0x000055d017b3a4ef in boost::asio::detail::task_io_service_operation::complete (this=0x7f623180a960, owner=..., ec=..., bytes_transferred=1)
at /usr/include/boost/asio/detail/task_io_service_operation.hpp:38
No locals.
#21 0x000055d017b3b471 in boost::asio::detail::task_io_service::do_run_one (this=0x55d018383900, lock=..., this_thread=..., ec=...)
at /usr/include/boost/asio/detail/impl/task_io_service.ipp:372
task_result = 1
on_exit = {task_io_service_ = 0x55d018383900, lock_ = 0x7f6264d9bd50, this_thread_ = 0x7f6264d9bd80}
o = 0x7f623180a960
more_handlers = true
#22 0x000055d017b3b14d in boost::asio::detail::task_io_service::run (this=0x55d018383900, ec=...) at /usr/include/boost/asio/detail/impl/task_io_service.ipp:149
this_thread = {<boost::asio::detail::thread_info_base> = {<boost::asio::detail::noncopyable> = {<No data fields>}, reusable_memory_ = 0x7f61ec2ec2b0},
private_op_queue = {<boost::asio::detail::noncopyable> = {<No data fields>}, front_ = 0x0, back_ = 0x0}, private_outstanding_work = 0}
---Type <return> to continue, or q <return> to quit---bt full
ctx = {<boost::asio::detail::noncopyable> = {<No data fields>}, key_ = 0x55d018383900, value_ = 0x7f6264d9bd80, next_ = 0x0}
lock = {<boost::asio::detail::noncopyable> = {<No data fields>}, mutex_ = @0x55d018383930, locked_ = false}
n = 52618135
#23 0x000055d017b3b5d3 in boost::asio::io_service::run (this=0x7ffe12a81ba8) at /usr/include/boost/asio/impl/io_service.ipp:59
ec = {m_val = 0, m_cat = 0x7f626b43d100}
s = 0
#24 0x000055d017b46eca in boost::_mfi::mf0<unsigned long, boost::asio::io_service>::operator() (this=0x55d018384248, p=0x7ffe12a81ba8)
at /usr/include/boost/bind/mem_fn_template.hpp:49
No locals.
#25 0x000055d017b46e30 in boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> >::operator()<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list0> (this=0x55d018384258, f=..., a=...) at /usr/include/boost/bind/bind.hpp:249
No locals.
#26 0x000055d017b46dc0 in boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >::operator() (this=0x55d018384248) at /usr/include/boost/bind/bind.hpp:1294
a = {<No data fields>}
#27 0x000055d017b46ce2 in boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::run (this=0x55d018384090) at /usr/include/boost/thread/detail/thread.hpp:116
No locals.
#28 0x00007f626ad1dbcd in ?? () from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1
No symbol table info available.
#29 0x00007f626aaf46db in start_thread (arg=0x7f6264d9c700) at pthread_create.c:463
pd = 0x7f6264d9c700
now = <optimized out>
unwind_buf = {cancel_jmp_buf = {{jmp_buf = {140060575516416, -1526904269925907642, 140060575514560, 0, 94352247898256, 140729211427024, 1444407652649665350,
1444404195423552326}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x0}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
not_first_call = <optimized out>
#30 0x00007f626989c71f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
Post automatically merged:
C++:
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. [Current thread is 1 (Thread 0x7f6264d9c700 (LWP 6606))] (gdb) br full Breakpoint 1 at 0x55d017912c12: file container.h, line 77. (gdb) bt full #0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 set = {__val = {0, 0, 4602678819172646912, 0, 13716376884794897337, 0, 4341932892451373056, 0, 4412963585358036992, 0, 0, 0, 0, 0, 6876827780418335343, 8245937412990725737}} pid = <optimized out> tid = <optimized out> ret = <optimized out> #1 0x00007f62697bb921 in __GI_abort () at abort.c:79 save_stage = 1 act = {__sigaction_handler = { sa_handler = 0x7f6269b67680 <_IO_2_1_stderr_>, sa_sigaction = 0x7f6269b67680 <_IO_2_1_stderr_>}, sa_mask = { __val = {140060653544077, 17, 140060657088128, 3432, 1, 140060657088259, 140060653551649, 11, 140060657088128, 10, 140058549655568, 0, 94352247898256, 140729211427024, 140060653552851, 140060657088128}}, sa_flags = 1780170112, sa_restorer = 0x55d017ba1091} sigs = {__val = {32, 0 <repeats 15 times>}} __cnt = <optimized out> __set = <optimized out> __cnt = <optimized out> __set = <optimized out>
Post automatically merged:
C++:
////////////////////////////////////////////////////////////////////////
// OpenTibia - an opensource roleplaying game
////////////////////////////////////////////////////////////////////////
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////
#ifndef __CONTAINER__
#define __CONTAINER__
#include "otsystem.h"
#include "cylinder.h"
#include "item.h"
class Depot;
class Container;
class ContainerIterator
{
public:
ContainerIterator();
ContainerIterator(const ContainerIterator& rhs);
virtual ~ContainerIterator() {}
ContainerIterator& operator=(const ContainerIterator& rhs);
bool operator==(const ContainerIterator& rhs);
bool operator!=(const ContainerIterator& rhs);
ContainerIterator& operator++();
ContainerIterator operator++(int32_t);
Item* operator*();
Item* operator->();
protected:
ContainerIterator(Container* _base);
Container* base;
std::queue<Container*> over;
ItemList::iterator current;
friend class Container;
};
class Container : public Item, public Cylinder
{
public:
Container(uint16_t type);
virtual ~Container();
virtual Item* clone() const;
virtual Container* getContainer() {return this;}
virtual const Container* getContainer() const {return this;}
virtual Depot* getDepot() {return NULL;}
virtual const Depot* getDepot() const {return NULL;}
Attr_ReadValue readAttr(AttrTypes_t attr, PropStream& propStream);
bool unserializeItemNode(FileLoader& f, NODE node, PropStream& propStream);
std::string getContentDescription() const;
virtual uint32_t getItemHoldingCount() const;
virtual double getWeight() const;
uint32_t capacity() const {return maxSize ? maxSize : std::min(255U, (uint32_t)itemlist.size() + 1);}
uint32_t size() const {return (uint32_t)itemlist.size();}
bool full() const
{
if(maxSize)
return itemlist.size() >= maxSize;
return true;
}
bool empty() const {return itemlist.empty();}
void addItem(Item* item);
Item* getItem(uint32_t index);
bool isHoldingItem(const Item* item) const;
ContainerIterator begin();
ContainerIterator end();
ContainerIterator begin() const;
ContainerIterator end() const;
ItemList::const_iterator getItems() const {return itemlist.begin();}
ItemList::const_iterator getEnd() const {return itemlist.end();}
ItemList::const_reverse_iterator getReversedItems() const {return itemlist.rbegin();}
ItemList::const_reverse_iterator getReversedEnd() const {return itemlist.rend();}
//cylinder implementations
virtual Cylinder* getParent() {return Thing::getParent();}
virtual const Cylinder* getParent() const {return Thing::getParent();}
virtual bool isRemoved() const {return Thing::isRemoved();}
virtual Position getPosition() const {return Thing::getPosition();}
virtual Tile* getTile() {return Thing::getTile();}
virtual const Tile* getTile() const {return Thing::getTile();}
virtual Item* getItem() {return this;}
virtual const Item* getItem() const {return this;}
virtual Creature* getCreature() {return NULL;}
virtual const Creature* getCreature() const {return NULL;}
virtual ReturnValue __queryAdd(int32_t index, const Thing* thing, uint32_t count,
uint32_t flags, Creature* actor = NULL) const;
virtual ReturnValue __queryMaxCount(int32_t index, const Thing* thing, uint32_t count, uint32_t& maxQueryCount,
uint32_t flags) const;
virtual ReturnValue __queryRemove(const Thing* thing, uint32_t count, uint32_t flags, Creature* actor = NULL) const;
virtual Cylinder* __queryDestination(int32_t& index, const Thing* thing, Item** destItem,
uint32_t& flags);
virtual void __addThing(Creature* actor, Thing* thing);
virtual void __addThing(Creature* actor, int32_t index, Thing* thing);
virtual void __updateThing(Thing* thing, uint16_t itemId, uint32_t count);
virtual void __replaceThing(uint32_t index, Thing* thing);
virtual void __removeThing(Thing* thing, uint32_t count);
virtual int32_t __getIndexOfThing(const Thing* thing) const;
virtual Thing* __getThing(uint32_t index) const;
virtual int32_t __getFirstIndex() const;
virtual int32_t __getLastIndex() const;
virtual uint32_t __getItemTypeCount(uint16_t itemId, int32_t subType = -1,
bool itemCount = true) const;
virtual std::map<uint32_t, uint32_t>& __getAllItemTypeCount(std::map<uint32_t,
uint32_t>& countMap, bool itemCount = true) const;
virtual void postAddNotification(Creature* actor, Thing* thing, const Cylinder* oldParent,
int32_t index, CylinderLink_t link = LINK_OWNER);
virtual void postRemoveNotification(Creature* actor, Thing* thing, const Cylinder* newParent,
int32_t index, bool isCompleteRemoval, CylinderLink_t link = LINK_OWNER);
virtual void __internalAddThing(Thing* thing);
virtual void __internalAddThing(uint32_t index, Thing* thing);
virtual void __startDecaying();
private:
void onAddContainerItem(Item* item);
void onUpdateContainerItem(uint32_t index, Item* oldItem, const ItemType& oldType,
Item* newItem, const ItemType& newType);
void onRemoveContainerItem(uint32_t index, Item* item);
Container* getParentContainer();
void updateItemWeight(double diff);
std::stringstream& getContentDescription(std::stringstream& s) const;
protected:
uint32_t maxSize, serializationCount;
double totalWeight;
ItemList itemlist;
friend class ContainerIterator;
friend class IOMapSerialize;
};
#endif