Files
wnsrc/addons/chess/lua/autorun/sh_chess.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

215 lines
7.9 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/
--]]
if SERVER then
AddCSLuaFile()
AddCSLuaFile( "chess/sh_player_ext.lua" )
AddCSLuaFile( "chess/cl_top.lua" )
AddCSLuaFile( "chess/cl_dermaboard.lua" )
include( "chess/sh_player_ext.lua" )
include( "chess/sv_sql.lua" )
else
include( "chess/sh_player_ext.lua" )
include( "chess/cl_top.lua" )
include( "chess/cl_dermaboard.lua" )
end
if SERVER then
function ChessBoard_DoOverrides()
if GAMEMODE.Name=="Cinema" then --Cinema overrides
hook.Add("CanPlayerEnterVehicle", "EnterSeat", function(ply, vehicle) --Overrides default func
if vehicle:GetClass() != "prop_vehicle_prisoner_pod" then return end
if vehicle.Removing then return false end
return (vehicle:GetOwner() == ply) or vehicle:GetNWBool( "IsChessSeat", false )
end)
end
end
hook.Add( "Initialize", "ChessBoardOverrides", ChessBoard_DoOverrides )
CreateConVar( "chess_wagers", 1, FCVAR_ARCHIVE, "Set whether players can wager on their chess games." )
CreateConVar( "chess_darkrp_wager", 1, FCVAR_ARCHIVE, "[DarkRP only] Wagers should use DarkRP wallet." )
CreateConVar( "chess_debug", 0, FCVAR_ARCHIVE, "Debug mode." )
CreateConVar( "chess_limitmoves", 1, FCVAR_ARCHIVE, "Enable 50 move rule." )
else -- CLIENT
CreateConVar( "chess_gridletters", 1, FCVAR_ARCHIVE, "Show grid letters." )
end
-- DarkRP --
------------
hook.Add("canArrest", "Chess PreventArrest", function( cop, target )
if not (IsValid(target) and target:GetNWBool("IsInChess", false)) then return end
local board = target:GetNWEntity( "ActiveChessBoard", nil )
if not (IsValid(board) and board:GetPlaying()) then return end
if target~=board:GetWhitePlayer() and target~=board:GetBlackPlayer() then return end
return false,"Cannot arrest players during a game in progress" -- Prevent arrest during Chess
end)
-- Admin Commands --
--------------------
local function SetupCommands()
if serverguard then
/////////////////
// Serverguard //
/////////////////
serverguard.permission:Add("Set Chess Elo")
if SERVER then
// Update function
local function SGUpdate(player, target, newElo, isDraughts)
if type(target)=="Player" and IsValid(target) then
if isDraughts then
target:SetDraughtsElo( newElo )
else
target:SetChessElo( newElo )
end
Chess_UpdateElo( target )
serverguard.Notify(nil,
SERVERGUARD.NOTIFY.GREEN, serverguard.player:GetName(player),
SERVERGUARD.NOTIFY.WHITE, isDraughts and " has set the Checkers Elo rating of " or " has set the Chess Elo rating of ",
SERVERGUARD.NOTIFY.RED, serverguard.player:GetName(target),
SERVERGUARD.NOTIFY.WHITE, " to ",
SERVERGUARD.NOTIFY.RED, tostring(newElo),
SERVERGUARD.NOTIFY.WHITE, "."
)
elseif (string.SteamID(target)) then
local success,reason = Chess_SetElo( target, newElo, isDraughts )
local queryObj = serverguard.mysql:Select("serverguard_users");
queryObj:Where("steam_id", target)
queryObj:Limit(1)
queryObj:Callback(function(result, status, lastID)
local name = target
if (type(result) == "table" and #result > 0) then
name = result[1].name or name
end
if success then
serverguard.Notify(nil,
SERVERGUARD.NOTIFY.GREEN, serverguard.player:GetName(player),
SERVERGUARD.NOTIFY.WHITE, isDraughts and " has set the Checkers Elo rating of " or " has set the Chess Elo rating of ",
SERVERGUARD.NOTIFY.RED, name,
SERVERGUARD.NOTIFY.WHITE, " to ",
SERVERGUARD.NOTIFY.RED, tostring(newElo),
SERVERGUARD.NOTIFY.WHITE, "."
)
else
serverguard.Notify(player, SERVERGUARD.NOTIFY.RED, ("Could not set elo. (%s)"):format(tostring(reason)) )
end
end)
queryObj:Execute()
else
serverguard.Notify(player, SGPF("cant_find_player_with_identifier"))
end
end
// Chess command
local command = {}
command.help = "Set a player's Chess Elo rating."
command.command = "setelo"
command.arguments = {"player", "elo"}
command.permissions = {"Set Chess Elo"}
command.aliases = {"setelochess", "chesselo", "setchess", "setchesselo"}
function command:Execute(player, silent, arguments)
local target = util.FindPlayer(arguments[1], player, true)
local newElo = tonumber(arguments[2]) or 1400
SGUpdate( player, IsValid(target) and target or arguments[1], newElo, false )
end
serverguard.command:Add(command)
// Draughts command
local command = {}
command.help = "Set a player's Checkers Elo rating."
command.command = "setelocheckers"
command.arguments = {"player", "elo"}
command.permissions = {"Set Chess Elo"}
command.aliases = {"setcheckers", "setcheckerselo", "checkerselo", "setelodraughts", "setdraughts", "setdraughtselo", "draughtselo"}
function command:Execute(player, silent, arguments)
local target = util.FindPlayer(arguments[1], player, true)
local newElo = tonumber(arguments[2]) or 1400
SGUpdate( player, IsValid(target) and target or arguments[1], newElo, true )
end
serverguard.command:Add(command)
end
end
if ulx then
/////////
// ULX //
/////////
// Update
local function ULXUpdate(calling_ply, target, newElo, isDraughts)
if CLIENT then return end
if type(target)=="Player" and IsValid(target) then
if isDraughts then
target:SetDraughtsElo( newElo )
else
target:SetChessElo( newElo )
end
Chess_UpdateElo( target )
ulx.fancyLogAdmin( calling_ply, "#A set the #s Elo rating of #T to #i.", isDraughts and "Checkers" or "Chess", target, newElo )
elseif (string.SteamID(target or "")) then
local success,reason = Chess_SetElo( target, newElo, isDraughts )
if success then
ulx.fancyLogAdmin( calling_ply, "#A set the #s Elo rating of #s to #i.", isDraughts and "Checkers" or "Chess", target, newElo )
else
ULib.tsayError( calling_ply, ("Could not set elo. (%s)"):format(tostring(reason)) )
end
else
ULib.tsayError( calling_ply, "Invalid SteamID or Player." )
end
end
// Autocomplete
local function AutoComplete(...) return ULib.cmds.PlayerArg.complete(ULib.cmds.PlayerArg, ...) end
// Chess command
local function SetChessElo( calling_ply, steamid, newElo )
local target = ULib.getUser( steamid or "", true, calling_ply )
ULXUpdate( calling_ply, IsValid(target) and target or steamid, newElo, false )
end
local setchess = ulx.command( "Chess", "ulx chesselo", SetChessElo, {"!setelo", "!setelochess", "!chesselo", "!setchess", "!setchesselo"}, false, false, true )
setchess:addParam{ type=ULib.cmds.StringArg, hint="Player or SteamID", autocomplete_fn=AutoComplete }
setchess:addParam{ type=ULib.cmds.NumArg, hint="New Elo", min=0, default=1400 }
setchess:defaultAccess( ULib.ACCESS_SUPERADMIN )
setchess:help( "Set Chess Elo rating for user." )
// Draughts command
local function SetDraughtsElo( calling_ply, steamid, newElo )
local target = ULib.getUser( steamid, true, calling_ply )
ULXUpdate( calling_ply, IsValid(target) and target or steamID, newElo, true )
end
local setdraughts = ulx.command( "Chess", "ulx checkerselo", SetDraughtsElo, {"!setelocheckers", "!setcheckers", "!setcheckerselo", "!checkerselo", "!setelodraughts", "!setdraughts", "!setdraughtselo", "!draughtselo"}, false, false, true )
setdraughts:addParam{ type=ULib.cmds.StringArg, hint="Player or SteamID", autocomplete_fn=AutoComplete }
setdraughts:addParam{ type=ULib.cmds.NumArg, hint="New Elo", min=0, default=1400 }
setdraughts:defaultAccess( ULib.ACCESS_SUPERADMIN )
setdraughts:help( "Set Checkers Elo rating for user." )
end
end
hook.Add( "Initialize", "ChessBoardPermissions", SetupCommands )