Fix units in formation blocking construction and not moving out of the way (see #779).

Make non-movement-blocking buildings (e.g. farms) not require units to
move out of the way.

This was SVN commit r9510.
This commit is contained in:
Ykkrosh 2011-05-13 20:32:41 +00:00
parent c41b7904d2
commit edd8ef2bf2
5 changed files with 32 additions and 1 deletions

View File

@ -99,7 +99,7 @@ Foundation.prototype.Build = function(builderEnt, work)
if (!this.committed)
{
var cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction);
if (cmpObstruction)
if (cmpObstruction && cmpObstruction.GetBlockMovementFlag())
{
// If there's any units in the way, ask them to move away
// and return early from this method.

View File

@ -407,6 +407,25 @@ var UnitFsmSpec = {
this.SetNextState("INDIVIDUAL.IDLE");
},
// Override the LeaveFoundation order since we're not doing
// anything more important (and we might be stuck in the WALKING
// state forever and need to get out of foundations in that case)
"Order.LeaveFoundation": function(msg) {
// Move a tile outside the building
var range = 4;
var ok = this.MoveToTargetRangeExplicit(msg.data.target, range, range);
if (ok)
{
// We've started walking to the given point
this.SetNextState("WALKING");
}
else
{
// We are already at the target, or can't move at all
this.FinishOrder();
}
},
"IDLE": {
"enter": function() {
this.SelectAnimation("idle");
@ -417,6 +436,10 @@ var UnitFsmSpec = {
"enter": function () {
this.SelectAnimation("move");
},
// (We stay in this state even if we're already in position
// and no longer moving, because the formation controller might
// move and we'll automatically start chasing after it again)
},
},

View File

@ -289,6 +289,11 @@ public:
}
}
virtual bool GetBlockMovementFlag()
{
return (m_TemplateFlags & ICmpObstructionManager::FLAG_BLOCK_MOVEMENT) != 0;
}
virtual ICmpObstructionManager::tag_t GetObstruction()
{
return m_Tag;

View File

@ -27,5 +27,6 @@ DEFINE_INTERFACE_METHOD_0("CheckFoundationCollisions", bool, ICmpObstruction, Ch
DEFINE_INTERFACE_METHOD_0("GetConstructionCollisions", std::vector<entity_id_t>, ICmpObstruction, GetConstructionCollisions)
DEFINE_INTERFACE_METHOD_1("SetActive", void, ICmpObstruction, SetActive, bool)
DEFINE_INTERFACE_METHOD_1("SetDisableBlockMovementPathfinding", void, ICmpObstruction, SetDisableBlockMovementPathfinding, bool)
DEFINE_INTERFACE_METHOD_0("GetBlockMovementFlag", bool, ICmpObstruction, GetBlockMovementFlag)
DEFINE_INTERFACE_METHOD_1("SetControlGroup", void, ICmpObstruction, SetControlGroup, entity_id_t)
END_INTERFACE_WRAPPER(Obstruction)

View File

@ -56,6 +56,8 @@ public:
virtual void SetDisableBlockMovementPathfinding(bool disabled) = 0;
virtual bool GetBlockMovementFlag() = 0;
/**
* Change the control group that the entity belongs to.
* Control groups are used to let units ignore collisions with other units from