Skip to main content
Skip to main content

AutoLoaderBales

AutoLoaderBales

Description

Specialization to automatically load bales into a tool Use for straw blowers and mixer wagons on Platforms with automatic loading enabled

Functions

autoLoaderBalesTriggerCallback

Description

Trigger callback

Definition

autoLoaderBalesTriggerCallback(integer triggerId, integer otherActorId, boolean onEnter, boolean onLeave, boolean onStay, integer otherShapeId)

Arguments

integertriggerIdid of trigger
integerotherActorIdid of other actor
booleanonEnteron enter
booleanonLeaveon leave
booleanonStayon stay
integerotherShapeIdid of other shape

Code

function AutoLoaderBales:autoLoaderBalesTriggerCallback(triggerId, otherActorId, onEnter, onLeave, onStay, otherShapeId)
if otherActorId = = 0 then
return
end

local object = g_currentMission:getNodeObject(otherActorId)
if object = = nil then
return
end

if not object:isa( Bale ) or not g_currentMission.accessHandler:canFarmAccess( self:getActiveFarm(), object) or not object:getAllowPickup() then
return
end

local spec = self.spec_autoLoaderBales
if onEnter then
spec.balesInTrigger[object] = (spec.balesInTrigger[object] or 0 ) + 1
if spec.balesInTrigger[object] = = 1 then
object:addDeleteListener( self , AutoLoaderBales.onBaleDeleted)
end
else
spec.balesInTrigger[object] = (spec.balesInTrigger[object] or 0 ) - 1
if spec.balesInTrigger[object] < = 0 then
spec.balesInTrigger[object] = nil
object:removeDeleteListener( self , AutoLoaderBales.onBaleDeleted)
end
end
end

doAutoLoadBale

Description

Definition

doAutoLoadBale()

Arguments

anybaleType
anybale

Code

function AutoLoaderBales:doAutoLoadBale(baleType, bale)
local spec = self.spec_autoLoaderBales

if baleType.mountBale then
local x, y, z
if bale.isRoundbale then
x, y, z = baleType.offsetDirection[ 1 ] * spec.numMountedBales * bale.diameter, baleType.offsetDirection[ 2 ] * spec.numMountedBales * bale.diameter, baleType.offsetDirection[ 3 ] * spec.numMountedBales * bale.width
else
x, y, z = baleType.offsetDirection[ 1 ] * spec.numMountedBales * bale.width, baleType.offsetDirection[ 2 ] * spec.numMountedBales * bale.height, baleType.offsetDirection[ 3 ] * spec.numMountedBales * bale.length
end

bale:mountKinematic( self , baleType.spawnNode, x, y, z, 0 , 0 , 0 )
bale:setNeedsSaving( false )
spec.mountedBales[bale] = true
bale:addDeleteListener( self , AutoLoaderBales.onDeleteAutoLoaderBalesObject)

spec.loadedBaleType = baleType
spec.numMountedBales = spec.numMountedBales + 1
else
removeFromPhysics(bale.nodeId)

setTranslation(bale.nodeId, getWorldTranslation(baleType.spawnNode))
setWorldRotation(bale.nodeId, getWorldRotation(baleType.spawnNode))

addToPhysics(bale.nodeId)

local vx, vy, vz = getLinearVelocity( self:getParentComponent(baleType.spawnNode))
setLinearVelocity(bale.nodeId, vx, vy, vz)
end
end

getAutoLoadBaleTypeFromBale

Description

Definition

getAutoLoadBaleTypeFromBale()

Arguments

anybale

Code

function AutoLoaderBales:getAutoLoadBaleTypeFromBale(bale)
local spec = self.spec_autoLoaderBales
local baleFillType = bale:getFillType()

for i = 1 , #spec.baleTypes do
local baleType = spec.baleTypes[i]
if spec.loadedBaleType = = nil or baleType = = spec.loadedBaleType then
local fillTypeAllowed = #baleType.fillTypes = = 0
for j = 1 , #baleType.fillTypes do
if baleType.fillTypes[j] = = baleFillType then
fillTypeAllowed = true
break
end
end

if fillTypeAllowed then
if bale:getBaleMatchesSize(baleType.diameter, baleType.width, baleType.height, baleType.length) then
return baleType
end
end
end
end

return nil
end

getIsBaleAutoLoadable

Description

Definition

getIsBaleAutoLoadable()

Arguments

anybale

Code

function AutoLoaderBales:getIsBaleAutoLoadable(bale)
if bale.mountObject ~ = nil then
return false
end

return true
end

initSpecialization

Description

Definition

initSpecialization()

Code

function AutoLoaderBales.initSpecialization()
local schema = Vehicle.xmlSchema
schema:setXMLSpecializationType( "AutoLoaderBales" )

schema:register(XMLValueType.NODE_INDEX, "vehicle.autoLoaderBales.trigger#node" , "Bale pickup trigger node" )

schema:register(XMLValueType.STRING, "vehicle.autoLoaderBales.baleTypes.baleType(?)#fillTypes" , "List of supported fill types(if empty, all fill types are allowed)" )

schema:register(XMLValueType.FLOAT, "vehicle.autoLoaderBales.baleTypes.baleType(?)#diameter" , "Bale diameter" , 0 )
schema:register(XMLValueType.FLOAT, "vehicle.autoLoaderBales.baleTypes.baleType(?)#width" , "Bale width" , 0 )
schema:register(XMLValueType.FLOAT, "vehicle.autoLoaderBales.baleTypes.baleType(?)#height" , "Bale height" , 0 )
schema:register(XMLValueType.FLOAT, "vehicle.autoLoaderBales.baleTypes.baleType(?)#length" , "Bale length" , 0 )

schema:register(XMLValueType.NODE_INDEX, "vehicle.autoLoaderBales.baleTypes.baleType(?).spawnPlace#node" , "Node to spawn the bale" )
schema:register(XMLValueType.INT, "vehicle.autoLoaderBales.baleTypes.baleType(?).spawnPlace#numBales" , "Number of bales that can be loaded" , 1 )
schema:register(XMLValueType.VECTOR_ 3 , "vehicle.autoLoaderBales.baleTypes.baleType(?).spawnPlace#offsetDirection" , "Defines the axis in which the additional bales are moved" , "0 1 0" )
schema:register(XMLValueType.BOOL, "vehicle.autoLoaderBales.baleTypes.baleType(?).spawnPlace#mountBale" , "Defines if the bale is mounted or just moved to the position of the spawn node" , true )

schema:setXMLSpecializationType()

local schemaSavegame = Vehicle.xmlSchemaSavegame
Bale.registerSavegameXMLPaths(schemaSavegame, "vehicles.vehicle(?).autoLoaderBales.bale(?)" )
end

onBaleDeleted

Description

Definition

onBaleDeleted()

Arguments

anyself
anyobject

Code

function AutoLoaderBales.onBaleDeleted( self , object)
local spec = self.spec_autoLoaderBales
spec.balesInTrigger[object] = nil
end

onDelete

Description

Called on deleting

Definition

onDelete()

Code

function AutoLoaderBales:onDelete()
local spec = self.spec_autoLoaderBales
if spec.triggerId ~ = nil then
removeTrigger(spec.triggerId)
end

if spec.balesInTrigger ~ = nil then
for bale, _ in pairs(spec.balesInTrigger) do
if bale.removeDeleteListener ~ = nil then
bale:removeDeleteListener( self , AutoLoaderBales.onBaleDeleted)
end
end
table.clear(spec.balesInTrigger)
end

if spec.mountedBales ~ = nil then
for bale, _ in pairs(spec.mountedBales) do
if bale.removeDeleteListener ~ = nil then
bale:removeDeleteListener( self , AutoLoaderBales.onDeleteAutoLoaderBalesObject)
end
bale:unmountKinematic()
bale:setNeedsSaving( true )
end
table.clear(spec.mountedBales)
end
end

onDeleteAutoLoaderBalesObject

Description

Definition

onDeleteAutoLoaderBalesObject()

Arguments

anyself
anyobject

Code

function AutoLoaderBales.onDeleteAutoLoaderBalesObject( self , object)
local spec = self.spec_autoLoaderBales
if spec.mountedBales[object] ~ = nil then
spec.mountedBales[object] = nil
spec.numMountedBales = spec.numMountedBales - 1
end

spec.balesInTrigger[object] = nil

if next(spec.mountedBales) = = nil then
spec.loadedBaleType = nil
end
end

onLoad

Description

Called on loading

Definition

onLoad(table savegame)

Arguments

tablesavegamesavegame

Code

function AutoLoaderBales:onLoad(savegame)
local spec = self.spec_autoLoaderBales

spec.balesInTrigger = { }
spec.balePickupDelay = 0

spec.mountedBales = { }
spec.numMountedBales = 0
spec.loadedBaleType = nil

if self.isServer then
spec.triggerId = self.xmlFile:getValue( "vehicle.autoLoaderBales.trigger#node" , nil , self.components, self.i3dMappings)
if spec.triggerId ~ = nil then
addTrigger(spec.triggerId, "autoLoaderBalesTriggerCallback" , self )
end

spec.baleTypes = { }
self.xmlFile:iterate( "vehicle.autoLoaderBales.baleTypes.baleType" , function (index, baleTypeKey)
local baleType = { }
baleType.spawnNode = self.xmlFile:getValue(baleTypeKey .. ".spawnPlace#node" , nil , self.components, self.i3dMappings)
if baleType.spawnNode ~ = nil then
baleType.numBales = self.xmlFile:getValue(baleTypeKey .. ".spawnPlace#numBales" , 1 )
baleType.offsetDirection = self.xmlFile:getValue(baleTypeKey .. ".spawnPlace#offsetDirection" , "0 1 0" , true )
baleType.mountBale = self.xmlFile:getValue(baleTypeKey .. ".spawnPlace#mountBale" , true )

baleType.diameter = MathUtil.round( self.xmlFile:getValue(baleTypeKey .. "#diameter" , 0 ), 2 )
baleType.width = MathUtil.round( self.xmlFile:getValue(baleTypeKey .. "#width" , 0 ), 2 )
baleType.height = MathUtil.round( self.xmlFile:getValue(baleTypeKey .. "#height" , 0 ), 2 )
baleType.length = MathUtil.round( self.xmlFile:getValue(baleTypeKey .. "#length" , 0 ), 2 )

local fillTypeNames = self.xmlFile:getValue(baleTypeKey .. "#fillTypes" )
baleType.fillTypes = g_fillTypeManager:getFillTypesByNames(fillTypeNames, "Warning: '" .. self.xmlFile:getFilename() .. "' has invalid fillType '%s'." )

if (baleType.diameter ~ = 0 and baleType.width ~ = 0 )
or(baleType.width ~ = 0 and baleType.height ~ = 0 and baleType.length ~ = 0 ) then
table.insert(spec.baleTypes, baleType)
else
Logging.xmlWarning( self.xmlFile, "Incomplete bale size defintion in '%s'" , baleTypeKey)
end
else
Logging.xmlWarning( self.xmlFile, "Missing spawn place node in '%s'" , baleTypeKey)
end
end )
end
end

onLoadFinished

Description

Called after loading

Definition

onLoadFinished(table savegame)

Arguments

tablesavegamesavegame

Code

function AutoLoaderBales:onLoadFinished(savegame)
if savegame ~ = nil then
if not savegame.resetVehicles then
savegame.xmlFile:iterate(savegame.key .. ".autoLoaderBales.bale" , function (index, baleKey)
local attributes = { }
Bale.loadBaleAttributesFromXMLFile(attributes, savegame.xmlFile, baleKey, savegame.resetVehicles)

local bale = Bale.new( self.isServer, self.isClient)
if bale:loadFromConfigXML(attributes.xmlFilename, 0 , 0 , 0 , 0 , 0 , 0 , attributes.uniqueId) then
bale:applyBaleAttributes(attributes)
local baleType = self:getAutoLoadBaleTypeFromBale(bale)
if baleType ~ = nil then
self:doAutoLoadBale(baleType, bale)
else
bale:delete()
end
end
end )
end

end
end

onUpdate

Description

Called on update

Definition

onUpdate(float dt, boolean isActiveForInput, boolean isSelected, )

Arguments

floatdttime since last call in ms
booleanisActiveForInputtrue if vehicle is active for input
booleanisSelectedtrue if vehicle is selected
anyisSelected

Code

function AutoLoaderBales:onUpdate(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected)
local spec = self.spec_autoLoaderBales

spec.balePickupDelay = math.max(spec.balePickupDelay - 1 , 0 )
if spec.balePickupDelay = = 0 then
local baleMaxHeight = 0
local baleToLoad, baleTypeToLoad
for object, num in pairs(spec.balesInTrigger) do
if num > 0 then
if self:getIsBaleAutoLoadable(object) then
local baleType = self:getAutoLoadBaleTypeFromBale(object)
if baleType ~ = nil then
if spec.numMountedBales < baleType.numBales then
local _, y, _ = getWorldTranslation(object.nodeId)
if y > baleMaxHeight then
baleMaxHeight = y
baleToLoad, baleTypeToLoad = object, baleType
end
end
end
end
end
end

if baleToLoad ~ = nil then
self:doAutoLoadBale(baleTypeToLoad, baleToLoad)
spec.balesInTrigger[baleToLoad] = nil
spec.balePickupDelay = 10
end
end
end

prerequisitesPresent

Description

Checks if all prerequisite specializations are loaded

Definition

prerequisitesPresent(table specializations)

Arguments

tablespecializationsspecializations

Return Values

tablehasPrerequisitetrue if all prerequisite specializations are loaded

Code

function AutoLoaderBales.prerequisitesPresent(specializations)
return true
end

registerEventListeners

Description

Definition

registerEventListeners()

Arguments

anyvehicleType

Code

function AutoLoaderBales.registerEventListeners(vehicleType)
SpecializationUtil.registerEventListener(vehicleType, "onLoad" , AutoLoaderBales )
SpecializationUtil.registerEventListener(vehicleType, "onLoadFinished" , AutoLoaderBales )
SpecializationUtil.registerEventListener(vehicleType, "onDelete" , AutoLoaderBales )
SpecializationUtil.registerEventListener(vehicleType, "onUpdate" , AutoLoaderBales )
end

registerFunctions

Description

Definition

registerFunctions()

Arguments

anyvehicleType

Code

function AutoLoaderBales.registerFunctions(vehicleType)
SpecializationUtil.registerFunction(vehicleType, "autoLoaderBalesTriggerCallback" , AutoLoaderBales.autoLoaderBalesTriggerCallback)
SpecializationUtil.registerFunction(vehicleType, "getAutoLoadBaleTypeFromBale" , AutoLoaderBales.getAutoLoadBaleTypeFromBale)
SpecializationUtil.registerFunction(vehicleType, "doAutoLoadBale" , AutoLoaderBales.doAutoLoadBale)
SpecializationUtil.registerFunction(vehicleType, "getIsBaleAutoLoadable" , AutoLoaderBales.getIsBaleAutoLoadable)
end

registerOverwrittenFunctions

Description

Definition

registerOverwrittenFunctions()

Arguments

anyvehicleType

Code

function AutoLoaderBales.registerOverwrittenFunctions(vehicleType)
end

saveToXMLFile

Description

Definition

saveToXMLFile()

Arguments

anyxmlFile
anykey
anyusedModNames

Code

function AutoLoaderBales:saveToXMLFile(xmlFile, key, usedModNames)
local spec = self.spec_autoLoaderBales

local index = 0
for bale, _ in pairs(spec.mountedBales) do
local baleKey = string.format( "%s.bale(%d)" , key, index)
bale:saveToXMLFile(xmlFile, baleKey)
index = index + 1
end
end