Jump to content

checking for out of bounds areas


Recommended Posts

I'm working on a mod where a specifc character can get a position from the map and teleport to that position, this works, but they can teleport into ocean void past the waterfalls and cave void.

Currently using this to check if the position.

local tile = GLOBAL.TheWorld.Map:GetTileAtPoint(self.minimap:MapPosToWorldPos(x, y, z))
if tile == GLOBAL.GROUND.IMPASSABLE or tile == GLOBAL.GROUND.INVALID then
    print("Can't go there!")
    return
end

and it barely works... The character can still teleport if the ocean void is on the Northwest or Southeast sides on the surface along with random spots in the cave void. Any way to fix this?

Edited by GalaxySugar
originally posted when tired.
Link to comment
Share on other sites

If you only need a walkable position, use FindWalkableOffset:

function FindWalkableOffset(position, start_angle, radius, attempts, check_los, ignore_walls, customcheckfn, allow_water, allow_boats)
    return FindValidPositionByFan(start_angle, radius, attempts,
            function(offset)
                local x = position.x + offset.x
                local y = position.y + offset.y
                local z = position.z + offset.z
                return (TheWorld.Map:IsAboveGroundAtPoint(x, y, z, allow_water) or (allow_boats and TheWorld.Map:GetPlatformAtPoint(x,z) ~= nil))
                    and (not check_los or
                        TheWorld.Pathfinder:IsClear(
                            position.x, position.y, position.z,
                            x, y, z,
                            { ignorewalls = ignore_walls ~= false, ignorecreep = true, allowocean = allow_water }))
                    and (customcheckfn == nil or customcheckfn(Vector3(x, y, z)))
            end)
end

Example of usage:

local pos = inst:GetPosition()
local offset = FindWalkableOffset(pos, math.random() * 360 * math.pi, math.random(400, 800), 500)
local treasure = SpawnPrefab("treasurechest")
if offset then
    local spawn_pos = pos + offset
    treasure.Transform:SetPosition(spawn_pos:Get())
end

This finds a random position in a distance between 400 and 800 in a random direction from the player and spawns a chest at that point. The position is then declared by adding the offset to the initial position, as this is only an offset from the position you start from.

  • Like 1
Link to comment
Share on other sites

I understood you correctly, this was just an example of the usage ;)

If you have the position you want to teleport to, enter it in findwalkableoffset as pos. Then as radius I would enter 1 or 2,these should be good. As attempts I would use around 50 or so, more should not be needed. 

You will then get the offset that is walkable, add it to the position you want to teleport to and you're done :)

  • Like 1
Link to comment
Share on other sites

Edit : Completely misunderstood what FindWalkableOffset did.

Using it still results in the player still able to teleport past the waterfalls on the northwest and southeast sides of the ocean, so it's not really any better than what I was using before...

Edited by GalaxySugar
Link to comment
Share on other sites

So you want to be sure if the exact position you have is walkable, but it still teleports you in the outer bounds of the map.

You could use 

local tile = GLOBAL.TheWorld.Map:GetTileAtPoint(self.minimap:MapPosToWorldPos(x, y, z))
print("tile",tile)
if tile == GLOBAL.GROUND.IMPASSABLE or tile == GLOBAL.GROUND.INVALID then
    print("Can't go there!")
    return
end
local walkable = FindWalkableOffset(pos, 0, 0, 1)
if walkable == nil then
  	print("not walkable")
  	return
end

to see if this is a walkable point and see if that works.

Otherwise if it still happens, print the tile to see which one the game says it is. Because then the game thinks that this is not impassibl, but this should be impassible :confused:

Edited by Monti18
  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
  • Create New...