Index: binaries/data/mods/public/gui/session/selection_details.js
===================================================================
--- binaries/data/mods/public/gui/session/selection_details.js	(revision 16604)
+++ binaries/data/mods/public/gui/session/selection_details.js	(working copy)
@@ -206,7 +206,7 @@
 		Engine.GetGUIObjectByName("resourceCarryingIcon").hidden = false;
 		Engine.GetGUIObjectByName("resourceCarryingText").hidden = false;
 		Engine.GetGUIObjectByName("resourceCarryingIcon").sprite = "stretched:session/icons/repair.png";
-		Engine.GetGUIObjectByName("resourceCarryingText").caption = sprintf(translate("%(amount)s / %(max)s"), { amount: entState.resourceSupply.gatherers.length, max: entState.resourceSupply.maxGatherers }) + "    ";
+		Engine.GetGUIObjectByName("resourceCarryingText").caption = sprintf(translate("%(amount)s / %(max)s"), { amount: entState.resourceSupply.numGatherers, max: entState.resourceSupply.maxGatherers }) + "    ";
 		Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = translate("Current/max gatherers");
 	}
 	else
Index: binaries/data/mods/public/simulation/components/Fogging.js
===================================================================
--- binaries/data/mods/public/simulation/components/Fogging.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/Fogging.js	(working copy)
@@ -115,31 +115,19 @@
 	// Store valuable information into the mirage component (especially for the GUI)
 	var cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
 	if (cmpFoundation)
-		cmpMirage.CopyFoundation(cmpFoundation.GetBuildPercentage());
+		cmpMirage.CopyFoundation(cmpFoundation);
 
 	var cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
 	if (cmpHealth)
-		cmpMirage.CopyHealth(
-			cmpHealth.GetMaxHitpoints(), 
-			cmpHealth.GetHitpoints(), 
-			cmpHealth.IsRepairable() && (cmpHealth.GetHitpoints() < cmpHealth.GetMaxHitpoints())
-		);
+		cmpMirage.CopyHealth(cmpHealth);
 
 	var cmpCapturable = Engine.QueryInterface(this.entity, IID_Capturable);
 	if (cmpCapturable)
-		cmpMirage.CopyCapturable(
-			cmpCapturable.GetCapturePoints(),
-			cmpCapturable.GetMaxCapturePoints()
-		);
+		cmpMirage.CopyCapturable(cmpCapturable);
 
 	var cmpResourceSupply = Engine.QueryInterface(this.entity, IID_ResourceSupply);
 	if (cmpResourceSupply)
-		cmpMirage.CopyResourceSupply(
-			cmpResourceSupply.GetMaxAmount(), 
-			cmpResourceSupply.GetCurrentAmount(), 
-			cmpResourceSupply.GetType(), 
-			cmpResourceSupply.IsInfinite()
-		);
+		cmpMirage.CopyResourceSupply(cmpResourceSupply);
 
 	// Notify the GUI the entity has been replaced by a mirage, in case it is selected at this moment
 	var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
Index: binaries/data/mods/public/simulation/components/GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/GuiInterface.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/GuiInterface.js	(working copy)
@@ -258,7 +258,7 @@
 		ret.rotation = cmpPosition.GetRotation();
 	}
 
-	var cmpHealth = Engine.QueryInterface(ent, IID_Health);
+	var cmpHealth = QueryMiragedInterface(ent, IID_Health);
 	if (cmpHealth)
 	{
 		ret.hitpoints = Math.ceil(cmpHealth.GetHitpoints());
@@ -266,24 +266,13 @@
 		ret.needsRepair = cmpHealth.IsRepairable() && (cmpHealth.GetHitpoints() < cmpHealth.GetMaxHitpoints());
 		ret.needsHeal = !cmpHealth.IsUnhealable();
 	}
-	if (cmpMirage && cmpMirage.Health())
-	{
-		ret.hitpoints = cmpMirage.GetHitpoints();
-		ret.maxHitpoints = cmpMirage.GetMaxHitpoints();
-		ret.needsRepair = cmpMirage.NeedsRepair();
-	}
 
