244 lines
8.3 KiB
Lua
244 lines
8.3 KiB
Lua
WireToolSetup.setCategory( "Physics/Force" )
|
|
WireToolSetup.open( "vthruster", "Vector Thruster", "gmod_wire_vectorthruster", nil, "Vector Thrusters" )
|
|
|
|
if ( CLIENT ) then
|
|
language.Add( "Tool.wire_vthruster.name", "Vector Thruster Tool (Wire)" )
|
|
language.Add( "Tool.wire_vthruster.desc", "Spawns a vector thruster for use with the wire system." )
|
|
language.Add( "WireVThrusterTool_Mode", "Mode:" )
|
|
language.Add( "WireVThrusterTool_Angle", "Use Yaw/Pitch Inputs Instead" )
|
|
language.Add( "WireVThrusterTool_LengthIsMul", "Use Vector Length for Mul" )
|
|
|
|
TOOL.Information = {
|
|
{ name = "left_0", stage = 0, text = "Create/Update " .. TOOL.Name },
|
|
{ name = "left_1", stage = 1, text = "Set the Angle, hold Shift to lock to 45 degrees" },
|
|
}
|
|
end
|
|
WireToolSetup.BaseLang()
|
|
WireToolSetup.SetupMax( 10 )
|
|
|
|
TOOL.ClientConVar[ "force" ] = "1500"
|
|
TOOL.ClientConVar[ "force_min" ] = "0"
|
|
TOOL.ClientConVar[ "force_max" ] = "10000"
|
|
TOOL.ClientConVar[ "model" ] = "models/jaanus/wiretool/wiretool_speed.mdl"
|
|
TOOL.ClientConVar[ "bidir" ] = "1"
|
|
TOOL.ClientConVar[ "soundname" ] = ""
|
|
TOOL.ClientConVar[ "oweffect" ] = "fire"
|
|
TOOL.ClientConVar[ "uweffect" ] = "same"
|
|
TOOL.ClientConVar[ "owater" ] = "1"
|
|
TOOL.ClientConVar[ "uwater" ] = "1"
|
|
TOOL.ClientConVar[ "mode" ] = "0"
|
|
TOOL.ClientConVar[ "angleinputs" ] = "0"
|
|
TOOL.ClientConVar[ "lengthismul" ] = "0"
|
|
|
|
if SERVER then
|
|
function TOOL:GetConVars()
|
|
return self:GetClientNumber( "force" ), self:GetClientNumber( "force_min" ), self:GetClientNumber( "force_max" ), self:GetClientInfo( "oweffect" ),
|
|
self:GetClientInfo( "uweffect" ), self:GetClientNumber( "owater" ) ~= 0, self:GetClientNumber( "uwater" ) ~= 0, self:GetClientNumber( "bidir" ) ~= 0,
|
|
self:GetClientInfo( "soundname" ), self:GetClientNumber( "mode" ), self:GetClientNumber( "angleinputs" ) ~= 0, self:GetClientNumber( "lengthismul" ) ~= 0
|
|
end
|
|
end
|
|
|
|
function TOOL:LeftClick( trace )
|
|
local numobj = self:NumObjects()
|
|
|
|
local ply = self:GetOwner()
|
|
|
|
if (numobj == 0) then
|
|
if IsValid(trace.Entity) and trace.Entity:IsPlayer() then return false end
|
|
|
|
-- If there's no physics object then we can't constraint it!
|
|
if ( SERVER and not util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end
|
|
if (CLIENT) then return true end
|
|
|
|
local ent = WireToolObj.LeftClick_Make(self, trace, ply )
|
|
if isbool(ent) then return ent end
|
|
if IsValid(ent) then
|
|
ent:GetPhysicsObject():EnableMotion( false )
|
|
self:ReleaseGhostEntity()
|
|
|
|
self:SetObject(1, trace.Entity, trace.HitPos, trace.Entity:GetPhysicsObjectNum(trace.PhysicsBone), trace.PhysicsBone, trace.HitNormal)
|
|
self:SetObject(2, ent, trace.HitPos, ent:GetPhysicsObject(), 0, trace.HitNormal)
|
|
self:SetStage(1)
|
|
end
|
|
else
|
|
if (CLIENT) then return true end
|
|
|
|
local anchor, wire_thruster = self:GetEnt(1), self:GetEnt(2)
|
|
local anchorbone = self:GetBone(1)
|
|
|
|
local const = WireLib.Weld(wire_thruster, anchor, anchorbone, true, false)
|
|
|
|
local Phys = wire_thruster:GetPhysicsObject()
|
|
Phys:EnableMotion( true )
|
|
|
|
undo.Create("WireVThruster")
|
|
undo.AddEntity( wire_thruster )
|
|
undo.AddEntity( const )
|
|
undo.SetPlayer( ply )
|
|
undo.Finish()
|
|
|
|
ply:AddCleanup( "wire_vthrusters", wire_thruster )
|
|
ply:AddCleanup( "wire_vthrusters", const )
|
|
|
|
self:ClearObjects()
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
local degrees = 0
|
|
|
|
function TOOL:Think()
|
|
if (self:NumObjects() > 0) then
|
|
if ( SERVER ) then
|
|
local Phys2 = self:GetPhys(2)
|
|
local Norm2 = self:GetNormal(2)
|
|
local cmd = self:GetOwner():GetCurrentCommand()
|
|
degrees = degrees + cmd:GetMouseX() * 0.05
|
|
local ra = degrees
|
|
if (self:GetOwner():KeyDown(IN_SPEED)) then ra = math.Round(ra/45)*45 end
|
|
local Ang = Norm2:Angle()
|
|
Ang.pitch = Ang.pitch + 90
|
|
Ang:RotateAroundAxis(Norm2, ra)
|
|
Phys2:SetAngles( Ang )
|
|
Phys2:Wake()
|
|
end
|
|
else
|
|
WireToolObj.Think(self) -- Basic ghost
|
|
end
|
|
end
|
|
|
|
if (CLIENT) then
|
|
function TOOL:FreezeMovement()
|
|
return self:GetStage() == 1
|
|
end
|
|
end
|
|
|
|
function TOOL:Holster()
|
|
if self:NumObjects() > 0 and IsValid(self:GetEnt(2)) then
|
|
self:GetEnt(2):Remove()
|
|
end
|
|
self:ClearObjects()
|
|
end
|
|
|
|
function TOOL.BuildCPanel(panel)
|
|
WireToolHelpers.MakePresetControl(panel, "wire_vthruster")
|
|
WireDermaExts.ModelSelect(panel, "wire_vthruster_model", list.Get( "ThrusterModels" ), 4, true)
|
|
|
|
local Effects = {
|
|
["#No Effects"] = "none",
|
|
--["#Same as over water"] = "same",
|
|
["#Flames"] = "fire",
|
|
["#Plasma"] = "plasma",
|
|
["#Smoke"] = "smoke",
|
|
["#Smoke Random"] = "smoke_random",
|
|
["#Smoke Do it Youself"] = "smoke_diy",
|
|
["#Rings"] = "rings",
|
|
["#Rings Growing"] = "rings_grow",
|
|
["#Rings Shrinking"] = "rings_shrink",
|
|
["#Bubbles"] = "bubble",
|
|
["#Magic"] = "magic",
|
|
["#Magic Random"] = "magic_color",
|
|
["#Magic Do It Yourself"] = "magic_diy",
|
|
["#Colors"] = "color",
|
|
["#Colors Random"] = "color_random",
|
|
["#Colors Do It Yourself"] = "color_diy",
|
|
["#Blood"] = "blood",
|
|
["#Money"] = "money",
|
|
["#Sperms"] = "sperm",
|
|
["#Feathers"] = "feather",
|
|
["#Candy Cane"] = "candy_cane",
|
|
["#Goldstar"] = "goldstar",
|
|
["#Water Small"] = "water_small",
|
|
["#Water Medium"] = "water_medium",
|
|
["#Water Big"] = "water_big",
|
|
["#Water Huge"] = "water_huge",
|
|
["#Striderblood Small"] = "striderblood_small",
|
|
["#Striderblood Medium"] = "striderblood_medium",
|
|
["#Striderblood Big"] = "striderblood_big",
|
|
["#Striderblood Huge"] = "striderblood_huge",
|
|
["#More Sparks"] = "more_sparks",
|
|
["#Spark Fountain"] = "spark_fountain",
|
|
["#Jetflame"] = "jetflame",
|
|
["#Jetflame Blue"] = "jetflame_blue",
|
|
["#Jetflame Red"] = "jetflame_red",
|
|
["#Jetflame Purple"] = "jetflame_purple",
|
|
["#Comic Balls"] = "balls",
|
|
["#Comic Balls Random"] = "balls_random",
|
|
["#Comic Balls Fire Colors"] = "balls_firecolors",
|
|
["#Souls"] = "souls",
|
|
--["#Debugger 10 Seconds"] = "debug_10", These are just buggy and shouldn't be used.
|
|
--["#Debugger 30 Seconds"] = "debug_30",
|
|
--["#Debugger 60 Seconds"] = "debug_60",
|
|
["#Fire and Smoke"] = "fire_smoke",
|
|
["#Fire and Smoke Huge"] = "fire_smoke_big",
|
|
["#5 Growing Rings"] = "rings_grow_rings",
|
|
["#Color and Magic"] = "color_magic",
|
|
}
|
|
|
|
local CateGoryOW = vgui.Create("DCollapsibleCategory")
|
|
CateGoryOW:SetSize(0, 50)
|
|
CateGoryOW:SetExpanded(0)
|
|
CateGoryOW:SetLabel("Overwater Effect List")
|
|
|
|
local ctrl = vgui.Create( "MatSelect", CateGoryOW )
|
|
ctrl:SetItemWidth( 128 )
|
|
ctrl:SetItemHeight( 128 )
|
|
ctrl:SetConVar("wire_vthruster_oweffect")
|
|
for name, mat in pairs( Effects ) do
|
|
ctrl:AddMaterialEx( name, "gui/thrustereffects/"..mat, mat, {wire_vthruster_oweffect = mat} )
|
|
end
|
|
|
|
CateGoryOW:SetContents( ctrl )
|
|
|
|
panel:AddItem(CateGoryOW)
|
|
|
|
Effects["#Same as over water"] = "same"
|
|
|
|
local CateGoryUW = vgui.Create("DCollapsibleCategory")
|
|
CateGoryUW:SetSize(0, 50)
|
|
CateGoryUW:SetExpanded(0)
|
|
CateGoryUW:SetLabel("Underwater Effect List")
|
|
|
|
local ctrlUW = vgui.Create( "MatSelect", CateGoryUW )
|
|
ctrlUW:SetItemWidth( 128 )
|
|
ctrlUW:SetItemHeight( 128 )
|
|
ctrlUW:SetConVar("wire_vthruster_uweffect")
|
|
for name, mat in pairs( Effects ) do
|
|
ctrlUW:AddMaterialEx( name, "gui/thrustereffects/"..mat, mat, {wire_vthruster_uweffect = mat} )
|
|
end
|
|
|
|
CateGoryUW:SetContents( ctrlUW )
|
|
|
|
panel:AddItem(CateGoryUW)
|
|
|
|
local lst = {}
|
|
for k,v in pairs( list.Get("ThrusterSounds") ) do
|
|
lst[k] = {}
|
|
for k2,v2 in pairs( v ) do
|
|
lst[k]["wire_v"..k2] = v2
|
|
end
|
|
end
|
|
panel:AddControl( "ListBox", { Label = "#Thruster_Sounds", Options = lst } )
|
|
|
|
panel:NumSlider("#WireThrusterTool_force", "wire_vthruster_force", 1, 10000, 2 )
|
|
panel:NumSlider("#WireThrusterTool_force_min", "wire_vthruster_force_min", -10000, 10000, 2 ):SetTooltip("#WireThrusterTool_force_min.help")
|
|
panel:NumSlider("#WireThrusterTool_force_max", "wire_vthruster_force_max", -10000, 10000, 2 )
|
|
panel:CheckBox("#WireThrusterTool_bidir", "wire_vthruster_bidir")
|
|
panel:CheckBox("#WireThrusterTool_owater", "wire_vthruster_owater")
|
|
panel:CheckBox("#WireThrusterTool_uwater", "wire_vthruster_uwater")
|
|
|
|
panel:AddControl("ListBox", {
|
|
Label = "#WireVThrusterTool_Mode",
|
|
Options = {
|
|
["#XYZ Local"] = { wire_vthruster_mode = "0" },
|
|
["#XYZ World"] = { wire_vthruster_mode = "1" },
|
|
["#XY Local, Z World"] = { wire_vthruster_mode = "2" },
|
|
}
|
|
})
|
|
|
|
panel:CheckBox("#WireVThrusterTool_Angle", "wire_vthruster_angleinputs")
|
|
panel:CheckBox("#WireVThrusterTool_LengthIsMul", "wire_vthruster_lengthismul")
|
|
end
|
|
|
|
list.Set( "ThrusterModels", "models/jaanus/wiretool/wiretool_speed.mdl", {} )
|