• Basic Scripted NPC Broken?
    2 replies, posted
[url]http://wiki.garrysmod.com/?title=Basic_Scripted_NPC[/url] I've tried 100 different ways to get scripted NPCs working, is it possible i'm missing something? The best I can get is a NPC to face your direction. I understand states, tasks, schedules I just can't seem to get anything to work. Anything you can help me with would be awesome.
.... What exactly do you need help with?
Here's my init.lua, this results in the NPC being spawned and constantly called schdChase but it never does anything in game. [code] AddCSLuaFile( "cl_init.lua" ) AddCSLuaFile( "shared.lua" ) include('shared.lua') ENT.m_iClass = CLASS_COMBINE function ENT:SpawnFunction( ply, tr ) Msg("Entering Spawn\n") if ( !tr.Hit ) then return end local SpawnPos = tr.HitPos + tr.HitNormal * 20 local ent = ents.Create( "npc_mercenary" ) ent:SetPos( SpawnPos ) ent:Spawn() ent:Activate() Msg("Exiting Spawn\n") return ent end function ENT:Initialize() Msg("Entering Init\n") self:SetModel( "models/Combine_Soldier_PrisonGuard.mdl" ) self:SetHullType( HULL_HUMAN ) self:SetHullSizeNormal() self:SetSolid( SOLID_BBOX ) self:SetMoveType( MOVETYPE_STEP ) self:CapabilitiesAdd( CAP_MOVE_GROUND | CAP_OPEN_DOORS | CAP_ANIMATEDFACE | CAP_TURN_HEAD | CAP_USE_SHOT_REGULATOR | CAP_AIM_GUN ) self:SetMaxYawSpeed( 500 ) self:SetHealth( 100 ) self:Give("weapon_smg1") Msg("Exiting Init\n") end function ENT:OnTakeDamage( dmg ) local NewHealth = self:Health() - dmg:GetDamage() if NewHealth <= 0 then self:SetNPCState( NPC_STATE_DEAD ) -- We have to do this or else SCHED_DIE_RAGDOLL won't work self:SetSchedule( SCHED_DIE_RAGDOLL ) end self:SetHealth( NewHealth ) end function ENT:SelectSchedule() local schdChase = ai_schedule.New( "AIFighter Chase" ) //creates the schedule used for this npc // Run away randomly (first objective in task) schdChase:EngTask( "TASK_GET_PATH_TO_RANDOM_NODE", 128 ) schdChase:EngTask( "TASK_RUN_PATH", 0 ) schdChase:EngTask( "TASK_WAIT_FOR_MOVEMENT", 0 ) schdChase:AddTask( "PlaySequence", { Name = "cheer1", Speed = 1 } ) // Find an enemy and run to it (second objectives in task) schdChase:AddTask( "FindEnemy", { Class = "player", Radius = 2000 } ) schdChase:EngTask( "TASK_GET_PATH_TO_RANGE_ENEMY_LKP_LOS", 0 ) schdChase:EngTask( "TASK_RUN_PATH", 0 ) schdChase:EngTask( "TASK_WAIT_FOR_MOVEMENT", 0 ) // Shoot it (third objective in task) schdChase:EngTask( "TASK_STOP_MOVING", 0 ) schdChase:EngTask( "TASK_FACE_ENEMY", 0 ) schdChase:EngTask( "TASK_ANNOUNCE_ATTACK", 0 ) schdChase:EngTask( "TASK_RANGE_ATTACK1", 0 ) schdChase:EngTask( "TASK_RELOAD", 0 ) //schedule is looped till you give it a different schedule -- Msg("Entering SelectSchedule()\n") Msg("State:" .. self:GetNPCState() .. "\n") if self:GetNPCState() == 0 then self:SetNPCState(1) end if self:GetNPCState() == 3 then Msg("Running schdChase\n") self:StartSchedule(schdChase) end self:SetSchedule(SCHED_IDLE_WANDER) -- Msg("Exiting SelectSchedule()\n") end [/code]
Sorry, you need to Log In to post a reply to this thread.