Files
wnsrc/lua/arccw/client/cl_menus.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

798 lines
44 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
--[[
Panel table doc:
id (any number) = data:
type
type args
types:
h - header text
c - control help text
b - checkbox text var
i - integer slider text var min max
f - float slider (2 nums after .) text var min max
m - color mixer text r g b a
p - press or button text func
t - textbox text string
o - combo box text var choices (key - cvar, value - text)
d - binder text var
(you can add custom types in ArcCW.GeneratePanelElements's AddControl table)
Generate elements via ArcCW.GeneratePanelElements:
panel, panel table with data
Add menu generation to ArcCW.ClientMenus:
name = data:
text - header text
func - generator function
]]
local BulletPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "c", text = "#arccw.bullet_help" },
{ type = "b", text = "#arccw.cvar.bullet_enable", var = "arccw_bullet_enable", sv = true },
{ type = "b", text = "#arccw.cvar.enable_penetration", var = "arccw_enable_penetration", sv = true },
{ type = "b", text = "#arccw.cvar.enable_ricochet", var = "arccw_enable_ricochet", sv = true },
{ type = "f", text = "#arccw.cvar.bullet_velocity", var = "arccw_bullet_velocity", min = 0, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.bullet_gravity", var = "arccw_bullet_gravity", min = 0, max = 1200, sv = true },
{ type = "f", text = "#arccw.cvar.bullet_drag", var = "arccw_bullet_drag", min = 0, max = 10, sv = true },
{ type = "f", text = "#arccw.cvar.bullet_lifetime", var = "arccw_bullet_lifetime", min = 1, max = 20, sv = true},
}
local ClientPanel = {
{ type = "h", text = "#arccw.clientcfg" },
{ type = "b", text = "#arccw.cvar.automaticreload", var = "arccw_automaticreload" },
{ type = "c", text = "#arccw.cvar.automaticreload.desc" },
{ type = "f", text = "#arccw.cvar.adjustsensthreshold", var = "arccw_adjustsensthreshold", min = 0, max = 50, sv = true },
{ type = "c", text = "#arccw.cvar.adjustsensthreshold.desc" },
{ type = "b", text = "#arccw.cvar.toggleads", var = "arccw_toggleads" },
{ type = "b", text = "#arccw.cvar.autosave", var = "arccw_autosave" },
{ type = "c", text = "#arccw.cvar.autosave.desc" },
--{ type = "b", text = "#arccw.cvar.embracetradition", var = "arccw_hud_embracetradition" },
--{ type = "c", text = "#arccw.cvar.embracetradition.desc" },
{ type = "b", text = "#arccw.cvar.glare", var = "arccw_glare" },
{ type = "c", text = "#arccw.cvar.glare.desc" },
{ type = "b", text = "#arccw.cvar.shake", var = "arccw_shake" },
{ type = "b", text = "#arccw.cvar.shakevm", var = "arccw_shakevm" },
{ type = "c", text = "#arccw.cvar.shake_info" },
{ type = "b", text = "#arccw.cvar.aimassist", var = "arccw_aimassist_cl" },
{ type = "c", text = "#arccw.cvar.aimassist_cl.desc" },
-- { type = "b", text = "#arccw.cvar.2d3d", var = "arccw_2d3d" },
{ type = "o", text = "#arccw.cvar.2d3d", var = "arccw_2d3d",
choices = {[0] = "#arccw.combobox.disabled", [1] = "#arccw.cvar.2d3d.1", [2] = "#arccw.cvar.2d3d.2"}},
{ type = "c", text = "#arccw.cvar.2d3d_info" },
{ type = "t", text = "#arccw.cvar.language", var = "arccw_language" },
{ type = "c", text = "#arccw.cvar.language_info" },
{ type = "b", text = "#arccw.cvar.ammonames", var = "arccw_ammonames" },
{ type = "c", text = "#arccw.cvar.ammonames.desc" },
{ type = "b", text = "#arccw.cvar.noinspect", var = "arccw_noinspect" },
}
local PerformancePanel = {
--{ type = "h", text = "#arccw.clientcfg" },
{ type = "h", text = "#arccw.performance" },
{ type = "b", text = "#arccw.cvar.cheapscopes", var = "arccw_cheapscopes" },
{ type = "c", text = "#arccw.cvar.cheapscopes.desc" },
-- { type = "b", text = "#arccw.cvar.flatscopes", var = "arccw_flatscopes" },
-- { type = "c", text = "#arccw.cvar.flatscopes.desc" },
{ type = "b", text = "#arccw.cvar.muzzleeffects", var = "arccw_muzzleeffects" },
{ type = "b", text = "#arccw.cvar.fastmuzzles", var = "arccw_fastmuzzles" },
{ type = "b", text = "#arccw.cvar.fasttracers", var = "arccw_fasttracers" },
{ type = "b", text = "#arccw.cvar.shelleffects", var = "arccw_shelleffects" },
{ type = "b", text = "#arccw.cvar.att_showothers", var = "arccw_att_showothers" },
{ type = "b", text = "#arccw.cvar.att_showground", var = "arccw_att_showground" },
{ type = "i", text = "#arccw.cvar.visibility", var = "arccw_visibility", min = -1, max = 32000},
{ type = "c", text = "#arccw.cvar.visibility.desc" },
{ type = "b", text = "#arccw.cvar.blur", var = "arccw_blur" },
{ type = "b", text = "#arccw.cvar.blur_toytown", var = "arccw_blur_toytown" },
{ type = "b", text = "#arccw.cvar.bullet_imaginary", var = "arccw_bullet_imaginary" },
{ type = "c", text = "#arccw.cvar.bullet_imaginary.desc" },
{ type = "f", text = "#arccw.cvar.shelltime", var = "arccw_shelltime", min = 0, max = 180 },
}
local ViewmodelPanel = {
{ type = "b", text = "#arccw.cvar.vm_coolsway", var = "arccw_vm_coolsway" },
{ type = "b", text = "#arccw.cvar.vm_coolview", var = "arccw_vm_coolview" },
{ type = "h", text = "" },
{ type = "c", text = "#arccw.cvar.vm_offsetwarn" },
{ type = "f", text = "#arccw.cvar.vm_fov", var = "arccw_vm_fov", min = -15, max = 15 },
{ type = "f", text = "#arccw.cvar.vm_right", var = "arccw_vm_right", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.vm_forward", var = "arccw_vm_forward", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.vm_up", var = "arccw_vm_up", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.vm_pitch", var = "arccw_vm_pitch", min = -15, max = 15 },
{ type = "f", text = "#arccw.cvar.vm_yaw", var = "arccw_vm_yaw", min = -15, max = 15 },
{ type = "f", text = "#arccw.cvar.vm_roll", var = "arccw_vm_roll", min = -15, max = 15 },
{ type = "c", text = "" },
{ type = "c", text = "#arccw.cvar.vm_swaywarn" },
{ type = "f", text = "#arccw.cvar.vm_look_xmult", var = "arccw_vm_look_xmult", min = -10, max = 10 },
{ type = "f", text = "#arccw.cvar.vm_look_ymult", var = "arccw_vm_look_ymult", min = -10, max = 10 },
{ type = "f", text = "#arccw.cvar.vm_sway_xmult", var = "arccw_vm_sway_xmult", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.vm_sway_ymult", var = "arccw_vm_sway_ymult", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.vm_sway_zmult", var = "arccw_vm_sway_zmult", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.vm_sway_speedmult", var = "arccw_vm_sway_speedmult", min = 0, max = 2 },
{ type = "h", text = "" },
{ type = "c", text = "#arccw.cvar.vm_viewwarn" },
{ type = "f", text = "#arccw.cvar.vm_coolviewmult", var = "arccw_vm_coolview_mult", min = -5, max = 5 },
{ type = "b", text = "#arccw.cvar.vm_nearwall", var = "arccw_vm_nearwall" },
}
local HudPanel = {
{ type = "h", text = "#arccw.clientcfg" },
{ type = "h", text = "#arccw.hud_svwarning" },
{ type = "b", text = "#arccw.cvar.hud_showhealth", var = "arccw_hud_showhealth" },
{ type = "c", text = "#arccw.cvar.hud_showhealth.desc" },
{ type = "b", text = "#arccw.cvar.hud_showammo", var = "arccw_hud_showammo" },
{ type = "c", text = "#arccw.cvar.hud_showammo.desc" },
{ type = "i", text = "#arccw.cvar.hud_3dfun_decay", var = "arccw_hud_3dfun_decaytime", min = 0, max = 5 },
{ type = "c", text = "#arccw.cvar.hud_3dfun_decay.desc" },
{ type = "b", text = "#arccw.cvar.hud_minimal", var = "arccw_hud_minimal" },
{ type = "c", text = "#arccw.cvar.hud_minimal.desc" },
{ type = "b", text = "#arccw.cvar.hud_forceshow", var = "arccw_hud_forceshow" },
{ type = "c", text = "#arccw.cvar.hud_forceshow.desc" },
{ type = "b", text = "#arccw.cvar.attinv_closeonhurt", var = "arccw_attinv_closeonhurt" },
{ type = "f", text = "#arccw.cvar.hudpos_deadzone_x", var = "arccw_hud_deadzone_x", min = 0, max = 0.5 },
{ type = "f", text = "#arccw.cvar.hudpos_deadzone_y", var = "arccw_hud_deadzone_y", min = 0, max = 0.5 },
{ type = "c", text = "#arccw.cvar.hudpos_deadzone.desc" },
{ type = "f", text = "#arccw.cvar.hudpos_size", var = "arccw_hud_size", min = 0.67, max = 1.5 },
{ type = "c", text = "#arccw.cvar.hudpos_size.desc" },
{ type = "t", text = "#arccw.cvar.font", var = "arccw_font" },
{ type = "c", text = "#arccw.cvar.font_info" },
{ type = "b", text = "#arccw.cvar.attinv_sound", var = "arccw_cust_sounds" },
{ type = "c", text = "#arccw.cvar.attinv_sound.desc" },
{ type = "b", text = "#arccw.cvar.attinv_hideunowned", var = "arccw_attinv_hideunowned" },
{ type = "b", text = "#arccw.cvar.attinv_darkunowned", var = "arccw_attinv_darkunowned" },
{ type = "b", text = "#arccw.cvar.attinv_onlyinspect", var = "arccw_attinv_onlyinspect" },
{ type = "b", text = "#arccw.cvar.attinv_simpleproscons", var = "arccw_attinv_simpleproscons" },
--{ type = "b", text = "#arccw.cvar.attinv_gamemodebuttons", var = "arccw_attinv_gamemodebuttons" },
--{ type = "c", text = "#arccw.cvar.attinv_gamemodebuttons.desc" },
{ type = "h", text = "#arccw.ammohud" },
{ type = "b", text = "#arccw.cvar.hud_3dfun", var = "arccw_hud_3dfun" },
{ type = "c", text = "#arccw.cvar.hud_3dfun.desc" },
{ type = "b", text = "#arccw.cvar.hud_3dfun_lite", var = "arccw_hud_3dfun_lite" },
{ type = "c", text = "#arccw.cvar.hud_3dfun_lite.desc" },
{ type = "b", text = "#arccw.cvar.hud_fcgbars", var = "arccw_hud_fcgbars" },
{ type = "b", text = "#arccw.cvar.hud_fcgabbrev", var = "arccw_hud_fcgabbrev" },
{ type = "b", text = "#arccw.cvar.hud_3dfun_ammotype", var = "arccw_hud_3dfun_ammotype" },
{ type = "c", text = "#arccw.cvar.hud_3dfun_ammotype.desc" },
{ type = "f", text = "#arccw.cvar.hud_3dfun_right", var = "arccw_hud_3dfun_right", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.hud_3dfun_up", var = "arccw_hud_3dfun_up", min = -5, max = 5 },
{ type = "f", text = "#arccw.cvar.hud_3dfun_forward", var = "arccw_hud_3dfun_forward", min = -5, max = 5 },
}
local CrosshairPanel = {
{ type = "h", text = "#arccw.clientcfg" },
{ type = "b", text = "#arccw.cvar.crosshair", var = "arccw_crosshair" },
{ type = "f", text = "#arccw.cvar.crosshair_length", var = "arccw_crosshair_length", min = 0, max = 10 },
{ type = "f", text = "#arccw.cvar.crosshair_thickness", var = "arccw_crosshair_thickness", min = 0, max = 2 },
{ type = "f", text = "#arccw.cvar.crosshair_gap", var = "arccw_crosshair_gap", min = 0, max = 2 },
{ type = "b", text = "#arccw.cvar.crosshair_dot", var = "arccw_crosshair_dot" },
{ type = "b", text = "#arccw.cvar.crosshair_shotgun", var = "arccw_crosshair_shotgun" },
{ type = "b", text = "#arccw.cvar.crosshair_equip", var = "arccw_crosshair_equip" },
{ type = "b", text = "#arccw.cvar.crosshair_static", var = "arccw_crosshair_static" },
{ type = "b", text = "#arccw.cvar.crosshair_trueaim", var = "arccw_crosshair_trueaim" },
{ type = "b", text = "#arccw.cvar.crosshair_clump", var = "arccw_crosshair_clump" },
{ type = "b", text = "#arccw.cvar.crosshair_clump_outline", var = "arccw_crosshair_clump_outline" },
{ type = "b", text = "#arccw.cvar.crosshair_clump_always", var = "arccw_crosshair_clump_always" },
{ type = "b", text = "#arccw.cvar.crosshair_aa", var = "arccw_crosshair_aa" },
{ type = "b", text = "#arccw.cvar.crosshair_tilt", var = "arccw_crosshair_tilt" },
{ type = "b", text = "#arccw.cvar.crosshair_prong_top", var = "arccw_crosshair_prong_top" },
{ type = "b", text = "#arccw.cvar.crosshair_prong_left", var = "arccw_crosshair_prong_left" },
{ type = "b", text = "#arccw.cvar.crosshair_prong_right", var = "arccw_crosshair_prong_right" },
{ type = "b", text = "#arccw.cvar.crosshair_prong_bottom", var = "arccw_crosshair_prong_bottom" },
{ type = "m", text = "#arccw.cvar.crosshair_clr", r = "arccw_crosshair_clr_r", g = "arccw_crosshair_clr_g", b = "arccw_crosshair_clr_b", a = "arccw_crosshair_clr_a" },
{ type = "f", text = "#arccw.cvar.crosshair_outline", var = "arccw_crosshair_outline", min = 0, max = 4 },
{ type = "m", text = "#arccw.cvar.crosshair_outline_clr", r = "arccw_crosshair_outline_r", g = "arccw_crosshair_outline_g", b = "arccw_crosshair_outline_b", a = "arccw_crosshair_outline_a" },
}
local BindsPanel = {
{ type = "h", text = "#arccw.bindhelp" },
{ type = "b", text = "#arccw.cvar.nohl2flash", var = "arccw_nohl2flash" },
{ type = "b", text = "#arccw.cvar.altsafety", var = "arccw_altsafety" },
{ type = "b", text = "#arccw.cvar.altbindsonly", var = "arccw_altbindsonly" },
{ type = "c", text = "#arccw.cvar.altbindsonly.desc" },
{ type = "d", text = "#arccw.bind.firemode", var = "arccw_firemode" },
{ type = "d", text = "#arccw.bind.zoom_in", var = "arccw_zoom_in" },
{ type = "d", text = "#arccw.bind.zoom_out", var = "arccw_zoom_out" },
{ type = "d", text = "#arccw.bind.toggle_inv", var = "arccw_toggle_inv" },
{ type = "d", text = "#arccw.bind.switch_scope", var = "arccw_switch_scope" },
{ type = "d", text = "#arccw.bind.toggle_ubgl", var = "arccw_toggle_ubgl" },
{ type = "d", text = "#arccw.bind.melee", var = "arccw_melee" },
{ type = "d", text = "#arccw.bind.toggle_att", var = "arccw_toggle_att" },
}
local ServerPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "o", text = "#arccw.cvar.enable_customization", var = "arccw_enable_customization", sv = true,
choices = {[-1] = "#arccw.cvar.enable_customization.-1", [0] = "#arccw.cvar.enable_customization.0", [1] = "#arccw.cvar.enable_customization.1"}},
{ type = "c", text = "#arccw.cvar.enable_customization.desc" },
{ type = "b", text = "#arccw.cvar.truenames", var = "arccw_truenames", sv = true },
{ type = "b", text = "#arccw.cvar.equipmentammo", var = "arccw_equipmentammo", sv = true },
{ type = "c", text = "#arccw.cvar.equipmentammo.desc" },
{ type = "b", text = "#arccw.cvar.equipmentsingleton", var = "arccw_equipmentsingleton", sv = true },
{ type = "c", text = "#arccw.cvar.equipmentsingleton.desc" },
{ type = "i", text = "#arccw.cvar.equipmenttime", var = "arccw_equipmenttime", min = 15, max = 3600, sv = true },
{ type = "b", text = "#arccw.cvar.throwinertia", var = "arccw_throwinertia", sv = true },
{ type = "o", text = "#arccw.cvar.freeaim", var = "arccw_freeaim", sv = true,
choices = {[0] = "#arccw.combobox.disabled", [1] = "#arccw.cvar.freeaim.1", [2] = "#arccw.cvar.freeaim.2"}},
{ type = "b", text = "#arccw.cvar.override_crosshair_off", var = "arccw_override_crosshair_off", sv = true },
{ type = "b", text = "#arccw.cvar.override_hud_off", var = "arccw_override_hud_off", sv = true },
{ type = "b", text = "#arccw.cvar.override_barrellength", var = "arccw_override_nearwall", sv = true },
{ type = "b", text = "#arccw.cvar.doorbust", var = "arccw_doorbust", sv = true },
{ type = "b", text = "#arccw.cvar.override_lunge_off", var = "arccw_override_lunge_off", sv = true },
{ type = "c", text = "#arccw.cvar.override_lunge_off.desc" },
--[[]
{ type = "b", text = "#arccw.cvar.limityear_enable", var = "arccw_limityear_enable", sv = true },
{ type = "i", text = "#arccw.cvar.limityear", var = "arccw_limityear", min = 1800, max = 2100, sv = true },
{ type = "c", text = "#arccw.cvar.limityear.desc"},
]]
{ type = "b", text = "#arccw.cvar.bodydamagecancel", var = "arccw_bodydamagemult_cancel", sv = true},
{ type = "c", text = "#arccw.cvar.bodydamagecancel.desc"},
{ type = "b", text = "#arccw.cvar.desync", var = "arccw_desync", sv = true },
{ type = "c", text = "#arccw.cvar.desync.desc" },
{ type = "f", text = "#arccw.cvar.weakensounds", var = "arccw_weakensounds", min = -20, max = 30, sv = true},
{ type = "c", text = "#arccw.cvar.weakensounds.desc" },
{ type = "b", text = "#arccw.cvar.reloadincust", var = "arccw_reloadincust", sv = true },
{ type = "c", text = "#arccw.cvar.reloadincust.desc" },
{ type = "b", text = "#arccw.cvar.aimassist", var = "arccw_aimassist", sv = true },
{ type = "c", text = "#arccw.cvar.aimassist.desc" },
{ type = "b", text = "#arccw.cvar.aimassist_head", var = "arccw_aimassist_head", sv = true },
{ type = "f", text = "#arccw.cvar.aimassist_cone", var = "arccw_aimassist_cone", min = 0, max = 360, sv = true},
{ type = "f", text = "#arccw.cvar.aimassist_distance", var = "arccw_aimassist_distance", min = 128, max = 4096, sv = true},
{ type = "f", text = "#arccw.cvar.aimassist_intensity", var = "arccw_aimassist_intensity", min = 0, max = 10, sv = true},
}
local AmmoPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "o", text = "#arccw.cvar.ammo_detonationmode", var = "arccw_ammo_detonationmode", sv = true,
choices = {[-1] = "#arccw.cvar.ammo_detonationmode.-1", [0] = "#arccw.cvar.ammo_detonationmode.0", [1] = "#arccw.cvar.ammo_detonationmode.1", [2] = "#arccw.cvar.ammo_detonationmode.2"}},
{ type = "b", text = "#arccw.cvar.ammo_autopickup", var = "arccw_ammo_autopickup", sv = true },
{ type = "b", text = "#arccw.cvar.ammo_largetrigger", var = "arccw_ammo_largetrigger", sv = true },
{ type = "f", text = "#arccw.cvar.ammo_rareskin", var = "arccw_ammo_rareskin", min = 0, max = 1, sv = true },
{ type = "b", text = "#arccw.cvar.ammo_chaindet", var = "arccw_ammo_chaindet", sv = true },
{ type = "b", text = "#arccw.cvar.ammo_replace", var = "arccw_ammo_replace", sv = true },
{ type = "f", text = "#arccw.cvar.mult_ammohealth", var = "arccw_mult_ammohealth", min = -1, max = 10, sv = true },
{ type = "f", text = "#arccw.cvar.mult_ammoamount", var = "arccw_mult_ammoamount", min = 0.1, max = 10, sv = true },
}
local AttsPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "h", text = "#arccw.attdesc1" },
{ type = "h", text = "#arccw.attdesc2" },
{ type = "b", text = "#arccw.cvar.attinv_free", var = "arccw_attinv_free", sv = true },
{ type = "b", text = "#arccw.cvar.attinv_lockmode", var = "arccw_attinv_lockmode", sv = true },
{ type = "o", text = "#arccw.cvar.attinv_loseondie", var = "arccw_attinv_loseondie", sv = true,
choices = {[0] = "#arccw.combobox.disabled", [1] = "#arccw.cvar.attinv_loseondie.1", [2] = "#arccw.cvar.attinv_loseondie.2"}},
{ type = "i", text = "#arccw.cvar.attinv_giveonspawn", var = "arccw_attinv_giveonspawn", min = 0, max = 100, sv = true },
{ type = "i", text = "#arccw.cvar.atts_pickx", var = "arccw_atts_pickx", min = 0, max = 10, sv = true },
{ type = "c", text = "#arccw.cvar.atts_pickx.desc", sv = true },
{ type = "b", text = "#arccw.cvar.enable_dropping", var = "arccw_enable_dropping", sv = true },
{ type = "b", text = "#arccw.cvar.atts_spawnrand", var = "arccw_atts_spawnrand", sv = true },
{ type = "b", text = "#arccw.cvar.atts_ubglautoload", var = "arccw_atts_ubglautoload", sv = true },
{ type = "p", text = "#arccw.blacklist", func = function() RunConsoleCommand("arccw_blacklist") end },
}
local DevPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "h", text = "#arccw.dev_info1" },
{ type = "h", text = "#arccw.dev_info2" },
{ type = "b", text = "#arccw.cvar.dev_reloadonadmincleanup", var = "arccw_reloadatts_mapcleanup", sv = true },
{ type = "c", text = "#arccw.cvar.dev_reloadonadmincleanup.desc" },
{ type = "b", text = "#arccw.cvar.dev_registerentities", var = "arccw_reloadatts_registerentities", sv = true },
{ type = "c", text = "#arccw.cvar.dev_registerentities.desc" },
{ type = "b", text = "#arccw.cvar.dev_showignored", var = "arccw_reloadatts_showignored", sv = true },
{ type = "c", text = "#arccw.cvar.dev_showignored.desc" },
{ type = "b", text = "#arccw.cvar.dev_debug", var = "arccw_dev_debug", sv = true },
{ type = "c", text = "#arccw.cvar.dev_debug.desc" },
--{ type = "b", text = "Customization Menu Overhaul beta", var = "arccw_dev_cust2beta", sv = true },
--{ type = "c", text = "Enable the customization menu overhaul. Remove this convar when we done doe" },
{ type = "b", text = "#arccw.cvar.dev_alwaysready", var = "arccw_dev_alwaysready", sv = true },
{ type = "c", text = "#arccw.cvar.dev_alwaysready.desc" },
{ type = "b", text = "#arccw.cvar.dev_benchgun", var = "arccw_dev_benchgun", sv = true },
{ type = "c", text = "#arccw.cvar.dev_benchgun.desc" },
{ type = "t", text = "#arccw.cvar.dev_benchgun_custom", var = "arccw_dev_benchgun_custom", sv = true },
{ type = "c", text = "#arccw.cvar.dev_benchgun_custom.desc" },
{ type = "o", text = "Firing Info", var = "arccw_dev_shootinfo", sv = true,
choices = {[0] = "#arccw.combobox.disabled", [1] = "1 - Damage", [2] = "2 - Penetration", [3] = "3 - Dispersion"}},
{ type = "c", text = "Show information when shooting the weapon. Requires 'developer' ConVar to be enabled." },
{ type = "p", text = "#arccw.cvar.dev_reloadatts", func = function() RunConsoleCommand("arccw_reloadatts") end },
{ type = "h", text = "#arccw.cvar.dev_reloadatts.desc" },
{ type = "p", text = "#arccw.cvar.dev_reloadlangs", func = function() RunConsoleCommand("arccw_reloadlangs") end },
{ type = "h", text = "#arccw.cvar.dev_reloadlangs.desc" },
{ type = "p", text = "#arccw.cvar.dev_spawnmenureload", func = function() RunConsoleCommand("spawnmenu_reload") end },
{ type = "h", text = "#arccw.cvar.dev_spawnmenureload.desc" },
}
local ScopesPanel = {
{ type = "h", text = "#arccw.clientcfg" },
{ type = "b", text = "#arccw.cvar.cheapscopes", var = "arccw_cheapscopes" },
{ type = "c", text = "#arccw.cvar.cheapscopesv2.desc" },
{ type = "f", text = "#arccw.cvar.cheapscopesv2_ratio", var = "arccw_cheapscopesv2_ratio", min = 0, max = 1},
{ type = "c", text = "#arccw.cvar.cheapscopesv2_ratio.desc" },
{ type = "b", text = "#arccw.cvar.drawbarrel", var = "arccw_drawbarrel" },
{ type = "f", text = "#arccw.cvar.vm_addads", var = "arccw_vm_add_ads", min = -0.5, max = 9 },
{ type = "b", text = "#arccw.cvar.scopepp", var = "arccw_scopepp" },
{ type = "b", text = "#arccw.cvar.thermalpp", var = "arccw_thermalpp" },
{ type = "b", text = "#arccw.cvar.scopepp_refract", var = "arccw_scopepp_refract" },
{ type = "f", text = "#arccw.cvar.scopepp_refract_ratio", var = "arccw_scopepp_refract_ratio", min = -1, max = 2 },
{ type = "m", text = "#arccw.cvar.scope_clr", r = "arccw_scope_r", g = "arccw_scope_g", b = "arccw_scope_b" },
}
local MultsPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "f", text = "#arccw.cvar.mult_damage", var = "arccw_mult_damage", min = 0, max = 10, sv = true },
{ type = "f", text = "#arccw.cvar.mult_npcdamage", var = "arccw_mult_npcdamage", min = 0, max = 5, sv = true },
{ type = "f", text = "#arccw.cvar.mult_range", var = "arccw_mult_range", min = 0.1, max = 5, sv = true },
{ type = "f", text = "#arccw.cvar.mult_recoil", var = "arccw_mult_recoil", min = 0, max = 5, sv = true },
{ type = "f", text = "#arccw.cvar.mult_penetration", var = "arccw_mult_penetration", min = 0, max = 5, sv = true },
{ type = "f", text = "#arccw.cvar.mult_hipfire", var = "arccw_mult_hipfire", min = 0, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.mult_accuracy", var = "arccw_mult_accuracy", min = 0, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.mult_movedisp", var = "arccw_mult_movedisp", min = 0, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.mult_reloadtime", var = "arccw_mult_reloadtime", min = 0.2, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.mult_sighttime", var = "arccw_mult_sighttime", min = 0.25, max = 3, sv = true },
{ type = "i", text = "#arccw.cvar.mult_defaultammo", var = "arccw_mult_defaultammo", min = 0, max = 10, sv = true },
{ type = "f", text = "#arccw.cvar.mult_attchance", var = "arccw_mult_attchance", min = 0, max = 10, sv = true },
{ type = "f", text = "#arccw.cvar.mult_heat", var = "arccw_mult_heat", min = 0, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.mult_crouchdisp", var = "arccw_mult_crouchdisp", min = 0, max = 1, sv = true },
{ type = "f", text = "#arccw.cvar.mult_crouchrecoil", var = "arccw_mult_crouchrecoil", min = 0, max = 1, sv = true },
{ type = "f", text = "#arccw.cvar.mult_movespeed", var = "arccw_mult_movespeed", min = 0, max = 1, sv = true },
{ type = "f", text = "#arccw.cvar.mult_movespeedads", var = "arccw_mult_movespeedads", min = 0, max = 1, sv = true },
{ type = "f", text = "#arccw.cvar.mult_movespeedfire", var = "arccw_mult_movespeedfire", min = 0, max = 1, sv = true },
{ type = "f", text = "#arccw.cvar.mult_meleedamage", var = "arccw_mult_meleedamage", min = 0, max = 4, sv = true },
{ type = "f", text = "#arccw.cvar.mult_meleetime", var = "arccw_mult_meleetime", min = 0, max = 3, sv = true },
{ type = "f", text = "#arccw.cvar.mult_malfunction", var = "arccw_mult_malfunction", min = 0, max = 10, sv = true },
{ type = "f", text = "#arccw.cvar.mult_rpm", var = "arccw_mult_rpm", min = 0.1, max = 5, sv = true },
{ type = "c", text = "#arccw.cvar.mult_rpm.desc" },
{ type = "b", text = "#arccw.cvar.mult_startunloaded", var = "arccw_mult_startunloaded", sv = true },
{ type = "b", text = "#arccw.cvar.mult_shootwhilesprinting", var = "arccw_mult_shootwhilesprinting", sv = true },
{ type = "o", text = "#arccw.cvar.malfunction", var = "arccw_malfunction", sv = true,
choices = {[0] = "#arccw.cvar.malfunction.0", [1] = "#arccw.cvar.malfunction.1", [2] = "#arccw.cvar.malfunction.2"}},
{ type = "b", text = "#arccw.cvar.mult_bottomlessclip", var = "arccw_mult_bottomlessclip", sv = true },
{ type = "c", text = "Weapon feeds from reserve." },
{ type = "b", text = "#arccw.cvar.mult_infiniteammo", var = "arccw_mult_infiniteammo", sv = true },
{ type = "c", text = "Infinite reserve ammo." },
{ type = "b", text = "#arccw.cvar.enable_sway", var = "arccw_enable_sway", sv = true },
{ type = "c", text = "#arccw.cvar.enable_sway.desc" },
{ type = "f", text = "#arccw.cvar.add_sway", var = "arccw_add_sway", min = 0, max = 5, sv = true },
{ type = "f", text = "#arccw.cvar.mult_sway", var = "arccw_mult_sway", min = 0, max = 10, sv = true },
}
local HelpPanel = {
{ type = "h", text = "Links to the ArcCW online wiki." },
{ type = "url", text = "Checking for Addon Conflicts",
url = "https://github.com/HaodongMo/ArcCW/wiki/Help-&-Troubleshooting#checking-for-addon-conflicts", },
{ type = "c", text = "Check for addon conflicts that may be causing issues with ArcCW weapons." },
{ type = "url", text = "Cheap Scopes",
url = "https://github.com/HaodongMo/ArcCW/wiki/Help-&-Troubleshooting#cheap-scopes", },
{ type = "c", text = "'Why are my scopes so blurry?'" },
{ type = "url", text = "Underbarrel Weapons",
url = "https://github.com/HaodongMo/ArcCW/wiki/Help-&-Troubleshooting#underbarrel-weapons", },
{ type = "c", text = "'Why aren't my underbarrels weapons working?'" },
{ type = "c", text = "'How do I use my underbarrel weapons?'" },
{ type = "url", text = "Free Attachments",
url = "https://github.com/HaodongMo/ArcCW/wiki/Help-&-Troubleshooting#free-attachments", },
{ type = "c", text = "'Why are my attachments red?'" },
{ type = "url", text = "cam.End3D errors",
url = "https://github.com/HaodongMo/ArcCW/wiki/Help-&-Troubleshooting#camend3d-errors", },
{ type = "c", text = "'Warning: Calling cam.End3D because someone forgot to!'" },
}
local MultPresets = {
["#preset.default"] = { -- this needs fills
arccw_mult_damage = "1",
arccw_mult_npcdamage = "1",
arccw_mult_range = "1",
arccw_mult_recoil = "1",
arccw_mult_penetration = "1",
arccw_mult_hipfire = "1",
arccw_mult_movedisp = "1",
arccw_mult_reloadtime = "1",
arccw_mult_sighttime = "1",
arccw_mult_defaultclip = "1",
arccw_mult_attchance = "1",
arccw_mult_crouchdisp = "1",
arccw_mult_crouchrecoil = "1",
arccw_mult_movespeed = "1",
arccw_mult_movespeedads = "1",
arccw_mult_movespeedfire = "1",
arccw_mult_heat = "1",
arccw_mult_meleetime = "1",
arccw_mult_meleedamage = "1",
arccw_mult_malfunction = "1",
arccw_mult_startunloaded = "0",
arccw_mult_shootwhilesprinting = "0",
arccw_mult_bottomlessclip = "0",
arccw_mult_infiniteammo = "0",
}
}
local NPCsPanel = {
{ type = "h", text = "#arccw.adminonly" },
{ type = "b", text = "Replace NPC Weapons", var = "arccw_npc_replace", sv = true },
{ type = "b", text = "NPC Attachments", var = "arccw_npc_atts", sv = true },
}
function ArcCW.NetworkConvar(convar, value, p)
if IsValid(LocalPlayer()) and !LocalPlayer():IsAdmin() then return end
if (p.TickCreated or 0) == UnPredictedCurTime() then return end
if value == true or value == false then
value = value and 1 or 0
end
if IsColor(value) then
value = tostring(value.r) .. " " .. tostring(value.g) .. " " .. tostring(value.b) .. " " .. tostring(value.a)
end
local command = convar .. " " .. tostring(value)
local timername = "change" .. convar
if timer.Exists(timername) then
timer.Remove(timername)
end
timer.Create(timername, 0.25, 1, function()
net.Start("arccw_sendconvar")
net.WriteString(command)
net.SendToServer()
end)
end
function ArcCW.GeneratePanelElements(panel, table)
local AddControl = {
["h"] = function(p, d) return p:Help(d.text) end,
["c"] = function(p, d) return p:ControlHelp(d.text) end,
["b"] = function(p, d) return p:CheckBox(d.text, d.var) end,
["i"] = function(p, d) return p:NumSlider(d.text, d.var, d.min, d.max, 0) end,
["f"] = function(p, d) return p:NumSlider(d.text, d.var, d.min, d.max, 2) end,
["m"] = function(p, d) --return p:AddControl("color", { Label = d.text, Red = d.r, Green = d.g, Blue = d.b, Alpha = d.a })
local ctrl = vgui.Create("DColorMixer", p)
ctrl:SetLabel( d.text ) ctrl:SetConVarR( d.r ) ctrl:SetConVarG( d.g ) ctrl:SetConVarB( d.b ) ctrl:SetConVarA( d.a )
p:AddItem( ctrl ) return ctrl
end,
["p"] = function(p, d) local b = p:Button(d.text) b.DoClick = d.func return b end,
["url"] = function(p, d) local b = p:Button(d.text) b.DoClick = function() gui.OpenURL(d.url) end return b end,
["t"] = function(p, d) return p:TextEntry(d.text, d.var) end,
["o"] = function(p, d) local cb = p:ComboBox(d.text, d.var) for k, v in pairs(d.choices) do cb:AddChoice(v, k) end return cb end,
["d"] = function(p, d)
local s = vgui.Create("DSizeToContents", p) s:SetSizeX(false) s:Dock(TOP) s:InvalidateLayout()
local l = vgui.Create("DLabel", s) l:SetText(d.text) l:SetTextColor(Color(0, 0, 0)) l:Dock(TOP) l:SetContentAlignment(5)
local bd = vgui.Create("DBinder", s)
if input.LookupBinding(d.var) then bd:SetValue(input.GetKeyCode(input.LookupBinding(d.var))) end
bd.OnChange = function(b, k)
if k and input.GetKeyName(k) then
local str = input.LookupKeyBinding(k)
if str then
str = string.Replace(str, d.var .. "; ", "")
str = string.Replace(str, d.var, "")
chat.AddText(Color(255, 255, 255), language.GetPhrase("arccw.bind.msg"), Color(255, 128, 0), "bind " .. input.GetKeyName(k) .. " \"" .. str .. "; " .. d.var .. "\"")
else
chat.AddText(Color(255, 255, 255), language.GetPhrase("arccw.bind.msg"), Color(255, 128, 0), "bind " .. input.GetKeyName(k) .. " " .. d.var .. "")
end
end
end
bd:Dock(TOP) p:AddItem(s) return s end
}
local concommands = {
["b"] = true,
["i"] = true,
["f"] = true,
["m"] = true,
["t"] = true,
}
for _, data in SortedPairs(table) do
local p = AddControl[data.type](panel, data)
if concommands[data.type] and data.sv then
p.TickCreated = UnPredictedCurTime()
if data.type == "b" then
p.OnChange = function(self, bval)
ArcCW.NetworkConvar(data.var, bval, self)
end
elseif data.type == "i" or data.type == "f" or data.type == "m" or data.type == "t" then
p.OnValueChanged = function(self, bval)
ArcCW.NetworkConvar(data.var, bval, self)
end
end
end
end
end
local CrosshairPresets = {
["#preset.default"] = {
arccw_crosshair_length = "4",
arccw_crosshair_thickness = "1",
arccw_crosshair_gap = "1",
arccw_crosshair_dot = "1",
arccw_crosshair_shotgun = "1",
arccw_crosshair_equip = "1",
arccw_crosshair_static = "0",
arccw_crosshair_clump = "0",
arccw_crosshair_clump_outline = "0",
arccw_crosshair_clump_always = "0",
arccw_crosshair_clr_r = "255",
arccw_crosshair_clr_g = "255",
arccw_crosshair_clr_b = "255",
arccw_crosshair_clr_a = "255",
arccw_crosshair_outline = "2",
arccw_crosshair_outline_r = "0",
arccw_crosshair_outline_g = "0",
arccw_crosshair_outline_b = "0",
arccw_crosshair_outline_a = "255",
arccw_scope_r = "255",
arccw_scope_g = "0",
arccw_scope_b = "0",
},
["#arccw.crosshair.tfa"] = {
arccw_crosshair_length = "8",
arccw_crosshair_thickness = "0.4",
arccw_crosshair_gap = "1",
arccw_crosshair_dot = "0",
arccw_crosshair_shotgun = "0",
arccw_crosshair_equip = "0",
arccw_crosshair_static = "0",
arccw_crosshair_clump = "0",
arccw_crosshair_clump_outline = "0",
arccw_crosshair_clump_always = "0",
arccw_crosshair_clr_r = "255",
arccw_crosshair_clr_g = "255",
arccw_crosshair_clr_b = "255",
arccw_crosshair_clr_a = "255",
arccw_crosshair_outline = "2",
arccw_crosshair_outline_r = "0",
arccw_crosshair_outline_g = "0",
arccw_crosshair_outline_b = "0",
arccw_crosshair_outline_a = "255",
arccw_scope_r = "255",
arccw_scope_g = "0",
arccw_scope_b = "0",
},
["#arccw.crosshair.cw2"] = {
arccw_crosshair_length = "3.5",
arccw_crosshair_thickness = "0.4",
arccw_crosshair_gap = "1",
arccw_crosshair_dot = "0",
arccw_crosshair_shotgun = "0",
arccw_crosshair_equip = "0",
arccw_crosshair_static = "0",
arccw_crosshair_clump = "1",
arccw_crosshair_clump_outline = "1",
arccw_crosshair_clump_always = "0",
arccw_crosshair_clr_r = "255",
arccw_crosshair_clr_g = "255",
arccw_crosshair_clr_b = "255",
arccw_crosshair_clr_a = "200",
arccw_crosshair_outline = "2",
arccw_crosshair_outline_r = "0",
arccw_crosshair_outline_g = "0",
arccw_crosshair_outline_b = "0",
arccw_crosshair_outline_a = "200",
arccw_scope_r = "255",
arccw_scope_g = "0",
arccw_scope_b = "0",
},
["#arccw.crosshair.cs"] = {
arccw_crosshair_length = "3",
arccw_crosshair_thickness = "0.4",
arccw_crosshair_gap = "0.4",
arccw_crosshair_dot = "0",
arccw_crosshair_shotgun = "0",
arccw_crosshair_equip = "0",
arccw_crosshair_static = "1",
arccw_crosshair_clump = "0",
arccw_crosshair_clump_outline = "0",
arccw_crosshair_clump_always = "0",
arccw_crosshair_clr_r = "0",
arccw_crosshair_clr_g = "255",
arccw_crosshair_clr_b = "0",
arccw_crosshair_clr_a = "255",
arccw_crosshair_outline = "0",
arccw_crosshair_outline_r = "0",
arccw_crosshair_outline_g = "0",
arccw_crosshair_outline_b = "0",
arccw_crosshair_outline_a = "0",
arccw_scope_r = "255",
arccw_scope_g = "0",
arccw_scope_b = "0",
},
["#arccw.crosshair.light"] = {
arccw_crosshair_length = "4",
arccw_crosshair_thickness = "0.8",
arccw_crosshair_gap = "1",
arccw_crosshair_dot = "0",
arccw_crosshair_shotgun = "1",
arccw_crosshair_equip = "1",
arccw_crosshair_static = "0",
arccw_crosshair_clump = "1",
arccw_crosshair_clump_outline = "1",
arccw_crosshair_clump_always = "0",
arccw_crosshair_clr_r = "255",
arccw_crosshair_clr_g = "255",
arccw_crosshair_clr_b = "255",
arccw_crosshair_clr_a = "200",
arccw_crosshair_outline = "2",
arccw_crosshair_outline_r = "0",
arccw_crosshair_outline_g = "0",
arccw_crosshair_outline_b = "0",
arccw_crosshair_outline_a = "200",
arccw_scope_r = "255",
arccw_scope_g = "0",
arccw_scope_b = "0",
},
}
local ViewmodelPresets = {
["#preset.default"] = {
arccw_vm_coolsway = "1",
arccw_vm_coolview = "1",
arccw_vm_right = "0",
arccw_vm_forward = "0",
arccw_vm_up = "0",
arccw_vm_look_xmult = "1",
arccw_vm_look_ymult = "1",
arccw_vm_sway_xmult = "1",
arccw_vm_sway_ymult = "1",
arccw_vm_sway_zmult = "1",
arccw_vm_sway_speedmult = "1",
arccw_vm_coolview_mult = "1",
}
}
function ArcCW_Options_Bullet(panel)
ArcCW.GeneratePanelElements(panel, BulletPanel)
end
function ArcCW_Options_Client(panel)
ArcCW.GeneratePanelElements(panel, ClientPanel)
end
function ArcCW_Options_Perf(panel)
ArcCW.GeneratePanelElements(panel, PerformancePanel)
end
function ArcCW_Options_Viewmodel(panel, no_preset)
if !no_preset then
panel:AddControl("ComboBox", {
MenuButton = "1",
Label = "#Presets",
Folder = "arccw_vm",
CVars = { "" },
Options = ViewmodelPresets
})
end
ArcCW.GeneratePanelElements(panel, ViewmodelPanel)
end
function ArcCW_Options_HUD(panel)
ArcCW.GeneratePanelElements(panel, HudPanel)
end
function ArcCW_Options_Dev(panel)
ArcCW.GeneratePanelElements(panel, DevPanel)
end
function ArcCW_Options_Crosshair(panel, no_preset)
if !no_preset then
panel:AddControl("ComboBox", {
MenuButton = "1",
Label = "#Presets",
Folder = "arccw_crosshair",
CVars = { "" },
Options = CrosshairPresets
})
end
ArcCW.GeneratePanelElements(panel, CrosshairPanel)
end
function ArcCW_Options_Server(panel)
ArcCW.GeneratePanelElements(panel, ServerPanel)
end
function ArcCW_Options_Ammo(panel)
ArcCW.GeneratePanelElements(panel, AmmoPanel)
end
function ArcCW_Options_Mults(panel, no_preset)
if !no_preset then
panel:AddControl("ComboBox", {
MenuButton = "1",
Label = "#Presets",
Folder = "arccw_mults",
CVars = { "" },
Options = MultPresets
})
end
ArcCW.GeneratePanelElements(panel, MultsPanel)
end
function ArcCW_Options_Atts(panel)
ArcCW.GeneratePanelElements(panel, AttsPanel)
end
function ArcCW_Options_NPC(panel)
ArcCW.GeneratePanelElements(panel, NPCsPanel)
end
function ArcCW_Options_Binds(panel)
ArcCW.GeneratePanelElements(panel, BindsPanel)
end
function ArcCW_Options_Scopes(panel)
ArcCW.GeneratePanelElements(panel, ScopesPanel)
end
function ArcCW_Options_Help(panel)
ArcCW.GeneratePanelElements(panel, HelpPanel)
end
ArcCW.ClientMenus = {
["ArcCW_Options_Client"] = { text = "#arccw.menus.client", func = ArcCW_Options_Client, tbl = ClientPanel },
["ArcCW_Options_Help"] = { text = "Help & Troubleshooting", func = ArcCW_Options_Help, tbl = HelpPanel },
["ArcCW_Options_Bullet"] = { text = "#arccw.menus.bullet", func = ArcCW_Options_Bullet, tbl = BulletPanel },
["ArcCW_Options_Perf"] = { text = "#arccw.menus.perf", func = ArcCW_Options_Perf, tbl = PerformancePanel },
["ArcCW_Options_Viewmodel"] = { text = "#arccw.menus.vmodel", func = ArcCW_Options_Viewmodel, tbl = ViewmodelPanel },
["ArcCW_Options_HUD"] = { text = "#arccw.menus.hud", func = ArcCW_Options_HUD, tbl = HudPanel },
["ArcCW_Options_Crosshair"] = { text = "#arccw.menus.xhair", func = ArcCW_Options_Crosshair, tbl = CrosshairPanel },
["ArcCW_Options_Server"] = { text = "#arccw.menus.server", func = ArcCW_Options_Server, tbl = ServerPanel },
["ArcCW_Options_Ammo"] = { text = "#arccw.menus.ammo", func = ArcCW_Options_Ammo, tbl = AmmoPanel },
["ArcCW_Options_Atts"] = { text = "#arccw.menus.atts", func = ArcCW_Options_Atts, tbl = AttsPanel },
["ArcCW_Options_Mults"] = { text = "#arccw.menus.mults", func = ArcCW_Options_Mults, tbl = MultsPanel },
["ArcCW_Options_Dev"] = { text = "#arccw.menus.dev", func = ArcCW_Options_Dev, tbl = DevPanel },
["ArcCW_Options_NPC"] = { text = "#arccw.menus.npcs", func = ArcCW_Options_NPC, tbl = NPCsPanel },
["ArcCW_Options_Binds"] = { text = "#arccw.menus.binds", func = ArcCW_Options_Binds, tbl = BindsPanel },
["ArcCW_Options_Scopes"] = { text = "#arccw.menus.scopes", func = ArcCW_Options_Scopes, tbl = ScopesPanel },
}
hook.Add("PopulateToolMenu", "ArcCW_Options", function()
for menu, data in pairs(ArcCW.ClientMenus) do
spawnmenu.AddToolMenuOption("Options", "ArcCW", menu, data.text, "", "", data.func)
end
end)
-- As of 2023-11-12, this feature is only available on dev branch.
-- Won't break anything on release branch though.
list.Set("ContentCategoryIcons", "ArcCW - Ammo", "arccw/icon_16.png")
list.Set("ContentCategoryIcons", "ArcCW - Attachments", "arccw/icon_16.png")
-- Give all categories with ArcCW weapons our icon unless one is already set
local first_populate = true
hook.Add("PopulateWeapons", "ArcCW_ContentCategoryIcons", function()
if !first_populate then return end
for i, wep in pairs(weapons.GetList()) do
local weap = weapons.Get(wep.ClassName)
if weap and weap.ArcCW then
local cat = weap.Category
if cat and !list.HasEntry("ContentCategoryIcons", cat) then
list.Set("ContentCategoryIcons", cat, "arccw/icon_16.png")
end
end
end
first_populate = false
end)