[C++/Source] Gildenlager

04/16/2015 12:19 mores18#151
repaired
04/16/2015 15:35 Bommel0705#152
items sind beim handel als gm items anerkannt
04/16/2015 15:57 TiRez#153
Kakashi20, überall aus den Querys das "is_gm_owner" entfernt?

Ein Tiger
04/16/2015 16:47 Agorin#154
z
04/16/2015 17:47 TiRez#155
Agorin, you have to write the "}" before the last "#ifdef __GUILD_SAFEBOX__" at the end of the file, so that there is written:
Code:
[...]
		CQuestManager::instance().AddLuaFunctionTable("guild", guild_functions);
	}

#ifdef __GUILD_SAFEBOX__
	int guild_has_safebox(lua_State* L)
	{
		LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
	[...]
#endif
}
Tiger!
04/16/2015 20:28 Agorin#156
z
04/17/2015 11:02 mores18#157
Client syserr.txt
Quote:
0417 10:55:49931 :: Unknown packet header: 214, last: 19 45
0417 10:55:49947 :: Unknown packet header: 214, last: 19 45
0417 10:55:49964 :: Unknown packet header: 214, last: 19 45
0417 10:55:49981 :: Unknown packet header: 214, last: 19 45
0417 10:55:49998 :: Unknown packet header: 214, last: 19 45
0417 10:55:50014 :: Unknown packet header: 214, last: 19 45
0417 10:55:50031 :: Unknown packet header: 214, last: 19 45
0417 10:55:50047 :: Unknown packet header: 214, last: 19 45

game/packet.h

Quote:
#ifdef __GUILD_SAFEBOX__
HEADER_GC_GUILD_SAFEBOX = 214,
#endif
client/UserInterface/packet.h

Quote:
#ifdef ENABLE_GUILD_SAFEBOX
HEADER_GC_GUILD_SAFEBOX = 214,
#endif
04/17/2015 12:19 Agorin#158
TiRez Now is:

Code:
questlua_guild.cpp: In function 'void quest::RegisterGuildFunctionTable()':
questlua_guild.cpp:464: error: 'guild_has_safebox' was not declared in this scope
questlua_guild.cpp:465: error: 'guild_give_safebox' was not declared in this scope
questlua_guild.cpp:466: error: 'guild_open_safebox' was not declared in this scope
questlua_guild.cpp:467: error: 'guild_get_safebox_size' was not declared in this scope
questlua_guild.cpp:468: error: 'guild_change_safebox_size' was not declared in this scope
gmake: *** [OBJDIR/questlua_guild.o] Bł±d 1
gmake: *** Oczekiwanie na niezakończone zadania....
04/18/2015 17:01 Kakashi20#159
Quote:
Originally Posted by TiRez View Post
Kakashi20, überall aus den Querys das "is_gm_owner" entfernt?

Ein Tiger

Hey ja habe ich

PHP Code:
#include "stdafx.h"

#ifdef __GUILD_SAFEBOX__
#include "GuildSafeboxManager.h"
#include "DBManager.h"
#include "QID.h"
#include "Peer.h"
#include "ClientManager.h"
#include "Cache.h"

extern BOOL g_test_server;

/////////////////////////////////////////
// CGuildSafebox
/////////////////////////////////////////
CGuildSafebox::CGuildSafebox(DWORD dwGuildID)
{
    
m_dwGuildID dwGuildID;
    
m_bSize 0;
    
m_szPassword[0] = '\0';
    
m_dwGold 0;

    
memset(m_pItems0sizeof(m_pItems));
    
memset(m_bItemGrid0sizeof(m_bItemGrid));
}
CGuildSafebox::~CGuildSafebox()
{
    for (
int i 0GUILD_SAFEBOX_MAX_NUM; ++i)
    {
        if (
m_pItems[i])
        {
            
delete m_pItems[i];
            
m_pItems[i] = NULL;
        }
    }
}

void CGuildSafebox::ChangeSize(BYTE bNewSizeCPeerpkPeer)
{
    
SetSize(bNewSize);

    
ForwardPacket(HEADER_DG_GUILD_SAFEBOX_SIZE, &bNewSizesizeof(BYTE), pkPeer);

    
CGuildSafeboxManager::Instance().SaveSafebox(this);
}

