Hi people, I need some help with a mod I'm making. Basicly I need to tell an NPC to face a certain point or angle. I've been reading a lot about Schedules and Tasks, but I couldn't find a solution.
I know that I can do this to make an NPC move to a certain position:
[CODE]npc:SetLastPosition(pos)
npc:SetSchedule(SCHED_FORCED_GO)[/CODE]
I can also use this to make them look at another entity:
[CODE]npc:SetTarget(ply)
npc:SetSchedule(SCHED_TARGET_FACE)[/CODE]
However, I couldn't find a Schedule that makes an NPC face the last memorized position. There's a task named TASK_FACE_LASTPOSITION that apparently does what I need, but I don't know how to tell an NPC to use it. I tried npc:StartEngineTask(task,data), but it only takes numbers, not names, and I couldn't find the ID of the task I want to use. Also, I tried it with different numbers but it doesn't seem to do anything. Any ideas?
[QUOTE=MaxShadow;49635504]Hi people, I need some help with a mod I'm making. Basicly I need to tell an NPC to face a certain point or angle. I've been reading a lot about Schedules and Tasks, but I couldn't find a solution.
I know that I can do this to make an NPC move to a certain position:
[CODE]npc:SetLastPosition(pos)
npc:SetSchedule(SCHED_FORCED_GO)[/CODE]
I can also use this to make them look at another entity:
[CODE]npc:SetTarget(ply)
npc:SetSchedule(SCHED_TARGET_FACE)[/CODE]
However, I couldn't find a Schedule that makes an NPC face the last memorized position. There's a task named TASK_FACE_LASTPOSITION that apparently does what I need, but I don't know how to tell an NPC to use it. I tried npc:StartEngineTask(task,data), but it only takes numbers, not names, and I couldn't find the ID of the task I want to use. Also, I tried it with different numbers but it doesn't seem to do anything. Any ideas?[/QUOTE]
full code?
Full code of what? I'm asking how to do something ._. I haven't done it yet. But if it helps, here's what I have right now:
[CODE]
local function investigate(npc, pos, run, nearest)
-- Ignore the "nearest" parameter, its old stuff
if npc.invdelay > CurTime() then return end
npc.invdelay = CurTime() + 2 -- A little delay so NPCs don't get stuck recalculating path every tick.
if npc.investigating == false then
npc.initpos = npc:GetPos()
-- Broadcast caution effect
umsg.Start( "NPCEffect" )
umsg.Entity( npc )
umsg.String( "caution" )
umsg.End();
npc.investigating = true
end
npc.targetpos = pos
npc:SetLastPosition(pos)
if run == false and npc.running == false then
npc:SetSchedule( SCHED_FORCED_GO )
else
npc:SetSchedule( SCHED_FORCED_GO_RUN )
npc.running = true
end
end
[/CODE]
And then I have a timer that checks if NPCs have arrived their destination
[CODE]
if #npctable > 0 then
SetGlobalBool("BadNPCOnMap", true)
for k, v in pairs(npctable) do
if v.investigating and v.investigating == true and v:GetPos():Distance(v.targetpos)<50 then
v.investigating = false
v.targetpos = nil
v.running = false
v:SetSchedule( 1 ) -- Idle schedule
timer.Simple(1, function()
if IsValid(v) then
v:SetSchedule( SCHED_ALERT_SCAN ) -- Turn back 180° and then look forward again
timer.Simple(3, function()
if IsValid(v) then
v:SetLastPosition(v.initpos)
v:SetSchedule( SCHED_FORCED_GO_RUN ) -- After 3 seconds return to his original position
end
end)
end
end)
-- Broadcast alert effect
--umsg.Start( "NPCEffect" )
-- umsg.Entity( v )
-- umsg.String( "caution" )
--umsg.End();
end
end
else
SetGlobalBool("BadNPCOnMap", false)
end
[/CODE]
After they return to their original position, I want them to look at their original angles too. But I can't find a schedule that does that. Any ideas?
[QUOTE=MaxShadow;49644530]Full code of what? I'm asking how to do something ._. I haven't done it yet. But if it helps, here's what I have right now:
[CODE]
local function investigate(npc, pos, run, nearest)
-- Ignore the "nearest" parameter, its old stuff
if npc.invdelay > CurTime() then return end
npc.invdelay = CurTime() + 2 -- A little delay so NPCs don't get stuck recalculating path every tick.
if npc.investigating == false then
npc.initpos = npc:GetPos()
-- Broadcast caution effect
umsg.Start( "NPCEffect" )
umsg.Entity( npc )
umsg.String( "caution" )
umsg.End();
npc.investigating = true
end
npc.targetpos = pos
npc:SetLastPosition(pos)
if run == false and npc.running == false then
npc:SetSchedule( SCHED_FORCED_GO )
else
npc:SetSchedule( SCHED_FORCED_GO_RUN )
npc.running = true
end
end
[/CODE]
And then I have a timer that checks if NPCs have arrived their destination
[CODE]
if #npctable > 0 then
SetGlobalBool("BadNPCOnMap", true)
for k, v in pairs(npctable) do
if v.investigating and v.investigating == true and v:GetPos():Distance(v.targetpos)<50 then
v.investigating = false
v.targetpos = nil
v.running = false
v:SetSchedule( 1 ) -- Idle schedule
timer.Simple(1, function()
if IsValid(v) then
v:SetSchedule( SCHED_ALERT_SCAN ) -- Turn back 180° and then look forward again
timer.Simple(3, function()
if IsValid(v) then
v:SetLastPosition(v.initpos)
v:SetSchedule( SCHED_FORCED_GO_RUN ) -- After 3 seconds return to his original position
end
end)
end
end)
-- Broadcast alert effect
--umsg.Start( "NPCEffect" )
-- umsg.Entity( v )
-- umsg.String( "caution" )
--umsg.End();
end
end
else
SetGlobalBool("BadNPCOnMap", false)
end
[/CODE]
After they return to their original position, I want them to look at their original angles too. But I can't find a schedule that does that. Any ideas?[/QUOTE]
first of all:
[url]http://wiki.garrysmod.com/page/Net_Library_Usage[/url]
Yeah, I use Net library in my mod too, but I used global bools and user messages before knowing about it. I have to tidy up my code, it's a complete mess. This is the first thing I make in LUA. I took the source of an old mod (with permission of the creator) and modified it to add new features. I'm still learning, thats why the code has some old things I have to replace.
Nevermind. I found that I can use SetAngles with the NPC, although I'll have to use an incrementing variable to make it look smooth.
Sorry, you need to Log In to post a reply to this thread.