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
|
||||
// to beat the .repeat time; should enforce a minimum time
|
||||
|
||||
this.FaceTowardsTarget(this.order.data.target);
|
||||
},
|
||||
|
||||
"leave": function() {
|
||||
@ -632,6 +634,7 @@ var UnitFsmSpec = {
|
||||
// Check we can still reach the target
|
||||
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);
|
||||
cmpAttack.PerformAttack(this.attackType, this.order.data.target);
|
||||
return;
|
||||
@ -1812,6 +1815,29 @@ UnitAI.prototype.CheckTargetRange = function(target, iid, type)
|
||||
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()
|
||||
{
|
||||
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("GetPosition", CFixedVector3D, ICmpPosition, GetPosition)
|
||||
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_2("SetXZRotation", void, ICmpPosition, SetXZRotation, entity_angle_t, entity_angle_t)
|
||||
DEFINE_INTERFACE_METHOD_0("GetRotation", CFixedVector3D, ICmpPosition, GetRotation)
|
||||
|
Loading…
Reference in New Issue
Block a user