void CGuildSafebox::ChangeGold(int iChange)
{
    
SetGold(GetGold() + iChange);

    
DWORD dwGold GetGold();
    
ForwardPacket(HEADER_DG_GUILD_SAFEBOX_GOLD, &dwGoldsizeof(DWORD));

    if (
iChange)
        
CGuildSafeboxManager::Instance().SaveSafebox(this);
}

void CGuildSafebox::LoadItems(SQLMsgpMsg)
{
    
int iNumRows pMsg->Get()->uiNumRows;

    if (
iNumRows)
    {
        
TPlayerItem item;
        
memset(&item0sizeof(item));

        
item.owner GetGuildID();
        
item.window GUILD_SAFEBOX;

        for (
int i 0iNumRows; ++i)
        {
            
MYSQL_ROW row mysql_fetch_row(pMsg->Get()->pSQLResult);
            
int col 0;
            
            
str_to_number(item.idrow[col++]);
            
str_to_number(item.posrow[col++]);
            
str_to_number(item.countrow[col++]);
            
str_to_number(item.vnumrow[col++]);
#ifdef __EXTRA_ITEM_UPGRADE__
            
str_to_number(item.extra_upgrade_levelrow[col++]);
#endif
#ifdef __JEWELRY_ADDON__
            
str_to_number(item.jewelry_addonrow[col++]);
            
str_to_number(item.jewelry_addon_time_leftrow[col++]);
#endif
            
            
for (int i 0ITEM_SOCKET_MAX_NUM; ++i)
                
str_to_number(item.alSockets[i], row[col++]);

            for (
int i 0ITEM_ATTRIBUTE_MAX_NUM; ++i)
            {
                
str_to_number(item.aAttr[i].bTyperow[col++]);
                
str_to_number(item.aAttr[i].sValuerow[col++]);
            }

            if (
item.pos >= GUILD_SAFEBOX_MAX_NUM)
            {
                
sys_err("cannot load item by ID %u for guild %u (cell out of range)"item.idGetGuildID());
                continue;
            }

            const 
TItemTablepProto CClientManager::Instance().GetItemTable(item.vnum);
            if (!
pProto)
            {
                
sys_err("cannot load item by ID %u for guild %u (wrong vnum %u)"item.idGetGuildID(), item.vnum);
                continue;
            }

            
m_pItems[item.pos] = new TPlayerItem(item);
            for (
int i 0pProto->bSize; ++i)
                
m_bItemGrid[item.pos i] = true;

            if (
g_test_server)
                
sys_log(0"CGuildSafebox::LoadItems %u: LoadItem %u vnum %u %s %dx",
                    
GetGuildID(), item.iditem.vnumpProto->szLocaleNameitem.count);
        }
    }
}

void CGuildSafebox::DeleteItems()
{
    
char szDeleteQuery[256];
    
snprintf(szDeleteQuerysizeof(szDeleteQuery), "DELETE FROM item WHERE window = %u AND owner_id = %u"GUILD_SAFEBOXGetGuildID());
    
CDBManager::Instance().AsyncQuery(szDeleteQuery);

    for (
int i 0GUILD_SAFEBOX_MAX_NUM; ++i)
    {
        if (
GetItem(i))
        {
            
CGuildSafeboxManager::Instance().FlushItem(m_pItems[i], false);
            
delete m_pItems[i];
            
m_pItems[i] = NULL;
        }
    }
    
memset(m_bItemGrid0sizeof(m_bItemGrid));
}

bool CGuildSafebox::IsValidCell(BYTE bCellBYTE bSize) const
{
    
// pos out of max window size
    
if (bCell >= GUILD_SAFEBOX_MAX_NUM GUILD_SAFEBOX_ITEM_WIDTH * (bSize 1))
        return 
false;

    
// all good
    
return true;
}

bool CGuildSafebox::IsFree(BYTE bPosBYTE bSize) const
{
    if (!
IsValidCell(bPosbSize))
    {
        
sys_err("IsFree: invalid cell %u"bPos);
        return 
false;
    }

    
// item cannot split over two pages
    
const BYTE bPageSize GUILD_SAFEBOX_ITEM_WIDTH GUILD_SAFEBOX_ITEM_HEIGHT;
    if (
bPos bPageSize != (bPos GUILD_SAFEBOX_ITEM_WIDTH * (bSize 1)) / bPageSize)
    {
        
sys_err("IsFree: different pages");
        return 
false;
    }

    
// not enough pages owned
    
if (bPos bPageSize >= m_bSize)
    {
        
sys_err("not enough pages (page %u requested, owned %u)"bPos bPageSize 1m_bSize);
        return 
false;
    }

    
// there is already an item on this slot
    
for (int i 0bSize; ++i)
    {
        if (
m_bItemGrid[bPos GUILD_SAFEBOX_ITEM_WIDTH])
            return 
false;
    }

    
// all good
    
return true;
}

