wiremod-svn-archive/wire/lua/weapons/gmod_tool/stools/wire_cd_disk.lua

153 lines
4.3 KiB
Lua
Raw Normal View History

TOOL.Category = "Wire - Data"
TOOL.Name = "CD Disk"
TOOL.Command = nil
TOOL.ConfigName = ""
if (CLIENT) then
language.Add("Tool_wire_cd_disk_name", "CD Disk Tool (Wire)")
language.Add("Tool_wire_cd_disk_desc", "Spawns a CD Disk.")
language.Add("Tool_wire_cd_disk_0", "Primary: Create/Update CD Disk, Secondary: Change model")
language.Add("WireDataTransfererTool_cd_disk", "CD Disk:")
language.Add("sboxlimit_wire_cd_disks", "You've hit CD Disks limit!")
language.Add("undone_Wire CD Disk", "Undone Wire CD Disk")
end
if (SERVER) then
CreateConVar('sbox_maxwire_cd_disks', 20)
end
TOOL.ClientConVar["model"] = "models/kobilica/wiremonitorrtbig.mdl"
TOOL.ClientConVar["precision"] = 4
TOOL.ClientConVar["iradius"] = 12
TOOL.FirstSelected = nil
cleanup.Register("wire_cd_disks")
function TOOL:LeftClick(trace)
if (!trace.HitPos) then return false end
if (trace.Entity:IsPlayer()) then return false end
if (CLIENT) then return true end
local ply = self:GetOwner()
if (trace.Entity:IsValid() && trace.Entity:GetClass() == "gmod_wire_cd_disk" && trace.Entity:GetTable().pl == ply) then
trace.Entity.Precision = tonumber(self:GetClientInfo("precision"))
trace.Entity.IRadius = tonumber(self:GetClientInfo("iradius"))
trace.Entity:Setup()
return true
end
if (!self:GetSWEP():CheckLimit("wire_cd_disks")) then return false end
local Ang = trace.HitNormal:Angle()
Ang.pitch = Ang.pitch + 90
local wire_cd_disk = MakeWireCDDisk(ply, trace.HitPos, Ang , self:GetClientInfo("model"))
wire_cd_disk.Precision = tonumber(self:GetClientInfo("precision"))
wire_cd_disk.IRadius = tonumber(self:GetClientInfo("iradius"))
wire_cd_disk:Setup()
local min = wire_cd_disk:OBBMins()
wire_cd_disk:SetPos(trace.HitPos - trace.HitNormal * min.z)
local const = WireLib.Weld(wire_cd_disk, trace.Entity, trace.PhysicsBone, true)
undo.Create("Wire CD Disk")
undo.AddEntity(wire_cd_disk)
undo.AddEntity(const)
undo.SetPlayer(ply)
undo.Finish()
ply:AddCleanup("wire_cd_disks", wire_cd_disk)
ply:AddCleanup("wire_cd_disks", const)
return true
end
function TOOL:RightClick(trace)
if (CLIENT) then return true end
if (trace.Entity and trace.Entity:IsValid()) then
if (trace.Entity:GetClass() == "prop_physics") then
self:GetOwner():ConCommand('wire_cd_disk_model "'..trace.Entity:GetModel()..'"\n')
end
end
return true
end
if (SERVER) then
function MakeWireCDDisk(pl, Pos, Ang, model)
if (!pl:CheckLimit("wire_cd_disks")) then return false end
local wire_cd_disk = ents.Create("gmod_wire_cd_disk")
if (!wire_cd_disk:IsValid()) then return false end
wire_cd_disk:SetAngles(Ang)
wire_cd_disk:SetPos(Pos)
wire_cd_disk:SetModel(model)
wire_cd_disk:Spawn()
wire_cd_disk:SetPlayer(pl)
wire_cd_disk.pl = pl
pl:AddCount("wire_cd_disks", wire_cd_disk)
return wire_cd_disk
end
duplicator.RegisterEntityClass("gmod_wire_cd_disk", MakeWireCDDisk, "Pos", "Ang", "model", "Vel", "aVel", "frozen")
end
function TOOL:UpdateGhostWireCDDisk(ent, player)
if (!ent || !ent:IsValid()) then return end
local tr = utilx.GetPlayerTrace(player, player:GetCursorAimVector())
local trace = util.TraceLine(tr)
if (!trace.Hit || trace.Entity:IsPlayer() || trace.Entity:GetClass() == "gmod_wire_cd_disk") 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.model) then
self:MakeGhostEntity(self:GetClientInfo("model"), Vector(0,0,0), Angle(0,0,0))
end
self:UpdateGhostWireCDDisk(self.GhostEntity, self:GetOwner())
end
function TOOL.BuildCPanel(panel)
panel:AddControl("Header", { Text = "#Tool_wire_cd_disk_name", Description = "#Tool_wire_cd_disk_desc" })
panel:AddControl("Slider", {
Label = "Disk density (inches per block, ipb)",
Type = "Integer",
Min = "1",
Max = "16",
Command = "wire_cd_disk_precision"
})
panel:AddControl("Slider", {
Label = "Inner radius (disk hole radius)",
Type = "Integer",
Min = "1",
Max = "48",
Command = "wire_cd_disk_iradius"
})
end