From cd8eeb454b137daf85428aaaaac598188102cbb7 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 7 Dec 2009 13:14:04 +0000 Subject: [PATCH] - fix: berlios Bug #16404 : turrets give error with shipBeingAttacked. Now 'whom' is set correctly when a ship is hit by turrets' plasma fire. - fix: shipBeingAttacked should only fire once now. git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@2855 127b21dd-08f5-0310-b4b7-95ae10353056 --- src/Core/Entities/ShipEntity.m | 36 ++++++++++++++++++++++------------ src/Core/Scripting/OOJSShip.m | 2 +- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/Core/Entities/ShipEntity.m b/src/Core/Entities/ShipEntity.m index 81fa463a..1713f3a1 100644 --- a/src/Core/Entities/ShipEntity.m +++ b/src/Core/Entities/ShipEntity.m @@ -8019,9 +8019,11 @@ BOOL class_masslocks(int some_class) being_mined = NO; ShipEntity *hunter = nil; - if ([other isShip] && [self owner] != other) // our owner could be the same entity as the one responsible for our taking damage in the case of submunitions + hunter = [other rootShipEntity]; + if (hunter == nil && [other isShip]) hunter = (ShipEntity *)other; + + if (hunter !=nil && [self owner] != hunter) // our owner could be the same entity as the one responsible for our taking damage in the case of submunitions { - hunter = (ShipEntity *)other; if ([hunter isCloaked]) { [self doScriptEvent:@"shipBeingAttackedByCloaked" andReactToAIMessage:@"ATTACKED_BY_CLOAKED"]; @@ -8031,6 +8033,8 @@ BOOL class_masslocks(int some_class) hunter = nil; } } + else + hunter = nil; // if the other entity is a ship note it as an aggressor if (hunter != nil) @@ -8049,20 +8053,23 @@ BOOL class_masslocks(int some_class) // tell ourselves we've been attacked if (energy > 0) { - [self respondToAttackFrom:ent becauseOf:other]; + [self respondToAttackFrom:ent becauseOf:hunter]; } - // tell our group we've been attacked + // additionally, tell our group we've been attacked OOShipGroup *group = [self group]; if (group != nil && group != [hunter group] && !(iAmTheLaw || uAreTheLaw)) { if ([self isTrader] || [self isEscort]) { ShipEntity *groupLeader = [group leader]; - [groupLeader setFound_target:hunter]; - [groupLeader setPrimaryAggressor:hunter]; - [groupLeader respondToAttackFrom:ent becauseOf:hunter]; - //unsetting group leader for carriers can break stuff + if (groupLeader != self) + { + [groupLeader setFound_target:hunter]; + [groupLeader setPrimaryAggressor:hunter]; + [groupLeader respondToAttackFrom:ent becauseOf:hunter]; + //unsetting group leader for carriers can break stuff + } } if ([self isPirate]) { @@ -8071,7 +8078,7 @@ BOOL class_masslocks(int some_class) for (groupEnum = [group objectEnumerator]; (otherPirate = [groupEnum nextObject]); ) { - if (randf() < 0.5) // 50% chance they'll help + if (otherPirate != self && randf() < 0.5) // 50% chance they'll help { [otherPirate setFound_target:hunter]; [otherPirate setPrimaryAggressor:hunter]; @@ -8086,9 +8093,12 @@ BOOL class_masslocks(int some_class) for (groupEnum = [group objectEnumerator]; (otherPolice = [groupEnum nextObject]); ) { - [otherPolice setFound_target:hunter]; - [otherPolice setPrimaryAggressor:hunter]; - [otherPolice respondToAttackFrom:ent becauseOf:hunter]; + if (otherPolice != self) + { + [otherPolice setFound_target:hunter]; + [otherPolice setPrimaryAggressor:hunter]; + [otherPolice respondToAttackFrom:ent becauseOf:hunter]; + } } } } @@ -8109,7 +8119,7 @@ BOOL class_masslocks(int some_class) } } - if ((other)&&(other->isShip)) + if ((other)&&([other isShip])) being_mined = [(ShipEntity *)other isMining]; } // die if I'm out of energy diff --git a/src/Core/Scripting/OOJSShip.m b/src/Core/Scripting/OOJSShip.m index 6efd3556..196afdaf 100644 --- a/src/Core/Scripting/OOJSShip.m +++ b/src/Core/Scripting/OOJSShip.m @@ -1093,7 +1093,7 @@ static JSBool ShipSpawn(JSContext *context, JSObject *this, uintN argc, jsval *a if (argc > 1) gotCount = JS_ValueToInt32(context, argv[1], &count); if (EXPECT_NOT(role == nil || !gotCount || count < 1 || count > 64)) { - OOReportJSBadArguments(context, @"Ship", @"spawn", argc, argv, nil, @"role and optional positive count no greater than 64"); + OOReportJSBadArguments(context, @"Ship", @"spawn", argc, argv, nil, @"role and optional quantity (1 to 64)"); return NO; }