Skip to main content
Skip to main content

Dog

Dog

Parent

Object

Functions

delete

Description

Delete

Definition

delete()

Code

function Dog:delete()
self.isDeleted = true -- mark as deleted so we can track it in Doghouse
if self.dogInstance ~ = nil then
--#debug log("delete dogInstance", self.dogInstance)
delete( self.dogInstance)
end

if self.isServer then
g_messageCenter:unsubscribeAll( self )
end

unregisterObjectClassName( self )
g_currentMission.activatableObjectsSystem:removeActivatable( self.activatable)
g_soundManager:removeIndoorStateChangedListener( self )

Dog:superClass().delete( self )
end

fetchItem

Description

Activate fetch ball behavior

Definition

fetchItem(object object, )

Arguments

objectobjectof type DogBall
anyball

Code

function Dog:fetchItem(player, ball)
if not self.isServer then
g_client:getServerConnection():sendEvent( DogFetchItemEvent.new( self , player, ball))
else
local x, y, z = getWorldTranslation(ball.nodeId)
ball.throwPos = { x, y, z }
setCompanionBehaviorFetch( self.dogInstance, self.animalId, ball.nodeId, player.rootNode)
self.entityThrower = player.rootNode
end
end

finalizePlacement

Description

Definition

finalizePlacement()

Code

function Dog:finalizePlacement()
self:setVisibility( true )

if self.isServer then
g_messageCenter:subscribe(MessageType.HOUR_CHANGED, self.hourChanged, self )
g_messageCenter:subscribe(MessageType.PLAYER_FARM_CHANGED, Dog.playerFarmChanged, self )
end
end

followEntity

Description

Activate follow player

Definition

followEntity(integer scenegraph)

Arguments

integerscenegraphnode of the ball

Code