void CGuildSafebox::RequestAddItem(CPeerpkPeerDWORD dwHandle, const TPlayerItempItem)
{
    const 
TItemTablepProto CClientManager::instance().GetItemTable(pItem->vnum);
    if (!
pProto)
    {
        
sys_err("cannot get proto %u"pItem->vnum);
        
CDBManager::instance().AsyncQuery("DELETE FROM item WHERE id = %u"pItem->id);
        
GiveItemToPlayer(pkPeerdwHandlepItem);
        return;
    }

    if (!
IsFree(pItem->pospProto->bSize))
    {
        
sys_err("no free space at pos %u size %u"pItem->pospProto->bSize);
        
CDBManager::instance().AsyncQuery("DELETE FROM item WHERE id = %u"pItem->id);
        
GiveItemToPlayer(pkPeerdwHandlepItem);
        return;
    }

    
sys_log(0"CGuildSafebox::RequestAddItem: item %u %-20s to %u (guild %u)",
        
pItem->idpProto->szLocaleNamepItem->posGetGuildID());

    
m_pItems[pItem->pos] = new TPlayerItem(*pItem);
    
m_pItems[pItem->pos]->owner GetGuildID();
    
m_pItems[pItem->pos]->window GUILD_SAFEBOX;
    for (
int i 0pProto->bSize; ++i)
        
m_bItemGrid[pItem->pos GUILD_SAFEBOX_ITEM_WIDTH] = true;

    
CGuildSafeboxManager::Instance().SaveItem(m_pItems[pItem->pos]);

    
SendItemPacket(pItem->pos);
}

void CGuildSafebox::RequestMoveItem(BYTE bSrcSlotBYTE bTargetSlot)
{
    if (!
IsValidCell(bSrcSlot))
        return;

    
TPlayerItempItem m_pItems[bSrcSlot];
    if (!
pItem)
        return;

    const 
TItemTablepProto CClientManager::instance().GetItemTable(pItem->vnum);
    if (!
pProto)
        return;

    if (!
IsFree(bTargetSlotpProto->bSize))
        return;

    
sys_log(0"CGuildSafebox::RequestMoveItem: item %u %-20s from %u to %u (guild %u)",
        
pItem->idpProto->szLocaleNamebSrcSlotbTargetSlotGetGuildID());

    
m_pItems[bSrcSlot] = NULL;
    for (
int i 0pProto->bSize; ++i)
        
m_bItemGrid[bSrcSlot GUILD_SAFEBOX_ITEM_WIDTH] = false;

    
pItem->pos bTargetSlot;
    
m_pItems[bTargetSlot] = pItem;
    for (
int i 0pProto->bSize; ++i)
        
m_bItemGrid[bTargetSlot GUILD_SAFEBOX_ITEM_WIDTH] = true;

    
CGuildSafeboxManager::Instance().SaveItem(pItem);

    
SendItemPacket(bSrcSlot);
    
SendItemPacket(bTargetSlot);
}

void CGuildSafebox::RequestTakeItem(CPeerpkPeerDWORD dwHandleBYTE bSlotBYTE bTargetSlot)
{
    if (!
IsValidCell(bSlot))
        return;

    
TPlayerItempItem m_pItems[bSlot];
    if (!
pItem)
        return;

    const 
TItemTablepProto CClientManager::Instance().GetItemTable(pItem->vnum);
    if (!
pProto)
        return;

    
m_pItems[bSlot] = NULL;
    for (
int i 0pProto->bSize; ++i)
        
m_bItemGrid[bSlot GUILD_SAFEBOX_ITEM_WIDTH] = false;

    
SendItemPacket(bSlot);

    
pItem->window INVENTORY;
    
pItem->pos bTargetSlot;
    
GiveItemToPlayer(pkPeerdwHandlepItem);

    
CGuildSafeboxManager::Instance().FlushItem(pItemfalse);
    
delete pItem;
}