-	var cmpCapturable = Engine.QueryInterface(ent, IID_Capturable);
+	var cmpCapturable = QueryMiragedInterface(ent, IID_Capturable);
 	if (cmpCapturable)
 	{
 		ret.capturePoints = cmpCapturable.GetCapturePoints();
 		ret.maxCapturePoints = cmpCapturable.GetMaxCapturePoints();
 	}
-	if (cmpMirage && cmpMirage.Capturable())
-	{
-		ret.capturePoints = cmpMirage.GetCapturePoints();
-		ret.maxCapturePoints = cmpMirage.GetMaxCapturePoints();
-	}
 
 	var cmpBuilder = Engine.QueryInterface(ent, IID_Builder);
 	if (cmpBuilder)
@@ -326,7 +315,7 @@
 			ret.fogging = {"mirage": null};
 	}
 
-	var cmpFoundation = Engine.QueryInterface(ent, IID_Foundation);
+	var cmpFoundation = QueryMiragedInterface(ent, IID_Foundation);
 	if (cmpFoundation)
 	{
 		ret.foundation = {
@@ -334,12 +323,6 @@
 			"numBuilders": cmpFoundation.GetNumBuilders()
 		};
 	}
-	if (cmpMirage && cmpMirage.Foundation())
-	{
-		ret.foundation = {
-			"progress": cmpMirage.GetBuildPercentage()
-		};
-	}
 
 	var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
 	if (cmpOwnership)
@@ -523,7 +506,7 @@
 	if (cmpPosition && cmpPosition.GetTurretParent() != INVALID_ENTITY)
 		ret.turretParent = cmpPosition.GetTurretParent();
 
-	var cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply);
+	var cmpResourceSupply = QueryMiragedInterface(ent, IID_ResourceSupply);
 	if (cmpResourceSupply)
 	{
 		ret.resourceSupply = {
@@ -533,16 +516,7 @@
 			"type": cmpResourceSupply.GetType(),
 			"killBeforeGather": cmpResourceSupply.GetKillBeforeGather(),
 			"maxGatherers": cmpResourceSupply.GetMaxGatherers(),
-			"gatherers": cmpResourceSupply.GetGatherers()
-		};
-	}
-	if (cmpMirage && cmpMirage.ResourceSupply())
-	{
-		ret.resourceSupply = {
-			"max": cmpMirage.GetMaxAmount(),
-			"amount": cmpMirage.GetAmount(),
-			"type": cmpMirage.GetType(),
-			"isInfinite": cmpMirage.IsInfinite()
+			"numGatherers": cmpResourceSupply.GetNumGatherers()
 		};
 	}
 
@@ -1712,13 +1686,8 @@
 
 	var owner = QueryOwnerInterface(data.entity).GetPlayerID();
 
-	var cmp = Engine.QueryInterface(data.target, IID_Mirage);
-	if (cmp && !cmp.Capturable())
-		return false
-	else if (!cmp)
-		var cmp = Engine.QueryInterface(data.target, IID_Capturable);
-
-	if (cmp && cmp.CanCapture(owner) && cmpAttack.GetAttackTypes().indexOf("Capture") != -1)
+	var cmpCapturable = QueryMiragedInterface(data.target, IID_Capturable);
+	if (cmpCapturable && cmpCapturable.CanCapture(owner) && cmpAttack.GetAttackTypes().indexOf("Capture") != -1)
 		return cmpAttack.CanAttack(data.target);
 
 	return false;
Index: binaries/data/mods/public/simulation/components/Mirage.js
===================================================================
--- binaries/data/mods/public/simulation/components/Mirage.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/Mirage.js	(working copy)
@@ -13,23 +13,26 @@
 	this.player = null;
 	this.parent = INVALID_ENTITY;
 
-	this.foundation = false;
-	this.buildPercentage = null;
+	this.miraged_iids = new Set();
+
+	this.buildPercentage = 0;
+	this.numBuilders = 0;
 
-	this.health = false;
 	this.maxHitpoints = null;
 	this.hitpoints = null;
