void RWinColorPalette::OnLButtonDown( UINT nFlags, CPoint pt ) { if (GetFocus() != this) SetFocus(); RIntPoint ptHit = CellFromPoint( pt ); if (ptHit.m_x >= 0 && ptHit.m_y >= 0) { CRect rect( -1, -1, kCellSize.m_dx + 1, kCellSize.m_dy + 1 ); rect.OffsetRect( m_ptSelected.m_x, m_ptSelected.m_y ); InvalidateRect( rect, FALSE ); RIntPoint ptTest( ptHit.m_x + 1, ptHit.m_y + 1 ); m_crSelected = ColorFromPoint( ptTest ); m_ptSelected = ptHit; GetParent()->SendMessage( UM_COLOR_CHANGED, GetDlgCtrlID(), (LPARAM) m_crSelected ) ; CStatic::OnLButtonDown( nFlags, pt ); } }
void COXComboBoxTip::NeedItemTip(LPNEEDITEMTIPINFO pnitInfo) { ASSERT(::IsWindow(m_hWndHooked)); ASSERT(m_hWndHooked==m_pAttachedCtrl->m_hWnd); DWORD dwStyle=m_pAttachedCtrl->GetStyle(); // Make sure that the combo box control has dropdown style if((dwStyle&CBS_DROPDOWNLIST)!=CBS_DROPDOWNLIST) { pnitInfo->result=ID_NIT_WRONGFORMAT; return; } CPoint ptTest(pnitInfo->point); CRect rectItem; m_pAttachedCtrl->GetClientRect(rectItem); rectItem.right-=::GetSystemMetrics(SM_CXVSCROLL); if(!rectItem.PtInRect(ptTest)) { pnitInfo->result=ID_NIT_OUTOFITEMBORDER; return; } CString sText; m_pAttachedCtrl->GetWindowText(sText); if(sText.IsEmpty()) { pnitInfo->result=ID_NIT_NOTHIDDEN; return; } pnitInfo->offset=ID_ITEMTIP_XOFFSET_COMBOBOX; CClientDC dc(m_pAttachedCtrl); CFont* pOldFont=pnitInfo->pFont==NULL ? NULL : dc.SelectObject((CFont*)pnitInfo->pFont); CRect rectText(0, 0, 0, 0); dc.DrawText(sText,&rectText,DT_CALCRECT|DT_LEFT|DT_SINGLELINE); if(pOldFont) { dc.SelectObject(pOldFont); } rectText.InflateRect(pnitInfo->offset,0); if(rectText.Width()<=rectItem.Width() && rectText.Height()<=rectItem.Height()) { pnitInfo->result=ID_NIT_NOTHIDDEN; return; } rectItem.right=rectItem.left+rectText.Width(); rectItem.bottom=rectItem.top+__max(rectText.Height(),rectItem.Height()); pnitInfo->alignment=DT_LEFT; pnitInfo->rectItem.left=rectItem.left; pnitInfo->rectItem.top=rectItem.top; pnitInfo->rectItem.right=rectItem.right; pnitInfo->rectItem.bottom=rectItem.bottom; lstrcpyn(pnitInfo->itemText,sText,pnitInfo->sizeText); if(pnitInfo->clrText==ID_OX_COLOR_NONE) { pnitInfo->clrText=::GetSysColor(COLOR_WINDOWTEXT); } pnitInfo->result=ID_NIT_SUCCESS; }
void COXListBoxTip::NeedItemTip(LPNEEDITEMTIPINFO pnitInfo) { ASSERT(::IsWindow(m_hWndHooked)); ASSERT(m_hWndHooked==m_pAttachedCtrl->m_hWnd); CPoint ptTest(pnitInfo->point); BOOL bOutside=TRUE; int nItemIndex=m_pAttachedCtrl->ItemFromPoint(ptTest,bOutside); if(nItemIndex<0 || nItemIndex>=m_pAttachedCtrl->GetCount() || bOutside) { pnitInfo->result=ID_NIT_OUTOFCONTROLBORDER; return; } CString sText; m_pAttachedCtrl->GetText(nItemIndex,sText); if(sText.IsEmpty()) { pnitInfo->result=ID_NIT_NOTHIDDEN; return; } CRect rectItem; m_pAttachedCtrl->GetItemRect(nItemIndex,rectItem); pnitInfo->offset=ID_ITEMTIP_XOFFSET_LISTBOX; if(!rectItem.PtInRect(ptTest)) { pnitInfo->result=ID_NIT_OUTOFITEMBORDER; return; } pnitInfo->row=nItemIndex; CClientDC dc(m_pAttachedCtrl); CFont* pOldFont=pnitInfo->pFont==NULL ? NULL : dc.SelectObject((CFont*)pnitInfo->pFont); CRect rectText(0, 0, 0, 0); dc.DrawText(sText,&rectText,DT_CALCRECT|DT_LEFT|DT_SINGLELINE); if(pOldFont) { dc.SelectObject(pOldFont); } rectText.InflateRect(pnitInfo->offset,0); if(rectText.Width()<=rectItem.Width() && rectText.Height()<=rectItem.Height()) { pnitInfo->result=ID_NIT_NOTHIDDEN; return; } rectItem.right=rectItem.left+rectText.Width(); rectItem.bottom=rectItem.top+__max(rectText.Height(),rectItem.Height()); pnitInfo->alignment=DT_LEFT; pnitInfo->rectItem.left=rectItem.left; pnitInfo->rectItem.top=rectItem.top; pnitInfo->rectItem.right=rectItem.right; pnitInfo->rectItem.bottom=rectItem.bottom; lstrcpyn(pnitInfo->itemText,sText,pnitInfo->sizeText); BOOL bSelected=(m_pAttachedCtrl->GetSel(pnitInfo->row)!=0); if(pnitInfo->clrText==ID_OX_COLOR_NONE) { pnitInfo->clrText=(bSelected ? ::GetSysColor(COLOR_HIGHLIGHTTEXT) : ::GetSysColor(COLOR_WINDOWTEXT)); } if(pnitInfo->clrBackground==ID_OX_COLOR_NONE) { pnitInfo->clrBackground=(bSelected ? ::GetSysColor(COLOR_HIGHLIGHT) : pnitInfo->clrBackground); } pnitInfo->result=ID_NIT_SUCCESS; }
CPointMap CWorld::FindItemTypeNearby(const CPointMap & pt, IT_TYPE iType, int iDistance, bool bCheckMulti, bool bLimitZ) { ADDTOCALLSTACK("CWorld::FindItemTypeNearby"); // Find the closest item of this type. // This does not mean that i can touch it. // ARGS: // iDistance = 2d distance to search. CPointMap ptFound; int iTestDistance; // Check dynamics first since they are the easiest. CWorldSearch Area( pt, iDistance ); for (;;) { CItem * pItem = Area.GetItem(); if ( pItem == NULL ) break; if ( ! pItem->IsType( iType ) && ! pItem->Item_GetDef()->IsType(iType) ) continue; if ( bLimitZ && ( pItem->GetTopPoint().m_z != pt.m_z )) continue; iTestDistance = pt.GetDist(pItem->GetTopPoint()); if ( iTestDistance > iDistance ) continue; ptFound = pItem->GetTopPoint(); iDistance = iTestDistance; // tighten up the search. if ( ! iDistance ) return( ptFound ); } // Check for appropriate terrain type CRectMap rect; rect.SetRect( pt.m_x - iDistance, pt.m_y - iDistance, pt.m_x + iDistance + 1, pt.m_y + iDistance + 1, pt.m_map); const CUOMapMeter * pMeter = NULL; for (int x = rect.m_left; x < rect.m_right; x++, pMeter = NULL ) { for ( int y = rect.m_top; y < rect.m_bottom; y++, pMeter = NULL ) { CPointMap ptTest(static_cast<WORD>(x), static_cast<WORD>(y), pt.m_z, pt.m_map); pMeter = GetMapMeter(ptTest); if ( !pMeter ) continue; if ( bLimitZ && ( pMeter->m_z != pt.m_z ) ) continue; ptTest.m_z = pMeter->m_z; if ( iType != g_World.GetTerrainItemType( pMeter->m_wTerrainIndex ) ) continue; iTestDistance = pt.GetDist(ptTest); if ( iTestDistance > iDistance ) break; ptFound = ptTest; iDistance = iTestDistance; // tighten up the search. if ( ! iDistance ) return( ptFound ); rect.SetRect( pt.m_x - iDistance, pt.m_y - iDistance, pt.m_x + iDistance + 1, pt.m_y + iDistance + 1, pt.m_map); } } // Check for statics rect.SetRect( pt.m_x - iDistance, pt.m_y - iDistance, pt.m_x + iDistance + 1, pt.m_y + iDistance + 1, pt.m_map); const CGrayMapBlock * pMapBlock = NULL; const CUOStaticItemRec * pStatic = NULL; const CItemBase * pItemDef = NULL; for (int x = rect.m_left; x < rect.m_right; x += UO_BLOCK_SIZE, pMapBlock = NULL ) { for ( int y = rect.m_top; y < rect.m_bottom; y += UO_BLOCK_SIZE, pMapBlock = NULL ) { CPointMap ptTest(static_cast<WORD>(x), static_cast<WORD>(y), pt.m_z, pt.m_map); pMapBlock = GetMapBlock( ptTest ); if ( !pMapBlock ) continue; size_t iQty = pMapBlock->m_Statics.GetStaticQty(); if ( iQty <= 0 ) continue; pStatic = NULL; pItemDef = NULL; for ( size_t i = 0; i < iQty; i++, pStatic = NULL, pItemDef = NULL ) { pStatic = pMapBlock->m_Statics.GetStatic( i ); if ( bLimitZ && ( pStatic->m_z != ptTest.m_z ) ) continue; // inside the range we want ? CPointMap ptStatic( pStatic->m_x+pMapBlock->m_x, pStatic->m_y+pMapBlock->m_y, pStatic->m_z, ptTest.m_map); iTestDistance = pt.GetDist(ptStatic); if ( iTestDistance > iDistance ) continue; ITEMID_TYPE idTile = pStatic->GetDispID(); // Check the script def for the item. pItemDef = CItemBase::FindItemBase( idTile ); if ( pItemDef == NULL ) continue; if ( ! pItemDef->IsType( iType )) continue; ptFound = ptStatic; iDistance = iTestDistance; if ( ! iDistance ) return( ptFound ); rect.SetRect( pt.m_x - iDistance, pt.m_y - iDistance, pt.m_x + iDistance + 1, pt.m_y + iDistance + 1, pt.m_map); } } } // Check for multi components if (bCheckMulti == true) { rect.SetRect( pt.m_x - iDistance, pt.m_y - iDistance, pt.m_x + iDistance + 1, pt.m_y + iDistance + 1, pt.m_map); for (int x = rect.m_left; x < rect.m_right; x++) { for (int y = rect.m_top; y < rect.m_bottom; y++) { CPointMap ptTest(static_cast<WORD>(x), static_cast<WORD>(y), pt.m_z, pt.m_map); CRegionLinks rlinks; size_t iRegionQty = ptTest.GetRegions(REGION_TYPE_MULTI, rlinks); if ( iRegionQty > 0 ) { for (size_t iRegion = 0; iRegion < iRegionQty; iRegion++) { CRegionBase* pRegion = rlinks.GetAt(iRegion); CItem* pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CGrayMulti * pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; int x2 = ptTest.m_x - pItem->GetTopPoint().m_x; int y2 = ptTest.m_y - pItem->GetTopPoint().m_y; size_t iItemQty = pMulti->GetItemCount(); for (size_t iItem = 0; iItem < iItemQty; iItem++) { const CUOMultiItemRec2* pMultiItem = pMulti->GetItem(iItem); ASSERT(pMultiItem); if ( !pMultiItem->m_visible ) continue; if ( pMultiItem->m_dx != x2 || pMultiItem->m_dy != y2 ) continue; if ( bLimitZ && (pMultiItem->m_dz != ptTest.m_z)) continue; iTestDistance = pt.GetDist(ptTest); if (iTestDistance > iDistance) continue; ITEMID_TYPE idTile = pMultiItem->GetDispID(); // Check the script def for the item. pItemDef = CItemBase::FindItemBase(idTile); if (pItemDef == NULL || !pItemDef->IsType(iType)) continue; ptFound = ptTest; iDistance = iTestDistance; if ( !iDistance ) return( ptFound ); rect.SetRect( pt.m_x - iDistance, pt.m_y - iDistance, pt.m_x + iDistance + 1, pt.m_y + iDistance + 1, pt.m_map); } } } } } } return ptFound; }
static void test_CPoint() { CPoint empty; ok(empty.x == 0, "Expected x to be 0, was %ld\n", empty.x); ok(empty.y == 0, "Expected y to be 0, was %ld\n", empty.y); CPoint ptTopLeft(0, 0); POINT ptHere; ptHere.x = 35; ptHere.y = 95; CPoint ptMFCHere(ptHere); SIZE sHowBig; sHowBig.cx = 300; sHowBig.cy = 10; CPoint ptMFCBig(sHowBig); DWORD dwSize; dwSize = MAKELONG(35, 95); CPoint ptFromDouble(dwSize); ok_point(ptFromDouble, ptMFCHere); CPoint ptStart(100, 100); ptStart.Offset(35, 35); CPoint ptResult(135, 135); ok_point(ptStart, ptResult); ptStart = CPoint(100, 100); POINT pt; pt.x = 35; pt.y = 35; ptStart.Offset(pt); ok_point(ptStart, ptResult); ptStart = CPoint(100, 100); SIZE size; size.cx = 35; size.cy = 35; ptStart.Offset(size); ok_point(ptStart, ptResult); CPoint ptFirst(256, 128); CPoint ptTest(256, 128); ok_point(ptFirst, ptTest); pt.x = 256; pt.y = 128; ok_point(ptTest, pt); ptTest = CPoint(111, 333); nok_point(ptFirst, ptTest); pt.x = 333; pt.y = 111; nok_point(ptTest, pt); ptStart = CPoint(100, 100); CSize szOffset(35, 35); ptStart += szOffset; ok_point(ptResult, ptStart); ptStart = CPoint(100, 100); ptStart += size; ok_point(ptResult, ptStart); ptStart = CPoint(100, 100); ptStart -= szOffset; ptResult = CPoint(65, 65); ok_point(ptResult, ptStart); ptStart = CPoint(100, 100); ptStart -= size; ok_point(ptResult, ptStart); ptStart = CPoint(100, 100); CPoint ptEnd; ptEnd = ptStart + szOffset; ptResult = CPoint(135, 135); ok_point(ptResult, ptEnd); ptEnd = ptStart + size; ok_point(ptResult, ptEnd); ptEnd = ptStart + pt; ptResult = CPoint(433, 211); ok_point(ptResult, ptEnd); ptEnd = ptStart - szOffset; ptResult = CPoint(65, 65); ok_point(ptResult, ptEnd); ptEnd = ptStart - size; ok_point(ptResult, ptEnd); szOffset = ptStart - pt; CSize expected(-233, -11); ok_size(szOffset, expected); ptStart += pt; ptResult = CPoint(433, 211); ok_point(ptResult, ptStart); ptStart -= pt; ptResult = CPoint(100, 100); ok_point(ptResult, ptStart); ptTest = CPoint(35, 35); ptTest = -ptTest; CPoint ptNeg(-35, -35); ok_point(ptTest, ptNeg); RECT rc = { 1, 2, 3, 4 }; CRect rcres = ptStart + &rc; CRect rcexp(101, 102, 103, 104); ok_rect(rcexp, rcres); rcres = ptStart - &rc; rcexp = CRect(-99, -98, -97, -96); ok_rect(rcexp, rcres); }
bool CPointBase::r_WriteVal( LPCTSTR pszKey, CGString & sVal ) const { ADDTOCALLSTACK("CPointBase::r_WriteVal"); if ( !strnicmp( pszKey, "STATICS", 7 ) ) { pszKey += 7; const CGrayMapBlock * pBlock = g_World.GetMapBlock( *(this) ); if ( !pBlock ) return false; if ( *pszKey == '\0' ) { int iStaticQty = 0; for ( size_t i = 0; i < pBlock->m_Statics.GetStaticQty(); i++ ) { const CUOStaticItemRec * pStatic = pBlock->m_Statics.GetStatic( i ); CPointMap ptTest( pStatic->m_x+pBlock->m_x, pStatic->m_y+pBlock->m_y, pStatic->m_z, this->m_map ); if ( this->GetDist( ptTest ) > 0 ) continue; iStaticQty++; } sVal.FormatVal( iStaticQty ); return true; } SKIP_SEPARATORS( pszKey ); const CUOStaticItemRec * pStatic = NULL; int iStatic = 0; int type = 0; if ( !strnicmp( pszKey, "FINDID", 6 ) ) { pszKey += 6; SKIP_SEPARATORS( pszKey ); iStatic = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iStatic ); if ( type == 0 ) type = RES_ITEMDEF; SKIP_SEPARATORS( pszKey ); } else { iStatic = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iStatic ); } if ( type == RES_ITEMDEF ) { const CItemBase * pItemDef = CItemBase::FindItemBase(static_cast<ITEMID_TYPE>(RES_GET_INDEX(iStatic))); if ( !pItemDef ) { sVal.FormatVal( 0 ); return false; } for ( size_t i = 0; i < pBlock->m_Statics.GetStaticQty(); pStatic = NULL, i++ ) { pStatic = pBlock->m_Statics.GetStatic( i ); CPointMap ptTest( pStatic->m_x+pBlock->m_x, pStatic->m_y+pBlock->m_y, pStatic->m_z, this->m_map); if ( this->GetDist( ptTest ) > 0 ) continue; if ( pStatic->GetDispID() == pItemDef->GetDispID() ) break; } } else { for ( size_t i = 0; i < pBlock->m_Statics.GetStaticQty(); pStatic = NULL, i++ ) { pStatic = pBlock->m_Statics.GetStatic( i ); CPointMap ptTest( pStatic->m_x+pBlock->m_x, pStatic->m_y+pBlock->m_y, pStatic->m_z, this->m_map); if ( this->GetDist( ptTest ) > 0 ) continue; if ( iStatic == 0 ) break; iStatic--; } } if ( !pStatic ) { sVal.FormatHex(0); return true; } SKIP_SEPARATORS( pszKey ); if ( !*pszKey ) pszKey = "ID"; ITEMID_TYPE idTile = pStatic->GetDispID(); if ( !strnicmp( pszKey, "COLOR", 5 ) ) { sVal.FormatHex( pStatic->m_wHue ); return true; } else if ( !strnicmp( pszKey, "ID", 2 ) ) { sVal.FormatHex( idTile ); return true; } else if ( !strnicmp( pszKey, "Z", 1 ) ) { sVal.FormatVal( pStatic->m_z ); return true; } // Check the script def for the item. CItemBase * pItemDef = CItemBase::FindItemBase( idTile ); if ( pItemDef == NULL ) { DEBUG_ERR(("Must have ITEMDEF section for item ID 0%x\n", idTile )); return false; } return pItemDef->r_WriteVal( pszKey, sVal, &g_Serv ); } else if ( !strnicmp( pszKey, "COMPONENTS", 10) ) { pszKey += 10; CRegionLinks rlinks; const CRegionBase* pRegion = NULL; CItem* pItem = NULL; const CGrayMulti* pMulti = NULL; const CUOMultiItemRec2* pMultiItem = NULL; size_t iMultiQty = GetRegions(REGION_TYPE_MULTI, rlinks); if ( *pszKey == '\0' ) { int iComponentQty = 0; for (size_t i = 0; i < iMultiQty; i++) { pRegion = rlinks.GetAt(i); if (pRegion == NULL) continue; pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CPointMap ptMulti = pItem->GetTopPoint(); pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; size_t iQty = pMulti->GetItemCount(); for (size_t ii = 0; ii < iQty; ii++) { pMultiItem = pMulti->GetItem(ii); if (pMultiItem == NULL) break; if (pMultiItem->m_visible == 0) continue; CPointMap ptTest(static_cast<WORD>(ptMulti.m_x + pMultiItem->m_dx), static_cast<WORD>(ptMulti.m_y + pMultiItem->m_dy), static_cast<signed char>(ptMulti.m_z + pMultiItem->m_dz), this->m_map); if (GetDist(ptTest) > 0) continue; iComponentQty++; } } sVal.FormatVal( iComponentQty ); return true; } SKIP_SEPARATORS( pszKey ); int iComponent = 0; int type = 0; if ( strnicmp( pszKey, "FINDID", 6 ) == 0 ) { pszKey += 6; SKIP_SEPARATORS( pszKey ); iComponent = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iComponent ); if ( type == 0 ) type = RES_ITEMDEF; SKIP_SEPARATORS( pszKey ); } else { iComponent = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iComponent ); } if ( type == RES_ITEMDEF ) { const CItemBase * pItemDef = CItemBase::FindItemBase(static_cast<ITEMID_TYPE>(RES_GET_INDEX(iComponent))); if ( pItemDef == NULL ) { sVal.FormatVal( 0 ); return false; } for (size_t i = 0; i < iMultiQty; i++) { pRegion = rlinks.GetAt(i); if (pRegion == NULL) continue; pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CPointMap ptMulti = pItem->GetTopPoint(); pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; size_t iQty = pMulti->GetItemCount(); for (size_t ii = 0; ii < iQty; pMultiItem = NULL, ii++) { pMultiItem = pMulti->GetItem(ii); if (pMultiItem == NULL) break; if (pMultiItem->m_visible == 0) continue; CPointMap ptTest(static_cast<WORD>(ptMulti.m_x + pMultiItem->m_dx), static_cast<WORD>(ptMulti.m_y + pMultiItem->m_dy), static_cast<signed char>(ptMulti.m_z + pMultiItem->m_dz), this->m_map); if (GetDist(ptTest) > 0) continue; const CItemBase* pMultiItemDef = CItemBase::FindItemBase(pMultiItem->GetDispID()); if (pMultiItemDef != NULL && pMultiItemDef->GetDispID() == pItemDef->GetDispID()) break; } if (pMultiItem != NULL) break; } } else { for (size_t i = 0; i < iMultiQty; i++) { pRegion = rlinks.GetAt(i); if (pRegion == NULL) continue; pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CPointMap ptMulti = pItem->GetTopPoint(); pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; size_t iQty = pMulti->GetItemCount(); for (size_t ii = 0; ii < iQty; pMultiItem = NULL, ii++) { pMultiItem = pMulti->GetItem(ii); if (pMultiItem == NULL) break; if (pMultiItem->m_visible == 0) continue; CPointMap ptTest(static_cast<WORD>(ptMulti.m_x + pMultiItem->m_dx), static_cast<WORD>(ptMulti.m_y + pMultiItem->m_dy), static_cast<signed char>(ptMulti.m_z + pMultiItem->m_dz), this->m_map); if (GetDist(ptTest) > 0) continue; if (iComponent == 0) break; iComponent--; } if (pMultiItem != NULL) break; } } if ( pMultiItem == NULL ) { sVal.FormatHex(0); return true; } SKIP_SEPARATORS( pszKey ); if ( !*pszKey ) pszKey = "ID"; ITEMID_TYPE idTile = pMultiItem->GetDispID(); if ( strnicmp( pszKey, "ID", 2 ) == 0 ) { sVal.FormatHex( idTile ); return true; } else if ( strnicmp( pszKey, "MULTI", 5 ) == 0 ) { pszKey += 5; if (*pszKey != '\0') { SKIP_SEPARATORS(pszKey); return pItem->r_WriteVal( pszKey, sVal, &g_Serv ); } sVal.FormatHex( pItem->GetUID() ); return true; } else if ( strnicmp( pszKey, "Z", 1 ) == 0 ) { sVal.FormatVal( pItem->GetTopZ() + pMultiItem->m_dz ); return true; } // Check the script def for the item. CItemBase * pItemDef = CItemBase::FindItemBase( idTile ); if ( pItemDef == NULL ) { DEBUG_ERR(("Must have ITEMDEF section for item ID 0%x\n", idTile )); return false; } return pItemDef->r_WriteVal( pszKey, sVal, &g_Serv ); } int index = FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys)-1 ); if ( index < 0 ) return false; switch ( index ) { case PT_M: case PT_MAP: sVal.FormatVal(m_map); break; case PT_X: sVal.FormatVal(m_x); break; case PT_Y: sVal.FormatVal(m_y); break; case PT_Z: sVal.FormatVal(m_z); break; case PT_ISNEARTYPE: { pszKey += 10; SKIP_SEPARATORS( pszKey ); SKIP_ARGSEP( pszKey ); int iType = g_Cfg.ResourceGetIndexType( RES_TYPEDEF, pszKey ); int iDistance = 0; bool bCheckMulti = false; SKIP_IDENTIFIERSTRING( pszKey ); SKIP_SEPARATORS( pszKey ); SKIP_ARGSEP( pszKey ); if ( *pszKey ) iDistance = Exp_GetVal(pszKey); if ( *pszKey ) bCheckMulti = Exp_GetVal(pszKey) != 0; sVal.FormatVal( g_World.IsItemTypeNear(*this, static_cast<IT_TYPE>(iType), iDistance, bCheckMulti)); break; } case PT_REGION: { // Check that the syntax is correct. if ( pszKey[6] && pszKey[6] != '.' ) return false; CRegionWorld * pRegionTemp = dynamic_cast <CRegionWorld*>(this->GetRegion(REGION_TYPE_AREA | REGION_TYPE_MULTI)); if ( !pszKey[6] ) { // We're just checking if the reference is valid. sVal.FormatVal( pRegionTemp? 1:0 ); return true; } // We're trying to retrieve a property from the region. pszKey += 7; if ( pRegionTemp ) return pRegionTemp->r_WriteVal( pszKey, sVal, &g_Serv ); return false; } case PT_ROOM: { if ( pszKey[4] && pszKey[4] != '.' ) return false; CRegionBase * pRegionTemp = this->GetRegion( REGION_TYPE_ROOM ); if ( !pszKey[4] ) { sVal.FormatVal( pRegionTemp? 1:0 ); return true; } pszKey += 5; if ( pRegionTemp ) return pRegionTemp->r_WriteVal( pszKey, sVal, &g_Serv ); return false; } case PT_SECTOR: { if ( pszKey[6] == '.' ) { pszKey += 7; CSector * pSectorTemp = this->GetSector(); if (pSectorTemp) return pSectorTemp->r_WriteVal(pszKey, sVal, &g_Serv); } return false; } default: { const CUOMapMeter * pMeter = g_World.GetMapMeter(*this); if ( pMeter ) { switch( index ) { case PT_TYPE: { CItemTypeDef * pTypeDef = g_World.GetTerrainItemTypeDef( pMeter->m_wTerrainIndex ); if ( pTypeDef != NULL ) sVal = pTypeDef->GetResourceName(); else sVal = ""; } return true; case PT_TERRAIN: { pszKey += strlen(sm_szLoadKeys[index]); if ( *pszKey == '.' ) // do we have an argument? { SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "Z", 1 )) { sVal.FormatVal( pMeter->m_z ); return( true ); } return( false ); } else { sVal.FormatHex( pMeter->m_wTerrainIndex ); } } return true; } } return false; } } return true; }