Ranged units always face their targets when attacking. fixes #831
This was SVN commit r9595.
This commit is contained in:
parent
43d817bc22
commit
24cca252e3
@ -619,6 +619,8 @@ var UnitFsmSpec = {
|
|||||||
|
|
||||||
// TODO: if .prepare is short, players can cheat by cycling attack/stop/attack
|
// TODO: if .prepare is short, players can cheat by cycling attack/stop/attack
|
||||||
// to beat the .repeat time; should enforce a minimum time
|
// to beat the .repeat time; should enforce a minimum time
|
||||||
|
|
||||||
|
this.FaceTowardsTarget(this.order.data.target);
|
||||||
},
|
},
|
||||||
|
|
||||||
"leave": function() {
|
"leave": function() {
|
||||||
@ -632,6 +634,7 @@ var UnitFsmSpec = {
|
|||||||
// Check we can still reach the target
|
// Check we can still reach the target
|
||||||
if (this.CheckTargetRange(this.order.data.target, IID_Attack, this.attackType))
|
if (this.CheckTargetRange(this.order.data.target, IID_Attack, this.attackType))
|
||||||
{
|
{
|
||||||
|
this.FaceTowardsTarget(this.order.data.target);
|
||||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||||
cmpAttack.PerformAttack(this.attackType, this.order.data.target);
|
cmpAttack.PerformAttack(this.attackType, this.order.data.target);
|
||||||
return;
|
return;
|
||||||
@ -1812,6 +1815,29 @@ UnitAI.prototype.CheckTargetRange = function(target, iid, type)
|
|||||||
return cmpUnitMotion.IsInTargetRange(target, range.min, range.max);
|
return cmpUnitMotion.IsInTargetRange(target, range.min, range.max);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
UnitAI.prototype.FaceTowardsTarget = function(target)
|
||||||
|
{
|
||||||
|
var cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
|
||||||
|
if (!cmpPosition || !cmpPosition.IsInWorld())
|
||||||
|
return;
|
||||||
|
var cmpTargetPosition = Engine.QueryInterface(target, IID_Position);
|
||||||
|
if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
|
||||||
|
return;
|
||||||
|
var pos = cmpPosition.GetPosition();
|
||||||
|
var targetpos = cmpTargetPosition.GetPosition();
|
||||||
|
var angle = Math.atan2(targetpos.x - pos.x, targetpos.z - pos.z);
|
||||||
|
var rot = cmpPosition.GetRotation();
|
||||||
|
var delta = (rot.y - angle + Math.PI) % (2 * Math.PI) - Math.PI;
|
||||||
|
if (Math.abs(delta) > 0.2)
|
||||||
|
{
|
||||||
|
var cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion);
|
||||||
|
if (cmpUnitMotion)
|
||||||
|
{
|
||||||
|
cmpPosition.TurnTo(angle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UnitAI.prototype.GetBestAttack = function()
|
UnitAI.prototype.GetBestAttack = function()
|
||||||
{
|
{
|
||||||
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
|
||||||
|
@ -31,6 +31,7 @@ DEFINE_INTERFACE_METHOD_0("GetHeightOffset", entity_pos_t, ICmpPosition, GetHeig
|
|||||||
DEFINE_INTERFACE_METHOD_0("IsFloating", bool, ICmpPosition, IsFloating)
|
DEFINE_INTERFACE_METHOD_0("IsFloating", bool, ICmpPosition, IsFloating)
|
||||||
DEFINE_INTERFACE_METHOD_0("GetPosition", CFixedVector3D, ICmpPosition, GetPosition)
|
DEFINE_INTERFACE_METHOD_0("GetPosition", CFixedVector3D, ICmpPosition, GetPosition)
|
||||||
DEFINE_INTERFACE_METHOD_0("GetPosition2D", CFixedVector2D, ICmpPosition, GetPosition2D)
|
DEFINE_INTERFACE_METHOD_0("GetPosition2D", CFixedVector2D, ICmpPosition, GetPosition2D)
|
||||||
|
DEFINE_INTERFACE_METHOD_1("TurnTo", void, ICmpPosition, TurnTo, entity_angle_t)
|
||||||
DEFINE_INTERFACE_METHOD_1("SetYRotation", void, ICmpPosition, SetYRotation, entity_angle_t)
|
DEFINE_INTERFACE_METHOD_1("SetYRotation", void, ICmpPosition, SetYRotation, entity_angle_t)
|
||||||
DEFINE_INTERFACE_METHOD_2("SetXZRotation", void, ICmpPosition, SetXZRotation, entity_angle_t, entity_angle_t)
|
DEFINE_INTERFACE_METHOD_2("SetXZRotation", void, ICmpPosition, SetXZRotation, entity_angle_t, entity_angle_t)
|
||||||
DEFINE_INTERFACE_METHOD_0("GetRotation", CFixedVector3D, ICmpPosition, GetRotation)
|
DEFINE_INTERFACE_METHOD_0("GetRotation", CFixedVector3D, ICmpPosition, GetRotation)
|
||||||
|
Loading…
Reference in New Issue
Block a user