-	this.needsRepair = null;
+	this.repairable = null;
+	this.unhealable = null;
 
-	this.capturable = false;
 	this.capturePoints = [];
 	this.maxCapturePoints = 0;
 
-	this.resourceSupply = false;
 	this.maxAmount = null;
 	this.amount = null;
 	this.type = null;
 	this.isInfinite = null;
+	this.killBeforeGather = null;
+	this.maxGatherers = null;
+	this.numGatherers = null;
 };
 
 Mirage.prototype.SetParent = function(ent)
@@ -47,118 +50,77 @@
 	this.player = player;
 };
 
+Mirage.prototype.Mirages = function(iid)
+{
+	return this.miraged_iids.has(iid);
+};
+
 // ============================
 // Parent entity data
 
 // Foundation data
 
-Mirage.prototype.CopyFoundation = function(buildPercentage)
-{
-	this.foundation = true;
-	this.buildPercentage = buildPercentage;
-};
-
-Mirage.prototype.Foundation = function()
+Mirage.prototype.CopyFoundation = function(cmpFoundation)
 {
-	return this.foundation;
+	this.miraged_iids.add(IID_Foundation);
+	this.buildPercentage = cmpFoundation.GetBuildPercentage();
+	this.numBuilders = cmpFoundation.GetNumBuilders();
 };
 
-Mirage.prototype.GetBuildPercentage = function()
-{
-	return this.buildPercentage;
-};
+Mirage.prototype.GetBuildPercentage = function() { return this.buildPercentage; };
+Mirage.prototype.GetNumBuilders = function() { return this.numBuilders; };
 
 // Health data
 
-Mirage.prototype.CopyHealth = function(maxHitpoints, hitpoints, needsRepair)
+Mirage.prototype.CopyHealth = function(cmpHealth)
 {
-	this.health = true;
-	this.maxHitpoints = maxHitpoints;
-	this.hitpoints = Math.ceil(hitpoints);
-	this.needsRepair = needsRepair;
+	this.miraged_iids.add(IID_Health);
+	this.maxHitpoints = cmpHealth.GetMaxHitpoints();
+	this.hitpoints = cmpHealth.GetHitpoints();
+	this.repairable = cmpHealth.IsRepairable();
+	this.unhealable = cmpHealth.IsUnhealable();
 };
 
-Mirage.prototype.Health = function()
-{
-	return this.health;
-};
-
-Mirage.prototype.GetMaxHitpoints = function()
-{
-	return this.maxHitpoints;
-};
-
-Mirage.prototype.GetHitpoints = function()
-{
-	return this.hitpoints;
-};
-
-Mirage.prototype.NeedsRepair = function()
-{
-	return this.needsRepair;
-};
+Mirage.prototype.GetMaxHitpoints = function() { return this.maxHitpoints; };
+Mirage.prototype.GetHitpoints = function() { return this.hitpoints; };
+Mirage.prototype.IsRepairable = function() { return this.repairable; };
+Mirage.prototype.IsUnhealable = function() { return this.unhealable; };
 
 // Capture data
 
-Mirage.prototype.CopyCapturable = function(capturePoints, maxCapturePoints)
+Mirage.prototype.CopyCapturable = function(cmpCapturable)
 {
-	this.capturable = true;
-	this.capturePoints = capturePoints;
-	this.maxCapturePoints = maxCapturePoints;
+	this.miraged_iids.add(IID_Capturable);
+	this.capturePoints = cmpCapturable.GetCapturePoints();
+	this.maxCapturePoints = cmpCapturable.GetMaxCapturePoints();
 };
 
-Mirage.prototype.Capturable = function()
-{
-	return this.capturable;
-};
-
-Mirage.prototype.GetMaxCapturePoints = function()
-{
-	return this.maxCapturePoints;
-};
-
-Mirage.prototype.GetCapturePoints = function()
-{
-	return this.capturePoints;
-};
+Mirage.prototype.GetMaxCapturePoints = function() { return this.maxCapturePoints; };
+Mirage.prototype.GetCapturePoints = function() { return this.capturePoints; };
 
 Mirage.prototype.CanCapture = Capturable.prototype.CanCapture;
 
 // ResourceSupply data
 
