rendered paste body
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