From 032ff7c879e2b80423f21576f508edc8e8753776 Mon Sep 17 00:00:00 2001 From: gugus Date: Mon, 17 Sep 2012 13:36:48 +0200 Subject: [PATCH] Clean-up. There is still a little bug. --- apps/openmw/mwbase/world.hpp | 3 ++ .../mwscript/transformationextensions.cpp | 36 ++++++++++--------- apps/openmw/mwworld/worldimp.cpp | 5 +++ apps/openmw/mwworld/worldimp.hpp | 3 ++ 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index b0ce261f1..ef4e6a5b8 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -187,6 +187,9 @@ namespace MWBase virtual void rotateObject(const MWWorld::Ptr& ptr,float x,float y,float z, bool adjust = false) = 0; + virtual void safePlaceObject(const MWWorld::Ptr& ptr,MWWorld::CellStore &Cell,ESM::Position pos) = 0; + ///< place an object in a "safe" location (ie not in the void, etc). Makes a copy of the Ptr. + virtual void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false) const = 0; ///< Convert cell numbers to position. diff --git a/apps/openmw/mwscript/transformationextensions.cpp b/apps/openmw/mwscript/transformationextensions.cpp index c82108f8b..e40390a63 100644 --- a/apps/openmw/mwscript/transformationextensions.cpp +++ b/apps/openmw/mwscript/transformationextensions.cpp @@ -19,6 +19,7 @@ #include "../mwworld/player.hpp" #include "components\esm\loadcell.hpp" +#include "../mwworld/manualref.hpp" #include "OgreMath.h" namespace MWScript @@ -369,7 +370,7 @@ namespace MWScript pos.rot[0] = pos.rot[1] = 0; pos.rot[2] = zRot; MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPtr(itemID,false); - MWBase::Environment::get().getWorld()->copyObjectToCell(ptr,*store,pos); + MWBase::Environment::get().getWorld()->safePlaceObject(ptr,*store,pos); } else { @@ -412,7 +413,7 @@ namespace MWScript pos.rot[0] = pos.rot[1] = 0; pos.rot[2] = zRot; MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPtr(itemID,false); - MWBase::Environment::get().getWorld()->copyObjectToCell(ptr,*store,pos); + MWBase::Environment::get().getWorld()->safePlaceObject(ptr,*store,pos); } else { @@ -450,13 +451,14 @@ namespace MWScript ipos.pos[0] = pos.x; ipos.pos[1] = pos.y; ipos.pos[2] = pos.z; + ipos.rot[0] = 0; + ipos.rot[1] = 0; + ipos.rot[2] = 0; + MWWorld::CellStore* store = MWBase::Environment::get().getWorld()->getPlayer().getPlayer().getCell(); - MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPtr(itemID,false); - int icount = ptr.getRefData().getCount(); - ptr.getRefData().setCount(count); - MWBase::Environment::get().getWorld()->copyObjectToCell(ptr,*store,ipos); - ptr.getRefData().setCount(icount); - //store->ge + MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(),itemID); + ref.getPtr().getRefData().setCount(count); + MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(),*store,ipos); } }; @@ -491,13 +493,15 @@ namespace MWScript ipos.pos[0] = pos.x; ipos.pos[1] = pos.y; ipos.pos[2] = pos.z; + ipos.rot[0] = 0; + ipos.rot[1] = 0; + ipos.rot[2] = 0; + MWWorld::CellStore* store = me.getCell(); - MWWorld::Ptr ptr = MWBase::Environment::get().getWorld()->getPtr(itemID,false); - int icount = ptr.getRefData().getCount(); - ptr.getRefData().setCount(count); - MWBase::Environment::get().getWorld()->copyObjectToCell(ptr,*store,ipos); - ptr.getRefData().setCount(icount); - //store->ge + MWWorld::ManualRef ref(MWBase::Environment::get().getWorld()->getStore(),itemID); + ref.getPtr().getRefData().setCount(count); + MWBase::Environment::get().getWorld()->safePlaceObject(ref.getPtr(),*store,ipos); + } }; @@ -566,8 +570,8 @@ namespace MWScript interpreter.installSegment5(opcodePlaceItemCell,new OpPlaceItemCell); interpreter.installSegment5(opcodePlaceItem,new OpPlaceItem); interpreter.installSegment5(opcodePlaceAtPc,new OpPlaceAtPc); - interpreter.installSegment5(opcodePlaceAtMe,new OpPlaceAtPc); - interpreter.installSegment5(opcodePlaceAtMeExplicit,new OpPlaceAtPc); + interpreter.installSegment5(opcodePlaceAtMe,new OpPlaceAtMe); + interpreter.installSegment5(opcodePlaceAtMeExplicit,new OpPlaceAtMe); } } } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index d9c4fe321..fb475f361 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -656,6 +656,11 @@ namespace MWWorld } } + void World::safePlaceObject(const MWWorld::Ptr& ptr,MWWorld::CellStore &Cell,ESM::Position pos) + { + copyObjectToCell(ptr,Cell,pos); + } + void World::indexToPosition (int cellX, int cellY, float &x, float &y, bool centre) const { const int cellSize = 8192; diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 4031a180a..acf63b54a 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -214,6 +214,9 @@ namespace MWWorld /// \param adjust indicates rotation should be set or adjusted virtual void rotateObject (const Ptr& ptr,float x,float y,float z, bool adjust = false); + virtual void safePlaceObject(const MWWorld::Ptr& ptr,MWWorld::CellStore &Cell,ESM::Position pos); + ///< place an object in a "safe" location (ie not in the void, etc). Makes a copy of the Ptr. + virtual void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false) const; ///< Convert cell numbers to position.