-Mirage.prototype.CopyResourceSupply = function(maxAmount, amount, type, isInfinite)
-{
-	this.resourceSupply = true;
-	this.maxAmount = maxAmount;
-	this.amount = amount;
-	this.type = type;
-	this.isInfinite = isInfinite;
-};
-
-Mirage.prototype.ResourceSupply = function()
-{
-	return this.resourceSupply;
-};
-
-Mirage.prototype.GetMaxAmount = function()
-{
-	return this.maxAmount;
-};
-
-Mirage.prototype.GetAmount = function()
-{
-	return this.amount;
-};
-
-Mirage.prototype.GetType = function()
-{
-	return this.type;
-};
-
-Mirage.prototype.IsInfinite = function()
-{
-	return this.isInfinite;
-};
+Mirage.prototype.CopyResourceSupply = function(cmpResourceSupply)
+{
+	this.miraged_iids.add(IID_ResourceSupply);
+	this.maxAmount = cmpResourceSupply.GetMaxAmount();
+	this.amount = cmpResourceSupply.GetCurrentAmount();
+	this.type = cmpResourceSupply.GetType();
+	this.isInfinite = cmpResourceSupply.IsInfinite();
+	this.killBeforeGather = cmpResourceSupply.GetKillBeforeGather();
+	this.maxGatherers = cmpResourceSupply.GetMaxGatherers();
+	this.numGatherers = cmpResourceSupply.GetNumGatherers();
+};
+
+Mirage.prototype.GetMaxAmount = function() { return this.maxAmount; };
+Mirage.prototype.GetCurrentAmount = function() { return this.amount; };
+Mirage.prototype.GetType = function() { return this.type; };
+Mirage.prototype.IsInfinite = function() { return this.isInfinite; };
+Mirage.prototype.GetKillBeforeGather = function() { return this.killBeforeGather; };
+Mirage.prototype.GetMaxGatherers = function() { return this.maxGatherers; };
+Mirage.prototype.GetNumGatherers = function() { return this.numGatherers; };
 
 // ============================
 
Index: binaries/data/mods/public/simulation/components/ResourceGatherer.js
===================================================================
--- binaries/data/mods/public/simulation/components/ResourceGatherer.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/ResourceGatherer.js	(working copy)
@@ -253,16 +253,12 @@
  */
 ResourceGatherer.prototype.GetTargetGatherRate = function(target)
 {
-	let type;
-	let cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply);
-	let cmpMirage = Engine.QueryInterface(target, IID_Mirage);
-	if (cmpResourceSupply)
-		type = cmpResourceSupply.GetType();
-	else if (cmpMirage && cmpMirage.ResourceSupply())
-		type = cmpMirage.GetType();
-	else
+	let cmpResourceSupply = QueryMiragedInterface(target, IID_ResourceSupply);
+	if (!cmpResourceSupply)
 		return 0;
 
+	let type = cmpResourceSupply.GetType();
+
 	let rate = 0;
 	if (type.specific)
 		rate = this.GetGatherRate(type.generic+"."+type.specific);
@@ -273,7 +269,7 @@
 	let cheatMultiplier = cmpPlayer ? cmpPlayer.GetCheatTimeMultiplier() : 1;
 	rate = rate / cheatMultiplier;
 
-	if (cmpMirage)
+	if ("Mirages" in cmpResourceSupply)
 		return rate;
 
 	// Apply diminishing returns with more gatherers, for e.g. infinite farms. For most resources this has no effect. (GetDiminishingReturns will return null.)
@@ -294,11 +290,9 @@
 	// The cosine function is an oscillating curve, normally between -1 and 1. Multiplying by 0.5 squishes that down to
 	// between -0.5 and 0.5. Adding 0.5 to that changes the range to 0 to 1. The diminishingReturns constant
 	// adjusts the period of the curve.
-	// Alternatively, just find scythetwirler (who came up with the math here) or alpha123 (who wrote the code) on IRC.
-	let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
 	let diminishingReturns = cmpResourceSupply.GetDiminishingReturns();
 	if (diminishingReturns)
