Ticket #744: free_worker-28-02-2011.diff

File free_worker-28-02-2011.diff, 4.5 KB (added by veprbl, 13 years ago)
  • binaries/data/mods/public/gui/session/session.xml

     
    1515    <script file="gui/session/unit_commands.js"/>
    1616    <script file="gui/session/messages.js"/>
    1717    <script file="gui/session/utility_functions.js"/>
     18    <script file="gui/session/freeworker.js"/>
    1819
    1920    <object name="sn" hotkey="session.gui.toggle">
    2021        <action on="Tick">
     
    387388    </object> <!-- END OF TOP PANEL -->
    388389
    389390    <!-- ================================  ================================ -->
     391    <!-- Free Worker Button -->
     392    <!-- ================================  ================================ -->
     393    <object name="freeWorkerPanel"
     394        size="50%-544 100%-32 50%-512 100%"
     395        type="image"
     396        sprite="mapPanel"
     397        hidden="false"
     398        ghost="false"
     399    >
     400        <object type="button"
     401            name="freeWorkerButton"
     402            size="0 0 100% 100%"
     403            tooltip_style="sessionToolTipBold"
     404            tooltip="Find idle worker"
     405        >
     406            <object size="0 0 100% 100%" type="image" sprite="freeWorker" name="freeWorkerButtonImage" ghost="true" />
     407            <action on="Press">findFreeWorker();</action>
     408        </object>
     409    </object>
     410
     411    <!-- ================================  ================================ -->
    390412    <!-- START of BOTTOM PANEL -->
    391413    <!-- ================================  ================================ -->
    392414    <object size="50%-512 100%-180 50%+512 100%">
  • binaries/data/mods/public/gui/session/freeworker.js

     
     1function findFreeWorker()
     2{
     3    var ent, pos;
     4
     5    [ent, pos] = Engine.GuiInterfaceCall("FindFreeWorker");
     6
     7    if (ent)
     8    {
     9        g_Selection.reset()
     10        g_Selection.addList([ent]);
     11        Engine.SetCameraTarget(pos.x, pos.y, pos.z);
     12    }
     13}
     14 No newline at end of file
  • binaries/data/mods/public/gui/session/sprites.xml

     
    99        />
    1010    </sprite>
    1111
     12    <sprite name="freeWorker">
     13        <image
     14            texture="session/icons/single/repair.png"
     15            cell_size="32 32"
     16            size="0 0 100% 100%"
     17        />
     18    </sprite>
     19
    1220    <!-- ================================  ================================ -->
    1321    <!-- Unit Command Icons -->
    1422    <!-- ================================  ================================ -->
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    473473    cmpRangeManager.SetDebugOverlay(enabled);
    474474};
    475475
     476var _prevWorker = -1;
     477
     478function isFreeWorker(ent)
     479{
     480    var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
     481    var cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
     482
     483    if (cmpIdentity && cmpUnitAI && cmpUnitAI.IsIdle())
     484    {
     485        var classes = cmpIdentity.GetClassesList();
     486
     487        if (classes.indexOf("Worker") != -1)
     488        {
     489            return true;
     490        }
     491    }
     492    return false;
     493}
     494
     495GuiInterface.prototype.FindFreeWorker = function(player)
     496{
     497    var rangeMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     498    var playerEntities = rangeMan.GetEntitiesByPlayer(player);
     499
     500    var worker = null;
     501
     502    for each (var ent in playerEntities)
     503    {
     504        if ((worker == null || ent > _prevWorker) && isFreeWorker(ent))
     505        {
     506            worker = ent;
     507
     508            if (ent > _prevWorker)
     509            {
     510                break;
     511            }
     512        }
     513    }
     514
     515    if (worker == null)
     516    {
     517        return [null, null]
     518    }
     519
     520    var cmpPosition = Engine.QueryInterface(worker, IID_Position);
     521
     522    if (cmpPosition)
     523    {
     524        _prevWorker = worker;
     525        return [worker, cmpPosition.GetPosition()];
     526    }
     527    else
     528    {
     529        return [null, null];
     530    }
     531};
     532
    476533// List the GuiInterface functions that can be safely called by GUI scripts.
    477534// (GUI scripts are non-deterministic and untrusted, so these functions must be
    478535// appropriately careful. They are called with a first argument "player", which is
     
    495552    "SetPathfinderDebugOverlay": 1,
    496553    "SetObstructionDebugOverlay": 1,
    497554    "SetMotionDebugOverlay": 1,
    498     "SetRangeDebugOverlay": 1
     555    "SetRangeDebugOverlay": 1,
     556
     557    "FindFreeWorker": 1
    499558};
    500559
    501560GuiInterface.prototype.ScriptCall = function(player, name, args)