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.