void CGuildSafebox::GiveItemToPlayer(CPeerpkPeerDWORD dwHandle, const TPlayerItempItem)
{
    
sys_log(0"CGuildSafebox::GiveItemToPlayer: id %u vnum %u socket %u %u %u"pItem->idpItem->vnum,
        
pItem->alSockets[0], pItem->alSockets[1], pItem->alSockets[2]);

    
pkPeer->EncodeHeader(HEADER_DG_GUILD_SAFEBOX_GIVEdwHandlesizeof(TPlayerItem));
    
pkPeer->Encode(pItemsizeof(TPlayerItem));
}

void CGuildSafebox::SendItemPacket(BYTE bCell)
{
    if (const 
TPlayerItempItem m_pItems[bCell])
        
ForwardPacket(HEADER_DG_GUILD_SAFEBOX_SETpItemsizeof(TPlayerItem));
    else
        
ForwardPacket(HEADER_DG_GUILD_SAFEBOX_DEL, &bCellsizeof(BYTE));
}

void CGuildSafebox::LoadItems(CPeerpkPeerDWORD dwHandle)
{
    if (
m_set_ForwardPeer.find(pkPeer) != m_set_ForwardPeer.end())
    {
        
sys_err("already loaded items for channel %u %s"pkPeer->GetChannel(), pkPeer->GetHost());

        
pkPeer->EncodeHeader(HEADER_DG_GUILD_SAFEBOX_LOADdwHandlesizeof(DWORD) + sizeof(DWORD) + sizeof(WORD));
        
pkPeer->EncodeDWORD(GetGuildID());
        
pkPeer->EncodeDWORD(GetGold());
        
pkPeer->EncodeWORD(0);

        return;
    }

    
std::vector<TPlayerItemvecItems;
    for (
int i 0GUILD_SAFEBOX_MAX_NUM; ++i)
    {
        if (const 
TPlayerItempkItem GetItem(i))
            
vecItems.push_back(*pkItem);
    }

    
sys_log(0"CGuildSafebox::LoadItems [%u] for channel %u %s"vecItems.size(), pkPeer->GetChannel(), pkPeer->GetHost());

    
pkPeer->EncodeHeader(HEADER_DG_GUILD_SAFEBOX_LOADdwHandlesizeof(DWORD) + sizeof(DWORD) + sizeof(WORD) + sizeof(TPlayerItem) * vecItems.size());
    
pkPeer->EncodeDWORD(GetGuildID());
    
pkPeer->EncodeDWORD(GetGold());
    
pkPeer->EncodeWORD(vecItems.size());
    
pkPeer->Encode(&vecItems[0], sizeof(TPlayerItem) * vecItems.size());

    
AddPeer(pkPeer);
}

void CGuildSafebox::AddPeer(CPeerpkPeer)
{
    if (
m_set_ForwardPeer.find(pkPeer) == m_set_ForwardPeer.end())
        
m_set_ForwardPeer.insert(pkPeer);
}

