hkzorman / advanced_npc

Advanced NPC for Minetest, using mobs_redo API
Other
17 stars 5 forks source link

Program registration #47

Open BrunoMine opened 6 years ago

BrunoMine commented 6 years ago

I'm trying to create a program and get this for now.

npc.programs.register("sunos:interagir", function(self, args)
    local tempo = args.time or 5
    local pos = npc.programs.helper.get_pos_argument(self, args.pos, true)

    -- Rotate
    npc.exec.proc.enqueue(self, "advanced_npc:rotate", {
        start_pos = self.object:getpos(),
        end_pos = pos,
    })

    -- Wait
    npc.exec.proc.enqueue(self, "advanced_npc:wait", {
        time = time,
    })
end)

It looks like the NPC does not rotate to the right place.

I did not understand correctly where the temporary data is and how to reference future places.

hkzorman commented 6 years ago

While in theory it should work, I honestly recommend to you to calculate the yaw and pass it to advanced_npc:rotate as yaw argument. Also, see if pos has the position argument that you expect.

BrunoMine commented 6 years ago

But assuming I want to rotate to a place that will change in a previous instruction or program. How do I do this?

BrunoMine commented 6 years ago

The problem is in npc.programs.helper.get_pos_argument 3rd argument, true is for acess_node. I must have mistaken myself for the comments.

-- Return the first position only if it couldn't find an owned
-- place, or if it there is only one
if use_access_node == true then
    return places_pos[1].access_node, places_pos[1].pos
else
    return places_pos[1].pos
end
hkzorman commented 6 years ago

Ah got it, yes, that happens. Regarding the future position, that is a little bit more tricky. That's the purpose of variables, store the position as variable (npc.exec.var.put()). Register a instruction that does this:

npc.programs.instr.register("future_rotate", function(self, args)
  local future_pos = npc.exec.var.get(self, "future_pos")
  npc.programs.instr.execute(self, "advanced_npc:rotate", {yaw = minetest.dir_to_yaw(vector.direction(self.object:getpos(), future_pos))})
end

Then enqueue this instruction after the execution of the program/instruction that calculates and stores the pos.

BrunoMine commented 6 years ago

So if I want to reference my future pos I should do.

npc.programs.instr.register("update_my_pos", function(self, args)
    npc.exec.var.set(self, "future_pos", self.object:getpos())
end

npc.programs.instr.register("rotate", function(self, args)
    local future_pos = npc.exec.var.get(self, "future_pos")
    npc.programs.instr.execute(self, "advanced_npc:rotate", {yaw = minetest.dir_to_yaw(vector.direction(self.object:getpos(), future_pos))})
end

npc.programs.register("interact", function(self, args)
    local tempo = args.time or 5
    local pos = npc.programs.helper.get_pos_argument(self, args.pos, true)

    -- Rotate
    npc.exec.proc.enqueue(self, "rotate", {})

    -- Wait
    npc.exec.proc.enqueue(self, "wait", {
        time = time,
    })

        -- Walk to a random pos
        npc.exec.proc.enqueue(self, "walk_to_pos", {})

        -- Update variable
    npc.exec.proc.enqueue(self, "update_my_pos", {})

        -- New Rotate
    npc.exec.proc.enqueue(self, "advanced_npc:rotate", {})
end)
BrunoMine commented 6 years ago

My example sucks, but I want to say that the variable needs to be updated by another instruction.

hkzorman commented 6 years ago

Maybe if you tell me your exact use case I can help you figure out how to do it. But in general yes your code should work.