Index: ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js
+++ ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js
@@ -45,6 +45,11 @@
"" +
"" +
"" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
"" +
"" +
"" +
@@ -73,6 +78,7 @@
"y": +points[point].Y,
"z": +points[point].Z
},
+ "angle": points[point].Angle ? +points[point].Angle * Math.PI / 180 : null,
"entity": null
});
}
@@ -200,10 +206,24 @@
if (visibleGarrisonPoint)
{
visibleGarrisonPoint.entity = entity;
- cmpPosition.SetTurretParent(this.entity, visibleGarrisonPoint.offset);
+ // Angle of turrets:
+ // Renamed entities (vgpEntity != undefined) should keep their angle.
+ // Otherwise if an angle is given in the visibleGarrisonPoint, use it.
+ // If no such angle given (usually walls for which outside/inside not well defined), we keep
+ // the current angle as it was used for garrisoning and thus quite often was from inside to
+ // outside, except when garrisoning from outWorld where we take as default PI.
+ let cmpTurretPosition = Engine.QueryInterface(this.entity, IID_Position);
+ if (!vgpEntity && visibleGarrisonPoint.angle != null)
+ cmpPosition.SetYRotation(cmpTurretPosition.GetRotation().y + visibleGarrisonPoint.angle);
+ else if (!vgpEntity && !cmpPosition.IsInWorld())
+ cmpPosition.SetYRotation(cmpTurretPosition.GetRotation().y + Math.PI);
+ let cmpUnitMotion = Engine.QueryInterface(entity, IID_UnitMotion);
+ if (cmpUnitMotion)
+ cmpUnitMotion.SetFacePointAfterMove(false);
let cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);
if (cmpUnitAI)
cmpUnitAI.SetTurretStance();
+ cmpPosition.SetTurretParent(this.entity, visibleGarrisonPoint.offset);
}
else
cmpPosition.MoveOutOfWorld();
@@ -289,38 +309,41 @@
pos = cmpPosition.GetPosition();
}
- let cmpNewPosition = Engine.QueryInterface(entity, IID_Position);
this.entities.splice(entityIndex, 1);
+ let cmpEntPosition = Engine.QueryInterface(entity, IID_Position);
+ let cmpEntUnitAI = Engine.QueryInterface(entity, IID_UnitAI);
- let cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);
for (let vgp of this.visibleGarrisonPoints)
{
if (vgp.entity != entity)
continue;
- cmpNewPosition.SetTurretParent(INVALID_ENTITY, new Vector3D());
- if (cmpUnitAI)
- cmpUnitAI.ResetTurretStance();
+ cmpEntPosition.SetTurretParent(INVALID_ENTITY, new Vector3D());
+ let cmpEntUnitMotion = Engine.QueryInterface(entity, IID_UnitMotion);
+ if (cmpEntUnitMotion)
+ cmpEntUnitMotion.SetFacePointAfterMove(true);
+ if (cmpEntUnitAI)
+ cmpEntUnitAI.ResetTurretStance();
vgp.entity = null;
break;
}
- if (cmpUnitAI)
- cmpUnitAI.Ungarrison();
-
- let cmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);
- if (cmpProductionQueue)
- cmpProductionQueue.UnpauseProduction();
+ if (cmpEntUnitAI)
+ cmpEntUnitAI.Ungarrison();
- let cmpAura = Engine.QueryInterface(entity, IID_Auras);
- if (cmpAura && cmpAura.HasGarrisonAura())
- cmpAura.RemoveGarrisonBonus(this.entity);
+ let cmpEntProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);
+ if (cmpEntProductionQueue)
+ cmpEntProductionQueue.UnpauseProduction();
+
+ let cmpEntAura = Engine.QueryInterface(entity, IID_Auras);
+ if (cmpEntAura && cmpEntAura.HasGarrisonAura())
+ cmpEntAura.RemoveGarrisonBonus(this.entity);
- cmpNewPosition.JumpTo(pos.x, pos.z);
- cmpNewPosition.SetHeightOffset(0);
+ cmpEntPosition.JumpTo(pos.x, pos.z);
+ cmpEntPosition.SetHeightOffset(0);
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
if (cmpPosition)
- cmpNewPosition.SetYRotation(cmpPosition.GetPosition().horizAngleTo(pos));
+ cmpEntPosition.SetYRotation(cmpPosition.GetPosition().horizAngleTo(pos));
Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added": [], "removed": [entity] });
Index: ps/trunk/source/simulation2/components/CCmpPosition.cpp
===================================================================
--- ps/trunk/source/simulation2/components/CCmpPosition.cpp
+++ ps/trunk/source/simulation2/components/CCmpPosition.cpp
@@ -309,6 +309,7 @@
virtual void SetTurretParent(entity_id_t id, const CFixedVector3D& offset)
{
+ entity_angle_t angle = GetRotation().Y;
if (m_TurretParent != INVALID_ENTITY)
{
CmpPtr cmpPosition(GetSimContext(), m_TurretParent);
@@ -325,6 +326,7 @@
if (cmpPosition)
cmpPosition->GetTurrets()->insert(GetEntityId());
}
+ SetYRotation(angle);
UpdateTurretPosition();
}