646 lines
26 KiB
Lua
646 lines
26 KiB
Lua
local Ph = {}
|
|
function ph_BaseMainWindow(ply, cmd, args)
|
|
local mdlName = ply:GetInfo("cl_playermodel")
|
|
local mdlPath = player_manager.TranslatePlayerModel(mdlName)
|
|
|
|
local frm = vgui.Create("DFrame")
|
|
frm:SetSize(ScrW()-96,ScrH()-64)
|
|
frm:SetTitle("Prop Hunt: Enhanced | Help & Settings menu")
|
|
frm.Paint = function(self,w,h)
|
|
surface.SetDrawColor(30,30,30,180)
|
|
surface.DrawRect(0,0,w,h)
|
|
end
|
|
frm:SetDraggable(false)
|
|
frm:Center()
|
|
frm:MakePopup()
|
|
|
|
local tab = vgui.Create("DPropertySheet", frm)
|
|
tab:Dock(FILL)
|
|
tab:DockMargin(12,12,12,12)
|
|
tab.Paint = function(self)
|
|
surface.SetDrawColor(50,50,50,255)
|
|
surface.DrawRect(0,0,self:GetWide(),self:GetTall())
|
|
end
|
|
|
|
function Ph:GetMutedStateIcon(bool)
|
|
if bool then
|
|
return "vgui/phehud/voice_off"
|
|
end
|
|
|
|
return "vgui/phehud/voice_on"
|
|
end
|
|
|
|
function Ph:CreateBasicLayout(color,pTab) -- Warning: This one only can be used within this scope! todo: See 'cl_credits.lua' to see some details.
|
|
local panel = vgui.Create("DPanel", pTab)
|
|
panel:SetBackgroundColor(color)
|
|
|
|
local scroll = vgui.Create( "DScrollPanel", panel )
|
|
scroll:Dock(FILL)
|
|
|
|
local grid = vgui.Create("DGrid", scroll)
|
|
grid:Dock(NODOCK)
|
|
grid:SetPos(10,10)
|
|
grid:SetCols(1)
|
|
grid:SetColWide(800)
|
|
grid:SetRowHeight(32)
|
|
|
|
return panel,grid
|
|
end
|
|
|
|
-- Base Function for Automated-VGUI Creation. I've Spent 8 Hours to do this with laptop keep autoshutdowns... Damn it
|
|
-- Usage of Ph:CreateVGUIType(cmd,typ,data,panel,text)
|
|
-- typ: check, label, btn, slider
|
|
function Ph:CreateVGUIType(cmd,typ,data,panel,text)
|
|
-- CheckBox
|
|
if typ == "check" then
|
|
if type(data) == "string" then
|
|
local chk = vgui.Create("DCheckBoxLabel")
|
|
chk:SetSize(panel:GetColWide(),panel:GetRowHeight())
|
|
chk:SetText(text)
|
|
local num = GetConVar(cmd):GetBool()
|
|
if num then
|
|
chk:SetChecked(true); chk:SetValue(1);
|
|
else
|
|
chk:SetChecked(false); chk:SetValue(0);
|
|
end
|
|
function chk:OnChange(bool)
|
|
local v = 0
|
|
if bool then
|
|
v = 1
|
|
else
|
|
v = 0
|
|
end
|
|
if data == "SERVER" then
|
|
net.Start("SvCommandReq")
|
|
net.WriteString(cmd)
|
|
net.WriteInt(v,2)
|
|
net.SendToServer()
|
|
elseif data == "CLIENT" then
|
|
RunConsoleCommand(cmd, v)
|
|
chat.AddText(Color(200,0,0),"[Settings]", color_white, " Cvar '"..cmd.."' has been changed to "..v)
|
|
if v == 1 then
|
|
surface.PlaySound("buttons/button9.wav")
|
|
else
|
|
surface.PlaySound("buttons/button19.wav")
|
|
end
|
|
end
|
|
end
|
|
panel:AddItem(chk)
|
|
else
|
|
print(cmd.." -> Ph:CreateVGUIType FAILED! - 'data' argument must containt string value, Got: "..type(data).." instead!!")
|
|
end
|
|
end
|
|
|
|
-- Label
|
|
if typ == "label" then
|
|
local txt = vgui.Create("DLabel")
|
|
txt:SetSize(panel:GetColWide(),panel:GetRowHeight())
|
|
txt:SetText(text)
|
|
if !data then
|
|
txt:SetFont("HudHintTextLarge")
|
|
else
|
|
txt:SetFont(data)
|
|
end
|
|
txt:SetTextColor(color_white)
|
|
panel:AddItem(txt)
|
|
end
|
|
|
|
-- Spacer/Divider
|
|
if typ == "spacer" then
|
|
local pnl = vgui.Create("DPanel")
|
|
pnl:SetSize(panel:GetColWide(),panel:GetRowHeight())
|
|
pnl:SetBackgroundColor(Color(0,0,0,0))
|
|
|
|
panel:AddItem(pnl)
|
|
end
|
|
|
|
-- Button
|
|
if typ == "btn" then
|
|
if type(data) == "table" then
|
|
-- How many buttons that will be created. Note: maximum are 6 buttons in 1 segment.
|
|
local legal = data.max
|
|
if data.max < 1 then legal = 1 end
|
|
if data.max > 6 then legal = 6 end
|
|
|
|
local pnl = vgui.Create("DPanel")
|
|
pnl:SetSize(panel:GetColWide(),panel:GetRowHeight())
|
|
pnl:SetBackgroundColor(Color(0,0,0,0))
|
|
|
|
local function btncreation(pPanel,pText, f)
|
|
local btn = vgui.Create("DButton", pPanel)
|
|
btn:SetText(pText)
|
|
btn:Dock(LEFT)
|
|
btn:DockMargin(8,2,0,2)
|
|
-- If this looks stupid, but it working, it ain't stupid!
|
|
btn:SizeToContents()
|
|
btn:SetSize(btn:GetWide()+8,btn:GetTall())
|
|
btn.DoClick = f
|
|
end
|
|
|
|
for i=1,legal do
|
|
btncreation(pnl,data.textdata[i][1], data.textdata[i][2])
|
|
end
|
|
panel:AddItem(pnl)
|
|
else
|
|
print(cmd.." -> Ph:CreateVGUIType FAILED! - 'data' argument must containt table value, Example:\n\n { max = max_num_button, textdata = {[1] = {text, function}, [2] = {text, function}, etc...}} \n --> Got "..type(data).." instead!!")
|
|
end
|
|
end
|
|
|
|
-- Slider
|
|
if typ == "slider" then
|
|
if type(data) == "table" then
|
|
local min = data.min
|
|
local max = data.max
|
|
local dval = data.init
|
|
local dec = data.dec
|
|
local kind = data.kind
|
|
local float = data.float
|
|
|
|
local pnl = vgui.Create("DPanel")
|
|
pnl:SetSize(panel:GetColWide(),panel:GetRowHeight()-6)
|
|
pnl:SetBackgroundColor(Color(120,120,120,200))
|
|
|
|
local slider = vgui.Create("DNumSlider",pnl)
|
|
slider:SetPos(10,0)
|
|
slider:SetSize(panel:GetColWide()-30,panel:GetRowHeight()-6)
|
|
slider:SetText(text)
|
|
slider:SetMin(min)
|
|
slider:SetMax(max)
|
|
slider:SetValue(dval)
|
|
slider:SetDecimals(dec)
|
|
slider.OnValueChanged = function(pnl,val)
|
|
slider:SetValue(val)
|
|
if kind == "SERVER" then
|
|
net.Start("SvCommandSliderReq")
|
|
net.WriteString(cmd)
|
|
net.WriteBool(float)
|
|
if float then
|
|
net.WriteFloat(val)
|
|
else
|
|
net.WriteInt(slider:GetValue(), 16)
|
|
end
|
|
net.SendToServer()
|
|
elseif kind == "CLIENT" then
|
|
if float then
|
|
RunConsoleCommand(cmd, val)
|
|
else
|
|
RunConsoleCommand(cmd, math.Round(val))
|
|
end
|
|
end
|
|
end
|
|
panel:AddItem(pnl)
|
|
else
|
|
print(cmd.." -> Ph:CreateVGUIType FAILED! - 'data' argument must containt table value, Example:\n\n { min = min value, max = max value, init = initial value, dec = decimal count, kind = SERVER/CLIENT} } \n --> Got "..type(data).." instead!!")
|
|
end
|
|
end
|
|
|
|
-- Mute Functions
|
|
if typ == "mute" then
|
|
if type(data) == "Player" && IsValid(data) then
|
|
local ply = data
|
|
|
|
local pnl = vgui.Create("DPanel")
|
|
pnl:SetSize(panel:GetColWide(),panel:GetRowHeight()-6)
|
|
pnl:SetBackgroundColor(Color(20,20,20,150))
|
|
|
|
local ava = vgui.Create("AvatarImage", pnl)
|
|
ava:Dock(LEFT)
|
|
ava:SetSize(24,24)
|
|
ava:SetPlayer(ply,32)
|
|
|
|
local name = vgui.Create("DLabel", pnl)
|
|
name:Dock(LEFT)
|
|
name:DockMargin(8,4,8,4)
|
|
name:SetSize(panel:GetColWide()/2,0)
|
|
name:SetText(ply:Nick())
|
|
name:SetFont("HudHintTextLarge")
|
|
name:SetTextColor(color_white)
|
|
|
|
local imagebtn
|
|
local button = vgui.Create("DButton", pnl)
|
|
button:Dock(RIGHT)
|
|
button:DockMargin(4,0,4,0)
|
|
button:SetSize(24,0)
|
|
button:SetText("")
|
|
button.Paint = function(btn)
|
|
surface.SetDrawColor(90,90,90,0)
|
|
surface.DrawRect(0,0,btn:GetWide(),btn:GetTall())
|
|
end
|
|
|
|
button.DoClick = function()
|
|
if not IsValid(ply) then return end
|
|
local mute = ply:IsMuted()
|
|
ply:SetMuted(not mute)
|
|
imagebtn:SetImage(Ph:GetMutedStateIcon(not mute))
|
|
end
|
|
|
|
if ply == LocalPlayer() then
|
|
button:SetVisible(false)
|
|
else
|
|
button:SetVisible(true)
|
|
end
|
|
|
|
imagebtn = vgui.Create("DImage",button)
|
|
imagebtn:Dock(FILL)
|
|
imagebtn:SetImage(Ph:GetMutedStateIcon(ply:IsMuted()))
|
|
|
|
panel:AddItem(pnl)
|
|
else
|
|
print(cmd.." -> Ph:CreateVGUIType FAILED! - 'data' argument must containt Entity userdata value \n --> Got "..type(data).." instead!!")
|
|
end
|
|
end
|
|
end
|
|
|
|
function Ph:HelpSelections()
|
|
local panel = vgui.Create("DPanel", tab)
|
|
panel:SetBackgroundColor(Color(100,100,100,255))
|
|
|
|
local helpImage = vgui.Create("DImage", panel)
|
|
helpImage.Count = 1
|
|
helpImage:Dock(FILL)
|
|
helpImage:SetImage("vgui/phhelp1.vmt")
|
|
|
|
local pBottom = vgui.Create("DPanel", panel)
|
|
pBottom:Dock(BOTTOM)
|
|
pBottom:SetSize(0,40)
|
|
pBottom:SetBackgroundColor(Color(0,0,0,0))
|
|
|
|
local motd = vgui.Create("DButton", pBottom)
|
|
motd:Dock(FILL)
|
|
motd:SetSize(0,40)
|
|
motd:SetText("SERVER INFORMATION & RULES [MOTD]")
|
|
motd:SetFont("PHE.ArmorFont")
|
|
motd:SetTextColor(color_white)
|
|
motd.hover = {r=55,g=55,b=55}
|
|
motd.Paint = function(pnl)
|
|
if pnl:IsHovered() then
|
|
pnl.hover = {r=70,g=70,b=70}
|
|
else
|
|
pnl.hover = {r=55,g=55,b=55}
|
|
end
|
|
surface.SetDrawColor(pnl.hover.r,pnl.hover.g,pnl.hover.b,255)
|
|
surface.DrawRect(0,0,motd:GetWide(),motd:GetTall())
|
|
end
|
|
motd.DoClick = function() ply:ConCommand("ulx motd"); frm:Close() end
|
|
|
|
local bnext = vgui.Create("DButton", pBottom)
|
|
bnext:Dock(RIGHT)
|
|
bnext:SetSize(128,40)
|
|
bnext:SetText("NEXT >")
|
|
bnext:SetFont("HudHintTextLarge")
|
|
bnext:SetTextColor(color_white)
|
|
bnext.hover = {r=100,g=100,b=100}
|
|
bnext.Paint = function(pnl)
|
|
if pnl:IsHovered() then
|
|
pnl.hover = {r=130,g=130,b=130}
|
|
pnl:SetTextColor(color_white)
|
|
elseif pnl:GetDisabled() then
|
|
pnl.hover = {r=20,g=20,b=20}
|
|
pnl:SetTextColor(Color(40,40,40))
|
|
else
|
|
pnl.hover = {r=100,g=100,b=100}
|
|
pnl:SetTextColor(color_white)
|
|
end
|
|
surface.SetDrawColor(pnl.hover.r,pnl.hover.g,pnl.hover.b,255)
|
|
surface.DrawRect(0,0,motd:GetWide(),motd:GetTall())
|
|
end
|
|
bnext.DoClick = function(pnl)
|
|
helpImage.Count = helpImage.Count + 1
|
|
if helpImage.Count >= 6 then
|
|
helpImage.Count = 6
|
|
end
|
|
helpImage:SetImage("vgui/phhelp"..helpImage.Count..".vmt")
|
|
end
|
|
|
|
local bprev = vgui.Create("DButton", pBottom)
|
|
bprev:Dock(LEFT)
|
|
bprev:SetSize(128,40)
|
|
bprev:SetText("< PREVIOUS")
|
|
bprev:SetFont("HudHintTextLarge")
|
|
bprev:SetTextColor(color_white)
|
|
bprev.hover = {r=100,g=100,b=100}
|
|
bprev.Paint = function(pnl)
|
|
if pnl:IsHovered() then
|
|
pnl.hover = {r=130,g=130,b=130}
|
|
pnl:SetTextColor(color_white)
|
|
elseif pnl:GetDisabled() then
|
|
pnl.hover = {r=20,g=20,b=20}
|
|
pnl:SetTextColor(Color(40,40,40))
|
|
else
|
|
pnl.hover = {r=100,g=100,b=100}
|
|
pnl:SetTextColor(color_white)
|
|
end
|
|
surface.SetDrawColor(pnl.hover.r,pnl.hover.g,pnl.hover.b,255)
|
|
surface.DrawRect(0,0,motd:GetWide(),motd:GetTall())
|
|
end
|
|
bprev.DoClick = function(pnl)
|
|
helpImage.Count = helpImage.Count - 1
|
|
if helpImage.Count <= 1 then
|
|
helpImage.Count = 1
|
|
end
|
|
helpImage:SetImage("vgui/phhelp"..helpImage.Count..".vmt")
|
|
end
|
|
|
|
tab:AddSheet("Help", panel, "icon16/help.png")
|
|
end
|
|
|
|
function Ph:PlayerModelSelections()
|
|
local panel = vgui.Create("DPanel", tab)
|
|
panel:SetBackgroundColor(Color(40,40,40,120))
|
|
|
|
-- Prefer had to do this instead doing all over and over.
|
|
function Ph:PlayerModelAdditions()
|
|
|
|
-- the Model's DPanel preview. The Pos & Size must be similar as the ModelPreview.
|
|
local panelpreview = vgui.Create( "DPanel", panel )
|
|
panelpreview:Dock(FILL)
|
|
panelpreview:SetBackgroundColor(Color(120,120,120,100))
|
|
|
|
-- Model Preview.
|
|
local modelPreview = vgui.Create( "DModelPanel", panelpreview )
|
|
modelPreview:Dock(FILL)
|
|
modelPreview:SetFOV ( 50 )
|
|
modelPreview:SetModel ( mdlPath )
|
|
|
|
local slider = vgui.Create("DNumSlider", panelpreview)
|
|
slider:Dock(BOTTOM)
|
|
slider:SetSize(0,32)
|
|
slider:SetText(" Set Model FOV")
|
|
slider:SetMin(50)
|
|
slider:SetMax(90)
|
|
slider:SetValue(40)
|
|
slider:SetDecimals(0)
|
|
slider.OnValueChanged = function(pnl,val)
|
|
slider:SetValue(val)
|
|
modelPreview:SetFOV(val)
|
|
end
|
|
|
|
local scroll = vgui.Create( "DScrollPanel", panel )
|
|
scroll:Dock(LEFT)
|
|
scroll:SetSize( 720, 0 )
|
|
|
|
-- ^dito, grid dimensions 66x66 w/ Coloumn 7.
|
|
local pnl = vgui.Create( "DGrid", scroll )
|
|
pnl:Dock(FILL)
|
|
pnl:SetCols( 10 )
|
|
pnl:SetColWide( 68 )
|
|
pnl:SetRowHeight( 68 )
|
|
|
|
local plMode = GetConVar("ph_use_playermodeltype"):GetInt()
|
|
local plWhich = {
|
|
[0] = player_manager.AllValidModels(),
|
|
[1] = list.Get("PlayerOptionsModel")
|
|
}
|
|
if plMode == nil then plWhich = 0 end
|
|
|
|
-- Get All Valid Paired Models and sort 'em out.
|
|
for name, model in SortedPairs( plWhich[plMode] ) do
|
|
|
|
-- dont forget to cache.
|
|
util.PrecacheModel(model)
|
|
|
|
local icon = vgui.Create( "SpawnIcon" )
|
|
|
|
-- Click functions
|
|
icon.DoClick = function()
|
|
surface.PlaySound( "buttons/combine_button3.wav" )
|
|
RunConsoleCommand( "cl_playermodel", name )
|
|
modelPreview:SetModel(model)
|
|
Derma_Query("Model " .. name.. " has been selected and it will be applied after respawn!", "Model Applied",
|
|
"OK", function() end)
|
|
end
|
|
|
|
-- Right click functions
|
|
icon.DoRightClick = function()
|
|
-- Same as above, but they has custom menus once user tries to right click on the models.
|
|
local menu = DermaMenu()
|
|
-- if user caught it says 'ERROR' but the model present, refresh it (:RebuildSpawnIcon)
|
|
menu:AddOption( "Apply Model", function()
|
|
surface.PlaySound( "buttons/combine_button3.wav" )
|
|
RunConsoleCommand( "cl_playermodel", name )
|
|
modelPreview:SetModel(model)
|
|
Derma_Query("Model " .. name.. " has been selected and it will be applied after respawn!", "Model Applied", "OK", function() end)
|
|
end):SetIcon("icon16/tick.png")
|
|
menu:AddSpacer()
|
|
menu:AddOption( "Refresh Icon", function() icon:RebuildSpawnIcon() end):SetIcon("icon16/arrow_refresh.png")
|
|
menu:AddOption( "Preview", function() modelPreview:SetModel(model) end):SetIcon("icon16/magnifier.png")
|
|
menu:AddOption( "Model Information", function()
|
|
Derma_Message( "Model's name is: " .. name .. "\n \nUsable by: Everyone.", "Model Info", "Close" )
|
|
end ):SetIcon("icon16/information.png")
|
|
menu:AddSpacer()
|
|
menu:AddOption( "Close" ):SetIcon("icon16/cross.png")
|
|
menu:Open()
|
|
end
|
|
|
|
-- Make sure the user has noticed after choosing a model by indicating from "Borders".
|
|
icon.PaintOver = function()
|
|
if ( GetConVarString( "cl_playermodel" ) == name ) then
|
|
surface.SetDrawColor( Color( 255, 210 + math.sin(RealTime()*10)*40, 0 ) )
|
|
surface.DrawOutlinedRect( 4, 4, icon:GetWide()-8, icon:GetTall()-8 )
|
|
surface.DrawOutlinedRect( 3, 3, icon:GetWide()-6, icon:GetTall()-6 )
|
|
end
|
|
end
|
|
|
|
-- Set set etc...
|
|
icon:SetModel(model)
|
|
icon:SetSize(64,64)
|
|
icon:SetTooltip(name)
|
|
|
|
pnl:AddItem(icon)
|
|
end
|
|
return pnl
|
|
end
|
|
|
|
-- Self Explanationary.
|
|
if GetConVar("ph_use_custom_plmodel"):GetBool() then
|
|
-- Call the VGUI Properties of PlayerModelAdditions().
|
|
Ph:PlayerModelAdditions()
|
|
tab:AddSheet("Player Model", panel, "icon16/brick.png")
|
|
else
|
|
-- Show small message instead
|
|
local scroll = vgui.Create( "DScrollPanel", panel )
|
|
scroll:Dock(FILL)
|
|
|
|
local gridmdl = vgui.Create("DGrid", scroll)
|
|
gridmdl:Dock(NODOCK)
|
|
gridmdl:SetPos(10,10)
|
|
gridmdl:SetCols(1)
|
|
gridmdl:SetColWide(800)
|
|
gridmdl:SetRowHeight(32)
|
|
|
|
Ph:CreateVGUIType("", "label", false, gridmdl, "Sorry, Custom Player Model is disabled on this server!")
|
|
|
|
-- this hook is intended to use for custom player model outside from PH:E Menu. (like Custom Donator Model window or something).
|
|
hook.Call("PH_CustomPlayermdlButton", nil, panel, gridmdl, function(cmd,typ,data,panel,text) Ph:CreateVGUIType(cmd,typ,data,panel,text) end)
|
|
|
|
tab:AddSheet("Player Model", panel, "icon16/brick.png")
|
|
end
|
|
end
|
|
|
|
function Ph:PlayerOption()
|
|
local panel,gridpl = Ph:CreateBasicLayout(Color(40,40,40,180),tab)
|
|
|
|
Ph:CreateVGUIType("", "label", false, gridpl, "Player Options:")
|
|
Ph:CreateVGUIType("ph_cl_halos", "check", "CLIENT", gridpl, "Toggle Halo effect when choosing a prop" )
|
|
Ph:CreateVGUIType("ph_cl_pltext", "check", "CLIENT", gridpl, "Show Team player names above their heads instead (and appear through wall too)")
|
|
Ph:CreateVGUIType("ph_cl_endround_sound", "check", "CLIENT", gridpl, "Play End round sound cue")
|
|
Ph:CreateVGUIType("ph_cl_autoclose_taunt", "check", "CLIENT", gridpl, "Option for Auto closing for Taunt window when double-clicking them")
|
|
Ph:CreateVGUIType("ph_cl_spec_hunter_line", "check", "CLIENT", gridpl, "Draw a line on hunters so we can see their aim in spectator mode.")
|
|
Ph:CreateVGUIType("cl_enable_luckyballs_icon", "check", "CLIENT", gridpl, "Enable 'Lucky ball' icon to be displayed once they are spawned")
|
|
Ph:CreateVGUIType("cl_enable_devilballs_icon", "check", "CLIENT", gridpl, "Enable 'Devil ball' icon to be displayed once they are spawned")
|
|
Ph:CreateVGUIType("hudspacer","spacer",nil,gridpl,"" )
|
|
Ph:CreateVGUIType("", "label", false, gridpl, "HUD Settings")
|
|
Ph:CreateVGUIType("ph_hud_use_new", "check", "CLIENT", gridpl, "Use New PH: Enhanced HUD")
|
|
Ph:CreateVGUIType("ph_show_tutor_control", "check", "CLIENT", gridpl, "Show Tutorial Pop-up (Shown only 2x on each prop spawns)")
|
|
Ph:CreateVGUIType("ph_show_custom_crosshair", "check", "CLIENT", gridpl, "Enable Custom Crosshair")
|
|
Ph:CreateVGUIType("ph_show_team_topbar", "check", "CLIENT", gridpl, "Show total alive team players bar on the top left (At least 4 Players will be shown)")
|
|
|
|
tab:AddSheet("Player", panel, "icon16/user_orange.png")
|
|
end
|
|
|
|
function Ph:PlayerMute()
|
|
local panel,gridmute = Ph:CreateBasicLayout(Color(40,40,40,180),tab)
|
|
|
|
Ph:CreateVGUIType("","label",false,gridmute,"Select one player that you wish to mute.")
|
|
for _,Plys in pairs(player.GetAll()) do
|
|
Ph:CreateVGUIType("","mute",Plys,gridmute,"")
|
|
end
|
|
|
|
tab:AddSheet("Mute", panel, "icon16/sound_delete.png")
|
|
end
|
|
-- Call All Functions, but Admin (must check by serverside user rights from sv_admin.lua)
|
|
Ph:HelpSelections()
|
|
Ph:PlayerMute()
|
|
Ph:PlayerOption()
|
|
Ph:PlayerModelSelections()
|
|
|
|
-- Custom Hook Menu here. Give 1 second for better safe-calling...
|
|
timer.Simple(1, function()
|
|
hook.Call("PH_CustomTabMenu", nil, tab, function(cmd,typ,data,panel,text) Ph:CreateVGUIType(cmd,typ,data,panel,text) end)
|
|
end)
|
|
|
|
function Ph:ShowAdminMenu()
|
|
local panel,grid = Ph:CreateBasicLayout(Color(40,40,40,180),tab)
|
|
|
|
Ph:CreateVGUIType("", "label", false, grid, "Serverside gamemode Options (Only visible for Admins/Owner)")
|
|
Ph:CreateVGUIType("ph_use_custom_plmodel", "check", "SERVER", grid, "Enable custom models for Hunters")
|
|
Ph:CreateVGUIType("ph_use_custom_plmodel_for_prop", "check", "SERVER", grid, "Enable custom models for Props - Make sure to enable for Hunter too.")
|
|
Ph:CreateVGUIType("ph_customtaunts_delay", "slider", {min = 2, max = 120, init = GetConVar("ph_customtaunts_delay"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Custom Taunts Delay (Seconds)")
|
|
Ph:CreateVGUIType("ph_normal_taunt_delay", "slider", {min = 2, max = 120, init = GetConVar("ph_normal_taunt_delay"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Normal Taunts Delay (Seconds)")
|
|
Ph:CreateVGUIType("ph_autotaunt_enabled", "check", "SERVER", grid, "Enable Auto Taunt Features")
|
|
Ph:CreateVGUIType("ph_autotaunt_delay", "slider", {min = 30, max = 180, init = GetConVar("ph_autotaunt_delay"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Auto Taunts Delay (Seconds)")
|
|
Ph:CreateVGUIType("devspacer","spacer",nil,grid,"" )
|
|
Ph:CreateVGUIType("ph_notice_prop_rotation", "check", "SERVER", grid, "Display 'Prop Rotation' notification on every Prop Spawns")
|
|
Ph:CreateVGUIType("ph_prop_camera_collisions", "check", "SERVER", grid, "Enable Prop Camera collision to the wall")
|
|
Ph:CreateVGUIType("ph_freezecam", "check", "SERVER", grid, "Enable Freecam features for team props")
|
|
Ph:CreateVGUIType("ph_prop_collision", "check", "SERVER", grid, "Enable Prop collide on each other prop players")
|
|
Ph:CreateVGUIType("ph_swap_teams_every_round", "check", "SERVER", grid, "Swap team every round - Disabling means team will stay forever")
|
|
Ph:CreateVGUIType("ph_hunter_fire_penalty", "slider", {min = 2, max = 80, init = GetConVar("ph_hunter_fire_penalty"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Hunter points penalty")
|
|
Ph:CreateVGUIType("ph_hunter_kill_bonus", "slider", {min = 5, max = 100, init = GetConVar("ph_hunter_kill_bonus"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Hunter kill bonus")
|
|
Ph:CreateVGUIType("ph_game_time", "slider", {min = 20, max = 300, init = GetConVar("ph_game_time"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Total Game time (Minutes)")
|
|
Ph:CreateVGUIType("ph_hunter_blindlock_time", "slider", {min = 15, max = 60, init = GetConVar("ph_hunter_blindlock_time"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Hunter blindlock time (Seconds)")
|
|
Ph:CreateVGUIType("ph_round_time", "slider", {min = 120, max = 600, init = GetConVar("ph_round_time"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Game round time (Seconds)")
|
|
Ph:CreateVGUIType("ph_rounds_per_map", "slider", {min = 5, max = 30, init = GetConVar("ph_rounds_per_map"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Total game Rounds per Map")
|
|
Ph:CreateVGUIType("ph_enable_lucky_balls", "check", "SERVER", grid, "Allow Lucky Balls Features to be spawned on breakable props (Chance is 8%)")
|
|
Ph:CreateVGUIType("ph_enable_devil_balls", "check", "SERVER", grid, "Allow Devil Balls Features to be spawned when hunter dies (Chance is 70%)")
|
|
Ph:CreateVGUIType("ph_waitforplayers", "check", "SERVER", grid, "Wait for Players to begin the gameplay")
|
|
Ph:CreateVGUIType("ph_min_waitforplayers", "slider", { min = 1, max = game.MaxPlayers(), init = GetConVar("ph_min_waitforplayers"):GetInt(), dec = 0, kind = "SERVER" }, grid, "Mininum Players to Wait before the game starts (default: 1)")
|
|
Ph:CreateVGUIType("", "label", false, grid, "Enable Custom Taunt. Mode: 0 = Random, 1 = Custom, 2 Both mode)")
|
|
Ph:CreateVGUIType("", "btn", {max = 2, textdata = {
|
|
[1] = {"--[ Current Mode is Mode: "..GetConVar('ph_enable_custom_taunts'):GetInt().." ] --",
|
|
function(self)
|
|
local CusTauntConvar = {
|
|
[0] = "Mode [0/F3]: Random Taunt",
|
|
[1] = "Mode [1/C]: Custom Taunt",
|
|
[2] = "Mode [2]: Both Modes"
|
|
}
|
|
local function SendTauntCommandState(state)
|
|
net.Start("SendTauntStateCmd")
|
|
net.WriteString(tostring(state))
|
|
net.SendToServer()
|
|
end
|
|
|
|
self:SetText(CusTauntConvar[GetConVar("ph_enable_custom_taunts"):GetInt()])
|
|
local state = 0
|
|
if GetConVar("ph_enable_custom_taunts"):GetInt() == 0 then
|
|
state = 1
|
|
SendTauntCommandState(1)
|
|
self:SetText(CusTauntConvar[state])
|
|
elseif GetConVar("ph_enable_custom_taunts"):GetInt() == 1 then
|
|
state = 2
|
|
SendTauntCommandState(2)
|
|
self:SetText(CusTauntConvar[state])
|
|
elseif GetConVar("ph_enable_custom_taunts"):GetInt() == 2 then
|
|
state = 0
|
|
SendTauntCommandState(0)
|
|
self:SetText(CusTauntConvar[state])
|
|
end
|
|
end},
|
|
[2] = {"Open Taunt Window", function(self)
|
|
if !LocalPlayer():Alive() then
|
|
print("You must do this action when you are alive!")
|
|
frm:Close()
|
|
else
|
|
LocalPlayer():ConCommand("ph_showtaunts")
|
|
end
|
|
end}
|
|
}
|
|
}, grid ,"")
|
|
Ph:CreateVGUIType("devspacer","spacer",nil,grid,"" )
|
|
Ph:CreateVGUIType("", "label", false, grid, "Developer Options/Experimentals Features")
|
|
Ph:CreateVGUIType("phe_check_props_boundaries", "check", "SERVER", grid, "[WORK IN PROGRESS] Enable Boundaries Check? This prevents you to get stuck with objects/walls.")
|
|
Ph:CreateVGUIType("ph_mkbren_use_new_mdl","check","SERVER",grid, "Developer: Use new model for Bren MK II Bonus Weapon (Require Map Restart!)")
|
|
Ph:CreateVGUIType("ph_print_verbose", "check", "SERVER", grid, "Developer: Enable verbose information of PH:E events in the console")
|
|
Ph:CreateVGUIType("ph_enable_plnames", "check", "SERVER", grid, "Enable Player team names to be appear on their screen.")
|
|
Ph:CreateVGUIType("ph_fc_use_single_sound", "check", "SERVER", grid, "Use single Freezecam sound instead of sound list (Use 'ph_fc_cue_path' to determine Freezecam sound path)")
|
|
Ph:CreateVGUIType("ph_use_playermodeltype", "check", "SERVER", grid, "Use Legacy Model List : 0 = All Playermodels (AddValidModel), 1 = Use Legacy: list.Get('PlayerOptionsModel')")
|
|
Ph:CreateVGUIType("ph_prop_jumppower", "slider", {min = 1, max = 3, init = GetConVar("ph_prop_jumppower"):GetFloat(), dec = 2, float = true, kind = "SERVER"}, grid, "Additional Jump Power multiplier for Props")
|
|
Ph:CreateVGUIType("ph_sv_enable_obb_modifier","check","SERVER",grid, "Developer: Enable Customized Prop Entity OBB Model Data Modifier")
|
|
Ph:CreateVGUIType("ph_reload_obb_setting_everyround","check","SERVER",grid, "Developer: Reload Customized Prop Entity OBB Model Data Modifier every round restarts")
|
|
|
|
tab:AddSheet("Admins", panel, "icon16/user_gray.png")
|
|
end
|
|
|
|
function Ph:MapVoteMenu()
|
|
local panel,grid = Ph:CreateBasicLayout(Color(40,40,40,180),tab)
|
|
|
|
Ph:CreateVGUIType("", "label", false, grid, "MapVote Settings")
|
|
Ph:CreateVGUIType("mv_allowcurmap","check","SERVER",grid,"Allow Current map to be Voted")
|
|
Ph:CreateVGUIType("mv_cooldown","check","SERVER",grid,"Enable map Cooldown for voting")
|
|
Ph:CreateVGUIType("mv_use_ulx_votemaps","check","SERVER",grid,"Use map listing from ULX Mapvote? 1 = use from ULX mapvote list (which you can whitelist them), 0 = use default maps/*.bsp directory listing.")
|
|
Ph:CreateVGUIType("mv_maplimit", "slider", {min = 2, max = 80, init = GetConVar("mv_maplimit"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Number of Maps to be shown in MapVote.")
|
|
Ph:CreateVGUIType("mv_timelimit", "slider", {min = 15, max = 90, init = GetConVar("mv_timelimit"):GetInt(), dec = 0, kind = "SERVER"}, grid, "Time in Seconds for default mapvote when voting.")
|
|
Ph:CreateVGUIType("mv_mapbeforerevote", "slider", {min = 1, max = 10, init = GetConVar("mv_mapbeforerevote"):GetInt(), dec = 0, kind = "SERVER"}, grid, "How many times cooldown map to be appear again?")
|
|
Ph:CreateVGUIType("mv_rtvcount", "slider", {min = 2, max = game.MaxPlayers(), init = GetConVar("mv_rtvcount"):GetInt(), dec = 0, kind = "SERVER"}, grid, "How many players required to use RTV (Rock the Vote)")
|
|
Ph:CreateVGUIType("s1","spacer",nil,grid,"" )
|
|
Ph:CreateVGUIType("", "label", false, grid, "To Setup which map should be listed, use (for example) [ mv_mapprefix 'ph_,cs_,de_' ] in the console.")
|
|
Ph:CreateVGUIType("", "label", false, grid, "If you are unable to do a MapVote, you NEED to install ULX Admin Mod!")
|
|
Ph:CreateVGUIType("s2","spacer",nil,grid,"" )
|
|
Ph:CreateVGUIType("", "label", false, grid, "MapVote Action (To cancel, simply type !unmap_vote in the chat or type 'unmap_vote' in console)")
|
|
Ph:CreateVGUIType("", "btn", {max = 2, textdata = {
|
|
[1] = {"Start MapVote", function(self)
|
|
LocalPlayer():ConCommand("map_vote")
|
|
end
|
|
},
|
|
[2] = {"Stop MapVote", function(self)
|
|
LocalPlayer():ConCommand("unmap_vote")
|
|
end}
|
|
}
|
|
},grid,"")
|
|
|
|
tab:AddSheet("MapVote", panel, "icon16/map.png")
|
|
end
|
|
|
|
-- if Current User is Admin then check their user as security measure in the server.
|
|
if ply:IsAdmin() then
|
|
net.Start("CheckAdminFirst")
|
|
net.SendToServer()
|
|
end
|
|
|
|
-- if Current User Passes the admin check, shows the admin tab.
|
|
net.Receive("CheckAdminResult", function(len, pln)
|
|
Ph:ShowAdminMenu()
|
|
Ph:MapVoteMenu()
|
|
end)
|
|
end
|
|
concommand.Add("ph_enhanced_show_help", ph_BaseMainWindow, nil, "Show Prop Hunt: Enhanced Main and Help menus." ) |