From de1bb8a766a04439fc0ea2aed5755c8186ff1fb6 Mon Sep 17 00:00:00 2001 From: fatherbushido Date: Wed, 1 Nov 2017 14:55:18 +0000 Subject: [PATCH] Move out of world promoted, packed and upgraded entity as they are not destroyed immediately. So they don't interact with the 'physical' world. Refs #4595. Differential Revision: https://code.wildfiregames.com/D590 Reviewed By: wraitii This was SVN commit r20393. --- .../data/mods/public/simulation/components/Promotion.js | 8 +++++--- .../simulation/components/tests/test_EntityLimits.js | 8 ++++---- .../public/simulation/components/tests/test_Promotion.js | 1 + binaries/data/mods/public/simulation/helpers/Transform.js | 2 ++ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/binaries/data/mods/public/simulation/components/Promotion.js b/binaries/data/mods/public/simulation/components/Promotion.js index 40a86b08b5..29c75df373 100644 --- a/binaries/data/mods/public/simulation/components/Promotion.js +++ b/binaries/data/mods/public/simulation/components/Promotion.js @@ -76,9 +76,9 @@ Promotion.prototype.Promote = function(promotedTemplateName) var cmpCurrentUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); var cmpPromotedUnitAI = Engine.QueryInterface(promotedUnitEntity, IID_UnitAI); - var pos = cmpCurrentUnitAI.GetHeldPosition(); - if (pos) - cmpPromotedUnitAI.SetHeldPosition(pos.x, pos.z); + var heldPos = cmpCurrentUnitAI.GetHeldPosition(); + if (heldPos) + cmpPromotedUnitAI.SetHeldPosition(heldPos.x, heldPos.z); if (cmpCurrentUnitAI.GetStanceName()) cmpPromotedUnitAI.SwitchToStance(cmpCurrentUnitAI.GetStanceName()); @@ -123,6 +123,8 @@ Promotion.prototype.Promote = function(promotedTemplateName) Engine.PostMessage(this.entity, MT_EntityRenamed, { "entity": this.entity, "newentity": promotedUnitEntity }); // Destroy current entity + if (cmpCurrentUnitPosition && cmpCurrentUnitPosition.IsInWorld()) + cmpCurrentUnitPosition.MoveOutOfWorld(); Engine.DestroyEntity(this.entity); // save the entity id this.promotedUnitEntity = promotedUnitEntity; diff --git a/binaries/data/mods/public/simulation/components/tests/test_EntityLimits.js b/binaries/data/mods/public/simulation/components/tests/test_EntityLimits.js index 3f431654c7..14d9a02a58 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_EntityLimits.js +++ b/binaries/data/mods/public/simulation/components/tests/test_EntityLimits.js @@ -180,15 +180,15 @@ AddMock(SYSTEM_ENTITY, IID_TemplateManager, { } }); -cmpEntityLimits.ChangeCount( "Champion", 1) +cmpEntityLimits.ChangeCount("Champion", 1) TS_ASSERT(cmpEntityLimits.AllowedToReplace(100, "templateA")) TS_ASSERT(!cmpEntityLimits.AllowedToReplace(101, "templateA")) -cmpEntityLimits.ChangeCount( "Champion", -1) +cmpEntityLimits.ChangeCount("Champion", -1) -cmpEntityLimits.ChangeCount( "Tower", 5) +cmpEntityLimits.ChangeCount("Tower", 5) TS_ASSERT(!cmpEntityLimits.AllowedToReplace(102, "templateD")) TS_ASSERT(cmpEntityLimits.AllowedToReplace(103, "templateD")) -cmpEntityLimits.ChangeCount( "Tower", -5) +cmpEntityLimits.ChangeCount("Tower", -5) TS_ASSERT_UNEVAL_EQUALS(cmpEntityLimits.GetCounts(), { "Tower": 0, "Wonder": 0, "Hero": 0, "Champion": 0 }); diff --git a/binaries/data/mods/public/simulation/components/tests/test_Promotion.js b/binaries/data/mods/public/simulation/components/tests/test_Promotion.js index 191f791399..af2b878e1c 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_Promotion.js +++ b/binaries/data/mods/public/simulation/components/tests/test_Promotion.js @@ -24,6 +24,7 @@ AddMock(60, IID_Position, { "GetRotation": () => new Vector3D(3, 4, 5), "GetHeightOffset": () => {}, "IsInWorld": () => true, + "MoveOutOfWorld": () => {} }); AddMock(60, IID_Ownership, { diff --git a/binaries/data/mods/public/simulation/helpers/Transform.js b/binaries/data/mods/public/simulation/helpers/Transform.js index 00960466e0..0a1134bb0b 100644 --- a/binaries/data/mods/public/simulation/helpers/Transform.js +++ b/binaries/data/mods/public/simulation/helpers/Transform.js @@ -97,6 +97,8 @@ function ChangeEntityTemplate(oldEnt, newTemplate) Engine.PostMessage(oldEnt, MT_EntityRenamed, { "entity": oldEnt, "newentity": newEnt }); + if (cmpPosition && cmpPosition.IsInWorld()) + cmpPosition.MoveOutOfWorld(); Engine.DestroyEntity(oldEnt); return newEnt;