mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-22 13:23:55 +00:00
parent
d36d6aacf4
commit
b760225179
3 changed files with 126 additions and 113 deletions
|
@ -121,111 +121,4 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \todo this whole code needs major clean up
|
|
||||||
void CellStore::insertObject(const Ptr &ptr)
|
|
||||||
{
|
|
||||||
std::string type = ptr.getTypeName();
|
|
||||||
|
|
||||||
MWWorld::Ptr newPtr;
|
|
||||||
|
|
||||||
// insert into the correct CellRefList
|
|
||||||
if (type == typeid(ESM::Potion).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Potion>* ref = ptr.get<ESM::Potion>();
|
|
||||||
newPtr = MWWorld::Ptr(&potions.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Apparatus).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Apparatus>* ref = ptr.get<ESM::Apparatus>();
|
|
||||||
newPtr = MWWorld::Ptr(&appas.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Armor).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Armor>* ref = ptr.get<ESM::Armor>();
|
|
||||||
newPtr = MWWorld::Ptr(&armors.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Book).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Book>* ref = ptr.get<ESM::Book>();
|
|
||||||
newPtr = MWWorld::Ptr(&books.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Clothing).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Clothing>* ref = ptr.get<ESM::Clothing>();
|
|
||||||
newPtr = MWWorld::Ptr(&clothes.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Ingredient).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Ingredient>* ref = ptr.get<ESM::Ingredient>();
|
|
||||||
newPtr = MWWorld::Ptr(&ingreds.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Light).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Light>* ref = ptr.get<ESM::Light>();
|
|
||||||
newPtr = MWWorld::Ptr(&lights.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Tool).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Tool>* ref = ptr.get<ESM::Tool>();
|
|
||||||
newPtr = MWWorld::Ptr(&lockpicks.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Repair).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Repair>* ref = ptr.get<ESM::Repair>();
|
|
||||||
newPtr = MWWorld::Ptr(&repairs.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Probe).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Probe>* ref = ptr.get<ESM::Probe>();
|
|
||||||
newPtr = MWWorld::Ptr(&probes.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Weapon).name())
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Weapon>* ref = ptr.get<ESM::Weapon>();
|
|
||||||
newPtr = MWWorld::Ptr(&weapons.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
else if (type == typeid(ESM::Miscellaneous).name())
|
|
||||||
{
|
|
||||||
|
|
||||||
// if this is gold, we need to fetch the correct mesh depending on the amount of gold.
|
|
||||||
if (MWWorld::Class::get(ptr).getName(ptr) == MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sGold")->str)
|
|
||||||
{
|
|
||||||
int goldAmount = ptr.getRefData().getCount();
|
|
||||||
|
|
||||||
std::string base = "Gold_001";
|
|
||||||
if (goldAmount >= 100)
|
|
||||||
base = "Gold_100";
|
|
||||||
else if (goldAmount >= 25)
|
|
||||||
base = "Gold_025";
|
|
||||||
else if (goldAmount >= 10)
|
|
||||||
base = "Gold_010";
|
|
||||||
else if (goldAmount >= 5)
|
|
||||||
base = "Gold_005";
|
|
||||||
|
|
||||||
MWWorld::ManualRef newRef (MWBase::Environment::get().getWorld()->getStore(), base);
|
|
||||||
|
|
||||||
MWWorld::LiveCellRef<ESM::Miscellaneous>* ref =
|
|
||||||
newRef.getPtr().get<ESM::Miscellaneous>();
|
|
||||||
|
|
||||||
newPtr = MWWorld::Ptr(&miscItems.insert(*ref), cell);
|
|
||||||
|
|
||||||
ESM::Position& p = newPtr.getRefData().getPosition();
|
|
||||||
p.pos[0] = ptr.getRefData().getPosition().pos[0];
|
|
||||||
p.pos[1] = ptr.getRefData().getPosition().pos[1];
|
|
||||||
p.pos[2] = ptr.getRefData().getPosition().pos[2];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::Miscellaneous>* ref = ptr.get<ESM::Miscellaneous>();
|
|
||||||
newPtr = MWWorld::Ptr(&miscItems.insert(*ref), cell);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error("Trying to insert object of unhandled type");
|
|
||||||
|
|
||||||
newPtr.getRefData().setCount(ptr.getRefData().getCount());
|
|
||||||
ptr.getRefData().setCount(0);
|
|
||||||
newPtr.getRefData().enable();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "refdata.hpp"
|
#include "refdata.hpp"
|
||||||
#include "ptr.hpp"
|
|
||||||
|
|
||||||
namespace ESMS
|
namespace ESMS
|
||||||
{
|
{
|
||||||
|
@ -64,11 +63,6 @@ namespace MWWorld
|
||||||
list.push_back(LiveRef(ref, obj));
|
list.push_back(LiveRef(ref, obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
const LiveRef &insert(LiveRef &item) {
|
|
||||||
list.push_back(item);
|
|
||||||
return list.back();
|
|
||||||
}
|
|
||||||
|
|
||||||
LiveRef *find (const std::string& name)
|
LiveRef *find (const std::string& name)
|
||||||
{
|
{
|
||||||
for (typename std::list<LiveRef>::iterator iter (list.begin()); iter!=list.end(); ++iter)
|
for (typename std::list<LiveRef>::iterator iter (list.begin()); iter!=list.end(); ++iter)
|
||||||
|
|
|
@ -335,6 +335,132 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// \todo this whole code needs major clean up, and doesn't belong in this class.
|
||||||
|
void Scene::insertObject (const Ptr& ptr, CellStore* cell)
|
||||||
|
{
|
||||||
|
std::string type = ptr.getTypeName();
|
||||||
|
|
||||||
|
MWWorld::Ptr newPtr;
|
||||||
|
|
||||||
|
// insert into the correct CellRefList
|
||||||
|
if (type == typeid(ESM::Potion).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Potion>* ref = ptr.get<ESM::Potion>();
|
||||||
|
cell->potions.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->potions.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Apparatus).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Apparatus>* ref = ptr.get<ESM::Apparatus>();
|
||||||
|
cell->appas.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->appas.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Armor).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Armor>* ref = ptr.get<ESM::Armor>();
|
||||||
|
cell->armors.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->armors.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Book).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Book>* ref = ptr.get<ESM::Book>();
|
||||||
|
cell->books.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->books.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Clothing).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Clothing>* ref = ptr.get<ESM::Clothing>();
|
||||||
|
cell->clothes.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->clothes.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Ingredient).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Ingredient>* ref = ptr.get<ESM::Ingredient>();
|
||||||
|
cell->ingreds.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->ingreds.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Light).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Light>* ref = ptr.get<ESM::Light>();
|
||||||
|
cell->lights.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->lights.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Tool).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Tool>* ref = ptr.get<ESM::Tool>();
|
||||||
|
cell->lockpicks.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->lockpicks.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Repair).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Repair>* ref = ptr.get<ESM::Repair>();
|
||||||
|
cell->repairs.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->repairs.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Probe).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Probe>* ref = ptr.get<ESM::Probe>();
|
||||||
|
cell->probes.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->probes.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Weapon).name())
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Weapon>* ref = ptr.get<ESM::Weapon>();
|
||||||
|
cell->weapons.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->weapons.list.back(), cell);
|
||||||
|
}
|
||||||
|
else if (type == typeid(ESM::Miscellaneous).name())
|
||||||
|
{
|
||||||
|
|
||||||
|
// if this is gold, we need to fetch the correct mesh depending on the amount of gold.
|
||||||
|
if (MWWorld::Class::get(ptr).getName(ptr) == MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sGold")->str)
|
||||||
|
{
|
||||||
|
int goldAmount = ptr.getRefData().getCount();
|
||||||
|
|
||||||
|
std::string base = "Gold_001";
|
||||||
|
if (goldAmount >= 100)
|
||||||
|
base = "Gold_100";
|
||||||
|
else if (goldAmount >= 25)
|
||||||
|
base = "Gold_025";
|
||||||
|
else if (goldAmount >= 10)
|
||||||
|
base = "Gold_010";
|
||||||
|
else if (goldAmount >= 5)
|
||||||
|
base = "Gold_005";
|
||||||
|
|
||||||
|
MWWorld::ManualRef newRef (MWBase::Environment::get().getWorld()->getStore(), base);
|
||||||
|
|
||||||
|
MWWorld::LiveCellRef<ESM::Miscellaneous>* ref = newRef.getPtr().get<ESM::Miscellaneous>();
|
||||||
|
|
||||||
|
cell->miscItems.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->miscItems.list.back(), cell);
|
||||||
|
|
||||||
|
ESM::Position& p = newPtr.getRefData().getPosition();
|
||||||
|
p.pos[0] = ptr.getRefData().getPosition().pos[0];
|
||||||
|
p.pos[1] = ptr.getRefData().getPosition().pos[1];
|
||||||
|
p.pos[2] = ptr.getRefData().getPosition().pos[2];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MWWorld::LiveCellRef<ESM::Miscellaneous>* ref = ptr.get<ESM::Miscellaneous>();
|
||||||
|
|
||||||
|
cell->miscItems.list.push_back( *ref );
|
||||||
|
newPtr = MWWorld::Ptr(&cell->miscItems.list.back(), cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("Trying to insert object of unhandled type");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
newPtr.getRefData().setCount(ptr.getRefData().getCount());
|
||||||
|
ptr.getRefData().setCount(0);
|
||||||
|
newPtr.getRefData().enable();
|
||||||
|
|
||||||
|
mRendering.addObject(newPtr);
|
||||||
|
MWWorld::Class::get(newPtr).insertObject(newPtr, *mPhysics);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void Scene::addObjectToScene (const Ptr& ptr)
|
void Scene::addObjectToScene (const Ptr& ptr)
|
||||||
{
|
{
|
||||||
mRendering.addObject (ptr);
|
mRendering.addObject (ptr);
|
||||||
|
|
Loading…
Reference in a new issue