function Dog:followEntity(player)
-- Note:we also set entityFollow on the client side so that we can update the gui(it won't be 100% accurate if an other player interacts, but that should be good enough)
self.entityFollow = player.rootNode
self.entityThrower = nil
if not self.isServer then
g_client:getServerConnection():sendEvent( DogFollowEvent.new( self , player))
else
setCompanionBehaviorFollowEntity( self.dogInstance, self.animalId, self.entityFollow)
self.isStaying = false
end
end

getUpdatePriority

Description

Get update priority

Definition

getUpdatePriority(float skipCount, float x, float y, float z, float coeff, table connection, )

Arguments

floatskipCountskip count
floatxx position
floatyy position
floatzz position
floatcoeffcoeff
tableconnectionconnection
anyisGuiVisible

Return Values

anyprioritypriority

Code

function Dog:getUpdatePriority(skipCount, x, y, z, coeff, connection, isGuiVisible)
local distance, clipDistance = getCompanionClosestDistance( self.dogInstance, x, y, z)
if clipDistance = = 0 then
return 0
end

local clipDist = math.min(clipDistance * coeff, self.forcedClipDistance)
local result = ( 1.0 - distance / clipDist) * 0.8 + 0.5 * skipCount * 0.2

return result
end

goToSpawn

Description

Activate fetch ball behavior

Definition

goToSpawn(integer scenegraph)

Arguments

integerscenegraphnode of the ball

Code

function Dog:goToSpawn()
self.entityFollow = nil
self.entityThrower = nil

if not self.isServer then
g_client:getServerConnection():sendEvent( DogFollowEvent.new( self , nil ))
else
setCompanionBehaviorGotoEntity( self.dogInstance, self.animalId, self.spawner:getSpawnNode())
end
end

hourChanged

Description

Called by the environment when an hour has changed.

Definition

hourChanged()

Code

function Dog:hourChanged()
if not self.isServer then
return
end

if self.dogInstance ~ = nil then
setCompanionDaytime( self.dogInstance, g_currentMission.environment.dayTime)
end
end

idleStay

Description

Activate dog staying behavior (used when the currently followed player is switching vehicles or leaving the game)

Definition

idleStay()

Code

function Dog:idleStay()
-- This is only supposed to be called on the server
self.entityFollow = nil
self.entityThrower = nil
setCompanionBehaviorDefault( self.dogInstance, self.animalId)
self.isStaying = true
end

idleWander

Description

Definition

idleWander()

Code

function Dog:idleWander()
-- This is only supposed to be called on the server
--setCompanionBehaviorIdleWander(self.dogInstance, self.animalId)
end

isAbandoned

Description

Definition

isAbandoned()

Arguments

anydt

Code

function Dog:isAbandoned(dt)
local isEntityInRange = false
for _, player in pairs(g_currentMission.players) do
if player.isControlled then
local entityX, entityY, entityZ = getWorldTranslation(player.rootNode)
local distance, _ = getCompanionClosestDistance( self.dogInstance, entityX, entityY, entityZ)
if distance < self.abandonRange then
isEntityInRange = true
break
end
end
end

if not isEntityInRange then
for _, enterable in pairs(g_currentMission.vehicleSystem.enterables) do
if enterable.spec_enterable ~ = nil and enterable.spec_enterable.isControlled then
local entityX, entityY, entityZ = getWorldTranslation(enterable.rootNode)
local distance, _ = getCompanionClosestDistance( self.dogInstance, entityX, entityY, entityZ)
if distance < self.abandonRange then
isEntityInRange = true
break
end
end
end
end

if isEntityInRange then
self.abandonTimer = self.abandonTimerDuration
else
self.abandonTimer = self.abandonTimer - dt
if self.abandonTimer < = 0 then
return true
end
end

return false
end

load

Description

Definition

load()

Arguments

anyspawner
anyxmlFilename
anyspawnX
anyspawnY
anyspawnZ

Code

function Dog:load(spawner, xmlFilename, spawnX, spawnY, spawnZ)
self.spawner = spawner
self.animalId = 0
self.spawnX = spawnX
self.spawnY = spawnY
self.spawnZ = spawnZ
self.xmlFilename = xmlFilename
self.name = g_currentMission.animalNameSystem:getRandomName()

local dogInstance = createAnimalCompanionManager(CompanionAnimalType.DOG, self.xmlFilename, "dog" , self.spawnX, self.spawnY, self.spawnZ, g_terrainNode, self.isServer, self.isClient, 1 , AudioGroup.ENVIRONMENT)
if dogInstance = = 0 then
return false
end

self.dogInstance = dogInstance
setCompanionWaterDetectionOffset( self.dogInstance, 0.45 )

setCompanionTrigger( self.dogInstance, self.animalId, "playerInteractionTriggerCallback" , self )

setCompanionTextureTile( self.dogInstance, self.animalId, 1 , 1 )

local groundMask = CollisionFlag.TERRAIN + CollisionFlag.STATIC_OBJECT
local obstacleMask = CollisionFlag.STATIC_OBJECT +
CollisionFlag.DYNAMIC_OBJECT +
CollisionFlag.VEHICLE +
CollisionFlag.BUILDING
setCompanionCollisionMask( self.dogInstance, groundMask, obstacleMask, CollisionFlag.WATER)

g_soundManager:addIndoorStateChangedListener( self )
setCompanionUseOutdoorAudioSetup( self.dogInstance, not g_soundManager:getIsIndoor())

return true
end

loadFromXMLFile

Description

Loading from attributes and nodes

Definition

loadFromXMLFile(XMLFile xmlFile, string key, boolean resetVehicles)

Arguments

XMLFilexmlFileXMLFile instance
stringkeykey
booleanresetVehiclesreset vehicles

Return Values

booleansuccesssuccess

Code

function Dog:loadFromXMLFile(xmlFile, key, resetVehicles)
self:setName(xmlFile:getValue(key .. "#name" , "" ))

return true
end

new

Description

Creating

Definition

new()

Arguments

anyisServer
anyisClient
anycustomMt

Return Values

anyinstanceinstance of object

Code

function Dog.new(isServer, isClient, customMt)
local self = Object.new(isServer, isClient, customMt or Dog _mt)

self.dogInstance = nil
self.animalId = nil
self.spawner = nil
self.xmlFilename = nil
self.entityFollow = nil
self.entityThrower = nil
self.isStaying = false
self.abandonTimer = 0.0
self.abandonTimerDuration = 6000
self.abandonRange = 100
self.name = ""

self.tileIndexU = 0
self.tileIndexV = 0

self.spawnX = 0
self.spawnY = 0
self.spawnZ = 0

self.forcedClipDistance = 80

self.activatable = DogPetActivatable.new( self )

registerObjectClassName( self , "Dog" )

self.dirtyFlag = self:getNextDirtyFlag()
return self
end

onFoodBowlFilled

Description

Definition

onFoodBowlFilled()

Arguments

anyfoodBowlNode

Code

function Dog:onFoodBowlFilled(foodBowlNode)
self.entityFollow = nil
self.entityThrower = nil
setCompanionBehaviorFeed( self.dogInstance, self.animalId, foodBowlNode)
end

onGhostAdd

Description

On ghost add

Definition

onGhostAdd()

Code

function Dog:onGhostAdd()
self:setVisibility( true )
end

onGhostRemove

Description

On ghost remove

Definition

onGhostRemove()

Code

function Dog:onGhostRemove()
self:setVisibility( false )
end

onIndoorStateChanged

Description

Definition

onIndoorStateChanged()

Arguments

anyisIndoor

Code

function Dog:onIndoorStateChanged(isIndoor)
setCompanionUseOutdoorAudioSetup( self.dogInstance, not g_soundManager:getIsIndoor())
end

onPlayerLeave

Description

Tells the dog to stay at the current place when we leave the currently followed player

Definition

onPlayerLeave()

Arguments

anyplayer

Code

function Dog:onPlayerLeave(player)
-- return dog to it's house
if self.isServer then
if self.entityFollow = = player.rootNode or self.entityThrower = = player.rootNode then
self:idleStay()
end
end
end

pet

Description

Activate dog petting response behavior

Definition

pet()

Code

function Dog:pet()
if not self.isServer then
g_client:getServerConnection():sendEvent( DogPetEvent.new( self ))
else
setCompanionBehaviorPet( self.dogInstance, self.animalId)

local total, _ = g_farmManager:updateFarmStats( self:getOwnerFarmId(), "petDogCount" , 1 )
if total ~ = nil then
g_achievementManager:tryUnlock( "PetDog" , total)
end
end
end

playerFarmChanged

Description

Definition

playerFarmChanged()

Arguments

anyplayer

Code

function Dog:playerFarmChanged(player)
if self.isServer then
if self.entityFollow = = player.rootNode or self.entityThrower = = player.rootNode then
self:idleStay()
end
end
end

playerInteractionTriggerCallback

Description

Callback when dog interaction trigger is activated

Definition

playerInteractionTriggerCallback(integer triggerId, integer otherId, boolean onEnter, boolean onLeave, boolean onStay)

Arguments

integertriggerIdid of trigger
integerotherIdid of actor
booleanonEnteron enter
booleanonLeaveon leave
booleanonStayon stay

Code

function Dog:playerInteractionTriggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
if onEnter or onLeave then
if g_localPlayer ~ = nil and otherId = = g_localPlayer.rootNode then
if onEnter then
if g_currentMission.accessHandler:canFarmAccess(g_localPlayer.farmId, self , false ) then
g_currentMission.activatableObjectsSystem:addActivatable( self.activatable)
end
else
g_currentMission.activatableObjectsSystem:removeActivatable( self.activatable)
end
end
end
end

readStream

Description

Called on client side on join

Definition

readStream(integer streamId, table connection)

Arguments

integerstreamIdstream ID
tableconnectionconnection

Code

function Dog:readStream(streamId, connection)
if connection:getIsServer() then
local spawner = NetworkUtil.readNodeObject(streamId)
-- Note:the spawner can be when the doghouse not synced yet.The spawner will be set later on
local xmlFilename = NetworkUtil.convertFromNetworkFilename(streamReadString(streamId))

local spawnX = streamReadFloat32(streamId)
local spawnY = streamReadFloat32(streamId)
local spawnZ = streamReadFloat32(streamId)
local name = streamReadString(streamId)
self.tileIndexU = streamReadUIntN(streamId, 3 )
self.tileIndexV = streamReadUIntN(streamId, 3 )

local isNew = self.xmlFilename = = nil
if isNew then
self:load(spawner, xmlFilename, spawnX, spawnY, spawnZ)
if spawner ~ = nil then
spawner.dog = self
end
end

self:setTextureTileIndices( self.tileIndexU, self.tileIndexV)
self:setName(name)
end
Dog:superClass().readStream( self , streamId, connection)
end

readUpdateStream

Description

Read update network stream

Definition

readUpdateStream(integer streamId, integer timestamp, table connection)

Arguments

integerstreamIdnetwork stream identification
integertimestamp
tableconnectionconnection information

Code

function Dog:readUpdateStream(streamId, timestamp, connection)
if connection:getIsServer() then
readAnimalCompanionManagerFromStream( self.dogInstance, streamId, g_clientInterpDelay, g_packetPhysicsNetworkTime, g_client.tickDuration)
end
end

registerSavegameXMLPaths

Description

Definition

registerSavegameXMLPaths()

Arguments

anyschema
anybasePath

Code

function Dog.registerSavegameXMLPaths(schema, basePath)
schema:register(XMLValueType.STRING, basePath .. "#name" , "Name of dog" )
end

resetSteeringParms

Description

Definition

resetSteeringParms()

Code

function Dog:resetSteeringParms()
-- This is only supposed to be called on the server

end

saveToXMLFile

Description

Get save attributes and nodes

Definition

saveToXMLFile(table xmlFile, string key, table usedModNames)

Arguments

tablexmlFile
stringkey
tableusedModNames

Code

function Dog:saveToXMLFile(xmlFile, key, usedModNames)
xmlFile:setValue(key .. "#name" , HTMLUtil.encodeToHTML( self.name))
end

setName

Description

Definition

setName()

Arguments

anyname

Code

function Dog:setName(name)
self.name = name or ""
end

setVisibility

Description

Definition

setVisibility()

Arguments

anystate

Code

function Dog:setVisibility(state)
if self.dogInstance ~ = nil then
setCompanionsVisibility( self.dogInstance, state)
setCompanionsPhysicsUpdate( self.dogInstance, state)
end
end

teleportToSpawn

Description

Definition

teleportToSpawn()

Code

function Dog:teleportToSpawn()
if self.isServer then
setCompanionPosition( self.dogInstance, self.animalId, self.spawnX, self.spawnY, self.spawnZ)
self:idleWander()
self:resetSteeringParms()
self.isStaying = false
self.entityFollow = nil
self.entityThrower = nil

-- TODO sync notification
g_currentMission:addIngameNotification(FSBaseMission.INGAME_NOTIFICATION_OK, g_i18n:getText( "ingameNotification_dogInDogHouse" ))
end
end

testScope

Description

Test scope

Definition

testScope(float x, float y, float z, float coeff, )

Arguments

floatxx position
floatyy position
floatzz position
floatcoeffcoeff
anyisGuiVisible

Return Values

anyinScopein scope

Code

function Dog:testScope(x,y,z, coeff, isGuiVisible)
local distance, clipDistance = getCompanionClosestDistance( self.dogInstance, x, y, z)
local clipDist = math.min(clipDistance * coeff, self.forcedClipDistance)

return distance < clipDist
end

update

Description

Update

Definition

update(float dt)

Arguments

floatdttime since last call in ms

Code

function Dog:update(dt)
-- companionDebugDraw(self.dogInstance, self.animalId, true, true, true)

if self.isServer then
if self.isStaying and self:isAbandoned(dt) then
self:teleportToSpawn()
end

-- The dog is always active
-- The only time when it could be disabled is when it is staying.But we don't care to optimize for that case
self:raiseActive()
end
Dog:superClass().update( self , dt)
end

updateTick

Description

Update network tick

Definition

updateTick(float dt)

Arguments

floatdttime since last call in ms

Code

function Dog:updateTick(dt)
if self.isServer and self.dogInstance ~ = nil then
if getAnimalCompanionNeedNetworkUpdate( self.dogInstance) then
self:raiseDirtyFlags( self.dirtyFlag)
end
end
Dog:superClass().updateTick( self , dt)
end

writeStream

Description

Called on server side on join

Definition

writeStream(integer streamId, table connection)

Arguments

integerstreamIdstream ID
tableconnectionconnection

Code

function Dog:writeStream(streamId, connection)
if not connection:getIsServer() then
NetworkUtil.writeNodeObject(streamId, self.spawner)
streamWriteString(streamId, NetworkUtil.convertToNetworkFilename( self.xmlFilename))
streamWriteFloat32(streamId, self.spawnX)
streamWriteFloat32(streamId, self.spawnY)
streamWriteFloat32(streamId, self.spawnZ)
streamWriteString(streamId, self.name)
streamWriteUIntN(streamId, self.tileIndexU, 3 )
streamWriteUIntN(streamId, self.tileIndexV, 3 )
end
Dog:superClass().writeStream( self , streamId, connection)
end

writeUpdateStream

Description

Write update network stream

Definition

writeUpdateStream(integer streamId, table connection, integer dirtyMask)

Arguments

integerstreamIdnetwork stream identification
tableconnectionconnection information
integerdirtyMask

Code

function Dog:writeUpdateStream(streamId, connection, dirtyMask)
if not connection:getIsServer() then
writeAnimalCompanionManagerToStream( self.dogInstance, streamId)
end
end