Can someone tell me how the airplane plant in CA works? How does the plane get to know where to fly when the "Land at XX" limit is reached. What I want to do is to make such a thing for landunits. So when a vehicle reached the "Return at XX" (like "Land at XX" for the airplanes) it will return to the repairpad of the nearest vehiclefactory (factory with a builtin repairpad).
It uses engine feature (with lots of side issues). I dont think it will work for land units. You have to code your own lua. When you have it done, let us know, it could be handy!
I'm pretty sure Retreat is enabled by default (although that may have been changed because of anti-widget whiners). It's a very user-friendly and powerful widget, and is particularly useful for high-armor raiders like Zippers and Kodachis.
Can I get the position of a specific part of a building. Like I build a factory with a part called repairpad, how can I get the position of this part so I can send units there?
OK, found some time to give it a try. But I guess I do it the wrong way. I added a button so when this button is pressed the unit should be sent to a certain place (should be the repairpad (later)) but when the unit arrives Spring prints an error.
Code:
function gadget:GetInfo()
return { name = "tobase", desc = "tells a unit to move to a certain point", author = "thedude", date = "yesterday", license = "Public Domain", layer = 1, enabled = true
}
end
local CMD_TOBASE = 30059
if (gadgetHandler:IsSyncedCode()) then
--SYNCED
local cmdTobase={
id=CMD_TOBASE, type=CMDTYPE.ICON, name="movetopoint", cursor="moveto", action="moveto", tooltip="move to 200 200",
}
function gadget:UnitCreated(u,ud,team)
if UnitDefs[ud].name=="tank" then Spring.InsertUnitCmdDesc(u,CMD_TOBASE,cmdTobase)
end
end
function gadget:UnitDestroyed(u,ud,team)
end
function gadget:CommandFallback(u,ud,team,cmd,param,opt)
if cmd == CMD_TOBASE then --Spring.GiveOrderToUnit(u,CMD.MOVE,{200,0,200},0) Spring.GiveOrderToUnit(u, CMD.INSERT, { 0, CMD.MOVE, CMD.OPT_INTERNAL, 200, 0, 200}, CMD.OPT_ALT) -- ALT makes the 0 positional
end
return false
end
function gadget:Initialize() Spring.SetCustomCommandDrawData(CMD_TOBASE,"Moveto",{1,1,.2,1})
end
else
--UNSYNCED
end
the error: "LuaRules::RunCallIn: error = 2, CommandFallback, [string "LuaRules/Gadgets/tobase_3.lua"]:51: GiveOrderToUnit() recursion is not permitted"
I guess Spring tells me that it is not allowed to use an existing command with my new command When I use "Spring.GiveOrderToUnit(u,CMD.MOVE,{200,0,200},0)" I get no error but the unit just moves a little and than moves back.
the error: "LuaRules::RunCallIn: error = 2, CommandFallback, [string "LuaRules/Gadgets/tobase_3.lua"]:51: GiveOrderToUnit() recursion is not permitted"
I guess Spring tells me that it is not allowed to use an existing command with my new command
Spring tells you that recursion is not permitted. You can't give commands within CommandFallback.
(Even if: CommandFallback is called 2 times a second and you add a command each time.)
What about this version? What I was thinking it does: I start the game. build the unit wich should have this command select that unit press the moveto button gadget:AllowCommand is triggert cheks if my command is triggert yes-> execute the goto function ==>unit moves to {200,200}
Code:
function gadget:GetInfo()
return { name = "tobase", desc = "tells a unit to move to a certain point", author = "thedude", date = "yesterday", license = "Public Domain", layer = 1, enabled = true }
end
local CMD_TOBASE = 30059
if (gadgetHandler:IsSyncedCode()) then
--SYNCED
local cmdTobase={
id=CMD_TOBASE, type=CMDTYPE.ICON, name="movetopoint", cursor="moveto", action="moveto", tooltip="move to 200 200",
}
local function goto(unitID) Spring.GiveOrderToUnit(unitID,CMD.MOVE,{200,0,200},0)
end
function gadget:UnitCreated(u,ud,team)
if UnitDefs[ud].name=="tank" then Spring.InsertUnitCmdDesc(u,CMD_TOBASE,cmdTobase) end end
function gadget:UnitDestroyed(u,ud,team)
end
function gadget:AllowCommand(u, ud, team, cmd, param, opt)
if cmd == CMD_TOBASE then Spring.Echo("here comes my command"); goto(u) return true end
press the moveto button gadget:AllowCommand is triggert cheks if my command is triggert yes-> execute the goto function
Recursion again. You cannot call GiveOrder within AllowCommand. Save the information (into a variable etc.) that you want to give an order and give the order the next GameFrame().
This one works for me. But I don't know if that is a good way to do that. What happens if I select 100 units and save each unitID into one array (buttonof[100]) and after that I select only one unit and save the unitID to the first element of my array are the other IDs still there? Should I better make a for loop and delete the whole array and then save the new ID/IDs ?
Code:
function gadget:GetInfo() return { name = "tobase", desc = "tells a unit to move to a certain point", author = "thedude", date = "yesterday", license = "Public Domain", layer = 1, enabled = true } end
local CMD_TOBASE = 30059 local yeswecan=false local newclick=false local a=0 local buttonof={}
if (gadgetHandler:IsSyncedCode()) then
--SYNCED
local cmdTobase={ id=CMD_TOBASE, type=CMDTYPE.ICON, name="movetopoint", cursor="moveto", action="moveto", tooltip="move to 200 200", }
local function goto(unitID)
yeswecan=true
if newclick==true then
a=1 buttonof[a]= unitID end if newclick==false then a=a+1 buttonof[a]= unitID end newclick=false end
function gadget:UnitCreated(u,ud,team)
if UnitDefs[ud].name=="tank" then
Spring.InsertUnitCmdDesc(u,CMD_TOBASE,cmdTobase)
end
end
function gadget:UnitDestroyed(u,ud,team)
end
function gadget:AllowCommand(u, ud, team, cmd, param, opt) if cmd == CMD_TOBASE then
Spring.Echo("here comes my command"); goto(u)
return true end return true end
function gadget:GameFrame(f)
if f %32<1 then if yeswecan==true then for i=1,#buttonof do Spring.GiveOrderToUnit(buttonof[i],CMD.MOVE,{200,0,200},0) end yeswecan=false newclick=true end end end
function gadget:Initialize() Spring.SetCustomCommandDrawData(CMD_TOBASE,"Moveto",{1,1,.2,1})
end
else --UNSYNCED
end
Another question. I found in XOTA v1.61 the same command but only for planes/vtols. Problem is I don't get how this one works cause there is no move command to make the planes move to the airpad. The only thing I can find is "Spring.CallCOBScript(unitID, "Refuel", 0)". I thought this is a command to look for a tag/function in the bos file and to execute that but after descripting the bos file I could not find a function called "Refuel"
Attachments:
File comment: This is the cob and the descripted bos file of the plane "Fighter". cobandbosfile.7z [2.36 KiB]
Downloaded 13 times
File comment: This is the gadget which adds the command (I think). unit_refuel.lua [4.61 KiB]
Downloaded 93 times
I have a problem. If I use the CommandFallBack function my gadget doesn't work but when using AlowCommand it seems to work (little buggy but works). Can't find the problem . Please help.
Users browsing this forum: No registered users and 1 guest
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum