update attack and heal range queries, patch by leper, fixes #3080
This was SVN commit r17082.
This commit is contained in:
parent
31b29b98ad
commit
a7e0dc1534
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user