Ticket #4220: 4220.diff
File 4220.diff, 6.8 KB (added by , 7 years ago) |
---|
-
binaries/data/mods/public/gui/session/unit_actions.js
var unitActions = 133 133 "getActionInfo": function(entState, targetState) 134 134 { 135 135 if (!entState.attack || !targetState.hitpoints) 136 136 return false; 137 137 138 return { 139 "possible": Engine.GuiInterfaceCall("CanCapture", { 138 return { "possible": Engine.GuiInterfaceCall("CanAttack", { 140 139 "entity": entState.id, 141 "target": targetState.id 140 "target": targetState.id, 141 "types": ["Capture"] 142 142 }) 143 143 }; 144 144 }, 145 145 "actionCheck": function(target) 146 146 { … … var unitActions = 181 181 return false; 182 182 183 183 return { 184 184 "possible": Engine.GuiInterfaceCall("CanAttack", { 185 185 "entity": entState.id, 186 "target": targetState.id 186 "target": targetState.id, 187 "types": ["Ranged", "Melee"] 187 188 }) 188 189 }; 189 190 }, 190 191 "hotkeyActionCheck": function(target) 191 192 { … … var unitActions = 438 439 "entity": selection[0] 439 440 }); 440 441 441 442 return true; 442 443 }, 443 "getActionInfo": 444 "getActionInfo": function(entState, targetState) 444 445 { 445 446 if (!targetState.resourceSupply) 446 447 return false; 447 448 448 449 let resource = findGatherType(entState, targetState.resourceSupply); -
binaries/data/mods/public/simulation/components/Attack.js
Attack.prototype.GetRestrictedClasses = 206 206 return this.template[type].RestrictedClasses._string.split(/\s+/); 207 207 208 208 return []; 209 209 }; 210 210 211 Attack.prototype.CanAttack = function(target )211 Attack.prototype.CanAttack = function(target, wantedTypes) 212 212 { 213 213 let cmpFormation = Engine.QueryInterface(target, IID_Formation); 214 214 if (cmpFormation) 215 215 return true; 216 216 217 217 let cmpThisPosition = Engine.QueryInterface(this.entity, IID_Position); 218 218 let cmpTargetPosition = Engine.QueryInterface(target, IID_Position); 219 219 if (!cmpThisPosition || !cmpTargetPosition || !cmpThisPosition.IsInWorld() || !cmpTargetPosition.IsInWorld()) 220 220 return false; 221 221 222 // Check if the relative height difference is larger than the attack range223 // If the relative height is bigger, it means they will never be able to224 // reach each other, no matter how close they come.225 let heightDiff = Math.abs(cmpThisPosition.GetHeightOffset() - cmpTargetPosition.GetHeightOffset());226 227 222 const cmpIdentity = Engine.QueryInterface(target, IID_Identity); 228 223 if (!cmpIdentity) 229 224 return undefined; 230 225 226 let cmpEntityPlayer = QueryOwnerInterface(this.entity); 227 let cmpTargetPlayer = QueryOwnerInterface(target); 228 if (!cmpTargetPlayer || !cmpEntityPlayer) 229 return false; 230 231 let targetOwner = cmpEntityPlayer.GetPlayerID(); 231 232 const targetClasses = cmpIdentity.GetClassesList(); 233 let cmpCapturable = QueryMiragedInterface(target, IID_Capturable); 234 if (targetClasses.indexOf("Domestic") == -1 && !cmpEntityPlayer.IsEnemy(cmpTargetPlayer.GetPlayerID()) && 235 (!cmpCapturable || !cmpCapturable.CanCapture(targetOwner))) 236 return false; 237 238 // Check if the relative height difference is larger than the attack range 239 // If the relative height is bigger, it means they will never be able to 240 // reach each other, no matter how close they come. 241 let heightDiff = Math.abs(cmpThisPosition.GetHeightOffset() - cmpTargetPosition.GetHeightOffset()); 232 242 233 243 for (let type of this.GetAttackTypes()) 234 244 { 235 if (type == "Capture" && !QueryMiragedInterface(target, IID_Capturable)) 245 if (wantedTypes && (wantedTypes.indexOf(type) == -1 || wantedTypes.indexOf("no" + type) != -1)) 246 continue; 247 248 if (type == "Capture" && (!cmpCapturable || !cmpCapturable.CanCapture(targetOwner))) 236 249 continue; 237 250 238 251 if (heightDiff > this.GetRange(type).max) 239 252 continue; 240 253 -
binaries/data/mods/public/simulation/components/GuiInterface.js
GuiInterface.prototype.GetTradingDetails 1828 1828 result = { "type": "set first" }; 1829 1829 } 1830 1830 return result; 1831 1831 }; 1832 1832 1833 GuiInterface.prototype.CanCapture = function(player, data)1834 {1835 let cmpAttack = Engine.QueryInterface(data.entity, IID_Attack);1836 if (!cmpAttack)1837 return false;1838 1839 let owner = QueryOwnerInterface(data.entity).GetPlayerID();1840 1841 let cmpCapturable = QueryMiragedInterface(data.target, IID_Capturable);1842 if (cmpCapturable && cmpCapturable.CanCapture(owner) && cmpAttack.GetAttackTypes().indexOf("Capture") != -1)1843 return cmpAttack.CanAttack(data.target);1844 1845 return false;1846 };1847 1848 1833 GuiInterface.prototype.CanAttack = function(player, data) 1849 1834 { 1850 1835 let cmpAttack = Engine.QueryInterface(data.entity, IID_Attack); 1851 if (!cmpAttack) 1852 return false; 1853 1854 let cmpEntityPlayer = QueryOwnerInterface(data.entity, IID_Player); 1855 let cmpTargetPlayer = QueryOwnerInterface(data.target, IID_Player); 1856 if (!cmpEntityPlayer || !cmpTargetPlayer) 1857 return false; 1858 1859 // if the owner is an enemy, it's up to the attack component to decide 1860 if (cmpEntityPlayer.IsEnemy(cmpTargetPlayer.GetPlayerID())) 1861 return cmpAttack.CanAttack(data.target); 1862 1863 return false; 1836 return cmpAttack && cmpAttack.CanAttack(data.target, data.types || undefined); 1864 1837 }; 1865 1838 1866 1839 /* 1867 1840 * Returns batch build time. 1868 1841 */ … … let exposedFunctions = { 2003 1976 "PlaySound": 1, 2004 1977 "FindIdleUnits": 1, 2005 1978 "HasIdleUnits": 1, 2006 1979 "GetTradingRouteGain": 1, 2007 1980 "GetTradingDetails": 1, 2008 "CanCapture": 1,2009 1981 "CanAttack": 1, 2010 1982 "GetBatchTime": 1, 2011 1983 2012 1984 "IsMapRevealed": 1, 2013 1985 "SetPathfinderDebugOverlay": 1, -
binaries/data/mods/public/simulation/components/tests/test_Attack.js
function attackComponentTest(defenderCla 20 20 AddMock(SYSTEM_ENTITY, IID_PlayerManager, { 21 21 "GetPlayerByID": () => playerEnt1 22 22 }); 23 23 24 24 AddMock(playerEnt1, IID_Player, { 25 "GetPlayerID": () => 1 25 "GetPlayerID": () => 1, 26 "IsEnemy": () => true 26 27 }); 27 28 } 28 29 29 30 let attacker = entityID; 30 31 … … function attackComponentTest(defenderCla 90 91 AddMock(defender, IID_Position, { 91 92 "IsInWorld": () => true, 92 93 "GetHeightOffset": () => 0 93 94 }); 94 95 96 AddMock(defender, IID_Ownership, { 97 "GetOwner": () => 1 98 }); 99 95 100 test_function(attacker, cmpAttack, defender); 96 101 } 97 102 98 103 // Validate template getter functions 99 104 attackComponentTest(undefined, (attacker, cmpAttack, defender) => {