Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/Garrisonable.js
- This file was copied to binaries/data/mods/public/simulation/components/Turretable.js.
Show First 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | Garrisonable.prototype.CanGarrison = function(target) | ||||
let cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder); | let cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder); | ||||
return cmpGarrisonHolder && cmpGarrisonHolder.IsAllowedToGarrison(this.entity); | return cmpGarrisonHolder && cmpGarrisonHolder.IsAllowedToGarrison(this.entity); | ||||
}; | }; | ||||
/** | /** | ||||
* @param {number} target - The entity ID of the entity this entity is being garrisoned in. | * @param {number} target - The entity ID of the entity this entity is being garrisoned in. | ||||
* @return {boolean} - Whether garrisoning succeeded. | * @return {boolean} - Whether garrisoning succeeded. | ||||
*/ | */ | ||||
Garrisonable.prototype.Garrison = function(target, renamed = false) | Garrisonable.prototype.Garrison = function(target) | ||||
{ | { | ||||
if (!this.CanGarrison(target)) | if (!this.CanGarrison(target)) | ||||
return false; | return false; | ||||
let cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder); | let cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder); | ||||
if (!cmpGarrisonHolder || !cmpGarrisonHolder.Garrison(this.entity)) | if (!cmpGarrisonHolder || !cmpGarrisonHolder.Garrison(this.entity)) | ||||
return false; | return false; | ||||
this.holder = target; | this.holder = target; | ||||
let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); | let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); | ||||
if (cmpUnitAI) | if (cmpUnitAI) | ||||
cmpUnitAI.SetGarrisoned(); | cmpUnitAI.SetGarrisoned(); | ||||
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); | let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); | ||||
if (cmpPosition) | if (cmpPosition) | ||||
cmpPosition.MoveOutOfWorld(); | cmpPosition.MoveOutOfWorld(); | ||||
Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { | Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { | ||||
"oldHolder": INVALID_ENTITY, | "oldHolder": INVALID_ENTITY, | ||||
"holderID": target | "holderID": target | ||||
}); | }); | ||||
if (renamed) | |||||
return true; | |||||
let cmpTurretHolder = Engine.QueryInterface(target, IID_TurretHolder); | |||||
if (cmpTurretHolder) | |||||
cmpTurretHolder.OccupyTurret(this.entity); | |||||
return true; | return true; | ||||
}; | }; | ||||
/** | /** | ||||
* @param {boolean} forced - Optionally whether the spawning is forced. | * @param {boolean} forced - Optionally whether the spawning is forced. | ||||
* @param {boolean} renamed - Optionally whether the ungarrisoning is due to renaming. | |||||
* @return {boolean} - Whether the ungarrisoning succeeded. | * @return {boolean} - Whether the ungarrisoning succeeded. | ||||
*/ | */ | ||||
Garrisonable.prototype.UnGarrison = function(forced = false, renamed = false) | Garrisonable.prototype.UnGarrison = function(forced = false) | ||||
{ | { | ||||
if (!this.holder) | if (!this.holder) | ||||
return true; | return true; | ||||
let cmpGarrisonHolder = Engine.QueryInterface(this.holder, IID_GarrisonHolder); | let pos = PositionHelper.GetSpawnPosition(this.holder, this.entity, forced); | ||||
if (!cmpGarrisonHolder) | |||||
return false; | |||||
let pos = cmpGarrisonHolder.GetSpawnPosition(this.entity, forced); | |||||
if (!pos) | if (!pos) | ||||
return false; | return false; | ||||
if (!cmpGarrisonHolder.Eject(this.entity, forced)) | let cmpGarrisonHolder = Engine.QueryInterface(this.holder, IID_GarrisonHolder); | ||||
if (!cmpGarrisonHolder || !cmpGarrisonHolder.Eject(this.entity, forced)) | |||||
return false; | return false; | ||||
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); | let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); | ||||
if (cmpPosition) | if (cmpPosition) | ||||
{ | { | ||||
cmpPosition.JumpTo(pos.x, pos.z); | cmpPosition.JumpTo(pos.x, pos.z); | ||||
cmpPosition.SetHeightOffset(0); | cmpPosition.SetHeightOffset(0); | ||||
} | } | ||||
Show All 9 Lines | if (cmpUnitAI) | ||||
cmpUnitAI.UnsetGarrisoned(); | cmpUnitAI.UnsetGarrisoned(); | ||||
} | } | ||||
Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { | Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { | ||||
"oldHolder": this.holder, | "oldHolder": this.holder, | ||||
"holderID": INVALID_ENTITY | "holderID": INVALID_ENTITY | ||||
}); | }); | ||||
if (renamed) | let cmpRallyPoint = Engine.QueryInterface(this.holder, IID_RallyPoint); | ||||
return true; | if (cmpRallyPoint) | ||||
cmpRallyPoint.OrderToRallyPoint(this.entity, ["garrison"]); | |||||
let cmpTurretHolder = Engine.QueryInterface(this.holder, IID_TurretHolder); | |||||
if (cmpTurretHolder) | |||||
cmpTurretHolder.LeaveTurret(this.entity); | |||||
cmpGarrisonHolder.OrderToRallyPoint(this.entity); | |||||
delete this.holder; | delete this.holder; | ||||
return true; | return true; | ||||
}; | }; | ||||
Garrisonable.prototype.OnEntityRenamed = function(msg) | Garrisonable.prototype.OnEntityRenamed = function(msg) | ||||
{ | { | ||||
if (!this.holder) | if (!this.holder) | ||||
return; | return; | ||||
let cmpGarrisonHolder = Engine.QueryInterface(this.holder, IID_GarrisonHolder); | let holder = this.holder; | ||||
if (cmpGarrisonHolder) | |||||
{ | |||||
this.UnGarrison(true, true); | this.UnGarrison(true, true); | ||||
let cmpGarrisonable = Engine.QueryInterface(msg.newentity, IID_Garrisonable); | let cmpGarrisonable = Engine.QueryInterface(msg.newentity, IID_Garrisonable); | ||||
if (cmpGarrisonable) | if (cmpGarrisonable) | ||||
cmpGarrisonable.Garrison(this.holder, true); | cmpGarrisonable.Garrison(holder, true); | ||||
} | |||||
// We process EntityRenamed of turrets seperately since we | |||||
// want to occupy the same position after being renamed. | |||||
let cmpTurretHolder = Engine.QueryInterface(this.holder, IID_TurretHolder); | |||||
if (cmpTurretHolder) | |||||
cmpTurretHolder.SwapEntities(msg.entity, msg.newentity); | |||||
delete this.holder; | |||||
}; | }; | ||||
Engine.RegisterComponentType(IID_Garrisonable, "Garrisonable", Garrisonable); | Engine.RegisterComponentType(IID_Garrisonable, "Garrisonable", Garrisonable); |
Wildfire Games · Phabricator