From 3e841cd7b681e8504fb6aa2f395000f08db6f902 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Wed, 1 Feb 2012 01:47:00 -0200 Subject: [PATCH] fix covered issues --- src/otclient/core/item.cpp | 4 ++++ src/otclient/core/map.cpp | 5 +---- src/otclient/core/mapview.cpp | 10 +++------- src/otclient/core/thing.h | 1 + src/otclient/core/thingstype.h | 3 +++ src/otclient/luafunctions.cpp | 2 ++ 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/otclient/core/item.cpp b/src/otclient/core/item.cpp index f4eeec1f..807c6a5f 100644 --- a/src/otclient/core/item.cpp +++ b/src/otclient/core/item.cpp @@ -37,6 +37,10 @@ Item::Item() : Thing() ItemPtr Item::create(int id) { + if(id < g_thingsType.getFirstItemId() || id > g_thingsType.getMaxItemid()) { + logTraceError("invalid item id ", id); + return nullptr; + } ItemPtr item = ItemPtr(new Item); item->setId(id); return item; diff --git a/src/otclient/core/map.cpp b/src/otclient/core/map.cpp index b81b977d..d0d17a1d 100644 --- a/src/otclient/core/map.cpp +++ b/src/otclient/core/map.cpp @@ -337,9 +337,6 @@ bool Map::isCovered(const Position& pos, int firstFloor) // the below tile is covered when the above tile has a full ground if(tile && tile->isFullGround()) return true; - - if(tilePos.z == 0) - break; } return false; } @@ -352,7 +349,7 @@ bool Map::isCompletelyCovered(const Position& pos, int firstFloor) // check in 2x2 range tiles that has no transparent pixels for(int x=0;x<2;++x) { for(int y=0;y<2;++y) { - TilePtr tile = m_tiles[tilePos + Position(-x, -y, 0)]; + const TilePtr& tile = getTile(tilePos.translated(-x, -y)); if(!tile || !tile->isFullyOpaque()) { covered = false; break; diff --git a/src/otclient/core/mapview.cpp b/src/otclient/core/mapview.cpp index f110b4ef..41da7ba0 100644 --- a/src/otclient/core/mapview.cpp +++ b/src/otclient/core/mapview.cpp @@ -76,8 +76,6 @@ void MapView::draw(const Rect& rect) if(m_mustDrawVisibleTilesCache || animate) { m_framebuffer->bind(m_mustCleanFramebuffer); - if(m_mustCleanFramebuffer) - m_mustCleanFramebuffer = false; for(const TilePtr& tile : m_cachedVisibleTiles) { tile->draw(transformPositionTo2D(tile->getPosition()), scaleFactor, tileDrawFlags); @@ -181,7 +179,8 @@ void MapView::updateVisibleTilesCache(int start) m_mustCleanFramebuffer = true; m_mustDrawVisibleTilesCache = true; m_mustUpdateVisibleTilesCache = false; - } + } else + m_mustCleanFramebuffer = false; // there is no tile to render on invalid positions Position cameraPosition = getCameraPosition(); @@ -227,7 +226,7 @@ void MapView::updateVisibleTilesCache(int start) if(tile->isEmpty()) continue; // skip tiles that are completely behind another tile - if(g_map.isCompletelyCovered(tilePos, m_cachedLastVisibleFloor)) + if(g_map.isCompletelyCovered(tilePos, m_cachedFirstVisibleFloor)) continue; m_cachedVisibleTiles.push_back(tile); } @@ -323,9 +322,6 @@ void MapView::updateVisibleTilesCache(int start) // skip tiles that have nothing if(tile->isEmpty()) continue; - // skip tiles that are completely behind another tile - if(g_map.isCompletelyCovered(tilePos, m_cachedLastVisibleFloor)) - continue; m_cachedVisibleTiles.push_back(tile); } } diff --git a/src/otclient/core/thing.h b/src/otclient/core/thing.h index 4e8ca33f..a173d001 100644 --- a/src/otclient/core/thing.h +++ b/src/otclient/core/thing.h @@ -69,6 +69,7 @@ public: // type related bool isGround() { return m_type->properties[ThingType::IsGround]; } bool isFullGround() { return m_type->properties[ThingType::IsFullGround]; } + bool isTranslucent() { return m_type->properties[ThingType::IsTranslucent]; } bool isGroundBorder() { return m_type->properties[ThingType::IsGroundBorder]; } bool isOnBottom() { return m_type->properties[ThingType::IsOnBottom]; } bool isOnTop() { return m_type->properties[ThingType::IsOnTop]; } diff --git a/src/otclient/core/thingstype.h b/src/otclient/core/thingstype.h index 2c8264db..1acd87d8 100644 --- a/src/otclient/core/thingstype.h +++ b/src/otclient/core/thingstype.h @@ -49,6 +49,9 @@ public: uint32 getSignature() { return m_signature; } bool isLoaded() { return m_loaded; } + int getFirstItemId() { return 100; } + int getMaxItemid() { return m_things[Item].size() + 100 - 1; } + private: uint32 m_signature; Boolean m_loaded; diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index 0459938e..db0e1e0a 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -114,6 +114,8 @@ void OTClient::registerLuaFunctions() g_lua.bindClassMemberFunction("isPickupable", &Thing::isPickupable); g_lua.bindClassMemberFunction("isIgnoreLook", &Thing::isIgnoreLook); g_lua.bindClassMemberFunction("isStackable", &Thing::isStackable); + g_lua.bindClassMemberFunction("isTranslucent", &Thing::isTranslucent); + g_lua.bindClassMemberFunction("isFullGround", &Thing::isFullGround); g_lua.registerClass(); g_lua.bindClassMemberFunction("getName", &Creature::getName);