Some entities like lighthouse use the dock Category in BuildRestrictions to check the special placement constraint but also have their own entity limits.
Details
- Reviewers
leper s0600204 mimo - Group Reviewers
Restricted Owners Package (Owns No Changed Paths) - Commits
- rP19839: Use PlacementType instead of Category in BuildRestriction for the hardcoded…
An in game test could be to try to build several lighthouse with or without the patch.
Diff Detail
- Repository
- rP 0 A.D. Public Repository
- Branch
- /ps/trunk
- Lint
No Lint Coverage - Unit
No Test Coverage - Build Status
Buildable 1293 Build 2036: Vulcan Build Jenkins Build 2035: arc lint + arc unit
Event Timeline
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK!
http://jw:8080/job/phabricator/894/ for more details.
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK!
http://jw:8080/job/phabricator/895/ for more details.
Wouldn't it be better to reform the category element into a "list" so multiple categories can be added? and we check for MatchesClassList() on the "Dock" (and other) checks.
I had in mind to indeed move the Special entry to a token one. Easily extendable from that diff.
For the category one, that was what I had first in mind (see the ticket description) but it hardly match with the EntityLimit component imo.
So I was for a unique category but a list of special (hardcoded) constraints.
When we only allow a list of categories (no things with !Foo), the GetCategory function could then return an array, which could be looped over in the EntityLimits, doesn't seem to break anything there. We probably also need to change the trainingsRestriction.template.Category too in an array. Bet changing that component would be nice anyway for consistency.
Yes, I get what you say.
What leads me to split is that we should not mix the Category which is used for entity limits and the Special hardcoded constraints.
Else one should take care for example to not use one of those in Category to define an entity limit for example (and some other confusing things...)
Thanks for sharing thoughts!
binaries/data/mods/public/simulation/components/BuildRestrictions.js | ||
---|---|---|
40 | Could we use a choice for this one? Since all available choices for this are likely to require code additions I don't think using text here is worth it. (Especially since one of those can be checked easily, while the other one cannot.) Also if we make this some zeroOrMore thing we might make this non-optional (since optionals tend to make errors harder to decipher), but in this case optional doesn't seem that bad. | |
229 | if that was non-optional we wouldn't need this additional check. Also using text above doesn't work that well if we compare the whole thing here. |
binaries/data/mods/public/simulation/components/BuildRestrictions.js | ||
---|---|---|
40 | I hesistate between make "<choice>"+ "<element name='Dock'>"+ "<empty/>"+ "</element>"+ "</choice>"+ "</zeroOrMore>" and "<element name='Special' a:help='Specifies special constraints.'>" + "<list>" + "<zeroOrMore>" + "<choice>" + "<value>Dock</value>" + "</choice>" + "</zeroOrMore>" + "</list>" + "</element>" |
Use choice instead of text as adviced by leper. In that version elements are used but perhaps values are better (but would require to manipulate text/array). The special level remains mainly for readability but could be removed.
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK!
http://jw:8080/job/phabricator/1121/ for more details.
binaries/data/mods/public/simulation/components/BuildRestrictions.js | ||
---|---|---|
229 | This should most likely be this.template.Special.Dock. Trying to place eg a house somewhere valid results in the following errors ERROR: JavaScript error: simulation/components/BuildRestrictions.js line 233 TypeError: invalid 'in' operand this.template.Special BuildRestrictions.prototype.CheckPlacement@simulation/components/BuildRestrictions.js:233:1 GuiInterface.prototype.SetBuildingPlacementPreview@simulation/components/GuiInterface.js:1095:13 GuiInterface.prototype.ScriptCall@simulation/components/GuiInterface.js:2014:10 updateBuildingPlacementPreview@gui/session/input.js:101:17 handleInputAfterGui@gui/session/input.js:1072:4 ERROR: Error calling component script function ScriptCall ERROR: JavaScript error: gui/session/input.js line 110 TypeError: result is undefined updateBuildingPlacementPreview@gui/session/input.js:110:36 handleInputAfterGui@gui/session/input.js:1072:4 Trying to place it somewhere invalid works though. Also placing something like a dock works. |
binaries/data/mods/public/simulation/components/BuildRestrictions.js | ||
---|---|---|
229 | Thanks! |
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK!
http://jw:8080/job/phabricator/1178/ for more details.
I note that with this applied, the lighthouse no longer rotates automatically to align itself with the shore. Neither do the brit crannog or the cart "super" dock,
This appears to be controlled in the GuiInterface component, line 1686.
binaries/data/mods/public/simulation/templates/template_structure_military_dock.xml | ||
---|---|---|
6 ↗ | (On Diff #1893) | As there's no limit on the number of docks players can build, is there any point in keeping the Dock category? Alternatively, if you do wish to keep it, why remove it from the cart "super" dock, which is also a dock. |
thx for noticing
binaries/data/mods/public/simulation/templates/template_structure_military_dock.xml | ||
---|---|---|
6 ↗ | (On Diff #1893) | In case perhaps. |
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK!
http://jw:8080/job/phabricator/1242/ for more details.
Giving it some thought, I notice there is one thing that the four templates have in common that no other template in 0ad has - they all have a BuildRestrictions/PlacementType value of shore. Would it perhaps be possible to check for that instead of adding a new bit to the entity definition? (Might be its not possible. or is a terrible idea, I'm just a-wondering.)
Otherwise, thanks for getting the auto-orientation working again.
Indeed it would do the job. But I am not certain that those two things are strictly equals (looking at the TODO for example) and if some other special placement constraints could be added.
Fair enough, it was just a thought. Maybe the new restriction should be named something like "shoreline" as it doesn't just affect docks?
Giving it some thought, I notice there is one thing that the four templates have in common that no other template in 0ad has - they all have a BuildRestrictions/PlacementType value of shore. Would it perhaps be possible to check for that instead of adding a new bit to the entity definition? (Might be its not possible. or is a terrible idea, I'm just a-wondering.)
Indeed it would do the job. But I am not certain that those two things are strictly equals (looking at the TODO for example) and if some other special placement constraints could be added.
Well other special constraints will have to do some work later on anyway. I'm not sure if linking it to the PlacementType is a good idea, but it does seem quite tempting (especially given that everything with that placement type sort of needs that (unless I'm missing some obvious counter-example, which is quite possible)). Considering what would happen if we went for that could help with figuring out if that would come back to haunt us, or if we'll regret not doing this.
It's really simpler and should handle many situtations.
@mimo had the same idea recently.
I let the Category 'Dock' for carth super dock (currently there are no entity limit).
Executing section Default... Executing section Source... Executing section JS... binaries/data/mods/public/simulation/components/BuildRestrictions.js | 149| » » switch·(ret) | | [NORMAL] ESLintBear (default-case): | | Expected a default case. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 267| » » » var·cmpIdentity·=·Engine.QueryInterface(id,·IID_Identity); | | [NORMAL] ESLintBear (no-shadow): | | 'cmpIdentity' is already declared in the upper scope. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 127| » case·"land": | | [NORMAL] JSHintBear: | | Expected a 'break' statement before 'default'. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 144| » » var·ret·=·cmpObstruction.CheckFoundation(passClassName,·false); | | [NORMAL] JSHintBear: | | 'ret' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 167| » var·cmpPlayer·=·QueryOwnerInterface(this.entity,·IID_Player); | | [NORMAL] JSHintBear: | | 'cmpPlayer' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 177| » var·isNeutral·=·tileOwner·==·0; | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 251| » » » ||·(cmpWaterManager.GetWaterLevel(pos.x·-·sz,·pos.y·-·cz)·-·cmpTerrain.GetGroundLevel(pos.x·-·sz,·pos.y·-·cz))·>·2.0)·//·back | | [NORMAL] JSHintBear: | | Misleading line break before '||'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 261| » » var·cmpRangeManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_RangeManager); | | [NORMAL] JSHintBear: | | 'cmpRangeManager' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 262| » » var·cmpPlayer·=·QueryOwnerInterface(this.entity,·IID_Player); | | [NORMAL] JSHintBear: | | 'cmpPlayer' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 277| » » » » var·result·=·markForPluralTranslation( | | [NORMAL] JSHintBear: | | 'result' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 295| » » » var·dist·=·+this.template.Distance.MaxDistance; | | [NORMAL] JSHintBear: | | 'dist' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 296| » » » var·nearEnts·=·cmpRangeManager.ExecuteQuery(this.entity,·0,·dist,·[cmpPlayer.GetPlayerID()],·IID_BuildRestrictions).filter(filter); | | [NORMAL] JSHintBear: | | 'nearEnts' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 299| » » » » var·result·=·markForPluralTranslation( | | [NORMAL] JSHintBear: | | 'result' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 147| » if·(ret·!=·"success") | | [NORMAL] JSHintBear: | | 'ret' used out of scope. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 149| » » switch·(ret) | | [NORMAL] JSHintBear: | | 'ret' used out of scope. binaries/data/mods/public/simulation/helpers/Commands.js | 882| » var·ids·=·[·id·for·(id·in·members)·]; | | [MAJOR] ESLintBear: | | Parsing error: Unexpected token for binaries/data/mods/public/simulation/helpers/Commands.js | 53| var·g_Commands·=·{ | | [NORMAL] JSHintBear: | | 'g_Commands' was used before it was defined. binaries/data/mods/public/simulation/helpers/Commands.js | 175| » » let·allowCapture·=·cmd.allowCapture·||·cmd.allowCapture·==·null; | | [NORMAL] JSHintBear: | | Use '===' to compare with 'null'. binaries/data/mods/public/simulation/helpers/Commands.js | 499| » » if·(notUngarrisoned·!=·0) | | [NORMAL] JSHintBear: | | Use '!==' to compare with '0'. binaries/data/mods/public/simulation/helpers/Commands.js | 513| » » » » ····&&·player·!=·+cmd.owner) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/helpers/Commands.js | 701| » » » » var·cmpGUIInterface·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_GuiInterface); | | [NORMAL] JSHintBear: | | 'cmpGUIInterface' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js | 882| » var·ids·=·[·id·for·(id·in·members)·]; | | [NORMAL] JSHintBear: | | 'array comprehension' is only available in Mozilla JavaScript extensions (use moz option). binaries/data/mods/public/simulation/helpers/Commands.js | 882| » var·ids·=·[·id·for·(id·in·members)·]; | | [NORMAL] JSHintBear: | | Expected 'for' and instead saw 'id'. binaries/data/mods/public/simulation/helpers/Commands.js | 932| » » for·(var·i·=·0;·i·<·length;·++i) | | [NORMAL] JSHintBear: | | 'i' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js | 945| » » var·count·=·0; | | [NORMAL] JSHintBear: | | 'count' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1092| » » var·cmpGuiInterface·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_GuiInterface); | | [NORMAL] JSHintBear: | | 'cmpGuiInterface' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1256| » » » if·(!(i·==·0·&&·piece.template·==·cmd.wallSet.templates.tower·&&·!cmd.startSnappedEntity)) | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. binaries/data/mods/public/simulation/helpers/Commands.js |1344| » » var·piece·=·pieces[j]; | | [NORMAL] JSHintBear: | | 'piece' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1373| » » » » if·(lastTowerControlGroup·!=·null·&&·lastTowerControlGroup·!=·INVALID_ENTITY) | | [NORMAL] JSHintBear: | | Use '!==' to compare with 'null'. binaries/data/mods/public/simulation/helpers/Commands.js |1428| » » var·cmpUnitAI·=·Engine.QueryInterface(ent,·IID_UnitAI); | | [NORMAL] JSHintBear: | | 'cmpUnitAI' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1451| » if·(formedEnts.length·==·0) | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. binaries/data/mods/public/simulation/helpers/Commands.js |1468| » » » &&·cmpFormation.GetMemberCount()·==·formation.entities.length) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/helpers/Commands.js |1483| » » for·(var·fid·in·formation.members) | | [NORMAL] JSHintBear: | | 'fid' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1485| » » » var·cmpFormation·=·Engine.QueryInterface(+fid,·IID_Formation); | | [NORMAL] JSHintBear: | | 'cmpFormation' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1502| » » » » » var·cmpUnitAI·=·Engine.QueryInterface(ent,·IID_UnitAI); | | [NORMAL] JSHintBear: | | 'cmpUnitAI' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1525| » » » var·cmpFormation·=·Engine.QueryInterface(formationEnt,·IID_Formation); | | [NORMAL] JSHintBear: | | 'cmpFormation' is already defined. | | [NORMAL] ESLintBear (no-else-return): | | Unnecessary 'else' after 'return'. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/components/GuiInterface.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/components/GuiInterface.js | 209| 209| { | 210| 210| if (this.miragedEntities[player]) | 211| 211| return this.renamedEntities.concat(this.miragedEntities[play
http://jw:8080/job/phabricator_lint/218/ for more details.
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Checking XML files...
http://jw:8080/job/phabricator/1595/ for more details.
Build is green
Updating workspaces. Build (release)... Build (debug)... Running release tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Running debug tests... Running cxxtest tests (306 tests)..................................................................................................................................................................................................................................................................................................................OK! Checking XML files...
http://jw:8080/job/phabricator/1603/ for more details.
Executing section Default... Executing section Source... Executing section JS... binaries/data/mods/public/simulation/components/BuildRestrictions.js | 149| » » switch·(ret) | | [NORMAL] ESLintBear (default-case): | | Expected a default case. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 267| » » » var·cmpIdentity·=·Engine.QueryInterface(id,·IID_Identity); | | [NORMAL] ESLintBear (no-shadow): | | 'cmpIdentity' is already declared in the upper scope. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 127| » case·"land": | | [NORMAL] JSHintBear: | | Expected a 'break' statement before 'default'. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 144| » » var·ret·=·cmpObstruction.CheckFoundation(passClassName,·false); | | [NORMAL] JSHintBear: | | 'ret' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 167| » var·cmpPlayer·=·QueryOwnerInterface(this.entity,·IID_Player); | | [NORMAL] JSHintBear: | | 'cmpPlayer' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 177| » var·isNeutral·=·tileOwner·==·0; | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 251| » » » ||·(cmpWaterManager.GetWaterLevel(pos.x·-·sz,·pos.y·-·cz)·-·cmpTerrain.GetGroundLevel(pos.x·-·sz,·pos.y·-·cz))·>·2.0)·//·back | | [NORMAL] JSHintBear: | | Misleading line break before '||'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 261| » » var·cmpRangeManager·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_RangeManager); | | [NORMAL] JSHintBear: | | 'cmpRangeManager' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 262| » » var·cmpPlayer·=·QueryOwnerInterface(this.entity,·IID_Player); | | [NORMAL] JSHintBear: | | 'cmpPlayer' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 277| » » » » var·result·=·markForPluralTranslation( | | [NORMAL] JSHintBear: | | 'result' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 295| » » » var·dist·=·+this.template.Distance.MaxDistance; | | [NORMAL] JSHintBear: | | 'dist' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 296| » » » var·nearEnts·=·cmpRangeManager.ExecuteQuery(this.entity,·0,·dist,·[cmpPlayer.GetPlayerID()],·IID_BuildRestrictions).filter(filter); | | [NORMAL] JSHintBear: | | 'nearEnts' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 299| » » » » var·result·=·markForPluralTranslation( | | [NORMAL] JSHintBear: | | 'result' is already defined. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 147| » if·(ret·!=·"success") | | [NORMAL] JSHintBear: | | 'ret' used out of scope. binaries/data/mods/public/simulation/components/BuildRestrictions.js | 149| » » switch·(ret) | | [NORMAL] JSHintBear: | | 'ret' used out of scope. binaries/data/mods/public/simulation/helpers/Commands.js | 882| » var·ids·=·[·id·for·(id·in·members)·]; | | [MAJOR] ESLintBear: | | Parsing error: Unexpected token for binaries/data/mods/public/simulation/helpers/Commands.js | 53| var·g_Commands·=·{ | | [NORMAL] JSHintBear: | | 'g_Commands' was used before it was defined. binaries/data/mods/public/simulation/helpers/Commands.js | 175| » » let·allowCapture·=·cmd.allowCapture·||·cmd.allowCapture·==·null; | | [NORMAL] JSHintBear: | | Use '===' to compare with 'null'. binaries/data/mods/public/simulation/helpers/Commands.js | 499| » » if·(notUngarrisoned·!=·0) | | [NORMAL] JSHintBear: | | Use '!==' to compare with '0'. binaries/data/mods/public/simulation/helpers/Commands.js | 513| » » » » ····&&·player·!=·+cmd.owner) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/helpers/Commands.js | 701| » » » » var·cmpGUIInterface·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_GuiInterface); | | [NORMAL] JSHintBear: | | 'cmpGUIInterface' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js | 882| » var·ids·=·[·id·for·(id·in·members)·]; | | [NORMAL] JSHintBear: | | 'array comprehension' is only available in Mozilla JavaScript extensions (use moz option). binaries/data/mods/public/simulation/helpers/Commands.js | 882| » var·ids·=·[·id·for·(id·in·members)·]; | | [NORMAL] JSHintBear: | | Expected 'for' and instead saw 'id'. binaries/data/mods/public/simulation/helpers/Commands.js | 932| » » for·(var·i·=·0;·i·<·length;·++i) | | [NORMAL] JSHintBear: | | 'i' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js | 945| » » var·count·=·0; | | [NORMAL] JSHintBear: | | 'count' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1092| » » var·cmpGuiInterface·=·Engine.QueryInterface(SYSTEM_ENTITY,·IID_GuiInterface); | | [NORMAL] JSHintBear: | | 'cmpGuiInterface' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1256| » » » if·(!(i·==·0·&&·piece.template·==·cmd.wallSet.templates.tower·&&·!cmd.startSnappedEntity)) | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. binaries/data/mods/public/simulation/helpers/Commands.js |1344| » » var·piece·=·pieces[j]; | | [NORMAL] JSHintBear: | | 'piece' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1373| » » » » if·(lastTowerControlGroup·!=·null·&&·lastTowerControlGroup·!=·INVALID_ENTITY) | | [NORMAL] JSHintBear: | | Use '!==' to compare with 'null'. binaries/data/mods/public/simulation/helpers/Commands.js |1428| » » var·cmpUnitAI·=·Engine.QueryInterface(ent,·IID_UnitAI); | | [NORMAL] JSHintBear: | | 'cmpUnitAI' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1451| » if·(formedEnts.length·==·0) | | [NORMAL] JSHintBear: | | Use '===' to compare with '0'. binaries/data/mods/public/simulation/helpers/Commands.js |1468| » » » &&·cmpFormation.GetMemberCount()·==·formation.entities.length) | | [NORMAL] JSHintBear: | | Misleading line break before '&&'; readers may interpret this as an expression boundary. binaries/data/mods/public/simulation/helpers/Commands.js |1483| » » for·(var·fid·in·formation.members) | | [NORMAL] JSHintBear: | | 'fid' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1485| » » » var·cmpFormation·=·Engine.QueryInterface(+fid,·IID_Formation); | | [NORMAL] JSHintBear: | | 'cmpFormation' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1502| » » » » » var·cmpUnitAI·=·Engine.QueryInterface(ent,·IID_UnitAI); | | [NORMAL] JSHintBear: | | 'cmpUnitAI' is already defined. binaries/data/mods/public/simulation/helpers/Commands.js |1525| » » » var·cmpFormation·=·Engine.QueryInterface(formationEnt,·IID_Formation); | | [NORMAL] JSHintBear: | | 'cmpFormation' is already defined. | | [NORMAL] ESLintBear (no-else-return): | | Unnecessary 'else' after 'return'. |----| | /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/components/GuiInterface.js | |++++| /mnt/data/jenkins-phabricator/workspace/phabricator_lint/binaries/data/mods/public/simulation/components/GuiInterface.js | 209| 209| { | 210| 210| if (this.miragedEntities[player]) | 211| 211| return this.renamedEntities.concat(this.miragedEntities[play
http://jw:8080/job/phabricator_lint/223/ for more details.