/********************************CHECK GUILDBANK AGAIN*********************************/
void CDPSrvr::OnPutItemGuildBank( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
#ifdef __SYSSECURITY
try{
#endif
if( g_eLocal.GetState( ENABLE_GUILD_INVENTORY ) == FALSE )
return;
BYTE nId, mode;
DWORD nItemNum;
ar >> nId >> nItemNum >> mode;
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj( pUser ) )
{
#if __VER >= 15 // __GUILD_HOUSE
if( !pUser->GetWorld() || !GuildHouseMng->IsGuildHouse( pUser->GetWorld()->GetID() ) )
#endif // __GUILD_HOUSE
if( !CNpcChecker::GetInstance()->IsCloseNpc( MMI_GUILDBANKING, pUser->GetWorld(), pUser->GetPos() ) )
return;
if( mode == 0 ) // 길드창고에는 Gold를 넣을수 없습니다.
return;
if( nId < 0 || nId > pUser->m_Inventory.GetMax() )
return;
CItemElem* pItemElem = pUser->m_Inventory.GetAtId( nId );
if( IsUsableItem( pItemElem ) == FALSE )
return;
if( pItemElem->IsQuest() )
return;
if( pItemElem->IsBinds() )
return;
if( pUser->IsUsing( pItemElem ) )
{
pUser->AddDefinedText( TID_GAME_CANNOT_DO_USINGITEM );
return;
}
ItemProp* pProp = pItemElem->GetProp();
if( pProp->dwParts == PARTS_RIDE && pProp->dwItemJob == JOB_VAGRANT )
return;
if( pUser->m_Inventory.IsEquip( nId ) )
{
pUser->AddDefinedText( TID_GAME_EQUIPTRADE, "" );
return;
}
if( pItemElem->IsCharged() )
return;
if( (short)( nItemNum ) > pItemElem->m_nItemNum )
nItemNum = pItemElem->m_nItemNum;
#ifdef __SECURITY_FIXES
if( (short)(nItemNum) < 1 )
nItemNum = 1;
#else
if( nItemNum < 1 )
nItemNum = 1;
#endif
// GUILD_BANK_STR 'S1','000000','01'
// GUILD BANK 전체 불러오기 ex ) GUILD_BANK_STR 'S1',@im_idGuild,@iserverindex GUILD_BANK_STR 'S1','000000','01'
// GUILD BANK 저장하기 ex ) GUILD_BANK_STR 'U1',@im_idGuild,@iserverindex,@im_nGoldGuild,@im_ apIndex,@im_dwObjIndex,@im_GuildBank GUILD_BANK_STR 'U1','000001','01',0,'$','$','$'
CGuild* pGuild = pUser->GetGuild();
if( pGuild )
{
CItemElem itemElem;
itemElem = *pItemElem;
itemElem.m_nItemNum = (short)nItemNum;
if ( pGuild->m_GuildBank.Add( &itemElem ) )
{
LogItemInfo aLogItem;
aLogItem.Action = "W";
aLogItem.SendName = pUser->GetName();
aLogItem.RecvName = "GUILDBANK";
aLogItem.WorldId = pUser->GetWorld()->GetID();
aLogItem.Gold = aLogItem.Gold2 = pUser->GetGold();
OnLogItem( aLogItem, &itemElem, nItemNum );
pUser->RemoveItem( (BYTE)( nId ), (short)( nItemNum ) );
UpdateGuildBank( pGuild, GUILD_PUT_ITEM, 0, pUser->m_idPlayer, &itemElem, 0, (short)( nItemNum ) );
pUser->AddPutItemGuildBank( &itemElem );
g_UserMng.AddPutItemElem( pUser, &itemElem );
}
else
{
pUser->AddDefinedText( TID_GAME_GUILDBANKFULL, "" ); // 길드창고가 꽉찼시유~
}
}
}
#ifdef __SYSSECURITY
}
catch(...)
{
Error("Error on Line %d in %s",__LINE__,__FILE__);
}
#endif
}
void CDPSrvr::OnGetItemGuildBank( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
#ifdef __SYSSECURITY
try{
#endif
if( g_eLocal.GetState( ENABLE_GUILD_INVENTORY ) == FALSE )
return;
BYTE nId, mode;
DWORD dwItemNum;
ar >> nId >> dwItemNum >> mode;
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj( pUser ) )
{
#if __VER >= 15 // __GUILD_HOUSE
if( !pUser->GetWorld() || !GuildHouseMng->IsGuildHouse( pUser->GetWorld()->GetID() ) )
#endif // __GUILD_HOUSE
if( !CNpcChecker::GetInstance()->IsCloseNpc( MMI_GUILDBANKING, pUser->GetWorld(), pUser->GetPos() ) )
return;
if (mode == 0) // Gold를 길드창고에서 빼낼때
{
int nGold = (int)dwItemNum;
if( nGold <= 0 || CanAdd( pUser->GetGold(), nGold ) == FALSE )
return;
CGuild* pGuild = pUser->GetGuild();
if (pGuild && pGuild->IsGetPenya(pUser->m_idPlayer))
{
if( (DWORD)nGold > pGuild->m_nGoldGuild )
return;
pUser->AddGold( nGold, FALSE );
pGuild->m_nGoldGuild -= nGold;
pUser->AddGetGoldGuildBank( nGold, 0, pUser->m_idPlayer, 0 ); // 0은 업데이트 시킨 클라에게
pGuild->DecrementMemberContribution( pUser->m_idPlayer, nGold, 0 );
UpdateGuildBank(pGuild, GUILD_GET_PENYA, 1, pUser->m_idPlayer, NULL, nGold );
LogItemInfo aLogItem;
aLogItem.Action = "Y";
aLogItem.SendName = "GUILDBANK";
aLogItem.RecvName = pUser->GetName();
aLogItem.WorldId = pUser->GetWorld()->GetID();
aLogItem.Gold = pUser->GetGold() - nGold;
aLogItem.Gold2 = pUser->GetGold();
//aLogItem.ItemName = "SEED";
_stprintf( aLogItem.szItemName, "%d", II_GOLD_SEED1 );
aLogItem.itemNumber = nGold;
OnLogItem( aLogItem );
CGuildMember* pMember;
CUser* pUsertmp;
map<u_long, CGuildMember*>::iterator i = pGuild->m_mapPMember.begin();
for( ; i != pGuild->m_mapPMember.end(); ++i )
{
pMember = i->second;
pUsertmp = (CUser*)prj.GetUserByID( pMember->m_idPlayer );
if( IsValidObj( pUsertmp ) && pUsertmp != pUser )
{
pUsertmp->AddGetGoldGuildBank( nGold, 2, pUser->m_idPlayer, 0 ); // 2는 업데이트 해야할 클라이게
}
}
g_DPCoreClient.SendGuildMsgControl_Bank_Penya( pUser, nGold, 2, 0 ); // 2는 업데이트 해야할 다른 월드서버의 클라이언트
}
// Core 서버에 전 서버에 업데이트 되야함을 알린다.
}
else if (mode == 1) // 아이템을 길드창고에서 빼낼때
{
CGuild* pGuild = pUser->GetGuild();
if (pGuild && pGuild->IsGetItem(pUser->m_idPlayer))
{
if( nId < 0 || nId > pGuild->m_GuildBank.GetMax() )
return;
CItemElem* pItemElem = pGuild->m_GuildBank.GetAtId( nId );
if( NULL == pItemElem )
return;
if( (short)( dwItemNum ) > pItemElem->m_nItemNum )
dwItemNum = pItemElem->m_nItemNum;
#ifdef __SECURITY_FIXES
if( (short)(dwItemNum) < 1 )
dwItemNum = 1;
#else
if( dwItemNum < 1 )
dwItemNum = 1;
#endif
CItemElem itemElem;
itemElem = *pItemElem;
itemElem.m_nItemNum = (short)( dwItemNum );
itemElem.m_dwObjId = pItemElem->m_dwObjId;
if( pUser->m_Inventory.Add( &itemElem ) )
{
if (pItemElem->m_nItemNum > (int)( dwItemNum ) )
pItemElem->m_nItemNum = (short)( pItemElem->m_nItemNum - dwItemNum );
else
pGuild->m_GuildBank.RemoveAtId( nId );
UpdateGuildBank(pGuild, GUILD_GET_ITEM, 0, pUser->m_idPlayer, &itemElem, 0, (short)( dwItemNum ) );
LogItemInfo aLogItem;
aLogItem.Action = "Y";
aLogItem.SendName = "GUILDBANK";
aLogItem.RecvName = pUser->GetName();
aLogItem.WorldId = pUser->GetWorld()->GetID();
aLogItem.Gold = aLogItem.Gold2 = pUser->GetGold();
OnLogItem( aLogItem, &itemElem, dwItemNum );
// 클라이언트에게 아이템이 인벤토리에 추가됨을 알린다.
pUser->AddGetItemGuildBank( &itemElem );
// 자신을 제외한 모든 클라이언트에게 알려준다.
g_UserMng.AddGetItemElem( pUser, &itemElem );
}
else
{
// 꽉차서 넣을수 가 없음. 메세지 처리
pUser->AddBankIsFull();
}
}
}
}
#ifdef __SYSSECURITY
}
catch(...)
{
Error("Error on Line %d in %s",__LINE__,__FILE__);
}
#endif
}
/***********************************GUILDBANK CHECK AGAIN END************************************/
|