From: <ral...@us...> - 2014-04-26 15:35:36
|
Revision: 9478 http://sourceforge.net/p/planeshift/code/9478 Author: ralphcampbell Date: 2014-04-26 15:35:33 +0000 (Sat, 26 Apr 2014) Log Message: ----------- If the target of an attack is deleted (logout), then return the attacker to the peaceful state. The problem was that the psCombatAttackGameEvent used iDeleteObjectCallback incorrectly to clear both attacker and target pointers instead of just the target. When the event triggered, the attacker's pointer wasn't available to clear the combat state even though the attacker's object wasn't deleted (just the target was). Modified Paths: -------------- trunk/src/server/bulkobjects/psattack.cpp trunk/src/server/bulkobjects/psattack.h trunk/src/server/combatmanager.cpp trunk/src/server/entitymanager.cpp trunk/src/server/gem.cpp trunk/src/server/gem.h Modified: trunk/src/server/bulkobjects/psattack.cpp =================================================================== --- trunk/src/server/bulkobjects/psattack.cpp 2014-04-24 23:07:56 UTC (rev 9477) +++ trunk/src/server/bulkobjects/psattack.cpp 2014-04-26 15:35:33 UTC (rev 9478) @@ -176,6 +176,11 @@ if(!attacker || !target) { Debug2(LOG_COMBAT,event->GetAttackerID(),"Attacker ID: %d. Combat stopped as one participant logged off.",event->GetAttackerID()); + if(attacker) + { + attacker->EndAttack(); + psserver->GetCombatManager()->StopAttack(attacker); + } return; } @@ -703,20 +708,12 @@ AttackLocation = PSCHARACTER_SLOT_NONE; FinalDamage = -1; - - target->RegisterCallback(this); - attacker->RegisterCallback(this); } psCombatAttackGameEvent::~psCombatAttackGameEvent() { - if(target) - { - target->UnregisterCallback(this); - } if(attacker) { - attacker->UnregisterCallback(this); if(attack && attack->GetID() != 1) { psCharacter* attacker_data = attacker->GetCharacterData(); @@ -725,20 +722,6 @@ } } -void psCombatAttackGameEvent::DeleteObjectCallback(iDeleteNotificationObject* object) -{ - if(target) - { - target->UnregisterCallback(this); - target = NULL; - } - if(attacker) - { - attacker->UnregisterCallback(this); - attacker = NULL; - } -} - void psCombatAttackGameEvent::Trigger() { if(attack->GetID() != 1 && attacker) Modified: trunk/src/server/bulkobjects/psattack.h =================================================================== --- trunk/src/server/bulkobjects/psattack.h 2014-04-24 23:07:56 UTC (rev 9477) +++ trunk/src/server/bulkobjects/psattack.h 2014-04-26 15:35:33 UTC (rev 9478) @@ -175,7 +175,7 @@ /** * This event actually triggers an attack */ -class psCombatAttackGameEvent : public psGameEvent, public iDeleteObjectCallback +class psCombatAttackGameEvent : public psGameEvent { public: psCombatAttackGameEvent(csTicks delayticks, @@ -189,8 +189,6 @@ virtual void Trigger(); // Abstract event processing function - virtual void DeleteObjectCallback(iDeleteNotificationObject* object); - psAttack* GetAttack() { return attack; Modified: trunk/src/server/combatmanager.cpp =================================================================== --- trunk/src/server/combatmanager.cpp 2014-04-24 23:07:56 UTC (rev 9477) +++ trunk/src/server/combatmanager.cpp 2014-04-26 15:35:33 UTC (rev 9478) @@ -223,7 +223,6 @@ if(weapon && weapon->CheckRequirements(attackerChar, response)) { Debug5(LOG_COMBAT,attacker->GetClientID(),"%s tries to attack with %s weapon %s at %.2f range", attacker->GetName(),(weapon->GetIsRangeWeapon()?"range":"melee"),weapon->GetName(), attacker->RangeTo(target,false)); - Debug3(LOG_COMBAT,attacker->GetClientID(),"%s started attacking with %s",attacker->GetName(), weapon->GetName()); //start the first attack attack->Attack(attacker, target, weaponSlot); startedAttacking = true; Modified: trunk/src/server/entitymanager.cpp =================================================================== --- trunk/src/server/entitymanager.cpp 2014-04-24 23:07:56 UTC (rev 9477) +++ trunk/src/server/entitymanager.cpp 2014-04-26 15:35:33 UTC (rev 9478) @@ -1191,7 +1191,6 @@ psserver->GetNPCManager()->RemoveEntity(msg.msg); delete actor; - actor = NULL; return true; } Modified: trunk/src/server/gem.cpp =================================================================== --- trunk/src/server/gem.cpp 2014-04-24 23:07:56 UTC (rev 9477) +++ trunk/src/server/gem.cpp 2014-04-26 15:35:33 UTC (rev 9478) @@ -3042,7 +3042,7 @@ } lasttime = lasthit->TimeOfAttack(); - if(lasthit->Attacker().IsValid()) + if(lasthit->Attacker()) { lastAttacker = lasthit->Attacker(); } Modified: trunk/src/server/gem.h =================================================================== --- trunk/src/server/gem.h 2014-04-24 23:07:56 UTC (rev 9477) +++ trunk/src/server/gem.h 2014-04-26 15:35:33 UTC (rev 9478) @@ -1085,7 +1085,7 @@ public: virtual ~AttackerHistory() {} - csWeakRef<gemActor> Attacker() const + gemActor* Attacker() const { return attacker_ref; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |