From 91a693640fbedd327cdb3461ba8a4284e6b274eb Mon Sep 17 00:00:00 2001 From: Shaman <48730089+Arch-Shaman@users.noreply.github.com> Date: Thu, 10 Jul 2025 06:09:28 -0400 Subject: [PATCH] Add immediate takeoff command This command forces air units to take off from the airpad. --- LuaRules/Configs/customcmds.lua | 3 +- LuaRules/Gadgets/unit_refuel_pad_handler.lua | 43 ++++++++++++++++++ .../Configs/integral_menu_commands_orders.lua | 1 + LuaUI/Configs/integral_menu_config.lua | 3 +- LuaUI/Images/commands/takeoff.png | Bin 0 -> 4061 bytes 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 LuaUI/Images/commands/takeoff.png diff --git a/LuaRules/Configs/customcmds.lua b/LuaRules/Configs/customcmds.lua index 9538a4a60a..ed33cdce5a 100644 --- a/LuaRules/Configs/customcmds.lua +++ b/LuaRules/Configs/customcmds.lua @@ -99,7 +99,8 @@ local commands = { FIELD_FAC_SELECT = 38693, FIELD_FAC_UNIT_TYPE = 38694, FIELD_FAC_QUEUELESS = 38695, - + IMMEDIATETAKEOFF = 39384, -- Airpad abort. + -- terraform RAMP = 39734, LEVEL = 39736, diff --git a/LuaRules/Gadgets/unit_refuel_pad_handler.lua b/LuaRules/Gadgets/unit_refuel_pad_handler.lua index fee7cc4561..6e40958a36 100644 --- a/LuaRules/Gadgets/unit_refuel_pad_handler.lua +++ b/LuaRules/Gadgets/unit_refuel_pad_handler.lua @@ -37,6 +37,7 @@ local mcSetPosition = Spring.MoveCtrl.SetPosition local mcSetRotation = Spring.MoveCtrl.SetRotation local mcDisable = Spring.MoveCtrl.Disable local mcEnable = Spring.MoveCtrl.Enable +local CMD_IMMEDIATETAKEOFF = Spring.Utilities.CMD.IMMEDIATETAKEOFF local coroutine = coroutine local Sleep = coroutine.yield @@ -59,6 +60,24 @@ local min = math.min local mobilePadDefs = {} +local takeoffCMD = { + id = CMD_IMMEDIATETAKEOFF, + name = "Takeoff", + action = "takeoff", + cursor = 'Repair', + type = CMDTYPE.ICON, +} + +local giveTakeOffCommandToUnits = {} + +for i = 1, #UnitDefs do + local unitDef = UnitDefs[i] + local movetype = Spring.Utilities.getMovetype(unitDef) + if (movetype == 1 or movetype == 0) and (not Spring.Utilities.tobool(unitDef.customParams.cantuseairpads)) then + giveTakeOffCommandToUnits[i] = true + end +end + for unitDefID, ud in pairs(UnitDefs) do if ud.customParams.ispad and (not ud.isImmobile) then mobilePadDefs[unitDefID] = true @@ -608,3 +627,27 @@ end function gadget:GameFrame(f) UpdateCoroutines() end + +function gadget:AllowCommand_GetWantedCommand() + return {[CMD_IMMEDIATETAKEOFF] = true} +end + +function gadget:AllowCommand(unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions) + --local isMoveCommand = (cmdID == CMD.MOVE or cmdID == CMD_RAW_MOVE) + if landingUnit[unitID] then -- not one of us. + GG.LandAborted(unitID) + local cmdID, _, cmdTag = Spring.GetUnitCurrentCommand(unitID) + if cmdID == CMD_REARM or cmdID == CMD_FIND_PAD then + Spring.GiveOrderToUnit(unitID, CMD.REMOVE, cmdTag, 0) + end + end + return false + --elseif isMoveCommand and cmdOptions.shift == false and not landingUnit.landed then -- user wants to move somewhere else. + --landingUnit[unitID].abort = true +end + +function gadget:UnitCreated(unitID, unitDefID, unitTeam) + if giveTakeOffCommandToUnits[unitDefID] then + Spring.InsertUnitCmdDesc(unitID, takeoffCMD) + end +end diff --git a/LuaUI/Configs/integral_menu_commands_orders.lua b/LuaUI/Configs/integral_menu_commands_orders.lua index 51544ba830..76d73e07f0 100644 --- a/LuaUI/Configs/integral_menu_commands_orders.lua +++ b/LuaUI/Configs/integral_menu_commands_orders.lua @@ -60,6 +60,7 @@ local cmdPosDef = { [CMD_EMBARK] = {pos = 13, priority = 5}, [CMD_DISEMBARK] = {pos = 13, priority = 6}, [CMD_EXCLUDE_PAD] = {pos = 13, priority = 7}, + [CMD_IMMEDIATETAKEOFF] = {pos = 13, priority = 8}, -- States [CMD.REPEAT] = {pos = 1, priority = 1}, diff --git a/LuaUI/Configs/integral_menu_config.lua b/LuaUI/Configs/integral_menu_config.lua index e5354841bf..cec6a8452a 100644 --- a/LuaUI/Configs/integral_menu_config.lua +++ b/LuaUI/Configs/integral_menu_config.lua @@ -83,6 +83,7 @@ local commandDisplayConfig = { [CMD_JUMP] = {texture = imageDir .. 'Bold/jump.png'}, [CMD_FIND_PAD] = {texture = imageDir .. 'Bold/rearm.png', tooltip = "Resupply: Return to nearest Airpad for repairs and, for bombers, ammo."}, + [CMD_IMMEDIATETAKEOFF] = {texture = imageDir .. 'takeoff.png', tooltip = "Abort Landing\nImmediately take off from airpads or abort landing."}, [CMD_EXCLUDE_PAD] = {texture = imageDir .. 'Bold/excludeairpad.png', tooltip = "Exclude Airpad: Toggle whether any of your aircraft use the targeted airpad."}, [CMD_FIELD_FAC_SELECT] = {texture = imageDir .. 'Bold/fac_select.png', tooltip = "Copy Factory Blueprint: Copy a production option from target functional friendly factory."}, @@ -93,7 +94,7 @@ local commandDisplayConfig = { [CMD_ONECLICK_WEAPON] = {},--texture = imageDir .. 'Bold/action.png'}, [CMD_UNIT_SET_TARGET_CIRCLE] = {texture = imageDir .. 'Bold/settarget.png'}, [CMD_UNIT_CANCEL_TARGET] = {texture = imageDir .. 'Bold/canceltarget.png'}, - + [CMD_ABANDON_PW] = {texture = imageDir .. 'Bold/drop_beacon.png'}, [CMD_PLACE_BEACON] = {texture = imageDir .. 'Bold/drop_beacon.png'}, diff --git a/LuaUI/Images/commands/takeoff.png b/LuaUI/Images/commands/takeoff.png new file mode 100644 index 0000000000000000000000000000000000000000..7a88d3040926aab49f2a8c9e36abda041ed0a965 GIT binary patch literal 4061 zcmV<34 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1e;mh(0Y{LfS52<#w_!-n^AgB(8tl9DBtEni~q zTCy5I%wPamjeq`T^%q`_qEk76RpV-HBW*)IF;?ujhyj6e2(`DgBld92kHAF<@P7j-OU?%}#B z(VBNfyh%p|5+>}(JL8>@77dVg-E_sfnQSaTWaCXY#jqK3+f0Lt-VRIHTHBO$^I!rP z*)}KOdU+eR1jxHf0J?z^4oB_jifMA$mPFP^kRjo(VU>@Xh6KIDE1GX!d4E6m0 zK^~^yjB!9fN8^Ht@QAD>V-Uy$fC^l<&f5wEObE8aN$Z`900%h?+qj3!ywnD}4nqu` zS1us=2-qMg0hadx{2`yfp%Ps1A%qwxq>w|2E=q>QNKsU^kRwllA`vA;nM!iWr;uWz zlu}M5+w7paAtN7i$~l(;qXkbcxVzwjQmU=4`WkAiR8!5WmInGX-$ILxT57qKZoBKq z;~qQp)N?Px3{YwK5k?#|(#WGQsK$;x2aZgN6K5_bY8%#<_b*U08#OzTk_+iX4M&NN zM;MWlAeaF$>kR-Wpa#T1Y{5(?>x&Hh*9ltA}GZ$0Mj2Gya8@d1A{f*>5`HzCyMCNP;m&DFrAMqhI$jv1?|xz$$V z0H^!l;VWQ9uG!2MHguVO^oHU+cOl}x*sALRC##u{V~tQdT{ux(Yg{{&pl~BFBX+%3 z=1Qj3ltxmrmbHco-y;R?Ik${^z%8t)BN~-5Y((+{3+sG1&tOPRJFe;);D>!8#5mKA zF|Qc=6=R1Ox01V;7^fZLq&(<_cw)b|5G2SnO3!wPZ#c#9&9d#aAg)vyXBz45aVp2| zmm5r4wPe31$!*Ium34b_o_zyROfO0f&pm)TG{T1kNhsrx&(Ry92)d%D#}ZFS6NSwL zON$9KsuC*nNrlp#_)Dk1Ivu-kXB&I6sc})%N=C;s6G6J__gm^}vP|>{P?z}ehLaP=4r?s8RbJE}Rvd@Rs7YNfO`J?TWD)L( zEQS$87Lja_#Q+7LvgqqLR5AH@C?vd_sk_4`dHXeLy8o}JO}6BQ_Emif-nX$k#Yaq( ztdMhlrXBu4+nMnR9+XDe$TBZ+UWpG6QE8F*;B$j|Io3h&}Tr(odk2iQ$&58U@#QKDWFk{Xfaf@PBgqY7fXvsUVIO?~3Z z7=>`ka!IplB0y&EqGJj>+F=a%C1F!CwMy~iRXp=5o)LvGX=QeCs?If)LfzH7bGWfwe@a>3D+Dau~N z7NX3k(TIP=Vxp^`NQPJ{1QSZR$Tcf8^QzEcRp>HW#86TYnd!iAe?3WQ+sD*$YUA;6Zulc!f z<{s*%;;cfe`y#)J5V9Xmn^|hdF15(dVX}T<;?dV|4)L|IQLD#YjZN=T5TTPtztOA< zug$=vR?dDvsMl1JhQMVZG^Pdcn_I>Kdz8wzBC?wAvkNEJjA-`EX)vj;N&&@gn2sKl z$C≈{&8i{X)CG6fU)tD{Wjb)xB?!Bq2`ET3enW9=zgFo05QpsjB0lZy3~iyYl)y z#XydeWa^n^k1^ssWS{ysb#LIV{hK*pIg|`HwCtRC;?Xq~QEWs@vQ4A*69m^nAS`KGlw=gFuzjj#b(skd#jF}-as3{WuStAF^C89=To~b zF#-fj4C02Nwbe$?tg$O=x)jAIWrk2@E&_NCu=7UOcn{Dpk2$NZWyS9Nd*sw1dA~(&_0daeWR2=&ro1Sx`;qb< zgP-6d`4duKBm0D^0O)`m7_yLpyOX*OzOR)*9y*8`r*2^zuu7+ke zu5LH3>{mnMc0(h5>$nJt+KO@lX?8(e?dnw?kycY5vlK*2xyIQNjA+m3VT6D@JX*}2aQ}Cs`TMOpTF_kynxzp)x-YmB#N&C+pO01a+e#=N?ep>HfvoM^61@?E48d)F*E2r6vTwz+ud1Q}Sgg zH6n*(otxtrM&QwB?ZDj`YyTI+2;kkZ07KXS00D(*LqkwWLqi}?Qcp%nOho_yc$|Ha zJxIeq9K~PLN>wTjb`TNFP@OD@iind`u?QAQTcK44lS@B@CJjl7i=*ILaPVWX>fqw6 ztAnc`2!4P#Iyou2NQwVT3N2zhIPS;0dyl(!fKV?p)eMXQs%9CfcudUZR>a^dx)4SH zGZ>PXsVCA48F-Gbd-(Wz7v)*r=l&c$O5S9EPb8jYx?vHo6HjegI_G`jFe^z4@j3CR zK^G)`j1(z*&Ewsj?Y;eb zrrF;Qz!Y-EZOh`b00006VoOIv0KEXd0KIDjYw-X8010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru<_Q)M8ZiEOQ3?P602y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2! zfese{00aR^L_t(o!>!lZZZp>pV_MFJQZhW&0w#yvU&IA`f^WD^_tP*BXR!xoDoMuZ9t_#` zoN9Fh<6@TUaR+urhkeMAU{b)o0gvMn*OJ#_WUFF)OCnCo9GDXaAHrd5!!Nj8 zKtBUZF&{^9t~lR?C-4$3Vjq5Qbp%u5;By!V=ntplpE^^zjNkA*4i(5uj>6ZW6I-yY zB@PsBw+`+25PPGL%IVs1f55#PgTaw1{=ETxh2F;Sj*(?pxZP{vcKfjdCkn40j|cE3 z-oWLQoG;91CRPS{Ph&FuNUxB5N>BmS4kPjbcf`+V{DsoYSeYy!0om-aJvbZ8|S~p{*B)4M4mD?>vZ*<=qx~>w;3u3;G$yM@V4=juBuY_Cn6pN~P0U?CyQI}E7bTqfC1-pmwWduK0oSz#FEDzK+;#ec- z8*yMxNN#Z>w+lO-i%B?wuj)GM48^Pp#I^)Cs`L7fPS4P_a4=nmK+ZbC?VgRGTk6~{ z;m(-ryJ4+^Dak2a=XPtOkX`sZwxa%{({q))ETkO4f=E6oI^T!>qPq#P$({-LPp0Hb z-1{22-KNUz%48#rpfAXF0$<>Gakops=0EXWpwmB^+f|#eg1cEEsUYFh*yjV)q6kmu ziiPx71TA-bN1*Z!?!iZRKZ*qdy^RxBgUP!pK-GPH;_~-M>o^DO$MJQ!LYuhVp3?1FN#4pW zxR$f2IU8Sfm9vRCTamL5a@L!(_j0zdyzN%9Yvs*o#0yDCt=xb$+!c&p7H+qxbi0b} zo!zZE#8V2$L`;av!&a0EgVd(bpAgXj$tev;rFw!H6