• Make NPC face a point
    5 replies, posted
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.