void CItemSpawn::GenerateItem(CResourceDef *pDef) { ADDTOCALLSTACK("CitemSpawn:GenerateItem"); RESOURCE_ID_BASE rid = pDef->GetResourceID(); ITEMID_TYPE id = static_cast<ITEMID_TYPE>(rid.GetResIndex()); CItemContainer *pCont = dynamic_cast<CItemContainer *>(GetParent()); BYTE iCount = pCont ? static_cast<unsigned char>(pCont->ContentCount(rid)) : GetCount(); if ( iCount >= GetAmount() ) return; CItem *pItem = CreateTemplate(id); if ( pItem == NULL ) return; WORD iAmountPile = static_cast<WORD>(minimum(USHRT_MAX,m_itSpawnItem.m_pile)); if ( iAmountPile > 1 ) { CItemBase *pItemDef = pItem->Item_GetDef(); ASSERT(pItemDef); if ( pItemDef->IsStackableType() ) pItem->SetAmount(Calc_GetRandVal(iAmountPile) + 1); } pItem->SetAttr(m_Attr & (ATTR_OWNED | ATTR_MOVE_ALWAYS)); pItem->SetDecayTime(g_Cfg.m_iDecay_Item); // it will decay eventually to be replaced later pItem->MoveNearObj(this, m_itSpawnItem.m_DistMax); AddObj(pItem->GetUID()); }
ObjectDescriptor * ObjectMgr::QueryTemplate(IKernel * kernel, const char * name) { auto itr = _models.find(name); if (itr != _models.end()) return itr->second; return CreateTemplate(kernel, name); }
int DoCompiling(const char *pFileName) { int nRet; char szPath[_MAX_PATH]; FILE *pFile, *pOrigFile; PSTATEDESC pOrigState; ObjectType origObject; PVOID pvTokenContext, pvErrorContext; if (!s_pContext->m_pLube) { s_pContext->m_pLube = CreateLube(); if (!s_pContext->m_pLube) { ErrorReport(Lube_E_OutOfMemory); return LUBE_FAIL; } } nRet = CreateTemplate(s_pContext->m_pLube, pFileName); if (nRet < 0) { ErrorReport(Lube_E_OutOfMemory); return nRet; } if (SearchFileFromPath(s_szCurrentPath, pFileName, szPath) < 0) { if (SearchFileFromPath(s_pszSourceDirList, pFileName, szPath) < 0) { ErrorReport(Lube_E_OpenFile, pFileName); return LUBE_FAIL; } } pFileName = szPath; CurrentTemplatePath(szPath, s_szCurrentPath); pFile = fopen(pFileName, "rt"); if (!pFile) { ErrorReport(Lube_E_OpenFile, pFileName); return LUBE_FAIL; } pvTokenContext = SaveTokenContext(); pvErrorContext = SaveErrorContext(); pOrigState = s_pContext->m_pCurrentState; origObject = s_pContext->m_curObject; pOrigFile = s_pContext->m_pFile; TokenInit(); ErrorReporterInit(pFileName); s_pContext->m_pCurrentState = \ &s_pContext->m_pLube->ppTemplates[nRet]->tRoot; s_pContext->m_pFile = pFile; P_Lube(); s_pContext->m_pFile = pOrigFile; s_pContext->m_curObject = origObject; s_pContext->m_pCurrentState = pOrigState; RestoreErrorContext(pvErrorContext); RestoreTokenContext(pvTokenContext); fclose(pFile); return nRet; }
bool CItemMulti::Multi_CreateComponent( ITEMID_TYPE id, int dx, int dy, int dz, DWORD dwKeyCode ) { CItem * pItem = CreateTemplate( id ); ASSERT(pItem); CPointMap pt = GetTopPoint(); pt.m_x += dx; pt.m_y += dy; pt.m_z += dz; bool fNeedKey = false; switch ( pItem->GetType() ) { case IT_KEY: // it will get locked down with the house ? case IT_SIGN_GUMP: case IT_SHIP_TILLER: pItem->m_itKey.m_lockUID.SetPrivateUID( dwKeyCode ); // Set the key id for the key/sign. fNeedKey = true; break; case IT_DOOR: pItem->SetType(IT_DOOR_LOCKED); fNeedKey = true; break; case IT_CONTAINER: pItem->SetType(IT_CONTAINER_LOCKED); fNeedKey = true; break; case IT_SHIP_SIDE: pItem->SetType(IT_SHIP_SIDE_LOCKED); break; case IT_SHIP_HOLD: pItem->SetType(IT_SHIP_HOLD_LOCK); break; } pItem->SetAttr( ATTR_MOVE_NEVER | (m_Attr&(ATTR_MAGIC|ATTR_INVIS))); pItem->SetHue( GetHue()); pItem->m_uidLink = GetUID(); // lock it down with the structure. if ( pItem->IsTypeLockable() || pItem->IsTypeLocked()) { pItem->m_itContainer.m_lockUID.SetPrivateUID( dwKeyCode ); // Set the key id for the door/key/sign. pItem->m_itContainer.m_lock_complexity = 10000; // never pickable. } pItem->MoveTo( pt ); return( fNeedKey ); }
bool ObjectMgr::Initialize(IKernel * kernel) { _kernel = kernel; _nextTypeId = 1; char path[512] = { 0 }; SafeSprintf(path, sizeof(path), "%s/config/object.xml", tools::GetAppPath()); olib::XmlReader conf; if (!conf.LoadXml(path)) { OASSERT(false, "load object.xml failed"); return false; } if (conf.Root().IsExist("prop")) { const olib::IXmlObject& props = conf.Root()["prop"]; for (s32 i = 0; i < props.Count(); ++i) _defines[props[i].GetAttributeString("name")] = (1 << i); } if (conf.Root().IsExist("table")) { const olib::IXmlObject& tables = conf.Root()["table"]; for (s32 i = 0; i < tables.Count(); ++i) { TableDescriptor * tableModel = NEW TableDescriptor(); const char * name = tables[i].GetAttributeString("name"); if (!tableModel->LoadFrom(tables[i])) return false; _tableModels[tools::CalcStringUniqueId(name)] = tableModel; } } SafeSprintf(path, sizeof(path), "%s/config/dccenter/", tools::GetAppPath()); tools::ListFileInDirection(path, ".xml", [this](const char * name, const char * path) { if (_namePathMap.end() != _namePathMap.find(name)) { OASSERT(false, "prop xml name repeated"); return; } _namePathMap.insert(std::make_pair(name, path)); }); for (auto itr = _namePathMap.begin(); itr != _namePathMap.end(); ++itr) CreateTemplate(kernel, itr->first.GetString()); return true; }
void CItemSpawn::GenerateItem(CResourceDef * pDef) { ADDTOCALLSTACK("CitemSpawn:GenerateItem"); RESOURCE_ID_BASE rid = pDef->GetResourceID(); ITEMID_TYPE id = static_cast<ITEMID_TYPE>(rid.GetResIndex()); int iDistMax = m_itSpawnItem.m_DistMax; int iAmountPile = m_itSpawnItem.m_pile; int iCount = 0; CItemContainer * pCont = dynamic_cast <CItemContainer *>( GetParent()); if ( pCont != NULL ) iCount = pCont->ContentCount( rid ); else iCount = GetCount(); if ( iCount >= GetAmount()) return; CItem * pItem = CreateTemplate( id ); if ( pItem == NULL ) return; pItem->SetAttr( m_Attr & ( ATTR_OWNED | ATTR_MOVE_ALWAYS )); if ( iAmountPile > 1 ) { CItemBase * pItemDef = pItem->Item_GetDef(); ASSERT(pItemDef); if ( pItemDef->IsStackableType()) { if ( iAmountPile == 0 || iAmountPile > GetAmount()) iAmountPile = GetAmount(); pItem->SetAmount( Calc_GetRandVal(iAmountPile) + 1 ); } } pItem->SetDecayTime( g_Cfg.m_iDecay_Item ); // It will decay eventually to be replaced later. pItem->MoveNearObj( this, iDistMax ); AddObj(pItem->GetUID()); pItem->m_uidSpawnItem = GetUID(); }
BOOL CSTWSelectTmplPage::OnWizardFinish() { CreateTemplate (); return CPropertyPage::OnWizardFinish(); }
LRESULT CSTWSelectTmplPage::OnWizardNext() { if (!CreateTemplate ()) return -1; return CPropertyPage::OnWizardNext(); }
void CItem::Spawn_GenerateItem( CResourceDef * pDef ) { // Count how many items are here already. // This could be in a container. RESOURCE_ID_BASE rid = pDef->GetResourceID(); ITEMID_TYPE id = (ITEMID_TYPE) rid.GetResIndex(); int iDistMax = m_itSpawnItem.m_DistMax; int iAmountPile = m_itSpawnItem.m_pile; int iCount = 0; CItemContainer * pCont = dynamic_cast <CItemContainer *>( GetParent()); if ( pCont != NULL ) { iCount = pCont->ContentCount( rid ); } else { // If is equipped this will produce the item where you are standing. CPointMap pt = GetTopLevelObj()->GetTopPoint(); CWorldSearch AreaItems( pt, iDistMax ); while (true) { CItem * pItem = AreaItems.GetItem(); if ( pItem == NULL ) break; if ( pItem->IsType(IT_SPAWN_ITEM)) continue; if ( pItem->IsAttr( ATTR_INVIS )) continue; if ( pItem->GetID() != id ) continue; // if ( pItem->m_uidLink != GetUID()) continue; iCount += pItem->GetAmount(); } } if ( iCount >= GetAmount()) return; CItem * pItem = CreateTemplate( id ); if ( pItem == NULL ) return; pItem->SetAttr( m_Attr & ( ATTR_OWNED | ATTR_MOVE_ALWAYS )); if ( iAmountPile > 1 ) { CItemBase * pItemDef = pItem->Item_GetDef(); ASSERT(pItemDef); if ( pItemDef->IsStackableType()) { if ( iAmountPile == 0 || iAmountPile > GetAmount()) iAmountPile = GetAmount(); pItem->SetAmount( Calc_GetRandVal(iAmountPile) + 1 ); } } // pItem->m_uidLink = GetUID(); // This might be dangerous ? pItem->SetDecayTime( g_Cfg.m_iDecay_Item ); // It will decay eventually to be replaced later. pItem->MoveNearObj( this, iDistMax ); }