-		rate = (0.5 * Math.cos((cmpResourceSupply.GetGatherers().length - 1) * Math.PI / diminishingReturns) + 0.5) * rate;
+		rate = (0.5 * Math.cos((cmpResourceSupply.GetNumGatherers() - 1) * Math.PI / diminishingReturns) + 0.5) * rate;
 
 	return rate;
 };
Index: binaries/data/mods/public/simulation/components/ResourceSupply.js
===================================================================
--- binaries/data/mods/public/simulation/components/ResourceSupply.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/ResourceSupply.js	(working copy)
@@ -78,14 +78,14 @@
 	return +this.template.MaxGatherers;
 };
 
+ResourceSupply.prototype.GetNumGatherers = function()
+{
+	return this.gatherers.map(p => p.length).reduce((a, b) => a+b); 
+};
+
 ResourceSupply.prototype.GetGatherers = function()
 {
-	var numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
-	var total = [];
-	for (var playerid = 0; playerid <= numPlayers; playerid++)
-		for (var gatherer = 0; gatherer < this.gatherers[playerid].length; gatherer++)
-			total.push(this.gatherers[playerid][gatherer]);
-	return total;
+	return this.gatherers.reduce((a, b) => a.concat(b));
 };
 
 ResourceSupply.prototype.GetDiminishingReturns = function()
@@ -130,7 +130,7 @@
 
 ResourceSupply.prototype.IsAvailable = function(player, gathererID)
 {
-	if (this.GetGatherers().length < this.GetMaxGatherers() || this.gatherers[player].indexOf(gathererID) !== -1)
+	if (this.GetNumGatherers() < this.GetMaxGatherers() || this.gatherers[player].indexOf(gathererID) !== -1)
 		return true;
 	return false;
 };
Index: binaries/data/mods/public/simulation/components/StatusBars.js
===================================================================
--- binaries/data/mods/public/simulation/components/StatusBars.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/StatusBars.js	(working copy)
@@ -101,23 +101,17 @@
 		yoffset -= height * 1.2;
 	};
 
-	var cmpMirage = Engine.QueryInterface(this.entity, IID_Mirage);
-
 	var cmpPack = Engine.QueryInterface(this.entity, IID_Pack);
 	if (cmpPack && cmpPack.IsPacking())
 		AddBar("pack", cmpPack.GetProgress());
 
-	var cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
+	var cmpHealth = QueryMiragedInterface(this.entity, IID_Health);
 	if (cmpHealth && cmpHealth.GetHitpoints() > 0)
 		AddBar("health", cmpHealth.GetHitpoints() / cmpHealth.GetMaxHitpoints());
-	else if (cmpMirage && cmpMirage.Health())
-		AddBar("health", cmpMirage.GetHitpoints() / cmpMirage.GetMaxHitpoints());
 
-	var cmpResourceSupply = Engine.QueryInterface(this.entity, IID_ResourceSupply);
+	var cmpResourceSupply = QueryMiragedInterface(this.entity, IID_ResourceSupply);
 	if (cmpResourceSupply)
 		AddBar("supply", cmpResourceSupply.IsInfinite() ? 1 : cmpResourceSupply.GetCurrentAmount() / cmpResourceSupply.GetMaxAmount());
