Advanced-Bone-Tool/lua/weapons/gmod_tool/stools/adv_bone.lua

233 lines
7.9 KiB
Lua

TOOL.Name = "Advanced Bone Tool"
TOOL.Category = "Poser"
if CLIENT then
language.Add( "tool.adv_bone.name", TOOL.Name )
language.Add( "tool.adv_bone.desc", "Manipulate props and ragdolls!" )
language.Add( "tool.adv_bone.0", "Left click to select object, Right click to select self, C to edit bones." )
language.Add( "tool.adv_bone.bone", "Bone" )
language.Add( "tool.adv_bone.editangles", "Edit Angles" )
language.Add( "tool.adv_bone.pitch", "Pitch" )
language.Add( "tool.adv_bone.Yaw", "Yaw" )
language.Add( "tool.adv_bone.roll", "Roll" )
language.Add( "tool.adv_bone.editposition", "Edit Position" )
language.Add( "tool.adv_bone.editscale", "Edit Scale" )
language.Add( "tool.adv_bone.x", "X" )
language.Add( "tool.adv_bone.y", "Y" )
language.Add( "tool.adv_bone.z", "Z" )
language.Add( "tool.adv_bone.help", "Thank you for downloading this tool! <3 Th13teen" )
function UpdateAdvBoneMenu( ent, bone )
if ( IsValid( ent ) ) then
print( "Updating list" )
local panel = controlpanel.Get( "adv_bone" )
if ( !IsValid( panel.combo_bonelist ) ) then
return
end
local ang = ent:GetManipulateBoneAngles( bone ) or Angle( 0, 0, 0 )
local pos = ent:GetManipulateBonePosition( bone ) or Vector( 0, 0, 0 )
local scale = ent:GetManipulateBoneScale( bone ) or Vector( 1, 1, 1 )
panel.ent = ent
panel.combo_bonelist:Clear()
for i = 0, ent:GetBoneCount() - 1 do
local name = ent:GetBoneName( i )
if ( name != "__INVALIDBONE__" ) then
panel.combo_bonelist:AddChoice( name )
end
end
local name = ent:GetBoneName( bone )
if ( name == "__INVALIDBONE__" ) then name = "static_prop" end
panel.combo_bonelist:SetValue( name )
panel.slider_ang_pitch:SetValue( ang.p )
panel.slider_ang_yaw:SetValue( ang.y )
panel.slider_ang_roll:SetValue( ang.r )
panel.slider_pos_x:SetValue( pos.x )
panel.slider_pos_y:SetValue( pos.y )
panel.slider_pos_z:SetValue( pos.z )
panel.slider_scale_x:SetValue( scale.x )
panel.slider_scale_y:SetValue( scale.y )
panel.slider_scale_z:SetValue( scale.z )
end
end
net.Receive( "UpdateAdvBoneMenu", function()
local ent = net.ReadEntity()
local bone = net.ReadFloat()
UpdateAdvBoneMenu( ent, bone )
end )
local shouldGlow = false
hook.Add( "OnContextMenuOpen", "Advanced Bone Tool", function()
local tool = LocalPlayer():GetTool()
if ( IsValid( tool ) ) then
shouldGlow = ( tool.Name == "Advanced Bone Tool" )
end
end )
hook.Add( "OnContextMenuClose", "Advanced Bone Tool", function()
shouldGlow = false
end )
hook.Add( "PreDrawHalos", "Advanced Bone Tool", function()
if ( !shouldGlow ) then return end
local ply = LocalPlayer()
local ent = ply:GetNWEntity( "AdvBoneEntity" )
local col = ply:GetWeaponColor() * 255
if ( IsValid( ent ) ) then
halo.Add( {ent}, Color( col.r, col.g, col.b ) )
halo.Add( {ent}, Color( 255, 255, 255, 100 ) )
end
end )
else
util.AddNetworkString( "UpdateAdvBoneMenu" )
util.AddNetworkString( "UpdateAdvBoneSettings" )
net.Receive( "UpdateAdvBoneSettings", function()
local data = net.ReadTable()
local ent = data.ent
if ( !IsValid( ent ) ) then return end
local bone = 0
for i = 0, ent:GetBoneCount() - 1 do
local name = ent:GetBoneName( i )
if ( name == data.bone ) then
bone = i
end
end
ent:ManipulateBoneAngles( bone, data.ang )
ent:ManipulateBonePosition( bone, data.pos )
ent:ManipulateBoneScale( bone, data.scale )
end )
end
function TOOL:SelectEntity( ent, physbone )
if CLIENT then return true end
if ( IsValid( ent ) ) then
if ( IsValid( ent.AttachedEntity ) ) then ent = ent.AttachedEntity end
self.Entity = ent
self.Bone = self.Entity:TranslatePhysBoneToBone( physbone ) or 0
self:GetOwner():SetNWEntity( "AdvBoneEntity", self.Entity )
net.Start( "UpdateAdvBoneMenu" )
net.WriteEntity( self.Entity )
net.WriteFloat( self.Bone )
net.Send( self:GetOwner() )
end
return true
end
function TOOL:LeftClick( tr )
-- Find entity that player is looking at.
return self:SelectEntity( tr.Entity, tr.PhysicsBone )
end
function TOOL:RightClick( tr )
-- Select Self.
return self:SelectEntity( self:GetOwner(), 0 )
end
function TOOL:BuildCPanel()
local function UpdateBone()
local panel = controlpanel.Get( "adv_bone" )
local data = { ent = panel.ent,
bone = panel.combo_bonelist:GetValue(),
ang = Angle( panel.slider_ang_pitch:GetValue(), panel.slider_ang_yaw:GetValue(), panel.slider_ang_roll:GetValue() ),
pos = Vector( panel.slider_pos_x:GetValue(), panel.slider_pos_y:GetValue(), panel.slider_pos_z:GetValue() ),
scale = Vector( panel.slider_scale_x:GetValue(), panel.slider_scale_y:GetValue(), panel.slider_scale_z:GetValue() ) }
net.Start( "UpdateAdvBoneSettings" )
net.WriteTable( data )
net.SendToServer()
end
self.combo_bonelist = self:AddControl( "ComboBox", { Label = "#tool.adv_bone.bone" } )
self.combo_bonelist:SetValue( "" )
self.combo_bonelist.ChooseOption = function( pnl, val )
pnl:SetValue( val )
local bone = 0
local ent = LocalPlayer():GetNWEntity( "AdvBoneEntity" )
for i = 0, ent:GetBoneCount() - 1 do
local name = ent:GetBoneName( i )
if ( name == val ) then
bone = i
end
end
UpdateAdvBoneMenu( ent, bone )
end
--Angles
self:AddControl( "Header", { Description = "#tool.adv_bone.editangles" } )
self.slider_ang_pitch = self:AddControl( "Slider", { Label = "#tool.adv_bone.pitch", Type = "Float", Min = -180, Max = 180 } )
self.slider_ang_pitch:SetValue( 0 )
self.slider_ang_pitch.OnValueChanged = function() UpdateBone() end
self.slider_ang_yaw = self:AddControl( "Slider", { Label = "#tool.adv_bone.yaw", Type = "Float", Min = -180, Max = 180 } )
self.slider_ang_yaw:SetValue( 0 )
self.slider_ang_yaw.OnValueChanged = function() UpdateBone() end
self.slider_ang_roll = self:AddControl( "Slider", { Label = "#tool.adv_bone.roll", Type = "Float", Min = -180, Max = 180 } )
self.slider_ang_roll:SetValue( 0 )
self.slider_ang_roll.OnValueChanged = function() UpdateBone() end
--Position
self:AddControl( "Header", { Description = "#tool.adv_bone.editposition" } )
self.slider_pos_x = self:AddControl( "Slider", { Label = "#tool.adv_bone.x", Type = "Float", Min = -128, Max = 128 } )
self.slider_pos_x:SetValue( 0 )
self.slider_pos_x.OnValueChanged = function() UpdateBone() end
self.slider_pos_y = self:AddControl( "Slider", { Label = "#tool.adv_bone.y", Type = "Float", Min = -128, Max = 128 } )
self.slider_pos_y:SetValue( 0 )
self.slider_pos_y.OnValueChanged = function() UpdateBone() end
self.slider_pos_z = self:AddControl( "Slider", { Label = "#tool.adv_bone.z", Type = "Float", Min = -128, Max = 128 } )
self.slider_pos_z:SetValue( 0 )
self.slider_pos_z.OnValueChanged = function() UpdateBone() end
--Scale
self:AddControl( "Header", { Description = "#tool.adv_bone.editscale" } )
self.slider_scale_x = self:AddControl( "Slider", { Label = "#tool.adv_bone.x", Type = "Float", Min = -20, Max = 20 } )
self.slider_scale_x:SetValue( 0 )
self.slider_scale_x.OnValueChanged = function() UpdateBone() end
self.slider_scale_y = self:AddControl( "Slider", { Label = "#tool.adv_bone.y", Type = "Float", Min = -20, Max = 20 } )
self.slider_scale_y:SetValue( 0 )
self.slider_scale_y.OnValueChanged = function() UpdateBone() end
self.slider_scale_z = self:AddControl( "Slider", { Label = "#tool.adv_bone.z", Type = "Float", Min = -20, Max = 20 } )
self.slider_scale_z:SetValue( 0 )
self.slider_scale_z.OnValueChanged = function() UpdateBone() end
self.button_reset = self:AddControl( "Button", {} )
self.button_reset:SetText( "Reset" )
self.button_reset.DoClick = function()
local panel = controlpanel.Get( "adv_bone" )
panel.slider_ang_pitch:SetValue( 0 )
panel.slider_ang_yaw:SetValue( 0 )
panel.slider_ang_roll:SetValue( 0 )
panel.slider_pos_x:SetValue( 0 )
panel.slider_pos_y:SetValue( 0 )
panel.slider_pos_z:SetValue( 0 )
panel.slider_scale_x:SetValue( 1 )
panel.slider_scale_y:SetValue( 1 )
panel.slider_scale_z:SetValue( 1 )
end
end