1
0
forked from 0ad/0ad

update attack and heal range queries, patch by leper, fixes #3080

This was SVN commit r17082.
This commit is contained in:
mimo 2015-09-27 12:23:40 +00:00
parent 31b29b98ad
commit a7e0dc1534
6 changed files with 69 additions and 4 deletions

View File

@ -676,4 +676,21 @@ Attack.prototype.MissileHit = function(data, lateness)
}
};
Attack.prototype.OnValueModification = function(msg)
{
if (msg.component != "Attack")
return;
var cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
if (!cmpUnitAI)
return;
for (var type of this.GetAttackTypes())
if (msg.valueNames.indexOf("Attack/"+type+"/MaxRange") !== -1)
{
cmpUnitAI.UpdateRangeQueries();
return;
}
};
Engine.RegisterComponentType(IID_Attack, "Attack", Attack);

View File

@ -92,4 +92,19 @@ Heal.prototype.PerformHeal = function(target)
// PlaySound("heal_impact", this.entity);
};
Heal.prototype.OnValueModification = function(msg)
{
if (msg.component != "Heal")
return;
var cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
if (!cmpUnitAI)
return;
if (msg.valueNames.indexOf("Heal/Range") === -1)
return;
cmpUnitAI.UpdateRangeQueries();
};
Engine.RegisterComponentType(IID_Heal, "Heal", Heal);

View File

@ -3396,10 +3396,20 @@ UnitAI.prototype.SetupRangeQueries = function()
this.SetupHealRangeQuery();
};
UnitAI.prototype.UpdateRangeQueries = function()
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
if (this.losRangeQuery)
this.SetupRangeQuery(cmpRangeManager.IsActiveQueryEnabled(this.losRangeQuery));
if (this.IsHealer() && this.losHealRangeQuery)
this.SetupHealRangeQuery(cmpRangeManager.IsActiveQueryEnabled(this.losHealRangeQuery));
};
// Set up a range query for all enemy and gaia units within LOS range
// which can be attacked.
// This should be called whenever our ownership changes.
UnitAI.prototype.SetupRangeQuery = function()
UnitAI.prototype.SetupRangeQuery = function(enable = true)
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
@ -3429,13 +3439,14 @@ UnitAI.prototype.SetupRangeQuery = function()
this.losRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, range.min, range.max, players, IID_DamageReceiver, cmpRangeManager.GetEntityFlagMask("normal"));
cmpRangeManager.EnableActiveQuery(this.losRangeQuery);
if (enable)
cmpRangeManager.EnableActiveQuery(this.losRangeQuery);
};
// Set up a range query for all own or ally units within LOS range
// which can be healed.
// This should be called whenever our ownership changes.
UnitAI.prototype.SetupHealRangeQuery = function()
UnitAI.prototype.SetupHealRangeQuery = function(enable = true)
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
@ -3463,7 +3474,9 @@ UnitAI.prototype.SetupHealRangeQuery = function()
var range = this.GetQueryRange(IID_Heal);
this.losHealRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, range.min, range.max, players, IID_Health, cmpRangeManager.GetEntityFlagMask("injured"));
cmpRangeManager.EnableActiveQuery(this.losHealRangeQuery);
if (enable)
cmpRangeManager.EnableActiveQuery(this.losHealRangeQuery);
};

View File

@ -815,6 +815,19 @@ public:
q.enabled = false;
}
virtual bool IsActiveQueryEnabled(tag_t tag)
{
std::map<tag_t, Query>::const_iterator it = m_Queries.find(tag);
if (it == m_Queries.end())
{
LOGERROR("CCmpRangeManager: IsActiveQueryEnabled called with invalid tag %u", tag);
return false;
}
const Query& q = it->second;
return q.enabled;
}
virtual std::vector<entity_id_t> ExecuteQueryAroundPos(CFixedVector2D pos,
entity_pos_t minRange, entity_pos_t maxRange,
std::vector<int> owners, int requiredInterface)

View File

@ -41,6 +41,7 @@ DEFINE_INTERFACE_METHOD_7("CreateActiveParabolicQuery", ICmpRangeManager::tag_t,
DEFINE_INTERFACE_METHOD_1("DestroyActiveQuery", void, ICmpRangeManager, DestroyActiveQuery, ICmpRangeManager::tag_t)
DEFINE_INTERFACE_METHOD_1("EnableActiveQuery", void, ICmpRangeManager, EnableActiveQuery, ICmpRangeManager::tag_t)
DEFINE_INTERFACE_METHOD_1("DisableActiveQuery", void, ICmpRangeManager, DisableActiveQuery, ICmpRangeManager::tag_t)
DEFINE_INTERFACE_METHOD_1("IsActiveQueryEnabled", bool, ICmpRangeManager, IsActiveQueryEnabled, ICmpRangeManager::tag_t)
DEFINE_INTERFACE_METHOD_1("ResetActiveQuery", std::vector<entity_id_t>, ICmpRangeManager, ResetActiveQuery, ICmpRangeManager::tag_t)
DEFINE_INTERFACE_METHOD_3("SetEntityFlag", void, ICmpRangeManager, SetEntityFlag, entity_id_t, std::string, bool)
DEFINE_INTERFACE_METHOD_1("GetEntityFlagMask", u8, ICmpRangeManager, GetEntityFlagMask, std::string)

View File

@ -169,6 +169,12 @@ public:
*/
virtual void DisableActiveQuery(tag_t tag) = 0;
/**
* Check if the processing of a query is enabled.
* @param tag identifier of a query.
*/
virtual bool IsActiveQueryEnabled(tag_t tag) = 0;
/**
* Immediately execute a query, and re-enable it if disabled.
* The next RangeUpdate message will say who has entered/left since this call,