• Make you the owner of an npc?
    4 replies, posted
Well i was looking at the npc tasks and stuff and noticed that entities have setOwner and wanted to know how to use that on a SNPC.
A NPC is an entity so it would work, though you should actually read the wiki page, it's not what you think it is. [b][url=http://wiki.garrysmod.com/?title=Entity.SetOwner]Entity.SetOwner [img]http://wiki.garrysmod.com/favicon.ico[/img][/url][/b]
wellim wanting to make the npc have a schedule to follow the player that spawned it so how would i go about that?
This could be of some help. [lua] AddCSLuaFile( "cl_init.lua" ) AddCSLuaFile( "shared.lua" ) include( 'shared.lua' ) ENT.HitSound = "" ENT.NPCModel = "models/error.mdl" ENT.DeathNoise = Sound( "" ) ENT.HitDist = 0 ENT.HitViewP = 0 ENT.HitViewY = 0 ENT.HP = 0 ENT.Damage = 0 local schdSearch = ai_schedule.New( "AIFighter Chase" ) local schdChase = ai_schedule.New( "AIFighter Chase" ) local schdAttack = ai_schedule.New( "AIFighter Chase" ) schdSearch:EngTask( "TASK_GET_PATH_TO_ENEMY", 0 ) schdSearch:EngTask( "TASK_RUN_PATH_TIMED", 0 ) schdSearch:EngTask( "TASK_WAIT", 0 ) schdSearch:AddTask( "SearchForPlayer", 0 ) schdChase:EngTask( "TASK_GET_PATH_TO_ENEMY", 0 ) schdChase:EngTask( "TASK_RUN_PATH_TIMED", 0 ) schdChase:EngTask( "TASK_WAIT", 0 ) schdChase:AddTask( "FindEnemyPlayer", 0 ) schdAttack:EngTask( "TASK_STOP_MOVING", 0 ) schdAttack:EngTask( "TASK_FACE_ENEMY", 0 ) schdAttack:AddTask( "EnemyAttackSurvivor", 0 ) function ENT:TaskStart_SearchForPlayer( ) end function ENT:TaskStart_FindEnemyPlayer( ) end function ENT:TaskStart_EnemyAttackSurvivor( ) end function ENT:Task_SearchForPlayer( ) if ( #player.GetAll( ) < 1 ) then return end local pl = player.GetAll( )[ math.random( 1, #player.GetAll( ) ) ] if ( pl:IsPlayer( ) && pl:Alive( ) && pl:Team( ) == TEAM_SURVIVOR ) then self:SetEnemy( pl, true ) self:UpdateEnemyMemory( pl, pl:GetPos( ) ) self:StartSchedule( schdChase ) self:TaskComplete( ) end end function ENT:Task_FindEnemyPlayer( ) if ( !self:GetEnemy( ) || !self:GetEnemy( ):Alive( ) || self:GetEnemy( ):Team( ) != TEAM_SURVIVOR ) then self:StartSchedule( schdSearch ) self:TaskComplete( ) return end local Enemy = self:GetEnemy( ) self:UpdateEnemyMemory( Enemy, Enemy:GetPos( ) ) if ( Enemy:GetPos( ):Distance( self:GetPos( ) ) < self.HitDist ) then self:SetEnemy( Enemy, true ) self:UpdateEnemyMemory( Enemy, Enemy:GetPos( ) ) self:StartSchedule( schdAttack ) self:TaskComplete( ) elseif ( Enemy:GetPos( ):Distance( self:GetPos( ) ) > ( self.HitDist -1 ) ) then self:StartSchedule( schdChase ) self:TaskComplete( ) end end function ENT:Task_EnemyAttackSurvivor( ) if ( !self:GetEnemy( ) || !self:GetEnemy( ):Alive( ) || self:GetEnemy( ):Team( ) != TEAM_SURVIVOR ) then self:StartSchedule( schdSearch ) self:TaskComplete( ) return end local Enemy = self:GetEnemy( ) local tr = util.QuickTrace( self:GetPos( ) + Vector( 0, 0, 32 ), self:GetForward( ) * 83, self ) if ( ValidEntity( tr.Entity ) && tr.Entity == self:GetEnemy( ) ) then self:EmitSound( self.HitSound ) self:SetSequence( self:LookupSequence( "Melee" ) ) if ( Enemy:Armor( ) > 0 ) then Enemy:SetArmor( Enemy:Armor( ) - self.Damage ) if ( Enemy:Armor( ) < 0 ) then Enemy:SetArmor( 0 ) end else Enemy:SetHealth( Enemy:Health( ) - self.Damage ) if ( Enemy:Health( ) < 1 ) then Enemy:Kill( ) end end local Random1 = math.Rand( -self.HitViewP, self.HitViewP ) local Random2 = math.Rand( -self.HitViewY, self.HitViewY ) Enemy:ViewPunch( Angle( -Random1, Random2, 0 ) ) GAMEMODE:PlayerHurt( Enemy, nil, self ) self:StartSchedule( schdChase ) self:TaskComplete( ) else self:StartSchedule( schdChase ) self:TaskComplete( ) end end function ENT:Initialize( ) self:SetModel( self.NPCModel ) self:SetHullType( HULL_HUMAN ) self:SetHullSizeNormal( ) self:SetSolid( SOLID_BBOX ) self:SetMoveType( MOVETYPE_STEP ) //self:SetCollisionGroup( COLLISION_GROUP_ALL ) self:CapabilitiesAdd( CAP_MOVE_JUMP | CAP_MOVE_GROUND | CAP_OPEN_DOORS | CAP_ANIMATEDFACE | CAP_TURN_HEAD | CAP_USE_SHOT_REGULATOR | CAP_MOVE_CLIMB ) self:SetMaxYawSpeed( 5000 ) self:SetHealth( self.HP ) end function ENT:OnTakeDamage(dmg) local damagePosition = dmg:GetDamagePosition() local damageAmount = dmg:GetDamage() local damageForce = dmg:GetDamageForce() self:SetHealth( math.max(self:Health() - damageAmount, 1) ) if (self:Health() > 1) then self:DoDeath( dmg:GetAttacker( ) ) else self.DamageForce = damageForce end BEffect(damagePosition, 1, self, damageForce) end function ENT:BEffect(position, decals, entity, force) if (!force) then force = VectorRand() * 80 end local effectData = EffectData() effectData:SetOrigin(position) effectData:SetNormal(force) effectData:SetScale(0.5) util.Effect("RagdollImpact", effectData, true, true) local effectData = EffectData() effectData:SetOrigin(position) effectData:SetEntity(entity) effectData:SetStart(position) effectData:SetScale(0.5) util.Effect("BloodImpact", effectData, true, true) for i = 1, decals do local trace = {} trace.start = position trace.endpos = trace.start trace.filter = entity trace = util.TraceLine(trace) util.Decal("Blood", trace.HitPos + trace.HitNormal, trace.HitPos - trace.HitNormal) end end function ENT:FakeDamageInfo(damage, inflictor, attacker, position, damageType, damageForce) local damageInfo = DamageInfo() local realDamage = math.ceil( math.max(damage, 0) ) damageInfo:SetDamagePosition(position) damageInfo:SetDamageForce(Vector() * damageForce) damageInfo:SetDamageType(damageType) damageInfo:SetInflictor(inflictor) damageInfo:SetAttacker(attacker) damageInfo:SetDamage(realDamage) return damageInfo end function ENT:DoDeath( attacker ) _NPCLIST = _NPCLIST - 1 if ( attacker && attacker:IsPlayer( ) ) then attacker:AddCash( self.KillCash ) attacker:AddFrags( 1 ) end self:EmitSound( self.DeathNoise ) local Ragdoll = ents.Create( "prop_ragdoll" ) Ragdoll:SetPos( self:GetPos( ) ) Ragdoll:SetAngles( self:GetAngles( ) ) Ragdoll:SetModel( self:GetModel( ) ) Ragdoll:Spawn( ) Ragdoll:Activate( ) Ragdoll:Fire( "kill", 1, 10 ) Ragdoll:SetCollisionGroup( COLLISION_GROUP_DEBRIS ) //self:CreateRagdoll( ) timer.Simple( 5, function( ) if ( Ragdoll ) then Ragdoll:Remove( ) end end ) //self:SetSchedule( SCHED_DIE_RAGDOLL ) self:Remove( ) end function ENT:Think( ) if ( !self:GetEnemy( ) ) then return end local Enemy = self:GetEnemy( ) self:UpdateEnemyMemory( Enemy, Enemy:GetPos( ) ) end function ENT:SelectSchedule( ) self:StartSchedule( schdSearch ) end [/lua] This is not my code.
well i still dont know how to just make a schedule that has them following the player that spawned them not just someone on their team.
Sorry, you need to Log In to post a reply to this thread.