Files
wnsrc/gamemodes/sandbox/entities/weapons/gmod_tool/stools/inflator.lua

158 lines
3.7 KiB
Lua
Raw Normal View History

2024-08-04 23:12:27 +03:00
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
TOOL.Category = "Poser"
TOOL.Name = "#tool.inflator.name"
TOOL.LeftClickAutomatic = true
TOOL.RightClickAutomatic = true
TOOL.RequiresTraceHit = true
TOOL.Information = {
{ name = "left" },
{ name = "right" },
{ name = "reload" }
}
local ScaleYZ = {
"ValveBiped.Bip01_L_UpperArm",
"ValveBiped.Bip01_L_Forearm",
"ValveBiped.Bip01_L_Thigh",
"ValveBiped.Bip01_L_Calf",
"ValveBiped.Bip01_R_UpperArm",
"ValveBiped.Bip01_R_Forearm",
"ValveBiped.Bip01_R_Thigh",
"ValveBiped.Bip01_R_Calf",
"ValveBiped.Bip01_Spine2",
"ValveBiped.Bip01_Spine1",
"ValveBiped.Bip01_Spine",
"ValveBiped.Bip01_Spinebut",
-- Vortigaunt
"ValveBiped.spine4",
"ValveBiped.spine3",
"ValveBiped.spine2",
"ValveBiped.spine1",
"ValveBiped.hlp_ulna_R",
"ValveBiped.hlp_ulna_L",
"ValveBiped.arm1_L",
"ValveBiped.arm1_R",
"ValveBiped.arm2_L",
"ValveBiped.arm2_R",
"ValveBiped.leg_bone1_L",
"ValveBiped.leg_bone1_R",
"ValveBiped.leg_bone2_L",
"ValveBiped.leg_bone2_R",
"ValveBiped.leg_bone3_L",
"ValveBiped.leg_bone3_R",
-- Team Fortress 2
"bip_knee_L",
"bip_knee_R",
"bip_hip_R",
"bip_hip_L",
}
local ScaleXZ = {
"ValveBiped.Bip01_pelvis",
-- Team Fortress 2
"bip_upperArm_L",
"bip_upperArm_R",
"bip_lowerArm_L",
"bip_lowerArm_R",
"bip_forearm_L",
"bip_forearm_R",
}
local function GetNiceBoneScale( name, scale )
if ( table.HasValue( ScaleYZ, name ) or string.find( name:lower(), "leg" ) or string.find( name:lower(), "arm" ) ) then
return Vector( 0, scale, scale )
end
if ( table.HasValue( ScaleXZ, name ) ) then
return Vector( scale, 0, scale )
end
return Vector( scale, scale, scale )
end
--Scale the specified bone by Scale
local function ScaleBone( ent, bone, scale )
if ( !bone or CLIENT ) then return false end
local physBone = ent:TranslateBoneToPhysBone( bone )
for i = 0, ent:GetBoneCount() do
if ( ent:TranslateBoneToPhysBone( i ) != physBone ) then continue end
-- Some bones are scaled only in certain directions (like legs don't scale on length)
local v = GetNiceBoneScale( ent:GetBoneName( i ), scale ) * 0.1
local TargetScale = ent:GetManipulateBoneScale( i ) + v * 0.1
if ( TargetScale.x < 0 ) then TargetScale.x = 0 end
if ( TargetScale.y < 0 ) then TargetScale.y = 0 end
if ( TargetScale.z < 0 ) then TargetScale.z = 0 end
ent:ManipulateBoneScale( i, TargetScale )
end
end
--Scale UP
function TOOL:LeftClick( trace, scale )
if ( !IsValid( trace.Entity ) ) then return false end
if ( !trace.Entity:IsNPC() and trace.Entity:GetClass() != "prop_ragdoll" /*&& !trace.Entity:IsPlayer()*/ ) then return false end
local bone = trace.Entity:TranslatePhysBoneToBone( trace.PhysicsBone )
ScaleBone( trace.Entity, bone, scale or 1 )
self:GetWeapon():SetNextPrimaryFire( CurTime() + 0.01 )
local effectdata = EffectData()
effectdata:SetOrigin( trace.HitPos )
util.Effect( "inflator_magic", effectdata )
return false
end
-- Scale DOWN
function TOOL:RightClick( trace )
return self:LeftClick( trace, -1 )
end
-- Reset scaling
function TOOL:Reload( trace )
if ( !IsValid( trace.Entity ) ) then return false end
if ( !trace.Entity:IsNPC() and trace.Entity:GetClass() != "prop_ragdoll" /*&& !trace.Entity:IsPlayer()*/ ) then return false end
if ( CLIENT ) then return true end
for i = 0, trace.Entity:GetBoneCount() do
trace.Entity:ManipulateBoneScale( i, Vector( 1, 1, 1 ) )
end
return true
end
function TOOL.BuildCPanel( CPanel )
CPanel:AddControl( "Header", { Description = "#tool.inflator.desc" } )
end