mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 21:03:46 +03:00
241 lines
7.2 KiB
Lua
241 lines
7.2 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/
|
|
--]]
|
|
|
|
--Easy placement and saving for Chess boards
|
|
if SERVER then AddCSLuaFile() end
|
|
|
|
SWEP.Base = "weapon_base"
|
|
|
|
SWEP.Category = "Game boards"
|
|
SWEP.Author = "my_hat_stinks"
|
|
SWEP.Instructions = "Left click to place a board, right click to remove a board, reload for menu"
|
|
|
|
SWEP.Spawnable = true
|
|
SWEP.AdminOnly = true
|
|
SWEP.AdminSpawnable = true
|
|
|
|
SWEP.Slot = 4
|
|
SWEP.PrintName = "Chess Admin Tool"
|
|
|
|
SWEP.ViewModelFOV = 80
|
|
SWEP.Weight = 5
|
|
SWEP.AutoSwitchTo = false
|
|
SWEP.AutoSwitchFrom = false
|
|
|
|
SWEP.WorldModel = "models/weapons/w_toolgun.mdl"
|
|
SWEP.ViewModel = "models/weapons/c_toolgun.mdl"
|
|
SWEP.UseHands = true
|
|
|
|
SWEP.Primary.Recoil = 1
|
|
SWEP.Primary.Damage = 5
|
|
SWEP.Primary.NumShots = 1
|
|
SWEP.Primary.Cone = 0
|
|
SWEP.Primary.Delay = 1
|
|
|
|
SWEP.Primary.ClipSize = -1
|
|
SWEP.Primary.DefaultClip = -1
|
|
SWEP.Primary.Automatic = false
|
|
SWEP.Primary.Ammo = "none"
|
|
SWEP.Primary.ClipMax = -1
|
|
|
|
SWEP.Secondary.ClipSize = -1
|
|
SWEP.Secondary.DefaultClip = -1
|
|
SWEP.Secondary.Automatic = false
|
|
SWEP.Secondary.Ammo = "none"
|
|
SWEP.Secondary.ClipMax = -1
|
|
|
|
SWEP.DeploySpeed = 1.5
|
|
|
|
SWEP.PrimaryAnim = ACT_VM_PRIMARYATTACK
|
|
SWEP.ReloadAnim = ACT_VM_RELOAD
|
|
SWEP.HoldType = "pistol"
|
|
|
|
SWEP.GameEntities = {
|
|
{"Chess", "ent_chess_board", {["board"] = Model("models/props_phx/games/chess/board.mdl"), ["table"] = Model("models/props/de_tides/restaurant_table.mdl")}},
|
|
{"Draughts/Checkers", "ent_draughts_board", {["board"] = Model("models/props_phx/games/chess/board.mdl"), ["table"] = Model("models/props/de_tides/restaurant_table.mdl")}},
|
|
}
|
|
function SWEP:SetupDataTables()
|
|
self:NetworkVar( "Int", 0, "EntID" )
|
|
end
|
|
|
|
function SWEP:Initialize()
|
|
self:SetEntID( 1 ) --Chess by default
|
|
end
|
|
function SWEP:PrimaryAttack()
|
|
if SERVER and IsValid( self.Owner ) then
|
|
if not self.Owner:IsAdmin() then
|
|
self.Owner:ChatPrint( "You are not allowed to use this tool!" )
|
|
self:Remove()
|
|
return
|
|
end
|
|
local tr = self.Owner:GetEyeTrace()
|
|
if tr.Hit and tr.HitPos then
|
|
local ent = ents.Create( self.GameEntities[self:GetEntID()][2] )
|
|
ent:SetPos( tr.HitPos )
|
|
ent:Spawn()
|
|
end
|
|
end
|
|
end
|
|
function SWEP:SecondaryAttack()
|
|
if SERVER and IsValid( self.Owner ) then
|
|
if not self.Owner:IsAdmin() then
|
|
self.Owner:ChatPrint( "You are not allowed to use this tool!" )
|
|
self:Remove()
|
|
return
|
|
end
|
|
|
|
local tr = self.Owner:GetEyeTrace()
|
|
if IsValid(tr.Entity) and tr.Entity.IsChessEntity then tr.Entity:Remove() end
|
|
end
|
|
end
|
|
function SWEP:Reload()
|
|
if CLIENT then self:OpenMenu() end
|
|
end
|
|
|
|
function SWEP:OpenMenu()
|
|
if SERVER then return end
|
|
if IsValid(self.Menu) then self.Menu:Remove() end
|
|
|
|
self.Menu = vgui.Create( "DFrame" )
|
|
self.Menu:SetTitle( "Chess Admin Tool" )
|
|
self.Menu:SetSize( 300, 80 )
|
|
self.Menu:SetPos( ScrW()/2-150, ScrH()/2-50 )
|
|
self.Menu:MakePopup()
|
|
|
|
local drop = vgui.Create( "DComboBox", self.Menu )
|
|
drop:Dock( TOP )
|
|
drop:SetValue( "Select Board" )
|
|
for i=1,#self.GameEntities do
|
|
drop:AddChoice( self.GameEntities[i][1], i )
|
|
end
|
|
drop.OnSelect = function( s, ind, val, data )
|
|
RunConsoleCommand( "chess_admin_toolent", tostring(data) )
|
|
end
|
|
|
|
local btnpnl = vgui.Create( "DPanel", self.Menu )
|
|
btnpnl:Dock( BOTTOM )
|
|
btnpnl:SetTall( 20 )
|
|
btnpnl.Paint = function() end
|
|
|
|
local close = vgui.Create( "DButton", btnpnl )
|
|
close:SetWidth( 98 )
|
|
close:Dock( RIGHT )
|
|
close:SetText( "Close" )
|
|
close.DoClick = function(s) if IsValid(self) and IsValid(self.Menu) then self.Menu:Remove() end end
|
|
|
|
local rem = vgui.Create( "DButton", btnpnl )
|
|
rem:SetWidth( 98 )
|
|
rem:Dock( LEFT )
|
|
rem:SetText( "Remove tool" )
|
|
rem.DoClick = function(s)
|
|
RunConsoleCommand( "chess_admin_toolremove" )
|
|
if IsValid(self) and IsValid(self.Menu) then self.Menu:Remove() end
|
|
end
|
|
|
|
local sv = vgui.Create( "DButton", btnpnl )
|
|
sv:SetWidth( 98 )
|
|
sv:Dock( FILL )
|
|
sv:SetText( "Save boards" )
|
|
sv.DoClick = function(s)
|
|
RunConsoleCommand( "chess_save" )
|
|
end
|
|
end
|
|
|
|
function SWEP:OnRemove()
|
|
if CLIENT and self.Ghosts then
|
|
for _,v in pairs(self.Ghosts) do if IsValid(v) then v:Remove() end end
|
|
end
|
|
end
|
|
function SWEP:Holster()
|
|
if CLIENT then
|
|
if self.Ghosts then
|
|
for _,v in pairs(self.Ghosts) do if IsValid(v) then v:Remove() end end
|
|
end
|
|
return true
|
|
end
|
|
return true
|
|
end
|
|
|
|
if SERVER then
|
|
local function SetToolEnt( tool, index )
|
|
if tool.GameEntities[index] then tool:SetEntID( index ) end
|
|
end
|
|
concommand.Add( "chess_admin_toolent", function(p,c,a)
|
|
if IsValid(p:GetActiveWeapon()) and p:GetActiveWeapon():GetClass()=="chess_admin_tool" then
|
|
SetToolEnt( p:GetActiveWeapon(), tonumber(a[1]) )
|
|
end
|
|
end)
|
|
concommand.Add( "chess_admin_toolremove", function(p,c,a)
|
|
if IsValid(p:GetActiveWeapon()) and p:GetActiveWeapon():GetClass()=="chess_admin_tool" then p:GetActiveWeapon():Remove() end
|
|
end)
|
|
end
|
|
|
|
if CLIENT then
|
|
surface.CreateFont( "ChessAdmin", {
|
|
font="Arial", size=40,
|
|
})
|
|
local ColBox = Color(0,0,0,150)
|
|
local ColText = Color(255,255,255,255)
|
|
local ColGhost = Color(0,255,0,150)
|
|
function SWEP:DrawHUD()
|
|
local w,h = ScrW(), ScrH()
|
|
local txt = "Board: ".. tostring( self.GameEntities[self:GetEntID()][1] )
|
|
|
|
surface.SetFont( "ChessAdmin" )
|
|
local tw, th = surface.GetTextSize( txt )
|
|
|
|
surface.SetDrawColor( ColBox )
|
|
surface.DrawRect( (w/2) - ((tw/2)+3), h - (th+6), tw+6, th+6 )
|
|
|
|
draw.DrawText( txt, "ChessAdmin", w/2, h-(th)-3, ColText, TEXT_ALIGN_CENTER )
|
|
end
|
|
|
|
function SWEP:DoGhosts()
|
|
local tr = self.Owner:GetEyeTrace()
|
|
if (not tr.Hit) then return end
|
|
|
|
self.Ghosts = self.Ghosts or {}
|
|
local mdltbl = self.GameEntities[self:GetEntID()][3]
|
|
if not mdltbl then return end
|
|
|
|
self.Ghosts[1] = IsValid(self.Ghosts[1]) and self.Ghosts[1] or ClientsideModel( mdltbl.table, RENDERGROUP_BOTH )
|
|
self.Ghosts[1]:SetPos( tr.HitPos )
|
|
self.Ghosts[1]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
|
self.Ghosts[1]:SetColor( ColGhost )
|
|
|
|
local h = 30 --(self.Ghosts[1]:OBBMaxs()[3] - self.Ghosts[1]:OBBMins()[3])
|
|
self.Ghosts[2] = IsValid(self.Ghosts[2]) and self.Ghosts[2] or ClientsideModel( mdltbl.board, RENDERGROUP_BOTH )
|
|
self.Ghosts[2]:SetPos( tr.HitPos+Vector(0,0,h or 50) )
|
|
self.Ghosts[2]:SetAngles( Angle(-90,0,0) )
|
|
self.Ghosts[2]:SetModelScale( 0.35, 0 )
|
|
self.Ghosts[2]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
|
self.Ghosts[2]:SetColor( ColGhost )
|
|
|
|
self.Ghosts[3] = IsValid(self.Ghosts[3]) and self.Ghosts[3] or ClientsideModel( "models/nova/chair_plastic01.mdl", RENDERGROUP_BOTH )
|
|
self.Ghosts[3]:SetPos( tr.HitPos+ (self.Ghosts[2]:GetRight()*40) )
|
|
self.Ghosts[3]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
|
self.Ghosts[3]:SetColor( ColGhost )
|
|
|
|
self.Ghosts[4] = IsValid(self.Ghosts[4]) and self.Ghosts[4] or ClientsideModel( "models/nova/chair_plastic01.mdl", RENDERGROUP_BOTH )
|
|
self.Ghosts[4]:SetPos( tr.HitPos+ (self.Ghosts[2]:GetRight()*-40) )
|
|
self.Ghosts[4]:SetAngles( Angle(0,180,0) )
|
|
self.Ghosts[4]:SetRenderMode( RENDERMODE_TRANSALPHA )
|
|
self.Ghosts[4]:SetColor( ColGhost )
|
|
end
|
|
function SWEP:PostDrawViewModel()
|
|
if LocalPlayer()~=self.Owner then return self.BaseClass.PostDrawViewModel( self ) end
|
|
self:DoGhosts()
|
|
end
|
|
function SWEP:DrawWorldModel()
|
|
if LocalPlayer()~=self.Owner then return self.BaseClass.DrawWorldModel( self ) end
|
|
self:DrawModel()
|
|
self:DoGhosts()
|
|
end
|
|
end |