void CGuildSafebox::ForwardPacket(BYTE bHeader, const voidc_pDataDWORD dwSizeCPeerpkExceptPeer)
{
    for (
itertype(m_set_ForwardPeerit m_set_ForwardPeer.begin(); it != m_set_ForwardPeer.end(); ++it)
    {
        if (*
it == pkExceptPeer)
            continue;

        (*
it)->EncodeHeader(bHeader0sizeof(DWORD) + dwSize);
        (*
it)->EncodeDWORD(GetGuildID());
        (*
it)->Encode(c_pDatadwSize);
    }
}

/////////////////////////////////////////
// CGuildSafeboxManager
/////////////////////////////////////////
CGuildSafeboxManager::CGuildSafeboxManager()
{
    
m_dwLastFlushItemTime time(0);
    
m_dwLastFlushSafeboxTime time(0);
}
CGuildSafeboxManager::~CGuildSafeboxManager()
{
    for (
itertype(m_map_GuildSafeboxit m_map_GuildSafebox.begin(); it != m_map_GuildSafebox.end(); ++it)
        
delete (*it).second;
    
m_map_GuildSafebox.clear();
    
m_map_DelayedItemSave.clear();
}

void CGuildSafeboxManager::Initialize()
{
    
std::auto_ptr<SQLMsgpMsg(CDBManager::Instance().DirectQuery("SELECT guild_id, size, password, gold FROM guild_safebox"));
    
    
uint32_t uiNumRows pMsg->Get()->uiNumRows;
    if (
uiNumRows)
    {
        for (
int i 0uiNumRows; ++i)
        {
            
MYSQL_ROW row mysql_fetch_row(pMsg->Get()->pSQLResult);
            
int col 0;

            
// id
            
DWORD dwGuildID;
            
str_to_number(dwGuildIDrow[col++]);
            
// size
            
BYTE bSize;
            
str_to_number(bSizerow[col++]);
            
// passwd
            
const charszPassword row[col++];
            
// gold
            
DWORD dwGold;
            
str_to_number(dwGoldrow[col++]);

            
// create class
            
CGuildSafeboxpGuildSafebox = new CGuildSafebox(dwGuildID);
            
pGuildSafebox->SetSize(bSize);
            
pGuildSafebox->SetPassword(szPassword);
            
pGuildSafebox->SetGold(dwGold);
            
m_map_GuildSafebox.insert(std::pair<DWORDCGuildSafebox*>(dwGuildIDpGuildSafebox));

            
// load items
            
char szQueryExtra[256];
            
int len snprintf(szQueryExtrasizeof(szQueryExtra), "");
#ifdef __EXTRA_ITEM_UPGRADE__
            
len += snprintf(szQueryExtra lensizeof(szQueryExtra) - len", extra_upgrade_level");
#endif
#ifdef __JEWELRY_ADDON__
            
len += snprintf(szQueryExtra lensizeof(szQueryExtra) - len", jewelry_addon, jewelry_addon_time_left");
#endif

            
char szItemQuery[512];
            
snprintf(szItemQuerysizeof(szItemQuery), "SELECT id, pos, count, vnum, socket0, socket1, socket2, "
                "attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, "
                "attrtype5, attrvalue5, attrtype6, attrvalue6 FROM item WHERE window = %u AND owner_id = %u"
,
                
szQueryExtraGUILD_SAFEBOXdwGuildID);

            
            
CDBManager::Instance().ReturnQuery(szItemQueryQID_GUILD_SAFEBOX_ITEM_LOAD0, new GuildHandleInfo(dwGuildID));
            
sys_err("CGuildSafeboxManager::Initialize: Load Guildsafebox: %u (size %d)"dwGuildIDbSize);
            
            
// log
            
sys_log(0"CGuildSafeboxManager::Initialize: Load Guildsafebox: %u (size %d)"dwGuildIDbSize);
        }
    }
}

void CGuildSafeboxManager::Destroy()
{
    
FlushItems(true);
    
FlushSafeboxes(true);
}

CGuildSafeboxCGuildSafeboxManager::GetSafebox(DWORD dwGuildID)
{
    
itertype(m_map_GuildSafeboxit m_map_GuildSafebox.find(dwGuildID);
    if (
it == m_map_GuildSafebox.end())
        return 
NULL;
    return 
it->second;
}

void CGuildSafeboxManager::DestroySafebox(DWORD dwGuildID)
{
    
CGuildSafeboxpSafebox;
    if (!(
pSafebox GetSafebox(dwGuildID)))
        return;

    
pSafebox->DeleteItems();

    
char szDeleteQuery[256];
    
snprintf(szDeleteQuerysizeof(szDeleteQuery), "DELETE FROM guild_safebox WHERE guild_id = %u"dwGuildID);
    
CDBManager::Instance().AsyncQuery(szDeleteQuery);

    
delete pSafebox;
    
m_map_GuildSafebox.erase(dwGuildID);
}

void CGuildSafeboxManager::SaveItem(TPlayerItempItem)
{
    if (
m_map_DelayedItemSave.find(pItem) == m_map_DelayedItemSave.end())
        
m_map_DelayedItemSave.insert(pItem);
}

void CGuildSafeboxManager::FlushItem(TPlayerItempItembool bSave)
{
    if (
m_map_DelayedItemSave.find(pItem) != m_map_DelayedItemSave.end())
    {
        if (
bSave)
            
SaveSingleItem(pItem);
        
m_map_DelayedItemSave.erase(pItem);
    }
}

void CGuildSafeboxManager::FlushItems(bool bForce)
{
    if (!
bForce && time(0) - m_dwLastFlushItemTime <= 60)
        return;
    
m_dwLastFlushItemTime time(0);

    
sys_log(0"CGuildSafeboxManager::FlushItems: flush %u"m_map_DelayedItemSave.size());

    for (
itertype(m_map_DelayedItemSaveit m_map_DelayedItemSave.begin(); it != m_map_DelayedItemSave.end(); ++it)
        
SaveSingleItem(*it);
    
m_map_DelayedItemSave.clear();
}

void CGuildSafeboxManager::SaveSingleItem(TPlayerItempItem)
{
    
char szSaveQuery[QUERY_MAX_LEN];

    if (!
pItem->owner)
    {
        
snprintf(szSaveQuerysizeof(szSaveQuery), "DELETE FROM player.item WHERE id = %u AND window = %u"pItem->idGUILD_SAFEBOX);
        
delete pItem;
    }
    else
    {
        
char szQueryExtra[256];
        
int len snprintf(szQueryExtrasizeof(szQueryExtra), "");
        
snprintf(szSaveQuerysizeof(szSaveQuery), "REPLACE INTO player.item SET id=%u,owner_id=%u,window=%u,pos=%u,count=%u,vnum=%u,"
            "socket0=%ld,socket1=%ld,socket2=%ld,attrtype0=%u,attrvalue0=%d,attrtype1=%u,attrvalue1=%d,attrtype2=%u,attrvalue2=%d,"
            "attrtype3=%u,attrvalue3=%d,attrtype4=%u,attrvalue4=%d,attrtype5=%u,attrvalue5=%d,attrtype6=%u,attrvalue6=%d"
,
            
pItem->idpItem->ownerpItem->windowpItem->pospItem->countpItem->vnumszQueryExtra,
            
pItem->alSockets[0], pItem->alSockets[1], pItem->alSockets[2], pItem->aAttr[0].bTypepItem->aAttr[0].sValue,
            
pItem->aAttr[1].bTypepItem->aAttr[1].sValuepItem->aAttr[2].bTypepItem->aAttr[2].sValuepItem->aAttr[3].bType,
            
pItem->aAttr[3].sValuepItem->aAttr[4].bTypepItem->aAttr[4].sValuepItem->aAttr[5].bTypepItem->aAttr[5].sValue,
            
pItem->aAttr[6].bTypepItem->aAttr[6].sValue);
    }

    if (
g_test_server)
        
sys_log(0"CGuildSafeboxManager::SaveSingleItem: %s"szSaveQuery);

    
CDBManager::Instance().AsyncQuery(szSaveQuery);
}

void CGuildSafeboxManager::SaveSafebox(CGuildSafeboxpSafebox)
{
    if (
m_map_DelayedSafeboxSave.find(pSafebox) == m_map_DelayedSafeboxSave.end())
        
m_map_DelayedSafeboxSave.insert(pSafebox);
}

void CGuildSafeboxManager::FlushSafebox(CGuildSafeboxpSafeboxbool bSave)
{
    if (
m_map_DelayedSafeboxSave.find(pSafebox) != m_map_DelayedSafeboxSave.end())
    {
        if (
bSave)
            
SaveSingleSafebox(pSafebox);
        
m_map_DelayedSafeboxSave.erase(pSafebox);
    }
}

void CGuildSafeboxManager::FlushSafeboxes(bool bForce)
{
    if (!
bForce && time(0) - m_dwLastFlushSafeboxTime <= 60)
        return;
    
m_dwLastFlushSafeboxTime time(0);

    
sys_log(0"CGuildSafeboxManager::FlushSafeboxes: flush %u"m_map_DelayedSafeboxSave.size());

    for (
itertype(m_map_DelayedSafeboxSaveit m_map_DelayedSafeboxSave.begin(); it != m_map_DelayedSafeboxSave.end(); ++it)
        
SaveSingleSafebox(*it);
    
m_map_DelayedSafeboxSave.clear();
}

void CGuildSafeboxManager::SaveSingleSafebox(CGuildSafeboxpSafebox)
{
    
char szSaveQuery[QUERY_MAX_LEN];

    
snprintf(szSaveQuerysizeof(szSaveQuery), "UPDATE player.guild_safebox SET size = %u, gold = %u WHERE guild_id = %u",
        
pSafebox->GetSize(), pSafebox->GetGold(), pSafebox->GetGuildID());

    if (
g_test_server)
        
sys_log(0"CGuildSafeboxManager::SaveSingleSafebox: %s"szSaveQuery);

    
CDBManager::Instance().AsyncQuery(szSaveQuery);
}

void CGuildSafeboxManager::QueryResult(CPeerpkPeerSQLMsgpMsgint iQIDNum)
{
    
std::auto_ptr<GuildHandleInfopInfo((GuildHandleInfo*)((CQueryInfo*)pMsg->pvUserData)->pvData);
    
CGuildSafeboxpSafebox GetSafebox(pInfo->dwGuildID);

    if (!
pSafebox)
    {
        
sys_err("safebox of guild %u does not exist anymore"pInfo->dwGuildID);
        return;
    }

    switch (
iQIDNum)
    {
        case 
QID_GUILD_SAFEBOX_ITEM_LOAD:
            
pSafebox->LoadItems(pMsg);
            break;

        default:
            
sys_err("unkown qid %u"iQIDNum);
            break;
    }
}

void CGuildSafeboxManager::ProcessPacket(CPeerpkPeerDWORD dwHandleBYTE bHeader, const voidc_pData)
{
    if (
g_test_server)
        
sys_log(0"CGuildSafeboxManager::ProcessPacket: %u"bHeader);

    switch (
bHeader)
    {
        case 
HEADER_GD_GUILD_SAFEBOX_ADD:
        {
            const 
TPlayerItem= (TPlayerItem*) c_pData;
            
CClientManager::instance().EraseItemCache(p->id);

            
CGuildSafeboxpSafebox GetSafebox(p->owner);
            if (
pSafebox)
            {
                
pSafebox->RequestAddItem(pkPeerdwHandlep);
            }
            else
            {
                
CDBManager::instance().AsyncQuery("DELETE FROM item WHERE id = %u"p->id);

                
pkPeer->EncodeHeader(HEADER_DG_GUILD_SAFEBOX_GIVEdwHandlesizeof(TPlayerItem));
                
pkPeer->Encode(psizeof(TPlayerItem));
            }
        }
            break;

        case 
HEADER_GD_GUILD_SAFEBOX_MOVE:
            {
                const 
TPacketGDGuildSafeboxMove= (TPacketGDGuildSafeboxMove*) c_pData;
                
CGuildSafeboxpSafebox GetSafebox(p->dwGuild);
                if (
pSafebox)
                {
                    
pSafebox->RequestMoveItem(p->bSrcSlotp->bTargetSlot);
                }
            }
                break;

        case 
HEADER_GD_GUILD_SAFEBOX_TAKE:
            {
                const 
TPacketGDGuildSafeboxTake= (TPacketGDGuildSafeboxTake*) c_pData;
                
CGuildSafeboxpSafebox GetSafebox(p->dwGuild);
                if (
pSafebox)
                {
                    
pSafebox->RequestTakeItem(pkPeerdwHandlep->bSlotp->bTargetSlot);
                }
            }
                break;

        case 
HEADER_GD_GUILD_SAFEBOX_GIVE_GOLD:
            {
                const 
TPacketGuildSafeboxGold= (TPacketGuildSafeboxGold*) c_pData;
                
CGuildSafeboxpSafebox GetSafebox(p->dwGuild);
                if (
pSafebox)
                {
                    
pSafebox->ChangeGold(p->dwGold);
                }
            }
                break;

        case 
HEADER_GD_GUILD_SAFEBOX_GET_GOLD:
            {
                const 
TPacketGuildSafeboxGold= (TPacketGuildSafeboxGold*) c_pData;
                
CGuildSafeboxpSafebox GetSafebox(p->dwGuild);
                if (
pSafebox)
                {
                    
pkPeer->EncodeHeader(HEADER_DG_GUILD_SAFEBOX_GOLDdwHandlesizeof(DWORD) + sizeof(DWORD));
                    
pkPeer->EncodeDWORD(p->dwGuild);

                    if (
pSafebox->GetGold() >= p->dwGold)
                    {
                        
pkPeer->EncodeDWORD(p->dwGold);

                        
pSafebox->ChangeGold(-p->dwGold);
                    }
                    else
                    {
                        
pkPeer->EncodeDWORD(0);

                        
sys_err("not enough gold in safebox");
                    }
                }
            }
                break;

        case 
HEADER_GD_GUILD_SAFEBOX_CREATE:
            {
                const 
charc_szData = (const char*) c_pData;
                
DWORD dwGuildID = *(DWORD*) c_szData;
                
c_szData += sizeof(DWORD);

                
CGuildSafeboxpSafebox GetSafebox(dwGuildID);
                if (!
pSafebox)
                {
                    
sys_log(0"CreateGuildSafebox: %u"dwGuildID);

                    
pSafebox = new CGuildSafebox(dwGuildID);
                    
pSafebox->SetSize(*(BYTE*) c_szData);
                    
m_map_GuildSafebox.insert(std::pair<DWORDCGuildSafebox*>(dwGuildIDpSafebox));

                    
char szQuery[256];
                    
snprintf(szQuerysizeof(szQuery), "INSERT INTO guild_safebox (guild_id, size, password, gold) VALUES "
                        "(%u, %u, '', 0)"
dwGuildID, *(BYTE*) c_szData);
                    
CDBManager::Instance().AsyncQuery(szQuery);

                    
struct {
                        
DWORD    dwGuildID;
                        
BYTE    bSize;
                    } 
kCreateInfo;
                    
kCreateInfo.dwGuildID dwGuildID;
                    
kCreateInfo.bSize = *(BYTE*) c_szData;

                    
CClientManager::Instance().ForwardPacket(HEADER_DG_GUILD_SAFEBOX_CREATE, &kCreateInfosizeof(kCreateInfo), 0pkPeer);
                }
                else
                    
sys_err("safebox already created for guild %u"dwGuildID);
            }
                break;

        case 
HEADER_GD_GUILD_SAFEBOX_SIZE:
            {
                ;
                const 
charc_szData = (const char*) c_pData;
                
DWORD dwGuildID = *(DWORD*) c_szData;
                
c_szData += sizeof(DWORD);

                
CGuildSafeboxpSafebox GetSafebox(dwGuildID);
                if (
pSafebox)
                {
                    
pSafebox->ChangeSize(*(BYTE*) c_szDatapkPeer);
                }
            }
                break;

        case 
HEADER_GD_GUILD_SAFEBOX_LOAD:
            {
                 
DWORD dwGuildID = *(DWORD*) c_pData;
                 
CGuildSafeboxpSafebox GetSafebox(dwGuildID);
                 if (
pSafebox)
                 {
                     
pSafebox->LoadItems(pkPeerdwHandle);
                 }
            }
                break;

        default:
            
sys_err("unkown packet header %u"bHeader);
            break;
    }
}

void CGuildSafeboxManager::InitSafeboxCore(CPeerpkPeer)
{
    for (
itertype(m_map_GuildSafeboxit m_map_GuildSafebox.begin(); it != m_map_GuildSafebox.end(); ++it)
    {
        
TGuildSafeboxInitial init;
        
init.dwGuildID it->second->GetGuildID();
        
init.bSize it->second->GetSize();
        
strlcpy(init.szPasswordit->second->GetPassword(), sizeof(init.szPassword));
        
init.dwGold it->second->GetGold();

        
pkPeer->Encode(&initsizeof(TGuildSafeboxInitial));
    }
}

void CGuildSafeboxManager::Update()
{
    
FlushItems();
    
FlushSafeboxes();
}
#endif 
04/21/2015 18:42 -TÜRK-#160
!!! CRITICAL CORE CRASHER BUG !!!

Step 1: Make a new guild.
Step 2: Collect some EXP points.
Step 3: Buy guild safebox.
Step 4: Put some items in guild safebox.
Step 5: Now give all you collected EXP points to your guild and ta daaa..! Core crashed.

Here is dgb:


Looks like everything starts in class destructor:

04/21/2015 18:50 Fushiida#161
resolved
04/22/2015 00:09 TiRez#162
Quote:
Originally Posted by -TÜRK- View Post
!!! CRITICAL CORE CRASHER BUG !!!

Step 1: Make a new guild.
Step 2: Collect some EXP points.
Step 3: Buy guild safebox.
Step 4: Put some items in guild safebox.
Step 5: Now give all you collected EXP points to your guild and ta daaa..! Core crashed.

Here is dgb:


Looks like everything starts in class destructor:

This bug is already fixed i just forgot to upload it :)
04/22/2015 00:41 Kakashi20#163
Quote:
Originally Posted by TiRez View Post
This bug is already fixed i just forgot to upload it :)
und meiner?
04/22/2015 10:31 Fushiida#164
syserr client =/
04/22/2015 19:35 Agorin#165
Like :)