v1.4.4
This commit is contained in:
commit
9c94d113d3
10260 changed files with 1237388 additions and 0 deletions
95
assets/devel/monsters/pathState.lua
Normal file
95
assets/devel/monsters/pathState.lua
Normal file
|
@ -0,0 +1,95 @@
|
|||
pathState = {
|
||||
moveToTargetMinDistance = 3,
|
||||
maxYDistanceFromSpawnPoint = 5,
|
||||
defaultIndoorSearchRadius = 30
|
||||
}
|
||||
|
||||
function pathState.enter()
|
||||
local targetPosition,targetBeacon = pathState.findGoal()
|
||||
local desiredDistance = config.getParameter("pathing.desiredDistance", 2)
|
||||
|
||||
if not targetPosition then
|
||||
return nil
|
||||
elseif world.magnitude(world.distance(targetPosition, mcontroller.position())) < desiredDistance then
|
||||
return nil
|
||||
end
|
||||
|
||||
return {
|
||||
targetPosition = targetPosition,
|
||||
targetBeacon = targetBeacon,
|
||||
desiredDistance = desiredDistance,
|
||||
pather = Pather:new({run = config.getParameter("pathing.run", true)})
|
||||
}
|
||||
end
|
||||
|
||||
function pathState.enteringState(stateData)
|
||||
local position = mcontroller.position()aa
|
||||
|
||||
script.setUpdateDelta(1)
|
||||
end
|
||||
|
||||
function pathState.update(dt, stateData)
|
||||
local position = mcontroller.position()
|
||||
|
||||
-- Find goal position
|
||||
if not stateData.targetPosition then
|
||||
return true
|
||||
end
|
||||
|
||||
local toTarget = world.distance(stateData.targetPosition, position)
|
||||
local moved = pather.move(stateData.targetPosition, dt)
|
||||
if moved == "running" then
|
||||
mcontroller.controlFace(pather.deltaX)
|
||||
setMovementState()
|
||||
elseif moved == false then
|
||||
-- Stay in pathing state even when stuck
|
||||
setIdleState()
|
||||
return false
|
||||
elseif moved == true then
|
||||
-- Reached the target
|
||||
return true
|
||||
end
|
||||
|
||||
if world.magnitude(toTarget) <= stateData.desiredDistance then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function pathState.leavingState(stateData)
|
||||
world.debugText("leavingPathState", mcontroller.position(), "red")
|
||||
|
||||
local position = mcontroller.position()
|
||||
if stateData.targetBeacon ~= nil then
|
||||
local distance = world.magnitude(world.distance(stateData.targetPosition, position))
|
||||
if distance < stateData.desiredDistance then
|
||||
world.callScriptedEntity(stateData.targetBeacon, "onInteraction")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function pathState.findGoal()
|
||||
local nearObjects = world.entityQuery(mcontroller.position(), 100, {
|
||||
includedTypes = { "object"},
|
||||
withoutEntityId = entity.id(),
|
||||
boundMode = "Position",
|
||||
order = "nearest"
|
||||
})
|
||||
local targetPosition
|
||||
for _,objectId in pairs(nearObjects) do
|
||||
if world.entityName(objectId) == "apexstatue3" then
|
||||
local targetPosition = world.entityPosition(objectId)
|
||||
targetPosition[2] = targetPosition[2] - pathState.collisionBottom()
|
||||
return targetPosition, objectId
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function pathState.collisionBottom()
|
||||
local lowest = 0
|
||||
for _,point in pairs(mcontroller.collisionPoly()) do
|
||||
if point[2] < lowest then
|
||||
lowest = point[2]
|
||||
end
|
||||
end
|
||||
return lowest
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue