Changes for the mapeditor
This commit is contained in:
		
							parent
							
								
									7ffb760368
								
							
						
					
					
						commit
						98c4240446
					
				|  | @ -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) | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
|  |  | |||
|  | @ -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; } | ||||
| 
 | ||||
|  |  | |||
|  | @ -314,6 +314,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); | ||||
|  |  | |||
|  | @ -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; | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
|  | @ -1306,7 +1306,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++; | ||||
|     } | ||||
|  |  | |||
|  | @ -163,14 +163,15 @@ 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
 | ||||
|         bool prepend = (stackPos == -2); | ||||
|         stackPos = 0; | ||||
|         int priority = thing->getStackPriority(); | ||||
|         for(stackPos = 0; stackPos < (int)m_things.size(); ++stackPos) { | ||||
|  | @ -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,30 @@ int Tile::getThingStackpos(const ThingPtr& thing) | |||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| ThingPtr Tile::getTopThing() | ||||
| ThingPtr Tile:: getTopThing() | ||||
| { | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop() && !thing->isCreature()) | ||||
|             return thing; | ||||
|     } | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom() && !thing->isOnTop()) | ||||
|             return thing; | ||||
|     } | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(!thing->isGround() && !thing->isGroundBorder() && !thing->isOnBottom()) | ||||
|             return thing; | ||||
|     } | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(!thing->isGround() && !thing->isGroundBorder()) | ||||
|             return thing; | ||||
|     } | ||||
|     for(const ThingPtr& thing : m_things) { | ||||
|         if(!thing->isGround()) | ||||
|             return thing; | ||||
|     } | ||||
|     if(isEmpty()) | ||||
|         return nullptr; | ||||
| 
 | ||||
|     return m_things[m_things.size() - 1]; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eduardo Bart
						Eduardo Bart