How to use the Go order
Do you have a question on map editing, how use the map manager or want to make your new map public? Post here.
posted on February 7th, 2012, 5:39 am
I want to order a ship to travel to several waypoints in my mission map. Looking at the MMM documentation, a Go order seems like the ticket. Nothing I try works though. I can get a GoSingle order to work just fine, and I suppose I could string several of them together with monitors to fire the next order when the ship arrives at a way point. But I'm hoping the Go order is easier.
Does anyone have an example of using the Go order? Any advice appreciated.
V
Does anyone have an example of using the Go order? Any advice appreciated.
V
posted on February 26th, 2012, 5:42 am
Here's how I solved the problem. I created a GoMultiOrder class that handles sending GoSingle commands to a ship through several waypoints. The class uses monitors to watch the ship and is smart enough to turn them off when the ship reaches the last waypoint or is destroyed.
Example usage:
local ship = Entity.add( "rom_fakairu.odf", 3, Vector(8556,0,-720) )
local waypoints = { Vector(4543,0,2680) , Vector(4285,0,8494) }
local theOrder = giveGoMultiOrder(ship, waypoints)
Note that the class can pause if needed: Call the Stop method to stop managing the ship, then call the Continue method to resume moving to the next waypoint not yet reached.
Hope this helps somebody,
V
-------------------------
GoMultiOrder = {}
function GoMultiOrder:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
o.inprogess = false
o.hasarrived = false
o.waypointradius = 50
return o
end
function GoMultiOrder:Start()
if self.ship and self.waypoints then
self.inprogress = true
self.hasarrived = false
self.currentwaypoint = 1
self:Continue()
end
end
function GoMultiOrder:Continue()
self.inprogress = true
-- create the monitor for the destruction of the ship
if not self.healthmonitor then
self:CreateHealthMonitor()
end
-- command the ship to move to the current way point.
self:GiveOrder()
-- create the monitor for arriving at current waypoint
self:CreateWaypointMonitor()
end
function GoMultiOrder:GiveOrder()
ship:giveOrder( GameObject.Order.GoSingle, self.waypoints[self.currentwaypoint] )
end
function GoMultiOrder:CreateHealthMonitor()
-- Create a monitor that stops the GoMultiOrder if the ship is dead
function isShipAlive( monitor, arg )
return self.ship and self.ship.valid and not self.ship.destroyed
end
function onShipDead( monitor, arg )
if self.healthmonitor then
self.healthmonitor:stop()
self.healthmonitor = nil
end
self:Stop()
end
self.healthmonitor = Monitor( "GoMultiShipMonitor", false, nil, isShipAlive, nil )
self.healthmonitor:hook( "GoMultiOnShipDead", MonitorHook.Type.OnFalse, nil, onShipDead, nil )
end
function GoMultiOrder:CreateWaypointMonitor()
-- Create a monitor that starts the next GoSingle order when the ship reaches the next waypoint
function hasShipArrived( monitor, arg )
if self.ship and self.ship.valid then
local destvector = self.waypoints[self.currentwaypoint] - self.ship.position
local dist = destvector.length
return not self.ship.destroyed and dist < self.waypointradius
end
end
function onShipArrived( monitor, arg )
if self.currentwaypoint < #(self.waypoints) then
self.currentwaypoint = self.currentwaypoint + 1
self:Continue()
else
self.hasarrived = true
self:Stop()
end
end
if self.waypointmonitor ~= nil then
self.waypointmonitor:stop()
self.waypointmonitor = nil
end
--Create the monitor that will check for borg ships being alive.
self.waypointmonitor = Monitor( "GoMultiWPMonitor", false, nil, hasShipArrived, nil )
self.waypointmonitor:hook( "GoMultiOnShipArrived", MonitorHook.Type.OnTrue, nil, onShipArrived, nil )
end
function GoMultiOrder:Stop()
if self.inprogress then
if self.healthmonitor then
self.healthmonitor:stop()
self.healthmonitor = nil
end
if self.waypointmonitor ~= nil then
self.waypointmonitor:stop()
self.waypointmonitor = nil
end
self.inprogress = false
end
end
-- Global functions for GoMulti order
function giveGoMultiOrder(ship, waypoints)
local order = GoMultiOrder:new()
order.ship = ship
order.waypoints = waypoints
order:Start()
return order
end
Example usage:
local ship = Entity.add( "rom_fakairu.odf", 3, Vector(8556,0,-720) )
local waypoints = { Vector(4543,0,2680) , Vector(4285,0,8494) }
local theOrder = giveGoMultiOrder(ship, waypoints)
Note that the class can pause if needed: Call the Stop method to stop managing the ship, then call the Continue method to resume moving to the next waypoint not yet reached.
Hope this helps somebody,
V
-------------------------
GoMultiOrder = {}
function GoMultiOrder:new(o)
o = o or {}
setmetatable(o, self)
self.__index = self
o.inprogess = false
o.hasarrived = false
o.waypointradius = 50
return o
end
function GoMultiOrder:Start()
if self.ship and self.waypoints then
self.inprogress = true
self.hasarrived = false
self.currentwaypoint = 1
self:Continue()
end
end
function GoMultiOrder:Continue()
self.inprogress = true
-- create the monitor for the destruction of the ship
if not self.healthmonitor then
self:CreateHealthMonitor()
end
-- command the ship to move to the current way point.
self:GiveOrder()
-- create the monitor for arriving at current waypoint
self:CreateWaypointMonitor()
end
function GoMultiOrder:GiveOrder()
ship:giveOrder( GameObject.Order.GoSingle, self.waypoints[self.currentwaypoint] )
end
function GoMultiOrder:CreateHealthMonitor()
-- Create a monitor that stops the GoMultiOrder if the ship is dead
function isShipAlive( monitor, arg )
return self.ship and self.ship.valid and not self.ship.destroyed
end
function onShipDead( monitor, arg )
if self.healthmonitor then
self.healthmonitor:stop()
self.healthmonitor = nil
end
self:Stop()
end
self.healthmonitor = Monitor( "GoMultiShipMonitor", false, nil, isShipAlive, nil )
self.healthmonitor:hook( "GoMultiOnShipDead", MonitorHook.Type.OnFalse, nil, onShipDead, nil )
end
function GoMultiOrder:CreateWaypointMonitor()
-- Create a monitor that starts the next GoSingle order when the ship reaches the next waypoint
function hasShipArrived( monitor, arg )
if self.ship and self.ship.valid then
local destvector = self.waypoints[self.currentwaypoint] - self.ship.position
local dist = destvector.length
return not self.ship.destroyed and dist < self.waypointradius
end
end
function onShipArrived( monitor, arg )
if self.currentwaypoint < #(self.waypoints) then
self.currentwaypoint = self.currentwaypoint + 1
self:Continue()
else
self.hasarrived = true
self:Stop()
end
end
if self.waypointmonitor ~= nil then
self.waypointmonitor:stop()
self.waypointmonitor = nil
end
--Create the monitor that will check for borg ships being alive.
self.waypointmonitor = Monitor( "GoMultiWPMonitor", false, nil, hasShipArrived, nil )
self.waypointmonitor:hook( "GoMultiOnShipArrived", MonitorHook.Type.OnTrue, nil, onShipArrived, nil )
end
function GoMultiOrder:Stop()
if self.inprogress then
if self.healthmonitor then
self.healthmonitor:stop()
self.healthmonitor = nil
end
if self.waypointmonitor ~= nil then
self.waypointmonitor:stop()
self.waypointmonitor = nil
end
self.inprogress = false
end
end
-- Global functions for GoMulti order
function giveGoMultiOrder(ship, waypoints)
local order = GoMultiOrder:new()
order.ship = ship
order.waypoints = waypoints
order:Start()
return order
end
posted on February 26th, 2012, 5:50 am
Impressive, nice work
Who is online
Users browsing this forum: No registered users and 7 guests