mirror of
https://github.com/azerothcore/mod-ale
synced 2025-11-29 15:38:17 +08:00
Some fixes for TC and changes overall Pass map object to hook via function arguments The map object is no longer stored inside the instance data table. Fix mistake in base64 decoder It was failing whenever it encountered a '=' character, which is completely valid. Make ElunaInstanceAI::Load always load something When it failed to load data, it was leaving nothing on the stack. Since subsequent code expected Load to always load something, this was causing issues. Now, when Load fails to load anything, it just leaves a new empty table on the stack. Also: the error messages for Load have been improved. Modify lua-marshal to allow saving of functions/userdata. Some additional code was needed to save functions due to the inclusion of a reference to _ENV within their upvalues (since Lua 5.2). During encoding, a placeholder is left where the _ENV reference would be. During decoding, a reference to the current _G is swapped with the placeholder. Make ElunaInstanceAI::Load re-initialize if data failed to load. Also improve error messages by not including the raw data. Improve storage format of upvalues Instead of storing the upvalues by name, store by index. A wrapper is still used in case the upvalue is nil, to prevent holes in the upvalues table. A special field in the upvalues table, "E", is used to store the index of the _ENV reference (if there was one). A reference to the current globals table is set as the upvalue upon decoding. Remove wrapping from upvalue storing, instead save amount of upvalues
155 lines
4.1 KiB
C++
155 lines
4.1 KiB
C++
/*
|
|
* Copyright (C) 2010 - 2015 Eluna Lua Engine <http://emudevs.com/>
|
|
* This program is free software licensed under GPL version 3
|
|
* Please see the included DOCS/LICENSE.md for more information
|
|
*/
|
|
|
|
#ifndef _ELUNA_UTIL_H
|
|
#define _ELUNA_UTIL_H
|
|
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include "Common.h"
|
|
#include "SharedDefines.h"
|
|
#include "ObjectGuid.h"
|
|
#ifdef TRINITY
|
|
#include "QueryResult.h"
|
|
#ifdef CATA
|
|
#include "Object.h"
|
|
#endif
|
|
#else
|
|
#include "Database/QueryResult.h"
|
|
#endif
|
|
|
|
// Some dummy includes containing BOOST_VERSION:
|
|
// ObjectAccessor.h Config.h Log.h
|
|
#ifdef BOOST_VERSION
|
|
#define USING_BOOST
|
|
#endif
|
|
|
|
#ifdef USING_BOOST
|
|
#include <boost/thread/locks.hpp>
|
|
#include <boost/thread/shared_mutex.hpp>
|
|
#endif
|
|
|
|
#ifdef TRINITY
|
|
typedef QueryResult ElunaQuery;
|
|
#define ELUNA_LOG_INFO(...) TC_LOG_INFO("eluna", __VA_ARGS__);
|
|
#define ELUNA_LOG_ERROR(...) TC_LOG_ERROR("eluna", __VA_ARGS__);
|
|
#define ELUNA_LOG_DEBUG(...) TC_LOG_DEBUG("eluna", __VA_ARGS__);
|
|
#define GET_GUID GetGUID
|
|
#else
|
|
typedef QueryNamedResult ElunaQuery;
|
|
#define ASSERT MANGOS_ASSERT
|
|
#define ELUNA_LOG_INFO(...) sLog.outString(__VA_ARGS__);
|
|
#define ELUNA_LOG_ERROR(...) sLog.outErrorEluna(__VA_ARGS__);
|
|
#define ELUNA_LOG_DEBUG(...) sLog.outDebug(__VA_ARGS__);
|
|
#define GET_GUID GetObjectGuid
|
|
#define GetGameObjectTemplate GetGameObjectInfo
|
|
#define GetItemTemplate GetItemPrototype
|
|
#define GetTemplate GetProto
|
|
#endif
|
|
|
|
#ifndef MAKE_NEW_GUID
|
|
#define MAKE_NEW_GUID(l, e, h) ObjectGuid(h, e, l)
|
|
#endif
|
|
#ifndef GUID_ENPART
|
|
#define GUID_ENPART(guid) ObjectGuid(guid).GetEntry()
|
|
#endif
|
|
#ifndef GUID_LOPART
|
|
#define GUID_LOPART(guid) ObjectGuid(guid).GetCounter()
|
|
#endif
|
|
#ifndef GUID_HIPART
|
|
#define GUID_HIPART(guid) ObjectGuid(guid).GetHigh()
|
|
#endif
|
|
|
|
class Unit;
|
|
class WorldObject;
|
|
|
|
namespace ElunaUtil
|
|
{
|
|
uint32 GetCurrTime();
|
|
|
|
uint32 GetTimeDiff(uint32 oldMSTime);
|
|
|
|
class ObjectGUIDCheck
|
|
{
|
|
public:
|
|
ObjectGUIDCheck(ObjectGuid guid);
|
|
bool operator()(WorldObject* object);
|
|
|
|
ObjectGuid _guid;
|
|
};
|
|
|
|
// Binary predicate to sort WorldObjects based on the distance to a reference WorldObject
|
|
class ObjectDistanceOrderPred
|
|
{
|
|
public:
|
|
ObjectDistanceOrderPred(WorldObject const* pRefObj, bool ascending = true);
|
|
bool operator()(WorldObject const* pLeft, WorldObject const* pRight) const;
|
|
|
|
WorldObject const* m_refObj;
|
|
const bool m_ascending;
|
|
};
|
|
|
|
// Doesn't get self
|
|
class WorldObjectInRangeCheck
|
|
{
|
|
public:
|
|
WorldObjectInRangeCheck(bool nearest, WorldObject const* obj, float range,
|
|
uint16 typeMask = 0, uint32 entry = 0, uint32 hostile = 0);
|
|
WorldObject const& GetFocusObject() const;
|
|
bool operator()(WorldObject* u);
|
|
|
|
WorldObject const* i_obj;
|
|
uint32 i_hostile;
|
|
uint32 i_entry;
|
|
float i_range;
|
|
uint16 i_typeMask;
|
|
bool i_nearest;
|
|
};
|
|
|
|
/*
|
|
* Usage:
|
|
* Inherit this class, then when needing lock, use
|
|
* ReadGuard guard(GetLock());
|
|
* or
|
|
* WriteGuard guard(GetLock());
|
|
*
|
|
* The lock is automatically released at end of scope
|
|
*/
|
|
class RWLockable
|
|
{
|
|
public:
|
|
|
|
#ifdef USING_BOOST
|
|
typedef boost::shared_mutex LockType;
|
|
typedef boost::shared_lock<LockType> ReadGuard;
|
|
typedef boost::unique_lock<LockType> WriteGuard;
|
|
#else
|
|
typedef ACE_RW_Thread_Mutex LockType;
|
|
typedef ACE_Read_Guard<LockType> ReadGuard;
|
|
typedef ACE_Write_Guard<LockType> WriteGuard;
|
|
#endif
|
|
|
|
LockType& GetLock() { return _lock; }
|
|
|
|
private:
|
|
LockType _lock;
|
|
};
|
|
|
|
/*
|
|
* Encodes `data` in Base-64 and store the result in `output`.
|
|
*/
|
|
void EncodeData(const unsigned char* data, size_t input_length, std::string& output);
|
|
|
|
/*
|
|
* Decodes `data` from Base-64 and returns a pointer to the result, or `NULL` on error.
|
|
*
|
|
* The returned result buffer must be `delete[]`ed by the caller.
|
|
*/
|
|
unsigned char* DecodeData(const char* data, size_t *output_length);
|
|
};
|
|
|
|
#endif
|