• Lamp doesn't parent to head
    6 replies, posted
I decided to just try attaching an flashlight to an NPC myself. I decided to use the NPC camera code since I don't know how to use LUA, i'll ask for permission later since I haven't released it. I tried parenting an env_projectedtexture to the head but it isn't parented, it follows the general position of the NPC but it doesn't parent the env_projectedtexture to the head or more specificly eyes. Also how would I parent an point_spotlight with the env_projectedtexture as well? It also doesn't cast dynamic shadows which I had for in mind. I also can't parent it to the hand or more specifically anim_attachment_LH. Help? [lua] TOOL.Category = "Render" TOOL.Name = "#NPCVision" TOOL.Command = nil TOOL.ConfigName = "" TOOL.ClientConVar[ "key" ] = "0" TOOL.ClientConVar[ "toggle" ] = "1" GAMEMODE.CameraList = GAMEMODE.CameraList or {} if ( CLIENT ) then language.Add( "NPCVision", "NPC Camera" ) language.Add( "Tool_npcvision_name", "NPC Camera Tool" ) language.Add( "Tool_npcvision_desc", "Creates a camera inside of a NPC's head." ) language.Add( "Tool_npcvision_0", "Left click on a NPC to create a camera. Right click to remove it from the NPC's head." ) language.Add( "Tool_npcvision_key", "Key:" ) language.Add( "Tool_npcvision_toggle", "Toggle:" ) language.Add( "Undone_NPC Camera", "Undone NPC Camera" ) end function TOOL:LeftClick( trace ) local key = self:GetClientNumber( "key" ) if (key == -1) then return false end if ( !trace.Entity ) then return end if ( !trace.Entity:IsValid( ) ) then return end if ( !trace.Entity:IsNPC( ) ) then return end if ( CLIENT ) then return true end local ply = self:GetOwner() local pid = ply:UniqueID() local toggle = self:GetClientNumber( "toggle" ) GAMEMODE.CameraList[ pid ] = GAMEMODE.CameraList[ pid ] or {} local CameraList = GAMEMODE.CameraList[ pid ] local attname = "eyes" local head = trace.Entity:LookupAttachment( "eyes" ) if ( head == 0 ) then attname = "Eye" head = trace.Entity:LookupAttachment( "Eye" ) if ( head == 0 ) then -- No eyes :( return end end -- Already have a camera ? Remove it local cam cam = trace.Entity.NPC_ViewCam if ( cam && cam:IsValid() ) then cam:Remove() end -- If the camera already exists then remove it if (CameraList[ key ] && CameraList[ key ] != NULL ) then local ent = CameraList[ key ] ent:Remove() end -- Create the camera local cam = ents.Create( "env_projectedtexture" ) cam:SetParent( trace.Entity ) -- Position and rotate the camera correctly local attachment = trace.Entity:GetAttachment( head ) local ang = attachment.Ang local pos = attachment.Pos cam:SetPos( pos ) cam:SetAngles( ang ) cam:Spawn( ) cam:SetNotSolid( true ) cam:GetTable():SetKey( key ) cam:GetTable():SetPlayer( ply ) cam:GetTable().toggle = toggle cam:GetTable():SetTracking( NULL, Vector(0) ) if toggle == 1 then numpad.OnDown( ply, key, "Camera_Toggle", cam ) else numpad.OnDown( ply, key, "Camera_On", cam ) numpad.OnUp( ply, key, "Camera_Off", cam ) end undo.Create("NPC Camera") undo.AddEntity( cam ) undo.SetPlayer( ply ) undo.Finish() ply:AddCleanup( "cameras", cam ) CameraList[ key ] = cam -- Attach it to the head so it moves and rotate with it cam:Fire( "setparentattachmentmaintainoffset" , attname , 0 ) trace.Entity.NPC_ViewCam = cam return true end function TOOL:RightClick( trace ) if ( !trace.Entity ) then return end if ( !trace.Entity:IsValid( ) ) then return end if ( !trace.Entity:IsNPC( ) ) then return end if ( CLIENT ) then return true end if ( trace.Entity.NPC_ViewCam and trace.Entity.NPC_ViewCam:IsValid() ) then trace.Entity.NPC_ViewCam:Remove() trace.Entity.NPC_ViewCam = nil return true end end function TOOL:Think() end function TOOL.BuildCPanel(panel) panel:AddControl("Header", { Text = "#Tool_npcvision_name", Description = "#Tool_npcvision_desc" }) panel:AddControl("Numpad", { Label = "#Tool_npcvision_key", Command = "npcvision_key", Buttonsize = "22" } ) panel:AddControl("CheckBox", {Label = "#Tool_npcvision_toggle",Command = "npcvision_toggle"}) end[/lua] [media]http://www.youtube.com/watch?v=MIwxS5_i2N8[/media]
pos,ang = npc:GetBonePosition("ValveBiped.Bip01_L_Hand"); Could use that to get it on the left hand.
[QUOTE=Averice;20098645]pos,ang = npc:GetBonePosition("ValveBiped.Bip01_L_Hand"); Could use that to get it on the left hand.[/QUOTE] So where would I copy paste that? I made it overwrite: local ang = attachment.Ang local pos = attachment.Pos but it comes up weapons\gmod_tool\stools/npcvision.lua:70: attempt to index global 'npc' (a nil value)
Well you should set the lamp's position and angle before you parent the lamp. You might also want to parent it after its spawned to.
Is there any good examples of parenting stuff to NPCs?
replace npc with tr.Entity: and use pos/ang, you may need to do it in some sort of think/draw hook to make sure it stays updated with the client.
[QUOTE=Averice;20114880]replace npc with tr.Entity: and use pos/ang, you may need to do it in some sort of think/draw hook to make sure it stays updated with the client.[/QUOTE] Still comes up with attempt to index nil value
Sorry, you need to Log In to post a reply to this thread.