TOOL.Category = "Totster" TOOL.Name = "#Advanced Turret" TOOL.Command = nil TOOL.ConfigName = "" TOOL.ClientConVar[ "key" ] = "10" TOOL.ClientConVar[ "delay" ] = "0.05" TOOL.ClientConVar[ "toggle" ] = "0" TOOL.ClientConVar[ "force" ] = "1" TOOL.ClientConVar[ "model" ] = "models/weapons/w_smg1.mdl" TOOL.ClientConVar[ "sound" ] = "0" TOOL.ClientConVar[ "damage" ] = "10" TOOL.ClientConVar[ "spread" ] = "0" TOOL.ClientConVar[ "numbullets" ] = "1" TOOL.ClientConVar[ "automatic" ] = "1" TOOL.ClientConVar[ "tracer" ] = "Tracer" cleanup.Register( "advanced_turrets" ) // Precache these sounds.. Sound( "ambient.electrical_zap_3" ) Sound( "NPC_FloorTurret.Shoot" ) // Add Default Language translation (saves adding it to the txt files) if ( CLIENT ) then language.Add( "Tool_advanced_turret_name", "Advanced Turret" ) language.Add( "Tool_advanced_turret_desc", "This is an Advanced Turret Stool" ) language.Add( "Tool_advanced_turret_0", "Click somewhere to spawn an Advanced Turret. Click on an existing Advanced Turret to change it." ) language.Add( "Tool_advanced_turret_spread", "Bullet Spread" ) language.Add( "Tool_advanced_turret_numbullets", "Bullets per Shot" ) language.Add( "Tool_advanced_turret_force", "Bullet Force" ) language.Add( "Tool_advanced_turret_model", "Advanced Turret Model:" ) language.Add( "Tool_advanced_turret_sound", "Shoot Sound" ) language.Add( "Undone_advanced_turret", "Undone Advanced Turret" ) language.Add( "Cleanup_advanced_turrets", "Advanced Turret" ) language.Add( "Cleaned_advanced_turrets", "Cleaned up all Advanced Turrets" ) language.Add( "SBoxLimit_advanced_turrets", "You've reached the Advanced Turret limit!" ) else if server_settings.Int("sbox_maxadvanced_turrets", -1) == -1 then CreateConVar("sbox_maxadvanced_turrets",3) end end function TOOL:LeftClick( trace, worldweld ) worldweld = worldweld or false if ( trace.Entity && trace.Entity:IsPlayer() ) then return false end // If there's no physics object then we can't constraint it! if ( SERVER && !util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end if (CLIENT) then return true end local ply = self:GetOwner() local key = self:GetClientNumber( "key" ) local delay = self:GetClientNumber( "delay" ) local toggle = self:GetClientNumber( "toggle" ) == 1 local force = self:GetClientNumber( "force" ) local model = self:GetClientInfo( "model" ) local sound = self:GetClientInfo( "sound" ) local tracer = self:GetClientInfo( "tracer" ) local damage = self:GetClientNumber( "damage" ) local spread = self:GetClientNumber( "spread" ) local numbullets = self:GetClientNumber( "numbullets" ) if ( !SinglePlayer() ) then // Clamp stuff in multiplayer.. because people are idiots delay = math.Clamp( delay, 0.05, 3600 ) numbullets = 1 force = math.Clamp( force, 0.01, 100 ) spread = math.Clamp( spread, 0, 1 ) damage = math.Clamp( damage, 0, 500 ) end // We shot an existing advanced_turret - just change its values if ( trace.Entity:IsValid() && trace.Entity:GetClass() == "gmod_adv_turret" && trace.Entity:GetTable().pl == ply ) then trace.Entity:GetTable():SetDamage( damage ) trace.Entity:GetTable():SetDelay( delay ) trace.Entity:GetTable():SetToggle( toggle ) trace.Entity:GetTable():SetNumBullets( numbullets ) trace.Entity:GetTable():SetSpread( spread ) trace.Entity:GetTable():SetForce( force ) trace.Entity:GetTable():SetModel( model ) trace.Entity:GetTable():SetSound( sound ) trace.Entity:GetTable():SetTracer( tracer ) return true end if ( !self:GetSWEP():CheckLimit( "advanced_turrets" ) ) then return false end if ( trace.Entity != NULL && (!trace.Entity:IsWorld() || worldweld) ) then trace.HitPos = trace.HitPos + trace.HitNormal * 2 else trace.HitPos = trace.HitPos + trace.HitNormal * 2 end local advanced_turret = MakeTurret( ply, trace.HitPos, nil, key, delay, toggle, damage, force, sound, numbullets, spread, tracer ) /* local Angle = trace.HitNormal:Angle() Angle:RotateAroundAxis( Angle:Forward(), 90 ) Angle:RotateAroundAxis( Angle:Forward(), 90 ) */ advanced_turret:SetAngles( trace.HitNormal:Angle() ) local weld // Don't weld to world if ( trace.Entity != NULL && (!trace.Entity:IsWorld() || worldweld) ) then weld = constraint.Weld( advanced_turret, trace.Entity, 0, trace.PhysicsBone, 0, 0, true ) // Don't hit your parents or you will go to jail. advanced_turret:GetPhysicsObject():EnableCollisions( false ) advanced_turret:GetTable().nocollide = true end undo.Create("Advanced Turret") undo.AddEntity( advanced_turret ) undo.AddEntity( weld ) undo.SetPlayer( ply ) undo.Finish() return true end function TOOL:RightClick( trace ) return self:LeftClick( trace, true ) end if (SERVER) then function MakeTurret( ply, Pos, Ang, key, delay, toggle, damage, force, model, sound, numbullets, spread, tracer, Vel, aVel, frozen, nocollide ) if ( !ply:CheckLimit( "advanced_turrets" ) ) then return nil end local advanced_turret = ents.Create( "gmod_adv_turret" ) if (!advanced_turret:IsValid()) then return false end advanced_turret:SetPos( Pos ) if ( Ang ) then advanced_turret:SetAngles( Ang ) end advanced_turret:Spawn() advanced_turret:GetTable():SetDamage( damage ) advanced_turret:GetTable():SetPlayer( ply ) advanced_turret:GetTable():SetSpread( spread ) advanced_turret:GetTable():SetForce( force ) advanced_turret:GetTable():SetModel( model ) advanced_turret:GetTable():SetSound( sound ) advanced_turret:GetTable():SetTracer( tracer ) advanced_turret:GetTable():SetNumBullets( numbullets ) advanced_turret:GetTable():SetDelay( delay ) advanced_turret:GetTable():SetToggle( toggle ) numpad.OnDown( ply, key, "Advanced_Turret_On", advanced_turret ) numpad.OnUp( ply, key, "Advanced_Turret_Off", advanced_turret ) if ( nocollide == true ) then advanced_turret:GetPhysicsObject():EnableCollisions( false ) end local ttable = { key = key, delay = delay, toggle = toggle, damage = damage, pl = ply, nocollide = nocollide, force = force, model = model, sound = sound, spread = spread, numbullets = numbullets, tracer = tracer } table.Merge( advanced_turret:GetTable(), ttable ) ply:AddCount( "advanced_turrets", advanced_turret ) ply:AddCleanup( "advanced_turrets", advanced_turret ) DoPropSpawnedEffect( advanced_turret ) return advanced_turret end duplicator.RegisterEntityClass( "gmod_adv_turret", MakeTurret, "Pos", "Ang", "key", "delay", "toggle", "damage", "force", "model", "sound", "numbullets", "spread", "tracer", "Vel", "aVel", "frozen", "nocollide" ) end function TOOL:UpdateGhostAdvancedTurret( 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_adv_turret" || trace.Entity:IsPlayer()) then ent:SetNoDraw( true ) return end local Ang = trace.HitNormal:Angle() Ang.pitch = Ang.pitch + 0 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:UpdateGhostAdvancedTurret( self.GhostEntity, self:GetOwner() ) end function TOOL.BuildCPanel( CPanel ) // HEADER CPanel:AddControl( "Header", { Text = "#Tool_advanced_turret_name", Description = "#Tool_advanced_turret_desc" } ) // Presets local params = { Label = "#Presets", MenuButton = 1, Folder = "advanced_turret", Options = {}, CVars = {} } params.Options.default = { advanced_turret_key = 3, advanced_turret_delay = 0.2, advanced_turret_toggle = 1, advanced_turret_force = 1, advanced_turret_model = "models/weapons/w_smg1.mdl", advanced_turret_sound = "pistol", advanced_turret_damage = 10, advanced_turret_spread = 0, advanced_turret_numbullets = 1, } table.insert( params.CVars, "advanced_turret_key" ) table.insert( params.CVars, "advanced_turret_delay" ) table.insert( params.CVars, "advanced_turret_toggle" ) table.insert( params.CVars, "advanced_turret_force" ) table.insert( params.CVars, "advanced_turret_model" ) table.insert( params.CVars, "advanced_turret_sound" ) table.insert( params.CVars, "advanced_turret_damage" ) table.insert( params.CVars, "advanced_turret_spread" ) table.insert( params.CVars, "advanced_turret_numbullets" ) CPanel:AddControl( "ComboBox", params ) // Keypad CPanel:AddControl( "Numpad", { Label = "#Advanced Turret Key", Command = "advanced_turret_key", ButtonSize = 22 } ) // Advanced Turret Models local advturretModel = {Label = "#Tool_advanced_turret_model", MenuButton = 0, Options={}, CVars = {}} advturretModel["Options"]["#SMG1"] = { advanced_turret_model = "models/weapons/w_smg1.mdl" } advturretModel["Options"]["#Physics Gun"] = { advanced_turret_model = "models/weapons/w_physics.mdl" } advturretModel["Options"]["#Crossbow"] = { advanced_turret_model = "models/weapons/W_crossbow.mdl" } CPanel:AddControl("ComboBox", advturretModel ) // Shot sounds local weaponSounds = {Label = "#Tool_advanced_turret_sound", MenuButton = 0, Options={}, CVars = {}} weaponSounds["Options"]["#No Weapon"] = { advanced_turret_sound = "" } weaponSounds["Options"]["#Pistol"] = { advanced_turret_sound = "Weapon_Pistol.Single" } weaponSounds["Options"]["#SMG"] = { advanced_turret_sound = "Weapon_SMG1.Single" } weaponSounds["Options"]["#AR2"] = { advanced_turret_sound = "Weapon_AR2.Single" } weaponSounds["Options"]["#Shotgun"] = { advanced_turret_sound = "Weapon_Shotgun.Single" } weaponSounds["Options"]["#Floor Turret"] = { advanced_turret_sound = "NPC_FloorTurret.Shoot" } weaponSounds["Options"]["#Airboat Heavy"] = { advanced_turret_sound = "Airboat.FireGunHeavy" } weaponSounds["Options"]["#Zap"] = { advanced_turret_sound = "ambient.electrical_zap_3" } CPanel:AddControl("ComboBox", weaponSounds ) // Tracer local TracerType = {Label = "#Tracer", MenuButton = 0, Options={}, CVars = {}} TracerType["Options"]["#Default"] = { advanced_turret_tracer = "Tracer" } TracerType["Options"]["#AR2 Tracer"] = { advanced_turret_tracer = "AR2Tracer" } TracerType["Options"]["#Airboat Tracer"] = { advanced_turret_tracer = "AirboatGunHeavyTracer" } TracerType["Options"]["#Laser"] = { advanced_turret_tracer = "LaserTracer" } CPanel:AddControl("ComboBox", TracerType ) // Various controls that you should play with! if ( SinglePlayer() ) then CPanel:AddControl( "Slider", { Label = "#Tool_advanced_turret_numbullets", Type = "Integer", Min = 1, Max = 10, Command = "advanced_turret_numbullets" } ) end CPanel:AddControl( "Slider", { Label = "#Damage", Type = "Float", Min = 0, Max = 100, Command = "advanced_turret_damage" } ) CPanel:AddControl( "Slider", { Label = "#Tool_advanced_turret_spread", Type = "Float", Min = 0, Max = 1.0, Command = "advanced_turret_spread" } ) CPanel:AddControl( "Slider", { Label = "#Tool_advanced_turret_force", Type = "Float", Min = 0, Max = 500, Command = "advanced_turret_force" } ) // The delay between shots. if ( SinglePlayer() ) then CPanel:AddControl( "Slider", { Label = "#Delay", Type = "Float", Min = 0.01, Max = 1.0, Command = "advanced_turret_delay" } ) else CPanel:AddControl( "Slider", { Label = "#Delay", Type = "Float", Min = 0.05, Max = 1.0, Command = "advanced_turret_delay" } ) end // The toggle switch. CPanel:AddControl( "Checkbox", { Label = "#Toggle", Command = "advanced_turret_toggle" } ) end