Skip to content

Instantly share code, notes, and snippets.

@NanoAi
Last active March 26, 2018 06:45
Show Gist options
  • Save NanoAi/29c88aaa206a6fd4ef8e9f1a1145216d to your computer and use it in GitHub Desktop.
Save NanoAi/29c88aaa206a6fd4ef8e9f1a1145216d to your computer and use it in GitHub Desktop.
rrrrrrrrrreeeeeeeeeeeeee
local TOOL = _G.TOOL -- Luadev makes this need to be _G.TOOL otherwise I'd use TOOL.
local liveLoad = false
local gmodTool = {}
if not TOOL then -- If the TOOL variable is not found settup a new variable.
gmodTool = weapons.Get("gmod_tool")
TOOL = getmetatable(gmodTool.Tool.weld):Create()
TOOL.Mode = "mapdefine"
liveLoad = true -- If the TOOL variable does not exist that means we are live loading.
end
if CLIENT then
language.Add( "tool.mapdefine.name", "MapDefine" )
language.Add( "tool.mapdefine.desc", "Create custom trigger areas on the map" )
language.Add( "tool.mapdefine.left0", "Select Mins (Bottom Corner)" )
language.Add( "tool.mapdefine.left1", "Select Maxs (Top Corner)" )
language.Add( "tool.mapdefine.left2", "Nudge Mins" )
language.Add( "tool.mapdefine.right2", "Nudge Maxs" )
language.Add( "tool.mapdefine.reload0", "Clear Target Trigger" )
language.Add( "tool.mapdefine.reload0_use", "Clear All Triggers" )
language.Add( "tool.mapdefine.reload2", "Create Trigger" )
language.Add( "tool.mapdefine.reload2_use", "Clear Selection" )
end
TOOL.Category = "Administration"
TOOL.Name = "#tool.mapdefine.name"
TOOL.Information = {
{ name = "left0", stage = 0 },
{ name = "left1", stage = 1 },
{ name = "left2", stage = 2 },
{ name = "right0", stage = 0 },
{ name = "right2", stage = 2 },
{ name = "reload0", stage = 0 },
{ name = "reload2", stage = 2 },
{ name = "reload0_use", stage = 0, icon2 = "gui/e.png" },
{ name = "reload2_use", stage = 1, icon2 = "gui/e.png" },
{ name = "reload2_use", stage = 2, icon2 = "gui/e.png" },
}
TOOL.Settings = {}
TOOL.ClientConVar = {
["hitdistance"] = 0,
["name"] = "",
["allowgoto"] = 1,
["forcespawn"] = 0,
["nodie"] = 0,
["strip"] = 0,
["npclose"] = 0,
["nojump"] = 0,
["nocrouch"] = 0,
["noreapply"] = 0,
["noreenter"] = 0,
["noprops"] = 0,
["damage"] = 0,
["damage_amount"] = 0,
["damage_type"] = 0,
["heal"] = 0,
["heal_amount"] = 0,
["gravity"] = 0,
["gravity_amount"] = 0,
["groups"] = 0,
["filter"] = 0
}
if CLIENT then
function TOOL:DrawHUD()
if not self.Settings.min then return end
local trace = LocalPlayer():GetEyeTrace()
local hitPos = trace.HitPos
cam.Start3D()
render.SetColorMaterial()
MapDefine:Draw(4, self.Settings.min, self.Settings.max or hitPos, Color(255,150,0,200))
cam.End3D()
end
function TOOL:BuildCPanel( panel )
local desc = panel:Help( "#tool.mapdefine.desc" )
desc:SetSize( 200, 50 )
panel:TextEntry( "Area Name", "mapdefine_name" )
panel:CheckBox( "Allow Goto", "mapdefine_allowgoto" )
panel:CheckBox( "Force Spawn Area", "mapdefine_forcespawn" )
panel:CheckBox( "Prevent Death", "mapdefine_nodie" )
panel:CheckBox( "Disable Weapons", "mapdefine_strip" )
panel:CheckBox( "NPCs Lose Target", "mapdefine_npclose" )
panel:CheckBox( "Prevent Crouching", "mapdefine_nocrouch" )
panel:CheckBox( "Prevent Jumping", "mapdefine_nojump" )
panel:CheckBox( "Prevent Reapply", "mapdefine_noreapply" )
panel:CheckBox( "Prevent Reenter", "mapdefine_noreenter" )
panel:CheckBox( "Prevent Props/Entities", "mapdefine_noprops" )
panel:CheckBox( "Damage Players", "mapdefine_damage" )
panel:NumSlider( "Damage Amount", "mapdefine_damage_amount", 0, 100, 0)
panel:ListBox( "Damage Type" )
panel:CheckBox( "Heal Players", "mapdefine_heal" )
panel:NumSlider( "Heal Amount", "mapdefine_heal_amount", 0, 100, 0)
panel:CheckBox( "Modify Gravity", "mapdefine_gravity" )
panel:NumSlider( "Gravity Amount", "mapdefine_gravity_amount", -600, 600, 0)
panel:CheckBox( "Limit To Groups", "mapdefine_groups" )
-- Groups Selector Here
panel:CheckBox( "Enable Filter", "mapdefine_filter" )
-- Filter Options Here
end
end
local function CanTool(o)
return o.IsAdmin and (o:IsAdmin() or o:IsSuperAdmin()) or false
end
function TOOL:GetClientSettings()
local data = {}
for setting, default in next, self.ClientConVar do
data[setting] = self:GetClientInfo(setting)
end
return data
end
function TOOL:LeftClick( trace )
local owner = self:GetOwner()
if not CanTool(owner) then return false end
local hitPos = trace.HitPos
local stage = self:GetStage()
if stage == 0 then
self.Settings.min = hitPos
self:SetStage(1)
elseif stage == 1 then
self.Settings.max = hitPos
self:SetStage(2)
elseif stage == 2 then
-- nudge logic here (mins)
end
return true
end
function TOOL:RightClick( trace )
local owner = self:GetOwner()
if not CanTool(owner) then return false end
local stage = self:GetStage()
if stage == 2 then
-- nudge logic here (maxs)
return true
end
return false
end
function TOOL:Reload( trace )
if not CanTool(self:GetOwner()) then return false end
local stage = self:GetStage()
local inuse = self:GetOwner():KeyDown(IN_USE)
if SERVER and stage == 0 then
if inuse then
MapDefine:RemoveAll()
else
for _,v in next, ents.FindInSphere(trace.HitPos, 5) do
if ( v.GetClass and v:GetClass() == MapDefine.ClassName ) then
MapDefine:Remove(v)
break
end
end
end
elseif stage == 1 then
if inuse then
self.Settings.min = nil
self.Settings.max = nil
self:SetStage(0)
end
elseif stage == 2 then
if SERVER and not inuse then
MapDefine:Create(self.Settings, self:GetClientSettings())
end
self.Settings.min = nil
self.Settings.max = nil
self:SetStage(0)
end
return true
end
function TOOL:Holster()
self.Settings = {}
end
if liveLoad and next(gmodTool) then
TOOL:CreateConVars()
gmodTool.Tool[TOOL.Mode] = TOOL -- Fix strangeness
weapons.Register(gmodTool, 'gmod_tool')
for _, wep in next, ents.FindByClass('gmod_tool') do
wep.Tool[TOOL.Mode].SWEP = wep
wep.Tool[TOOL.Mode].Owner = wep:GetOwner()
wep.Tool[TOOL.Mode].Weapon = wep
wep.Tool[TOOL.Mode]:Init()
wep:Initialize()
wep:Activate()
end
if CLIENT then
hook.Add("PopulateToolMenu", "CustomMenuSettings", function()
spawnmenu.AddToolMenuOption(
TOOL.Tab or "Main",
TOOL.Category or "New Category",
TOOL.Mode,
TOOL.Name or "#" .. TOOL.Mode,
TOOL.Command or "gmod_tool " .. TOOL.Mode,
TOOL.Mode,
function( panel ) TOOL:BuildCPanel( panel ) end
)
end)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment