From: <Kha...@us...> - 2009-03-19 19:39:36
|
Revision: 3242 http://planeshift.svn.sourceforge.net/planeshift/?rev=3242&view=rev Author: KhakiLord Date: 2009-03-19 19:39:25 +0000 (Thu, 19 Mar 2009) Log Message: ----------- Fixes to NPC chasing behaviour. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-03-19 18:34:54 UTC (rev 3241) +++ trunk/src/npcclient/npcoperations.cpp 2009-03-19 19:39:25 UTC (rev 3242) @@ -2069,22 +2069,25 @@ npc->Printf("ChaseOperation: target's sector is not connected to ours!"); return true; // This operation is complete } + if ( Calc2DDistance( myPos, targetPos ) < sqrt((offset.x * offset.x)+(offset.z * offset.z)) ) + { + return true; // This operation is complete + } // This prevents NPCs from wanting to occupy the same physical space as something else csVector3 displacement = targetPos - myPos; + displacement.y = 0; float factor = sqrt((offset.x * offset.x)+(offset.z * offset.z)) / displacement.Norm(); - targetPos = myPos + (1 - factor) * displacement; + csVector3 destPos = myPos + (1 - factor) * displacement; + destPos.y = targetPos.y; path.SetMaps(npcclient->GetMaps()); - path.SetDest(targetPos); + path.SetDest(destPos); path.CalcLocalDest(myPos, mySector, localDest); - if ( Calc2DDistance( myPos, targetPos ) < 0.5 ) + + if ( GetAngularVelocity(npc) > 0 || GetVelocity(npc) > 0 ) { - return true; // This operation is complete - } - else if ( GetAngularVelocity(npc) > 0 || GetVelocity(npc) > 0 ) - { StartMoveTo(npc, eventmgr, localDest, targetSector, GetVelocity(npc), action, false); return false; } @@ -2158,7 +2161,9 @@ // This prevents NPCs from wanting to occupy the same physical space as something else csVector3 displacement = targetPos - myPos; + displacement.y = 0; float distance = displacement.Norm(); + if ( (chaseRange > 0 && distance > chaseRange) || (targetInstance != myInstance) ) { npc->Printf(5, "Target out of chase range -> we are done.."); @@ -2174,6 +2179,7 @@ float factor = sqrt((offset.x * offset.x)+(offset.z * offset.z)) / distance; targetPos = myPos + (1 - factor) * displacement; + targetPos.y = myPos.y; npc->Printf(10, "Still chasing %s at %s...",(const char *)name,toString(targetPos,targetSector).GetDataSafe()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-03-20 15:24:23
|
Revision: 3248 http://planeshift.svn.sourceforge.net/planeshift/?rev=3248&view=rev Author: KhakiLord Date: 2009-03-20 15:24:14 +0000 (Fri, 20 Mar 2009) Log Message: ----------- Fixed npcclient crashes that were referencing a deleted object in MeleeOperation. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-03-20 15:01:45 UTC (rev 3247) +++ trunk/src/npcclient/npcoperations.cpp 2009-03-20 15:24:14 UTC (rev 3248) @@ -2666,6 +2666,7 @@ } if (ent != attacked_ent) { + attacked_ent = ent; if (attacked_ent) { npc->Printf(5, "Melee switching to attack %s(%s)", attacked_ent->GetName(), ShowID(attacked_ent->GetEID())); @@ -2674,7 +2675,6 @@ { npc->Printf(5, "Melee stop attack"); } - attacked_ent = ent; npcclient->GetNetworkMgr()->QueueAttackCommand(npc->GetActor(), ent); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-03-21 00:08:12
|
Revision: 3258 http://planeshift.svn.sourceforge.net/planeshift/?rev=3258&view=rev Author: KhakiLord Date: 2009-03-21 00:08:08 +0000 (Sat, 21 Mar 2009) Log Message: ----------- Removed event when executing a waitoperation on a npc. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-03-20 22:48:19 UTC (rev 3257) +++ trunk/src/npcclient/npcoperations.cpp 2009-03-21 00:08:08 UTC (rev 3258) @@ -2777,14 +2777,14 @@ //now persist npcclient->GetNetworkMgr()->QueueDRData(npc); - Resume((int)(remaining*1000.0),npc,eventmgr); - return false; } void WaitOperation::Advance(float timedelta,NPC *npc,EventManager *eventmgr) { remaining -= timedelta; + if(remaining <= 0) + npc->ResumeScript(npc->GetBrain()->GetCurrentBehavior() ); npc->Printf(10, "waiting... %.2f",remaining); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-09-19 14:11:42
|
Revision: 4449 http://planeshift.svn.sourceforge.net/planeshift/?rev=4449&view=rev Author: Khakilord Date: 2009-09-19 14:11:36 +0000 (Sat, 19 Sep 2009) Log Message: ----------- Fix to NPC rotating inside a region where the resulting angle may be wrong. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-09-19 09:36:15 UTC (rev 4448) +++ trunk/src/npcclient/npcoperations.cpp 2009-09-19 14:11:36 UTC (rev 4449) @@ -799,10 +799,11 @@ { rot_angle = psGameObject::CalculateIncidentAngle(pos,rgn->locs[i]->pos); if (min_angle > rot_angle) - min_angle = rot_angle+.05; + min_angle = rot_angle; if (max_angle < rot_angle) - max_angle = rot_angle-.05; // The .05 is so it doesn't aim straight for the corner + max_angle = rot_angle; } + if (max_angle-min_angle > PI ) { float temp=max_angle; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wel...@us...> - 2009-10-17 08:21:55
|
Revision: 4653 http://planeshift.svn.sourceforge.net/planeshift/?rev=4653&view=rev Author: weltall2 Date: 2009-10-17 08:21:49 +0000 (Sat, 17 Oct 2009) Log Message: ----------- forced setposition on any waypoints, allows to workaround the bug where linmove seems to not update the sector as the npc moves through waypoints. khaki can you have a look? Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-10-16 14:27:25 UTC (rev 4652) +++ trunk/src/npcclient/npcoperations.cpp 2009-10-17 08:21:49 UTC (rev 4653) @@ -1791,6 +1791,7 @@ { npc->Printf(5, "WanderOp - Reached waypoint %s next waypoint is %s.", active_wp->GetName(), next_wp->GetName() ); + psGameObject::SetPosition(npc->GetActor(),dest,dest_sector); //update position anyway } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-12-01 13:59:13
|
Revision: 4851 http://planeshift.svn.sourceforge.net/planeshift/?rev=4851&view=rev Author: Khakilord Date: 2009-12-01 13:59:05 +0000 (Tue, 01 Dec 2009) Log Message: ----------- Fixed bugs where npcs run inside players and where npcs enter geometry. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-12-01 10:29:17 UTC (rev 4850) +++ trunk/src/npcclient/npcoperations.cpp 2009-12-01 13:59:05 UTC (rev 4851) @@ -1956,6 +1956,8 @@ { offset = node->GetAttributeValueAsFloat("offset"); } + else + offset = 0.5f; LoadVelocity(node); LoadCheckMoveOk(node); @@ -2189,13 +2191,12 @@ float close = GetVelocity(npc)*timedelta; // Add 10 % to the distance moved in one tick. - if (Calc2DDistance(localDest, myPos) <= close) + if (Calc2DDistance(localDest, myPos) <= 0.5f) { - myPos.x = localDest.x; - myPos.z = localDest.z; npc->GetLinMove()->SetPosition(myPos,myRot,mySector); + npc->Printf(5,"Set position %g %g %g, sector %s\n", myPos.x, myPos.y, myPos.z, mySector->QueryObject()->GetName()); - if (Calc2DDistance(myPos,targetPos) <= close) + if (Calc2DDistance(myPos,targetPos) <= 0.5f) { npc->Printf(5, "We are done.."); npc->ResumeScript(npc->GetBrain()->GetCurrentBehavior() ); @@ -2213,9 +2214,12 @@ { TurnTo(npc, localDest, mySector, forward); } + // Limit time extrapolation so we arrive near the correct place. + if(Calc2DDistance(localDest, myPos) <= close) + timedelta = Calc2DDistance(localDest, myPos) / GetVelocity(npc); - npc->Printf(8, "advance: pos=(%f.2,%f.2,%f.2) rot=%.2f localDest=(%f.2,%f.2,%f.2) dist=%f", - myPos.x,myPos.y,myPos.z, myRot, + npc->Printf(8, "advance: pos=(%f.2,%f.2,%f.2) rot=%.2f %s localDest=(%f.2,%f.2,%f.2) dist=%f", + myPos.x,myPos.y,myPos.z, myRot, mySector->QueryObject()->GetName(), localDest.x,localDest.y,localDest.z, Calc2DDistance(localDest, myPos)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-12-01 16:45:53
|
Revision: 4855 http://planeshift.svn.sourceforge.net/planeshift/?rev=4855&view=rev Author: Khakilord Date: 2009-12-01 16:45:45 +0000 (Tue, 01 Dec 2009) Log Message: ----------- Fixed broken Wander op across sectors. This issue is that psPath does not fully support sectors. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-12-01 16:32:42 UTC (rev 4854) +++ trunk/src/npcclient/npcoperations.cpp 2009-12-01 16:45:45 UTC (rev 4855) @@ -1715,7 +1715,7 @@ return true; // Nothing more to do for this op. } - // Turn of CD and hug the ground + // Turn off CD and hug the ground npc->GetLinMove()->UseCD(false); npc->GetLinMove()->SetOnGround(true); // Wander is ALWAYS on_ground. This ensures correct animation on the client. npc->GetLinMove()->SetHugGround(true); @@ -1730,9 +1730,15 @@ void WanderOperation::Advance(float timedelta,NPC *npc,EventManager *eventmgr) { + csVector3 pos; + float rot; + iSector* sector; + npc->GetLinMove()->ExtrapolatePosition(timedelta); + npc->GetLinMove()->GetLastPosition(pos,rot,sector); + if (!anchor->Extrapolate(npcclient->GetWorld(),npcclient->GetEngine(), timedelta*GetVelocity(npc), - direction,npc->GetMovable())) + direction, npc->GetMovable())) { // At end of path npc->Printf(5, "We are done..."); @@ -1750,8 +1756,8 @@ csVector3 pos; float rot; iSector *sec; psGameObject::GetPosition(npc->GetActor(),pos,rot,sec); - npc->Printf(10, "Wander Loc is %s Rot: %1.2f Vel: %.2f Dist: %.2f Index: %d Fraction %.2f", - toString(pos).GetDataSafe(), + npc->Printf(10, "Wander Loc is %s %s, Rot: %1.2f Vel: %.2f Dist: %.2f Index: %d Fraction %.2f", + toString(pos).GetDataSafe(), sec->QueryObject()->GetName(), rot, GetVelocity(npc), anchor->GetDistance(), @@ -1791,7 +1797,6 @@ { npc->Printf(5, "WanderOp - Reached waypoint %s next waypoint is %s.", active_wp->GetName(), next_wp->GetName() ); - psGameObject::SetPosition(npc->GetActor(),dest,dest_sector); //update position anyway } else { @@ -3008,10 +3013,10 @@ void MovePathOperation::Advance(float timedelta, NPC *npc, EventManager *eventmgr) { - + npc->GetLinMove()->ExtrapolatePosition(timedelta); if (!anchor->Extrapolate(npcclient->GetWorld(),npcclient->GetEngine(), timedelta*GetVelocity(npc), - direction,npc->GetMovable())) + direction, npc->GetMovable())) { // At end of path npc->Printf(5, "We are done.."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-12-01 17:10:31
|
Revision: 4857 http://planeshift.svn.sourceforge.net/planeshift/?rev=4857&view=rev Author: Khakilord Date: 2009-12-01 17:10:23 +0000 (Tue, 01 Dec 2009) Log Message: ----------- NPC now always faces enemy during attacking. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-12-01 16:58:42 UTC (rev 4856) +++ trunk/src/npcclient/npcoperations.cpp 2009-12-01 17:10:23 UTC (rev 4857) @@ -2629,6 +2629,7 @@ { // Check hate list to make sure we are still attacking the right person gemNPCActor *ent = npc->GetMostHated(melee_range, attack_invisible, attack_invincible); + if (!ent) { npc->Printf(8, "No Melee target in range (%2.2f), going to chase!", melee_range); @@ -2675,6 +2676,18 @@ } npcclient->GetNetworkMgr()->QueueAttackCommand(npc->GetActor(), ent); } + if(attacked_ent) + { + float rot; + iSector *sector; + csVector3 pos; + psGameObject::GetPosition(attacked_ent,pos,rot,sector); + + // Make sure we still face the target + csVector3 forward; + + TurnTo(npc, pos, sector, forward); + } } void MeleeOperation::InterruptOperation(NPC *npc,EventManager *eventmgr) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-12-04 23:11:16
|
Revision: 4877 http://planeshift.svn.sourceforge.net/planeshift/?rev=4877&view=rev Author: Khakilord Date: 2009-12-04 23:11:10 +0000 (Fri, 04 Dec 2009) Log Message: ----------- Fixed bug where NPCs would not rotate to face the target during a fight. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-12-04 21:19:23 UTC (rev 4876) +++ trunk/src/npcclient/npcoperations.cpp 2009-12-04 23:11:10 UTC (rev 4877) @@ -2676,17 +2676,30 @@ } npcclient->GetNetworkMgr()->QueueAttackCommand(npc->GetActor(), ent); } + + // Make sure our rotation is still correct if(attacked_ent) { - float rot; + float rot, npc_rot, new_npc_rot; iSector *sector; csVector3 pos; + + // Get current rot + psGameObject::GetPosition(npc->GetActor(),pos,npc_rot,sector); + + // Get target pos psGameObject::GetPosition(attacked_ent,pos,rot,sector); // Make sure we still face the target csVector3 forward; TurnTo(npc, pos, sector, forward); + // Check new rot + psGameObject::GetPosition(npc->GetActor(),pos,new_npc_rot,sector); + + // If different broadcast the new rot + if (npc_rot != new_npc_rot) + npcclient->GetNetworkMgr()->QueueDRData(npc); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-12-19 02:15:15
|
Revision: 4991 http://planeshift.svn.sourceforge.net/planeshift/?rev=4991&view=rev Author: Khakilord Date: 2009-12-19 02:15:09 +0000 (Sat, 19 Dec 2009) Log Message: ----------- Fixed issue where NPCs would carry on moving after attacking. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2009-12-18 22:43:03 UTC (rev 4990) +++ trunk/src/npcclient/npcoperations.cpp 2009-12-19 02:15:09 UTC (rev 4991) @@ -2694,6 +2694,10 @@ csVector3 forward; TurnTo(npc, pos, sector, forward); + // Needed because TurnTo automatically starts moving. + csVector3 velvector(0,0, 0 ); + npc->GetLinMove()->SetVelocity(velvector); + npc->GetLinMove()->SetAngularVelocity( 0 ); // Check new rot psGameObject::GetPosition(npc->GetActor(),pos,new_npc_rot,sector); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2010-02-23 02:42:44
|
Revision: 5626 http://planeshift.svn.sourceforge.net/planeshift/?rev=5626&view=rev Author: Khakilord Date: 2010-02-23 02:42:34 +0000 (Tue, 23 Feb 2010) Log Message: ----------- NPCs no longer cancel attack when interrupted. We assume the server will do this automatically. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2010-02-23 00:01:10 UTC (rev 5625) +++ trunk/src/npcclient/npcoperations.cpp 2010-02-23 02:42:34 UTC (rev 5626) @@ -2710,8 +2710,6 @@ void MeleeOperation::InterruptOperation(NPC *npc,EventManager *eventmgr) { ScriptOperation::InterruptOperation(npc,eventmgr); - - npcclient->GetNetworkMgr()->QueueAttackCommand(npc->GetActor(),NULL); } bool MeleeOperation::CompleteOperation(NPC *npc,EventManager *eventmgr) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2010-04-12 20:22:28
|
Revision: 5805 http://planeshift.svn.sourceforge.net/planeshift/?rev=5805&view=rev Author: magodra Date: 2010-04-12 20:22:22 +0000 (Mon, 12 Apr 2010) Log Message: ----------- -Added tribe_home to error text when failing to find type for an rotate operatoin. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2010-04-12 19:26:41 UTC (rev 5804) +++ trunk/src/npcclient/npcoperations.cpp 2010-04-12 20:22:22 UTC (rev 5805) @@ -2482,7 +2482,7 @@ } else { - Error1("Unkown target type for PerceptionOperation"); + Error1("Unkown target type for Percept operation"); } return true; // Nothing more to do for this op. @@ -2728,8 +2728,8 @@ } else { - Error1("Rotate Op type must be 'inregion', 'random', 'absolute', 'relative', " - "'target' or 'locatedest' right now."); + Error2("Rotate Op type '%s' must be 'inregion', 'random', 'absolute', 'relative', " + "'target', 'tribe_home' or 'locatedest' right now.",type.GetDataSafe()); } return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rly...@us...> - 2010-11-05 13:26:29
|
Revision: 6344 http://planeshift.svn.sourceforge.net/planeshift/?rev=6344&view=rev Author: rlydontknow Date: 2010-11-05 13:26:23 +0000 (Fri, 05 Nov 2010) Log Message: ----------- removed unused variables and a superfluous check disabled forcefully setting the position of the NPC to the local destination to prevent them from falling off the world Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2010-11-05 13:25:06 UTC (rev 6343) +++ trunk/src/npcclient/npcoperations.cpp 2010-11-05 13:26:23 UTC (rev 6344) @@ -649,6 +649,7 @@ if(!path || !path->HasNext()) { // failed to find a path between us and the target + npc->Printf(5, "Failed to find a path to the enemy!"); return true; } else if ( GetAngularVelocity(npc) > 0 || GetVelocity(npc) > 0 ) @@ -719,20 +720,7 @@ psGameObject::GetPosition(target_entity,targetPos,dummyrot,targetSector); targetInstance = targetActor->GetInstance(); - csVector3 displacement; - { - csVector3 dest(targetPos); - // This prevents NPCs from wanting to occupy the same physical space as something else - if(mySector != targetSector && !npcclient->GetWorld()->WarpSpace(targetSector,mySector,dest) && chaseRange > 0) - { - npc->Printf(5, "ChaseOperation: target's sector is not connected to ours!"); - npc->ResumeScript(npc->GetBrain()->GetCurrentBehavior()); - return; - } - displacement = dest - myPos; - } - displacement.y = 0; - float distance = displacement.Norm(); + float distance = path->GetDistance(); if((chaseRange > 0 && distance > chaseRange) || (targetInstance != myInstance)) { @@ -749,11 +737,8 @@ npc->Printf(10, "Still chasing %s at %s with range %.1f...",(const char *)name,toString(targetPos,targetSector).GetDataSafe(),distance); { - targetPos -= offset*displacement.Unit(); - - float angleToTarget = psGameObject::CalculateIncidentAngle(myPos, targetPos); iMapNode* pathDest = path->GetLast(); - float angleToPath = psGameObject::CalculateIncidentAngle(myPos, pathDest->GetPosition()); + targetPos -= offset*(targetPos - pathDest->GetPosition()).Unit(); // if the target diverged from the end of our path, we must calculate it again if(Calc2DDistance(pathDest->GetPosition(), targetPos) > offset + EPSILON) @@ -791,8 +776,13 @@ if (distance <= 0.5f) { - npc->GetLinMove()->SetPosition(myPos,myRot,mySector); - npc->Printf(5,"Set position %g %g %g, sector %s\n", myPos.x, myPos.y, myPos.z, mySector->QueryObject()->GetName()); + // @@RlyDontKnow: disabled the forceful setting of the position as the path points + // aren't guaranteed to be valid (they may be slightly below the geometry) + // so the set would cause NPCs falling off the world - a "stuck" one is better + // as it can free itself + // do NOT re-enable this without triple checking all possible destinations are valid + //npc->GetLinMove()->SetPosition(myPos,myRot,mySector); + //npc->Printf(5,"Set position %g %g %g, sector %s\n", myPos.x, myPos.y, myPos.z, mySector->QueryObject()->GetName()); if (!path->HasNext()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wel...@us...> - 2011-02-07 19:51:24
|
Revision: 6890 http://planeshift.svn.sourceforge.net/planeshift/?rev=6890&view=rev Author: weltall2 Date: 2011-02-07 19:51:18 +0000 (Mon, 07 Feb 2011) Log Message: ----------- fixed build Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-02-07 19:45:40 UTC (rev 6889) +++ trunk/src/npcclient/npcoperations.cpp 2011-02-07 19:51:18 UTC (rev 6890) @@ -760,7 +760,8 @@ // Check if we shold stop chaseing float distance = npcclient->GetWorld()->Distance(myPos,mySector,targetPos,targetSector); - if((distance == psWorld::INFINIT) || + //value used for relative infinity. maybe make a global define? + if((distance >= 9999999.99f) || (chaseRange > 0 && distance > chaseRange) || (targetInstance != myInstance)) { @@ -815,7 +816,8 @@ iMapNode* dest = path->Current(); distance = npcclient->GetWorld()->Distance(myPos,mySector,dest->GetPosition(),dest->GetSector()); - if (distance == psWorld::INFINIT) + //value used for relative infinity. maybe make a global define? + if (distance == 9999999.99f) { npc->Printf(5, "No connecting portal to current path segment."); npc->ResumeScript(npc->GetBrain()->GetCurrentBehavior()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wel...@us...> - 2011-02-07 19:58:54
|
Revision: 6891 http://planeshift.svn.sourceforge.net/planeshift/?rev=6891&view=rev Author: weltall2 Date: 2011-02-07 19:58:48 +0000 (Mon, 07 Feb 2011) Log Message: ----------- changed to >= Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-02-07 19:51:18 UTC (rev 6890) +++ trunk/src/npcclient/npcoperations.cpp 2011-02-07 19:58:48 UTC (rev 6891) @@ -817,7 +817,7 @@ distance = npcclient->GetWorld()->Distance(myPos,mySector,dest->GetPosition(),dest->GetSector()); //value used for relative infinity. maybe make a global define? - if (distance == 9999999.99f) + if (distance >= 9999999.99f) { npc->Printf(5, "No connecting portal to current path segment."); npc->ResumeScript(npc->GetBrain()->GetCurrentBehavior()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rly...@us...> - 2011-02-12 15:54:36
|
Revision: 6911 http://planeshift.svn.sourceforge.net/planeshift/?rev=6911&view=rev Author: rlydontknow Date: 2011-02-12 15:54:28 +0000 (Sat, 12 Feb 2011) Log Message: ----------- removed unused variables and fixed initialization order Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-02-12 13:25:13 UTC (rev 6910) +++ trunk/src/npcclient/npcoperations.cpp 2011-02-12 15:54:28 UTC (rev 6911) @@ -608,8 +608,7 @@ { csVector3 myPos; - float myRot,dummyrot; - InstanceID myInstance, targetInstance; + float myRot; iSector* mySector; csVector3 forward; float angle; @@ -919,7 +918,6 @@ gemNPCActor* ChaseOperation::UpdateChaseTarget(NPC* npc) { csVector3 targetPos; - float dummyrot; iSector* targetSector; gemNPCActor* targetEntity = NULL; @@ -2527,20 +2525,20 @@ NavigateOperation::NavigateOperation() : MovementOperation("Navigate"), - // Instance variables - endSector(NULL), // Operation parameters - forceEndPosition(false) + forceEndPosition(false), + // Instance variables + endSector(NULL) { } NavigateOperation::NavigateOperation(const NavigateOperation* other) : MovementOperation(other), - // Instance variables - endSector(NULL), // Operation parameters action(other->action), - forceEndPosition(other->forceEndPosition) + forceEndPosition(other->forceEndPosition), + // Instance variables + endSector(NULL) { } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2011-03-30 20:23:20
|
Revision: 7115 http://planeshift.svn.sourceforge.net/planeshift/?rev=7115&view=rev Author: magodra Date: 2011-03-30 20:23:14 +0000 (Wed, 30 Mar 2011) Log Message: ----------- - Fixed offset in chase so it works with a chase_angle of 0.0 as well. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-03-28 07:22:59 UTC (rev 7114) +++ trunk/src/npcclient/npcoperations.cpp 2011-03-30 20:23:14 UTC (rev 7115) @@ -864,23 +864,24 @@ if (offsetRelativeHeading) { + // Calculate the offset relative to the heading of the end target offsetDelta = csMatrix3(0.0,1.0,0.0,endRot)*csVector3(offset, 0.0, sideOffset); - } else { + // Calculate the offset relative to the tangent between myPos and endPos + offsetDelta = psGameObject::DisplaceTargetPos(mySector, myPos, + endSector, endPos, offset); if (offsetAngle != 0.0) { - offsetDelta= psGameObject::DisplaceTargetPos(mySector, myPos, - endSector, endPos, offset); offsetDelta = csMatrix3(0.0,1.0,0.0,offsetAngle)*offsetDelta; } if (sideOffset != 0.0) { csVector3 sideOffsetDelta = psGameObject::DisplaceTargetPos(mySector, myPos, - endSector, endPos, offset); + endSector, endPos, sideOffset); // Rotate 90 degree to make it a side offset to the line between NPC and target. sideOffsetDelta = csMatrix3(0.0,1.0,0.0,PI)*sideOffsetDelta; offsetDelta += sideOffsetDelta; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2011-03-31 20:49:29
|
Revision: 7117 http://planeshift.svn.sourceforge.net/planeshift/?rev=7117&view=rev Author: magodra Date: 2011-03-31 20:49:23 +0000 (Thu, 31 Mar 2011) Log Message: ----------- - Fixed yet another bug in the chase rewrite. Now sideOffset default to 0 and is applied in 90 degree instead of 180 that cansled out the standard offset. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-03-31 19:32:54 UTC (rev 7116) +++ trunk/src/npcclient/npcoperations.cpp 2011-03-31 20:49:23 UTC (rev 7117) @@ -829,7 +829,7 @@ } else { - sideOffset = 0.5f; + sideOffset = 0.0f; } offsetRelativeHeading = node->GetAttributeValueAsBool("offset_relative_heading",false); @@ -865,7 +865,7 @@ if (offsetRelativeHeading) { // Calculate the offset relative to the heading of the end target - offsetDelta = csMatrix3(0.0,1.0,0.0,endRot)*csVector3(offset, 0.0, sideOffset); + offsetDelta = csYRotMatrix3(endRot)*csVector3(offset, 0.0, sideOffset); } else { @@ -875,7 +875,7 @@ if (offsetAngle != 0.0) { - offsetDelta = csMatrix3(0.0,1.0,0.0,offsetAngle)*offsetDelta; + offsetDelta = csYRotMatrix3(offsetAngle)*offsetDelta; } if (sideOffset != 0.0) @@ -883,11 +883,11 @@ csVector3 sideOffsetDelta = psGameObject::DisplaceTargetPos(mySector, myPos, endSector, endPos, sideOffset); // Rotate 90 degree to make it a side offset to the line between NPC and target. - sideOffsetDelta = csMatrix3(0.0,1.0,0.0,PI)*sideOffsetDelta; + sideOffsetDelta = csYRotMatrix3(PI/2.0)*sideOffsetDelta; offsetDelta += sideOffsetDelta; } - } - + + } return offsetDelta; } @@ -972,17 +972,18 @@ psGameObject::GetPosition(targetEntity, endPos, targetRot, endSector); + offsetDelta = CalculateOffsetDelta(myPos, mySector, endPos, endSector, targetRot ); - offsetDelta = CalculateOffsetDelta(myPos, mySector, endPos, endSector, targetRot ); + npc->Printf(5, "Chasing enemy <%s, %s> at %s with offset %s", targetEntity->GetName(), + ShowID(targetEntity->GetEID()), + toString(endPos,endSector).GetDataSafe(), + toString(offsetDelta).GetDataSafe()); + // This prevents NPCs from wanting to occupy the same physical space as something else endPos -= offsetDelta; // TODO: Check if new endPos is within same sector!!! - npc->Printf(5, "Chasing enemy <%s, %s> at %s", targetEntity->GetName(), - ShowID(targetEntity->GetEID()), - toString(endPos,endSector).GetDataSafe()); - return true; } @@ -1011,8 +1012,8 @@ // Calculate an offset point from the target. // This point is used until new target is found - offsetDelta= psGameObject::DisplaceTargetPos(mySector, myPos, - targetSector, targetPos, offset); + offsetDelta = psGameObject::DisplaceTargetPos(mySector, myPos, + targetSector, targetPos, offset); offsetDelta = csMatrix3(0.0,1.0,0.0,offsetAngle)*offsetDelta; } @@ -1038,8 +1039,8 @@ // Calculate an offset point from the target. // This point is used until new target is found - offsetDelta= psGameObject::DisplaceTargetPos(mySector, myPos, - targetSector, targetPos, offset); + offsetDelta = psGameObject::DisplaceTargetPos(mySector, myPos, + targetSector, targetPos, offset); offsetDelta = csMatrix3(0.0,1.0,0.0,offsetAngle)*offsetDelta; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2011-05-11 21:39:33
|
Revision: 7246 http://planeshift.svn.sourceforge.net/planeshift/?rev=7246&view=rev Author: magodra Date: 2011-05-11 21:39:27 +0000 (Wed, 11 May 2011) Log Message: ----------- - Fixed check for no sector for the MoveToOperation. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-05-11 21:21:13 UTC (rev 7245) +++ trunk/src/npcclient/npcoperations.cpp 2011-05-11 21:39:27 UTC (rev 7246) @@ -2710,7 +2710,16 @@ destPos.x = node->GetAttributeValueAsFloat("x"); destPos.y = node->GetAttributeValueAsFloat("y"); destPos.z = node->GetAttributeValueAsFloat("z"); - destSector = npcclient->GetEngine()->FindSector(node->GetAttributeValue("sector")); + const char * sector = node->GetAttributeValue("sector"); + if (sector) + { + destSector = npcclient->GetEngine()->FindSector(sector); + } + else + { + destSector = NULL; // We will later assume sector current sector + } + action = node->GetAttributeValue("anim"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2011-05-15 11:43:08
|
Revision: 7285 http://planeshift.svn.sourceforge.net/planeshift/?rev=7285&view=rev Author: magodra Date: 2011-05-15 11:43:02 +0000 (Sun, 15 May 2011) Log Message: ----------- - Cleand up the debugmessages for when no path is found. Included position of end and start poing in both run and advance of the base class MovementOperation. This will influence output in commands like moveto, chase, navigate. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-05-14 22:44:25 UTC (rev 7284) +++ trunk/src/npcclient/npcoperations.cpp 2011-05-15 11:43:02 UTC (rev 7285) @@ -692,8 +692,10 @@ if(!path || !path->HasNext()) { // failed to find a path between us and the target - npc->Printf(5, "Failed to find a path to the target!"); - + npc->Printf(5, "Failed to find a path between %s and %s", + toString(myPos, mySector).GetData(), + toString(endPos, endSector).GetData()); + return OPERATION_FAILED; // This operation is complete } else if ( path->GetDistance() < 0.5 ) // Distance allready adjusted for offset @@ -740,14 +742,14 @@ if(EndPointChanged( endPos, endSector )) { npc->Printf(8, "target diverged, recalculate path between %s and %s", - toString(myPos,const_cast<iSector*>(mySector)).GetData(), + toString(myPos, mySector).GetData(), toString(endPos, endSector).GetData()); - path = npcclient->GetNavStruct()->ShortestPath(myPos, const_cast<iSector*>(mySector), - endPos, endSector); + + path = npcclient->GetNavStruct()->ShortestPath(myPos, mySector, endPos, endSector); if(!path || !path->HasNext()) { - npc->Printf(5, "Failed to calculate new path between %s and %s", - toString(myPos,const_cast<iSector*>(mySector)).GetData(), + npc->Printf(5, "Failed to find a path between %s and %s", + toString(myPos, mySector).GetData(), toString(endPos, endSector).GetData()); npc->ResumeScript(npc->GetBrain()->GetCurrentBehavior()); return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2011-12-19 16:44:47
|
Revision: 7852 http://planeshift.svn.sourceforge.net/planeshift/?rev=7852&view=rev Author: magodra Date: 2011-12-19 16:44:36 +0000 (Mon, 19 Dec 2011) Log Message: ----------- - Fixed error where NPCs animation stoped at a waypoint instead of going to next waypoint. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2011-12-19 14:29:38 UTC (rev 7851) +++ trunk/src/npcclient/npcoperations.cpp 2011-12-19 16:44:36 UTC (rev 7852) @@ -241,9 +241,15 @@ csString collision = GetCollisionPerception(npc); if (!collision.IsEmpty()) { + npc->Printf(5,"Sending collition perception: " + collision ); + Perception perception(collision); npc->TriggerEvent(&perception); } + else + { + npc->Printf(6,"No collition perception to send."); + } } bool ScriptOperation::CheckMoveOk(NPC *npc, EventManager *eventmgr, csVector3 oldPos, iSector* oldSector, const csVector3 & newPos, iSector* newSector, float timedelta) @@ -256,8 +262,15 @@ return false; } - if ((oldPos - newPos).SquaredNorm() < 0.01f) // then stopped dead, presumably by collision + float velocity = npc->GetLinMove()->GetVelocity().Norm(); + float moveLimit = 0.5*velocity*timedelta; // 1/2 the distance that should have been travelled. + float movedDistance = (oldPos - newPos).SquaredNorm(); + + if (movedDistance < moveLimit) // then stopped dead, presumably by collision { + npc->Printf(5,"Moved %.3f m at %0.3f m/s in %0.3f s limit: %.3f m -> presumably collided", + movedDistance, velocity, timedelta, moveLimit); + // We collided. Now stop the movment and inform the server. StopMovement(npc); @@ -4435,6 +4448,7 @@ currentDistance = npcclient->GetWorld()->Distance(myPos, mySector, destPos, destPoint->GetSector(npcclient->GetEngine())); + distance = currentDistance; // Update this to the distance to the new point as well. npc->Printf(6,"New localDest %s at range %.2f", toString(destPos, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2012-04-05 22:45:57
|
Revision: 8166 http://planeshift.svn.sourceforge.net/planeshift/?rev=8166&view=rev Author: magodra Date: 2012-04-05 22:45:51 +0000 (Thu, 05 Apr 2012) Log Message: ----------- - Make sure movement operations fails if velocity is 0.0. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2012-04-05 22:42:27 UTC (rev 8165) +++ trunk/src/npcclient/npcoperations.cpp 2012-04-05 22:45:51 UTC (rev 8166) @@ -730,6 +730,11 @@ return OPERATION_NOT_COMPLETED; // This behavior isn't done yet } + else + { + // Have no velocity to compleate any movement + return OPERATION_FAILED; + } return OPERATION_COMPLETED; // This operation is complete } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ma...@us...> - 2012-07-25 00:09:47
|
Revision: 8403 http://planeshift.svn.sourceforge.net/planeshift/?rev=8403&view=rev Author: magodra Date: 2012-07-25 00:09:41 +0000 (Wed, 25 Jul 2012) Log Message: ----------- - Use HitBeam to find the ground for random Locate operation in regions. Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2012-07-24 22:47:11 UTC (rev 8402) +++ trunk/src/npcclient/npcoperations.cpp 2012-07-25 00:09:41 UTC (rev 8403) @@ -861,9 +861,8 @@ dest->GetPosition().Description().GetData(),distance,timedelta); { - int ret; ScopedTimer st(250, "Movement extrapolate %.2f time for %s", timedelta, ShowID(npc->GetActor()->GetEID())); - ret = npc->GetLinMove()->ExtrapolatePosition(timedelta); + npc->GetLinMove()->ExtrapolatePosition(timedelta); } { @@ -2238,6 +2237,29 @@ located.angle = 0; located.sector = sector; + // In case region is curved, adjust point to be at the surface + { + csVector3 start = pos + csVector3(0.0,5,0.0); + csVector3 end = pos + csVector3(0.0,-5,0.0); + + csSectorHitBeamResult result = sector->HitBeam(start,end,false); + + // Check if we found a intersection + if (result.mesh) + { + located.pos = result.isect; + } + else + { + Error4("NPC %s LocateOperation in region %s fails to find ground from %s", + ShowID(npc->GetPID()),region->GetName(), + toString(pos,sector).GetDataSafe()); + npc->Printf(1, "LocateOperation Failed to find round from %s in region %s", + toString(pos,sector).GetDataSafe(), region->GetName()); + return OPERATION_FAILED; // Nothing more to do for this op. + } + } + // Find closest waypoint to the random location in the region located.wp = CalculateWaypoint(npc,located.pos,located.sector,-1); } @@ -2849,13 +2871,12 @@ float oldRot,newRot; iSector* oldSector; iSector* newSector; - int ret; npc->GetLinMove()->GetLastPosition(oldPos, oldRot, oldSector); npc->Printf(10,"Old position: %s",toString(oldPos,oldSector).GetDataSafe()); - ret = npc->GetLinMove()->ExtrapolatePosition(timedelta); + npc->GetLinMove()->ExtrapolatePosition(timedelta); npc->GetLinMove()->GetLastPosition(newPos, newRot, newSector); CheckMoveOk(npc, oldPos, oldSector, newPos, newSector, timedelta); @@ -2935,8 +2956,7 @@ ScriptOperation::OperationResult MovePathOperation::Advance(float timedelta, NPC *npc) { - int ret; - ret = npc->GetLinMove()->ExtrapolatePosition(timedelta); + npc->GetLinMove()->ExtrapolatePosition(timedelta); if (!anchor->Extrapolate(npcclient->GetWorld(),npcclient->GetEngine(), timedelta*GetVelocity(npc), @@ -3897,8 +3917,7 @@ return OPERATION_COMPLETED; } - int ret; - ret = npc->GetLinMove()->ExtrapolatePosition(timedelta); + npc->GetLinMove()->ExtrapolatePosition(timedelta); float rot; csVector3 pos; @@ -4273,7 +4292,6 @@ ScriptOperation::OperationResult TransferOperation::Run(NPC *npc, bool interrupted) { csString transferItem = psGameObject::ReplaceNPCVariables(npc, item); -item; csArray<csString> splitItem = psSplit(transferItem,':'); if (splitItem[0] == "tribe") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lpa...@us...> - 2012-09-22 13:39:51
|
Revision: 8438 http://planeshift.svn.sourceforge.net/planeshift/?rev=8438&view=rev Author: lpancallo Date: 2012-09-22 13:39:45 +0000 (Sat, 22 Sep 2012) Log Message: ----------- Added debug output for npcs movement LocateOperation Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2012-09-21 14:22:48 UTC (rev 8437) +++ trunk/src/npcclient/npcoperations.cpp 2012-09-22 13:39:45 UTC (rev 8438) @@ -2208,6 +2208,7 @@ npc->Printf(5,"Located WP : %30s at %s",end->GetName(),toString(end->loc.pos,end->loc.GetSector(npcclient->GetEngine())).GetDataSafe()); return end; } + npc->Printf(5,"Cannot Locate WP at %s",toString(end->loc.pos,end->loc.GetSector(npcclient->GetEngine())).GetDataSafe()); return NULL; } @@ -2429,10 +2430,12 @@ if (!npc->GetLastPerception()) { + npc->Printf(5,"LocateOp - No Last Perception - nothing to do"); return OPERATION_FAILED; // Nothing more to do for this op. } if (!npc->GetLastPerception()->GetLocation(located.pos,located.sector)) { + npc->Printf(5,"LocateOp - Cannot get Location - nothing to do"); return OPERATION_FAILED; // Nothing more to do for this op. } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lpa...@us...> - 2012-09-22 15:30:56
|
Revision: 8439 http://planeshift.svn.sourceforge.net/planeshift/?rev=8439&view=rev Author: lpancallo Date: 2012-09-22 15:30:50 +0000 (Sat, 22 Sep 2012) Log Message: ----------- Added more debug output for npcs movement LocateOperation Modified Paths: -------------- trunk/src/npcclient/npcoperations.cpp Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2012-09-22 13:39:45 UTC (rev 8438) +++ trunk/src/npcclient/npcoperations.cpp 2012-09-22 15:30:50 UTC (rev 8439) @@ -2433,6 +2433,7 @@ npc->Printf(5,"LocateOp - No Last Perception - nothing to do"); return OPERATION_FAILED; // Nothing more to do for this op. } + npc->Printf(5,"LocateOp - Last Perception is: %s",npc->GetLastPerception()->GetName(npc)); if (!npc->GetLastPerception()->GetLocation(located.pos,located.sector)) { npc->Printf(5,"LocateOp - Cannot get Location - nothing to do"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |