From fa8b77f0c830fde04ecbe1571d7bc7eb77e7bcb4 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Fri, 5 Oct 2012 16:13:50 -0300 Subject: [PATCH] Fix issue #109 --- modules/game_battle/battle.lua | 16 ++++++++++++++-- src/otclient/creature.cpp | 6 ++++++ src/otclient/creature.h | 2 ++ src/otclient/luafunctions.cpp | 2 ++ src/otclient/luavaluecasts.cpp | 4 ++++ src/otclient/mapview.cpp | 3 +++ src/otclient/tile.cpp | 2 +- 7 files changed, 32 insertions(+), 3 deletions(-) diff --git a/modules/game_battle/battle.lua b/modules/game_battle/battle.lua index 158c55e7..0070e38b 100644 --- a/modules/game_battle/battle.lua +++ b/modules/game_battle/battle.lua @@ -41,6 +41,7 @@ function init() connect(Creature, { onSkullChange = updateCreatureSkull, onEmblemChange = updateCreatureEmblem, + onOutfitChange = onCreatureOutfitChange, onHealthPercentChange = onCreatureHealthPercentChange, onPositionChange = onCreaturePositionChange, onAppear = onCreatureAppear, @@ -67,6 +68,7 @@ function terminate() disconnect(Creature, { onSkullChange = updateCreatureSkull, onEmblemChange = updateCreatureEmblem, + onOutfitChange = onCreatureOutfitChange, onHealthPercentChange = onCreatureHealthPercentChange, onPositionChange = onCreaturePositionChange, onAppear = onCreatureAppear, @@ -126,6 +128,8 @@ function doCreatureFitFilters(creature) return false end + if not creature:canBeSeen() then return false end + local hidePlayers = hidePlayersButton:isChecked() local hideNPCs = hideNPCsButton:isChecked() local hideMonsters = hideMonstersButton:isChecked() @@ -168,9 +172,17 @@ function onCreaturePositionChange(creature, newPos, oldPos) end end +function onCreatureOutfitChange(creature, outfit, oldOutfit) + if not creature:canBeSeen() then + removeCreature(creature) + elseif doCreatureFitFilters(creature) then + removeCreature(creature) + addCreature(creature) + end +end + function onCreatureAppear(creature) - local player = g_game.getLocalPlayer() - if creature ~= player and creature:getPosition().z == player:getPosition().z and doCreatureFitFilters(creature) then + if doCreatureFitFilters(creature) then addCreature(creature) end end diff --git a/src/otclient/creature.cpp b/src/otclient/creature.cpp index 6d3c0df8..b4a1c90b 100644 --- a/src/otclient/creature.cpp +++ b/src/otclient/creature.cpp @@ -60,6 +60,9 @@ Creature::Creature() : Thing() void Creature::draw(const Point& dest, float scaleFactor, bool animate) { + if(!canBeSeen()) + return; + Point animationOffset = animate ? m_walkOffset : Point(0,0); if(m_showTimedSquare && animate) { @@ -523,6 +526,7 @@ void Creature::setDirection(Otc::Direction direction) void Creature::setOutfit(const Outfit& outfit) { + Outfit oldOutfit = outfit; if(outfit.getCategory() != ThingCategoryCreature) { if(!g_things.isValidDatId(outfit.getAuxId(), outfit.getCategory())) return; @@ -534,6 +538,8 @@ void Creature::setOutfit(const Outfit& outfit) m_outfit = outfit; } m_walkAnimationPhase = 0; // might happen when player is walking and outfit is changed. + + callLuaField("onOutfitChange", m_outfit, oldOutfit); } void Creature::setSpeed(uint16 speed) diff --git a/src/otclient/creature.h b/src/otclient/creature.h index 713c4db8..a7809a25 100644 --- a/src/otclient/creature.h +++ b/src/otclient/creature.h @@ -102,6 +102,8 @@ public: bool isWalking() { return m_walking; } bool isRemoved() { return m_removed; } + bool isInvisible() { return m_outfit.getCategory() == ThingCategoryEffect && m_outfit.getAuxId() == 13; } + bool canBeSeen() { return !isInvisible() || isPlayer(); } bool isCreature() { return true; } diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index a225b947..f0e56b00 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -368,6 +368,8 @@ void OTClient::registerLuaFunctions() g_lua.bindClassMemberFunction("showStaticSquare", &Creature::showStaticSquare); g_lua.bindClassMemberFunction("hideStaticSquare", &Creature::hideStaticSquare); g_lua.bindClassMemberFunction("isWalking", &Creature::isWalking); + g_lua.bindClassMemberFunction("isInvisible", &Creature::isInvisible); + g_lua.bindClassMemberFunction("canBeSeen", &Creature::canBeSeen); g_lua.registerClass(); g_lua.bindClassMemberFunction("getServerId", &ItemType::getServerId); diff --git a/src/otclient/luavaluecasts.cpp b/src/otclient/luavaluecasts.cpp index 40e2a1b6..4a536fa8 100644 --- a/src/otclient/luavaluecasts.cpp +++ b/src/otclient/luavaluecasts.cpp @@ -28,6 +28,8 @@ int push_luavalue(const Outfit& outfit) g_lua.newTable(); g_lua.pushInteger(outfit.getId()); g_lua.setField("type"); + g_lua.pushInteger(outfit.getAuxId()); + g_lua.setField("auxType"); g_lua.pushInteger(outfit.getAddons()); g_lua.setField("addons"); g_lua.pushInteger(outfit.getHead()); @@ -50,6 +52,8 @@ bool luavalue_cast(int index, Outfit& outfit) if(g_lua.isTable(index)) { g_lua.getField("type", index); outfit.setId(g_lua.popInteger()); + g_lua.getField("auxType", index); + outfit.setAuxId(g_lua.popInteger()); g_lua.getField("addons", index); outfit.setAddons(g_lua.popInteger()); g_lua.getField("head", index); diff --git a/src/otclient/mapview.cpp b/src/otclient/mapview.cpp index ac13c401..953e74c4 100644 --- a/src/otclient/mapview.cpp +++ b/src/otclient/mapview.cpp @@ -175,6 +175,9 @@ void MapView::draw(const Rect& rect) // avoid drawing texts on map in far zoom outs if(m_viewMode == NEAR_VIEW && m_drawTexts) { for(const CreaturePtr& creature : m_cachedFloorVisibleCreatures) { + if(!creature->canBeSeen()) + continue; + Point creatureOffset = Point(16 - creature->getDisplacementX(), -3 - creature->getDisplacementY()); Position pos = creature->getPosition(); Point p = transformPositionTo2D(pos, cameraPosition) - drawOffset; diff --git a/src/otclient/tile.cpp b/src/otclient/tile.cpp index b62a290e..61d034f0 100644 --- a/src/otclient/tile.cpp +++ b/src/otclient/tile.cpp @@ -451,7 +451,7 @@ bool Tile::isWalkable() if(thing->isCreature()) { CreaturePtr creature = thing->static_self_cast(); - if(!creature->isPassable()) + if(!creature->isPassable() && creature->canBeSeen()) return false; } }