Ticket #880: owner_check_command_gui.patch
File owner_check_command_gui.patch, 13.6 KB (added by , 13 years ago) |
---|
-
binaries/data/mods/public/gui/session/input.js
118 118 return {"possible": false}; 119 119 120 120 // If the selection isn't friendly units, no action 121 var player = Engine.GetPlayerID(); 122 if (entState.player != player && !g_DevSettings.controlAll) 121 var playerID = Engine.GetPlayerID(); 122 var allOwnedByPlayer = selection.every(function(ent) { 123 var entState = GetEntityState(ent); 124 return entState && entState.player == playerID; 125 }); 126 127 if (!g_DevSettings.controlAll && !allOwnedByPlayer) 123 128 return {"possible": false}; 124 129 125 130 // Work out whether the selection can have rally points … … 128 133 return entState && entState.rallyPoint; 129 134 }); 130 135 131 132 136 133 137 if (!target) 134 138 { … … 240 244 return undefined; 241 245 242 246 // If the selection isn't friendly units, no action 243 var player = Engine.GetPlayerID(); 244 if (entState.player != player && !g_DevSettings.controlAll) 247 var playerID = Engine.GetPlayerID(); 248 var allOwnedByPlayer = selection.every(function(ent) { 249 var entState = GetEntityState(ent); 250 return entState && entState.player == playerID; 251 }); 252 253 if (!g_DevSettings.controlAll && !allOwnedByPlayer) 245 254 return undefined; 246 255 247 256 // Work out whether the selection can have rally points … … 421 430 bandbox.size = [x0, y0, x1, y1].join(" "); 422 431 bandbox.hidden = false; 423 432 433 // TODO: Should we handle "control all units" here as well? 424 434 var ents = Engine.PickFriendlyEntitiesInRect(x0, y0, x1, y1, Engine.GetPlayerID()); 425 435 g_Selection.setHighlightList(ents); 426 436 … … 440 450 bandbox.hidden = true; 441 451 442 452 // Get list of entities limited to preferred entities 453 // TODO: Should we handle "control all units" here as well? 443 454 var ents = Engine.PickFriendlyEntitiesInRect(x0, y0, x1, y1, Engine.GetPlayerID()); 444 455 var preferredEntities = getPreferredEntities(ents) 445 456 … … 487 498 { 488 499 case "mousemotion": 489 500 // If the mouse moved far enough from the original click location, 490 // then switch to drag-orientatio mode501 // then switch to drag-orientation mode 491 502 var dragDeltaX = ev.x - dragStart[0]; 492 503 var dragDeltaY = ev.y - dragStart[1]; 493 504 var maxDragDelta = 16; … … 761 772 } 762 773 } 763 774 775 // TODO: Should we handle "control all units" here as well? 764 776 ents = Engine.PickSimilarFriendlyEntities(templateToMatch, showOffscreen, matchRank); 765 777 } 766 778 else … … 1059 1071 var template = GetTemplateData(entState.template); 1060 1072 var unitName = getEntityName(template); 1061 1073 1062 var player = Engine.GetPlayerID();1063 if (entState.player == player || g_DevSettings.controlAll)1074 var playerID = Engine.GetPlayerID(); 1075 if (entState.player == playerID || g_DevSettings.controlAll) 1064 1076 { 1065 1077 switch (commandName) 1066 1078 { -
binaries/data/mods/public/gui/session/selection.js
261 261 var selectionSize = this.toList().length; 262 262 var i = 1; 263 263 var added = []; 264 var playerID = Engine.GetPlayerID(); 265 var allowEnemySelections = g_DevSettings.controlAll || (ents.length == 1 && selectionSize == 0); 264 266 265 267 for each (var ent in ents) 266 268 { 267 if (!this.selected[ent] && (selectionSize + i) <= MAX_SELECTION_SIZE) 269 // Only add entities we own to our selection 270 var entState = GetEntityState(ent); 271 if (!this.selected[ent] && (selectionSize + i) <= MAX_SELECTION_SIZE && (allowEnemySelections || (entState && entState.player == playerID))) 268 272 { 269 273 added.push(ent); 270 274 this.selected[ent] = ent; -
binaries/data/mods/public/gui/session/session.js
160 160 handleNetMessage(message); 161 161 } 162 162 163 g_DevSettings.controlAll = getGUIObjectByName("devControlAll").checked;164 // TODO: at some point this controlAll needs to disable the simulation code's165 // player checks (once it has some player checks)166 167 163 updateCursor(); 168 164 169 165 // If the selection changed, we need to regenerate the sim display -
binaries/data/mods/public/gui/session/session.xml
105 105 </action> 106 106 107 107 <object size="0 0 100%-18 16" type="text" style="devCommandsText">Control all units</object> 108 <object size="100%-16 0 100% 16" type="checkbox" name="devControlAll" style="wheatCrossBox"/> 108 <object size="100%-16 0 100% 16" type="checkbox" name="devControlAll" style="wheatCrossBox"> 109 <action on="Press"> g_DevSettings.controlAll = this.checked; 110 Engine.PostNetworkCommand( {"type": "control-all", "flag": this.checked} ); 111 </action> 112 </object> 109 113 110 114 <object size="0 16 100%-18 32" type="text" style="devCommandsText">Display selection state</object> 111 115 <object size="100%-16 16 100% 32" type="checkbox" name="devDisplayState" style="wheatCrossBox"/> -
binaries/data/mods/public/simulation/helpers/Commands.js
1 // Array to hold "control all units" data for each player 2 var g_ControlAllUnits = []; 3 1 4 function ProcessCommand(player, cmd) 2 5 { 3 // print("command: " + player + " " + uneval(cmd) + "\n"); 4 5 // TODO: all of this stuff needs to do checks for valid arguments 6 // (e.g. make sure players own the units they're trying to use) 6 // TODO: check any other arguments for validity 7 7 8 8 switch (cmd.type) 9 9 { … … 16 16 cmpGuiInterface.PushNotification({"type": "chat", "player": player, "message": cmd.message}); 17 17 break; 18 18 19 case "control-all": 20 g_ControlAllUnits[player] = cmd.flag; 21 break; 22 19 23 case "reveal-map": 20 24 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 21 25 cmpRangeManager.SetLosRevealAll(cmd.enable); 22 26 break; 23 27 24 28 case "walk": 25 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 29 var entities = FilterEntityList(cmd.entities, player); 30 var cmpUnitAI = GetFormationUnitAI(entities); 26 31 if (cmpUnitAI) 27 32 cmpUnitAI.Walk(cmd.x, cmd.z, cmd.queued); 28 33 break; 29 34 30 35 case "attack": 31 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 36 var entities = FilterEntityList(cmd.entities, player); 37 var cmpUnitAI = GetFormationUnitAI(entities); 32 38 if (cmpUnitAI) 33 39 cmpUnitAI.Attack(cmd.target, cmd.queued); 34 40 break; 35 41 36 42 case "repair": 37 43 // This covers both repairing damaged buildings, and constructing unfinished foundations 38 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 39 if (cmpUnitAI) 40 cmpUnitAI.Repair(cmd.target, cmd.autocontinue, cmd.queued); 44 if (g_ControlAllUnits[player] || IsOwnedByPlayer(cmd.target, player)) 45 { 46 var entities = FilterEntityList(cmd.entities, player); 47 var cmpUnitAI = GetFormationUnitAI(entities); 48 if (cmpUnitAI) 49 cmpUnitAI.Repair(cmd.target, cmd.autocontinue, cmd.queued); 50 } 41 51 break; 42 52 43 53 case "gather": 44 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 54 var entities = FilterEntityList(cmd.entities, player); 55 var cmpUnitAI = GetFormationUnitAI(entities); 45 56 if (cmpUnitAI) 46 57 cmpUnitAI.Gather(cmd.target, cmd.queued); 47 58 break; 48 59 49 60 case "returnresource": 50 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 61 var entities = FilterEntityList(cmd.entities, player); 62 var cmpUnitAI = GetFormationUnitAI(entities); 51 63 if (cmpUnitAI) 52 64 cmpUnitAI.ReturnResource(cmd.target, cmd.queued); 53 65 break; 54 66 55 67 case "train": 56 var queue = Engine.QueryInterface(cmd.entity, IID_TrainingQueue); 57 if (queue) 58 queue.AddBatch(cmd.template, +cmd.count, cmd.metadata); 68 if (g_ControlAllUnits[player] || IsOwnedByPlayer(cmd.entity, player)) 69 { 70 var queue = Engine.QueryInterface(cmd.entity, IID_TrainingQueue); 71 if (queue) 72 queue.AddBatch(cmd.template, +cmd.count, cmd.metadata); 73 } 59 74 break; 60 75 61 76 case "stop-train": 62 var queue = Engine.QueryInterface(cmd.entity, IID_TrainingQueue); 63 if (queue) 64 queue.RemoveBatch(cmd.id); 77 if (g_ControlAllUnits[player] || IsOwnedByPlayer(cmd.entity, player)) 78 { 79 var queue = Engine.QueryInterface(cmd.entity, IID_TrainingQueue); 80 if (queue) 81 queue.RemoveBatch(cmd.id); 82 } 65 83 break; 66 84 67 85 case "construct": … … 86 104 * . If it's destroyed, an appropriate fraction of the resource cost is refunded. 87 105 * . If it's completed, it gets replaced with the real building. 88 106 */ 107 108 // Check that we can control these units 109 var entities = FilterEntityList(cmd.entities, player); 110 if (!entities.length) 111 break; 89 112 90 113 // Find the player 91 114 var cmpPlayerMan = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); … … 160 183 { 161 184 ProcessCommand(player, { 162 185 "type": "repair", 163 "entities": cmd.entities,186 "entities": entities, 164 187 "target": ent, 165 188 "autocontinue": cmd.autocontinue, 166 189 "queued": cmd.queued … … 170 193 break; 171 194 172 195 case "delete-entities": 173 for each (var ent in cmd.entities) 196 var entities = FilterEntityList(cmd.entities, player); 197 for each (var ent in entities) 174 198 { 175 // Verify the player owns the unit176 var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);177 if (!cmpOwnership || cmpOwnership.GetOwner() != player)178 continue;179 180 199 var cmpHealth = Engine.QueryInterface(ent, IID_Health); 181 200 if (cmpHealth) 182 201 cmpHealth.Kill(); … … 186 205 break; 187 206 188 207 case "set-rallypoint": 189 for each (var ent in cmd.entities) 208 var entities = FilterEntityList(cmd.entities, player); 209 for each (var ent in entities) 190 210 { 191 211 var cmpRallyPoint = Engine.QueryInterface(ent, IID_RallyPoint); 192 212 if (cmpRallyPoint) … … 195 215 break; 196 216 197 217 case "unset-rallypoint": 198 for each (var ent in cmd.entities) 218 var entities = FilterEntityList(cmd.entities, player); 219 for each (var ent in entities) 199 220 { 200 221 var cmpRallyPoint = Engine.QueryInterface(ent, IID_RallyPoint); 201 222 if (cmpRallyPoint) … … 212 233 break; 213 234 214 235 case "garrison": 215 var targetCmpOwnership = Engine.QueryInterface(cmd.target, IID_Ownership); 216 if (!targetCmpOwnership || targetCmpOwnership.GetOwner() != player) 217 break; 218 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 219 if (cmpUnitAI) 220 cmpUnitAI.Garrison(cmd.target); 236 if (g_ControlAllUnits[player] || IsOwnedByPlayer(cmd.target, player)) 237 { 238 var entities = FilterEntityList(cmd.entities, player); 239 var cmpUnitAI = GetFormationUnitAI(entities); 240 if (cmpUnitAI) 241 cmpUnitAI.Garrison(cmd.target); 242 } 221 243 break; 222 244 223 245 case "unload": 224 var cmpOwnership = Engine.QueryInterface(cmd.garrisonHolder, IID_Ownership);225 if (!cmpOwnership || cmpOwnership.GetOwner() != player)226 break;227 var cmpGarrisonHolder = Engine.QueryInterface(cmd.garrisonHolder, IID_GarrisonHolder);228 if (cmpGarrisonHolder)229 cmpGarrisonHolder.Unload(cmd.entity);246 if (g_ControlAllUnits[player] || IsOwnedByPlayer(cmd.garrisonHolder, player)) 247 { 248 var cmpGarrisonHolder = Engine.QueryInterface(cmd.garrisonHolder, IID_GarrisonHolder); 249 if (cmpGarrisonHolder) 250 cmpGarrisonHolder.Unload(cmd.entity); 251 } 230 252 break; 231 253 232 254 case "unload-all": 233 var cmpOwnership = Engine.QueryInterface(cmd.garrisonHolder, IID_Ownership); 234 if (!cmpOwnership || cmpOwnership.GetOwner() != player) 235 break; 236 237 var cmpGarrisonHolder = Engine.QueryInterface(cmd.garrisonHolder, IID_GarrisonHolder); 238 cmpGarrisonHolder.UnloadAll(); 255 if (g_ControlAllUnits[player] || IsOwnedByPlayer(cmd.garrisonHolder, player)) 256 { 257 var cmpGarrisonHolder = Engine.QueryInterface(cmd.garrisonHolder, IID_GarrisonHolder); 258 cmpGarrisonHolder.UnloadAll(); 259 } 239 260 break; 240 261 241 262 case "formation": 242 var cmpUnitAI = GetFormationUnitAI(cmd.entities); 263 var entities = FilterEntityList(cmd.entities, player); 264 var cmpUnitAI = GetFormationUnitAI(entities); 243 265 if (!cmpUnitAI) 244 266 break; 245 267 var cmpFormation = Engine.QueryInterface(cmpUnitAI.entity, IID_Formation); … … 250 272 break; 251 273 252 274 case "promote": 275 var entities = FilterEntityList(cmd.entities, player); 253 276 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 254 277 cmpGuiInterface.PushNotification({"type": "chat", "player": player, "message": "(Cheat - promoted units)"}); 255 278 256 for each (var ent in cmd.entities)279 for each (var ent in entities) 257 280 { 258 281 var cmpPromotion = Engine.QueryInterface(ent, IID_Promotion); 259 282 if (cmpPromotion) … … 262 285 break; 263 286 264 287 case "stance": 265 for each (var ent in cmd.entities) 288 var entities = FilterEntityList(cmd.entities, player); 289 for each (var ent in entities) 266 290 { 267 291 var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); 268 292 if (cmpUnitAI) … … 505 529 return true; 506 530 } 507 531 532 // Check if entity is owned by player 533 function IsOwnedByPlayer(entity, player) 534 { 535 var cmpOwnership = Engine.QueryInterface(entity, IID_Ownership); 536 return (cmpOwnership && cmpOwnership.GetOwner() == player); 537 } 538 539 // Filter entities which the player actually owns 540 function FilterEntityList(entities, player) 541 { 542 var ret = []; 543 for each (var ent in entities) 544 { 545 if (g_ControlAllUnits[player] || IsOwnedByPlayer(ent, player)) 546 ret.push(ent); 547 } 548 549 return ret; 550 } 551 508 552 Engine.RegisterGlobal("CanMoveEntsIntoFormation", CanMoveEntsIntoFormation); 509 553 Engine.RegisterGlobal("ProcessCommand", ProcessCommand);