# Add idle worker button, based on patch from veprbl.
Fixes #744. This was SVN commit r9140.
This commit is contained in:
parent
ce85f4e825
commit
6d3d93c355
@ -147,6 +147,7 @@ hotkey.selection.group.add = Shift ; +group: Add units to group
|
||||
hotkey.selection.group.save = Ctrl ; +group: Save units to group
|
||||
hotkey.selection.group.snap = Alt ; +group: Check up on group
|
||||
hotkey.selection.snap = Home ; Centre view on selection
|
||||
hotkey.selection.idle = Period
|
||||
|
||||
; > SESSION CONTROLS
|
||||
hotkey.session.kill = Delete ; Destroy selected units
|
||||
|
@ -1088,6 +1088,22 @@ function setCameraFollow(entity)
|
||||
Engine.CameraFollow(0);
|
||||
}
|
||||
|
||||
var lastIdleWorker = 0;
|
||||
function findIdleWorker()
|
||||
{
|
||||
lastIdleWorker = Engine.GuiInterfaceCall("FindIdleWorker", lastIdleWorker);
|
||||
if (lastIdleWorker)
|
||||
{
|
||||
g_Selection.reset()
|
||||
g_Selection.addList([lastIdleWorker]);
|
||||
Engine.CameraFollow(lastIdleWorker);
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: display a message or play a sound to indicate no more idle units, or something
|
||||
}
|
||||
}
|
||||
|
||||
function unload(garrisonHolder, entity)
|
||||
{
|
||||
Engine.PostNetworkCommand({"type": "unload", "entity": entity, "garrisonHolder": garrisonHolder});
|
||||
|
@ -386,9 +386,28 @@
|
||||
|
||||
</object> <!-- END OF TOP PANEL -->
|
||||
|
||||
<!-- ================================ ================================ -->
|
||||
<!-- Idle Worker Button -->
|
||||
<!-- ================================ ================================ -->
|
||||
<object type="image"
|
||||
size="50%-512 100%-240 50%-480 100%-208"
|
||||
sprite="mapPanel"
|
||||
>
|
||||
<object type="button"
|
||||
tooltip_style="sessionToolTip"
|
||||
tooltip="Find idle worker"
|
||||
hotkey="selection.idle"
|
||||
>
|
||||
<!-- TODO: should highlight the button if there's non-zero idle workers -->
|
||||
<object size="0 0 100% 100%" type="image" sprite="idleWorker" ghost="true" />
|
||||
<action on="Press">findIdleWorker();</action>
|
||||
</object>
|
||||
</object>
|
||||
|
||||
<!-- ================================ ================================ -->
|
||||
<!-- START of BOTTOM PANEL -->
|
||||
<!-- ================================ ================================ -->
|
||||
|
||||
<object size="50%-512 100%-180 50%+512 100%">
|
||||
|
||||
<!-- ================================ ================================ -->
|
||||
|
@ -9,6 +9,14 @@
|
||||
/>
|
||||
</sprite>
|
||||
|
||||
<sprite name="idleWorker">
|
||||
<image
|
||||
texture="session/icons/single/repair.png"
|
||||
cell_size="32 32"
|
||||
size="0 0 100% 100%"
|
||||
/>
|
||||
</sprite>
|
||||
|
||||
<!-- ================================ ================================ -->
|
||||
<!-- Unit Command Icons -->
|
||||
<!-- ================================ ================================ -->
|
||||
|
@ -445,6 +445,34 @@ GuiInterface.prototype.PlaySound = function(player, data)
|
||||
PlaySound(data.name, data.entity);
|
||||
};
|
||||
|
||||
function isIdleWorker(ent)
|
||||
{
|
||||
var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
|
||||
var cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
|
||||
return (cmpUnitAI && cmpIdentity && cmpUnitAI.IsIdle() && cmpIdentity.HasClass("Worker"));
|
||||
}
|
||||
|
||||
GuiInterface.prototype.FindIdleWorker = function(player, prevWorker)
|
||||
{
|
||||
var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
|
||||
var playerEntities = rangeMan.GetEntitiesByPlayer(player);
|
||||
|
||||
var firstUnit = 0;
|
||||
|
||||
// Find the first matching entity that is after the previous selection,
|
||||
// so that we cycle around in a predictable order
|
||||
for each (var ent in playerEntities)
|
||||
{
|
||||
if (ent > prevWorker && isIdleWorker(ent))
|
||||
return ent;
|
||||
else if (!firstUnit && isIdleWorker(ent))
|
||||
firstUnit = ent;
|
||||
}
|
||||
|
||||
// Nothing after the selection - just return the first entity
|
||||
return firstUnit;
|
||||
};
|
||||
|
||||
GuiInterface.prototype.SetPathfinderDebugOverlay = function(player, enabled)
|
||||
{
|
||||
var cmpPathfinder = Engine.QueryInterface(SYSTEM_ENTITY, IID_Pathfinder);
|
||||
@ -491,11 +519,12 @@ var exposedFunctions = {
|
||||
"DisplayRallyPoint": 1,
|
||||
"SetBuildingPlacementPreview": 1,
|
||||
"PlaySound": 1,
|
||||
"FindIdleWorker": 1,
|
||||
|
||||
"SetPathfinderDebugOverlay": 1,
|
||||
"SetObstructionDebugOverlay": 1,
|
||||
"SetMotionDebugOverlay": 1,
|
||||
"SetRangeDebugOverlay": 1
|
||||
"SetRangeDebugOverlay": 1,
|
||||
};
|
||||
|
||||
GuiInterface.prototype.ScriptCall = function(player, name, args)
|
||||
|
@ -133,4 +133,9 @@ Identity.prototype.GetClassesList = function()
|
||||
}
|
||||
};
|
||||
|
||||
Identity.prototype.HasClass = function(name)
|
||||
{
|
||||
return this.GetClassesList().indexOf(name) != -1;
|
||||
};
|
||||
|
||||
Engine.RegisterComponentType(IID_Identity, "Identity", Identity);
|
||||
|
Loading…
Reference in New Issue
Block a user