Save initial herd position and update the last known position of the hunted animal when hunting. Patch by mimo. Fixes #2047.

This was SVN commit r13803.
This commit is contained in:
leper 2013-09-06 19:47:48 +00:00
parent 16c9724c24
commit 819a1e7823

View File

@ -1432,6 +1432,21 @@ var UnitFsmSpec = {
// Check we can still reach the target
if (this.CheckTargetAttackRange(target, IID_Attack, this.order.data.attackType))
{
// If we are hunting, first update the target position of the gather order so we know where will be the killed animal
if (this.order.data.hunting && this.orderQueue[1] && this.orderQueue[1].data.lastPos)
{
var cmpPosition = Engine.QueryInterface(this.order.data.target, IID_Position);
if (cmpPosition && cmpPosition.IsInWorld())
{
// Store the initial position, so that we can find the rest of the herd later
if (!this.orderQueue[1].data.initPos)
this.orderQueue[1].data.initPos = this.orderQueue[1].data.lastPos;
this.orderQueue[1].data.lastPos = cmpPosition.GetPosition();
// We still know where the animal is, so we shouldn't give up before going there
this.orderQueue[1].data.secondTry = undefined;
}
}
var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
this.lastAttacked = cmpTimer.GetTime() - msg.lateness;
@ -1679,7 +1694,18 @@ var UnitFsmSpec = {
}
// Couldn't find nearby resources, so give up
this.FinishOrder();
if (this.FinishOrder())
return;
// Nothing better to do: go back to dropsite
var nearby = this.FindNearestDropsite(resourceType.generic);
if (nearby)
{
this.PushOrderFront("ReturnResource", { "target": nearby, "force": false });
return;
}
// No dropsites, just give up
},
},
@ -1834,6 +1860,8 @@ var UnitFsmSpec = {
// We're already in range, can't get anywhere near it or the target is exhausted.
var herdPos = this.order.data.initPos;
// Give up on this order and try our next queued order
if (this.FinishOrder())
return;
@ -1855,6 +1883,10 @@ var UnitFsmSpec = {
return;
}
// If hunting, try to go to the initial herd position to see if we are more lucky
if (herdPos)
this.GatherNearPosition(herdPos.x, herdPos.z, resourceType, resourceTemplate);
// Nothing else to gather - if we're carrying anything then we should
// drop it off, and if not then we might as well head to the dropsite
// anyway because that's a nice enough place to congregate and idle
@ -3945,8 +3977,6 @@ UnitAI.prototype.PerformGather = function(target, queued, force)
// Remember the position of our target, if any, in case it disappears
// later and we want to head to its last known position
// (TODO: if the target moves a lot (e.g. it's an animal), maybe we
// need to update this lastPos regularly rather than just here?)
var lastPos = undefined;
var cmpPosition = Engine.QueryInterface(target, IID_Position);
if (cmpPosition && cmpPosition.IsInWorld())