Huge engine change, replace all std::shared_ptrs
Create a new shared pointer type stdext::shared_object_ptr and stdext::shared_obj using boost::intrusive_ptr Advantages: * half memory usage * faster and lightweight Disadvantages: * using weak_ptr is not supported anymore * compiling seems slower
This commit is contained in:
		
							parent
							
								
									3ca6494343
								
							
						
					
					
						commit
						e0431021b5
					
				|  | @ -113,13 +113,13 @@ function doCreatureFitFilters(creature) | |||
|   local hideSkulls = hideSkullsButton:isChecked() | ||||
|   local hideParty = hidePartyButton:isChecked() | ||||
| 
 | ||||
|   if hidePlayers and creature:asPlayer() then | ||||
|   if hidePlayers and creature:isPlayer() then | ||||
|     return false | ||||
|   elseif hideNPCs and creature:asNpc() then | ||||
|   elseif hideNPCs and creature:isNpc() then | ||||
|     return false | ||||
|   elseif hideMonsters and creature:asMonster() then | ||||
|   elseif hideMonsters and creature:isMonster() then | ||||
|     return false | ||||
|   elseif hideSkulls and creature:asPlayer() and creature:getSkull() == SkullNone then | ||||
|   elseif hideSkulls and creature:isPlayer() and creature:getSkull() == SkullNone then | ||||
|     return false | ||||
|   elseif hideParty and creature:getShield() > ShieldWhiteBlue then | ||||
|     return false | ||||
|  |  | |||
|  | @ -150,7 +150,7 @@ function onChooseItemMouseRelease(self, mousePosition, mouseButton) | |||
|         if tile then | ||||
|           local thing = tile:getTopMoveThing() | ||||
|           if thing then | ||||
|             item = thing:asItem() | ||||
|             item = thing:isItem() | ||||
|           end | ||||
|         end | ||||
|       elseif clickedWidget:getClassName() == 'UIItem' and not clickedWidget:isVirtual() then | ||||
|  |  | |||
|  | @ -267,7 +267,7 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) | |||
| 
 | ||||
|   end | ||||
| 
 | ||||
|   if lookThing and not lookThing:asCreature() and not lookThing:isNotMoveable() and lookThing:isPickupable() then | ||||
|   if lookThing and not lookThing:isCreature() and not lookThing:isNotMoveable() and lookThing:isPickupable() then | ||||
|     menu:addSeparator() | ||||
|     menu:addOption(tr('Trade with ...'), function() startTradeWith(lookThing) end) | ||||
|   end | ||||
|  | @ -282,7 +282,7 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) | |||
|   if creatureThing then | ||||
|     menu:addSeparator() | ||||
| 
 | ||||
|     if creatureThing:asLocalPlayer() then | ||||
|     if creatureThing:isLocalPlayer() then | ||||
|       menu:addOption(tr('Set Outfit'), function() g_game.requestOutfit() end) | ||||
| 
 | ||||
|       if creatureThing:isPartyMember() --[[and not fighting]] then | ||||
|  | @ -310,7 +310,7 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) | |||
|         menu:addOption(tr('Stop Follow'), function() g_game.cancelFollow() end) | ||||
|       end | ||||
| 
 | ||||
|       if creatureThing:asPlayer() then | ||||
|       if creatureThing:isPlayer() then | ||||
|         menu:addSeparator() | ||||
|         local creatureName = creatureThing:getName() | ||||
|         menu:addOption(tr('Message to %s', creatureName), function() g_game.openPrivateChannel(creatureName) end) | ||||
|  | @ -322,7 +322,7 @@ function createThingMenu(menuPosition, lookThing, useThing, creatureThing) | |||
|           menu:addOption(tr('Add to VIP list'), function() g_game.addVip(creatureName) end) | ||||
|         end | ||||
| 
 | ||||
|         local localPlayerShield = localPlayer:asCreature():getShield() | ||||
|         local localPlayerShield = localPlayer:isCreature():getShield() | ||||
|         local creatureShield = creatureThing:getShield() | ||||
| 
 | ||||
