* Fixed Professor Putricide Tear Gas stunning himself
* Fixed visual of Unstable Experiment
* Fixed oozes not picking new targets after hitting old
* Fixed Gas Cloud not using melee attack
* Removed ooze summon position hack
Closes#4301Closes#2726Closes#5119Closes#4464Closes#2874Closes#4407Closes#2421Closes#4899
Cleaning databases for old/deprecated and expired quests should never be a
developers choice specifically. This should be done by admins, not developers,
through the use of the already existing paramters found in the worldserver config :
CleanCharacterDB / PersistentCharacterCleanFlags
An adjustment to the respective questloader prepared statement has been done to
accomodate for the earlier change (by not loading such quests into memory at all).
Documentation for how this cleanup-procedures work already exists in the core :
doc/CharacterDBCleanup.txt.
Example:
==8753== Possible data race during read of size 8 at 0x2e803e60 by thread #8
==8753== at 0xDD0FFC: PreparedResultSet::operator[](unsigned int) const (QueryResult.h:83)
==8753== by 0x131D82D: WorldSession::HandleCharEnum(Trinity::AutoPtr<PreparedResultSet, ACE_Null_Mutex>) (CharacterHandler.cpp:217)
==8753== by 0x118F8C3: WorldSession::ProcessQueryCallbacks() (WorldSession.cpp:1087)
{..}
==8753== Address 0x2e803e60 is 0 bytes inside a block of size 16 alloc'd
==8753== at 0x4C28B75: operator new(unsigned long) (vg_replace_malloc.c:261)
==8753== by 0x137D515: __gnu_cxx::new_allocator<Field*>::allocate(unsigned long, void const*) (new_allocator.h:92)
==8753== by 0x137D378: std::_Vector_base<Field*, std::allocator<Field*> >::_M_allocate(unsigned long) (in /home/aokromes/bin/bin/worldserver)
==8753== by 0x137CEC6: std::vector<Field*, std::allocator<Field*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<Field**, std::vector<Field*, std::allocator<Field*> > >, unsigned long, Field* const&) (vector.tcc:416)
==8753== by 0x137CB27: std::vector<Field*, std::allocator<Field*> >::insert(__gnu_cxx::__normal_iterator<Field**, std::vector<Field*, std::allocator<Field*> > >, unsigned long, Field* const&) (stl_vector.h:944)
==8753== by 0x137C964: std::vector<Field*, std::allocator<Field*> >::resize(unsigned long, Field*) (stl_vector.h:632)
==8753== by 0x137BFCA: PreparedResultSet::PreparedResultSet(st_mysql_stmt*, st_mysql_res*, unsigned long, unsigned int) (QueryResult.cpp:98)
==8753== by 0x137A12B: MySQLConnection::Query(PreparedStatement*) (MySQLConnection.cpp:493)
==8753== by 0x137F663: PreparedStatementTask::Execute() (PreparedStatement.cpp:412)
Have a feeling this is a false positive, though. Nevertheless good to get rid of.
- Remove redundant locking in PingOperation. Since these are delayed to async threads with their own MySQL connection, no concurrent access here either.
- Codestyle cleanup
- Documentation refining
Most of the cores queries have been converted to prepared statements now. If your code contains queries, please either use the exiting or implement new statements.
The only exclusions are one-time queries (e.g. for core startup) and queries that can't be prepared due to limitations.
Note: The default config file action for clients failing the checks can be changed for each check via the characters.warden_action table
Credits to TOM_RUS