Merge remote-tracking branch 'origin/master'

This commit is contained in:
BeniS 2012-07-15 23:50:36 +12:00
commit 81e6cf210e
9 changed files with 42 additions and 16 deletions

View File

@ -82,6 +82,8 @@ public:
LuaObjectPtr asLuaObject() { return shared_from_this(); }
void operator=(const LuaObject& other) { }
private:
int m_fieldsTableRef;
int m_metatableRef;

View File

@ -815,10 +815,12 @@ void UIWidget::setLayout(const UILayoutPtr& layout)
bool UIWidget::setRect(const Rect& rect)
{
/*
if(rect.width() > 8192 || rect.height() > 8192) {
g_logger.error(stdext::format("attempt to set huge rect size (%s) for %s", stdext::to_string(rect), m_id));
return false;
}
*/
// only update if the rect really changed
Rect oldRect = m_rect;
if(rect == oldRect)

View File

@ -293,3 +293,10 @@ bool Item::isMoveable()
"Invalid dat type for item %d", m_id));
return false;
}
ItemPtr Item::clone()
{
ItemPtr item = ItemPtr(new Item);
*(item.get()) = *this;
return item;
}

View File

@ -96,6 +96,7 @@ public:
uint8 getDoorId() { return m_doorId; }
bool isValid();
ItemPtr clone();
ItemPtr asItem() { return std::static_pointer_cast<Item>(shared_from_this()); }
bool isItem() { return true; }

View File

@ -315,6 +315,7 @@ void OTClient::registerLuaFunctions()
g_lua.registerClass<Item, Thing>();
g_lua.bindClassStaticFunction<Item>("create", &Item::create);
g_lua.bindClassMemberFunction<Item>("clone", &Item::clone);
g_lua.bindClassMemberFunction<Item>("setCount", &Item::setCount);
g_lua.bindClassMemberFunction<Item>("getCount", &Item::getCount);
g_lua.bindClassMemberFunction<Item>("getId", &Item::getId);

View File

@ -218,7 +218,7 @@ void Map::loadOtbm(const std::string& fileName)
} else if(item->isDoor())
house->addDoor(item->getDoorId(), pos);
} else if(tile)
addThing(item, pos, 255);
addThing(item, pos);
else if(item->isGround())
ground = item;
else
@ -438,7 +438,7 @@ bool Map::loadOtcm(const std::string& fileName)
item->setCountOrSubType(countOrSubType);
if(item->isValid())
addThing(item, pos, 255);
addThing(item, pos);
}
}
@ -632,7 +632,7 @@ bool Map::removeThing(const ThingPtr& thing)
m_staticTexts.erase(it);
return true;
}
} else if(TilePtr tile = thing->getTile())
} else if(const TilePtr& tile = thing->getTile())
return tile->removeThing(thing);
return false;
@ -651,7 +651,7 @@ TilePtr Map::createTileEx(const Position& pos, const Items&... items)
TilePtr tile = getOrCreateTile(pos);
auto vec = {items...};
for (auto it : vec)
addThing(it, pos, 255);
addThing(it, pos);
return tile;
}

View File

@ -512,7 +512,7 @@ void ProtocolGame::parseCreatureMove(const InputMessagePtr& msg)
if(!g_map.removeThing(thing))
g_logger.traceError("could not remove thing");
g_map.addThing(thing, newPos);
g_map.addThing(thing, newPos, -1);
}
void ProtocolGame::parseOpenContainer(const InputMessagePtr& msg)
@ -1307,7 +1307,7 @@ void ProtocolGame::setTileDescription(const InputMessagePtr& msg, Position posit
g_logger.traceError(stdext::format("too many things, stackpos=%d, pos=%s", stackPos, stdext::to_string(position)));
ThingPtr thing = getThing(msg);
g_map.addThing(thing, position, -1);
g_map.addThing(thing, position, -2);
}
stackPos++;
}

View File

@ -163,16 +163,17 @@ ThingPtr Tile::addThing(const ThingPtr& thing, int stackPos)
return nullptr;
}
// the items stackpos follows this order:
// 0 - ground
// 1 - ground borders
// 2 - bottom (walls)
// 3 - on top (doors)
// 4 - creatures, from top to bottom
// 5 - items, from top to bottom
if(stackPos < 0) {
// the items stackpos follows this order:
// 0 - ground
// 1 - ground borders
// 2 - bottom (walls)
// 3 - on top (doors)
// 4 - creatures, from top to bottom
// 5 - items, from top to bottom
stackPos = 0;
int priority = thing->getStackPriority();
bool prepend = (stackPos == -2 || priority <= 3);
for(stackPos = 0; stackPos < (int)m_things.size(); ++stackPos) {
int otherPriority = m_things[stackPos]->getStackPriority();
if(!g_game.getFeature(Otc::GameReverseCreatureStack)) {
@ -180,7 +181,7 @@ ThingPtr Tile::addThing(const ThingPtr& thing, int stackPos)
if(priority == 4 && otherPriority == 4)
break;
}
if(otherPriority > priority)
if((prepend && otherPriority > priority) || (!prepend && otherPriority >= priority))
break;
}
} else if(stackPos > (int)m_things.size())
@ -233,6 +234,14 @@ ThingPtr Tile::getThing(int stackPos)
return nullptr;
}
EffectPtr Tile::getEffect(uint16 id)
{
for(const EffectPtr& effect : m_effects)
if(effect->getId() == id)
return effect;
return nullptr;
}
bool Tile::hasThing(const ThingPtr& thing)
{
return std::find(m_things.begin(), m_things.end(), thing) != m_things.end();
@ -246,11 +255,14 @@ int Tile::getThingStackpos(const ThingPtr& thing)
return -1;
}
ThingPtr Tile::getTopThing()
ThingPtr Tile:: getTopThing()
{
if(isEmpty())
return nullptr;
for(const ThingPtr& thing : m_things) {
if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop() && !thing->isCreature())
return thing;
}
return m_things[m_things.size() - 1];
}

View File

@ -66,6 +66,7 @@ public:
ThingPtr addThing(const ThingPtr& thing, int stackPos = -1);
bool removeThing(ThingPtr thing);
ThingPtr getThing(int stackPos);
EffectPtr getEffect(uint16 id);
bool hasThing(const ThingPtr& thing);
int getThingStackpos(const ThingPtr& thing);
ThingPtr getTopThing();