瀏覽代碼

Remove flaggable bonus on object deletion

Dydzio 1 年之前
父節點
當前提交
16d25e903c
共有 3 個文件被更改,包括 18 次插入3 次删除
  1. 6 0
      lib/mapObjects/FlaggableMapObject.cpp
  2. 1 0
      lib/mapObjects/FlaggableMapObject.h
  3. 11 3
      lib/networkPacks/NetPacksLib.cpp

+ 6 - 0
lib/mapObjects/FlaggableMapObject.cpp

@@ -51,6 +51,12 @@ void FlaggableMapObject::onHeroVisit( const CGHeroInstance * h ) const
 	giveBonusTo(h->getOwner());
 }
 
+void FlaggableMapObject::markAsDeleted() const
+{
+	if(getOwner().isValidPlayer())
+		takeBonusFrom(getOwner());
+}
+
 void FlaggableMapObject::initObj(vstd::RNG & rand)
 {
 	if(getOwner().isValidPlayer())

+ 1 - 0
lib/mapObjects/FlaggableMapObject.h

@@ -28,6 +28,7 @@ public:
 	using CGObjectInstance::CGObjectInstance;
 
 	void onHeroVisit(const CGHeroInstance * h) const override;
+	void markAsDeleted() const;
 	void initObj(vstd::RNG & rand) override;
 
 	const IOwnableObject * asOwnable() const final;

+ 11 - 3
lib/networkPacks/NetPacksLib.cpp

@@ -45,6 +45,7 @@
 #include "mapObjectConstructors/CObjectClassesHandler.h"
 #include "campaign/CampaignState.h"
 #include "IGameSettings.h"
+#include "mapObjects/FlaggableMapObject.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -1184,7 +1185,6 @@ void RemoveBonus::applyGs(CGameState *gs)
 
 void RemoveObject::applyGs(CGameState *gs)
 {
-
 	CGObjectInstance *obj = gs->getObjInstance(objectID);
 	logGlobal->debug("removing object id=%d; address=%x; name=%s", objectID, (intptr_t)obj, obj->getObjectName());
 	//unblock tiles
@@ -1197,7 +1197,6 @@ void RemoveObject::applyGs(CGameState *gs)
 	{
 		auto * beatenHero = dynamic_cast<CGHeroInstance *>(obj);
 		assert(beatenHero);
-		PlayerState * p = gs->getPlayerState(beatenHero->tempOwner);
 		gs->map->heroesOnMap -= beatenHero;
 
 		auto * siegeNode = beatenHero->whereShouldBeAttachedOnSiege(gs);
@@ -1253,7 +1252,16 @@ void RemoveObject::applyGs(CGameState *gs)
 	}
 
 	if(obj->getOwner().isValidPlayer())
-		gs->getPlayerState(obj->getOwner())->removeOwnedObject(obj); //object removed via map event
+	{
+		gs->getPlayerState(obj->getOwner())->removeOwnedObject(obj); //object removed via map event or hero got beaten
+
+		FlaggableMapObject* flaggableObject = dynamic_cast<FlaggableMapObject*>(obj);
+		if(flaggableObject)
+		{
+			flaggableObject->markAsDeleted();
+		}
+	}
+
 
 	gs->map->instanceNames.erase(obj->instanceName);
 	gs->map->objects[objectID.getNum()].dellNull();