nordsoft пре 2 година
родитељ
комит
22da7a931d

+ 3 - 0
lib/NetPacksLib.cpp

@@ -1176,6 +1176,7 @@ void RemoveObject::applyGs(CGameState *gs)
 		//If hero on Boat is removed, the Boat disappears
 		if(beatenHero->boat)
 		{
+			beatenHero->detachFrom(const_cast<CGBoat&>(*beatenHero->boat));
 			gs->map->instanceNames.erase(beatenHero->boat->instanceName);
 			gs->map->objects[beatenHero->boat->id.getNum()].dellNull();
 			beatenHero->boat = nullptr;
@@ -1291,6 +1292,7 @@ void TryMoveHero::applyGs(CGameState *gs)
 
 		gs->map->removeBlockVisTiles(boat); //hero blockvis mask will be used, we don't need to duplicate it with boat
 		h->boat = boat;
+		h->attachTo(*boat);
 		boat->hero = h;
 	}
 	else if(result == DISEMBARK) //hero leaves boat to destination tile
@@ -1300,6 +1302,7 @@ void TryMoveHero::applyGs(CGameState *gs)
 		b->pos = start;
 		b->hero = nullptr;
 		gs->map->addBlockVisTiles(b);
+		h->detachFrom(*b);
 		h->boat = nullptr;
 	}
 

+ 4 - 0
lib/mapObjects/CommonConstructors.cpp

@@ -268,6 +268,7 @@ void BoatInstanceConstructor::initTypeData(const JsonNode & input)
 	overlayAnimation = input["overlayAnimation"].String();
 	for(int i = 0; i < flagAnimations.size() && i < input["flagAnimations"].Vector().size(); ++i)
 		flagAnimations[i] = input["flagAnimations"].Vector()[i].String();
+	bonuses = JsonRandom::loadBonuses(input["bonuses"]);
 }
 
 CGObjectInstance * BoatInstanceConstructor::create(std::shared_ptr<const ObjectTemplate> tmpl) const
@@ -277,6 +278,9 @@ CGObjectInstance * BoatInstanceConstructor::create(std::shared_ptr<const ObjectT
 	boat->actualAnimation = actualAnimation;
 	boat->overlayAnimation = overlayAnimation;
 	boat->flagAnimations = flagAnimations;
+	for(auto & b : bonuses)
+		boat->addNewBonus(std::make_shared<Bonus>(b));
+	
 	return boat;
 }
 

+ 2 - 0
lib/mapObjects/CommonConstructors.h

@@ -145,7 +145,9 @@ class BoatInstanceConstructor : public CDefaultObjectTypeHandler<CGBoat>
 protected:
 	void initTypeData(const JsonNode & config) override;
 	
+	std::vector<Bonus> bonuses;
 	EPathfindingLayer layer;
+	
 	std::string actualAnimation; //for OH3 boats those have actual animations
 	std::string overlayAnimation; //waves animations
 	std::array<std::string, PlayerColor::PLAYER_LIMIT_I> flagAnimations;

+ 2 - 2
lib/mapObjects/JsonRandom.cpp

@@ -312,8 +312,8 @@ namespace JsonRandom
 		std::vector<Bonus> ret;
 		for (const JsonNode & entry : value.Vector())
 		{
-			auto bonus = JsonUtils::parseBonus(entry);
-			ret.push_back(*bonus);
+			if(auto bonus = JsonUtils::parseBonus(entry))
+				ret.push_back(*bonus);
 		}
 		return ret;
 	}

+ 5 - 1
lib/mapObjects/MiscObjects.h

@@ -414,7 +414,7 @@ public:
 	}
 };
 
-class DLL_LINKAGE CGBoat : public CGObjectInstance
+class DLL_LINKAGE CGBoat : public CGObjectInstance, public CBonusSystemNode
 {
 public:
 	ui8 direction;
@@ -438,9 +438,13 @@ public:
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 		h & static_cast<CGObjectInstance&>(*this);
+		h & static_cast<CBonusSystemNode&>(*this);
 		h & direction;
 		h & hero;
 		h & layer;
+		h & actualAnimation;
+		h & overlayAnimation;
+		h & flagAnimations;
 	}
 };
 

+ 2 - 2
server/CGameHandler.cpp

@@ -2266,8 +2266,8 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo
 	const bool embarking = !h->boat && !t.visitableObjects.empty() && t.visitableObjects.back()->ID == Obj::TRANSPORT;
 	const bool disembarking = h->boat
 		&& t.terType->isLand()
-		&& (h->boat->layer == EPathfindingLayer::SAIL || dst == h->pos)
-		&& !t.blocked;
+		&& (dst == h->pos
+			|| (h->boat->layer == EPathfindingLayer::SAIL && !t.blocked));
 
 	//result structure for start - movement failed, no move points used
 	TryMoveHero tmh;