This code is used to prevent the accidental sale or deletion of objects. You can use this 'system' for a quick sale system at NPC. I saw this system on another server, I recoded it myself. Mine works by performing SHIFT + Double click. I give it for free because I think it's very useful and I would like to see it more often on the servers.
DPClient.cpp
DPClient.h
DPSrvr.cpp
DPSrvr.h
User.cpp
User.h
Item.h and Obj.h
WndField.cpp
WndItemCtrl.cpp
in onDraw function:
WndShop.cpp
WndWorld.cpp
MsgHdr.h
Code:
#ifdef __LOCK_ITEM
void CDPClient::SendLockItem(DWORD dwId)
{
BEFORESENDSOLE(ar, PACKETTYPE_LOCK_ITEM, DPID_UNKNOWN);
ar << dwId;
SEND(ar, this, DPID_SERVERPLAYER);
}
#endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM void SendLockItem(DWORD dwId); #endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM ON_MSG(PACKETTYPE_LOCK_ITEM, &CDPSrvr::OnLockItem); #endif // __LOCK_ITEM
Code:
void CDPSrvr::OnDropItem( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
DWORD dwItemType;
DWORD dwItemId;
short nDropNum;
D3DXVECTOR3 vPos;
ar >> dwItemType >> dwItemId >> nDropNum >> vPos;
if( nDropNum <= 0 )
return;
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj(pUser) )
{
#ifdef __LOCK_ITEM
CItemElem* pItemElem = (CItemElem*)pUser->GetItemId(dwItemId);
if (pItemElem && pItemElem->IsFlag(CItemElem::locked))
return;
#endif // __LOCK_ITEM
if( g_eLocal.GetState( EVE_DROPITEMREMOVE ) )
{
#ifndef __LOCK_ITEM
CItemElem* pItemElem = (CItemElem*)pUser->GetItemId( dwItemId );
#endif // __LOCK_ITEM
if( IsUsableItem( pItemElem ) && pUser->IsDropable( pItemElem, FALSE ) )
pUser->RemoveItem( (BYTE)dwItemId, nDropNum );
}
else
{
pUser->DropItem( (DWORD)dwItemId, nDropNum, vPos );
}
}
}
Code:
void CDPSrvr::OnSellItem( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
BYTE nId;
short nNum;
ar >> nId >> nNum;
if( nNum < 1 )
return;
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj( pUser ) && IsValidObj( pUser->m_vtInfo.GetOther() ) )
{
if( pUser->m_vtInfo.GetOther()->IsNPC() == FALSE )
return;
if( !CNpcChecker::GetInstance()->IsCloseNpc( MMI_TRADE, pUser->GetWorld(), pUser->GetPos() ) )
return;
CItemElem* pItemElem = pUser->m_Inventory.GetAtId( nId );
#ifdef __LOCK_ITEM
if (pItemElem && pItemElem->IsFlag(CItemElem::locked))
return;
#endif // __LOCK_ITEM
if( IsUsableItem( pItemElem ) == FALSE )
return;
Code:
void CDPSrvr::OnRemoveInvenItem( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
DWORD dwId;
int nNum;
ar >> dwId;
ar >> nNum;
if( nNum <= 0 )
return;
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj( pUser ) == FALSE )
return;
CItemElem* pItemElem = pUser->m_Inventory.GetAtId( dwId );
#ifdef __LOCK_ITEM
if (pItemElem && pItemElem->IsFlag(CItemElem::locked))
return;
#endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM
void CDPSrvr::OnLockItem(CAr& ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long)
{
CUser* pUser = g_UserMng.GetUser(dpidCache, dpidUser);
if (IsValidObj(pUser))
{
DWORD dwItemId;
ar >> dwItemId;
CItemElem* pItemElem = pUser->m_Inventory.GetAtId(dwItemId);
if (pItemElem)
pUser->LockItem(pItemElem, !pItemElem->IsFlag(CItemElem::locked));
}
}
#endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM void OnLockItem(CAr& ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long); #endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM
BOOL CUser::LockItem(CItemElem* pItemElem, BOOL bLock)
{
if (IsUsableItem(pItemElem) == FALSE)
{
AddDefinedText(TID_GAME_CANNOT_POST);
return FALSE;
}
if (m_Inventory.IsEquip(pItemElem->m_dwObjId))
{
AddDefinedText(TID_GAME_CANNOT_POST);
return FALSE;
}
if (IsUsing(pItemElem))
{
AddDefinedText(TID_GAME_CANNOT_DO_USINGITEM);
return FALSE;
}
if (pItemElem->IsFlag(CItemElem::locked) == bLock)
return FALSE;
pItemElem->SetFlag(CItemElem::locked, bLock);
UpdateItem((BYTE)pItemElem->m_dwObjId, UI_FLAG, MAKELONG(pItemElem->m_dwObjIndex, pItemElem->m_byFlag));
return TRUE;
}
#endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM BOOL LockItem(CItemElem* pItemElem, BOOL bLock = TRUE); #endif // __LOCK_ITEM
Code:
enum
{
expired = 0x01,
binds = 0x02,
isusing = 0x04,
#ifdef __LOCK_ITEM
locked = 0x08
#endif // __LOCK_ITEM
};
Code:
BOOL CWndInventory::OnDropIcon( LPSHORTCUT pShortcut, CPoint point )
{
CWndBase* pWndFrame = pShortcut->m_pFromWnd->GetFrameWnd();
if(pWndFrame == NULL)
return FALSE;
if( g_WndMng.GetWndBase( APP_SHOP_ ) ||
g_WndMng.GetWndBase( APP_BANK ) ||
g_WndMng.GetWndBase( APP_TRADE ) )
{
if( pWndFrame->GetWndId() == APP_INVENTORY )
{
SetForbid( TRUE );
g_WndMng.PutString( prj.GetText(TID_GAME_TRADELIMITUSING), NULL, prj.GetTextColor(TID_GAME_TRADELIMITUSING) );
return FALSE;
}
}
else if( g_WndMng.GetWndBase( APP_REPAIR ) )
{
if( pWndFrame->GetWndId() == APP_INVENTORY )
{
SetForbid( TRUE );
g_WndMng.PutString( prj.GetText(TID_GAME_REPAIR_NOTUSE), NULL, prj.GetTextColor(TID_GAME_TRADELIMITUSING) );
return FALSE;
}
}
else if( g_WndMng.GetWndBase( APP_INVENTORY ) )
{
if( pWndFrame->GetWndId() == APP_INVENTORY )
{
LPWNDCTRL lpWndCtrl1 = GetWndCtrl( WIDC_CUSTOM21 );
if( lpWndCtrl1->rect.PtInRect( point ) )
{
if( pShortcut->m_dwType == ITYPE_ITEM && pShortcut->m_dwData )
{
CItemElem* pItemElem = (CItemElem*)g_pPlayer->GetItemId( pShortcut->m_dwId );
if( !pItemElem )
return FALSE;
if(pItemElem->GetExtra() > 0)
return FALSE;
if( g_pPlayer->m_Inventory.IsEquip( pShortcut->m_dwId ) )
return FALSE;
if( g_pPlayer->IsUsing( pItemElem ) )
return FALSE;
if( pItemElem->IsUndestructable() == TRUE )
{
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
return FALSE;
}
#ifdef __LOCK_ITEM
if (pItemElem->IsFlag(CItemElem::locked))
{
g_WndMng.PutString(prj.GetText(TID_GAME_ERROR_UNDESTRUCTABLE_ITEM), NULL, prj.GetTextColor(TID_GAME_ERROR_UNDESTRUCTABLE_ITEM));
return FALSE;
}
#endif // __LOCK_ITEM
in onDraw function:
Code:
CWndInventory* pWndInventory = (CWndInventory*)GetWndBase( APP_INVENTORY );
if( pWndInventory )
{
if( pWndInventory->m_pUpgradeItem && pItemElem )
{
if( pWndInventory->m_pUpgradeItem == pItemElem )
{
if( pWndInventory->m_dwEnchantWaitTime != 0xffffffff )
{
#if __VER >= 19
CPoint pt((x * 35) + 1, (y * 35) + 3);
#else // __VER >= 19
CPoint pt(x * 32, y * 32);
#endif // __VER >= 19
RenderEnchant( p2DRender, pt );
}
}
}
}
#ifdef __LOCK_ITEM
if (pItemElem->IsFlag(CItemElem::locked))
{
CTexture* pTexture = CWndBase::m_textureMng.AddTexture(g_Neuz.m_pd3dDevice, MakePath(DIR_ICON, "icon_LockItem.dds"), 0xffff00ff);
if (pTexture)
{
#if __VER >= 19
pTexture->Render(p2DRender, CPoint(x * 35, (y * 35) + 4), 255);
#else // __VER >= 19
pTexture->Render(p2DRender, CPoint(x * 32, (y * 32) + 4), 255);
#endif // __VER >= 19
}
}
#endif // __LOCK_ITEM
Code:
void CWndItemCtrl::OnLButtonDblClk( UINT nFlags, CPoint point )
{
if( !g_pPlayer )
return;
if( !m_pItemContainer )
return;
if( GetAsyncKeyState( VK_LCONTROL ) & 0x8000 )
return;
#ifdef __LOCK_ITEM
#if __VER >= 14 // __SMELT_SAFETY
if (!g_WndMng.m_pWndSmeltSafety && GetAsyncKeyState(VK_LSHIFT) & 0x8000)
#else // __SMELT_SAFETY
if (GetAsyncKeyState(VK_LSHIFT) & 0x8000)
#endif // __SMELT_SAFETY
{
CWndBase* pWndBase = this->GetParentWnd();
if (pWndBase)
{
CWndBase* pWndBaseTemp = pWndBase->GetParentWnd();
if (pWndBaseTemp)
{
int nParent = pWndBaseTemp->GetWndId();
if (nParent == APP_INVENTORY)
{
int nItem = HitTest(point);
if (nItem != -1)
{
CItemElem* pItemElem = GetItem(nItem);
if (pItemElem) {
g_DPlay.SendLockItem(pItemElem->m_dwObjId);
}
}
}
}
}
return;
}
#endif // __LOCK_ITEM
Code:
{
LPCTSTR szErr = Error( "CWndShop::OnChildNotify : pItemElem==NULL %d", pItemElem->m_dwItemId );
ADDERRORMSG( szErr );
}
if( FALSE == g_pPlayer->m_Inventory.IsEquip( ( (CItemElem*)lpShortcut->m_dwData)->m_dwObjId ) )
{
#ifdef __LOCK_ITEM
if (pItemElem->IsFlag(CItemElem::locked))
{
g_WndMng.PutString(prj.GetText(TID_GAME_ERROR_UNDESTRUCTABLE_ITEM), NULL, prj.GetTextColor(TID_GAME_ERROR_UNDESTRUCTABLE_ITEM));
return FALSE;
}
#endif // __LOCK_ITEM
if( bWarning )
{
SAFE_DELETE( m_pWndWarning );
SAFE_DELETE( m_pWndConfirmSell );
m_pWndWarning = new CWndWarning;
m_pWndWarning->m_pItemElem = (CItemElem*)lpShortcut->m_dwData;
m_pWndWarning->m_pMover = m_pMover;
m_pWndWarning->Initialize( this, APP_WARNING );
}
Code:
CItemElem* pItemElem = (CItemElem*)pShortcut->m_dwData;
if( pItemElem->IsUndestructable() == TRUE )
{
g_WndMng.PutString( prj.GetText( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ), NULL, prj.GetTextColor( TID_GAME_ERROR_UNDESTRUCTABLE_ITEM ) );
return FALSE;
}
#ifdef __LOCK_ITEM
if (pItemElem->IsFlag(CItemElem::locked))
{
g_WndMng.PutString(prj.GetText(TID_GAME_ERROR_UNDESTRUCTABLE_ITEM), NULL, prj.GetTextColor(TID_GAME_ERROR_UNDESTRUCTABLE_ITEM));
return FALSE;
}
#endif // __LOCK_ITEM
Code:
#ifdef __LOCK_ITEM #define PACKETTYPE_LOCK_ITEM (DWORD)0x88100267 #endif // __LOCK_ITEM






