fix UnitAI state of turrets, fix #3481

This was SVN commit r17111.
This commit is contained in:
mimo 2015-10-08 21:59:52 +00:00
parent 1b3ee1195c
commit 38af159598
3 changed files with 62 additions and 37 deletions

View file

@ -224,8 +224,9 @@ GarrisonHolder.prototype.AllowedToGarrison = function(entity)
* Garrison a unit inside.
* Returns true if successful, false if not
* The timer for AutoHeal is started here
* if vgpEntity is given, this visualGarrisonPoint will be used for the entity
*/
GarrisonHolder.prototype.Garrison = function(entity)
GarrisonHolder.prototype.Garrison = function(entity, vgpEntity)
{
var cmpPosition = Engine.QueryInterface(entity, IID_Position);
if (!cmpPosition)
@ -234,21 +235,29 @@ GarrisonHolder.prototype.Garrison = function(entity)
if (!this.PerformGarrison(entity))
return false;
var visiblyGarrisoned = false;
for (var vgp of this.visibleGarrisonPoints)
let visibleGarrisonPoint = vgpEntity;
if (!visibleGarrisonPoint)
{
if (vgp.entity)
continue;
vgp.entity = entity;
cmpPosition.SetTurretParent(this.entity, vgp.offset);
visiblyGarrisoned = true;
var cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);
for (let vgp of this.visibleGarrisonPoints)
{
if (vgp.entity)
continue;
visibleGarrisonPoint = vgp;
break;
}
}
if (visibleGarrisonPoint)
{
visibleGarrisonPoint.entity = entity;
cmpPosition.SetTurretParent(this.entity, visibleGarrisonPoint.offset);
let cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);
if (cmpUnitAI)
cmpUnitAI.SetTurretStance();
break;
}
if (!visiblyGarrisoned)
else
cmpPosition.MoveOutOfWorld();
return true;
};
@ -674,8 +683,16 @@ GarrisonHolder.prototype.OnGlobalEntityRenamed = function(msg)
var entityIndex = this.entities.indexOf(msg.entity);
if (entityIndex != -1)
{
let vgpRenamed;
for (let vgp of this.visibleGarrisonPoints)
{
if (vgp.entity != msg.entity)
continue;
vgpRenamed = vgp;
break;
}
this.Eject(msg.entity);
this.Garrison(msg.newentity);
this.Garrison(msg.newentity, vgpRenamed);
}
if (!this.initGarrison)

View file

@ -80,22 +80,9 @@ Promotion.prototype.Promote = function(promotedTemplateName)
var orders = cmpCurrentUnitAI.GetOrders();
if (cmpCurrentUnitAI.IsGarrisoned())
{
if (orders.length > 0 && (orders[0].type == "Garrison" || orders[0].type == "Autogarrison"))
{
// Replace the garrison order by an autogarrison order,
// as we are already garrisoned and do not need to do
// any further checks (or else we should do them here).
var garrisonHolder = orders[0].data.target;
orders.shift();
cmpPromotedUnitAI.Autogarrison(garrisonHolder);
}
else
warn("Promoted garrisoned entity with empty order queue.");
}
else
cmpPromotedUnitAI.Cheer();
cmpPromotedUnitAI.isGarrisoned = true;
if (cmpCurrentUnitPosition.IsInWorld()) // do not cheer if not visibly garrisoned
cmpPromotedUnitAI.Cheer();
cmpPromotedUnitAI.AddOrders(orders);
var workOrders = cmpCurrentUnitAI.GetWorkOrders();

View file

@ -687,9 +687,15 @@ UnitAI.prototype.UnitFsmSpec = {
"Order.Garrison": function(msg) {
if (this.IsTurret())
{
this.FinishOrder();
this.SetNextState("IDLE");
return;
}
else if (this.IsGarrisoned())
{
this.SetNextState("INDIVIDUAL.AUTOGARRISON");
return;
}
// For packable units:
// 1. If packed, we can move to the garrison target.
// 2. If unpacked, we first need to pack, then follow case 1.
@ -713,6 +719,12 @@ UnitAI.prototype.UnitFsmSpec = {
},
"Order.Autogarrison": function(msg) {
if (this.IsTurret())
{
this.SetNextState("IDLE");
return;
}
this.SetNextState("INDIVIDUAL.AUTOGARRISON");
},
@ -1438,7 +1450,7 @@ UnitAI.prototype.UnitFsmSpec = {
// from FinishOrder (SetNextState("IDLE") is only executed when we get
// a ProcessMessage), and thus we should not start an attack which could
// put us in a weird state
if (this.orderQueue.length > 0)
if (this.orderQueue.length > 0 && !this.IsGarrisoned())
return false;
// If a unit can heal and attack we first want to heal wounded units,
@ -1501,6 +1513,11 @@ UnitAI.prototype.UnitFsmSpec = {
Engine.PostMessage(this.entity, MT_UnitIdleChanged, { "idle": this.isIdle });
}
},
"Order.Ungarrison": function() { // Needed for turrets
this.FinishOrder();
this.isGarrisoned = false;
},
},
"WALKING": {
@ -2918,12 +2935,11 @@ UnitAI.prototype.UnitFsmSpec = {
},
"Order.Ungarrison": function() {
if (this.FinishOrder())
return;
this.FinishOrder();
this.isGarrisoned = false;
},
"leave": function() {
this.isGarrisoned = false;
}
},
},
@ -2935,12 +2951,11 @@ UnitAI.prototype.UnitFsmSpec = {
},
"Order.Ungarrison": function() {
if (this.FinishOrder())
return;
this.FinishOrder();
this.isGarrisoned = false;
},
"leave": function() {
this.isGarrisoned = false;
}
},
@ -3318,7 +3333,7 @@ UnitAI.prototype.OnDiplomacyChanged = function(msg)
{
var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
if (cmpOwnership && cmpOwnership.GetOwner() == msg.player)
this.SetupRangeQuery();
this.SetupRangeQueries();
};
UnitAI.prototype.OnOwnershipChanged = function(msg)
@ -4976,7 +4991,13 @@ UnitAI.prototype.Garrison = function(target, queued)
UnitAI.prototype.Ungarrison = function()
{
if (this.IsGarrisoned())
{
// Turret may be attacking, so we must finish all orders except the last one
// which must be Garrison or Autogarrison
while (this.orderQueue.length > 1)
this.FinishOrder();
this.AddOrder("Ungarrison", null, false);
}
};
/**