mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-26 03:52:01 +02:00
Fix possible assertion failure on removing non-owned town
This commit is contained in:
parent
4fd5a2b3ea
commit
1cbc6457ce
@ -448,6 +448,12 @@ void AIGateway::battleResultsApplied()
|
|||||||
status.setBattle(NO_BATTLE);
|
status.setBattle(NO_BATTLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AIGateway::beforeObjectPropertyChanged(const SetObjectProperty * sop)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AIGateway::objectPropertyChanged(const SetObjectProperty * sop)
|
void AIGateway::objectPropertyChanged(const SetObjectProperty * sop)
|
||||||
{
|
{
|
||||||
LOG_TRACE(logAi);
|
LOG_TRACE(logAi);
|
||||||
|
@ -161,6 +161,7 @@ public:
|
|||||||
void heroManaPointsChanged(const CGHeroInstance * hero) override;
|
void heroManaPointsChanged(const CGHeroInstance * hero) override;
|
||||||
void heroSecondarySkillChanged(const CGHeroInstance * hero, int which, int val) override;
|
void heroSecondarySkillChanged(const CGHeroInstance * hero, int which, int val) override;
|
||||||
void battleResultsApplied() override;
|
void battleResultsApplied() override;
|
||||||
|
void beforeObjectPropertyChanged(const SetObjectProperty * sop) override;
|
||||||
void objectPropertyChanged(const SetObjectProperty * sop) override;
|
void objectPropertyChanged(const SetObjectProperty * sop) override;
|
||||||
void buildChanged(const CGTownInstance * town, BuildingID buildingID, int what) override;
|
void buildChanged(const CGTownInstance * town, BuildingID buildingID, int what) override;
|
||||||
void heroBonusChanged(const CGHeroInstance * hero, const Bonus & bonus, bool gain) override;
|
void heroBonusChanged(const CGHeroInstance * hero, const Bonus & bonus, bool gain) override;
|
||||||
|
@ -538,6 +538,11 @@ void VCAI::battleResultsApplied()
|
|||||||
status.setBattle(NO_BATTLE);
|
status.setBattle(NO_BATTLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VCAI::beforeObjectPropertyChanged(const SetObjectProperty * sop)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void VCAI::objectPropertyChanged(const SetObjectProperty * sop)
|
void VCAI::objectPropertyChanged(const SetObjectProperty * sop)
|
||||||
{
|
{
|
||||||
LOG_TRACE(logAi);
|
LOG_TRACE(logAi);
|
||||||
|
@ -194,6 +194,7 @@ public:
|
|||||||
void heroManaPointsChanged(const CGHeroInstance * hero) override;
|
void heroManaPointsChanged(const CGHeroInstance * hero) override;
|
||||||
void heroSecondarySkillChanged(const CGHeroInstance * hero, int which, int val) override;
|
void heroSecondarySkillChanged(const CGHeroInstance * hero, int which, int val) override;
|
||||||
void battleResultsApplied() override;
|
void battleResultsApplied() override;
|
||||||
|
void beforeObjectPropertyChanged(const SetObjectProperty * sop) override;
|
||||||
void objectPropertyChanged(const SetObjectProperty * sop) override;
|
void objectPropertyChanged(const SetObjectProperty * sop) override;
|
||||||
void buildChanged(const CGTownInstance * town, BuildingID buildingID, int what) override;
|
void buildChanged(const CGTownInstance * town, BuildingID buildingID, int what) override;
|
||||||
void heroBonusChanged(const CGHeroInstance * hero, const Bonus & bonus, bool gain) override;
|
void heroBonusChanged(const CGHeroInstance * hero, const Bonus & bonus, bool gain) override;
|
||||||
|
@ -1317,11 +1317,8 @@ void CPlayerInterface::heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanc
|
|||||||
GH.windows().createAndPushWindow<CExchangeWindow>(hero1, hero2, query);
|
GH.windows().createAndPushWindow<CExchangeWindow>(hero1, hero2, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayerInterface::objectPropertyChanged(const SetObjectProperty * sop)
|
void CPlayerInterface::beforeObjectPropertyChanged(const SetObjectProperty * sop)
|
||||||
{
|
{
|
||||||
EVENT_HANDLER_CALLED_BY_CLIENT;
|
|
||||||
|
|
||||||
//redraw minimap if owner changed
|
|
||||||
if (sop->what == ObjProperty::OWNER)
|
if (sop->what == ObjProperty::OWNER)
|
||||||
{
|
{
|
||||||
const CGObjectInstance * obj = cb->getObj(sop->id);
|
const CGObjectInstance * obj = cb->getObj(sop->id);
|
||||||
@ -1331,13 +1328,34 @@ void CPlayerInterface::objectPropertyChanged(const SetObjectProperty * sop)
|
|||||||
auto town = static_cast<const CGTownInstance *>(obj);
|
auto town = static_cast<const CGTownInstance *>(obj);
|
||||||
|
|
||||||
if(obj->tempOwner == playerID)
|
if(obj->tempOwner == playerID)
|
||||||
localState->addOwnedTown(town);
|
{
|
||||||
else
|
|
||||||
localState->removeOwnedTown(town);
|
localState->removeOwnedTown(town);
|
||||||
|
adventureInt->onTownChanged(town);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
adventureInt->onTownChanged(town);
|
void CPlayerInterface::objectPropertyChanged(const SetObjectProperty * sop)
|
||||||
|
{
|
||||||
|
EVENT_HANDLER_CALLED_BY_CLIENT;
|
||||||
|
|
||||||
|
if (sop->what == ObjProperty::OWNER)
|
||||||
|
{
|
||||||
|
const CGObjectInstance * obj = cb->getObj(sop->id);
|
||||||
|
|
||||||
|
if(obj->ID == Obj::TOWN)
|
||||||
|
{
|
||||||
|
auto town = static_cast<const CGTownInstance *>(obj);
|
||||||
|
|
||||||
|
if(obj->tempOwner == playerID)
|
||||||
|
{
|
||||||
|
localState->addOwnedTown(town);
|
||||||
|
adventureInt->onTownChanged(town);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//redraw minimap if owner changed
|
||||||
std::set<int3> pos = obj->getBlockedPos();
|
std::set<int3> pos = obj->getBlockedPos();
|
||||||
std::unordered_set<int3> upos(pos.begin(), pos.end());
|
std::unordered_set<int3> upos(pos.begin(), pos.end());
|
||||||
adventureInt->onMapTilesChanged(upos);
|
adventureInt->onMapTilesChanged(upos);
|
||||||
|
@ -144,6 +144,7 @@ protected: // Call-ins from server, should not be called directly, but only via
|
|||||||
void requestRealized(PackageApplied *pa) override;
|
void requestRealized(PackageApplied *pa) override;
|
||||||
void heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID query) override;
|
void heroExchangeStarted(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID query) override;
|
||||||
void centerView (int3 pos, int focusTime) override;
|
void centerView (int3 pos, int focusTime) override;
|
||||||
|
void beforeObjectPropertyChanged(const SetObjectProperty * sop) override;
|
||||||
void objectPropertyChanged(const SetObjectProperty * sop) override;
|
void objectPropertyChanged(const SetObjectProperty * sop) override;
|
||||||
void objectRemoved(const CGObjectInstance *obj) override;
|
void objectRemoved(const CGObjectInstance *obj) override;
|
||||||
void objectRemovedAfter() override;
|
void objectRemovedAfter() override;
|
||||||
|
@ -128,4 +128,5 @@ public:
|
|||||||
virtual void visitBattleStackMoved(BattleStackMoved & pack) override;
|
virtual void visitBattleStackMoved(BattleStackMoved & pack) override;
|
||||||
virtual void visitBattleAttack(BattleAttack & pack) override;
|
virtual void visitBattleAttack(BattleAttack & pack) override;
|
||||||
virtual void visitStartAction(StartAction & pack) override;
|
virtual void visitStartAction(StartAction & pack) override;
|
||||||
};
|
virtual void visitSetObjectProperty(SetObjectProperty & pack) override;
|
||||||
|
};
|
||||||
|
@ -611,6 +611,20 @@ void ApplyClientNetPackVisitor::visitInfoWindow(InfoWindow & pack)
|
|||||||
logNetwork->warn("We received InfoWindow for not our player...");
|
logNetwork->warn("We received InfoWindow for not our player...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ApplyFirstClientNetPackVisitor::visitSetObjectProperty(SetObjectProperty & pack)
|
||||||
|
{
|
||||||
|
//inform all players that see this object
|
||||||
|
for(auto it = cl.playerint.cbegin(); it != cl.playerint.cend(); ++it)
|
||||||
|
{
|
||||||
|
if(gs.isVisible(gs.getObjInstance(pack.id), it->first))
|
||||||
|
callInterfaceIfPresent(cl, it->first, &IGameEventsReceiver::beforeObjectPropertyChanged, &pack);
|
||||||
|
}
|
||||||
|
|
||||||
|
// invalidate section of map view with our object and force an update with new flag color
|
||||||
|
if (pack.what == ObjProperty::OWNER)
|
||||||
|
CGI->mh->onObjectInstantRemove(gs.getObjInstance(pack.id));
|
||||||
|
}
|
||||||
|
|
||||||
void ApplyClientNetPackVisitor::visitSetObjectProperty(SetObjectProperty & pack)
|
void ApplyClientNetPackVisitor::visitSetObjectProperty(SetObjectProperty & pack)
|
||||||
{
|
{
|
||||||
//inform all players that see this object
|
//inform all players that see this object
|
||||||
@ -620,12 +634,9 @@ void ApplyClientNetPackVisitor::visitSetObjectProperty(SetObjectProperty & pack)
|
|||||||
callInterfaceIfPresent(cl, it->first, &IGameEventsReceiver::objectPropertyChanged, &pack);
|
callInterfaceIfPresent(cl, it->first, &IGameEventsReceiver::objectPropertyChanged, &pack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// invalidate section of map view with our object and force an update with new flag color
|
||||||
if (pack.what == ObjProperty::OWNER)
|
if (pack.what == ObjProperty::OWNER)
|
||||||
{
|
|
||||||
// invalidate section of map view with our object and force an update with new flag color
|
|
||||||
CGI->mh->onObjectInstantRemove(gs.getObjInstance(pack.id));
|
|
||||||
CGI->mh->onObjectInstantAdd(gs.getObjInstance(pack.id));
|
CGI->mh->onObjectInstantAdd(gs.getObjInstance(pack.id));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplyClientNetPackVisitor::visitHeroLevelUp(HeroLevelUp & pack)
|
void ApplyClientNetPackVisitor::visitHeroLevelUp(HeroLevelUp & pack)
|
||||||
|
@ -127,6 +127,7 @@ public:
|
|||||||
virtual void playerBonusChanged(const Bonus &bonus, bool gain){};//if gain hero received bonus, else he lost it
|
virtual void playerBonusChanged(const Bonus &bonus, bool gain){};//if gain hero received bonus, else he lost it
|
||||||
virtual void requestSent(const CPackForServer *pack, int requestID){};
|
virtual void requestSent(const CPackForServer *pack, int requestID){};
|
||||||
virtual void requestRealized(PackageApplied *pa){};
|
virtual void requestRealized(PackageApplied *pa){};
|
||||||
|
virtual void beforeObjectPropertyChanged(const SetObjectProperty * sop){}; //eg. mine has been flagged
|
||||||
virtual void objectPropertyChanged(const SetObjectProperty * sop){}; //eg. mine has been flagged
|
virtual void objectPropertyChanged(const SetObjectProperty * sop){}; //eg. mine has been flagged
|
||||||
virtual void objectRemoved(const CGObjectInstance *obj){}; //eg. collected resource, picked artifact, beaten hero
|
virtual void objectRemoved(const CGObjectInstance *obj){}; //eg. collected resource, picked artifact, beaten hero
|
||||||
virtual void objectRemovedAfter(){}; //eg. collected resource, picked artifact, beaten hero
|
virtual void objectRemovedAfter(){}; //eg. collected resource, picked artifact, beaten hero
|
||||||
|
Loading…
x
Reference in New Issue
Block a user