check that enemy units don't leave foundations. based on patch from Stork. fixes #724

This was SVN commit r9532.
This commit is contained in:
Badmadblacksad 2011-05-17 20:30:21 +00:00
parent 1fac936d68
commit 069f567f7e
2 changed files with 39 additions and 0 deletions

View File

@ -414,6 +414,11 @@ var UnitFsmSpec = {
// 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) {
if (!IsOwnedByAlly(this.entity, msg.data.target))
{
this.FinishOrder();
return;
}
// Move a tile outside the building
var range = 4;
var ok = this.MoveToTargetRangeExplicit(msg.data.target, range, range);
@ -526,6 +531,11 @@ var UnitFsmSpec = {
// Override the LeaveFoundation order since we're not doing
// anything more important
"Order.LeaveFoundation": function(msg) {
if (!IsOwnedByAlly(this.entity, msg.data.target))
{
this.FinishOrder();
return;
}
// Move a tile outside the building
var range = 4;
var ok = this.MoveToTargetRangeExplicit(msg.data.target, range, range);
@ -978,6 +988,11 @@ var UnitFsmSpec = {
// Override the LeaveFoundation order since we don't want to be
// accidentally blocking our own building
"Order.LeaveFoundation": function(msg) {
if (!IsOwnedByAlly(this.entity, msg.data.target))
{
this.FinishOrder();
return;
}
// Move a tile outside the building
var range = 4;
var ok = this.MoveToTargetRangeExplicit(msg.data.target, range, range);

View File

@ -191,6 +191,30 @@ function QueryPlayerIDInterface(id, iid)
return Engine.QueryInterface(playerEnt, iid);
}
function IsOwnedByAlly(entity, target)
{
//figure out which player controls us
var cmpOwnership = Engine.QueryInterface(entity, IID_Ownership);
var owner = 0;
if (cmpOwnership)
owner = cmpOwnership.GetOwner();
var playerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var player = Engine.QueryInterface(playerMan.GetPlayerByID(owner), IID_Player);
// Get our diplomacy array
var diplomacy = player.GetDiplomacy();
//figure out which player controls the foundation being built
var cmpOwnershipTarget = Engine.QueryInterface(target, IID_Ownership);
var targetOwner = 0;
if (cmpOwnershipTarget)
targetOwner = cmpOwnershipTarget.GetOwner();
//If we don't like the guy with the building, ignore their request to move
return owner==targetOwner || diplomacy[targetOwner - 1] > 0;
}
Engine.RegisterGlobal("LoadPlayerSettings", LoadPlayerSettings);
Engine.RegisterGlobal("QueryOwnerInterface", QueryOwnerInterface);
Engine.RegisterGlobal("QueryPlayerIDInterface", QueryPlayerIDInterface);
Engine.RegisterGlobal("IsOwnedByAlly", IsOwnedByAlly);