|         if localPlayerShield == ShieldNone or localPlayerShield == ShieldWhiteBlue then | ||||
|  | @ -394,8 +394,8 @@ function processMouseAction(menuPosition, mouseButton, autoWalkPos, lookThing, u | |||
|   else | ||||
|     if multiUseThing and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton and not g_mouse.isPressed(MouseLeftButton) then | ||||
|       local player = g_game.getLocalPlayer() | ||||
|       if multiUseThing:asCreature() and multiUseThing:asCreature() ~= player then | ||||
|         g_game.attack(multiUseThing:asCreature()) | ||||
|       if multiUseThing:isCreature() and multiUseThing:isCreature() ~= player then | ||||
|         g_game.attack(multiUseThing:isCreature()) | ||||
|         return true | ||||
|       elseif multiUseThing:isContainer() then | ||||
|         if multiUseThing:getParentContainer() then | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ function UIGameMap:onDrop(widget, mousePos) | |||
|   local thingPos = thing:getPosition() | ||||
|   if thingPos.x == toPos.x and thingPos.y == toPos.y and thingPos.z == toPos.z then return false end | ||||
| 
 | ||||
|   if thing:asItem() and thing:getCount() > 1 then | ||||
|   if thing:isItem() and thing:getCount() > 1 then | ||||
|     modules.game_interface.moveStackableItem(thing, toPos) | ||||
|   else | ||||
|     g_game.move(thing, toPos, 1) | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ enum { | |||
|     BINARYTREE_NODE_END = 0xFF | ||||
| }; | ||||
| 
 | ||||
| class BinaryTree | ||||
| class BinaryTree : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     BinaryTree(const FileStreamPtr& fin); | ||||
|  |  | |||
|  | @ -33,13 +33,11 @@ class ScheduledEvent; | |||
| class FileStream; | ||||
| class BinaryTree; | ||||
| 
 | ||||
| typedef std::shared_ptr<Module> ModulePtr; | ||||
| typedef std::shared_ptr<Event> EventPtr; | ||||
| typedef std::shared_ptr<ScheduledEvent> ScheduledEventPtr; | ||||
| typedef std::shared_ptr<FileStream> FileStreamPtr; | ||||
| typedef std::shared_ptr<BinaryTree> BinaryTreePtr; | ||||
| 
 | ||||
| typedef std::weak_ptr<BinaryTree> BinaryTreeWeakPtr; | ||||
| typedef stdext::shared_object_ptr<Module> ModulePtr; | ||||
| typedef stdext::shared_object_ptr<Event> EventPtr; | ||||
| typedef stdext::shared_object_ptr<ScheduledEvent> ScheduledEventPtr; | ||||
| typedef stdext::shared_object_ptr<FileStream> FileStreamPtr; | ||||
| typedef stdext::shared_object_ptr<BinaryTree> BinaryTreePtr; | ||||
| 
 | ||||
| typedef std::vector<BinaryTreePtr> BinaryTreeVec; | ||||
| 
 | ||||
|  |  | |||
|  | @ -61,7 +61,7 @@ public: | |||
|     void addString(const std::string& v); | ||||
|     BinaryTreePtr makeTree(); | ||||
| 
 | ||||
|     FileStreamPtr asFileStream() { return std::static_pointer_cast<FileStream>(shared_from_this()); } | ||||
|     FileStreamPtr asFileStream() { return self_cast<FileStream>(); } | ||||
| 
 | ||||
| private: | ||||
|     void checkWrite(); | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ public: | |||
|     int getAutoLoadPriority() { return m_autoLoadPriority; } | ||||
| 
 | ||||
|     // @dontbind
 | ||||
|     ModulePtr asModule() { return std::static_pointer_cast<Module>(shared_from_this()); } | ||||
|     ModulePtr asModule() { return self_cast<Module>(); } | ||||
| 
 | ||||
| protected: | ||||
|     void discover(const OTMLNodePtr& moduleNode); | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ void ModuleManager::discoverModules() | |||
|             if(boost::ends_with(moduleFile, ".otmod")) { | ||||
|                 ModulePtr module = discoverModule("/" + moduleDir + "/" + moduleFile); | ||||
|                 if(module && module->isAutoLoad()) | ||||
|                     m_autoLoadModules.insert(make_pair(module->getAutoLoadPriority(), module)); | ||||
|                     m_autoLoadModules.insert(std::make_pair(module->getAutoLoadPriority(), module)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ void AnimatedTexture::processAnimation() | |||
|     AnimatedTexturePtr self = asAnimatedTexture(); | ||||
| 
 | ||||
|     // continue to animate only if something still referencing this texture
 | ||||
|     if(self.use_count() > 1) | ||||
|     if(self->ref_count() > 1) | ||||
|         g_dispatcher.scheduleEvent(std::bind(&AnimatedTexture::processAnimation, self), m_framesDelay[m_currentFrame]); | ||||
| } | ||||
| */ | ||||
|  | @ -34,7 +34,7 @@ public: | |||
|     void enableBilinearFilter(); | ||||
|     void processAnimation(); | ||||
| 
 | ||||
|     AnimatedTexturePtr asAnimatedTexture() { return std::static_pointer_cast<AnimatedTexture>(shared_from_this()); } | ||||
|     AnimatedTexturePtr asAnimatedTexture() { return self_cast<AnimatedTexture>(); } | ||||
| 
 | ||||
| private: | ||||
|     std::vector<uint> m_framesTextureId; | ||||
|  |  | |||
|  | @ -24,11 +24,12 @@ | |||
| #define BITMAPFONT_H | ||||
| 
 | ||||
| #include "declarations.h" | ||||
| #include "texture.h" | ||||
| 
 | ||||
| #include <framework/otml/declarations.h> | ||||
| #include <framework/graphics/coordsbuffer.h> | ||||
| 
 | ||||
| class BitmapFont | ||||
| class BitmapFont : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     BitmapFont(const std::string& name) : m_name(name) { } | ||||
|  |  | |||
|  | @ -44,24 +44,21 @@ class ParticleSystem; | |||
| class ParticleEffect; | ||||
| class ParticleEffectType; | ||||
| 
 | ||||
| typedef std::weak_ptr<Texture> TextureWeakPtr; | ||||
| typedef std::weak_ptr<ParticleSystem> ParticleSystemWeakPtr; | ||||
| 
 | ||||
| typedef std::shared_ptr<Image> ImagePtr; | ||||
| typedef std::shared_ptr<Texture> TexturePtr; | ||||
| typedef std::shared_ptr<AnimatedTexture> AnimatedTexturePtr; | ||||
| typedef std::shared_ptr<BitmapFont> BitmapFontPtr; | ||||
| typedef std::shared_ptr<CachedText> CachedTextPtr; | ||||
| typedef std::shared_ptr<FrameBuffer> FrameBufferPtr; | ||||
| typedef std::shared_ptr<Shader> ShaderPtr; | ||||
| typedef std::shared_ptr<ShaderProgram> ShaderProgramPtr; | ||||
| typedef std::shared_ptr<PainterShaderProgram> PainterShaderProgramPtr; | ||||
| typedef std::shared_ptr<Particle> ParticlePtr; | ||||
| typedef std::shared_ptr<ParticleEmitter> ParticleEmitterPtr; | ||||
| typedef std::shared_ptr<ParticleAffector> ParticleAffectorPtr; | ||||
| typedef std::shared_ptr<ParticleSystem> ParticleSystemPtr; | ||||
| typedef std::shared_ptr<ParticleEffect> ParticleEffectPtr; | ||||
| typedef std::shared_ptr<ParticleEffectType> ParticleEffectTypePtr; | ||||
| typedef stdext::shared_object_ptr<Image> ImagePtr; | ||||
| typedef stdext::shared_object_ptr<Texture> TexturePtr; | ||||
| typedef stdext::shared_object_ptr<AnimatedTexture> AnimatedTexturePtr; | ||||
| typedef stdext::shared_object_ptr<BitmapFont> BitmapFontPtr; | ||||
| typedef stdext::shared_object_ptr<CachedText> CachedTextPtr; | ||||
| typedef stdext::shared_object_ptr<FrameBuffer> FrameBufferPtr; | ||||
| typedef stdext::shared_object_ptr<Shader> ShaderPtr; | ||||
| typedef stdext::shared_object_ptr<ShaderProgram> ShaderProgramPtr; | ||||
| typedef stdext::shared_object_ptr<PainterShaderProgram> PainterShaderProgramPtr; | ||||
| typedef stdext::shared_object_ptr<Particle> ParticlePtr; | ||||
| typedef stdext::shared_object_ptr<ParticleEmitter> ParticleEmitterPtr; | ||||
| typedef stdext::shared_object_ptr<ParticleAffector> ParticleAffectorPtr; | ||||
| typedef stdext::shared_object_ptr<ParticleSystem> ParticleSystemPtr; | ||||
| typedef stdext::shared_object_ptr<ParticleEffect> ParticleEffectPtr; | ||||
| typedef stdext::shared_object_ptr<ParticleEffectType> ParticleEffectTypePtr; | ||||
| typedef std::vector<ShaderPtr> ShaderList; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -21,6 +21,7 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "fontmanager.h" | ||||
| #include "texture.h" | ||||
| 
 | ||||
| #include <framework/core/resourcemanager.h> | ||||
| #include <framework/otml/otml.h> | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ | |||
| #include "declarations.h" | ||||
| #include "texture.h" | ||||
| 
 | ||||
| class FrameBuffer | ||||
| class FrameBuffer : public stdext::shared_object | ||||
| { | ||||
| protected: | ||||
|     FrameBuffer(); | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ | |||
| #include "declarations.h" | ||||
| #include <framework/util/databuffer.h> | ||||
| 
 | ||||
| class Image | ||||
| class Image : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     Image(const Size& size, int bpp = 4, uint8 *pixels = nullptr); | ||||
|  |  | |||
|  | @ -27,7 +27,8 @@ | |||
| #include "painter.h" | ||||
| #include <framework/global.h> | ||||
| 
 | ||||
| class Particle { | ||||
| class Particle : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector<Color>& colors, const std::vector<float>& colorsStops, Painter::CompositionMode compositionMode = Painter::CompositionMode_Normal, TexturePtr texture = nullptr); | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,7 +26,8 @@ | |||
| #include "declarations.h" | ||||
| #include <framework/otml/otml.h> | ||||
| 
 | ||||
| class ParticleAffector { | ||||
| class ParticleAffector : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     ParticleAffector(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -26,10 +26,8 @@ | |||
| #include <framework/core/clock.h> | ||||
| #include <framework/graphics/texturemanager.h> | ||||
| 
 | ||||
| ParticleEmitter::ParticleEmitter(const ParticleSystemPtr& parent) | ||||
| ParticleEmitter::ParticleEmitter() | ||||
| { | ||||
|     m_parent = parent; | ||||
| 
 | ||||
|     m_position = Point(0, 0); | ||||
|     m_duration = -1; | ||||
|     m_delay = 0; | ||||
|  | @ -179,7 +177,7 @@ bool ParticleEmitter::load(const OTMLNodePtr& node) | |||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void ParticleEmitter::update(float elapsedTime) | ||||
| void ParticleEmitter::update(float elapsedTime, const ParticleSystemPtr& system) | ||||
| { | ||||
|     // check if finished
 | ||||
|     if(m_duration >= 0 && m_elapsedTime >= m_duration + m_delay) { | ||||
|  | @ -214,8 +212,7 @@ void ParticleEmitter::update(float elapsedTime) | |||
|                 float pAccelerationAngle = stdext::random_range(m_pMinAccelerationAngle, m_pMaxAccelerationAngle); | ||||
|                 PointF pAcceleration(pAccelerationAbs * cos(pAccelerationAngle), pAccelerationAbs * sin(pAccelerationAngle)); | ||||
| 
 | ||||
|                 ParticleSystemPtr particleSystem = m_parent.lock(); | ||||
|                 particleSystem->addParticle(ParticlePtr(new Particle(pPosition, m_pStartSize, m_pFinalSize, pVelocity, pAcceleration, pDuration, m_pIgnorePhysicsAfter, m_pColors, m_pColorsStops, m_pCompositionMode, m_pTexture))); | ||||
|                 system->addParticle(ParticlePtr(new Particle(pPosition, m_pStartSize, m_pFinalSize, pVelocity, pAcceleration, pDuration, m_pIgnorePhysicsAfter, m_pColors, m_pColorsStops, m_pCompositionMode, m_pTexture))); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,20 +29,18 @@ | |||
| #include <framework/graphics/texture.h> | ||||
| #include <framework/otml/otml.h> | ||||
| 
 | ||||
| class ParticleEmitter { | ||||
| class ParticleEmitter : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
| 
 | ||||
|     ParticleEmitter(const ParticleSystemPtr& parent); | ||||
|     ParticleEmitter(); | ||||
| 
 | ||||
|     bool load(const OTMLNodePtr& node); | ||||
| 
 | ||||
|     void update(float elapsedTime); | ||||
|     void update(float elapsedTime, const ParticleSystemPtr& system); | ||||
| 
 | ||||
|     bool hasFinished() { return m_finished; } | ||||
| 
 | ||||
| private: | ||||
|     ParticleSystemWeakPtr m_parent; | ||||
| 
 | ||||
|     // self related
 | ||||
|     Point m_position; | ||||
|     float m_duration, m_delay; | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ bool ParticleSystem::load(const OTMLNodePtr& node) | |||
| { | ||||
|     for(const OTMLNodePtr& childNode : node->children()) { | ||||
|         if(childNode->tag() == "Emitter") { | ||||
|             ParticleEmitterPtr emitter = ParticleEmitterPtr(new ParticleEmitter(shared_from_this())); | ||||
|             ParticleEmitterPtr emitter = ParticleEmitterPtr(new ParticleEmitter()); | ||||
|             if(!emitter->load(childNode)) | ||||
|                 return false; | ||||
|             m_emitters.push_back(emitter); | ||||
|  | @ -84,6 +84,7 @@ void ParticleSystem::update() | |||
|         return; | ||||
|     m_lastUpdateTime = g_clock.seconds() - std::fmod(elapsedTime, delay); | ||||
| 
 | ||||
|     auto self = self_cast<ParticleSystem>(); | ||||
|     for(int i = 0; i < elapsedTime / delay; ++i) { | ||||
| 
 | ||||
|         // update emitters
 | ||||
|  | @ -93,7 +94,7 @@ void ParticleSystem::update() | |||
|                 it = m_emitters.erase(it); | ||||
|                 continue; | ||||
|             } | ||||
|             emitter->update(delay); | ||||
|             emitter->update(delay, self); | ||||
|             ++it; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ | |||
| #include "particleemitter.h" | ||||
| #include "particleaffector.h" | ||||
| 
 | ||||
| class ParticleSystem : public std::enable_shared_from_this<ParticleSystem> { | ||||
| class ParticleSystem : public stdext::shared_object { | ||||
| public: | ||||
|     ParticleSystem(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ | |||
| 
 | ||||
| #include "declarations.h" | ||||
| 
 | ||||
| class Shader | ||||
| class Shader : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     enum ShaderType { | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ | |||
| 
 | ||||
| #include "declarations.h" | ||||
| 
 | ||||
| class Texture : public std::enable_shared_from_this<Texture> | ||||
| class Texture : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     Texture(); | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ void TextureManager::terminate() | |||
|     // check for leaks
 | ||||
|     int refs = 0; | ||||
|     for(const auto& it : m_textures) | ||||
|         if(it.second.use_count() > 1) | ||||
|         if(it.second->ref_count() > 1) | ||||
|             refs++; | ||||
|     if(refs > 0) | ||||
|         g_logger.debug(stdext::format("%d textures references left", refs)); | ||||
|  | @ -65,10 +65,7 @@ TexturePtr TextureManager::getTexture(const std::string& fileName) | |||
|     // check if the texture is already loaded
 | ||||
|     auto it = m_textures.find(filePath); | ||||
|     if(it != m_textures.end()) { | ||||
|         if(it->second.expired()) | ||||
|             m_textures.erase(it); | ||||
|         else | ||||
|             texture = it->second.lock(); | ||||
|         texture = it->second; | ||||
|     } | ||||
| 
 | ||||
|     // texture not found, load it
 | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ public: | |||
| private: | ||||
|     TexturePtr loadPNG(std::stringstream& file); | ||||
| 
 | ||||
|     std::unordered_map<std::string, TextureWeakPtr> m_textures; | ||||
|     std::unordered_map<std::string, TexturePtr> m_textures; | ||||
|     TexturePtr m_emptyTexture; | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -30,6 +30,6 @@ class LuaObject; | |||
| 
 | ||||
| typedef std::function<int(LuaInterface*)> LuaCppFunction; | ||||
| typedef std::unique_ptr<LuaCppFunction> LuaCppFunctionPtr; | ||||
| typedef std::shared_ptr<LuaObject> LuaObjectPtr; | ||||
| typedef stdext::shared_object_ptr<LuaObject> LuaObjectPtr; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -152,18 +152,18 @@ namespace luabinder | |||
| 
 | ||||
|     /// Create member function lambdas
 | ||||
|     template<typename Ret, typename C, typename... Args> | ||||
|     std::function<Ret(const std::shared_ptr<C>&, const Args&...)> make_mem_func(Ret (C::* f)(Args...)) { | ||||
|     std::function<Ret(const stdext::shared_object_ptr<C>&, const Args&...)> make_mem_func(Ret (C::* f)(Args...)) { | ||||
|         auto mf = std::mem_fn(f); | ||||
|         return [=](const std::shared_ptr<C>& obj, const Args&... args) mutable -> Ret { | ||||
|         return [=](const stdext::shared_object_ptr<C>& obj, const Args&... args) mutable -> Ret { | ||||
|             if(!obj) | ||||
|                 throw LuaException("failed to call a member function because the passed object is nil"); | ||||
|             return mf(obj.get(), args...); | ||||
|         }; | ||||
|     } | ||||
|     template<typename C, typename... Args> | ||||
|     std::function<void(const std::shared_ptr<C>&, const Args&...)> make_mem_func(void (C::* f)(Args...)) { | ||||
|     std::function<void(const stdext::shared_object_ptr<C>&, const Args&...)> make_mem_func(void (C::* f)(Args...)) { | ||||
|         auto mf = std::mem_fn(f); | ||||
|         return [=](const std::shared_ptr<C>& obj, const Args&... args) mutable -> void { | ||||
|         return [=](const stdext::shared_object_ptr<C>& obj, const Args&... args) mutable -> void { | ||||
|             if(!obj) | ||||
|                 throw LuaException("failed to call a member function because the passed object is nil"); | ||||
|             mf(obj.get(), args...); | ||||
|  | @ -186,7 +186,7 @@ namespace luabinder | |||
|     /// Bind member functions
 | ||||
|     template<typename C, typename Ret, class FC, typename... Args> | ||||
|     LuaCppFunction bind_mem_fun(Ret (FC::* f)(Args...)) { | ||||
|         typedef typename std::tuple<std::shared_ptr<FC>, typename remove_const_ref<Args>::type...> Tuple; | ||||
|         typedef typename std::tuple<stdext::shared_object_ptr<FC>, typename remove_const_ref<Args>::type...> Tuple; | ||||
|         auto lambda = make_mem_func<Ret,FC>(f); | ||||
|         return bind_fun_specializer<typename remove_const_ref<Ret>::type, | ||||
|                                     decltype(lambda), | ||||
|  | @ -209,7 +209,7 @@ namespace luabinder | |||
|     LuaCppFunction bind_mem_fun(int (C::*f)(LuaInterface*)) { | ||||
|         auto mf = std::mem_fn(f); | ||||
|         return [=](LuaInterface* lua) -> int { | ||||
|             auto obj = lua->castValue<std::shared_ptr<C>>(1); | ||||
|             auto obj = lua->castValue<stdext::shared_object_ptr<C>>(1); | ||||
|             lua->remove(1); | ||||
|             return mf(obj, lua); | ||||
|         }; | ||||
|  |  | |||
|  | @ -108,5 +108,5 @@ void LuaObject::luaGetFieldsTable() | |||
| 
 | ||||
| int LuaObject::getUseCount() | ||||
| { | ||||
|     return shared_from_this().use_count() - 1; | ||||
|     return ref_count(); | ||||
| } | ||||
|  |  | |||
|  | @ -27,8 +27,7 @@ | |||
| 
 | ||||
| /// LuaObject, all script-able classes have it as base
 | ||||
| // @bindclass
 | ||||
| #pragma pack(push,1) // disable memory alignment
 | ||||
| class LuaObject : public std::enable_shared_from_this<LuaObject> | ||||
| class LuaObject : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     LuaObject(); | ||||
|  | @ -81,7 +80,7 @@ public: | |||
|         return stdext::demangle_name(typeid(*this).name()); | ||||
|     } | ||||
| 
 | ||||
|     LuaObjectPtr asLuaObject() { return shared_from_this(); } | ||||
|     LuaObjectPtr asLuaObject() { return self_cast<LuaObject>(); } | ||||
| 
 | ||||
|     void operator=(const LuaObject& other) { } | ||||
| 
 | ||||
|  | @ -89,7 +88,6 @@ private: | |||
|     int m_fieldsTableRef; | ||||
|     int m_metatableRef; | ||||
| }; | ||||
| #pragma pack(pop) | ||||
| 
 | ||||
| #include "luainterface.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -111,7 +111,7 @@ bool luavalue_cast(int index, LuaObjectPtr& obj); | |||
| 
 | ||||
| template<class T> | ||||
| typename std::enable_if<std::is_base_of<LuaObject, T>::value, bool>::type | ||||
| luavalue_cast(int index, std::shared_ptr<T>& ptr); | ||||
| luavalue_cast(int index, stdext::shared_object_ptr<T>& ptr); | ||||
| 
 | ||||
| // std::function
 | ||||
| template<typename Ret, typename... Args> | ||||
|  | @ -156,7 +156,7 @@ int push_internal_luavalue(const std::tuple<Args...>& tuple); | |||
| 
 | ||||
| #include "luaexception.h" | ||||
| #include "luainterface.h" | ||||
| 
 | ||||
| #include "luaobject.h" | ||||
| 
 | ||||
| template<typename T> | ||||
| int push_internal_luavalue(T v) { | ||||
|  | @ -181,11 +181,14 @@ push_luavalue(const T& obj) { | |||
| 
 | ||||
| template<class T> | ||||
| typename std::enable_if<std::is_base_of<LuaObject, T>::value, bool>::type | ||||
| luavalue_cast(int index, std::shared_ptr<T>& ptr) { | ||||
| luavalue_cast(int index, stdext::shared_object_ptr<T>& ptr) { | ||||
|     LuaObjectPtr obj; | ||||
|     if(!luavalue_cast(index, obj)) | ||||
|         return false; | ||||
|     ptr = std::dynamic_pointer_cast<T>(obj); | ||||
|     if(obj) | ||||
|         ptr = obj->dynamic_self_cast<T>(); | ||||
|     else | ||||
|         ptr = nullptr; | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -340,7 +340,6 @@ void Application::registerLuaFunctions() | |||
|     g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildrenByPos", &UIWidget::recursiveGetChildrenByPos); | ||||
|     g_lua.bindClassMemberFunction<UIWidget>("recursiveGetChildrenByMarginPos", &UIWidget::recursiveGetChildrenByMarginPos); | ||||
|     g_lua.bindClassMemberFunction<UIWidget>("backwardsGetWidgetById", &UIWidget::backwardsGetWidgetById); | ||||
|     g_lua.bindClassMemberFunction<UIWidget>("asUIWidget", &UIWidget::asUIWidget); | ||||
|     g_lua.bindClassMemberFunction<UIWidget>("resize", &UIWidget::resize); | ||||
|     g_lua.bindClassMemberFunction<UIWidget>("move", &UIWidget::move); | ||||
|     g_lua.bindClassMemberFunction<UIWidget>("hide", &UIWidget::hide); | ||||
|  | @ -541,12 +540,11 @@ void Application::registerLuaFunctions() | |||
|     g_lua.bindClassMemberFunction<UILayout>("getParentWidget", &UILayout::getParentWidget); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUpdateDisabled", &UILayout::isUpdateDisabled); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUpdating", &UILayout::isUpdating); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("asUILayout", &UILayout::asUILayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("asUIAnchorLayout", &UILayout::asUIAnchorLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("asUIBoxLayout", &UILayout::asUIBoxLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("asUIHorizontalLayout", &UILayout::asUIHorizontalLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("asUIVerticalLayout", &UILayout::asUIVerticalLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("asUIGridLayout", &UILayout::asUIGridLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUIAnchorLayout", &UILayout::isUIAnchorLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUIBoxLayout", &UILayout::isUIBoxLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUIHorizontalLayout", &UILayout::isUIHorizontalLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUIVerticalLayout", &UILayout::isUIVerticalLayout); | ||||
|     g_lua.bindClassMemberFunction<UILayout>("isUIGridLayout", &UILayout::isUIGridLayout); | ||||
| 
 | ||||
|     // UIBoxLayout
 | ||||
|     g_lua.registerClass<UIBoxLayout, UILayout>(); | ||||
|  | @ -573,7 +571,7 @@ void Application::registerLuaFunctions() | |||
|     g_lua.bindClassMemberFunction<UIGridLayout>("setFlow", &UIGridLayout::setFlow); | ||||
|     g_lua.bindClassMemberFunction<UIGridLayout>("setNumColumns", &UIGridLayout::setNumColumns); | ||||
|     g_lua.bindClassMemberFunction<UIGridLayout>("setNumLines", &UIGridLayout::setNumLines); | ||||
|     g_lua.bindClassMemberFunction<UIGridLayout>("asUIGridLayout", &UIGridLayout::asUIGridLayout); | ||||
|     g_lua.bindClassMemberFunction<UIGridLayout>("isUIGridLayout", &UIGridLayout::isUIGridLayout); | ||||
| 
 | ||||
|     // UIAnchorLayout
 | ||||
|     g_lua.registerClass<UIAnchorLayout, UILayout>(); | ||||
|  |  | |||
|  | @ -65,23 +65,23 @@ void Connection::connect(const std::string& host, uint16 port, const std::functi | |||
| 
 | ||||
|     asio::ip::tcp::resolver::query query(host, stdext::unsafe_cast<std::string>(port)); | ||||
| 
 | ||||
|     auto weakSelf = ConnectionWeakPtr(shared_from_this()); | ||||
|     auto self = asConnection(); | ||||
|     m_resolver.async_resolve(query, [=](const boost::system::error_code& error, asio::ip::tcp::resolver::iterator endpointIterator) { | ||||
|         if(!weakSelf.lock()) | ||||
|         if(self->is_unique_ref()) | ||||
|             return; | ||||
|         m_readTimer.cancel(); | ||||
| 
 | ||||
|         if(!error) { | ||||
|             m_socket.async_connect(*endpointIterator, std::bind(&Connection::onConnect, shared_from_this(), std::placeholders::_1)); | ||||
|             m_socket.async_connect(*endpointIterator, std::bind(&Connection::onConnect, asConnection(), std::placeholders::_1)); | ||||
| 
 | ||||
|             m_readTimer.expires_from_now(boost::posix_time::seconds(READ_TIMEOUT)); | ||||
|             m_readTimer.async_wait(std::bind(&Connection::onTimeout, shared_from_this(), std::placeholders::_1)); | ||||
|             m_readTimer.async_wait(std::bind(&Connection::onTimeout, asConnection(), std::placeholders::_1)); | ||||
|         } else | ||||
|             handleError(error); | ||||
|     }); | ||||
| 
 | ||||
|     m_readTimer.expires_from_now(boost::posix_time::seconds(READ_TIMEOUT)); | ||||
|     m_readTimer.async_wait(std::bind(&Connection::onTimeout, shared_from_this(), std::placeholders::_1)); | ||||
|     m_readTimer.async_wait(std::bind(&Connection::onTimeout, asConnection(), std::placeholders::_1)); | ||||
| } | ||||
| 
 | ||||
| void Connection::close() | ||||
|  | @ -124,20 +124,20 @@ void Connection::write(uint8* buffer, uint16 size) | |||
|     m_sendBufferSize += size; | ||||
| 
 | ||||
|     if(!m_sendEvent || m_sendEvent->isExecuted() || m_sendEvent->isCanceled()) { | ||||
|         auto weakSelf = ConnectionWeakPtr(shared_from_this()); | ||||
|         auto self = asConnection(); | ||||
| 
 | ||||
|         // wait 1 ms to do the real send
 | ||||
|         m_sendEvent = g_dispatcher.scheduleEvent([=] { | ||||
|             if(!weakSelf.lock()) | ||||
|             if(self->is_unique_ref()) | ||||
|                 return; | ||||
|             //m_writeTimer.cancel();
 | ||||
| 
 | ||||
|             asio::async_write(m_socket, | ||||
|                               asio::buffer(m_sendBuffer, m_sendBufferSize), | ||||
|                               std::bind(&Connection::onWrite, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); | ||||
|                               std::bind(&Connection::onWrite, asConnection(), std::placeholders::_1, std::placeholders::_2)); | ||||
| 
 | ||||
|             m_writeTimer.expires_from_now(boost::posix_time::seconds(WRITE_TIMEOUT)); | ||||
|             m_writeTimer.async_wait(std::bind(&Connection::onTimeout, shared_from_this(), std::placeholders::_1)); | ||||
|             m_writeTimer.async_wait(std::bind(&Connection::onTimeout, asConnection(), std::placeholders::_1)); | ||||
| 
 | ||||
|             m_sendBufferSize = 0; | ||||
|         }, SEND_INTERVAL); | ||||
|  | @ -155,10 +155,10 @@ void Connection::read(uint16 bytes, const RecvCallback& callback) | |||
| 
 | ||||
|     asio::async_read(m_socket, | ||||
|                      asio::buffer(m_recvBuffer, bytes), | ||||
|                      std::bind(&Connection::onRecv, shared_from_this(), std::placeholders::_1, bytes)); | ||||
|                      std::bind(&Connection::onRecv, asConnection(), std::placeholders::_1, bytes)); | ||||
| 
 | ||||
|     m_readTimer.expires_from_now(boost::posix_time::seconds(READ_TIMEOUT)); | ||||
|     m_readTimer.async_wait(std::bind(&Connection::onTimeout, shared_from_this(), std::placeholders::_1)); | ||||
|     m_readTimer.async_wait(std::bind(&Connection::onTimeout, asConnection(), std::placeholders::_1)); | ||||
| } | ||||
| 
 | ||||
| void Connection::read_some(const RecvCallback& callback) | ||||
|  | @ -171,10 +171,10 @@ void Connection::read_some(const RecvCallback& callback) | |||
|     m_recvCallback = callback; | ||||
| 
 | ||||
|     m_socket.async_read_some(asio::buffer(m_recvBuffer, RECV_BUFFER_SIZE), | ||||
|                              std::bind(&Connection::onRecv, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); | ||||
|                              std::bind(&Connection::onRecv, asConnection(), std::placeholders::_1, std::placeholders::_2)); | ||||
| 
 | ||||
|     m_readTimer.expires_from_now(boost::posix_time::seconds(READ_TIMEOUT)); | ||||
|     m_readTimer.async_wait(std::bind(&Connection::onTimeout, shared_from_this(), std::placeholders::_1)); | ||||
|     m_readTimer.async_wait(std::bind(&Connection::onTimeout, asConnection(), std::placeholders::_1)); | ||||
| } | ||||
| 
 | ||||
| void Connection::onConnect(const boost::system::error_code& error) | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ | |||
| #include <framework/core/timer.h> | ||||
| #include <framework/core/declarations.h> | ||||
| 
 | ||||
| class Connection : public std::enable_shared_from_this<Connection>, boost::noncopyable | ||||
| class Connection : public stdext::shared_object | ||||
| { | ||||
|     typedef std::function<void(const boost::system::error_code&)> ErrorCallback; | ||||
|     typedef std::function<void(uint8*, uint16)> RecvCallback; | ||||
|  | @ -61,6 +61,7 @@ public: | |||
|     bool isConnecting() { return m_connecting; } | ||||
|     bool isConnected() { return m_connected; } | ||||
| 
 | ||||
|     ConnectionPtr asConnection() { return self_cast<Connection>(); } | ||||
| protected: | ||||
|     void onConnect(const boost::system::error_code& error); | ||||
|     void onWrite(const boost::system::error_code& error, size_t); | ||||
|  |  | |||
|  | @ -34,11 +34,10 @@ class Connection; | |||
| class Protocol; | ||||
| class Server; | ||||
| 
 | ||||
| typedef std::shared_ptr<InputMessage> InputMessagePtr; | ||||
| typedef std::shared_ptr<OutputMessage> OutputMessagePtr; | ||||
| typedef std::shared_ptr<Connection> ConnectionPtr; | ||||
| typedef std::weak_ptr<Connection> ConnectionWeakPtr; | ||||
| typedef std::shared_ptr<Protocol> ProtocolPtr; | ||||
| typedef std::shared_ptr<Server> ServerPtr; | ||||
| typedef stdext::shared_object_ptr<InputMessage> InputMessagePtr; | ||||
| typedef stdext::shared_object_ptr<OutputMessage> OutputMessagePtr; | ||||
| typedef stdext::shared_object_ptr<Connection> ConnectionPtr; | ||||
| typedef stdext::shared_object_ptr<Protocol> ProtocolPtr; | ||||
| typedef stdext::shared_object_ptr<Server> ServerPtr; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ public: | |||
|     virtual void send(const OutputMessagePtr& outputMessage); | ||||
|     void recv(); | ||||
| 
 | ||||
|     ProtocolPtr asProtocol() { return std::static_pointer_cast<Protocol>(shared_from_this()); } | ||||
|     ProtocolPtr asProtocol() { return self_cast<Protocol>(); } | ||||
| 
 | ||||
| protected: | ||||
|     virtual void onConnect(); | ||||
|  |  | |||
|  | @ -30,9 +30,8 @@ class OTMLDocument; | |||
| class OTMLParser; | ||||
| class OTMLEmitter; | ||||
| 
 | ||||
| typedef std::shared_ptr<OTMLNode> OTMLNodePtr; | ||||
| typedef std::shared_ptr<OTMLDocument> OTMLDocumentPtr; | ||||
| typedef std::weak_ptr<OTMLNode> OTMLNodeWeakPtr; | ||||
| typedef stdext::shared_object_ptr<OTMLNode> OTMLNodePtr; | ||||
| typedef stdext::shared_object_ptr<OTMLDocument> OTMLDocumentPtr; | ||||
| typedef std::vector<OTMLNodePtr> OTMLNodeList; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -52,7 +52,7 @@ OTMLDocumentPtr OTMLDocument::parse(std::istream& in, const std::string& source) | |||
| 
 | ||||
| std::string OTMLDocument::emit() | ||||
| { | ||||
|     return OTMLEmitter::emitNode(shared_from_this()) + "\n"; | ||||
|     return OTMLEmitter::emitNode(asOTMLNode()) + "\n"; | ||||
| } | ||||
| 
 | ||||
| bool OTMLDocument::save(const std::string& fileName) | ||||
|  |  | |||
|  | @ -77,14 +77,14 @@ OTMLNodePtr OTMLNode::at(const std::string& childTag) | |||
|         } | ||||
|     } | ||||
|     if(!res) | ||||
|         throw OTMLException(shared_from_this(), stdext::format("child node with tag '%s' not found", childTag)); | ||||
|         throw OTMLException(asOTMLNode(), stdext::format("child node with tag '%s' not found", childTag)); | ||||
|     return res; | ||||
| } | ||||
| 
 | ||||
| OTMLNodePtr OTMLNode::atIndex(int childIndex) | ||||
| { | ||||
|     if(childIndex >= size() || childIndex < 0) | ||||
|         throw OTMLException(shared_from_this(), stdext::mkstr("child node with index '%d' not found", childIndex)); | ||||
|         throw OTMLException(asOTMLNode(), stdext::mkstr("child node with index '%d' not found", childIndex)); | ||||
|     return m_children[childIndex]; | ||||
| } | ||||
| 
 | ||||
|  | @ -109,7 +109,6 @@ void OTMLNode::addChild(const OTMLNodePtr& newChild) | |||
|                 while(it != m_children.end()) { | ||||
|                     OTMLNodePtr node = (*it); | ||||
|                     if(node != newChild && node->tag() == newChild->tag()) { | ||||
|                         node->setParent(nullptr); | ||||
|                         it = m_children.erase(it); | ||||
|                     } else | ||||
|                         ++it; | ||||
|  | @ -120,7 +119,6 @@ void OTMLNode::addChild(const OTMLNodePtr& newChild) | |||
|     } | ||||
| 
 | ||||
|     m_children.push_back(newChild); | ||||
|     newChild->setParent(shared_from_this()); | ||||
| } | ||||
| 
 | ||||
| bool OTMLNode::removeChild(const OTMLNodePtr& oldChild) | ||||
|  | @ -128,7 +126,6 @@ bool OTMLNode::removeChild(const OTMLNodePtr& oldChild) | |||
|     auto it = std::find(m_children.begin(), m_children.end(), oldChild); | ||||
|     if(it != m_children.end()) { | ||||
|         m_children.erase(it); | ||||
|         oldChild->setParent(nullptr); | ||||
|         return true; | ||||
|     } | ||||
|     return false; | ||||
|  | @ -138,8 +135,6 @@ bool OTMLNode::replaceChild(const OTMLNodePtr& oldChild, const OTMLNodePtr& newC | |||
| { | ||||
|     auto it = std::find(m_children.begin(), m_children.end(), oldChild); | ||||
|     if(it != m_children.end()) { | ||||
|         oldChild->setParent(nullptr); | ||||
|         newChild->setParent(shared_from_this()); | ||||
|         it = m_children.erase(it); | ||||
|         m_children.insert(it, newChild); | ||||
|         return true; | ||||
|  | @ -169,8 +164,6 @@ void OTMLNode::merge(const OTMLNodePtr& node) | |||
| 
 | ||||
| void OTMLNode::clear() | ||||
| { | ||||
|     for(const OTMLNodePtr& child : m_children) | ||||
|         child->setParent(nullptr); | ||||
|     m_children.clear(); | ||||
| } | ||||
| 
 | ||||
|  | @ -198,6 +191,6 @@ OTMLNodePtr OTMLNode::clone() | |||
| 
 | ||||
| std::string OTMLNode::emit() | ||||
| { | ||||
|     return OTMLEmitter::emitNode(shared_from_this(), 0); | ||||
|     return OTMLEmitter::emitNode(asOTMLNode(), 0); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ | |||
| 
 | ||||
| #include "declarations.h" | ||||
| 
 | ||||
| class OTMLNode : public std::enable_shared_from_this<OTMLNode> | ||||
| class OTMLNode : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     virtual ~OTMLNode() { } | ||||
|  | @ -35,7 +35,6 @@ public: | |||
| 
 | ||||
|     std::string tag() { return m_tag; } | ||||
|     int size() { return m_children.size(); } | ||||
|     OTMLNodePtr parent() { return m_parent.lock(); } | ||||
|     std::string source() { return m_source; } | ||||
|     std::string rawValue() { return m_value; } | ||||
| 
 | ||||
|  | @ -52,7 +51,6 @@ public: | |||
|     void setValue(const std::string& value) { m_value = value; } | ||||
|     void setNull(bool null) { m_null = null; } | ||||
|     void setUnique(bool unique) { m_unique = unique; } | ||||
|     void setParent(const OTMLNodePtr& parent) { m_parent = parent; } | ||||
|     void setSource(const std::string& source) { m_source = source; } | ||||
| 
 | ||||
|     OTMLNodePtr get(const std::string& childTag); | ||||
|  | @ -91,11 +89,12 @@ public: | |||
| 
 | ||||
|     virtual std::string emit(); | ||||
| 
 | ||||
|     OTMLNodePtr asOTMLNode() { return self_cast<OTMLNode>(); } | ||||
| 
 | ||||
| protected: | ||||
|     OTMLNode() : m_unique(false), m_null(false) { } | ||||
| 
 | ||||
|     OTMLNodeList m_children; | ||||
|     OTMLNodeWeakPtr m_parent; | ||||
|     std::string m_tag; | ||||
|     std::string m_value; | ||||
|     std::string m_source; | ||||
|  | @ -123,7 +122,7 @@ template<typename T> | |||
| T OTMLNode::value() { | ||||
|     T ret; | ||||
|     if(!stdext::cast(m_value, ret)) | ||||
|         throw OTMLException(shared_from_this(), stdext::format("failed to cast node value '%s' to type '%s'", m_value, stdext::demangle_type<T>())); | ||||
|         throw OTMLException(asOTMLNode(), stdext::format("failed to cast node value '%s' to type '%s'", m_value, stdext::demangle_type<T>())); | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -96,7 +96,7 @@ void OTMLParser::parseLine(std::string line) | |||
|     // a depth below, change parent to previous parent
 | ||||
|     } else if(depth < currentDepth) { | ||||
|         for(int i=0;i<currentDepth-depth;++i) | ||||
|             currentParent = currentParent->parent(); | ||||
|             currentParent = parentMap[currentParent]; | ||||
|     // if it isn't the current depth, it's a syntax error
 | ||||
|     } else if(depth != currentDepth) | ||||
|         throw OTMLException(doc, "invalid indentation depth, are you indenting correctly?", currentLine); | ||||
|  | @ -198,5 +198,6 @@ void OTMLParser::parseNode(const std::string& data) | |||
|     } | ||||
| 
 | ||||
|     currentParent->addChild(node); | ||||
|     parentMap[node] = currentParent; | ||||
|     previousNode = node; | ||||
| } | ||||
|  |  | |||
|  | @ -48,6 +48,7 @@ private: | |||
|     int currentLine; | ||||
|     OTMLDocumentPtr doc; | ||||
|     OTMLNodePtr currentParent; | ||||
|     std::unordered_map<OTMLNodePtr, OTMLNodePtr> parentMap; | ||||
|     OTMLNodePtr previousNode; | ||||
|     std::istream& in; | ||||
| }; | ||||
|  |  | |||
|  | @ -38,11 +38,11 @@ class StreamSoundSource; | |||
| class CombinedSoundSource; | ||||
| class OggSoundFile; | ||||
| 
 | ||||
| typedef std::shared_ptr<SoundSource> SoundSourcePtr; | ||||
| typedef std::shared_ptr<SoundFile> SoundFilePtr; | ||||
| typedef std::shared_ptr<SoundBuffer> SoundBufferPtr; | ||||
| typedef std::shared_ptr<StreamSoundSource> StreamSoundSourcePtr; | ||||
| typedef std::shared_ptr<CombinedSoundSource> CombinedSoundSourcePtr; | ||||
| typedef std::shared_ptr<OggSoundFile> OggSoundFilePtr; | ||||
| typedef stdext::shared_object_ptr<SoundSource> SoundSourcePtr; | ||||
| typedef stdext::shared_object_ptr<SoundFile> SoundFilePtr; | ||||
| typedef stdext::shared_object_ptr<SoundBuffer> SoundBufferPtr; | ||||
| typedef stdext::shared_object_ptr<StreamSoundSource> StreamSoundSourcePtr; | ||||
| typedef stdext::shared_object_ptr<CombinedSoundSource> CombinedSoundSourcePtr; | ||||
| typedef stdext::shared_object_ptr<OggSoundFile> OggSoundFilePtr; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ | |||
| 
 | ||||
| #include <framework/util/databuffer.h> | ||||
| 
 | ||||
| class SoundBuffer | ||||
| class SoundBuffer : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     SoundBuffer(); | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ | |||
| #include "declarations.h" | ||||
| #include <framework/core/filestream.h> | ||||
| 
 | ||||
| class SoundFile | ||||
| class SoundFile : public stdext::shared_object | ||||
| { | ||||
| public: | ||||
|     SoundFile(const FileStreamPtr& fileStream); | ||||
|  |  | |||
|  | @ -24,8 +24,9 @@ | |||
| #define SOUNDSOURCE_H | ||||
| 
 | ||||
| #include "declarations.h" | ||||
| #include "soundbuffer.h" | ||||
| 
 | ||||
| class SoundSource | ||||
| class SoundSource : public stdext::shared_object | ||||
| { | ||||
| protected: | ||||
|     SoundSource(uint sourceId) : m_sourceId(sourceId) { } | ||||
|  |  | |||
|  | @ -32,5 +32,6 @@ | |||
| #include "string.h" | ||||
| #include "dumper.h" | ||||
| #include "time.h" | ||||
| #include "shared_object.h" | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -36,17 +36,15 @@ class UIGridLayout; | |||
| class UIAnchorLayout; | ||||
| class UIParticles; | ||||
| 
 | ||||
| typedef std::shared_ptr<UIWidget> UIWidgetPtr; | ||||
| typedef std::weak_ptr<UIWidget> UIWidgetWeakPtr; | ||||
| 
 | ||||
| typedef std::shared_ptr<UIParticles> UIParticlesPtr; | ||||
| typedef std::shared_ptr<UITextEdit> UITextEditPtr; | ||||
| typedef std::shared_ptr<UILayout> UILayoutPtr; | ||||
| typedef std::shared_ptr<UIBoxLayout> UIBoxLayoutPtr; | ||||
| typedef std::shared_ptr<UIHorizontalLayout> UIHorizontalLayoutPtr; | ||||
| typedef std::shared_ptr<UIVerticalLayout> UIVerticalLayoutPtr; | ||||
| typedef std::shared_ptr<UIGridLayout> UIGridLayoutPtr; | ||||
| typedef std::shared_ptr<UIAnchorLayout> UIAnchorLayoutPtr; | ||||
| typedef stdext::shared_object_ptr<UIWidget> UIWidgetPtr; | ||||
| typedef stdext::shared_object_ptr<UIParticles> UIParticlesPtr; | ||||
| typedef stdext::shared_object_ptr<UITextEdit> UITextEditPtr; | ||||
| typedef stdext::shared_object_ptr<UILayout> UILayoutPtr; | ||||
| typedef stdext::shared_object_ptr<UIBoxLayout> UIBoxLayoutPtr; | ||||
| typedef stdext::shared_object_ptr<UIHorizontalLayout> UIHorizontalLayoutPtr; | ||||
| typedef stdext::shared_object_ptr<UIVerticalLayout> UIVerticalLayoutPtr; | ||||
| typedef stdext::shared_object_ptr<UIGridLayout> UIGridLayoutPtr; | ||||
| typedef stdext::shared_object_ptr<UIAnchorLayout> UIAnchorLayoutPtr; | ||||
| 
 | ||||
| typedef std::deque<UIWidgetPtr> UIWidgetList; | ||||
| 
 | ||||
|  |  | |||
|  | @ -74,7 +74,7 @@ public: | |||
|     void addWidget(const UIWidgetPtr& widget); | ||||
|     void removeWidget(const UIWidgetPtr& widget); | ||||
| 
 | ||||
|     UIAnchorLayoutPtr asUIAnchorLayout() { return std::static_pointer_cast<UIAnchorLayout>(shared_from_this()); } | ||||
|     bool isUIAnchorLayout() { return true; } | ||||
| 
 | ||||
| protected: | ||||
|     bool internalUpdate(); | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ public: | |||
|     void setSpacing(int spacing) { m_spacing = spacing; update(); } | ||||
|     void setFitChildren(bool fitParent) { m_fitChildren = fitParent; update(); } | ||||
| 
 | ||||
|     UIBoxLayoutPtr asUIBoxLayout() { return std::static_pointer_cast<UIBoxLayout>(shared_from_this()); } | ||||
|     bool isUIBoxLayout() { return true; } | ||||
| 
 | ||||
| protected: | ||||
|     Boolean<false> m_fitChildren; | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ | |||
| #ifndef UIGRIDLAYOUT_H | ||||
| #define UIGRIDLAYOUT_H | ||||
| 
 | ||||
| #include <framework/ui/uilayout.h> | ||||
| #include "uilayout.h" | ||||
| 
 | ||||
| // @bindclass
 | ||||
| class UIGridLayout : public UILayout | ||||
|  | @ -45,7 +45,7 @@ public: | |||
|     void setFitChildren(bool enable) { m_fitChildren = enable; update(); } | ||||
|     void setFlow(bool enable) { m_flow = enable; update(); } | ||||
| 
 | ||||
|     virtual UIGridLayoutPtr asUIGridLayout() { return nullptr; } | ||||
|     virtual bool isUIGridLayout() { return true; } | ||||
| 
 | ||||
| protected: | ||||
|     bool internalUpdate(); | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ public: | |||
| 
 | ||||
|     void setAlignRight(bool aliginRight) { m_alignRight = aliginRight; update(); } | ||||
| 
 | ||||
|     UIHorizontalLayoutPtr asUIHorizontalLayout() { return std::static_pointer_cast<UIHorizontalLayout>(shared_from_this()); } | ||||
|     bool isUIHorizontalLayout() { return true; } | ||||
| 
 | ||||
| protected: | ||||
|     bool internalUpdate(); | ||||
|  |  | |||
|  | @ -28,8 +28,7 @@ | |||
| void UILayout::update() | ||||
| { | ||||
|     //logTraceCounter();
 | ||||
|     UIWidgetPtr parentWidget = getParentWidget(); | ||||
|     if(!parentWidget || parentWidget->isDestroyed()) | ||||
|     if(!m_parentWidget) | ||||
|         return; | ||||
| 
 | ||||
|     /*
 | ||||
|  | @ -52,7 +51,7 @@ void UILayout::update() | |||
| 
 | ||||
|     m_updating = true; | ||||
|     internalUpdate(); | ||||
|     parentWidget->onLayoutUpdate(); | ||||
|     m_parentWidget->onLayoutUpdate(); | ||||
|     m_updating = false; | ||||
| } | ||||
| 
 | ||||
|  | @ -64,7 +63,7 @@ void UILayout::updateLater() | |||
|     if(!getParentWidget()) | ||||
|         return; | ||||
| 
 | ||||
|     auto self = asUILayout(); | ||||
|     auto self = self_cast<UILayout>(); | ||||
|     g_dispatcher.addEvent([self] { | ||||
|         self->m_updateScheduled = false; | ||||
|         self->update(); | ||||
|  |  | |||
|  | @ -43,17 +43,16 @@ public: | |||
|     void enableUpdates() { m_updateDisabled = std::max(m_updateDisabled-1,0); } | ||||
| 
 | ||||
|     void setParent(UIWidgetPtr parentWidget) { m_parentWidget = parentWidget; } | ||||
|     UIWidgetPtr getParentWidget() { return m_parentWidget.lock(); } | ||||
|     UIWidgetPtr getParentWidget() { return m_parentWidget; } | ||||
| 
 | ||||
|     bool isUpdateDisabled() { return m_updateDisabled > 0; } | ||||
|     bool isUpdating() { return m_updating; } | ||||
| 
 | ||||
|     UILayoutPtr asUILayout() { return std::static_pointer_cast<UILayout>(shared_from_this()); } | ||||
|     virtual UIAnchorLayoutPtr asUIAnchorLayout() { return nullptr; } | ||||
|     virtual UIBoxLayoutPtr asUIBoxLayout() { return nullptr; } | ||||
|     virtual UIHorizontalLayoutPtr asUIHorizontalLayout() { return nullptr; } | ||||
|     virtual UIVerticalLayoutPtr asUIVerticalLayout() { return nullptr; } | ||||
|     virtual UIGridLayoutPtr asUIGridLayout() { return nullptr; } | ||||
|     virtual bool isUIAnchorLayout() { return false; } | ||||
|     virtual bool isUIBoxLayout() { return false; } | ||||
|     virtual bool isUIHorizontalLayout() { return false; } | ||||
|     virtual bool isUIVerticalLayout() { return false; } | ||||
|     virtual bool isUIGridLayout() { return false; } | ||||
| 
 | ||||
| protected: | ||||
|     virtual bool internalUpdate() = 0; | ||||
|  | @ -61,7 +60,7 @@ protected: | |||
|     int m_updateDisabled; | ||||
|     Boolean<false> m_updating; | ||||
|     Boolean<false> m_updateScheduled; | ||||
|     UIWidgetWeakPtr m_parentWidget; | ||||
|     UIWidgetPtr m_parentWidget; | ||||
| }; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -285,7 +285,7 @@ void UIManager::onWidgetDestroy(const UIWidgetPtr& widget) | |||
|         g_dispatcher.scheduleEvent([backupList] { | ||||
|             g_lua.collectGarbage(); | ||||
|             for(const UIWidgetPtr& widget : backupList) { | ||||
|                 if(widget->getUseCount() != 1) | ||||
|                 if(widget->ref_count() != 1) | ||||
|                     g_logger.warning(stdext::format("widget '%s' destroyed but still have %d reference(s) left", widget->getId(), widget->getUseCount()-1)); | ||||
|             } | ||||
|         }, 1); | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
| #define UIMANAGER_H | ||||
| 
 | ||||
| #include "declarations.h" | ||||
| #include "uiwidget.h" | ||||
| #include <framework/core/inputevent.h> | ||||
| #include <framework/otml/declarations.h> | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ public: | |||
| 
 | ||||
|     void setAlignBottom(bool aliginBottom) { m_alignBottom = aliginBottom; update(); } | ||||
| 
 | ||||
|     UIVerticalLayoutPtr asUIVerticalLayout() { return std::static_pointer_cast<UIVerticalLayout>(shared_from_this()); } | ||||
|     bool isUIVerticalLayout() { return true; } | ||||
| 
 | ||||
| protected: | ||||
|     bool internalUpdate(); | ||||
|  |  | |||
|  | @ -141,11 +141,11 @@ void UIWidget::addChild(const UIWidgetPtr& child) | |||
|     UIWidgetPtr oldLastChild = getLastChild(); | ||||
| 
 | ||||
|     m_children.push_back(child); | ||||
|     child->setParent(asUIWidget()); | ||||
|     child->setParent(self_cast<UIWidget>()); | ||||
| 
 | ||||
|     // create default layout
 | ||||
|     if(!m_layout) | ||||
|         m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(asUIWidget())); | ||||
|         m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(self_cast<UIWidget>())); | ||||
| 
 | ||||
|     // add to layout and updates it
 | ||||
|     m_layout->addWidget(child); | ||||
|  | @ -184,11 +184,11 @@ void UIWidget::insertChild(int index, const UIWidgetPtr& child) | |||
|     // retrieve child by index
 | ||||
|     auto it = m_children.begin() + index; | ||||
|     m_children.insert(it, child); | ||||
|     child->setParent(asUIWidget()); | ||||
|     child->setParent(self_cast<UIWidget>()); | ||||
| 
 | ||||
|     // create default layout if needed
 | ||||
|     if(!m_layout) | ||||
|         m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(asUIWidget())); | ||||
|         m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(self_cast<UIWidget>())); | ||||
| 
 | ||||
|     // add to layout and updates it
 | ||||
|     m_layout->addWidget(child); | ||||
|  | @ -218,7 +218,7 @@ void UIWidget::removeChild(UIWidgetPtr child) | |||
|         m_children.erase(it); | ||||
| 
 | ||||
|         // reset child parent
 | ||||
|         assert(child->getParent() == asUIWidget()); | ||||
|         assert(child->getParent() == self_cast<UIWidget>()); | ||||
|         child->setParent(nullptr); | ||||
| 
 | ||||
|         m_layout->removeWidget(child); | ||||
|  | @ -504,7 +504,7 @@ void UIWidget::applyStyle(const OTMLNodePtr& styleNode) | |||
|         callLuaField("onStyleApply", styleNode->tag(), styleNode); | ||||
| 
 | ||||
|         if(m_firstOnStyle) { | ||||
|             auto self = asUIWidget(); | ||||
|             auto self = self_cast<UIWidget>(); | ||||
|             g_dispatcher.addEvent([self] { | ||||
|                 self->callLuaField("onSetup"); | ||||
|             }); | ||||
|  | @ -525,7 +525,7 @@ void UIWidget::addAnchor(Fw::AnchorEdge anchoredEdge, const std::string& hookedW | |||
|         return; | ||||
| 
 | ||||
|     if(UIAnchorLayoutPtr anchorLayout = getAnchoredLayout()) | ||||
|         anchorLayout->addAnchor(asUIWidget(), anchoredEdge, hookedWidgetId, hookedEdge); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), anchoredEdge, hookedWidgetId, hookedEdge); | ||||
|     else | ||||
|         g_logger.error(stdext::format("cannot add anchors to widget '%s': the parent doesn't use anchors layout", m_id)); | ||||
| } | ||||
|  | @ -541,8 +541,8 @@ void UIWidget::centerIn(const std::string& hookedWidgetId) | |||
|         return; | ||||
| 
 | ||||
|     if(UIAnchorLayoutPtr anchorLayout = getAnchoredLayout()) { | ||||
|         anchorLayout->addAnchor(asUIWidget(), Fw::AnchorHorizontalCenter, hookedWidgetId, Fw::AnchorHorizontalCenter); | ||||
|         anchorLayout->addAnchor(asUIWidget(), Fw::AnchorVerticalCenter, hookedWidgetId, Fw::AnchorVerticalCenter); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), Fw::AnchorHorizontalCenter, hookedWidgetId, Fw::AnchorHorizontalCenter); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), Fw::AnchorVerticalCenter, hookedWidgetId, Fw::AnchorVerticalCenter); | ||||
|     } else | ||||
|         g_logger.error(stdext::format("cannot add anchors to widget '%s': the parent doesn't use anchors layout", m_id)); | ||||
| } | ||||
|  | @ -553,10 +553,10 @@ void UIWidget::fill(const std::string& hookedWidgetId) | |||
|         return; | ||||
| 
 | ||||
|     if(UIAnchorLayoutPtr anchorLayout = getAnchoredLayout()) { | ||||
|         anchorLayout->addAnchor(asUIWidget(), Fw::AnchorLeft, hookedWidgetId, Fw::AnchorLeft); | ||||
|         anchorLayout->addAnchor(asUIWidget(), Fw::AnchorRight, hookedWidgetId, Fw::AnchorRight); | ||||
|         anchorLayout->addAnchor(asUIWidget(), Fw::AnchorTop, hookedWidgetId, Fw::AnchorTop); | ||||
|         anchorLayout->addAnchor(asUIWidget(), Fw::AnchorBottom, hookedWidgetId, Fw::AnchorBottom); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), Fw::AnchorLeft, hookedWidgetId, Fw::AnchorLeft); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), Fw::AnchorRight, hookedWidgetId, Fw::AnchorRight); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), Fw::AnchorTop, hookedWidgetId, Fw::AnchorTop); | ||||
|         anchorLayout->addAnchor(self_cast<UIWidget>(), Fw::AnchorBottom, hookedWidgetId, Fw::AnchorBottom); | ||||
|     } else | ||||
|         g_logger.error(stdext::format("cannot add anchors to widget '%s': the parent doesn't use anchors layout", m_id)); | ||||
| } | ||||
|  | @ -567,7 +567,7 @@ void UIWidget::breakAnchors() | |||
|         return; | ||||
| 
 | ||||
|     if(UIAnchorLayoutPtr anchorLayout = getAnchoredLayout()) | ||||
|         anchorLayout->removeAnchors(asUIWidget()); | ||||
|         anchorLayout->removeAnchors(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::updateParentLayout() | ||||
|  | @ -601,7 +601,7 @@ void UIWidget::lock() | |||
|         return; | ||||
| 
 | ||||
|     if(UIWidgetPtr parent = getParent()) | ||||
|         parent->lockChild(asUIWidget()); | ||||
|         parent->lockChild(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::unlock() | ||||
|  | @ -610,7 +610,7 @@ void UIWidget::unlock() | |||
|         return; | ||||
| 
 | ||||
|     if(UIWidgetPtr parent = getParent()) | ||||
|         parent->unlockChild(asUIWidget()); | ||||
|         parent->unlockChild(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::focus() | ||||
|  | @ -622,7 +622,7 @@ void UIWidget::focus() | |||
|         return; | ||||
| 
 | ||||
|     if(UIWidgetPtr parent = getParent()) | ||||
|         parent->focusChild(asUIWidget(), Fw::ActiveFocusReason); | ||||
|         parent->focusChild(self_cast<UIWidget>(), Fw::ActiveFocusReason); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::recursiveFocus(Fw::FocusReason reason) | ||||
|  | @ -632,7 +632,7 @@ void UIWidget::recursiveFocus(Fw::FocusReason reason) | |||
| 
 | ||||
|     if(UIWidgetPtr parent = getParent()) { | ||||
|         if(m_focusable) | ||||
|             parent->focusChild(asUIWidget(), reason); | ||||
|             parent->focusChild(self_cast<UIWidget>(), reason); | ||||
|         parent->recursiveFocus(reason); | ||||
|     } | ||||
| } | ||||
|  | @ -644,7 +644,7 @@ void UIWidget::lower() | |||
| 
 | ||||
|     UIWidgetPtr parent = getParent(); | ||||
|     if(parent) | ||||
|         parent->lowerChild(asUIWidget()); | ||||
|         parent->lowerChild(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::raise() | ||||
|  | @ -654,7 +654,7 @@ void UIWidget::raise() | |||
| 
 | ||||
|     UIWidgetPtr parent = getParent(); | ||||
|     if(parent) | ||||
|         parent->raiseChild(asUIWidget()); | ||||
|         parent->raiseChild(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::grabMouse() | ||||
|  | @ -662,12 +662,12 @@ void UIWidget::grabMouse() | |||
|     if(m_destroyed) | ||||
|         return; | ||||
| 
 | ||||
|     g_ui.setMouseReceiver(asUIWidget()); | ||||
|     g_ui.setMouseReceiver(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::ungrabMouse() | ||||
| { | ||||
|     if(g_ui.getMouseReceiver() == asUIWidget()) | ||||
|     if(g_ui.getMouseReceiver() == self_cast<UIWidget>()) | ||||
|         g_ui.resetMouseReceiver(); | ||||
| } | ||||
| 
 | ||||
|  | @ -676,12 +676,12 @@ void UIWidget::grabKeyboard() | |||
|     if(m_destroyed) | ||||
|         return; | ||||
| 
 | ||||
|     g_ui.setKeyboardReceiver(asUIWidget()); | ||||
|     g_ui.setKeyboardReceiver(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::ungrabKeyboard() | ||||
| { | ||||
|     if(g_ui.getKeyboardReceiver() == asUIWidget()) | ||||
|     if(g_ui.getKeyboardReceiver() == self_cast<UIWidget>()) | ||||
|         g_ui.resetKeyboardReceiver(); | ||||
| } | ||||
| 
 | ||||
|  | @ -705,9 +705,12 @@ void UIWidget::internalDestroy() | |||
|     m_destroyed = true; | ||||
|     m_visible = false; | ||||
|     m_enabled = false; | ||||
|     m_parent.reset(); | ||||
|     m_focusedChild = nullptr; | ||||
|     m_layout = nullptr; | ||||
|     if(m_layout) { | ||||
|         m_layout->setParent(nullptr); | ||||
|         m_layout = nullptr; | ||||
|     } | ||||
|     m_parent = nullptr; | ||||
|     m_lockedChildren.clear(); | ||||
| 
 | ||||
|     for(const UIWidgetPtr& child : m_children) | ||||
|  | @ -718,7 +721,7 @@ void UIWidget::internalDestroy() | |||
| 
 | ||||
|     releaseLuaFieldsTable(); | ||||
| 
 | ||||
|     g_ui.onWidgetDestroy(asUIWidget()); | ||||
|     g_ui.onWidgetDestroy(self_cast<UIWidget>()); | ||||
| } | ||||
| 
 | ||||
| void UIWidget::destroy() | ||||
|  | @ -727,7 +730,7 @@ void UIWidget::destroy() | |||
|         g_logger.warning(stdext::format("attempt to destroy widget '%s' two times", m_id)); | ||||
| 
 | ||||
|     // hold itself reference
 | ||||
|     UIWidgetPtr self = asUIWidget(); | ||||
|     UIWidgetPtr self = self_cast<UIWidget>(); | ||||
|     m_destroyed = true; | ||||
| 
 | ||||
|     // remove itself from parent
 | ||||
|  | @ -772,7 +775,7 @@ void UIWidget::setParent(const UIWidgetPtr& parent) | |||
|     if(oldParent == parent) | ||||
|         return; | ||||
| 
 | ||||
|     UIWidgetPtr self = asUIWidget(); | ||||
|     UIWidgetPtr self = self_cast<UIWidget>(); | ||||
|     if(oldParent && oldParent->hasChild(self)) | ||||
|         oldParent->removeChild(self); | ||||
| 
 | ||||
|  | @ -794,7 +797,7 @@ void UIWidget::setLayout(const UILayoutPtr& layout) | |||
|     if(m_layout) | ||||
|         m_layout->disableUpdates(); | ||||
| 
 | ||||
|     layout->setParent(asUIWidget()); | ||||
|     layout->setParent(self_cast<UIWidget>()); | ||||
|     layout->disableUpdates(); | ||||
| 
 | ||||
|     for(const UIWidgetPtr& child : m_children) { | ||||
|  | @ -833,7 +836,7 @@ bool UIWidget::setRect(const Rect& rect) | |||
| 
 | ||||
|     // avoid massive update events
 | ||||
|     if(!m_updateEventScheduled) { | ||||
|         UIWidgetPtr self = asUIWidget(); | ||||
|         UIWidgetPtr self = self_cast<UIWidget>(); | ||||
|         g_dispatcher.addEvent([self, oldRect]() { | ||||
|             self->m_updateEventScheduled = false; | ||||
|             if(oldRect != self->getRect()) | ||||
|  | @ -893,9 +896,9 @@ void UIWidget::setVisible(bool visible) | |||
| 
 | ||||
|         // visibility can change the current hovered widget
 | ||||
|         if(visible) | ||||
|             g_ui.onWidgetAppear(asUIWidget()); | ||||
|             g_ui.onWidgetAppear(self_cast<UIWidget>()); | ||||
|         else | ||||
|             g_ui.onWidgetDisappear(asUIWidget()); | ||||
|             g_ui.onWidgetDisappear(self_cast<UIWidget>()); | ||||
| 
 | ||||
|         callLuaField("onVisibilityChange", visible); | ||||
|     } | ||||
|  | @ -960,14 +963,14 @@ bool UIWidget::isVisible() | |||
|     else if(UIWidgetPtr parent = getParent()) | ||||
|         return parent->isVisible(); | ||||
|     else | ||||
|         return asUIWidget() == g_ui.getRootWidget(); | ||||
|         return self_cast<UIWidget>() == g_ui.getRootWidget(); | ||||
| } | ||||
| 
 | ||||
| bool UIWidget::isAnchored() | ||||
| { | ||||
|     if(UIWidgetPtr parent = getParent()) | ||||
|         if(UIAnchorLayoutPtr anchorLayout = parent->getAnchoredLayout()) | ||||
|             return anchorLayout->hasAnchors(asUIWidget()); | ||||
|             return anchorLayout->hasAnchors(self_cast<UIWidget>()); | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
|  | @ -1041,7 +1044,10 @@ UIAnchorLayoutPtr UIWidget::getAnchoredLayout() | |||
|     if(!parent) | ||||
|         return nullptr; | ||||
| 
 | ||||
|     return parent->getLayout()->asUIAnchorLayout(); | ||||
|     UILayoutPtr layout = parent->getLayout(); | ||||
|     if(layout->isUIAnchorLayout()) | ||||
|         return layout->self_cast<UIAnchorLayout>(); | ||||
|     return nullptr; | ||||
| } | ||||
| 
 | ||||
| UIWidgetPtr UIWidget::getRootParent() | ||||
|  | @ -1049,7 +1055,7 @@ UIWidgetPtr UIWidget::getRootParent() | |||
|     if(UIWidgetPtr parent = getParent()) | ||||
|         return parent->getRootParent(); | ||||
|     else | ||||
|         return asUIWidget(); | ||||
|         return self_cast<UIWidget>(); | ||||
| } | ||||
| 
 | ||||
| UIWidgetPtr UIWidget::getChildAfter(const UIWidgetPtr& relativeChild) | ||||
|  | @ -1225,7 +1231,7 @@ void UIWidget::updateState(Fw::WidgetState state) | |||
| 
 | ||||
|     switch(state) { | ||||
|         case Fw::ActiveState: { | ||||
|             UIWidgetPtr widget = asUIWidget(); | ||||
|             UIWidgetPtr widget = self_cast<UIWidget>(); | ||||
|             UIWidgetPtr parent; | ||||
|             do { | ||||
|                 parent = widget->getParent(); | ||||
|  | @ -1240,24 +1246,24 @@ void UIWidget::updateState(Fw::WidgetState state) | |||
|             break; | ||||
|         } | ||||
|         case Fw::FocusState: { | ||||
|             newStatus = (getParent() && getParent()->getFocusedChild() == asUIWidget()); | ||||
|             newStatus = (getParent() && getParent()->getFocusedChild() == self_cast<UIWidget>()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::HoverState: { | ||||
|             newStatus = (g_ui.getHoveredWidget() == asUIWidget() && isEnabled()); | ||||
|             newStatus = (g_ui.getHoveredWidget() == self_cast<UIWidget>() && isEnabled()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::PressedState: { | ||||
|             newStatus = (g_ui.getPressedWidget() == asUIWidget()); | ||||
|             newStatus = (g_ui.getPressedWidget() == self_cast<UIWidget>()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::DraggingState: { | ||||
|             newStatus = (g_ui.getDraggingWidget() == asUIWidget()); | ||||
|             newStatus = (g_ui.getDraggingWidget() == self_cast<UIWidget>()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::DisabledState: { | ||||
|             bool enabled = true; | ||||
|             UIWidgetPtr widget = asUIWidget(); | ||||
|             UIWidgetPtr widget = self_cast<UIWidget>(); | ||||
|             do { | ||||
|                 if(!widget->isExplicitlyEnabled()) { | ||||
|                     enabled = false; | ||||
|  | @ -1269,19 +1275,19 @@ void UIWidget::updateState(Fw::WidgetState state) | |||
|             break; | ||||
|         } | ||||
|         case Fw::FirstState: { | ||||
|             newStatus = (getParent() && getParent()->getFirstChild() == asUIWidget()); | ||||
|             newStatus = (getParent() && getParent()->getFirstChild() == self_cast<UIWidget>()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::MiddleState: { | ||||
|             newStatus = (getParent() && getParent()->getFirstChild() != asUIWidget() && getParent()->getLastChild() != asUIWidget()); | ||||
|             newStatus = (getParent() && getParent()->getFirstChild() != self_cast<UIWidget>() && getParent()->getLastChild() != self_cast<UIWidget>()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::LastState: { | ||||
|             newStatus = (getParent() && getParent()->getLastChild() == asUIWidget()); | ||||
|             newStatus = (getParent() && getParent()->getLastChild() == self_cast<UIWidget>()); | ||||
|             break; | ||||
|         } | ||||
|         case Fw::AlternateState: { | ||||
|             newStatus = (getParent() && (getParent()->getChildIndex(asUIWidget()) % 2) == 1); | ||||
|             newStatus = (getParent() && (getParent()->getChildIndex(self_cast<UIWidget>()) % 2) == 1); | ||||
|             break; | ||||
|         } | ||||
|         default: | ||||
|  | @ -1331,7 +1337,7 @@ void UIWidget::updateStyle() | |||
|         return; | ||||
| 
 | ||||
|     if(m_loadingStyle && !m_updateStyleScheduled) { | ||||
|         UIWidgetPtr self = asUIWidget(); | ||||
|         UIWidgetPtr self = self_cast<UIWidget>(); | ||||
|         g_dispatcher.addEvent([self] { | ||||
|             self->m_updateStyleScheduled = false; | ||||
|             self->updateStyle(); | ||||
|  | @ -1636,7 +1642,7 @@ bool UIWidget::propagateOnMouseEvent(const Point& mousePos, UIWidgetList& widget | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     widgetList.push_back(asUIWidget()); | ||||
|     widgetList.push_back(self_cast<UIWidget>()); | ||||
| 
 | ||||
|     if(!isPhantom()) | ||||
|         ret = true; | ||||
|  | @ -1651,6 +1657,6 @@ bool UIWidget::propagateOnMouseMove(const Point& mousePos, const Point& mouseMov | |||
|             child->propagateOnMouseMove(mousePos, mouseMoved, widgetList); | ||||
|     } | ||||
| 
 | ||||
|     widgetList.push_back(asUIWidget()); | ||||
|     widgetList.push_back(self_cast<UIWidget>()); | ||||
|     return true; | ||||
| } | ||||
|  |  | |||
|  | @ -24,6 +24,8 @@ | |||
| #define UIWIDGET_H | ||||
| 
 | ||||
| #include "declarations.h" | ||||
| #include "uilayout.h" | ||||
| 
 | ||||
| #include <framework/luaengine/luaobject.h> | ||||
| #include <framework/graphics/declarations.h> | ||||
| #include <framework/otml/otmlnode.h> | ||||
|  | @ -68,7 +70,7 @@ protected: | |||
|     Boolean<false> m_destroyed; | ||||
|     Boolean<false> m_clipping; | ||||
|     UILayoutPtr m_layout; | ||||
|     UIWidgetWeakPtr m_parent; | ||||
|     UIWidgetPtr m_parent; | ||||
|     UIWidgetList m_children; | ||||
|     UIWidgetList m_lockedChildren; | ||||
|     UIWidgetPtr m_focusedChild; | ||||
|  | @ -152,8 +154,6 @@ public: | |||
|     UIWidgetList recursiveGetChildrenByMarginPos(const Point& childPos); | ||||
|     UIWidgetPtr backwardsGetWidgetById(const std::string& id); | ||||
| 
 | ||||
|     UIWidgetPtr asUIWidget() { return std::static_pointer_cast<UIWidget>(shared_from_this()); } | ||||
| 
 | ||||
| private: | ||||
|     Boolean<false> m_updateEventScheduled; | ||||
|     Boolean<false> m_loadingStyle; | ||||
|  | @ -248,7 +248,7 @@ public: | |||
|     bool containsPoint(const Point& point) { return m_rect.contains(point); } | ||||
| 
 | ||||
|     std::string getId() { return m_id; } | ||||
|     UIWidgetPtr getParent() { return m_parent.lock(); } | ||||
|     UIWidgetPtr getParent() { return m_parent; } | ||||
|     UIWidgetPtr getFocusedChild() { return m_focusedChild; } | ||||
|     UIWidgetList getChildren() { return m_children; } | ||||
|     UIWidgetPtr getFirstChild() { return getChildByIndex(1); } | ||||
|  |  | |||
|  | @ -243,13 +243,13 @@ void UIWidget::parseBaseStyle(const OTMLNodePtr& styleNode) | |||
|             if(!layoutType.empty()) { | ||||
|                 UILayoutPtr layout; | ||||
|                 if(layoutType == "horizontalBox") | ||||
|                     layout = UIHorizontalLayoutPtr(new UIHorizontalLayout(asUIWidget())); | ||||
|                     layout = UIHorizontalLayoutPtr(new UIHorizontalLayout(self_cast<UIWidget>())); | ||||
|                 else if(layoutType == "verticalBox") | ||||
|                     layout = UIVerticalLayoutPtr(new UIVerticalLayout(asUIWidget())); | ||||
|                     layout = UIVerticalLayoutPtr(new UIVerticalLayout(self_cast<UIWidget>())); | ||||
|                 else if(layoutType == "grid") | ||||
|                     layout = UIGridLayoutPtr(new UIGridLayout(asUIWidget())); | ||||
|                     layout = UIGridLayoutPtr(new UIGridLayout(self_cast<UIWidget>())); | ||||
|                 else if(layoutType == "anchor") | ||||
|                     layout = UIAnchorLayoutPtr(new UIAnchorLayout(asUIWidget())); | ||||
|                     layout = UIAnchorLayoutPtr(new UIAnchorLayout(self_cast<UIWidget>())); | ||||
|                 else | ||||
|                     throw OTMLException(node, "cannot determine layout type"); | ||||
|                 setLayout(layout); | ||||
|  | @ -268,7 +268,11 @@ void UIWidget::parseBaseStyle(const OTMLNodePtr& styleNode) | |||
|                     continue; | ||||
|             } | ||||
| 
 | ||||
|             UIAnchorLayoutPtr anchorLayout = parent->getLayout()->asUIAnchorLayout(); | ||||
|             UILayoutPtr layout = parent->getLayout(); | ||||
|             UIAnchorLayoutPtr anchorLayout; | ||||
|             if(layout->isUIAnchorLayout()) | ||||
|                 anchorLayout = layout->self_cast<UIAnchorLayout>(); | ||||
| 
 | ||||
|             if(!anchorLayout) | ||||
|                 throw OTMLException(node, "cannot create anchor, the parent widget doesn't use anchor layout!"); | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,11 +25,6 @@ | |||
| #include <framework/luaengine/luainterface.h> | ||||
| #include <otclient/otclient.h> | ||||
| 
 | ||||
| #include <framework/core/binarytree.h> | ||||
| #include <otclient/item.h> | ||||
| #include <otclient/tile.h> | ||||
| #include <boost/any.hpp> | ||||
| 
 | ||||
| int main(int argc, const char* argv[]) | ||||
| { | ||||
|     std::vector<std::string> args(argv, argv + argc); | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ public: | |||
|     void setColor(int color); | ||||
|     void setText(const std::string& text); | ||||
| 
 | ||||
|     AnimatedTextPtr asAnimatedText() { return std::static_pointer_cast<AnimatedText>(shared_from_this()); } | ||||
|     AnimatedTextPtr asAnimatedText() { return self_cast<AnimatedText>(); } | ||||
|     bool isAnimatedText() { return true; } | ||||
| 
 | ||||
| private: | ||||
|  |  | |||
|  | @ -353,9 +353,9 @@ void Creature::updateWalkingTile() | |||
| 
 | ||||
|     if(newWalkingTile != m_walkingTile) { | ||||
|         if(m_walkingTile) | ||||
|             m_walkingTile->removeWalkingCreature(asCreature()); | ||||
|             m_walkingTile->removeWalkingCreature(self_cast<Creature>()); | ||||
|         if(newWalkingTile) | ||||
|             newWalkingTile->addWalkingCreature(asCreature()); | ||||
|             newWalkingTile->addWalkingCreature(self_cast<Creature>()); | ||||
|         m_walkingTile = newWalkingTile; | ||||
|     } | ||||
| } | ||||
|  | @ -371,7 +371,7 @@ void Creature::nextWalkUpdate() | |||
| 
 | ||||
|     // schedules next update
 | ||||
|     if(m_walking) { | ||||
|         auto self = asCreature(); | ||||
|         auto self = self_cast<Creature>(); | ||||
|         m_walkUpdateEvent = g_dispatcher.scheduleEvent([self] { | ||||
|             self->m_walkUpdateEvent = nullptr; | ||||
|             self->nextWalkUpdate(); | ||||
|  | @ -409,7 +409,7 @@ void Creature::terminateWalk() | |||
|     } | ||||
| 
 | ||||
|     if(m_walkingTile) { | ||||
|         m_walkingTile->removeWalkingCreature(asCreature()); | ||||
|         m_walkingTile->removeWalkingCreature(self_cast<Creature>()); | ||||
|         m_walkingTile = nullptr; | ||||
|     } | ||||
| 
 | ||||
|  | @ -496,7 +496,7 @@ void Creature::setShieldTexture(const std::string& filename, bool blink) | |||
|     m_showShieldTexture = true; | ||||
| 
 | ||||
|     if(blink && !m_shieldBlink) { | ||||
|         auto self = asCreature(); | ||||
|         auto self = self_cast<Creature>(); | ||||
|         g_dispatcher.scheduleEvent([self]() { | ||||
|             self->updateShield(); | ||||
|         }, SHIELD_BLINK_TICKS); | ||||
|  | @ -516,7 +516,7 @@ void Creature::addTimedSquare(uint8 color) | |||
|     m_timedSquareColor = Color::from8bit(color); | ||||
| 
 | ||||
|     // schedule removal
 | ||||
|     auto self = asCreature(); | ||||
|     auto self = self_cast<Creature>(); | ||||
|     g_dispatcher.scheduleEvent([self]() { | ||||
|         self->removeTimedSquare(); | ||||
|     }, VOLATILE_SQUARE_DURATION); | ||||
|  | @ -527,7 +527,7 @@ void Creature::updateShield() | |||
|     m_showShieldTexture = !m_showShieldTexture; | ||||
| 
 | ||||
|     if(m_shield != Otc::ShieldNone && m_shieldBlink) { | ||||
|         auto self = asCreature(); | ||||
|         auto self = self_cast<Creature>(); | ||||
|         g_dispatcher.scheduleEvent([self]() { | ||||
|             self->updateShield(); | ||||
|         }, SHIELD_BLINK_TICKS); | ||||
|  |  | |||
|  | @ -25,6 +25,8 @@ | |||
| 
 | ||||
| #include "thing.h" | ||||
| #include "outfit.h" | ||||
| #include "tile.h" | ||||
| #include <framework/core/scheduledevent.h> | ||||
| #include <framework/core/declarations.h> | ||||
| #include <framework/core/timer.h> | ||||
| #include <framework/graphics/fontmanager.h> | ||||
|  | @ -93,7 +95,6 @@ public: | |||
|     bool isWalking() { return m_walking; } | ||||
|     bool isRemoved() { return m_removed; } | ||||
| 
 | ||||
|     CreaturePtr asCreature() { return std::static_pointer_cast<Creature>(shared_from_this()); } | ||||
|     bool isCreature() { return true; } | ||||
| 
 | ||||
|     const ThingTypePtr& getThingType(); | ||||
|  | @ -150,7 +151,6 @@ protected: | |||
| class Npc : public Creature | ||||
| { | ||||
| public: | ||||
|     NpcPtr asNpc() { return std::static_pointer_cast<Npc>(shared_from_this()); } | ||||
|     bool isNpc() { return true; } | ||||
| }; | ||||
| 
 | ||||
|  | @ -158,7 +158,6 @@ public: | |||
| class Monster : public Creature | ||||
| { | ||||
| public: | ||||
|     MonsterPtr asMonster() { return std::static_pointer_cast<Monster>(shared_from_this()); } | ||||
|     bool isMonster() { return true; } | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -50,25 +50,25 @@ class House; | |||
| class Town; | ||||
| class CreatureType; | ||||
| 
 | ||||
| typedef std::shared_ptr<MapView> MapViewPtr; | ||||
| typedef std::shared_ptr<Tile> TilePtr; | ||||
| typedef std::shared_ptr<Thing> ThingPtr; | ||||
| typedef std::shared_ptr<Item> ItemPtr; | ||||
| typedef std::shared_ptr<Container> ContainerPtr; | ||||
| typedef std::shared_ptr<Creature> CreaturePtr; | ||||
| typedef std::shared_ptr<Monster> MonsterPtr; | ||||
| typedef std::shared_ptr<Npc> NpcPtr; | ||||
| typedef std::shared_ptr<Player> PlayerPtr; | ||||
| typedef std::shared_ptr<LocalPlayer> LocalPlayerPtr; | ||||
| typedef std::shared_ptr<Effect> EffectPtr; | ||||
| typedef std::shared_ptr<Missile> MissilePtr; | ||||
| typedef std::shared_ptr<AnimatedText> AnimatedTextPtr; | ||||
| typedef std::shared_ptr<StaticText> StaticTextPtr; | ||||
| typedef std::shared_ptr<ThingType> ThingTypePtr; | ||||
| typedef std::shared_ptr<ItemType> ItemTypePtr; | ||||
| typedef std::shared_ptr<House> HousePtr; | ||||
| typedef std::shared_ptr<Town> TownPtr; | ||||
| typedef std::shared_ptr<CreatureType> CreatureTypePtr; | ||||
| typedef stdext::shared_object_ptr<MapView> MapViewPtr; | ||||
| typedef stdext::shared_object_ptr<Tile> TilePtr; | ||||
| typedef stdext::shared_object_ptr<Thing> ThingPtr; | ||||
| typedef stdext::shared_object_ptr<Item> ItemPtr; | ||||
| typedef stdext::shared_object_ptr<Container> ContainerPtr; | ||||
| typedef stdext::shared_object_ptr<Creature> CreaturePtr; | ||||
| typedef stdext::shared_object_ptr<Monster> MonsterPtr; | ||||
| typedef stdext::shared_object_ptr<Npc> NpcPtr; | ||||
| typedef stdext::shared_object_ptr<Player> PlayerPtr; | ||||
| typedef stdext::shared_object_ptr<LocalPlayer> LocalPlayerPtr; | ||||
| typedef stdext::shared_object_ptr<Effect> EffectPtr; | ||||
| typedef stdext::shared_object_ptr<Missile> MissilePtr; | ||||
| typedef stdext::shared_object_ptr<AnimatedText> AnimatedTextPtr; | ||||
| typedef stdext::shared_object_ptr<StaticText> StaticTextPtr; | ||||
| typedef stdext::shared_object_ptr<ThingType> ThingTypePtr; | ||||
| typedef stdext::shared_object_ptr<ItemType> ItemTypePtr; | ||||
| typedef stdext::shared_object_ptr<House> HousePtr; | ||||
| typedef stdext::shared_object_ptr<Town> TownPtr; | ||||
| typedef stdext::shared_object_ptr<CreatureType> CreatureTypePtr; | ||||
| 
 | ||||
| typedef std::vector<ThingPtr> ThingList; | ||||
| typedef std::vector<ThingTypePtr> ThingTypeList; | ||||
|  | @ -81,8 +81,8 @@ typedef std::unordered_map<Position, TilePtr, PositionHasher> TileMap; | |||
| class ProtocolLogin; | ||||
| class ProtocolGame; | ||||
| 
 | ||||
| typedef std::shared_ptr<ProtocolGame> ProtocolGamePtr; | ||||
| typedef std::shared_ptr<ProtocolLogin> ProtocolLoginPtr; | ||||
| typedef stdext::shared_object_ptr<ProtocolGame> ProtocolGamePtr; | ||||
| typedef stdext::shared_object_ptr<ProtocolLogin> ProtocolLoginPtr; | ||||
| 
 | ||||
| // ui
 | ||||
| class UIItem; | ||||
|  | @ -90,9 +90,9 @@ class UICreature; | |||
| class UIMap; | ||||
| class UIProgressRect; | ||||
| 
 | ||||
| typedef std::shared_ptr<UIItem> UIItemPtr; | ||||
| typedef std::shared_ptr<UICreature> UICreaturePtr; | ||||
| typedef std::shared_ptr<UIMap> UIMapPtr; | ||||
| typedef std::shared_ptr<UIProgressRect> UIProgressRectPtr; | ||||
| typedef stdext::shared_object_ptr<UIItem> UIItemPtr; | ||||
| typedef stdext::shared_object_ptr<UICreature> UICreaturePtr; | ||||
| typedef stdext::shared_object_ptr<UIMap> UIMapPtr; | ||||
| typedef stdext::shared_object_ptr<UIProgressRect> UIProgressRectPtr; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ public: | |||
| 
 | ||||
|     uint32 getId() { return m_id; } | ||||
| 
 | ||||
|     EffectPtr asEffect() { return std::static_pointer_cast<Effect>(shared_from_this()); } | ||||
|     EffectPtr asEffect() { return self_cast<Effect>(); } | ||||
|     bool isEffect() { return true; } | ||||
| 
 | ||||
|     const ThingTypePtr& getThingType(); | ||||
|  |  | |||
|  | @ -659,8 +659,8 @@ void Game::useWith(const ItemPtr& item, const ThingPtr& toThing) | |||
| 
 | ||||
|     m_localPlayer->lockWalk(); | ||||
| 
 | ||||
|     if(CreaturePtr creature = toThing->asCreature()) | ||||
|         m_protocolGame->sendUseOnCreature(pos, item->getId(), item->getStackpos(), creature->getId()); | ||||
|     if(toThing->isCreature()) | ||||
|         m_protocolGame->sendUseOnCreature(pos, item->getId(), item->getStackpos(), toThing->getId()); | ||||
|     else | ||||
|         m_protocolGame->sendUseItemWith(pos, item->getId(), item->getStackpos(), toThing->getPosition(), toThing->getId(), toThing->getStackpos()); | ||||
| } | ||||
|  | @ -674,8 +674,8 @@ void Game::useInventoryItemWith(int itemId, const ThingPtr& toThing) | |||
| 
 | ||||
|     Position pos = Position(0xFFFF, 0, 0); // means that is a item in inventory
 | ||||
| 
 | ||||
|     if(CreaturePtr creature = toThing->asCreature()) | ||||
|         m_protocolGame->sendUseOnCreature(pos, itemId, 0, creature->getId()); | ||||
|     if(toThing->isCreature()) | ||||
|         m_protocolGame->sendUseOnCreature(pos, itemId, 0, toThing->getId()); | ||||
|     else | ||||
|         m_protocolGame->sendUseItemWith(pos, itemId, 0, toThing->getPosition(), toThing->getId(), toThing->getStackpos()); | ||||
| } | ||||
|  |  | |||
|  | @ -25,6 +25,10 @@ | |||
| 
 | ||||
| #include "declarations.h" | ||||
| #include "item.h" | ||||
| #include "creature.h" | ||||
| #include "container.h" | ||||
| #include "protocolgame.h" | ||||
| #include "localplayer.h" | ||||
| #include "outfit.h" | ||||
| #include <framework/core/timer.h> | ||||
| 
 | ||||
|  |  | |||
|  | @ -115,7 +115,7 @@ public: | |||
|     bool isTeleport() { return m_attribs.has(ATTR_TELE_DEST); } | ||||
|     bool isMoveable(); | ||||
| 
 | ||||
|     ItemPtr asItem() { return std::static_pointer_cast<Item>(shared_from_this()); } | ||||
|     ItemPtr asItem() { return self_cast<Item>(); } | ||||
|     bool isItem() { return true; } | ||||
| 
 | ||||
|     const ThingTypePtr& getThingType(); | ||||
|  |  | |||
|  | @ -78,7 +78,7 @@ public: | |||
|     bool isAutoWalking() { return m_autoWalking; } | ||||
|     bool isPremium() { return m_premium; } | ||||
| 
 | ||||
|     LocalPlayerPtr asLocalPlayer() { return std::static_pointer_cast<LocalPlayer>(shared_from_this()); } | ||||
|     LocalPlayerPtr asLocalPlayer() { return self_cast<LocalPlayer>(); } | ||||
|     bool isLocalPlayer() { return true; } | ||||
| 
 | ||||
| protected: | ||||
|  |  | |||
|  | @ -248,15 +248,6 @@ void OTClient::registerLuaFunctions() | |||
|     g_lua.bindClassMemberFunction<Thing>("getPosition", &Thing::getPosition); | ||||
|     g_lua.bindClassMemberFunction<Thing>("getStackPriority", &Thing::getStackPriority); | ||||
|     g_lua.bindClassMemberFunction<Thing>("getAnimationPhases", &Thing::getAnimationPhases); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asThing", &Thing::asThing); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asItem", &Thing::asItem); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asCreature", &Thing::asCreature); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asEffect", &Thing::asEffect); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asMissile", &Thing::asMissile); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asPlayer", &Thing::asPlayer); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asLocalPlayer", &Thing::asLocalPlayer); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asAnimatedText", &Thing::asAnimatedText); | ||||
|     g_lua.bindClassMemberFunction<Thing>("asStaticText", &Thing::asStaticText); | ||||
|     g_lua.bindClassMemberFunction<Thing>("isItem", &Thing::isItem); | ||||
|     g_lua.bindClassMemberFunction<Thing>("isCreature", &Thing::isCreature); | ||||
|     g_lua.bindClassMemberFunction<Thing>("isEffect", &Thing::isEffect); | ||||
|  | @ -331,8 +322,6 @@ void OTClient::registerLuaFunctions() | |||
|     g_lua.bindClassMemberFunction<Creature>("showStaticSquare", &Creature::showStaticSquare); | ||||
|     g_lua.bindClassMemberFunction<Creature>("hideStaticSquare", &Creature::hideStaticSquare); | ||||
|     g_lua.bindClassMemberFunction<Creature>("isWalking", &Creature::isWalking); | ||||
|     g_lua.bindClassMemberFunction<Creature>("asMonster", &Creature::asMonster); | ||||
|     g_lua.bindClassMemberFunction<Creature>("asNpc", &Creature::asNpc); | ||||
| 
 | ||||
|     g_lua.registerClass<ItemType>(); | ||||
|     g_lua.bindClassMemberFunction<ItemType>("getServerId", &ItemType::getServerId); | ||||
|  | @ -398,7 +387,6 @@ void OTClient::registerLuaFunctions() | |||
|     g_lua.bindClassMemberFunction<LocalPlayer>("isPremium", &LocalPlayer::isPremium); | ||||
|     g_lua.bindClassMemberFunction<LocalPlayer>("isKnown", &LocalPlayer::isKnown); | ||||
|     g_lua.bindClassMemberFunction<LocalPlayer>("isPreWalking", &LocalPlayer::isPreWalking); | ||||
|     g_lua.bindClassMemberFunction<LocalPlayer>("asLocalPlayer", &LocalPlayer::asLocalPlayer); | ||||
| 
 | ||||
|     g_lua.registerClass<Tile>(); | ||||
|     g_lua.bindClassMemberFunction<Tile>("clean", &Tile::clean); | ||||
|  |  | |||
|  | @ -543,7 +543,9 @@ void Map::saveOtcm(const std::string& fileName) | |||
|             const auto& list = tile->getThings(); | ||||
|             auto first = std::find_if(list.begin(), list.end(), [](const ThingPtr& thing) { return thing->isItem(); }); | ||||
|             for(auto it = first, end = list.end(); it != end; ++it) { | ||||
|                 if(ItemPtr item = (*it)->asItem()) { | ||||
|                 const ThingPtr& thing = *it; | ||||
|                 if(thing->isItem()) { | ||||
|                     ItemPtr item = thing->self_cast<Item>(); | ||||
|                     fin->addU16(item->getId()); | ||||
|                     fin->addU8(item->getCountOrSubType()); | ||||
|                 } | ||||
|  | @ -611,11 +613,11 @@ void Map::addThing(const ThingPtr& thing, const Position& pos, int stackPos) | |||
|     if(thing->isItem() || thing->isCreature() || thing->isEffect()) { | ||||
|         tile->addThing(thing, stackPos); | ||||
|     } else if(thing->isMissile()) { | ||||
|         m_floorMissiles[pos.z].push_back(thing->asMissile()); | ||||
|         m_floorMissiles[pos.z].push_back(thing->self_cast<Missile>()); | ||||
|     } else if(thing->isAnimatedText()) { | ||||
|         m_animatedTexts.push_back(thing->asAnimatedText()); | ||||
|         m_animatedTexts.push_back(thing->self_cast<AnimatedText>()); | ||||
|     } else if(thing->isStaticText()) { | ||||
|         StaticTextPtr staticText = thing->asStaticText(); | ||||
|         StaticTextPtr staticText = thing->self_cast<StaticText>(); | ||||
|         bool mustAdd = true; | ||||
|         for(auto it = m_staticTexts.begin(), end = m_staticTexts.end(); it != end; ++it) { | ||||
|             StaticTextPtr cStaticText = *it; | ||||
|  | @ -639,7 +641,7 @@ void Map::addThing(const ThingPtr& thing, const Position& pos, int stackPos) | |||
|     thing->setPosition(pos); | ||||
| 
 | ||||
|     if(thing->isCreature()) { | ||||
|         CreaturePtr creature = thing->asCreature(); | ||||
|         CreaturePtr creature = thing->self_cast<Creature>(); | ||||
|         if(oldPos != pos) { | ||||
|             if(oldPos.isInRange(pos,1,1)) | ||||
|                 g_game.processCreatureMove(creature, oldPos, pos); | ||||
|  | @ -665,20 +667,23 @@ bool Map::removeThing(const ThingPtr& thing) | |||
| 
 | ||||
|     notificateTileUpdateToMapViews(thing->getPosition()); | ||||
| 
 | ||||
|     if(MissilePtr missile = thing->asMissile()) { | ||||
|     if(thing->isMissile()) { | ||||
|         MissilePtr missile = thing->self_cast<Missile>(); | ||||
|         int z = missile->getPosition().z; | ||||
|         auto it = std::find(m_floorMissiles[z].begin(), m_floorMissiles[z].end(), missile); | ||||
|         if(it != m_floorMissiles[z].end()) { | ||||
|             m_floorMissiles[z].erase(it); | ||||
|             return true; | ||||
|         } | ||||
|     } else if(AnimatedTextPtr animatedText = thing->asAnimatedText()) { | ||||
|     } else if(thing->isAnimatedText()) { | ||||
|         AnimatedTextPtr animatedText = thing->self_cast<AnimatedText>(); | ||||
|         auto it = std::find(m_animatedTexts.begin(), m_animatedTexts.end(), animatedText); | ||||
|         if(it != m_animatedTexts.end()) { | ||||
|             m_animatedTexts.erase(it); | ||||
|             return true; | ||||
|         } | ||||
|     } else if(StaticTextPtr staticText = thing->asStaticText()) { | ||||
|     } else if(thing->isStaticText()) { | ||||
|         StaticTextPtr staticText = thing->self_cast<StaticText>(); | ||||
|         auto it = std::find(m_staticTexts.begin(), m_staticTexts.end(), staticText); | ||||
|         if(it != m_staticTexts.end()) { | ||||
|             m_staticTexts.erase(it); | ||||
|  |  | |||
|  | @ -28,6 +28,7 @@ | |||
| #include "towns.h" | ||||
| #include "creatures.h" | ||||
| #include "animatedtext.h" | ||||
| #include "statictext.h" | ||||
| 
 | ||||
| #include <framework/core/clock.h> | ||||
| #include <framework/util/attribstorage.h> | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
| #define MAPVIEW_H | ||||
| 
 | ||||
| #include "declarations.h" | ||||
| #include <framework/graphics/paintershaderprogram.h> | ||||
| #include <framework/graphics/declarations.h> | ||||
| #include <framework/luaengine/luaobject.h> | ||||
| #include <framework/core/declarations.h> | ||||
|  | @ -113,7 +114,7 @@ public: | |||
|     // get tile
 | ||||
|     TilePtr getTile(const Point& mousePos, const Rect& mapRect); | ||||
| 
 | ||||
|     MapViewPtr asMapView() { return std::static_pointer_cast<MapView>(shared_from_this()); } | ||||
|     MapViewPtr asMapView() { return self_cast<MapView>(); } | ||||
| 
 | ||||
| private: | ||||
|     int calcFirstVisibleFloor(); | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ public: | |||
| 
 | ||||
|     uint32 getId() { return m_id; } | ||||
| 
 | ||||
|     MissilePtr asMissile() { return std::static_pointer_cast<Missile>(shared_from_this()); } | ||||
|     MissilePtr asMissile() { return self_cast<Missile>(); } | ||||
|     bool isMissile() { return true; } | ||||
| 
 | ||||
|     const ThingTypePtr& getThingType(); | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ public: | |||
|     Player() { } | ||||
|     virtual ~Player() { } | ||||
| 
 | ||||
|     PlayerPtr asPlayer() { return std::static_pointer_cast<Player>(shared_from_this()); } | ||||
|     PlayerPtr asPlayer() { return self_cast<Player>(); } | ||||
|     bool isPlayer() { return true; } | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ public: | |||
| 
 | ||||
|     bool addMessage(const std::string& name, Otc::MessageMode mode, const std::string& text); | ||||
| 
 | ||||
|     StaticTextPtr asStaticText() { return std::static_pointer_cast<StaticText>(shared_from_this()); } | ||||
|     StaticTextPtr asStaticText() { return self_cast<StaticText>(); } | ||||
|     bool isStaticText() { return true; } | ||||
| 
 | ||||
| private: | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ int Thing::getStackPriority() | |||
|         return 2; | ||||
|     else if(isOnTop()) | ||||
|         return 3; | ||||
|     else if(asCreature()) | ||||
|     else if(isCreature()) | ||||
|         return 4; | ||||
|     else // common items
 | ||||
|         return 5; | ||||
|  | @ -65,10 +65,10 @@ ContainerPtr Thing::getParentContainer() | |||
| 
 | ||||
| int Thing::getStackpos() | ||||
| { | ||||
|     if(m_position.x == 65535 && asItem()) // is inside a container
 | ||||
|     if(m_position.x == 65535 && isItem()) // is inside a container
 | ||||
|         return m_position.z; | ||||
|     else if(const TilePtr& tile = getTile()) | ||||
|         return tile->getThingStackpos(asThing()); | ||||
|         return tile->getThingStackpos(self_cast<Thing>()); | ||||
|     else { | ||||
|         g_logger.traceError("got a thing with invalid stackpos"); | ||||
|         return -1; | ||||
|  |  | |||
|  | @ -49,18 +49,6 @@ public: | |||
|     ContainerPtr getParentContainer(); | ||||
|     int getStackpos(); | ||||
| 
 | ||||
|     ThingPtr asThing() { return std::static_pointer_cast<Thing>(shared_from_this()); } | ||||
|     virtual ItemPtr asItem() { return nullptr; } | ||||
|     virtual EffectPtr asEffect() { return nullptr; } | ||||
|     virtual MissilePtr asMissile() { return nullptr; } | ||||
|     virtual CreaturePtr asCreature() { return nullptr; } | ||||
|     virtual NpcPtr asNpc() { return nullptr; } | ||||
|     virtual MonsterPtr asMonster() { return nullptr; } | ||||
|     virtual PlayerPtr asPlayer() { return nullptr; } | ||||
|     virtual LocalPlayerPtr asLocalPlayer() { return nullptr; } | ||||
|     virtual AnimatedTextPtr asAnimatedText() { return nullptr; } | ||||
|     virtual StaticTextPtr asStaticText() { return nullptr; } | ||||
| 
 | ||||
|     virtual bool isItem() { return false; } | ||||
|     virtual bool isEffect() { return false; } | ||||
|     virtual bool isMissile() { return false; } | ||||
|  |  | |||
|  | @ -113,7 +113,7 @@ void Tile::draw(const Point& dest, float scaleFactor, int drawFlags) | |||
|             const ThingPtr& thing = *it; | ||||
|             if(!thing->isCreature()) | ||||
|                 continue; | ||||
|             CreaturePtr creature = thing->asCreature(); | ||||
|             CreaturePtr creature = thing->self_cast<Creature>(); | ||||
|             if(creature && (!creature->isWalking() || !animate)) | ||||
|                 creature->draw(dest - m_drawElevation*scaleFactor, scaleFactor, animate); | ||||
|         } | ||||
|  | @ -158,7 +158,7 @@ void Tile::addThing(const ThingPtr& thing, int stackPos) | |||
|         return; | ||||
| 
 | ||||
|     if(thing->isEffect()) { | ||||
|         m_effects.push_back(thing->asEffect()); | ||||
|         m_effects.push_back(thing->self_cast<Effect>()); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|  | @ -204,7 +204,8 @@ bool Tile::removeThing(ThingPtr thing) | |||
| 
 | ||||
|     bool removed = false; | ||||
| 
 | ||||
|     if(EffectPtr effect = thing->asEffect()) { | ||||
|     if(thing->isEffect()) { | ||||
|         EffectPtr effect = thing->self_cast<Effect>(); | ||||
|         auto it = std::find(m_effects.begin(), m_effects.end(), effect); | ||||
|         if(it != m_effects.end()) { | ||||
|             m_effects.erase(it); | ||||
|  | @ -264,8 +265,10 @@ std::vector<ItemPtr> Tile::getItems() | |||
| { | ||||
|     std::vector<ItemPtr> items; | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(ItemPtr item = thing->asItem()) | ||||
|             items.push_back(item); | ||||
|         if(!thing->isItem()) | ||||
|             continue; | ||||
|         ItemPtr item = thing->self_cast<Item>(); | ||||
|         items.push_back(item); | ||||
|     } | ||||
|     return items; | ||||
| } | ||||
|  | @ -274,8 +277,8 @@ std::vector<CreaturePtr> Tile::getCreatures() | |||
| { | ||||
|     std::vector<CreaturePtr> creatures; | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(CreaturePtr creature = thing->asCreature()) | ||||
|             creatures.push_back(creature); | ||||
|         if(thing->isCreature()) | ||||
|             creatures.push_back(thing->self_cast<Creature>()); | ||||
|     } | ||||
|     return creatures; | ||||
| } | ||||
|  | @ -285,8 +288,8 @@ ItemPtr Tile::getGround() | |||
|     ThingPtr firstObject = getThing(0); | ||||
|     if(!firstObject) | ||||
|         return nullptr; | ||||
|     if(firstObject->isGround()) | ||||
|         return firstObject->asItem(); | ||||
|     if(firstObject->isGround() && firstObject->isItem()) | ||||
|         return firstObject->self_cast<Item>(); | ||||
|     return nullptr; | ||||
| } | ||||
| 
 | ||||
|  | @ -344,10 +347,10 @@ CreaturePtr Tile::getTopCreature() | |||
|     CreaturePtr creature; | ||||
|     for(uint i = 0; i < m_things.size(); ++i) { | ||||
|         ThingPtr thing = m_things[i]; | ||||
|         if(thing->asLocalPlayer()) // return local player if there is no other creature
 | ||||
|             creature = thing->asCreature(); | ||||
|         if(thing->isLocalPlayer()) // return local player if there is no other creature
 | ||||
|             creature = thing->self_cast<Creature>(); | ||||
|         else if(thing->isCreature() && !thing->isLocalPlayer()) | ||||
|             return thing->asCreature(); | ||||
|             return thing->self_cast<Creature>(); | ||||
|     } | ||||
|     if(!creature && !m_walkingCreatures.empty()) | ||||
|         creature = m_walkingCreatures.back(); | ||||
|  | @ -404,7 +407,8 @@ bool Tile::isWalkable() | |||
|         if(thing->isNotWalkable()) | ||||
|             return false; | ||||
| 
 | ||||
|         if(CreaturePtr creature = thing->asCreature()) { | ||||
|         if(thing->isCreature()) { | ||||
|             CreaturePtr creature = thing->self_cast<Creature>(); | ||||
|             if(!creature->isPassable()) | ||||
|                 return false; | ||||
|         } | ||||
|  | @ -491,7 +495,7 @@ bool Tile::mustHookSouth() | |||
| bool Tile::hasCreature() | ||||
| { | ||||
|     for(const ThingPtr& thing : m_things) | ||||
|         if(thing->asCreature()) | ||||
|         if(thing->isCreature()) | ||||
|             return true; | ||||
|     return false; | ||||
| } | ||||
|  |  | |||
|  | @ -106,7 +106,7 @@ public: | |||
|     void setHouseId(uint32 hid) { if(m_flags & TILESTATE_HOUSE) m_houseId = hid; } | ||||
|     uint32 getHouseId() { return m_houseId; } | ||||
| 
 | ||||
|     TilePtr asTile() { return std::static_pointer_cast<Tile>(shared_from_this()); } | ||||
|     TilePtr asTile() { return self_cast<Tile>(); } | ||||
| 
 | ||||
| private: | ||||
|     std::vector<CreaturePtr> m_walkingCreatures; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eduardo Bart
						Eduardo Bart