Page 1 of 1

Question about the airplane plant

Posted: 19 Jan 2010, 18:32
by thedude
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).

Re: Question about the airplane plant

Posted: 19 Jan 2010, 19:47
by Licho
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!

Re: Question about the airplane plant

Posted: 19 Jan 2010, 19:59
by luckywaldo7
Check out the retreat widget included in CA:

http://trac.caspring.org/wiki/Retreat

Re: Question about the airplane plant

Posted: 19 Jan 2010, 22:12
by Pxtl
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.

Re: Question about the airplane plant

Posted: 20 Jan 2010, 08:15
by Saktoth
Retreat is virtually useless, its only good on air units. Land units just mill into eachother and die and cause traffic jams.

Re: Question about the airplane plant

Posted: 20 Jan 2010, 17:44
by CarRepairer
Saktoth wrote:Retreat is virtually useless, its only good on air units. Land units just mill into eachother and die and cause traffic jams.
Have you tried it with...
Pxtl wrote:Zippers
Saktoth? It's easy and fun, don't forget to sprint. I think you aren't a fan of the zipper anyway.

Re: Question about the airplane plant

Posted: 21 Jan 2010, 09:00
by thedude
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?

Re: Question about the airplane plant

Posted: 21 Jan 2010, 18:55
by Licho
Look in lua wiki, you can get matrix of the piece for sure.

Re: Question about the airplane plant

Posted: 13 Feb 2010, 19:36
by thedude
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: Select all

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.

Re: Question about the airplane plant

Posted: 13 Feb 2010, 23:33
by SirMaverick
thedude wrote: 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.)

Re: Question about the airplane plant

Posted: 16 Feb 2010, 14:58
by thedude
What would be a better way to do that?

Re: Question about the airplane plant

Posted: 20 Feb 2010, 19:55
by thedude
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: Select all

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

	return true

end

function gadget:Initialize()

Spring.SetCustomCommandDrawData(CMD_TOBASE,"Moveto",{1,1,.2,1})

end

else

--UNSYNCED

end

The problem is when I push the button the unit starts to move but then turns and moves back to the place where it was before. :|
(Even if: CommandFallback is called 2 times a second and you add a command each time.)
Ooops didn't know that.

Re: Question about the airplane plant

Posted: 20 Feb 2010, 21:01
by SirMaverick
thedude wrote: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().

Re: Question about the airplane plant

Posted: 23 Feb 2010, 09:15
by thedude
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: Select all

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" :?:

Re: Question about the airplane plant

Posted: 16 May 2010, 19:38
by thedude
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 :evil: . Please help.

http://sharetext.org/AKQ2