TOOL.Category = "Wire - Physics" TOOL.Name = "Thruster" TOOL.ConfigName = "" if ( CLIENT ) then language.Add( "Tool_wire_thruster_name", "Thruster Tool (Wire)" ) language.Add( "Tool_wire_thruster_desc", "Spawns a thruster for use with the wire system." ) language.Add( "Tool_wire_thruster_0", "Primary: Create/Update Thruster" ) language.Add( "WireThrusterTool_Model", "Model:" ) language.Add( "WireThrusterTool_OWEffects", "Over water effects:" ) language.Add( "WireThrusterTool_UWEffects", "Under water effects:" ) language.Add( "WireThrusterTool_force", "Force multiplier:" ) language.Add( "WireThrusterTool_force_min", "Force minimum:" ) language.Add( "WireThrusterTool_force_max", "Force maximum:" ) language.Add( "WireThrusterTool_bidir", "Bi-directional:" ) language.Add( "WireThrusterTool_collision", "Collision:" ) language.Add( "WireThrusterTool_sound", "Enable sound:" ) language.Add( "WireThrusterTool_owater", "Works out of water:" ) language.Add( "WireThrusterTool_uwater", "Works under water:" ) language.Add( "sboxlimit_wire_thrusters", "You've hit thrusters limit!" ) language.Add( "undone_wirethruster", "Undone Wire Thruster" ) end if (SERVER) then CreateConVar('sbox_maxwire_thrusters', 10) end TOOL.ClientConVar[ "force" ] = "1500" TOOL.ClientConVar[ "force_min" ] = "0" TOOL.ClientConVar[ "force_max" ] = "10000" TOOL.ClientConVar[ "model" ] = "models/props_c17/lampShade001a.mdl" TOOL.ClientConVar[ "bidir" ] = "1" TOOL.ClientConVar[ "collision" ] = "0" TOOL.ClientConVar[ "sound" ] = "0" TOOL.ClientConVar[ "oweffect" ] = "fire" TOOL.ClientConVar[ "uweffect" ] = "same" TOOL.ClientConVar[ "owater" ] = "1" TOOL.ClientConVar[ "uwater" ] = "1" cleanup.Register( "wire_thrusters" ) function TOOL:LeftClick( trace ) if trace.Entity && trace.Entity:IsPlayer() then return false end if (CLIENT) then return true end local ply = self:GetOwner() local force = self:GetClientNumber( "force" ) local force_min = self:GetClientNumber( "force_min" ) local force_max = self:GetClientNumber( "force_max" ) local model = self:GetClientInfo( "model" ) local bidir = (self:GetClientNumber( "bidir" ) ~= 0) local nocollide = (self:GetClientNumber( "collision" ) == 0) local sound = (self:GetClientNumber( "sound" ) ~= 0) local oweffect = self:GetClientInfo( "oweffect" ) local uweffect = self:GetClientInfo( "uweffect" ) local owater = (self:GetClientNumber( "owater" ) ~= 0) local uwater = (self:GetClientNumber( "uwater" ) ~= 0) if ( !trace.Entity:IsValid() ) then nocollide = false end // If we shot a wire_thruster change its force if ( trace.Entity:IsValid() && trace.Entity:GetClass() == "gmod_wire_thruster" && trace.Entity.pl == ply ) then trace.Entity:SetForce( force ) trace.Entity:SetEffect( effect ) trace.Entity:Setup(force, force_min, force_max, oweffect, uweffect, owater, uwater, bidir, sound) trace.Entity.force = force trace.Entity.force_min = force_min trace.Entity.force_max = force_max trace.Entity.bidir = bidir trace.Entity.sound = sound trace.Entity.oweffect = oweffect trace.Entity.uweffect = uweffect trace.Entity.owater = owater trace.Entity.uwater = uwater trace.Entity.nocollide = nocollide if ( nocollide == true ) then trace.Entity:GetPhysicsObject():EnableCollisions( false ) end return true end if ( !self:GetSWEP():CheckLimit( "wire_thrusters" ) ) then return false end if (not util.IsValidModel(model)) then return false end if (not util.IsValidProp(model)) then return false end // Allow ragdolls to be used? local Ang = trace.HitNormal:Angle() Ang.pitch = Ang.pitch + 90 local wire_thruster = MakeWireThruster( ply, model, Ang, trace.HitPos, force, force_min, force_max, oweffect, uweffect, owater, uwater, bidir, sound, nocollide ) local min = wire_thruster:OBBMins() wire_thruster:SetPos( trace.HitPos - trace.HitNormal * min.z ) local const = WireLib.Weld(wire_thruster, trace.Entity, trace.PhysicsBone, true, nocollide) undo.Create("WireThruster") undo.AddEntity( wire_thruster ) undo.AddEntity( const ) undo.SetPlayer( ply ) undo.Finish() ply:AddCleanup( "wire_thrusters", wire_thruster ) return true end if (SERVER) then function MakeWireThruster( pl, Model, Ang, Pos, force, force_min, force_max, oweffect, uweffect, owater, uwater, bidir, sound, nocollide, Vel, aVel, frozen ) if ( !pl:CheckLimit( "wire_thrusters" ) ) then return false end local wire_thruster = ents.Create( "gmod_wire_thruster" ) if (!wire_thruster:IsValid()) then return false end wire_thruster:SetModel( Model ) wire_thruster:SetAngles( Ang ) wire_thruster:SetPos( Pos ) wire_thruster:Spawn() wire_thruster:Setup(force, force_min, force_max, oweffect, uweffect, owater, uwater, bidir, sound) wire_thruster:SetPlayer( pl ) if ( nocollide == true ) then wire_thruster:GetPhysicsObject():EnableCollisions( false ) end local ttable = { force = force, force_min = force_min, force_max = force_max, bidir = bidir, sound = sound, pl = pl, oweffect = oweffect, uweffect = uweffect, owater = owater, uwater = uwater, nocollide = nocollide } table.Merge(wire_thruster:GetTable(), ttable ) pl:AddCount( "wire_thrusters", wire_thruster ) return wire_thruster end duplicator.RegisterEntityClass("gmod_wire_thruster", MakeWireThruster, "Model", "Ang", "Pos", "force", "force_min", "force_max", "oweffect", "uweffect", "owater", "uwater", "bidir", "sound", "nocollide", "Vel", "aVel", "frozen") end function TOOL:UpdateGhostWireThruster( ent, player ) if ( !ent ) then return end if ( !ent:IsValid() ) then return end local tr = utilx.GetPlayerTrace( player, player:GetCursorAimVector() ) local trace = util.TraceLine( tr ) if (!trace.Hit) then return end if (trace.Entity && trace.Entity:GetClass() == "gmod_wire_thruster" || trace.Entity:IsPlayer()) then ent:SetNoDraw( true ) return end local Ang = trace.HitNormal:Angle() Ang.pitch = Ang.pitch + 90 local min = ent:OBBMins() ent:SetPos( trace.HitPos - trace.HitNormal * min.z ) ent:SetAngles( Ang ) ent:SetNoDraw( false ) end function TOOL:Think() if (!self.GhostEntity || !self.GhostEntity:IsValid() || self.GhostEntity:GetModel() != self:GetClientInfo( "model" )) then self:MakeGhostEntity( self:GetClientInfo( "model" ), Vector(0,0,0), Angle(0,0,0) ) end self:UpdateGhostWireThruster( self.GhostEntity, self:GetOwner() ) end function TOOL.BuildCPanel(panel) panel:AddControl("Header", { Text = "#Tool_wire_thruster_name", Description = "#Tool_wire_thruster_desc" }) panel:AddControl("ComboBox", { Label = "#Presets", MenuButton = "1", Folder = "wire_thruster", Options = { Default = { wire_thruster_force = "20", wire_thruster_model = "models/props_junk/plasticbucket001a.mdl", wire_thruster_effect = "fire", } }, CVars = { [0] = "wire_thruster_model", [1] = "wire_thruster_force", [2] = "wire_thruster_effect" } }) panel:AddControl( "PropSelect", { Label = "#WireThrusterTool_Model", ConVar = "wire_thruster_model", Category = "Thrusters", Models = list.Get( "ThrusterModels" ) }) panel:AddControl("ComboBox", { Label = "#WireThrusterTool_OWEffects", MenuButton = "0", Options = { ["#No_Effects"] = { wire_thruster_oweffect = "none" }, ["#Flames"] = { wire_thruster_oweffect = "fire" }, ["#Plasma"] = { wire_thruster_oweffect = "plasma" }, ["#Smoke"] = { wire_thruster_oweffect = "smoke" }, ["#Smoke Random"] = { wire_thruster_oweffect = "smoke_random" }, ["#Smoke Do it Youself"] = { wire_thruster_oweffect = "smoke_diy" }, ["#Rings"] = { wire_thruster_oweffect = "rings" }, ["#Rings Growing"] = { wire_thruster_oweffect = "rings_grow" }, ["#Rings Shrinking"] = { wire_thruster_oweffect = "rings_shrink" }, ["#Bubbles"] = { wire_thruster_oweffect = "bubble" }, ["#Magic"] = { wire_thruster_oweffect = "magic" }, ["#Magic Random"] = { wire_thruster_oweffect = "magic_color" }, ["#Magic Do It Yourself"] = { wire_thruster_oweffect = "magic_diy" }, ["#Colors"] = { wire_thruster_oweffect = "color" }, ["#Colors Random"] = { wire_thruster_oweffect = "color_random" }, ["#Colors Do It Yourself"] = { wire_thruster_oweffect = "color_diy" }, ["#Blood"] = { wire_thruster_oweffect = "blood" }, ["#Money"] = { wire_thruster_oweffect = "money" }, ["#Sperms"] = { wire_thruster_oweffect = "sperm" }, ["#Feathers"] = { wire_thruster_oweffect = "feather" }, ["#Candy Cane"] = { wire_thruster_oweffect = "candy_cane" }, ["#Goldstar"] = { wire_thruster_oweffect = "goldstar" }, ["#Water Small"] = { wire_thruster_oweffect = "water_small" }, ["#Water Medium"] = { wire_thruster_oweffect = "water_medium" }, ["#Water Big"] = { wire_thruster_oweffect = "water_big" }, ["#Water Huge"] = { wire_thruster_oweffect = "water_huge" }, ["#Striderblood Small"] = { wire_thruster_oweffect = "striderblood_small" }, ["#Striderblood Medium"] = { wire_thruster_oweffect = "striderblood_medium" }, ["#Striderblood Big"] = { wire_thruster_oweffect = "striderblood_big" }, ["#Striderblood Huge"] = { wire_thruster_oweffect = "striderblood_huge" }, ["#More Sparks"] = { wire_thruster_oweffect = "more_sparks" }, ["#Spark Fountain"] = { wire_thruster_oweffect = "spark_fountain" }, ["#Jetflame"] = { wire_thruster_oweffect = "jetflame" }, ["#Jetflame Advanced"] = { wire_thruster_oweffect = "jetflame_advanced" }, ["#Jetflame Blue"] = { wire_thruster_oweffect = "jetflame_blue" }, ["#Jetflame Red"] = { wire_thruster_oweffect = "jetflame_red" }, ["#Jetflame Purple"] = { wire_thruster_oweffect = "jetflame_purple" }, ["#Comic Balls"] = { wire_thruster_oweffect = "balls" }, ["#Comic Balls Random"] = { wire_thruster_oweffect = "balls_random" }, ["#Comic Balls Fire Colors"] = { wire_thruster_oweffect = "balls_firecolors" }, ["#Souls"] = { wire_thruster_oweffect = "souls" }, ["#Debugger 10 Seconds"] = { wire_thruster_oweffect = "debug_10" }, ["#Debugger 30 Seconds"] = { wire_thruster_oweffect = "debug_30" }, ["#Debugger 60 Seconds"] = { wire_thruster_oweffect = "debug_60" }, ["#Fire and Smoke"] = { wire_thruster_oweffect = "fire_smoke" }, ["#Fire and Smoke Huge"] = { wire_thruster_oweffect = "fire_smoke_big" }, ["#5 Growing Rings"] = { wire_thruster_oweffect = "rings_grow_rings" }, ["#Color and Magic"] = { wire_thruster_oweffect = "color_magic" }, } }) panel:AddControl("ComboBox", { Label = "#WireThrusterTool_UWEffects", MenuButton = "0", Options = { ["#No_Effects"] = { wire_thruster_uweffect = "none" }, ["#Same as over water"] = { wire_thruster_uweffect = "same" }, ["#Flames"] = { wire_thruster_uweffect = "fire" }, ["#Plasma"] = { wire_thruster_uweffect = "plasma" }, ["#Smoke"] = { wire_thruster_uweffect = "smoke" }, ["#Smoke Random"] = { wire_thruster_uweffect = "smoke_random" }, ["#Smoke Do it Youself"] = { wire_thruster_uweffect = "smoke_diy" }, ["#Rings"] = { wire_thruster_uweffect = "rings" }, ["#Rings Growing"] = { wire_thruster_uweffect = "rings_grow" }, ["#Rings Shrinking"] = { wire_thruster_uweffect = "rings_shrink" }, ["#Bubbles"] = { wire_thruster_uweffect = "bubble" }, ["#Magic"] = { wire_thruster_uweffect = "magic" }, ["#Magic Random"] = { wire_thruster_uweffect = "magic_color" }, ["#Magic Do It Yourself"] = { wire_thruster_uweffect = "magic_diy" }, ["#Colors"] = { wire_thruster_uweffect = "color" }, ["#Colors Random"] = { wire_thruster_uweffect = "color_random" }, ["#Colors Do It Yourself"] = { wire_thruster_uweffect = "color_diy" }, ["#Blood"] = { wire_thruster_uweffect = "blood" }, ["#Money"] = { wire_thruster_uweffect = "money" }, ["#Sperms"] = { wire_thruster_uweffect = "sperm" }, ["#Feathers"] = { wire_thruster_uweffect = "feather" }, ["#Candy Cane"] = { wire_thruster_uweffect = "candy_cane" }, ["#Goldstar"] = { wire_thruster_uweffect = "goldstar" }, ["#Water Small"] = { wire_thruster_uweffect = "water_small" }, ["#Water Medium"] = { wire_thruster_uweffect = "water_medium" }, ["#Water Big"] = { wire_thruster_uweffect = "water_big" }, ["#Water Huge"] = { wire_thruster_uweffect = "water_huge" }, ["#Striderblood Small"] = { wire_thruster_uweffect = "striderblood_small" }, ["#Striderblood Medium"] = { wire_thruster_uweffect = "striderblood_medium" }, ["#Striderblood Big"] = { wire_thruster_uweffect = "striderblood_big" }, ["#Striderblood Huge"] = { wire_thruster_uweffect = "striderblood_huge" }, ["#More Sparks"] = { wire_thruster_uweffect = "more_sparks" }, ["#Spark Fountain"] = { wire_thruster_uweffect = "spark_fountain" }, ["#Jetflame"] = { wire_thruster_uweffect = "jetflame" }, ["#Jetflame Advanced"] = { wire_thruster_uweffect = "jetflame_advanced" }, ["#Jetflame Blue"] = { wire_thruster_uweffect = "jetflame_blue" }, ["#Jetflame Red"] = { wire_thruster_uweffect = "jetflame_red" }, ["#Jetflame Purple"] = { wire_thruster_uweffect = "jetflame_purple" }, ["#Comic Balls"] = { wire_thruster_uweffect = "balls" }, ["#Comic Balls Random"] = { wire_thruster_uweffect = "balls_random" }, ["#Comic Balls Fire Colors"] = { wire_thruster_uweffect = "balls_firecolors" }, ["#Souls"] = { wire_thruster_uweffect = "souls" }, ["#Debugger 10 Seconds"] = { wire_thruster_uweffect = "debug_10" }, ["#Debugger 30 Seconds"] = { wire_thruster_uweffect = "debug_30" }, ["#Debugger 60 Seconds"] = { wire_thruster_uweffect = "debug_60" }, ["#Fire and Smoke"] = { wire_thruster_uweffect = "fire_smoke" }, ["#Fire and Smoke Huge"] = { wire_thruster_uweffect = "fire_smoke_big" }, ["#5 Growing Rings"] = { wire_thruster_uweffect = "rings_grow_rings" }, ["#Color and Magic"] = { wire_thruster_uweffect = "color_magic" }, } }) panel:AddControl("Slider", { Label = "#WireThrusterTool_force", Type = "Float", Min = "1", Max = "10000", Command = "wire_thruster_force" }) panel:AddControl("Slider", { Label = "#WireThrusterTool_force_min", Type = "Float", Min = "-10000", Max = "10000", Command = "wire_thruster_force_min" }) panel:AddControl("Slider", { Label = "#WireThrusterTool_force_max", Type = "Float", Min = "-10000", Max = "10000", Command = "wire_thruster_force_max" }) panel:AddControl("CheckBox", { Label = "#WireThrusterTool_bidir", Command = "wire_thruster_bidir" }) panel:AddControl("CheckBox", { Label = "#WireThrusterTool_collision", Command = "wire_thruster_collision" }) panel:AddControl("CheckBox", { Label = "#WireThrusterTool_sound", Command = "wire_thruster_sound" }) panel:AddControl("CheckBox", { Label = "#WireThrusterTool_owater", Command = "wire_thruster_owater" }) panel:AddControl("CheckBox", { Label = "#WireThrusterTool_uwater", Command = "wire_thruster_uwater" }) end //from model pack 1 --TODO: update model pack system to use list system list.Set( "ThrusterModels", "models/jaanus/thruster_flat.mdl", {} )