-	else if (cmpMirage && cmpMirage.ResourceSupply())
-		AddBar("supply", cmpMirage.IsInfinite() ? 1 : cmpMirage.GetAmount() / cmpMirage.GetMaxAmount());
 
 	/*
 	// Rank icon disabled for now - see discussion around
Index: binaries/data/mods/public/simulation/components/UnitAI.js
===================================================================
--- binaries/data/mods/public/simulation/components/UnitAI.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/UnitAI.js	(working copy)
@@ -1987,7 +1987,7 @@
 					var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
 					var cmpSupply = Engine.QueryInterface(this.gatheringTarget, IID_ResourceSupply);
 					var cmpMirage = Engine.QueryInterface(this.gatheringTarget, IID_Mirage);
-					if ((!cmpMirage || !cmpMirage.ResourceSupply()) &&
+					if ((!cmpMirage || !cmpMirage.Mirages(IID_ResourceSupply)) &&
 					    (!cmpSupply || !cmpSupply.AddGatherer(cmpOwnership.GetOwner(), this.entity)))
 					{
 						// Save the current order's data in case we need it later
@@ -3903,15 +3903,8 @@
 	if (cmpFormation)
 		return true;
 
-	var cmpMirage = Engine.QueryInterface(ent, IID_Mirage);
-	if (cmpMirage)
-		return true;
-
-	var cmpHealth = Engine.QueryInterface(ent, IID_Health);
-	if (!cmpHealth)
-		return false;
-
-	return (cmpHealth.GetHitpoints() != 0);
+	var cmpHealth = QueryMiragedInterface(ent, IID_Health);
+	return cmpHealth && cmpHealth.GetHitpoints() != 0;
 };
 
 /**
@@ -5019,12 +5012,9 @@
 	// before we process the order then we still know what resource
 	// type to look for more of
 	var type;
-	var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply);
-	var cmpMirage = Engine.QueryInterface(target, IID_Mirage);
+	var cmpResourceSupply = QueryMiragedInterface(target, IID_ResourceSupply);
 	if (cmpResourceSupply)
 		type = cmpResourceSupply.GetType();
-	else if (cmpMirage && cmpMirage.ResourceSupply())
-		type = cmpMirage.GetType();
 	else
 		error("CanGather allowed gathering from invalid entity");
 
@@ -5630,9 +5620,8 @@
 	if (this.IsTurret())
 		return false;
 	// The target must be a valid resource supply, or the mirage of one.
-	var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply);
-	var cmpMirage = Engine.QueryInterface(target, IID_Mirage);
-	if (!cmpResourceSupply && !(cmpMirage && cmpMirage.ResourceSupply()))
+	var cmpResourceSupply = QueryMiragedInterface(target, IID_ResourceSupply);
+	if (!cmpResourceSupply)
 		return false;
 
 	// Formation controllers should always respond to commands
Index: binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
===================================================================
--- binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js	(revision 16604)
+++ binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js	(working copy)
@@ -1,3 +1,4 @@
+Engine.LoadHelperScript("Player.js");
 Engine.LoadComponentScript("interfaces/Attack.js");
 Engine.LoadComponentScript("interfaces/AlertRaiser.js");
 Engine.LoadComponentScript("interfaces/Auras.js");
Index: binaries/data/mods/public/simulation/helpers/Player.js
===================================================================
--- binaries/data/mods/public/simulation/helpers/Player.js	(revision 16604)
+++ binaries/data/mods/public/simulation/helpers/Player.js	(working copy)
@@ -223,6 +223,21 @@
 }
 
 /**
+ * Similar to Engine.QueryInterface but first checks if the entity
+ * mirages the interface.
+ */
+function QueryMiragedInterface(ent, iid)
+{
+	var cmp = Engine.QueryInterface(ent, IID_Mirage);
+	if (cmp && !cmp.Mirages(iid))
+		return null;
+	else if (!cmp)
+		cmp = Engine.QueryInterface(ent, iid);
+
+	return cmp;
+}
+
+/**
  * Returns true if the entity 'target' is owned by an ally of
  * the owner of 'entity'.
  */
@@ -379,6 +394,7 @@
 Engine.RegisterGlobal("LoadPlayerSettings", LoadPlayerSettings);
 Engine.RegisterGlobal("QueryOwnerInterface", QueryOwnerInterface);
 Engine.RegisterGlobal("QueryPlayerIDInterface", QueryPlayerIDInterface);
+Engine.RegisterGlobal("QueryMiragedInterface", QueryMiragedInterface);
 Engine.RegisterGlobal("IsOwnedByAllyOfEntity", IsOwnedByAllyOfEntity);
 Engine.RegisterGlobal("IsOwnedByMutualAllyOfEntity", IsOwnedByMutualAllyOfEntity);
 Engine.RegisterGlobal("IsOwnedByPlayer", IsOwnedByPlayer);

