1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-24 08:32:34 +02:00

Merge pull request #673 from ShubusCorporation/do/fix/creature_not_a_shooter_siege_crashes

Fix: Siege crashes when creature on the archer's tower is not a shooter
This commit is contained in:
Alexander Shishkin 2021-01-17 19:29:46 +03:00 committed by GitHub
commit 2f5c8d7587
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 4 deletions

View File

@ -758,11 +758,19 @@ bool CShootingAnimation::init()
// If the creature id is 149 then it's a arrow tower which has no additional info so get the // If the creature id is 149 then it's a arrow tower which has no additional info so get the
// actual arrow tower shooter instead. // actual arrow tower shooter instead.
const CCreature *shooterInfo = shooter->getCreature(); const CCreature *shooterInfo = shooter->getCreature();
if (shooterInfo->idNumber == CreatureID::ARROW_TOWERS)
if(shooterInfo->idNumber == CreatureID::ARROW_TOWERS)
{ {
int creID = owner->siegeH->town->town->clientInfo.siegeShooter; int creID = owner->siegeH->town->town->clientInfo.siegeShooter;
shooterInfo = CGI->creh->creatures[creID]; shooterInfo = CGI->creh->creatures[creID];
} }
if(!shooterInfo->animation.missleFrameAngles.size())
logAnim->error("Mod error: Creature '%s' on the Archer's tower is not a shooter. Mod should be fixed. Trying to use archer's data instead..."
, shooterInfo->nameSing);
auto & angles = shooterInfo->animation.missleFrameAngles.size()
? shooterInfo->animation.missleFrameAngles
: CGI->creh->creatures[CreatureID::ARCHER]->animation.missleFrameAngles;
ProjectileInfo spi; ProjectileInfo spi;
spi.shotDone = false; spi.shotDone = false;
@ -844,8 +852,6 @@ bool CShootingAnimation::init()
owner->addNewAnim( new CEffectAnimation(owner, catapultDamage ? "SGEXPL.DEF" : "CSGRCK.DEF", animPos.x, animPos.y)); owner->addNewAnim( new CEffectAnimation(owner, catapultDamage ? "SGEXPL.DEF" : "CSGRCK.DEF", animPos.x, animPos.y));
} }
auto & angles = shooterInfo->animation.missleFrameAngles;
double pi = boost::math::constants::pi<double>(); double pi = boost::math::constants::pi<double>();
if (owner->idToProjectile.count(spi.creID) == 0) //in some cases (known one: hero grants shooter bonus to unit) the shooter stack's projectile may not be properly initialized if (owner->idToProjectile.count(spi.creID) == 0) //in some cases (known one: hero grants shooter bonus to unit) the shooter stack's projectile may not be properly initialized

View File

@ -815,7 +815,13 @@ void CTownHandler::loadSiegeScreen(CTown &town, const JsonNode & source)
town.clientInfo.siegePrefix = source["imagePrefix"].String(); town.clientInfo.siegePrefix = source["imagePrefix"].String();
VLC->modh->identifiers.requestIdentifier("creature", source["shooter"], [&town](si32 creature) VLC->modh->identifiers.requestIdentifier("creature", source["shooter"], [&town](si32 creature)
{ {
town.clientInfo.siegeShooter = CreatureID(creature); auto crId = CreatureID(creature);
if(!VLC->creh->creatures[crId]->animation.missleFrameAngles.size())
logMod->error("Mod '%s' error: Creature '%s' on the Archer's tower is not a shooter. Mod should be fixed. Siege will not work properly!"
, town.faction->name
, VLC->creh->creatures[crId]->nameSing);
town.clientInfo.siegeShooter = crId;
}); });
auto & pos = town.clientInfo.siegePositions; auto & pos = town.clientInfo.siegePositions;

View File

@ -1046,6 +1046,7 @@ public:
enum ECreatureID enum ECreatureID
{ {
NONE = -1, NONE = -1,
ARCHER = 2,
CAVALIER = 10, CAVALIER = 10,
CHAMPION = 11, CHAMPION = 11,
STONE_GOLEM = 32, STONE_GOLEM = 32,