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