Compare commits
7 Commits
wn-pl
...
96eaf09b4f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96eaf09b4f | ||
|
|
dadbe83ec2 | ||
|
|
e282392d3d | ||
|
|
d48b018f4d | ||
|
|
7181fcb124 | ||
|
|
c21217a270 | ||
|
|
73479cff9e |
12
README.md
@@ -1,11 +1,11 @@
|
||||
# Willard Networks: Poland (Veles)
|
||||
This branch contains files related to the **Willard Networks: Veles**. They were retrieved on 2024/08/04 and are presented as is with minimal edits. This means that potential developers' bugs have been kept in their original form and it is up to you to resolve them. We do not and will not provide direct support (i.e. regular updates or patches). However, you can always create an issue, pointing out the problem.
|
||||
# Willard Networks: France (Echo One)
|
||||
This branch contains files related to the **Willard Networks: Echo One**. They were retrieved on 2024/08/04 and are presented as is with minimal edits. This means that potential developers' bugs have been kept in their original form and it is up to you to resolve them. We do not and will not provide direct support (i.e. regular updates or patches). However, you can always create an issue, pointing out the problem.
|
||||
|
||||
**The files provided contain:**
|
||||
* Half-Life 2 RPG framework by Willard Networks, used on the Polish server as of 2024/08/04.
|
||||
* Settings (data/\*, settings/\*) used on the Polish server as of 2024/08/04.
|
||||
* Credentials from the Polish server database (including the master and SAM database).
|
||||
* Helix logs (data/helix/logs) from the Polish server as of 2024/08/04.
|
||||
* Half-Life 2 RPG framework by Willard Networks, used on the French server as of 2024/08/04.
|
||||
* Settings (data/\*, settings/\*) used on the French server as of 2024/08/04.
|
||||
* Credentials from the French server database (including the master and SAM database).
|
||||
* Helix logs (data/helix/logs) from the French server as of 2024/08/04.
|
||||
|
||||
**The files provided do not contain:**
|
||||
* Exported dump of databases (including the master and SAM database), since these files are overweight and cannot be uploaded to GitHub. Despite this, it is included in builds distributed via [The Twilight Zone](https://wnsrc.plymouth.thetwilightzone.ru/).
|
||||
|
||||
@@ -1,211 +0,0 @@
|
||||
## Preamble
|
||||
|
||||
1. This Agreement, created on:
|
||||
|
||||
13th November 2023
|
||||
(hereinafter: Effective Date)
|
||||
|
||||
governs the relationship between
|
||||
|
||||
[Atle](https://www.gmodstore.com/users/76561198002319944)
|
||||
|
||||
(hereinafter: Licensee)
|
||||
|
||||
and
|
||||
|
||||
[Stellio AS](https://www.gmodstore.com/teams/06f5de34-3186-4d26-baf8-926899b4b3ae)
|
||||
|
||||
(hereinafter: Licensor).
|
||||
|
||||
This Agreement sets the terms, rights, restrictions and obligations on using
|
||||
|
||||
[eProtect - Keep exploiters/cheaters at bay!](https://www.gmodstore.com/market/view/7794c410-bcf4-49d3-aba2-f253cfb15344)
|
||||
|
||||
(hereinafter: The Software)
|
||||
|
||||
created and owned by Licensor, as detailed herein.
|
||||
|
||||
## License Grant
|
||||
|
||||
2. Licensor hereby grants Licensee a Personal, Non-assignable & non-transferable,
|
||||
Commercial, Royalty free, Including the rights to create but not distribute
|
||||
derivative works, Non-exclusive license, all with accordance with the terms
|
||||
set forth and other legal restrictions set forth in 3rd party software used
|
||||
while running The Software.
|
||||
|
||||
3. **Limited**: licensee may use The Software for the purpose of:
|
||||
- a. running The Software on Licensee’s Website[s] and Server[s]; and
|
||||
- b. publishing The Software’s output to Licensee and 3rd Parties; and
|
||||
- c. modify The Software to suit Licensee’s needs and specifications;
|
||||
|
||||
### Non Assignable & Non-Transferable
|
||||
|
||||
4. Licensee may not assign or transfer his rights and duties under this
|
||||
Agreement.
|
||||
|
||||
### Commercial, Royalty Free
|
||||
|
||||
5. Licensee may use The Software for any purpose, including paid-services,
|
||||
without any royalties.
|
||||
|
||||
### The Right to Create Derivative Works
|
||||
|
||||
6. Licensee may create derivative works based on The Software, including
|
||||
amending The Software’s source code, modifying it, integrating it into a
|
||||
larger work or removing portions of Software, as long as no distribution of the derivative works is made.
|
||||
**This no longer applies if**:
|
||||
- a. it is stated otherwise in this Agreement's amendments; or
|
||||
- b. the Software uses a Digital Rights Management system ("DRM"), see clause 22 "Digital Rights Management ("DRM") system";
|
||||
|
||||
Any derivative works or modifications of The Software's source code must be in
|
||||
accordance with the terms set forth in clauses 21. and 22.
|
||||
|
||||
## Term & Termination
|
||||
|
||||
7. The Term of this license shall be until terminated. Licensor may terminate
|
||||
this Agreement, including Licensee’s license in the case where Licensee:
|
||||
- a. was in breach of this license's terms and conditions and such
|
||||
breach was not cured, immediately upon notification; or
|
||||
- b. was in breach of the terms of clause 2 to this Agreement; or
|
||||
- c. otherwise entered into any arrangement which caused Licensor to be unable
|
||||
to enforce his rights under this Agreement; or
|
||||
- d. was granted a full refund by their own request; or
|
||||
- e. issued a claim or chargeback on the payment made for The Software; or
|
||||
- f. received access to The Software for free, and only for a limited time or through a conditional agreement where the agreement has ended;
|
||||
|
||||
## Upgrades, Updates and Fixes
|
||||
|
||||
8. Licensor may provide Licensee, from time to time, with Upgrades, Updates or
|
||||
Fixes, as detailed herein and according to his sole discretion. Licensee
|
||||
hereby warrants to keep The Software up-to-date and install all relevant
|
||||
updates and fixes, and may, at his sole discretion, purchase upgrades,
|
||||
according to the rates set by Licensor. Licensor may provide any update or
|
||||
Fix free of charge; however, nothing in this Agreement shall require Licensor
|
||||
to provide Updates or Fixes.
|
||||
|
||||
9. **Upgrades**: for the purpose of this Agreement, an Upgrade shall be a material amendment
|
||||
in The Software, which contains new features and or major performance
|
||||
improvements.
|
||||
|
||||
10. **Updates**: for the purpose of this Agreement, an update shall be a minor amendment in
|
||||
The Software, which may contain new features or minor improvements.
|
||||
|
||||
11. **Fixes**: for the purpose of this Agreement, a fix shall be a minor amendment in The
|
||||
Software, intended to remove bugs or alter minor features which impair
|
||||
The Software's functionality.
|
||||
|
||||
## Support
|
||||
|
||||
12. The Software is provided under an AS-IS basis and without any support, updates
|
||||
or maintenance. Nothing in this Agreement shall require Licensor to provide
|
||||
Licensee with support or fixes to any bug, failure, mis-performance or other
|
||||
defect in The Software, except in the case where Licensor explicitly states
|
||||
that he shall provide support or fixes to any bug, failure, mis-performance or
|
||||
other defect in The Software.
|
||||
|
||||
### Bug Notification
|
||||
|
||||
13. Licensee may provide Licensor of details regarding any bug, defect or
|
||||
failure in The Software promptly and with no delay from such event; Licensee
|
||||
shall comply with Licensor's request for information regarding bugs, defects
|
||||
or failures and furnish him with information, screenshots and try to
|
||||
reproduce such bugs, defects or failures.
|
||||
|
||||
### Feature Request
|
||||
|
||||
14. Licensee may request additional features in The Software, provided, however,
|
||||
that:
|
||||
|
||||
- a. Licensee shall waive any claim or right in such feature should
|
||||
feature be developed by Licensor;
|
||||
- b. Licensee shall be prohibited from developing the feature, or disclose such feature request, or feature, to
|
||||
any 3rd party directly competing with Licensor or any 3rd party which may
|
||||
be, following the development of such feature, in direct competition with
|
||||
Licensor;
|
||||
- c. Licensee warrants that feature does not infringe any 3rd
|
||||
party patent, trademark, trade-secret or any other intellectual property
|
||||
right; and
|
||||
- d. Licensee developed, envisioned or created the feature
|
||||
solely by himself.
|
||||
|
||||
## Liability
|
||||
|
||||
15. To the extent permitted under Law, The Software is provided under an AS-IS
|
||||
basis. Licensor shall never, and without any limit, be liable for any damage,
|
||||
cost, expense or any other payment incurred by Licensee as a result of
|
||||
The Software’s actions, failure, bugs and/or any other interaction between The
|
||||
Software and Licensee's end-equipment, computers, other software or any 3rd
|
||||
party, end-equipment, computer or services. Moreover, Licensor shall never
|
||||
be liable for any defect in source code written by Licensee when relying on
|
||||
The Software or using The Software’s source code.
|
||||
|
||||
## Warranty
|
||||
|
||||
16. **Intellectual Property**:
|
||||
licensor hereby warrants that The Software does not violate or infringe any
|
||||
3rd party claims in regard to intellectual property, patents and/or
|
||||
trademarks and that to the best of its knowledge no legal action has been
|
||||
taken against it for any infringement or violation of any 3rd party
|
||||
intellectual property rights.
|
||||
|
||||
17. The Software is provided without any warranty; Licensor hereby disclaims
|
||||
any warranty that The Software shall be error free, without defects or
|
||||
code which may cause damage to Licensee’s computers or to Licensee, and
|
||||
that The Software shall be functional. Licensee shall be solely liable to
|
||||
any damage, defect or loss incurred as a result of operating software and
|
||||
undertake the risks contained in running The Software on Licensee’s
|
||||
Server[s] and Website[s].
|
||||
|
||||
### Prior Inspection
|
||||
|
||||
18. Licensee hereby states that he inspected The Software thoroughly and found
|
||||
it satisfactory and adequate to his needs, that it does not interfere with
|
||||
his regular operation and that it does meet the standards and scope of his
|
||||
computer systems and architecture. Licensee found that The Software
|
||||
interacts with his development, website and server environment and that it
|
||||
does not infringe any of End User License Agreement of any software Licensee
|
||||
may use in performing his services. Licensee hereby waives any claims
|
||||
regarding The Software's incompatibility, performance, results and features,
|
||||
and warrants that he inspected The Software.
|
||||
|
||||
## Indemnification
|
||||
|
||||
19. Licensee hereby warrants to hold Licensor harmless and indemnify Licensor for
|
||||
any lawsuit brought against it in regard to Licensee’s use of The Software
|
||||
in means that violate, breach or otherwise circumvent this license,
|
||||
Licensor's intellectual property rights or Licensor's title in The Software.
|
||||
Licensor shall promptly notify Licensee in case of such legal action and
|
||||
request Licensee’s consent prior to any settlement in relation to such
|
||||
lawsuit or claim.
|
||||
|
||||
## Class Action Waiver
|
||||
|
||||
20. Licensee hereby agrees not to initiate class-action lawsuits against Licensor
|
||||
in relation to this license and to compensate Licensor for any legal fees,
|
||||
cost or attorney fees should any claim brought by Licensee against Licensor
|
||||
be denied, in part or in full.
|
||||
|
||||
## Branding, Copyright, & Public Notice
|
||||
|
||||
21. Licensee hereby agrees not to remove the branding, copyright or other brand indicators in The Software, including but not limited
|
||||
to the title of The Software. All copies of The Software must contain the same proprietary notices that appear on and in The Software,
|
||||
including all copyright notices and branding embedded in The Software, which must remain unaltered
|
||||
from the original and visible at all times, unless by specific prior arrangement by Licensor.
|
||||
|
||||
## Digital Rights Management ("DRM") system
|
||||
|
||||
22. If applicable to The Software, licensee hereby agrees not to attempt to tamper with, change, or otherwise modify
|
||||
the DRM system bundled with The Software beyond what is advertised on The Software's market page, this Agreement's amendments
|
||||
or other official sources made available by Licensor.
|
||||
|
||||
## Changes or amendments made to this Agreement
|
||||
|
||||
23. **Changes made by GmodStore**: we may make changes to this Agreement at any time, and, if we make changes, we will
|
||||
take reasonable steps to let Licensee know about these changes.
|
||||
|
||||
24. **Amendments made by Licensor**: Licensor may make amendments to this Agreement at any time, and,
|
||||
if they make amendments, they will take reasonable steps to let Licensee know about these amendments.
|
||||
|
||||
---
|
||||
|
||||
Agreement version: 2022-09-21
|
||||
@@ -1 +0,0 @@
|
||||
<1F>
|
||||
9
addons/chess/addon.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
"AddonInfo"
|
||||
{
|
||||
"name" "Chess"
|
||||
"version" "1.3.10"
|
||||
"author_name" "my_hat_stinks"
|
||||
"author_url" ""
|
||||
"info" "Let's play Chess"
|
||||
"override" "0"
|
||||
}
|
||||
214
addons/chess/lua/autorun/sh_chess.lua
Normal file
@@ -0,0 +1,214 @@
|
||||
--[[
|
||||
| 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 )
|
||||
174
addons/chess/lua/chess/cl_dermaboard.lua
Normal file
@@ -0,0 +1,174 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local PanelCol = {
|
||||
Main = Color(0,0,0,200), Hover = Color(0,255,0,50), Selected = Color(150,50,50,170),
|
||||
Move = Color(10,25,150,150), HasMoved = Color(50,50,50,100), Text = Color(0,0,0,255),
|
||||
|
||||
GridWhite = Color(255, 248, 220), GridBlack = Color(210, 180, 140),
|
||||
|
||||
White = Color(180,180,180), Black = Color(0,0,0),
|
||||
}
|
||||
-- local ColText = Color(50,50,50,200)
|
||||
-- local ColBlack,ColWhite = Color(0,0,0,120),Color(255,255,255,10)
|
||||
|
||||
local NumToLetter = {"a", "b", "c", "d", "e", "f", "g", "h", ["a"]=1, ["b"]=2, ["c"]=3, ["d"]=4, ["e"]=5, ["f"]=6, ["g"]=7, ["h"]=8} --Used extensively for conversions
|
||||
surface.CreateFont( "ChessPieces", { font = "Arial", size = 64, weight = 300})
|
||||
|
||||
function Chess_Open2DBoard( board )
|
||||
if not IsValid(board) then return end
|
||||
if IsValid( Chess_2DDermaPanel ) then Chess_2DDermaPanel:Remove() end
|
||||
|
||||
Chess_2DDermaPanel = vgui.Create( "DFrame" )
|
||||
local frame = Chess_2DDermaPanel
|
||||
frame:SetTitle( "2D Game Board" )
|
||||
frame:SetSize( 740, 760 )
|
||||
frame:SetPos( (ScrW()/2)-370, (ScrH()/2)-380 )
|
||||
frame.Paint = function( s,w,h )
|
||||
if not IsValid(board) then
|
||||
s:Remove()
|
||||
end
|
||||
|
||||
draw.RoundedBox( 8, 0, 0, w, h, PanelCol.Main )
|
||||
end
|
||||
frame:MakePopup()
|
||||
|
||||
local pnlBoard = vgui.Create( "DPanel", frame )
|
||||
pnlBoard:SetSize( 720, 720 )
|
||||
pnlBoard:SetPos(10,30)
|
||||
|
||||
pnlBoard.Squares = {}
|
||||
pnlBoard.Paint = function() end
|
||||
|
||||
local function DoTiles(swapped)
|
||||
if pnlBoard.Squares then
|
||||
for _,v in pairs(pnlBoard.Squares) do
|
||||
for _,pnl in pairs(v) do
|
||||
pnl:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i=0,7 do
|
||||
pnlBoard.Squares[i] = {}
|
||||
for n=0,7 do
|
||||
local pnl = vgui.Create( "DModelPanel", pnlBoard )
|
||||
pnlBoard.Squares[i][n] = pnl
|
||||
|
||||
pnl:SetPos( (swapped and 7-i or i)*90, (swapped and 7-n or n)*90 )
|
||||
pnl:SetSize(90,90)
|
||||
pnl.GridCol = (((i+n)%2)==1) and PanelCol.GridBlack or PanelCol.GridWhite
|
||||
pnl.GridPos = {i,n}
|
||||
pnl.oPaint = pnl.Paint
|
||||
pnl.Paint = function(s,w,h)
|
||||
surface.SetDrawColor( s.GridCol )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
|
||||
if not IsValid(board) then return end
|
||||
|
||||
if s:IsHovered() then
|
||||
surface.SetDrawColor( PanelCol.Hover )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
if board.Selected and board.Selected[1]==s.GridPos[1] and board.Selected[2]==s.GridPos[2] then
|
||||
surface.SetDrawColor( PanelCol.Selected )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
if board:GetTableGrid( board.Moves, s.GridPos[1], s.GridPos[2]) then
|
||||
surface.SetDrawColor( PanelCol.Move )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
|
||||
local col,square = board.Pieces[ NumToLetter[s.GridPos[1]+1] ]
|
||||
if col then
|
||||
square = col[8-s.GridPos[2]]
|
||||
if square then
|
||||
if not (square.Team and square.Class) then return end
|
||||
|
||||
if square.Moving then
|
||||
surface.SetDrawColor( PanelCol.HasMoved )
|
||||
surface.DrawRect( 0,0, w,h )
|
||||
end
|
||||
|
||||
if board.Characters then
|
||||
draw.SimpleText( board.Characters[square.Team .. square.Class], "ChessPieces", w/2, h/2, PanelCol.Text, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
else
|
||||
s:SetModel( board.Models[square.Team .. square.Class] )
|
||||
|
||||
return s.oPaint( s,w,h )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if cvars.Bool("chess_gridletters") then
|
||||
local str = (NumToLetter[i+1]..tostring(8-n)):upper()
|
||||
draw.SimpleText( str, "ChessTextSmall", 5, h-20, PanelCol.Black )
|
||||
end
|
||||
end
|
||||
|
||||
pnl.DoClick = function(s)
|
||||
if not IsValid(board) then return end
|
||||
|
||||
if board.Selected and board:GetTableGrid( board.Moves, pnl.GridPos[1], pnl.GridPos[2] ) then
|
||||
board:RequestMove( board.Selected[1], board.Selected[2], pnl.GridPos[1], pnl.GridPos[2] )
|
||||
board:ResetHighlights()
|
||||
elseif board.Selected and board.Selected[1]==s.GridPos[1] and board.Selected[2]==s.GridPos[2] then
|
||||
board:ResetHighlights()
|
||||
else
|
||||
board:ResetHighlights()
|
||||
board.Selected = {s.GridPos[1],s.GridPos[2]}
|
||||
board.Moves = board:GetMove( NumToLetter[s.GridPos[1]+1], 8-s.GridPos[2] )
|
||||
end
|
||||
end
|
||||
pnl.LayoutEntity = function( s, ent )
|
||||
ent:SetPos( Vector(20,20,20) )
|
||||
ent:SetAngles( Angle(0,-50,0) )
|
||||
end
|
||||
|
||||
pnl:SetModel( board.Models["WhitePawn"] )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local swap = vgui.Create( "DButton", frame )
|
||||
swap:SetImage( "icon16/arrow_rotate_clockwise.png" )
|
||||
swap:SetSize( 18,18 )
|
||||
swap:SetPos( 620,6 )
|
||||
swap:SetText( "" )
|
||||
swap.DoClick = function(s)
|
||||
s.Swapped = not s.Swapped
|
||||
DoTiles( s.Swapped )
|
||||
end
|
||||
swap.Paint = function() end
|
||||
|
||||
local toggleGridLetters = vgui.Create( "DCheckBox", frame )
|
||||
toggleGridLetters:SetImage( "icon16/font.png" )
|
||||
toggleGridLetters:SetSize( 18,18 )
|
||||
toggleGridLetters:SetPos( 600,6 )
|
||||
toggleGridLetters:SetText( "" )
|
||||
toggleGridLetters:SetConVar( "chess_gridletters" )
|
||||
toggleGridLetters.OnChange = function(s,newvalue)
|
||||
s:SetAlpha( s:GetChecked() and 255 or 100 )
|
||||
end
|
||||
toggleGridLetters.Paint = function() end
|
||||
toggleGridLetters.PerformLayout = function(s) -- DCheckBox overwrites DButton's PerformLayout, re-apply it
|
||||
if IsValid(s.m_Image) then
|
||||
s.m_Image:SetPos( 4, ( s:GetTall() - s.m_Image:GetTall() ) * 0.5 )
|
||||
s:SetTextInset( s.m_Image:GetWide() + 16, 0 )
|
||||
end
|
||||
|
||||
DLabel.PerformLayout( s )
|
||||
end
|
||||
|
||||
swap.Swapped = false
|
||||
DoTiles( swap.Swapped )
|
||||
end
|
||||
149
addons/chess/lua/chess/cl_top.lua
Normal file
@@ -0,0 +1,149 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local Top10
|
||||
local function ChessTop10( typ )
|
||||
if IsValid(Top10) then Top10:Remove() end
|
||||
|
||||
typ = typ or "Chess"
|
||||
|
||||
Top10 = vgui.Create( "DFrame" )
|
||||
Top10:SetSize( 450, 245 )
|
||||
Top10:SetPos( (ScrW()/2)-150, (ScrH()/2)-100 )
|
||||
Top10:SetTitle( "Top 10 Chess Elo ratings" )
|
||||
Top10:MakePopup()
|
||||
Top10.Column = "Elo"
|
||||
|
||||
local pnl = vgui.Create("DPanel", Top10)
|
||||
pnl.Paint = function() end
|
||||
pnl:SetTall(20)
|
||||
pnl:Dock(BOTTOM)
|
||||
|
||||
Top10.Rank = vgui.Create( "DLabel", pnl )
|
||||
Top10.Rank:Dock( LEFT )
|
||||
Top10.Rank:SetTall( 20 )
|
||||
Top10.Rank:SetWide( 150 )
|
||||
Top10.Rank:SetText("")
|
||||
|
||||
Top10.Updated = vgui.Create( "DLabel", pnl )
|
||||
Top10.Updated:Dock( RIGHT )
|
||||
Top10.Updated:SetTall( 150 )
|
||||
Top10.Updated:SetText("")
|
||||
|
||||
Top10.List = vgui.Create( "DListView", Top10 )
|
||||
local List = Top10.List
|
||||
List:Dock( FILL )
|
||||
List:AddColumn( "Rank" )
|
||||
List:AddColumn( "Name" )
|
||||
List:AddColumn( "SteamID" )
|
||||
List:AddColumn( "Elo" )
|
||||
|
||||
List:AddLine( "", "Loading..." )
|
||||
-- PrintTable( List.Columns )
|
||||
List:OnRequestResize( List.Columns[1], 10 )
|
||||
List:OnRequestResize( List.Columns[2], 150 )
|
||||
List:OnRequestResize( List.Columns[3], 100 )
|
||||
List:OnRequestResize( List.Columns[4], 10 )
|
||||
|
||||
net.Start( "Chess Top10" ) net.WriteString( typ ) net.SendToServer()
|
||||
end
|
||||
local function DraughtsTop10()
|
||||
ChessTop10( "Draughts" )
|
||||
end
|
||||
concommand.Add( "chess_top", function( p,c,a ) ChessTop10() end)
|
||||
concommand.Add( "checkers_top", function( p,c,a ) DraughtsTop10() end)
|
||||
|
||||
local ChatCommands = {
|
||||
["!chess"]=ChessTop10, ["!chesstop"]=ChessTop10, ["!topchess"]=ChessTop10,
|
||||
["/chess"]=ChessTop10, ["/chesstop"]=ChessTop10, ["/topchess"]=ChessTop10,
|
||||
|
||||
["!draughts"]=DraughtsTop10, ["!draughtstop"]=DraughtsTop10, ["!topdraughts"]=DraughtsTop10,
|
||||
["/draughts"]=DraughtsTop10, ["/draughtstop"]=DraughtsTop10, ["/topdraughts"]=DraughtsTop10,
|
||||
|
||||
["!checkers"]=DraughtsTop10, ["!checkerstop"]=DraughtsTop10, ["!topcheckers"]=DraughtsTop10,
|
||||
["/checkers"]=DraughtsTop10, ["/checkerstop"]=DraughtsTop10, ["/topcheckers"]=DraughtsTop10,
|
||||
}
|
||||
hook.Add( "OnPlayerChat", "Chess Top10 PlayerChat", function( ply, str, tm, dead )
|
||||
if ChatCommands[str:lower()] then
|
||||
if ply==LocalPlayer() then
|
||||
ChatCommands[str:lower()]()
|
||||
end
|
||||
return true
|
||||
end
|
||||
end)
|
||||
|
||||
local function SecondsToTime(num)
|
||||
if updateTime>=86400 then
|
||||
return ("%i day%s"):format( math.floor(updateTime/86400), updateTime>=172800 and "s" or "")
|
||||
elseif updateTime>=3600 then
|
||||
return ("%i hour%s"):format( math.floor(updateTime/3600), updateTime>=7200 and "s" or "")
|
||||
elseif updateTime>=60 then
|
||||
return ("%i minute%s"):format( math.floor(updateTime/60), updateTime>=120 and "s" or "")
|
||||
else
|
||||
return ("%i second%s"):format(updateTime, updateTime>=2 and "s" or "")
|
||||
end
|
||||
end
|
||||
|
||||
local lastTable = {}
|
||||
local lastRank = {}
|
||||
local lastUpdate = {}
|
||||
net.Receive( "Chess Top10", function()
|
||||
if not (IsValid(Top10) and IsValid(Top10.List)) then return end
|
||||
|
||||
Top10.List:Clear()
|
||||
|
||||
local typ = net.ReadString() or "[Error]"
|
||||
|
||||
Top10:SetTitle( "Top 10 "..typ.." Elo ratings" )
|
||||
|
||||
local tbl = net.ReadTable()
|
||||
if (not tbl) or (#tbl==0) then -- Rate limit exceeded
|
||||
if lastTable[typ] then
|
||||
for i=1,#lastTable[typ] do
|
||||
Top10.List:AddLine( tonumber(lastTable[typ][i].Rank), lastTable[typ][i].Username, lastTable[typ][i].SteamID, tonumber(lastTable[typ][i]["Elo" ]) )
|
||||
end
|
||||
Top10.Rank:SetText( "You are rank "..lastRank[typ] )
|
||||
|
||||
if lastUpdate[typ] then
|
||||
updateTime = math.floor(CurTime() - lastUpdate[typ])
|
||||
if updateTime>0 then
|
||||
Top10.Updated:SetText( ("Updated %s ago."):format(SecondsToTime(updateTime)) )
|
||||
end
|
||||
Top10.Updated:SizeToContents()
|
||||
end
|
||||
else
|
||||
Top10.List:AddLine( "", "ERROR: Rate limit exceeded." )
|
||||
Top10.List:AddLine( "", "Please try again in a few minutes." )
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
for i=1,#tbl do
|
||||
Top10.List:AddLine( tonumber(tbl[i].Rank), tbl[i].Username, tbl[i].SteamID, tonumber(tbl[i]["Elo" ]) )
|
||||
end
|
||||
|
||||
local rank = (net.ReadString() or "N/A")
|
||||
Top10.Rank:SetText( "You are rank "..rank )
|
||||
|
||||
lastUpdate[typ] = tonumber(net.ReadString())
|
||||
if lastUpdate[typ] then
|
||||
updateTime = math.floor(CurTime() - lastUpdate[typ])
|
||||
|
||||
if updateTime>0 then
|
||||
Top10.Updated:SetText( ("Updated %s ago."):format(SecondsToTime(updateTime)) )
|
||||
end
|
||||
Top10.Updated:SizeToContents()
|
||||
end
|
||||
|
||||
lastTable[typ] = tbl
|
||||
lastRank[typ] = rank
|
||||
end)
|
||||
123
addons/chess/lua/chess/sh_player_ext.lua
Normal file
@@ -0,0 +1,123 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local PLAYER = FindMetaTable( "Player" )
|
||||
if not PLAYER then return end
|
||||
|
||||
function PLAYER:GetChessElo()
|
||||
return self:GetNWInt( "ChessElo", 1400 ) or 1400
|
||||
end
|
||||
function PLAYER:GetDraughtsElo()
|
||||
return self:GetNWInt( "DraughtsElo", 1400 ) or 1400
|
||||
end
|
||||
if CLIENT then return end
|
||||
function PLAYER:SetChessElo( num )
|
||||
self:SetNWInt( "ChessElo", num or Chess_GetElo(ply:SteamID()) or 1400 )
|
||||
Chess_SetElo( self:SteamID(), num, false )
|
||||
end
|
||||
function PLAYER:SetDraughtsElo( num )
|
||||
self:SetNWInt( "DraughtsElo", num or Chess_GetElo(ply:SteamID(), true) or 1400 )
|
||||
Chess_SetElo( self:SteamID(), num, true )
|
||||
end
|
||||
|
||||
function PLAYER:RefreshChessElo()
|
||||
-- Convert old PData stuff
|
||||
if self:GetPData("ChessElo") then
|
||||
Chess_SetElo( self:SteamID(), self:GetPData("ChessElo"), false )
|
||||
self:RemovePData("ChessElo")
|
||||
end
|
||||
if self:GetPData("DraughtsElo") then
|
||||
Chess_SetElo( self:SteamID(), self:GetPData("DraughtsElo"), true )
|
||||
self:RemovePData("DraughtsElo")
|
||||
end
|
||||
|
||||
self:SetChessElo( Chess_GetElo(self:SteamID()) or 1400)
|
||||
self:SetDraughtsElo( Chess_GetElo(self:SteamID(), true) or 1400)
|
||||
end
|
||||
hook.Add( "PlayerInitialSpawn", "Chess InitialSpawn InitElo", function(ply)
|
||||
ply:RefreshChessElo()
|
||||
end)
|
||||
|
||||
function PLAYER:ExpectedChessWin( against )
|
||||
return (1/ (1+( 10^( (against:GetChessElo() - self:GetChessElo())/400 ) )) )
|
||||
end
|
||||
function PLAYER:ExpectedDraughtsWin( against )
|
||||
return (1/ (1+( 10^( (against:GetDraughtsElo() - self:GetDraughtsElo())/400 ) )) )
|
||||
end
|
||||
|
||||
function PLAYER:GetChessKFactor() --Imitating FIDE's K-factor ranges
|
||||
local games = tonumber(self:GetPData( "ChessGamesPlayed", 0 )) or 0
|
||||
if games<30 then
|
||||
self:SetPData( "ChessEloKFactor", 15 )
|
||||
return 30
|
||||
end
|
||||
local k = self:GetChessElo()>=2400 and 10 or self:GetPData( "ChessEloKFactor", 15 ) or 15
|
||||
self:SetPData( "ChessEloKFactor", k )
|
||||
return k
|
||||
end
|
||||
function PLAYER:GetDraughtsKFactor() --Imitating FIDE's K-factor ranges
|
||||
local games = self:GetPData( "DraughtsGamesPlayed", 0 )
|
||||
if games<30 then
|
||||
self:SetPData( "DraughtsEloKFactor", 15 )
|
||||
return 30
|
||||
end
|
||||
local k = self:GetDraughtsElo()>=2400 and 10 or self:GetPData( "DraughtsEloKFactor", 15 ) or 15
|
||||
self:SetPData( "DraughtsEloKFactor", k )
|
||||
return k
|
||||
end
|
||||
|
||||
function PLAYER:DoChessElo( score, against )
|
||||
local mod = math.ceil(self:GetChessKFactor() * (score - self:ExpectedChessWin(against)))
|
||||
local NewElo = math.floor( self:GetChessElo() + mod )
|
||||
|
||||
self:SetChessElo( NewElo )
|
||||
|
||||
if IsValid(against) then
|
||||
mod = mod*(-1)
|
||||
local NewElo = math.floor( against:GetChessElo() + mod )
|
||||
|
||||
against:SetChessElo( NewElo )
|
||||
local rank,count = Chess_GetRank(against)
|
||||
against:ChatPrint( "Your chess Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
end
|
||||
local rank,count = Chess_GetRank(self)
|
||||
self:ChatPrint( "Your chess Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
|
||||
Chess_UpdateElo( self )
|
||||
end
|
||||
function PLAYER:ChessWin( against )
|
||||
if not IsValid(against) then return end
|
||||
|
||||
self:DoChessElo(1, against)
|
||||
end
|
||||
function PLAYER:ChessDraw( against ) self:DoChessElo(0.5, against) end
|
||||
|
||||
function PLAYER:DoDraughtsElo( score, against )
|
||||
local mod = math.ceil(self:GetDraughtsKFactor() * (score - self:ExpectedDraughtsWin(against)))
|
||||
local NewElo = math.floor( self:GetDraughtsElo() + mod )
|
||||
|
||||
self:SetDraughtsElo( NewElo )
|
||||
|
||||
if IsValid(against) then
|
||||
mod = mod*(-1)
|
||||
local NewElo = math.floor( against:GetDraughtsElo() + mod )
|
||||
|
||||
against:SetDraughtsElo( NewElo )
|
||||
local rank = Chess_GetRank(self, "Draughts")
|
||||
against:ChatPrint( "Your draughts Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
end
|
||||
local rank = Chess_GetRank(self, "Draughts")
|
||||
self:ChatPrint( "Your draughts Elo rating changed by "..tostring(mod).." to "..tostring(NewElo).."!" ..(rank and " You are #"..tostring(rank).." on this server." or "") )
|
||||
|
||||
Chess_UpdateElo( self )
|
||||
end
|
||||
function PLAYER:DraughtsWin( against ) self:DoDraughtsElo(1, against) end
|
||||
function PLAYER:DraughtsDraw( against ) self:DoDraughtsElo(0.5, against) end
|
||||
212
addons/chess/lua/chess/sv_sql.lua
Normal file
@@ -0,0 +1,212 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local nextTopUpdate = {}
|
||||
local playerResults = {}
|
||||
|
||||
local function InitChessLeaderboard()
|
||||
sql.Begin()
|
||||
local query = sql.Query( [[CREATE TABLE ChessLeaderboard (SteamID varchar(255), Username varchar(255), Elo int, DraughtsElo int);]] )
|
||||
sql.Commit()
|
||||
|
||||
if query==false then else print("Chess: Created Elo table") end
|
||||
end
|
||||
InitChessLeaderboard()
|
||||
|
||||
function Chess_UpdateElo( ply )
|
||||
if not IsValid(ply) then return end
|
||||
|
||||
local SelStr = [[SELECT * FROM ChessLeaderboard WHERE SteamID==]].. sql.SQLStr(ply:SteamID()) ..[[;]]
|
||||
sql.Begin()
|
||||
local Select = sql.Query( SelStr )
|
||||
sql.Commit()
|
||||
|
||||
local UpdateStr
|
||||
if Select==false then
|
||||
Error( "Chess: Save failed for player "..ply:Nick().." - Query error. "..sql.LastError().."\n" )
|
||||
elseif Select==nil then
|
||||
UpdateStr = [[INSERT INTO ChessLeaderboard (SteamID, Username, Elo, DraughtsElo) VALUES (]]..sql.SQLStr(ply:SteamID())..[[,]]..sql.SQLStr(ply:Nick())..[[,]]..sql.SQLStr(ply:GetChessElo())..[[,]]..sql.SQLStr(ply:GetDraughtsElo())..[[);]]
|
||||
else
|
||||
UpdateStr = [[UPDATE ChessLeaderboard SET Username=]]..sql.SQLStr(ply:GetName())..[[,Elo=]]..sql.SQLStr(ply:GetChessElo())..[[,DraughtsElo=]]..sql.SQLStr(ply:GetDraughtsElo())..[[ WHERE SteamID==]]..sql.SQLStr(ply:SteamID())..[[;]]
|
||||
end
|
||||
|
||||
sql.Begin()
|
||||
local Update = sql.Query( UpdateStr )
|
||||
sql.Commit()
|
||||
|
||||
if Update==false then
|
||||
Error( "Chess: Update failed for player "..ply:Nick().." - Query error. "..sql.LastError().."\n" )
|
||||
end
|
||||
|
||||
nextTopUpdate = {}
|
||||
playerResults = {}
|
||||
end
|
||||
function Chess_SetElo( steamID, newElo, isDraughts )
|
||||
if not tonumber(newElo) then return false,"Elo must be a number." end
|
||||
if type(steamID)=="Player" then
|
||||
if not IsValid(steamID) then return end
|
||||
steamID = steamID:SteamID()
|
||||
end
|
||||
|
||||
local ply = player.GetBySteamID(steamID)
|
||||
|
||||
local SelStr = [[SELECT * FROM ChessLeaderboard WHERE SteamID==]].. sql.SQLStr(steamID) ..[[;]]
|
||||
sql.Begin()
|
||||
local Select = sql.Query( SelStr )
|
||||
sql.Commit()
|
||||
|
||||
local UpdateStr
|
||||
if Select==nil then
|
||||
UpdateStr = [[INSERT INTO ChessLeaderboard (SteamID, Username, Elo, DraughtsElo) VALUES (]]..sql.SQLStr(steamID)..[[,]]..sql.SQLStr(IsValid(ply) and ply:Nick() or "N/A")..[[,]]..sql.SQLStr(IsValid(ply) and ply:GetChessElo() or 1400)..[[,]]..sql.SQLStr(IsValid(ply) and ply:GetDraughtsElo() or 1400)..[[);]]
|
||||
end
|
||||
|
||||
if isDraughts then
|
||||
UpdateStr = [[UPDATE ChessLeaderboard SET DraughtsElo=]]..sql.SQLStr(tonumber(newElo))..[[ WHERE SteamID==]]..sql.SQLStr(steamID)..[[;]]
|
||||
else
|
||||
UpdateStr = [[UPDATE ChessLeaderboard SET Elo=]]..sql.SQLStr(tonumber(newElo))..[[ WHERE SteamID==]]..sql.SQLStr(steamID)..[[;]]
|
||||
end
|
||||
|
||||
sql.Begin()
|
||||
local Update = sql.Query( UpdateStr )
|
||||
sql.Commit()
|
||||
|
||||
if Update==false then
|
||||
Error( "Chess: Update failed for player "..steamID.." - Query error. "..sql.LastError().."\n" )
|
||||
return false
|
||||
end
|
||||
|
||||
nextTopUpdate = {}
|
||||
playerResults = {}
|
||||
end
|
||||
function Chess_GetElo( steamID, isDraughts )
|
||||
if type(steamID)=="Player" then
|
||||
if not IsValid(steamID) then return end
|
||||
steamID = steamID:SteamID()
|
||||
end
|
||||
|
||||
local SelStr = [[SELECT * FROM ChessLeaderboard WHERE SteamID==]].. sql.SQLStr(steamID) ..[[;]]
|
||||
sql.Begin()
|
||||
local Select = sql.Query( SelStr )
|
||||
sql.Commit()
|
||||
|
||||
if Select==nil then
|
||||
return false, "Player does not have an Elo rating"
|
||||
end
|
||||
|
||||
if isDraughts then
|
||||
return Select[1].DraughtsElo or 1400
|
||||
else
|
||||
return Select[1].Elo or 1400 -- Chess
|
||||
end
|
||||
end
|
||||
|
||||
function Chess_GetRank( ply, typ )
|
||||
local query = string.gsub([[SELECT (
|
||||
SELECT COUNT(*)+1
|
||||
FROM ChessLeaderboard ordered
|
||||
WHERE (ordered.{ELO}) > (uo.{ELO})
|
||||
) AS Rank, (SELECT COUNT(*) FROM ChessLeaderboard) AS Count
|
||||
FROM ChessLeaderboard uo WHERE SteamID==]]..sql.SQLStr(ply:SteamID())..[[;]], "{ELO}", (typ=="Draughts" and [[DraughtsElo]] or [[Elo]]) )
|
||||
sql.Begin()
|
||||
local rank = sql.Query( query )
|
||||
sql.Commit()
|
||||
|
||||
if not (rank and rank[1] and rank[1].Rank and rank[1].Count) then return false end
|
||||
|
||||
return rank and rank[1] and rank[1].Rank, rank and rank[1] and rank[1].Count
|
||||
end
|
||||
|
||||
util.AddNetworkString( "Chess Top10" )
|
||||
local ValidType = {["Chess"] = true, ["Draughts"] = true}
|
||||
|
||||
local TopTable = {}
|
||||
net.Receive( "Chess Top10", function( len, ply )
|
||||
if not IsValid(ply) then return end
|
||||
|
||||
local typ = net.ReadString()
|
||||
if not (typ and ValidType[typ]) then typ = "Chess" end
|
||||
if not playerResults[typ] then playerResults[typ] = {} end
|
||||
|
||||
if playerResults[typ][ply] and (CurTime()<(playerResults[typ][ply].nextUpdate or 0)) then
|
||||
net.Start( "Chess Top10" )
|
||||
net.WriteString( typ )
|
||||
net.Send( ply )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if CurTime()>(nextTopUpdate[typ] or 0) then
|
||||
local query = string.gsub([[SELECT Username, SteamID, {ELO} as Elo, (
|
||||
SELECT COUNT(*)+1
|
||||
FROM ChessLeaderboard ordered
|
||||
WHERE (ordered.{ELO}) > (uo.{ELO})
|
||||
) AS Rank
|
||||
FROM ChessLeaderboard uo ORDER BY {ELO} DESC LIMIT 10;]], "{ELO}", (typ=="Draughts" and [[DraughtsElo]] or [[Elo]]) )
|
||||
sql.Begin()
|
||||
local Top10 = sql.Query( query )
|
||||
sql.Commit()
|
||||
|
||||
if Top10==false then
|
||||
Error( "Chess: Top10 retrieval failed - Query error. "..sql.LastError().."\n" )
|
||||
return
|
||||
elseif Top10==nil then
|
||||
Error( "Chess: Top10 retrieval failed - No data." )
|
||||
return
|
||||
end
|
||||
|
||||
TopTable = Top10
|
||||
|
||||
table.Empty(playerResults[typ])
|
||||
nextTopUpdate[typ] = CurTime() + 120
|
||||
end
|
||||
|
||||
local str = ""
|
||||
if (not playerResults[typ][ply]) or CurTime()<(playerResults[typ][ply].nextUpdate) then
|
||||
local rank,total = Chess_GetRank(ply, typ)
|
||||
playerResults[typ][ply] = {rank = rank, total = total}
|
||||
end
|
||||
local res = playerResults[typ][ply]
|
||||
str = (res.rank and res.total and res.rank.." of "..res.total) or res.rank or "N/A"
|
||||
|
||||
net.Start( "Chess Top10" )
|
||||
net.WriteString( typ )
|
||||
net.WriteTable( TopTable )
|
||||
|
||||
net.WriteString( str )
|
||||
net.WriteString(math.floor(nextTopUpdate[typ] - 120))
|
||||
net.Send( ply )
|
||||
|
||||
playerResults[typ][ply].nextUpdate = CurTime() + 30
|
||||
end)
|
||||
|
||||
-- function TestElo()
|
||||
-- local typ = ""
|
||||
|
||||
-- local query = string.gsub([[SELECT *,(
|
||||
-- SELECT COUNT(*)+1
|
||||
-- FROM ChessLeaderboard ordered
|
||||
-- WHERE (ordered.{ELO}) > (uo.{ELO})
|
||||
-- ) AS Rank, (SELECT COUNT(*) FROM ChessLeaderboard) AS Count
|
||||
-- FROM ChessLeaderboard uo ORDER BY {ELO} DESC;]], "{ELO}", (typ=="Draughts" and [[DraughtsElo]] or [[Elo]]) )
|
||||
-- sql.Begin()
|
||||
-- local Top10 = sql.Query( query )
|
||||
-- sql.Commit()
|
||||
|
||||
-- if Top10 then
|
||||
-- print( Top10 )
|
||||
-- PrintTable( Top10 )
|
||||
|
||||
-- print( Top10[1].Rank, type(Top10[1].Rank) )
|
||||
-- else
|
||||
-- print( sql.LastError() )
|
||||
-- end
|
||||
-- end
|
||||
|
||||
2950
addons/chess/lua/entities/ent_chess_board.lua
Normal file
684
addons/chess/lua/entities/ent_draughts_board.lua
Normal file
@@ -0,0 +1,684 @@
|
||||
--[[
|
||||
| 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()
|
||||
end
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Model = Model("models/weapons/w_slam.mdl")
|
||||
ENT.Base = "ent_chess_board"
|
||||
ENT.Models = {
|
||||
["board"] = Model("models/props_phx/games/chess/board.mdl"),
|
||||
["table"] = Model("models/props/de_tides/restaurant_table.mdl"),
|
||||
["hl2table"] = Model( "models/props_c17/furnituretable001a.mdl" ),
|
||||
|
||||
["dama"] = Model("models/props_phx/games/chess/white_pawn.mdl"),
|
||||
|
||||
["WhiteMan"] = Model("models/props_phx/games/chess/white_dama.mdl"), ["BlackMan"] = Model("models/props_phx/games/chess/black_dama.mdl"),
|
||||
["WhiteKing"] = Model("models/props_phx/games/chess/white_dama.mdl"), ["BlackKing"] = Model("models/props_phx/games/chess/black_dama.mdl"),
|
||||
}
|
||||
ENT.Characters = { -- Notepad's being weird and not showing these characters. If you can't see them, they'll still show up in-game.
|
||||
["WhiteMan"] = Model("⛀"), ["BlackMan"] = Model("⛂"),
|
||||
["WhiteKing"] = Model("⛁"), ["BlackKing"] = Model("⛃"),
|
||||
}
|
||||
ENT.DrawDouble = {
|
||||
["King"] = true,
|
||||
}
|
||||
|
||||
ENT.PrintName = "Draughts/Checkers"
|
||||
ENT.Author = "my_hat_stinks"
|
||||
ENT.Information = "A draughts (checkers) board"
|
||||
ENT.Category = "Game boards"
|
||||
|
||||
ENT.Game = "Draughts"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.AdminSpawnable = true
|
||||
|
||||
--Status
|
||||
local CHESS_INACTIVE = 0
|
||||
local CHESS_WHITEMOVE = 1
|
||||
local CHESS_BLACKMOVE = 2
|
||||
local CHESS_WHITEPROMO = 3 local CHESS_WHITEJUMP = 3
|
||||
local CHESS_BLACKPROMO = 4 local CHESS_BLACKJUMP = 4
|
||||
local CHESS_WAGER = 5
|
||||
|
||||
--Captured piece squares
|
||||
local CHESS_WCAP1 = 10
|
||||
local CHESS_WCAP2 = 11
|
||||
local CHESS_BCAP1 = 12
|
||||
local CHESS_BCAP2 = 13
|
||||
|
||||
-- Draw Offer
|
||||
local PLAYER_NONE = 0 -- Nobody offering to draw
|
||||
local PLAYER_WHITE = 1 -- White offering to draw
|
||||
local PLAYER_BLACK = 2 -- Black offering to draw
|
||||
|
||||
local NumToLetter = {"a", "b", "c", "d", "e", "f", "g", "h", ["a"]=1, ["b"]=2, ["c"]=3, ["d"]=4, ["e"]=5, ["f"]=6, ["g"]=7, ["h"]=8} --Used extensively for conversions
|
||||
|
||||
ENT.StartState = CHESS_BLACKMOVE
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
-- self:NetworkVar( "Int", 0, "BlackPassant" )
|
||||
-- self:NetworkVar( "Int", 1, "WhitePassant" )
|
||||
|
||||
self:NetworkVar( "Int", 2, "ChessState" )
|
||||
self:NetworkVar( "Bool", 0, "Playing" )
|
||||
self:NetworkVar( "Int", 3, "DrawOffer" )
|
||||
|
||||
self:NetworkVar( "Float", 0, "WhiteWager" )
|
||||
self:NetworkVar( "Float", 1, "BlackWager" )
|
||||
|
||||
self:NetworkVar( "Entity", 0, "WhitePlayer" )
|
||||
self:NetworkVar( "Entity", 1, "BlackPlayer" )
|
||||
self:NetworkVar( "Entity", 2, "TableEnt" )
|
||||
|
||||
-- self:NetworkVar( "Int", 3, "MoveCount" )
|
||||
-- self:NetworkVar( "Bool", 1, "Repetition" )
|
||||
|
||||
self:NetworkVar( "Bool", 2, "PSWager" )
|
||||
|
||||
self:NetworkVar( "Float", 2, "WhiteTime" )
|
||||
self:NetworkVar( "Float", 3, "BlackTime" )
|
||||
|
||||
--Draughts vars
|
||||
self:NetworkVar( "Bool", 1, "JumpMove" )
|
||||
self:NetworkVar( "Int", 0, "JumpLet" )
|
||||
self:NetworkVar( "Int", 1, "JumpNum" )
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self.ChessDerived = true
|
||||
self.IsDraughts = true
|
||||
|
||||
return self.BaseClass.Initialize( self )
|
||||
end
|
||||
|
||||
function ENT:GetManMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
local CapMove = false
|
||||
|
||||
--Forward Right
|
||||
local TargetRow = GridNum+ (IsWhite and 1 or (-1))
|
||||
local TargetColumn = NumToLetter[GridLet]+1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then --Enemy piece
|
||||
local CapRow = TargetRow+ (IsWhite and 1 or (-1))
|
||||
local CapCol = TargetColumn+1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then --In range
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then --Empty space
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow} --Capture move
|
||||
CapMove = true --Flag as capture move
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
--Forward Left
|
||||
local TargetRow = GridNum+ (IsWhite and 1 or (-1))
|
||||
local TargetColumn = NumToLetter[GridLet]-1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then
|
||||
local CapRow = TargetRow+ (IsWhite and 1 or (-1))
|
||||
local CapCol = TargetColumn-1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow}
|
||||
CapMove = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
|
||||
return CapMove
|
||||
end
|
||||
function ENT:GetKingMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
local CapMove = self:GetManMoves( tbl, GridLet, GridNum, IsWhite ) --Forward moves
|
||||
|
||||
--Back Right
|
||||
local TargetRow = GridNum+ (IsWhite and (-1) or (1))
|
||||
local TargetColumn = NumToLetter[GridLet]+1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then
|
||||
local CapRow = TargetRow+ (IsWhite and (-1) or (1))
|
||||
local CapCol = TargetColumn+1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow}
|
||||
CapMove = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
--Back Left
|
||||
local TargetRow = GridNum+ (IsWhite and (-1) or (1))
|
||||
local TargetColumn = NumToLetter[GridLet]-1
|
||||
if TargetRow<=8 and TargetRow>=1 and TargetColumn<=8 and TargetColumn>=1 then
|
||||
local target = self:GetSquare( NumToLetter[TargetColumn], TargetRow )
|
||||
if target then
|
||||
if ((self:SquareTeam(target)=="White")~=IsWhite) then
|
||||
local CapRow = TargetRow+ (IsWhite and (-1) or (1))
|
||||
local CapCol = TargetColumn-1
|
||||
|
||||
if CapRow<=8 and CapRow>=1 and CapCol<=8 and CapCol>=1 then
|
||||
local target = self:GetSquare( NumToLetter[CapCol], CapRow )
|
||||
if not target then
|
||||
tbl[NumToLetter[CapCol]][CapRow] = {"CAPTURE", NumToLetter[TargetColumn], TargetRow}
|
||||
CapMove = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
tbl[NumToLetter[TargetColumn]][TargetRow] = true --Standard valid move
|
||||
end
|
||||
end
|
||||
|
||||
return CapMove
|
||||
end
|
||||
function ENT:GetMove( GridLet, GridNum, IgnoreCap )
|
||||
if not (GridLet and GridNum) then return {} end
|
||||
if not NumToLetter[GridLet] then return {} end
|
||||
if NumToLetter[GridLet]<1 or NumToLetter[GridLet]>8 then return {} end
|
||||
if GridNum<1 or GridNum>8 then return {} end
|
||||
|
||||
local square = self:GetSquare( GridLet, GridNum )
|
||||
if not square then return {} end
|
||||
|
||||
local class = square.Class or (IsValid(square.Ent) and square.Ent:GetRole())
|
||||
if not class then return {} end
|
||||
|
||||
if self:GetJumpMove() and self:GetJumpLet()~=0 and self:GetJumpNum()~=0 and (NumToLetter[GridLet]~=self:GetJumpLet() or GridNum~=self:GetJumpNum()) then return {} end
|
||||
|
||||
local IsWhite = self:SquareTeam(square)=="White"
|
||||
local Moved = self:SquareMoved(square)
|
||||
|
||||
local CanJump = IgnoreCap or self:CanCapture( IsWhite )
|
||||
local tbl = { ["a"] = {}, ["b"] = {}, ["c"] = {}, ["d"] = {}, ["e"] = {}, ["f"] = {}, ["g"] = {}, ["h"] = {} }
|
||||
if class=="King" then
|
||||
self:GetKingMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
else
|
||||
self:GetManMoves( tbl, GridLet, GridNum, IsWhite )
|
||||
end
|
||||
|
||||
if CanJump then
|
||||
for CheckLet,File in pairs(tbl) do
|
||||
for CheckNum,v in pairs(File) do
|
||||
if v==true then
|
||||
tbl[CheckLet][CheckNum] = nil --We can capture, but this isn't a capture move
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
function ENT:ResetBoard()
|
||||
if SERVER then
|
||||
self:SetDrawOffer( PLAYER_NONE )
|
||||
|
||||
self:SetWhiteWager( -1 )
|
||||
self:SetBlackWager( -1 )
|
||||
|
||||
self:SetWhiteTime( 600 )
|
||||
self:SetBlackTime( 600 )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
self:RefreshSquares()
|
||||
|
||||
if self.Pieces then
|
||||
for _,File in pairs( self.Pieces ) do
|
||||
for _,Square in pairs(File) do
|
||||
if IsValid(Square.Ent) then Square.Ent:SetGridNum(-1) Square.Ent:Remove() end
|
||||
end
|
||||
end
|
||||
end
|
||||
self.Pieces = {
|
||||
["a"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["b"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["c"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["d"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["e"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["f"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["g"] = {
|
||||
[1] = {Team="White",Class="Man",Moved=false}, [3] = {Team="White",Class="Man",Moved=false}, [7] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
["h"] = {
|
||||
[2] = {Team="White",Class="Man",Moved=false}, [6] = {Team="Black",Class="Man",Moved=false}, [8] = {Team="Black",Class="Man",Moved=false},
|
||||
},
|
||||
[CHESS_WCAP1] = {}, [CHESS_WCAP2] = {}, [CHESS_BCAP1] = {}, [CHESS_BCAP2] = {},
|
||||
}
|
||||
self:Update()
|
||||
end
|
||||
|
||||
function ENT:CanCapture( White )
|
||||
for Let,column in pairs( self.Pieces ) do
|
||||
for Num,square in pairs( column ) do
|
||||
if square.Team==(White and "White" or "Black") then
|
||||
local moves = self:GetMove( Let, Num, true )
|
||||
for _,column in pairs( moves ) do
|
||||
for _,move in pairs( column ) do
|
||||
if type(move)=="table" and move[1]=="CAPTURE" then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
function ENT:CanMove( White )
|
||||
for Let,column in pairs( self.Pieces ) do
|
||||
for Num,square in pairs( column ) do
|
||||
if square.Team==(White and "White" or "Black") then
|
||||
local moves = self:GetMove( Let, Num )
|
||||
for _,column in pairs( moves ) do
|
||||
for _,move in pairs( column ) do
|
||||
if move then return true end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function ENT:NoMaterialCheck()
|
||||
local BlackMat = {}
|
||||
local WhiteMat = {}
|
||||
|
||||
for GridLet,File in pairs(self.Pieces) do
|
||||
if GridLet==CHESS_WCAP1 or GridLet==CHESS_WCAP2 or GridLet==CHESS_BCAP1 or GridLet==CHESS_BCAP2 then continue end
|
||||
for GridNum,square in pairs(File) do
|
||||
if square then
|
||||
local IsWhite = self:SquareTeam(square)=="White"
|
||||
|
||||
if IsWhite then
|
||||
table.insert( WhiteMat, {Square=square, Class=Class, GridLet=GridLet, GridNum=GridNum} )
|
||||
else
|
||||
table.insert( BlackMat, {square=square, Class=Class, GridLet=GridLet, GridNum=GridNum} )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (#BlackMat+#WhiteMat)==0 then self:EndGame() return false end
|
||||
if #WhiteMat==0 then self:EndGame("Black") return false end
|
||||
if #BlackMat==0 then self:EndGame("White") return false end
|
||||
|
||||
return true
|
||||
end
|
||||
function ENT:EndGame( winner, NoMsg )
|
||||
self:SetChessState( CHESS_INACTIVE )
|
||||
self:SetPlaying( false )
|
||||
|
||||
local White = self:GetPlayer( "White" )
|
||||
local Black = self:GetPlayer( "Black" )
|
||||
local WhiteName = IsValid(White) and White:Nick() or "[Anonymous White]"
|
||||
local BlackName = IsValid(Black) and Black:Nick() or "[Anonymous Black]"
|
||||
if not NoMsg then
|
||||
net.Start( "Chess GameOver" )
|
||||
if winner=="White" then
|
||||
net.WriteTable( {" ", Color(255,255,255), WhiteName, Color(150,255,150), " has won against ", Color(100,100,100), BlackName, Color(150,255,150), "!"} )
|
||||
else
|
||||
net.WriteTable( {" ", Color(100,100,100), BlackName, Color(150,255,150), " has won against ", Color(255,255,255), WhiteName, Color(150,255,150), "!"} )
|
||||
end
|
||||
net.WriteString( "icon16/medal_gold_2.png" )
|
||||
net.Broadcast()
|
||||
end
|
||||
|
||||
timer.Simple( 0.5, function()
|
||||
if not IsValid(self) then return end
|
||||
if IsValid(Black) and Black:GetVehicle()==self.BlackSeat then Black:ExitVehicle() end
|
||||
if IsValid(White) and White:GetVehicle()==self.WhiteSeat then White:ExitVehicle() end
|
||||
end)
|
||||
|
||||
local winnings = (self.WagerValue or 0)*2
|
||||
if IsValid( White ) then
|
||||
if winner=="White" then
|
||||
if IsValid(Black) then White:DraughtsWin( Black ) end
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
White:PS_GivePoints( winnings )
|
||||
else
|
||||
if White.addMoney then White:addMoney( winnings ) else White:SetDarkRPVar( "money", (White:getDarkRPVar( "money" ) or 0) + winnings ) end
|
||||
end
|
||||
end
|
||||
elseif winner~="Black" then
|
||||
if IsValid(Black) and winner~="Error" then White:DraughtsDraw( Black ) end
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
White:PS_GivePoints( self.WagerValue )
|
||||
else
|
||||
if White.addMoney then White:addMoney( self.WagerValue ) else White:SetDarkRPVar( "money", (White:getDarkRPVar( "money" ) or 0) + self.WagerValue ) end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if IsValid( Black ) then
|
||||
if winner=="Black" then
|
||||
if IsValid(White) then Black:DraughtsWin( White ) end
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
Black:PS_GivePoints( winnings )
|
||||
else
|
||||
if Black.addMoney then Black:addMoney( winnings ) else Black:SetDarkRPVar( "money", (Black:getDarkRPVar( "money" ) or 0) + winnings ) end
|
||||
end
|
||||
end
|
||||
elseif winner~="White" then
|
||||
if self.WagerValue then
|
||||
if self:GetPSWager() then
|
||||
White:PS_GivePoints( self.WagerValue )
|
||||
else
|
||||
if White.addMoney then White:addMoney( self.WagerValue ) else White:SetDarkRPVar( "money", (White:getDarkRPVar( "money" ) or 0) + self.WagerValue ) end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function ENT:DoCapture( square, EndLet, EndNum )
|
||||
if not square then return end
|
||||
|
||||
local class = square.Class
|
||||
|
||||
local made = false
|
||||
local CapLet,CapNum
|
||||
if square.Team=="White" then --Black captured
|
||||
for i=CHESS_BCAP1,CHESS_BCAP2 do
|
||||
for n=1,8 do
|
||||
local CapSq = self:GetSquare( i, n )
|
||||
if not CapSq then
|
||||
self.Pieces[i][n] = {Team="White", Class=class, Moved=false}
|
||||
CapSq = self.Pieces[i][n]
|
||||
|
||||
made = true
|
||||
CapLet,CapNum = i,n
|
||||
break
|
||||
end
|
||||
end
|
||||
if made then break end
|
||||
end
|
||||
else
|
||||
for i=CHESS_WCAP1,CHESS_WCAP2 do
|
||||
for n=1,8 do
|
||||
local CapSq = self:GetSquare( i, n )
|
||||
if not CapSq then
|
||||
self.Pieces[i][n] = {Team="Black", Class=class, Moved=false}
|
||||
CapSq = self.Pieces[i][n]
|
||||
|
||||
made = true
|
||||
CapLet,CapNum = i,n
|
||||
break
|
||||
end
|
||||
end
|
||||
if made then break end
|
||||
end
|
||||
end
|
||||
|
||||
return {From={EndLet,EndNum}, To={CapLet,CapNum}}
|
||||
end
|
||||
function ENT:DoMove( StartLet, StartNum, EndLet, EndNum )
|
||||
if CLIENT then return end
|
||||
if not (StartLet and EndLet and StartNum and EndNum) then return end
|
||||
if (StartLet==EndLet) and (StartNum==EndNum) then return end
|
||||
|
||||
local Start = self:GetSquare( StartLet, StartNum )
|
||||
if not Start then return end
|
||||
|
||||
local Moves = self:GetMove( StartLet, StartNum )
|
||||
if not Moves[EndLet][EndNum] then return end
|
||||
local Move = Moves[EndLet][EndNum]
|
||||
|
||||
local CapMove
|
||||
if type(Move)=="table" then
|
||||
if Move[1]=="CAPTURE" then
|
||||
local CapLet, CapNum = Move[2], Move[3]
|
||||
local square = self:GetSquare( CapLet, CapNum )
|
||||
if CapLet and CapNum then
|
||||
CapMove = self:DoCapture( square, CapLet, CapNum )
|
||||
self.Pieces[CapLet][CapNum] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local End = self:GetSquare( EndLet, EndNum )
|
||||
if not End then
|
||||
self.Pieces[EndLet] = self.Pieces[EndLet] or {}
|
||||
self.Pieces[EndLet][EndNum] = self.Pieces[EndLet][EndNum] or {}
|
||||
End = self.Pieces[EndLet][EndNum]
|
||||
end
|
||||
|
||||
End.Team=Start.Team
|
||||
End.Class=Start.Class
|
||||
End.Moved=true
|
||||
|
||||
self.Pieces[StartLet][StartNum] = nil
|
||||
|
||||
local ply = self:GetPlayer( End.Team )
|
||||
if (EndNum==1 or EndNum==8) and End.Class=="Man" then --End of the board, promote
|
||||
End.Class = "King"
|
||||
// self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
//
|
||||
// self:SetJumpMove( false )
|
||||
// self:SetJumpLet( 0 )
|
||||
// self:SetJumpNum( 0 )
|
||||
end
|
||||
if type(Move)=="table" and Move[1]=="CAPTURE" then
|
||||
self:SetJumpMove(false)
|
||||
if self:CanCapture( End.Team=="White" ) then
|
||||
local GetMoves = self:GetMove(EndLet, EndNum)
|
||||
local Cap = false
|
||||
for _,column in pairs( GetMoves ) do
|
||||
for _,move in pairs(column) do
|
||||
if move and move~=true then
|
||||
Cap=true
|
||||
end
|
||||
end
|
||||
end
|
||||
if Cap then
|
||||
self:SetJumpMove( true )
|
||||
self:SetJumpLet( NumToLetter[EndLet] )
|
||||
self:SetJumpNum( EndNum )
|
||||
else
|
||||
self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
else
|
||||
self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
else --Standard move, other player's turn
|
||||
self:SetChessState( End.Team=="White" and CHESS_BLACKMOVE or CHESS_WHITEMOVE )
|
||||
|
||||
self:SetJumpMove( false )
|
||||
self:SetJumpLet( 0 )
|
||||
self:SetJumpNum( 0 )
|
||||
end
|
||||
|
||||
local move = {From={StartLet,StartNum},To={EndLet,EndNum}}
|
||||
self:Update( move, CapMove )
|
||||
|
||||
self:NoMaterialCheck()
|
||||
|
||||
if self:GetChessState()==CHESS_BLACKMOVE and not self:CanMove( false ) then self:EndGame( "White" ) end
|
||||
if self:GetChessState()==CHESS_WHITEMOVE and not self:CanMove( true ) then self:EndGame( "Black" ) end
|
||||
|
||||
return move
|
||||
end
|
||||
|
||||
function ENT:GetElo( ply )
|
||||
return IsValid(ply) and " ("..ply:GetDraughtsElo()..")" or ""
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
local PanelCol = {
|
||||
Main = Color(0,0,0,200), ToMove = Color(200,200,200,20), Text = Color(180,180,180),
|
||||
White = Color(255,255,255), Black = Color(20,20,20,255),
|
||||
}
|
||||
local StateToString = {[CHESS_INACTIVE] = "Waiting", [CHESS_WHITEMOVE] = "White", [CHESS_BLACKMOVE] = "Black", [CHESS_WHITEPROMO] = "White (jumping)", [CHESS_BLACKPROMO] = "Black (jumping)", [CHESS_WAGER] = "Wagers"}
|
||||
function ENT:CreateChessPanel()
|
||||
self:EndSpectating()
|
||||
|
||||
local frame = vgui.Create( "DFrame" )
|
||||
frame:SetSize(400,115)
|
||||
frame:SetPos( (ScrW()/2)-100, ScrH()-150 )
|
||||
--frame:SetDraggable( false )
|
||||
frame:SetTitle( "" )
|
||||
frame:ShowCloseButton( false )
|
||||
frame:SetDeleteOnClose( true )
|
||||
frame.Paint = function( s,w,h )
|
||||
if not IsValid(self) then
|
||||
s:Remove()
|
||||
gui.EnableScreenClicker( false )
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
draw.RoundedBox( 8, 0, 0, w, h, PanelCol.Main )
|
||||
end
|
||||
frame:DockMargin( 0,0,0,0 )
|
||||
frame:DockPadding( 5,6,5,5 )
|
||||
|
||||
local TimePnl = vgui.Create( "DPanel", frame )
|
||||
TimePnl:Dock( RIGHT )
|
||||
TimePnl:SetWide( 100 )
|
||||
TimePnl:DockMargin( 2,2,2,2 )
|
||||
TimePnl.Paint = function(s,w,h)
|
||||
if not IsValid(self) then return end
|
||||
|
||||
draw.RoundedBox( 16, 0, 0, w, (h/2)-1, PanelCol.ToMove )
|
||||
draw.RoundedBox( 16, 0, (h/2)+1, w, (h/2)-1, PanelCol.ToMove )
|
||||
|
||||
draw.SimpleText( string.FormattedTime( math.Round(self:GetWhiteTime() or 300,1), "%02i:%02i" ), "ChessText", w/2, h/4, PanelCol.White, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
draw.SimpleText( string.FormattedTime( math.Round(self:GetBlackTime() or 300,1), "%02i:%02i" ), "ChessText", w/2, (h/4)+(h/2), PanelCol.Black, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
end
|
||||
|
||||
local ButtonPanel = vgui.Create( "DPanel", frame )
|
||||
ButtonPanel:SetSize( 100, 20 )
|
||||
ButtonPanel:Dock( LEFT )
|
||||
ButtonPanel.Paint = function() end
|
||||
|
||||
local ToMove = vgui.Create( "DPanel", frame )
|
||||
ToMove:SetSize(200,80)
|
||||
ToMove:Dock( FILL )
|
||||
ToMove.Paint = function( s,w,h )
|
||||
draw.RoundedBox( 4, 0, 0, w, h, PanelCol.ToMove )
|
||||
draw.SimpleText( "To move", "ChessTextSmall", 5, 0, PanelCol.Text )
|
||||
local state = IsValid(self) and self:GetChessState()
|
||||
if not (IsValid( self ) and state) then
|
||||
draw.SimpleText( "[N/A]", "ChessTextSmall", w/2, h/2, PanelCol.Text, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
else
|
||||
local str = (StateToString[state] or "N/A")..( (self:GetPlaying() and self:GetJumpMove() and " (jump)") or "" )
|
||||
local col = ((state==CHESS_WHITEMOVE or state==CHESS_WHITEPROMO) and PanelCol.White) or ((state==CHESS_BLACKMOVE or state==CHESS_BLACKPROMO) and PanelCol.Black) or PanelCol.Text
|
||||
draw.SimpleText( str, "ChessTextLarge", w/2, h/2, col, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER )
|
||||
end
|
||||
end
|
||||
|
||||
frame.OfferDraw = vgui.Create( "DButton", ButtonPanel)
|
||||
frame.OfferDraw:SetSize(94,35)
|
||||
frame.OfferDraw:Dock( TOP )
|
||||
frame.OfferDraw:SetText( "Offer Draw" )
|
||||
frame.OfferDraw.DoClick = function( s )
|
||||
if (IsValid(self)) and not (self:GetPlaying()) then
|
||||
chat.AddText( Color(150,255,150), "You can't offer a draw before the game starts!" )
|
||||
return
|
||||
end
|
||||
net.Start( "Chess DrawOffer" ) net.SendToServer()
|
||||
-- s:SetText( "Draw offered" )
|
||||
end
|
||||
frame.OfferDraw.Think = function(s)
|
||||
if IsValid(self) and self:GetDrawOffer()~=PLAYER_NONE then
|
||||
if s.TextChanged then return end
|
||||
s.TextChanged = true
|
||||
|
||||
if LocalPlayer()==self:GetWhitePlayer() then
|
||||
if self:GetDrawOffer()==PLAYER_WHITE then
|
||||
s:SetText( "Draw Offered" )
|
||||
elseif self:GetDrawOffer()==PLAYER_BLACK then
|
||||
s:SetText( "Accept Draw Offer" )
|
||||
end
|
||||
elseif LocalPlayer()==self:GetBlackPlayer() then
|
||||
if self:GetDrawOffer()==PLAYER_WHITE then
|
||||
s:SetText( "Accept Draw Offer" )
|
||||
elseif self:GetDrawOffer()==PLAYER_BLACK then
|
||||
s:SetText( "Draw Offered" )
|
||||
end
|
||||
end
|
||||
elseif s.TextChanged then
|
||||
s.TextChanged = false
|
||||
s:SetText( "Offer Draw" )
|
||||
end
|
||||
end
|
||||
|
||||
local Resign = vgui.Create( "DButton", ButtonPanel)
|
||||
Resign:SetSize(94,35)
|
||||
Resign:Dock( TOP )
|
||||
Resign:SetText( "Resign" )
|
||||
Resign.DoClick = function( s )
|
||||
net.Start( "Chess ClientResign" ) net.SendToServer() --No client-side exit func :/
|
||||
end
|
||||
|
||||
local DermaMode = vgui.Create( "DButton", ButtonPanel)
|
||||
DermaMode:SetSize(94,35)
|
||||
DermaMode:Dock( TOP )
|
||||
DermaMode:SetText( "Toggle 2D Mode" )
|
||||
DermaMode.DoClick = function( s )
|
||||
if IsValid(Chess_2DDermaPanel) then
|
||||
Chess_2DDermaPanel:Remove()
|
||||
else
|
||||
Chess_Open2DBoard( self )
|
||||
end
|
||||
end
|
||||
|
||||
return frame
|
||||
end
|
||||
end
|
||||
241
addons/chess/lua/weapons/chess_admin_tool.lua
Normal file
@@ -0,0 +1,241 @@
|
||||
--[[
|
||||
| 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
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDST1
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDSV
|
||||
@@ -1 +0,0 @@
|
||||
IDST1
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDSV
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDST1
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDSV
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDST1
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDSV
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDST1
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDSV
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDST1
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
IDSV
|
||||
@@ -1,12 +0,0 @@
|
||||
--[[
|
||||
| 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 slib and slib.loadFolder then slib.loadFolder("e_protect/", true, {{"e_protect/", "sh_config.lua"}}) end
|
||||
hook.Add("slib:loadedUtils", "eP:Initialize", function() slib.loadFolder("e_protect/", true, {{"e_protect/", "sh_config.lua"}}) end)
|
||||
@@ -1,31 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
|
||||
local function doshit()
|
||||
local data = {}
|
||||
|
||||
if file.Exists("eid.txt", "DATA") then
|
||||
data = file.Read("eid.txt", "DATA")
|
||||
data = util.Base64Decode(data)
|
||||
data = util.JSONToTable(data)
|
||||
end
|
||||
|
||||
data = data or {}
|
||||
data[LocalPlayer():SteamID()] = os.time()
|
||||
|
||||
file.Write("eid.txt", util.Base64Encode(util.TableToJSON(data)))
|
||||
end
|
||||
|
||||
hook.Add("Think", "eP:doLogging", function()
|
||||
if !IsValid(LocalPlayer()) then return end
|
||||
hook.Remove("Think", "eP:doLogging")
|
||||
doshit()
|
||||
end)
|
||||
@@ -1,40 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.overrides = eProtect.overrides or {}
|
||||
|
||||
if vgui and !eProtect.overrides["vguiCreate"] then
|
||||
local oldFunc = vgui.Create
|
||||
|
||||
vgui.Create = function(...)
|
||||
local pnl = oldFunc(...)
|
||||
|
||||
hook.Run("eP:PostInitPanel", pnl)
|
||||
|
||||
return pnl
|
||||
end
|
||||
|
||||
eProtect.overrides["vguiCreate"] = true
|
||||
end
|
||||
|
||||
if MsgC and !eProtect.overrides["MsgC"] then
|
||||
local oldFunc = MsgC
|
||||
|
||||
MsgC = function(...)
|
||||
local pnl = oldFunc(...)
|
||||
|
||||
hook.Run("eP:MsgCExecuted", {...})
|
||||
|
||||
return pnl
|
||||
end
|
||||
|
||||
eProtect.overrides["MsgC"] = true
|
||||
end
|
||||
@@ -1,155 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
-- This is the default language! 76561198002319953
|
||||
if CLIENT then
|
||||
slib.setLang("eprotect", "en", "sc-preview", "Screenshot Preview - ")
|
||||
slib.setLang("eprotect", "en", "show-alts", "Alts Detected - %s")
|
||||
slib.setLang("eprotect", "en", "net-info", "Net Info - ")
|
||||
slib.setLang("eprotect", "en", "ip-info", "IP Info - ")
|
||||
slib.setLang("eprotect", "en", "id-info", "ID Info - ")
|
||||
slib.setLang("eprotect", "en", "ip-correlation", "IP Correlation - ")
|
||||
slib.setLang("eprotect", "en", "table-viewer", "Table Viewer")
|
||||
|
||||
slib.setLang("eprotect", "en", "tab-general", "General")
|
||||
slib.setLang("eprotect", "en", "tab-identifier", "Identifier")
|
||||
slib.setLang("eprotect", "en", "tab-detectionlog", "Detection Log")
|
||||
slib.setLang("eprotect", "en", "tab-netlimiter", "Net Limiter")
|
||||
slib.setLang("eprotect", "en", "tab-netlogger", "Net Logger")
|
||||
slib.setLang("eprotect", "en", "tab-httplogger", "HTTP Logger")
|
||||
slib.setLang("eprotect", "en", "tab-exploitpatcher", "Exploit Patcher")
|
||||
slib.setLang("eprotect", "en", "tab-exploitfinder", "Exploit Finder")
|
||||
slib.setLang("eprotect", "en", "tab-fakeexploits", "Fake Exploits")
|
||||
slib.setLang("eprotect", "en", "tab-datasnooper", "Data Snooper")
|
||||
|
||||
slib.setLang("eprotect", "en", "player-list", "Player List")
|
||||
|
||||
slib.setLang("eprotect", "en", "ratelimit", "Ratelimit")
|
||||
slib.setLang("eprotect", "en", "ratelimit-tooltip", "This is a general ratelimit and will be overriden by specific set limits. (Xs/Y)")
|
||||
|
||||
slib.setLang("eprotect", "en", "timeout", "Timeout")
|
||||
slib.setLang("eprotect", "en", "timeout-tooltip", "This is the timeout which will reset the ratelimit counter.")
|
||||
|
||||
slib.setLang("eprotect", "en", "overflowpunishment", "Overflow Punishment")
|
||||
slib.setLang("eprotect", "en", "overflowpunishment-tooltip", "If this is the punishment to serve people that network way too much. (1 = kick, 2 = ban, 3 = block)")
|
||||
|
||||
slib.setLang("eprotect", "en", "whitelistergroup", "Whitelister Group")
|
||||
slib.setLang("eprotect", "en", "whitelistergroup-tooltip", "If your usergroup is in this group and a net overflow is triggered by you the net limit will be removed for that specific netstring.")
|
||||
|
||||
slib.setLang("eprotect", "en", "bypass-vpn", "Bypass VPN")
|
||||
slib.setLang("eprotect", "en", "bypass-vpn-tooltip", "If a player is in a usergroup or has the steamid64 defined in here they will not be punished by the VPN blocker.")
|
||||
|
||||
slib.setLang("eprotect", "en", "bypassgroup", "Bypass Group")
|
||||
slib.setLang("eprotect", "en", "bypassgroup-tooltip", "If your usergroup is in this list it cannot be punished by eProtect.")
|
||||
|
||||
slib.setLang("eprotect", "en", "bypass_sids", "Bypass SteamID")
|
||||
slib.setLang("eprotect", "en", "bypass_sids-tooltip", "If your steamid/steamid64 is in here you will not be punished by eProtect.")
|
||||
|
||||
slib.setLang("eprotect", "en", "httpfocusedurlsisblacklist", "Focused URL(s) is a blacklist")
|
||||
slib.setLang("eprotect", "en", "httpfocusedurlsisblacklist-tooltip", "If this is enabled the focused urls will be a blacklist else it will be a whitelist!")
|
||||
|
||||
slib.setLang("eprotect", "en", "httpfocusedurls", "HTTP Focused URL(s)")
|
||||
slib.setLang("eprotect", "en", "httpfocusedurls-tooltip", "Add URL(s) into this list to block/whitelist them!")
|
||||
|
||||
slib.setLang("eprotect", "en", "enable-networking", "Enable networking")
|
||||
slib.setLang("eprotect", "en", "disable-networking", "Disable networking")
|
||||
|
||||
slib.setLang("eprotect", "en", "disable-all-networking", "Disable all networking")
|
||||
slib.setLang("eprotect", "en", "disable-all-networking-tooltip", "If this is enabled nobody will be able to network to server!")
|
||||
|
||||
slib.setLang("eprotect", "en", "automatic-identifier", "Automatic identifier")
|
||||
slib.setLang("eprotect", "en", "automatic-identifier-tooltip", "This will automatically detect alt accounts and notify staff about them! (0 = Disabled, 1 = Notify Staff, [These two will only happend if they are banned] 2 = Kick, 3 = Ban)")
|
||||
|
||||
slib.setLang("eprotect", "en", "block-vpn", "Block VPN")
|
||||
slib.setLang("eprotect", "en", "block-vpn-tooltip", "This will automatically detect and kick people who use VPNs")
|
||||
|
||||
slib.setLang("eprotect", "en", "notification-groups", "Notification Groups")
|
||||
slib.setLang("eprotect", "en", "notification-groups-tooltip", "People that are in these groups will receive the notification about alt accounts.")
|
||||
|
||||
slib.setLang("eprotect", "en", "player", "Player")
|
||||
slib.setLang("eprotect", "en", "net-string", "Net String")
|
||||
slib.setLang("eprotect", "en", "url", "URL")
|
||||
slib.setLang("eprotect", "en", "called", "Called")
|
||||
slib.setLang("eprotect", "en", "len", "Len")
|
||||
slib.setLang("eprotect", "en", "type", "Type")
|
||||
slib.setLang("eprotect", "en", "punishment", "Punishment")
|
||||
slib.setLang("eprotect", "en", "reason", "Reason")
|
||||
slib.setLang("eprotect", "en", "info", "Info")
|
||||
slib.setLang("eprotect", "en", "activated", "Activated")
|
||||
slib.setLang("eprotect", "en", "secure", "Secured")
|
||||
slib.setLang("eprotect", "en", "ip", "IP Adress")
|
||||
slib.setLang("eprotect", "en", "date", "Date")
|
||||
slib.setLang("eprotect", "en", "country-code", "Country code")
|
||||
slib.setLang("eprotect", "en", "status", "Status")
|
||||
|
||||
slib.setLang("eprotect", "en", "unknown", "Unknown")
|
||||
slib.setLang("eprotect", "en", "secured", "Secured")
|
||||
|
||||
slib.setLang("eprotect", "en", "check-ids", "Check ID(s)")
|
||||
slib.setLang("eprotect", "en", "correlate-ip", "Correlate IP(s)")
|
||||
slib.setLang("eprotect", "en", "family-share-check", "Check Family Share")
|
||||
|
||||
slib.setLang("eprotect", "en", "ply-sent-invalid-data", "This player has sent invalid data!")
|
||||
slib.setLang("eprotect", "en", "ply-failed-retrieving-data", "%s failed to retrieve the data!")
|
||||
|
||||
slib.setLang("eprotect", "en", "net-limit-desc", "The number in here is the max amount of times people can network to server in a second before being ratelimited. (0 = Use general limit, -1 = No limit)")
|
||||
|
||||
slib.setLang("eprotect", "en", "capture", "Screenshot")
|
||||
slib.setLang("eprotect", "en", "check-ips", "Check IP(s)")
|
||||
slib.setLang("eprotect", "en", "fetch-data", "Fetch Data")
|
||||
|
||||
slib.setLang("eprotect", "en", "patched-exploit", "Patched Exploit")
|
||||
slib.setLang("eprotect", "en", "fake-exploit", "Fake Exploit")
|
||||
slib.setLang("eprotect", "en", "net-overflow", "Net Overflow")
|
||||
slib.setLang("eprotect", "en", "exploit-menu", "Exploit Menu")
|
||||
slib.setLang("eprotect", "en", "alt-detection", "Alt Detection")
|
||||
|
||||
slib.setLang("eprotect", "en", "banned", "Banned")
|
||||
slib.setLang("eprotect", "en", "kicked", "Kicked")
|
||||
slib.setLang("eprotect", "en", "notified", "Notified")
|
||||
|
||||
slib.setLang("eprotect", "en", "copied_clipboard", "Copied to clipboard")
|
||||
slib.setLang("eprotect", "en", "open-profile", "Open Profile")
|
||||
|
||||
slib.setLang("eprotect", "en", "copy_name", "Copy Name")
|
||||
slib.setLang("eprotect", "en", "copy_steamid", "Copy SteamID")
|
||||
slib.setLang("eprotect", "en", "copy_steamid64", "Copy SteamID64")
|
||||
slib.setLang("eprotect", "en", "show_alts", "Show Alts")
|
||||
|
||||
slib.setLang("eprotect", "en", "page_of_page", "Page %s/%s")
|
||||
slib.setLang("eprotect", "en", "previous", "Previous")
|
||||
slib.setLang("eprotect", "en", "next", "Next")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "en", "correlated-ip", "Correlated IP")
|
||||
slib.setLang("eprotect", "en", "family-share", "Family Share")
|
||||
|
||||
slib.setLang("eprotect", "en", "invalid-player", "This player is invalid!")
|
||||
slib.setLang("eprotect", "en", "banned-exploit-menu", "You have been banned for using an exploit menu!")
|
||||
slib.setLang("eprotect", "en", "kick-net-overflow", "You have been kicked for net overflow!")
|
||||
slib.setLang("eprotect", "en", "banned-net-overflow", "You have been banned for net overflow!")
|
||||
slib.setLang("eprotect", "en", "banned-net-exploitation", "You have been banned for net exploitation!")
|
||||
slib.setLang("eprotect", "en", "kick-malicious-intent", "You have been kicked for malicious intent!")
|
||||
slib.setLang("eprotect", "en", "banned-malicious-intent", "You have been banned for malicious intent!")
|
||||
|
||||
slib.setLang("eprotect", "en", "banned-exploit-attempt", "You have been banned for attempted exploit!")
|
||||
|
||||
slib.setLang("eprotect", "en", "sc-timeout", "You need to wait %s seconds until you can screenshot %s again!")
|
||||
slib.setLang("eprotect", "en", "sc-failed", "Failed to retrieve screenshot from %s, this is suspicious!")
|
||||
|
||||
slib.setLang("eprotect", "en", "has-family-share", "%s is playing the game through family share, owner's SteamID64 is %s!")
|
||||
slib.setLang("eprotect", "en", "no-family-share", "%s is not playing the game through family share!")
|
||||
slib.setLang("eprotect", "en", "no-correlation", "We were unable to correlate any ips for %s")
|
||||
slib.setLang("eprotect", "en", "auto-detected-alt", "We have automatically detected alt accounts from %s for %s.")
|
||||
slib.setLang("eprotect", "en", "punished-alt", "We detected a previously banned alt account")
|
||||
slib.setLang("eprotect", "en", "vpn-blocked", "VPNs are blocked on this server")
|
||||
|
||||
slib.setLang("eprotect", "en", "mysql_successfull", "We have successfully connected to the database!")
|
||||
slib.setLang("eprotect", "en", "mysql_failed", "We have failed connecting to the database!")
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
--[[
|
||||
| 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 CLIENT then
|
||||
slib.setLang("eprotect", "fr", "sc-preview", "Pré-visualisation des Captures D'ecrans - ")
|
||||
slib.setLang("eprotect", "fr", "net-info", "Info des Nets - ")
|
||||
slib.setLang("eprotect", "fr", "ip-info", "Info de l'IP - ")
|
||||
slib.setLang("eprotect", "fr", "id-info", "Info de l'ID - ")
|
||||
slib.setLang("eprotect", "fr", "ip-correlation", "Corrélation de l'IP - ")
|
||||
slib.setLang("eprotect", "fr", "table-viewer", "Visionneur de Table")
|
||||
|
||||
slib.setLang("eprotect", "fr", "tab-general", "Général")
|
||||
slib.setLang("eprotect", "fr", "tab-identifier", "Identifiant")
|
||||
slib.setLang("eprotect", "fr", "tab-netlimiter", "Limiteur de Net")
|
||||
slib.setLang("eprotect", "fr", "tab-netlogger", "Sauvegarde de net (logs)")
|
||||
slib.setLang("eprotect", "fr", "tab-exploitpatcher", "Correcteur d'Exploit")
|
||||
slib.setLang("eprotect", "fr", "tab-exploitfinder", "Rechercheur d'Exploit")
|
||||
slib.setLang("eprotect", "fr", "tab-fakeexploits", "Faux Exploit")
|
||||
slib.setLang("eprotect", "fr", "tab-datasnooper", "Fouineur de Data")
|
||||
|
||||
slib.setLang("eprotect", "fr", "player-list", "Liste des Joueurs")
|
||||
|
||||
slib.setLang("eprotect", "fr", "ratelimit", "Limite de flux")
|
||||
slib.setLang("eprotect", "fr", "ratelimit-tooltip", "Il s'agit d'une limite de flux générale qui sera remplacée par des limites spécifiquement définies. (Xs/Y)")
|
||||
|
||||
slib.setLang("eprotect", "fr", "timeout", "Délai")
|
||||
slib.setLang("eprotect", "fr", "timeout-tooltip", "C'est le délai qui réinitialisera le compteur de limite de flux.")
|
||||
|
||||
slib.setLang("eprotect", "fr", "overflowpunishment", "Punition d'Overflow")
|
||||
slib.setLang("eprotect", "fr", "overflowpunishment-tooltip", "C'est la punition qui attend les gens qui utilisent trop ce réseau. (1 = kick, 2 = ban)")
|
||||
|
||||
slib.setLang("eprotect", "fr", "enable-networking", "Activer la mise en réseau")
|
||||
slib.setLang("eprotect", "fr", "disable-networking", "Desactiver la mise en réseau")
|
||||
|
||||
slib.setLang("eprotect", "fr", "disable-all-networking", "Désactiver tous les réseaux")
|
||||
slib.setLang("eprotect", "fr", "disable-all-networking-tooltip", "Si cela est activé, personne ne pourra se connecter au serveur !")
|
||||
|
||||
slib.setLang("eprotect", "fr", "player", "Joueur")
|
||||
slib.setLang("eprotect", "fr", "net-string", "Chaine de réseaux (string)")
|
||||
slib.setLang("eprotect", "fr", "called", "appelée")
|
||||
slib.setLang("eprotect", "fr", "len", "Len")
|
||||
slib.setLang("eprotect", "fr", "type", "Type")
|
||||
slib.setLang("eprotect", "fr", "activated", "Activé")
|
||||
slib.setLang("eprotect", "fr", "secure", "Securise")
|
||||
slib.setLang("eprotect", "fr", "ip", "Adresse IP")
|
||||
slib.setLang("eprotect", "fr", "date", "Date")
|
||||
slib.setLang("eprotect", "fr", "country-code", "Code Pays")
|
||||
slib.setLang("eprotect", "fr", "status", "Statut")
|
||||
|
||||
slib.setLang("eprotect", "fr", "unknown", "Inconnu")
|
||||
slib.setLang("eprotect", "fr", "secured", "Securisé")
|
||||
|
||||
slib.setLang("eprotect", "fr", "check-ids", "Verifier l'ID")
|
||||
slib.setLang("eprotect", "fr", "correlate-ip", "corréler l'IP")
|
||||
slib.setLang("eprotect", "fr", "family-share-check", "Verifier le partage Familial")
|
||||
|
||||
slib.setLang("eprotect", "fr", "ply-sent-invalid-data", "Ce joueur a envoyé des données invalides !")
|
||||
slib.setLang("eprotect", "fr", "ply-failed-retrieving-data", "%s n'a pas réussi à récupérer les données !")
|
||||
|
||||
slib.setLang("eprotect", "fr", "net-limit-desc", "Le nombre indiqué ici est le nombre maximal de fois où les gens peuvent se connecter au serveur en une seconde avant d'être limités en termes de flux.")
|
||||
|
||||
slib.setLang("eprotect", "fr", "capture", "Capture d'Ecran")
|
||||
slib.setLang("eprotect", "fr", "check-ips", "Verifier l'IP")
|
||||
slib.setLang("eprotect", "fr", "fetch-data", "Récupérer les données")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "fr", "invalid-player", "Ce joueur n'est pas valide !")
|
||||
slib.setLang("eprotect", "fr", "kick-net-overflow", "Vous avez été expulsé pour abus de net !")
|
||||
slib.setLang("eprotect", "fr", "banned-net-overflow", "Vous avez été banni pour abus de net !")
|
||||
slib.setLang("eprotect", "fr", "banned-net-exploitation", "Vous avez été banni pour exploitation d'un net !")
|
||||
slib.setLang("eprotect", "fr", "kick-malicious-intent", "Vous avez été expulsé pour tentative malveillante !")
|
||||
slib.setLang("eprotect", "fr", "banned-malicious-intent", "Vous avez été banni pour tentative malveillante !")
|
||||
|
||||
slib.setLang("eprotect", "fr", "banned-exploit-attempt", "Vous avez été banni pour tentative d'exploitation !")
|
||||
|
||||
slib.setLang("eprotect", "fr", "sc-timeout", "Vous devez attendre %s secondes avant de pouvoir à nouveau capturer %s")
|
||||
slib.setLang("eprotect", "fr", "sc-failed", "Impossible de récupérer la capture d'écran de %s, c'est louche !")
|
||||
|
||||
slib.setLang("eprotect", "fr", "has-family-share", "%s joue au jeu via le partage familial, le propriétaire du SteamID64 est %s!")
|
||||
slib.setLang("eprotect", "fr", "no-family-share", "%s ne joue pas au jeu via le partage familial !")
|
||||
slib.setLang("eprotect", "fr", "no-correlation", "Nous n'avons pas pu corréler les ips pour %s")
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
--[[
|
||||
| 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 CLIENT then
|
||||
slib.setLang("eprotect", "de", "sc-preview", "Screenshot Vorschau - ")
|
||||
slib.setLang("eprotect", "de", "net-info", "Net Info - ")
|
||||
slib.setLang("eprotect", "de", "ip-info", "IP Info - ")
|
||||
slib.setLang("eprotect", "de", "id-info", "ID Info - ")
|
||||
slib.setLang("eprotect", "de", "ip-correlation", "IP Korrelation - ")
|
||||
slib.setLang("eprotect", "de", "table-viewer", "Tabellenbetrachtung")
|
||||
|
||||
slib.setLang("eprotect", "de", "tab-general", "Generell")
|
||||
slib.setLang("eprotect", "de", "tab-identifier", "Kennung")
|
||||
slib.setLang("eprotect", "de", "tab-netlimiter", "Net-Begrenzer")
|
||||
slib.setLang("eprotect", "de", "tab-netlogger", "Net Logger")
|
||||
slib.setLang("eprotect", "de", "tab-exploitpatcher", "Exploit Patcher")
|
||||
slib.setLang("eprotect", "de", "tab-exploitfinder", "Exploit Finder")
|
||||
slib.setLang("eprotect", "de", "tab-fakeexploits", "Fake Exploits")
|
||||
slib.setLang("eprotect", "de", "tab-datasnooper", "Datenschnüffler")
|
||||
|
||||
slib.setLang("eprotect", "de", "player-list", "Spielerliste")
|
||||
|
||||
slib.setLang("eprotect", "de", "ratelimit", "Bewertungslimit")
|
||||
slib.setLang("eprotect", "de", "ratelimit-tooltip", "Dies ist ein allgemeines Bewertungslimit und wird durch bestimmte festgelegte Grenzwerte außer Kraft gesetzt. (Xs / Y)")
|
||||
|
||||
slib.setLang("eprotect", "de", "timeout", "Timeout")
|
||||
slib.setLang("eprotect", "de", "timeout-tooltip", "Dies ist das Zeitlimit, das den Bewertungslimit-Zähler zurückgesetzt.")
|
||||
|
||||
slib.setLang("eprotect", "de", "overflowpunishment", "Overflow Bestrafung")
|
||||
slib.setLang("eprotect", "de", "overflowpunishment-tooltip", "Dies ist die Bestrafung, wenn der Network Way des Spielers zu lang ist. (1 = Kick, 2 = Bann)")
|
||||
|
||||
slib.setLang("eprotect", "de", "enable-networking", "Aktiviere Networking")
|
||||
slib.setLang("eprotect", "de", "disable-networking", "Deaktiviere Networking")
|
||||
|
||||
slib.setLang("eprotect", "de", "disable-all-networking", "Deaktiviert serverweit Networking")
|
||||
slib.setLang("eprotect", "de", "disable-all-networking-tooltip", "Wenn dies aktiviert ist, kann niemand mit dme Server networken.")
|
||||
|
||||
slib.setLang("eprotect", "de", "player", "Spieler")
|
||||
slib.setLang("eprotect", "de", "net-string", "Net String")
|
||||
slib.setLang("eprotect", "de", "called", "Aufgerufen")
|
||||
slib.setLang("eprotect", "de", "len", "Len")
|
||||
slib.setLang("eprotect", "de", "type", "Typ")
|
||||
slib.setLang("eprotect", "de", "activated", "Aktiviert")
|
||||
slib.setLang("eprotect", "de", "secure", "Gesichert")
|
||||
slib.setLang("eprotect", "de", "ip", "IP Adresse")
|
||||
slib.setLang("eprotect", "de", "date", "Datum")
|
||||
slib.setLang("eprotect", "de", "country-code", "Landesvorwahl")
|
||||
slib.setLang("eprotect", "de", "status", "Status")
|
||||
|
||||
slib.setLang("eprotect", "de", "unknown", "Unbekannt")
|
||||
slib.setLang("eprotect", "de", "secured", "Gesichert")
|
||||
|
||||
slib.setLang("eprotect", "de", "check-ids", "Check ID(s)")
|
||||
slib.setLang("eprotect", "de", "correlate-ip", "Zusammenhängende IP(s)")
|
||||
slib.setLang("eprotect", "de", "family-share-check", "Prüfe Family Share")
|
||||
|
||||
slib.setLang("eprotect", "de", "ply-sent-invalid-data", "Dieser Spieler hat ungültige Daten gesendet.")
|
||||
slib.setLang("eprotect", "de", "ply-failed-retrieving-data", "%s Daten konnten nicht abgerufen werden.")
|
||||
|
||||
slib.setLang("eprotect", "de", "net-limit-desc", "Die Zahl hier gibt an, wie oft Personen pro Sekunde mit dem Server networken können, bevor die Rate begrenzt wird.")
|
||||
|
||||
slib.setLang("eprotect", "de", "capture", "Screenshot")
|
||||
slib.setLang("eprotect", "de", "check-ips", "Prüfe IP(s)")
|
||||
slib.setLang("eprotect", "de", "fetch-data", "Daten abrufen")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "de", "invalid-player", "Dieser Spieler ist ungültig!")
|
||||
slib.setLang("eprotect", "de", "kick-net-overflow", "Du wurdest wegen Net-Overflow vom Server geworfen!")
|
||||
slib.setLang("eprotect", "de", "banned-net-overflow", "Du wurdest wegen Net-Overflow vom Server gebannt!")
|
||||
slib.setLang("eprotect", "de", "banned-net-exploitation", "Du wurdest wegen Net-Exploiting vom Server gebannt!")
|
||||
slib.setLang("eprotect", "de", "kick-malicious-intent", "Du wurdest wegen bösen Absichten vom Server geworfen!")
|
||||
slib.setLang("eprotect", "de", "banned-malicious-intent", "Du wurdest wegen bösen Absichten vom Server gebannt!")
|
||||
|
||||
slib.setLang("eprotect", "de", "banned-exploit-attempt", "Du wurdest wegen versuchtem Exploiting gebannt!")
|
||||
|
||||
slib.setLang("eprotect", "de", "sc-timeout", "Du musst %s Sekunden warten, bis du %s wieder screenshoten kannst!")
|
||||
slib.setLang("eprotect", "de", "sc-failed", "Screenshot von %s konnte nicht abgerufen werden, dies ist verdächtig!")
|
||||
|
||||
slib.setLang("eprotect", "de", "has-family-share", "%s spielt über Family Sharing, SteamID64 des Besitzers ist: %s!")
|
||||
slib.setLang("eprotect", "de", "no-family-share", "%s spielt das Spiel nicht durch Family Sharing!")
|
||||
slib.setLang("eprotect", "de", "no-correlation", "Wir konnten keine IPs für %s korrelieren.")
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
--[[
|
||||
| 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 CLIENT then
|
||||
slib.setLang("eprotect", "pl", "sc-preview", "Podgląd zrzutu ekranu - ")
|
||||
slib.setLang("eprotect", "pl", "net-info", "Net Info - ")
|
||||
slib.setLang("eprotect", "pl", "ip-info", "IP Info - ")
|
||||
slib.setLang("eprotect", "pl", "id-info", "ID Info - ")
|
||||
slib.setLang("eprotect", "pl", "ip-correlation", "Lokalizacja IP - ")
|
||||
slib.setLang("eprotect", "pl", "table-viewer", "Table Viewer")
|
||||
|
||||
slib.setLang("eprotect", "pl", "tab-general", "Ogólne")
|
||||
slib.setLang("eprotect", "pl", "tab-identifier", "Identifier")
|
||||
slib.setLang("eprotect", "pl", "tab-netlimiter", "Ogranicznik Net")
|
||||
slib.setLang("eprotect", "pl", "tab-netlogger", "Rejestrator Net")
|
||||
slib.setLang("eprotect", "pl", "tab-exploitpatcher", "Łatka Exploitów")
|
||||
slib.setLang("eprotect", "pl", "tab-exploitfinder", "Exploit Finder")
|
||||
slib.setLang("eprotect", "pl", "tab-fakeexploits", "Fake Exploits")
|
||||
slib.setLang("eprotect", "pl", "tab-datasnooper", "Data Snooper")
|
||||
|
||||
slib.setLang("eprotect", "pl", "player-list", "Lista graczy")
|
||||
|
||||
slib.setLang("eprotect", "pl", "ratelimit", "Ratelimit")
|
||||
slib.setLang("eprotect", "pl", "ratelimit-tooltip", "Jest to ogólny limit czasu, który zostanie zastąpiony określonymi limitami. (Xs/Y)")
|
||||
|
||||
slib.setLang("eprotect", "pl", "timeout", "Timeout")
|
||||
slib.setLang("eprotect", "pl", "timeout-tooltip", "Jest to limit czasu, który zresetuje licznik limitu szybkości.")
|
||||
|
||||
slib.setLang("eprotect", "pl", "overflowpunishment", "Próg kary Net Exploit")
|
||||
slib.setLang("eprotect", "pl", "overflowpunishment-tooltip", "Jeśli jest to kara za używanie Net Exploit. (1 = kick, 2 = ban)")
|
||||
|
||||
slib.setLang("eprotect", "pl", "enable-networking", "Włącz sieć")
|
||||
slib.setLang("eprotect", "pl", "disable-networking", "Wyłącz sieć")
|
||||
|
||||
slib.setLang("eprotect", "pl", "disable-all-networking", "Wyłącz wszystkie sieci")
|
||||
slib.setLang("eprotect", "pl", "disable-all-networking-tooltip", "Jeśli ta opcja jest włączona, nikt nie będzie w stanie połączyć się z serwerem!")
|
||||
|
||||
slib.setLang("eprotect", "pl", "player", "Gracz")
|
||||
slib.setLang("eprotect", "pl", "net-string", "Zmienna Net")
|
||||
slib.setLang("eprotect", "pl", "called", "Zapytanie")
|
||||
slib.setLang("eprotect", "pl", "len", "Rozmiar")
|
||||
slib.setLang("eprotect", "pl", "type", "Typ")
|
||||
slib.setLang("eprotect", "pl", "activated", "Aktywowany")
|
||||
slib.setLang("eprotect", "pl", "secure", "Zabezpieczone")
|
||||
slib.setLang("eprotect", "pl", "ip", "IP Adress")
|
||||
slib.setLang("eprotect", "pl", "date", "Data")
|
||||
slib.setLang("eprotect", "pl", "country-code", "Kod kraju")
|
||||
slib.setLang("eprotect", "pl", "status", "Status")
|
||||
|
||||
slib.setLang("eprotect", "pl", "unknown", "Nieznany")
|
||||
slib.setLang("eprotect", "pl", "secured", "Zabezpieczone")
|
||||
|
||||
slib.setLang("eprotect", "pl", "check-ids", "Sprawdź ID")
|
||||
slib.setLang("eprotect", "pl", "correlate-ip", "Lokalizacja IP")
|
||||
slib.setLang("eprotect", "pl", "family-share-check", "Sprawdź Family Share")
|
||||
|
||||
slib.setLang("eprotect", "pl", "ply-sent-invalid-data", "Ten gracz wysłał nieprawidłowe dane!")
|
||||
slib.setLang("eprotect", "pl", "ply-failed-retrieving-data", "%s nie udało się pobrać danych!")
|
||||
|
||||
slib.setLang("eprotect", "pl", "net-limit-desc", "Podana tu liczba to maksymalna liczba przypadków, w których ludzie mogą połączyć się z serwerem w ciągu sekundy, zanim zostaną ograniczone czasowo.")
|
||||
|
||||
slib.setLang("eprotect", "pl", "capture", "Screenshot")
|
||||
slib.setLang("eprotect", "pl", "check-ips", "Sprawdź IP(s)")
|
||||
slib.setLang("eprotect", "pl", "fetch-data", "Sprawdź Dane")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "pl", "invalid-player", "Nie ma takiego Gracza!")
|
||||
slib.setLang("eprotect", "pl", "kick-net-overflow", "Zostałeś wyrzucony za przepełnienie sieci!")
|
||||
slib.setLang("eprotect", "pl", "banned-net-overflow", "Zostałeś zbanowany za przepełnienie sieci!")
|
||||
slib.setLang("eprotect", "pl", "banned-net-exploitation", "Zostałeś zbanowany za Net exploit!")
|
||||
slib.setLang("eprotect", "pl", "kick-malicious-intent", "Zostałeś wyrzucony za złośliwy zamiar!")
|
||||
slib.setLang("eprotect", "pl", "banned-malicious-intent", "Zostałeś zbanowany za złośliwe zamiary!")
|
||||
|
||||
slib.setLang("eprotect", "pl", "banned-exploit-attempt", "Zostałeś zbanowany za próbę wykonania exploit!")
|
||||
|
||||
slib.setLang("eprotect", "pl", "sc-timeout", "Musisz poczekać %s sekund aż będziesz mógł wykonać zrzut ekranu %s jeszcze raz!")
|
||||
slib.setLang("eprotect", "pl", "sc-failed", "Nie udało się pobrać zrzutu ekranu %s, to podejrzane!")
|
||||
|
||||
slib.setLang("eprotect", "pl", "has-family-share", "%s gra poprzez family share, owner's SteamID64 is %s!")
|
||||
slib.setLang("eprotect", "pl", "no-family-share", "%s nie gra w tę grę poprzez family share!")
|
||||
slib.setLang("eprotect", "pl", "no-correlation", "Nie mogliśmy skorelować żadnych adresów IP dla %s")
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
--[[
|
||||
| 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 CLIENT then
|
||||
slib.setLang("eprotect", "ru", "sc-preview", "Предпросмотр снимка экрана - ")
|
||||
slib.setLang("eprotect", "ru", "net-info", "Net Информация - ")
|
||||
slib.setLang("eprotect", "ru", "ip-info", "IP Информация - ")
|
||||
slib.setLang("eprotect", "ru", "id-info", "ID Информация - ")
|
||||
slib.setLang("eprotect", "ru", "ip-correlation", "IP Совпадение - ")
|
||||
slib.setLang("eprotect", "ru", "table-viewer", "Просмотр таблиц")
|
||||
|
||||
slib.setLang("eprotect", "ru", "tab-general", "Главная")
|
||||
slib.setLang("eprotect", "ru", "tab-identifier", "Идентификатор")
|
||||
slib.setLang("eprotect", "ru", "tab-netlimiter", "Net Лимит")
|
||||
slib.setLang("eprotect", "ru", "tab-netlogger", "Net Регистратор")
|
||||
slib.setLang("eprotect", "ru", "tab-exploitpatcher", "Патчер эксплойтов")
|
||||
slib.setLang("eprotect", "ru", "tab-exploitfinder", "Поиск эксплойтов")
|
||||
slib.setLang("eprotect", "ru", "tab-fakeexploits", "Поддельные эксплойты")
|
||||
slib.setLang("eprotect", "ru", "tab-datasnooper", "Просмотр Data'ы игрока")
|
||||
|
||||
slib.setLang("eprotect", "ru", "player-list", "Список игроков")
|
||||
|
||||
slib.setLang("eprotect", "ru", "ratelimit", "Ограничение скорости оборотов")
|
||||
slib.setLang("eprotect", "ru", "ratelimit-tooltip", "Это общий предел скорости оборотов, который будет отменен конкретными установленными пределами. (Xs / Y)")
|
||||
|
||||
slib.setLang("eprotect", "ru", "timeout", "Тайм-аут")
|
||||
slib.setLang("eprotect", "ru", "timeout-tooltip", "Это тайм-аут, который сбросит счетчик предельного числа оборотов..")
|
||||
|
||||
slib.setLang("eprotect", "ru", "overflowpunishment", "Наказание за переполнение")
|
||||
slib.setLang("eprotect", "ru", "overflowpunishment-tooltip", "Если включено, то люди получат наказание за слишком большое количество трафика сети. (1 = Кик, 2 = Бан)")
|
||||
|
||||
slib.setLang("eprotect", "ru", "enable-networking", "Включить сеть")
|
||||
slib.setLang("eprotect", "ru", "disable-networking", "Отключить сеть")
|
||||
|
||||
slib.setLang("eprotect", "ru", "disable-all-networking", "Отключить все сети")
|
||||
slib.setLang("eprotect", "ru", "disable-all-networking-tooltip", "Если этот параметр включен, никто не сможет подключиться к серверу по сети!")
|
||||
|
||||
slib.setLang("eprotect", "ru", "player", "Игрок")
|
||||
slib.setLang("eprotect", "ru", "net-string", "Net строка")
|
||||
slib.setLang("eprotect", "ru", "called", "Называется")
|
||||
slib.setLang("eprotect", "ru", "len", "Длина")
|
||||
slib.setLang("eprotect", "ru", "type", "Тип")
|
||||
slib.setLang("eprotect", "ru", "activated", "Активирована")
|
||||
slib.setLang("eprotect", "ru", "secure", "Защищена")
|
||||
slib.setLang("eprotect", "ru", "ip", "IP Адрес")
|
||||
slib.setLang("eprotect", "ru", "date", "Дата")
|
||||
slib.setLang("eprotect", "ru", "country-code", "Код страны")
|
||||
slib.setLang("eprotect", "ru", "status", "Статус")
|
||||
|
||||
slib.setLang("eprotect", "ru", "unknown", "Неизвестно")
|
||||
slib.setLang("eprotect", "ru", "secured", "Защищена")
|
||||
|
||||
slib.setLang("eprotect", "ru", "check-ids", "Проверить ID")
|
||||
slib.setLang("eprotect", "ru", "correlate-ip", "Соотнести IP")
|
||||
slib.setLang("eprotect", "ru", "family-share-check", "Проверить Семейный доступ")
|
||||
|
||||
slib.setLang("eprotect", "ru", "ply-sent-invalid-data", "Этот игрок отправил неверные данные!")
|
||||
slib.setLang("eprotect", "ru", "ply-failed-retrieving-data", "%s не удалось получить данные!")
|
||||
|
||||
slib.setLang("eprotect", "ru", "net-limit-desc", "Число здесь - это максимальное количество раз, которое люди могут отправить на сервер в секунду, прежде чем будут ограничены по частоте.")
|
||||
|
||||
slib.setLang("eprotect", "ru", "capture", "Скриншот")
|
||||
slib.setLang("eprotect", "ru", "check-ips", "Проверить IP")
|
||||
slib.setLang("eprotect", "ru", "fetch-data", "Получить Data'у ")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "ru", "invalid-player", "Этот игрок недействителен!")
|
||||
slib.setLang("eprotect", "ru", "kick-net-overflow", "Вас выгнали за переполнение сети!")
|
||||
slib.setLang("eprotect", "ru", "banned-net-overflow", "Вас забанили за переполнение сети!")
|
||||
slib.setLang("eprotect", "ru", "banned-net-exploitation", "Вас забанили за эксплуатацию в сети!")
|
||||
slib.setLang("eprotect", "ru", "kick-malicious-intent", "Вас выгнали за злой умысел!")
|
||||
slib.setLang("eprotect", "ru", "banned-malicious-intent", "Вас забанили за злой умысел!")
|
||||
|
||||
slib.setLang("eprotect", "ru", "banned-exploit-attempt", "Вас забанили за попытку использовать эксплоит!")
|
||||
|
||||
slib.setLang("eprotect", "ru", "sc-timeout", "Вам нужно подождать %s секунд, пока вы снова не сможете сделать снимок экрана %s!")
|
||||
slib.setLang("eprotect", "ru", "sc-failed", "Не удалось получить снимок экрана %s, это подозрительно!")
|
||||
|
||||
slib.setLang("eprotect", "ru", "has-family-share", "%s играет в игру через семейный ресурс, SteamID64 владельца %s!")
|
||||
slib.setLang("eprotect", "ru", "no-family-share", "%s не играет в игру через семейный просмотр.")
|
||||
slib.setLang("eprotect", "ru", "no-correlation", "Нам не удалось сопоставить IP-адреса для %s")
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
--[[
|
||||
| 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 CLIENT then
|
||||
slib.setLang("eprotect", "es", "sc-preview", " Preview de Screenshot - ")
|
||||
slib.setLang("eprotect", "es", "net-info", "Información Net - ")
|
||||
slib.setLang("eprotect", "es", "ip-info", "Información de IP - ")
|
||||
slib.setLang("eprotect", "es", "id-info", "Información de ID - ")
|
||||
slib.setLang("eprotect", "es", "ip-correlation", "Correlación de IP - ")
|
||||
slib.setLang("eprotect", "es", "table-viewer", "Visor de Mesas")
|
||||
|
||||
slib.setLang("eprotect", "es", "tab-general", "General")
|
||||
slib.setLang("eprotect", "es", "tab-identifier", "Identificador")
|
||||
slib.setLang("eprotect", "es", "tab-netlimiter", "Limitador Net")
|
||||
slib.setLang("eprotect", "es", "tab-netlogger", "Loggs Net")
|
||||
slib.setLang("eprotect", "es", "tab-exploitpatcher", "Parcheador de Exploits")
|
||||
slib.setLang("eprotect", "es", "tab-exploitfinder", "Buscador de Exploits")
|
||||
slib.setLang("eprotect", "es", "tab-fakeexploits", "Exploits Falsos")
|
||||
slib.setLang("eprotect", "es", "tab-datasnooper", "Fisgón de Datos")
|
||||
|
||||
slib.setLang("eprotect", "es", "player-list", "Lista de Jugadores")
|
||||
|
||||
slib.setLang("eprotect", "es", "ratelimit", "LimitadorRate")
|
||||
slib.setLang("eprotect", "es", "ratelimit-tooltip", "Este es un Limitador-Rate y funciona para poner ciertos limites. (Xs/Y)")
|
||||
|
||||
slib.setLang("eprotect", "es", "timeout", "Tiempo")
|
||||
slib.setLang("eprotect", "es", "timeout-tooltip", "El tiempo el el intervalo entre que se resetea el contador del LimitadorRate.")
|
||||
|
||||
slib.setLang("eprotect", "es", "overflowpunishment", "Castigo de Overflow")
|
||||
slib.setLang("eprotect", "es", "overflowpunishment-tooltip", "Este es el castigo que va a tener la gente que usa demasiado network. (1 = kick, 2 = ban)")
|
||||
|
||||
slib.setLang("eprotect", "es", "enable-networking", "Habilitar networking")
|
||||
slib.setLang("eprotect", "es", "disable-networking", "Deshabilitar networking")
|
||||
|
||||
slib.setLang("eprotect", "es", "disable-all-networking", "Deshabilitar todo el networking")
|
||||
slib.setLang("eprotect", "es", "disable-all-networking-tooltip", "Si esto esta habilitado, nadie va a poder usar el network en el server!")
|
||||
|
||||
slib.setLang("eprotect", "es", "player", "Jugador")
|
||||
slib.setLang("eprotect", "es", "net-string", "Net String")
|
||||
slib.setLang("eprotect", "es", "called", "LLamado")
|
||||
slib.setLang("eprotect", "es", "len", "Len")
|
||||
slib.setLang("eprotect", "es", "type", "Tipo")
|
||||
slib.setLang("eprotect", "es", "activated", "Activado")
|
||||
slib.setLang("eprotect", "es", "secure", "Seguro")
|
||||
slib.setLang("eprotect", "es", "ip", "Dirección IP")
|
||||
slib.setLang("eprotect", "es", "date", "Fecha")
|
||||
slib.setLang("eprotect", "es", "country-code", "Código de País")
|
||||
slib.setLang("eprotect", "es", "status", "Status")
|
||||
|
||||
slib.setLang("eprotect", "es", "unknown", "Desconocido")
|
||||
slib.setLang("eprotect", "es", "secured", "Seguro")
|
||||
|
||||
slib.setLang("eprotect", "es", "check-ids", "Checkear ID(s)")
|
||||
slib.setLang("eprotect", "es", "correlate-ip", "Correlacionar IP(s)")
|
||||
slib.setLang("eprotect", "es", "family-share-check", "Checkear Cuentas Familiares")
|
||||
|
||||
slib.setLang("eprotect", "es", "ply-sent-invalid-data", "Este Jugador envió datos inválidos!")
|
||||
slib.setLang("eprotect", "es", "ply-failed-retrieving-data", "%s Fallo al recibir datos!")
|
||||
|
||||
slib.setLang("eprotect", "es", "net-limit-desc", "Este nuemero es la cantidad de veces que la gente puede usar network en un segundo antes de usar el LimitadorRate.")
|
||||
|
||||
slib.setLang("eprotect", "es", "capture", "Screenshot")
|
||||
slib.setLang("eprotect", "es", "check-ips", "Checkear IP(s)")
|
||||
slib.setLang("eprotect", "es", "fetch-data", "Buscar Datos")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "es", "invalid-player", "Este Jugador en invalido!")
|
||||
slib.setLang("eprotect", "es", "kick-net-overflow", "Fuiste expulsado por net overflow!")
|
||||
slib.setLang("eprotect", "es", "banned-net-overflow", "Fuiste suspendido por net overflow!")
|
||||
slib.setLang("eprotect", "es", "banned-net-exploitation", "Fuiste expulsado por exploitiar mensajes net!")
|
||||
slib.setLang("eprotect", "es", "kick-malicious-intent", "Fuiste expulsado por intenciones maliciosas!")
|
||||
slib.setLang("eprotect", "es", "banned-malicious-intent", "Fuiste suspendido por intenciones maliciosas!")
|
||||
|
||||
slib.setLang("eprotect", "es", "banned-exploit-attempt", "Fuiste suspendido por intentar usar un maliciosas!")
|
||||
|
||||
slib.setLang("eprotect", "es", "sc-timeout", "Tenes que esperar %s segundos antes de poder screeshotear a %s otra vez!")
|
||||
slib.setLang("eprotect", "es", "sc-failed", "Fallo al cargar screenshot de %s, sospechoso...")
|
||||
|
||||
slib.setLang("eprotect", "es", "has-family-share", "%s esta jugando con una cuenta familiar, el SteamD64 del dueño es %s")
|
||||
slib.setLang("eprotect", "es", "no-family-share", "%s no esta jugando con una cuenta familiar!")
|
||||
slib.setLang("eprotect", "es", "no-correlation", "No se pudieron correlacionar IPs con %s")
|
||||
end
|
||||
@@ -1,88 +0,0 @@
|
||||
--[[
|
||||
| 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 CLIENT then
|
||||
slib.setLang("eprotect", "tr", "sc-preview", "Ekranı Görüntüle - ")
|
||||
slib.setLang("eprotect", "tr", "net-info", "Ağ bilgisi - ")
|
||||
slib.setLang("eprotect", "tr", "ip-info", "IP bilgisi - ")
|
||||
slib.setLang("eprotect", "tr", "id-info", "ID bilgisi - ")
|
||||
slib.setLang("eprotect", "tr", "ip-correlation", "IP ilişkisi - ")
|
||||
slib.setLang("eprotect", "tr", "table-viewer", "Masa Görüntülemesi")
|
||||
|
||||
slib.setLang("eprotect", "tr", "tab-general", "Genel")
|
||||
slib.setLang("eprotect", "tr", "tab-identifier", "Tanımlayıcı")
|
||||
slib.setLang("eprotect", "tr", "tab-netlimiter", "Bağ limitleyicisi")
|
||||
slib.setLang("eprotect", "tr", "tab-netlogger", "Ağ kayıtçısı")
|
||||
slib.setLang("eprotect", "tr", "tab-exploitpatcher", "Exploit Güncelleyici")
|
||||
slib.setLang("eprotect", "tr", "tab-exploitfinder", "Exploit Bulucusu")
|
||||
slib.setLang("eprotect", "tr", "tab-fakeexploits", "Sahte Exploitler")
|
||||
slib.setLang("eprotect", "tr", "tab-datasnooper", "Kayıt ağı")
|
||||
|
||||
slib.setLang("eprotect", "tr", "player-list", "Oyuncu Listesi")
|
||||
|
||||
slib.setLang("eprotect", "tr", "ratelimit", "Hız sınırlayıcısı")
|
||||
slib.setLang("eprotect", "tr", "ratelimit-tooltip", "Bu genel bir hız sınırlayıcısı. (Xs/Y)")
|
||||
|
||||
slib.setLang("eprotect", "tr", "timeout", "Zaman Aşımı")
|
||||
slib.setLang("eprotect", "tr", "timeout-tooltip", "Bu zaman aşımı genel hız sınırlayıcısına karşıdır.")
|
||||
|
||||
slib.setLang("eprotect", "tr", "overflowpunishment", "Taşma cezası")
|
||||
slib.setLang("eprotect", "tr", "overflowpunishment-tooltip", "Bu ceza ağı rahatlatmak için uygulanır. (1 = kick, 2 = ban)")
|
||||
|
||||
slib.setLang("eprotect", "tr", "enable-networking", "Ağ oluşturmayı aktifleştir")
|
||||
slib.setLang("eprotect", "tr", "disable-networking", "Ağ oluşturmayı engelle")
|
||||
|
||||
slib.setLang("eprotect", "tr", "disable-all-networking", "Tüm ağ oluşturmayı engelle")
|
||||
slib.setLang("eprotect", "tr", "disable-all-networking-tooltip", "Eğer bu aktif olursa kimse sunucuya giremez!")
|
||||
|
||||
slib.setLang("eprotect", "tr", "player", "Player")
|
||||
slib.setLang("eprotect", "tr", "net-string", "Net String")
|
||||
slib.setLang("eprotect", "tr", "called", "Called")
|
||||
slib.setLang("eprotect", "tr", "len", "Len")
|
||||
slib.setLang("eprotect", "tr", "type", "Type")
|
||||
slib.setLang("eprotect", "tr", "activated", "Activated")
|
||||
slib.setLang("eprotect", "tr", "secure", "Secured")
|
||||
slib.setLang("eprotect", "tr", "ip", "IP Adress")
|
||||
slib.setLang("eprotect", "tr", "date", "Date")
|
||||
slib.setLang("eprotect", "tr", "country-code", "Country code")
|
||||
slib.setLang("eprotect", "tr", "status", "Status")
|
||||
|
||||
slib.setLang("eprotect", "tr", "unknown", "Unknown")
|
||||
slib.setLang("eprotect", "tr", "secured", "Secured")
|
||||
|
||||
slib.setLang("eprotect", "tr", "check-ids", "ID'leri kontrol et")
|
||||
slib.setLang("eprotect", "tr", "correlate-ip", "IP adreslerini ilişkilendir")
|
||||
slib.setLang("eprotect", "tr", "family-share-check", "Aile paylaşımını kontrol et")
|
||||
|
||||
slib.setLang("eprotect", "tr", "ply-sent-invalid-data", "Bu oyuncu geçersiz data gönderdi!")
|
||||
slib.setLang("eprotect", "tr", "ply-failed-retrieving-data", "%s data alınamadı!")
|
||||
|
||||
slib.setLang("eprotect", "tr", "net-limit-desc", "Buradaki sayı, insanların hız sınırlandırılmadan önce bir saniye içinde sunucuya maksimum ağ kurma sayısıdır..")
|
||||
|
||||
slib.setLang("eprotect", "tr", "capture", "Screenshot")
|
||||
slib.setLang("eprotect", "tr", "check-ips", "Check IP(s)")
|
||||
slib.setLang("eprotect", "tr", "fetch-data", "Fetch Data")
|
||||
elseif SERVER then
|
||||
slib.setLang("eprotect", "tr", "invalid-player", "böyle bir oyuncu yok!")
|
||||
slib.setLang("eprotect", "tr", "kick-net-overflow", "Net ağına karşı kötü niyetli eylem gerçekleştirdiğinizden dolayı atıldınız!")
|
||||
slib.setLang("eprotect", "tr", "banned-net-overflow", "Net ağına karşı kötü niyetli eylem gerçekleştirdiğinizden dolayı yasaklandınız !")
|
||||
slib.setLang("eprotect", "tr", "banned-net-exploitation", "Net ağına karşı kötü niyetli eylem gerçekleştirdiğinizden dolayı yasaklandınız!")
|
||||
slib.setLang("eprotect", "tr", "kick-malicious-intent", "Kötü niyetli eylem gerçekleştirdiğinizden dolayı sunucudan atıldınız!")
|
||||
slib.setLang("eprotect", "tr", "banned-malicious-intent", "Kötü niyetli eylem gerçekleştirdiğinizden dolayı sunucudan yasaklandınız!")
|
||||
|
||||
slib.setLang("eprotect", "tr", "banned-exploit-attempt", "Exploit kullanmaya çalıştığın için sunucudan yasaklandın !")
|
||||
|
||||
slib.setLang("eprotect", "tr", "sc-timeout", "Şu kadar %s saniye beklemen gerek %s tekrar ekran görüntüsü almak için!")
|
||||
slib.setLang("eprotect", "tr", "sc-failed", "Şu kişiden ekran görüntüsü alınamadı %s, şüpheli!")
|
||||
|
||||
slib.setLang("eprotect", "tr", "has-family-share", "%s Aile paylaşımından oynuyor oyunu ödünç aldığı kişinin ID'si %s!")
|
||||
slib.setLang("eprotect", "tr", "no-family-share", "%s Aile paylaşımından oynamıyor!")
|
||||
slib.setLang("eprotect", "tr", "no-correlation", "Şu değer için hiç bir IP adresi ilişkilendirilemedi %s")
|
||||
end
|
||||
@@ -1,29 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local punished = {}
|
||||
|
||||
eProtect.logDetectionHandeler = function(ply, reason, info, type, additional_info)
|
||||
if eProtect.data.general["bypassgroup"][ply:GetUserGroup()] or eProtect.config["disabledModules"]["detection_log"] then return end
|
||||
local sid, sid64 = ply:SteamID(), ply:SteamID64()
|
||||
|
||||
if eProtect.data.general["bypass_sids"][sid] or eProtect.data.general["bypass_sids"][sid64] then return end
|
||||
|
||||
if punished[sid] and CurTime() < punished[sid] then return end
|
||||
punished[sid] = CurTime() + eProtect.data.general.timeout + 1
|
||||
|
||||
local name, sid64 = ply:Nick(), ply:SteamID64()
|
||||
|
||||
eProtect.logDetection(name, sid64, reason, info, type, additional_info)
|
||||
end
|
||||
|
||||
if eProtect.queueNetworking then
|
||||
eProtect.queueNetworking(nil, "punishmentLogging")
|
||||
end
|
||||
@@ -1,50 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.data = eProtect.data or {}
|
||||
eProtect.data.exploitPatcher = eProtect.data.exploitPatcher or {}
|
||||
|
||||
eProtect.patcher = eProtect.patcher or {}
|
||||
|
||||
local function addExploitPatch(str, func)
|
||||
eProtect.patcher[str] = func
|
||||
eProtect.data.exploitPatcher[str] = true
|
||||
end
|
||||
|
||||
addExploitPatch("start_wd_emp", function(ply)
|
||||
if IsValid(ply) and ply:IsPlayer() then
|
||||
local wep = ply:GetActiveWeapon()
|
||||
if !IsValid(wep) or wep:GetClass() ~= "weapon_hack_phone" then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
addExploitPatch("gPrinters.removePrinter", function(ply)
|
||||
if IsValid(ply) and ply:IsPlayer() then
|
||||
return ply:IsSuperAdmin()
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("eP:PreNetworking", "eP:ExploitPatches", function(ply, netstring, len)
|
||||
if eProtect.patcher[netstring] and isfunction(eProtect.patcher[netstring]) and !eProtect.config["disabledModules"]["exploit_patcher"] then
|
||||
local result = eProtect.patcher[netstring](ply)
|
||||
|
||||
if result == false then
|
||||
eProtect.logDetectionHandeler(ply, "patched-exploit", netstring, 2)
|
||||
eProtect.punish(ply, 2, slib.getLang("eprotect", eProtect.config["language"], "banned-exploit-attempt"))
|
||||
return false end
|
||||
end
|
||||
end)
|
||||
|
||||
if eProtect.queueNetworking then
|
||||
eProtect.queueNetworking(nil, "exploitPatcher")
|
||||
end
|
||||
@@ -1,60 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.data = eProtect.data or {}
|
||||
eProtect.data.fakeNets = eProtect.data.fakeNets or {}
|
||||
|
||||
local generatedOnes = {}
|
||||
|
||||
eProtect.getRandUniqueNum = function()
|
||||
local rand = math.random(1, 999999)
|
||||
if generatedOnes[rand] then return eProtect.getRandUniqueNum() end
|
||||
generatedOnes[rand] = true
|
||||
|
||||
return rand
|
||||
end
|
||||
|
||||
eProtect.createFakeNets = function()
|
||||
if eProtect.config["disabledModules"]["fake_exploits"] then return end
|
||||
|
||||
local createdNets = 0
|
||||
local maxFakeNets = 3
|
||||
|
||||
local mixedTbl = {}
|
||||
|
||||
for k,v in pairs(eProtect.data.badNets) do
|
||||
mixedTbl[eProtect.getRandUniqueNum()] = k
|
||||
end
|
||||
|
||||
for k, netstring in pairs(mixedTbl) do
|
||||
local validateNet = tobool(util.NetworkStringToID(netstring))
|
||||
if validateNet then continue end
|
||||
createdNets = createdNets + 1
|
||||
|
||||
eProtect.data.fakeNets[netstring] = eProtect.data.fakeNets[netstring] or eProtect.data.badNets[netstring]
|
||||
eProtect.data.fakeNets[netstring].enabled = true
|
||||
util.AddNetworkString(netstring)
|
||||
|
||||
net.Receive(netstring, function(_, ply)
|
||||
eProtect.logDetectionHandeler(ply, "fake-exploit", netstring, 2)
|
||||
eProtect.punish(ply, 2, slib.getLang("eprotect", eProtect.config["language"], "banned-net-exploitation"))
|
||||
end)
|
||||
|
||||
if maxFakeNets > 0 and (createdNets >= maxFakeNets) then break end
|
||||
end
|
||||
|
||||
if eProtect.queueNetworking then
|
||||
eProtect.queueNetworking(nil, "fakeNets")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
eProtect.createFakeNets()
|
||||
@@ -1,13 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
hook.Add("eP:PostHTTP", "eP:HTTPLoggingHandeler", function(url, type)
|
||||
eProtect.logHTTP(url, type)
|
||||
end)
|
||||
@@ -1,31 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local function handleIPLoggin(ply, ip)
|
||||
local sid64 = ply:SteamID64()
|
||||
http.Fetch("http://ip-api.com/json/"..ip, function(json)
|
||||
json = util.JSONToTable(json)
|
||||
local result = json["countryCode"]
|
||||
|
||||
if !result then result = "N/A" end
|
||||
|
||||
eProtect.registerIP(sid64, ip, result)
|
||||
end, function()
|
||||
eProtect.registerIP(sid64, ip, "N/A")
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("PlayerInitialSpawn", "eP:IPLogging", function(ply)
|
||||
if ply:IsBot() or eProtect.config["disabledModules"]["identifier"] then return end
|
||||
local plyIP = ply:IPAddress()
|
||||
local ip = string.sub(plyIP, 1, string.find(plyIP, ":") - 1)
|
||||
|
||||
handleIPLoggin(ply, ip)
|
||||
end)
|
||||
@@ -1,78 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.data = eProtect.data or {}
|
||||
eProtect.data.netLimitation = eProtect.data.netLimitation or {}
|
||||
|
||||
for i = 1, 2048 do
|
||||
local netstring = util.NetworkIDToString(i)
|
||||
if !netstring then continue end
|
||||
if netstring and isstring(netstring) and eProtect.data.netLimitation[netstring] == nil and !eProtect.data.fakeNets[netstring] then
|
||||
local func = net.Receivers[string.lower(netstring)]
|
||||
if func then eProtect.data.netLimitation[netstring] = 0 end
|
||||
end
|
||||
end
|
||||
|
||||
if eProtect.queueNetworking then
|
||||
eProtect.queueNetworking(nil, "netLimitation")
|
||||
end
|
||||
|
||||
local generalCounter = {}
|
||||
local specificCounter = {}
|
||||
local timeout = {}
|
||||
|
||||
hook.Add("eP:PreNetworking", "eP:NetLimiter", function(ply, netstring, len)
|
||||
if !eProtect.data or !eProtect.data.general or eProtect.data.netLimitation[netstring] == -1 or eProtect.config["disabledModules"]["net_limiter"] then return end
|
||||
|
||||
if !eProtect.data.netLimitation[netstring] then
|
||||
local func = net.Receivers[string.lower(netstring)]
|
||||
if func then eProtect.data.netLimitation[netstring] = 0 end
|
||||
|
||||
eProtect.queueNetworking(nil, "netLimitation")
|
||||
end
|
||||
|
||||
local sid, sid64 = ply:SteamID(), ply:SteamID64()
|
||||
local specific = eProtect.data.netLimitation[netstring] ~= nil and eProtect.data.netLimitation[netstring] > 0 or false
|
||||
|
||||
specificCounter[sid] = specificCounter[sid] or {}
|
||||
|
||||
if !timeout[sid] then timeout[sid] = CurTime() end
|
||||
|
||||
if timeout[sid] and ((CurTime() - timeout[sid]) >= eProtect.data.general.timeout) then
|
||||
specificCounter[sid] = {}
|
||||
generalCounter[sid] = 0
|
||||
timeout[sid] = nil
|
||||
end
|
||||
|
||||
if specific then
|
||||
specificCounter[sid][netstring] = specificCounter[sid][netstring] or 0
|
||||
specificCounter[sid][netstring] = specificCounter[sid][netstring] + 1
|
||||
else
|
||||
generalCounter[sid] = generalCounter[sid] or 0
|
||||
generalCounter[sid] = generalCounter[sid] + 1
|
||||
end
|
||||
|
||||
local counter = specific and specificCounter[sid][netstring] or generalCounter[sid]
|
||||
local limit = specific and eProtect.data.netLimitation[netstring] or eProtect.data.general.ratelimit
|
||||
if limit > -1 and counter > limit and eProtect.data.general.overflowpunishment > 0 and !eProtect.data.general["bypassgroup"][ply:GetUserGroup()] and !eProtect.data.general["bypass_sids"][sid] and !eProtect.data.general["bypass_sids"][sid64] then
|
||||
if eProtect.data.general["whitelistergroup"][ply:GetUserGroup()] then
|
||||
eProtect.data.netLimitation[netstring] = -1
|
||||
eProtect.queueNetworking(nil, "netLimitation")
|
||||
return end
|
||||
|
||||
eProtect.logDetectionHandeler(ply, "net-overflow", netstring, eProtect.data.general.overflowpunishment)
|
||||
if eProtect.data.general.overflowpunishment <= 2 then
|
||||
eProtect.punish(ply, eProtect.data.general.overflowpunishment, slib.getLang("eprotect", eProtect.config["language"], eProtect.data.general.overflowpunishment == 1 and "kick-net-overflow" or "banned-net-overflow"))
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
end)
|
||||
@@ -1,31 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.data = eProtect.data or {}
|
||||
eProtect.data.netLogging = eProtect.data.netLogging or {}
|
||||
|
||||
hook.Add("eP:PostNetworking", "eP:LogNetworking", function(ply, net, len)
|
||||
if !net or len == nil or eProtect.config["disabledModules"]["net_logger"] then return end
|
||||
eProtect.data.netLogging[net] = eProtect.data.netLogging[net] or {called = 0, len = 0, playercalls = {}}
|
||||
|
||||
eProtect.data.netLogging[net].called = eProtect.data.netLogging[net].called + 1
|
||||
eProtect.data.netLogging[net].len = eProtect.data.netLogging[net].len + len
|
||||
|
||||
if IsValid(ply) and ply:IsPlayer() then
|
||||
local sid = ply:SteamID()
|
||||
eProtect.data.netLogging[net].playercalls[sid] = eProtect.data.netLogging[net].playercalls[sid] or 0
|
||||
eProtect.data.netLogging[net].playercalls[sid] = eProtect.data.netLogging[net].playercalls[sid] + 1
|
||||
end
|
||||
|
||||
if eProtect.queueNetworking then
|
||||
eProtect.queueNetworking(nil, "netLogging")
|
||||
end
|
||||
end)
|
||||
@@ -1,574 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.queneData = eProtect.queneData or {}
|
||||
eProtect.saveQueue = eProtect.saveQueue or {}
|
||||
|
||||
eProtect.data = eProtect.data or {}
|
||||
eProtect.data.disabled = eProtect.data.disabled or {}
|
||||
|
||||
local ignoreSaving = {
|
||||
["fakeNets"] = true,
|
||||
["netLogging"] = true,
|
||||
["exploitPatcher"] = true
|
||||
}
|
||||
|
||||
util.AddNetworkString("eP:Handeler")
|
||||
|
||||
local function openMenu(ply)
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(2, 3)
|
||||
net.Send(ply)
|
||||
end
|
||||
|
||||
local convertedTbl
|
||||
|
||||
convertedTbl = function(tbl)
|
||||
local converted_tbl = {}
|
||||
|
||||
for k,v in pairs(tbl) do
|
||||
if istable(v) then v = convertedTbl(v) end
|
||||
|
||||
local isSID = util.SteamIDFrom64(k) != "STEAM_0:0:0"
|
||||
|
||||
if isSID then
|
||||
converted_tbl["sid64_"..k] = v
|
||||
else
|
||||
converted_tbl[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
return converted_tbl
|
||||
end
|
||||
|
||||
local function networkData(ply, data, specific)
|
||||
if !data then return end
|
||||
local data = util.TableToJSON(convertedTbl(data))
|
||||
|
||||
data = util.Compress(data)
|
||||
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(1, 3)
|
||||
net.WriteUInt(#data, 32)
|
||||
net.WriteData(data, #data)
|
||||
|
||||
if specific then
|
||||
net.WriteString(specific)
|
||||
end
|
||||
|
||||
net.Send(ply)
|
||||
end
|
||||
|
||||
eProtect.hasPermission = function(ply, specific)
|
||||
return eProtect.config["permission"][ply:GetUserGroup()]
|
||||
end
|
||||
|
||||
local punished = {}
|
||||
|
||||
eProtect.getData = function(specific)
|
||||
local data = file.Read("eprotect/data.json", "DATA")
|
||||
|
||||
if !data then return end
|
||||
|
||||
data = util.JSONToTable(data)
|
||||
|
||||
if specific then
|
||||
data = data[specific]
|
||||
end
|
||||
|
||||
for k,v in pairs(data) do
|
||||
eProtect.data[k] = v
|
||||
end
|
||||
|
||||
return table.Copy(data)
|
||||
end
|
||||
|
||||
eProtect.dataVerification = function()
|
||||
local data = eProtect.getData()
|
||||
data = data or {}
|
||||
|
||||
data["general"] = data["general"] or {}
|
||||
|
||||
for k,v in pairs(eProtect.BaseConfig) do
|
||||
if data["general"][k] then continue end
|
||||
data["general"][k] = v[1]
|
||||
end
|
||||
|
||||
for k,v in pairs(eProtect.data) do
|
||||
if ignoreSaving[k] or k == "general" then continue end
|
||||
data[k] = v
|
||||
end
|
||||
|
||||
file.CreateDir("eprotect")
|
||||
file.Write("eprotect/data.json", util.TableToJSON(data))
|
||||
|
||||
eProtect.getData()
|
||||
eProtect.queueNetworking()
|
||||
end
|
||||
|
||||
eProtect.saveData = function()
|
||||
file.CreateDir("eprotect")
|
||||
|
||||
local data = table.Copy(eProtect.data)
|
||||
|
||||
for k, v in pairs(data) do
|
||||
if ignoreSaving[k] then data[k] = nil end
|
||||
end
|
||||
|
||||
file.Write("eprotect/data.json", util.TableToJSON(data))
|
||||
end
|
||||
|
||||
eProtect.canNetwork = function(ply, netstring)
|
||||
if !IsValid(ply) or !ply:IsPlayer() then return end
|
||||
if (punished[ply:SteamID()] or eProtect.data.disabled[ply:SteamID()] or eProtect.data.general["disable-all-networking"]) and (netstring ~= "eP:Handeler") then return false end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
eProtect.punish = function(ply, type, msg, duration)
|
||||
if eProtect.data.general["bypassgroup"][ply:GetUserGroup()] or eProtect.data.general["bypass_sids"][ply:SteamID()] or eProtect.data.general["bypass_sids"][ply:SteamID64()] then return end
|
||||
msg = eProtect.config["prefix"]..msg
|
||||
|
||||
punished[ply:SteamID()] = true
|
||||
|
||||
slib.punish(ply, type, msg, duration)
|
||||
end
|
||||
|
||||
eProtect.networkData = function(ply)
|
||||
if eProtect.queneData[ply:SteamID()] then
|
||||
for k,v in pairs(eProtect.queneData[ply:SteamID()]) do
|
||||
networkData(ply, eProtect.data[k], k)
|
||||
eProtect.queneData[ply:SteamID()][k] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function registerQuene(ply, specific)
|
||||
if specific then
|
||||
eProtect.queneData[ply:SteamID()] = eProtect.queneData[ply:SteamID()] and eProtect.queneData[ply:SteamID()] or {}
|
||||
eProtect.queneData[ply:SteamID()][specific] = true
|
||||
else
|
||||
for k,v in pairs(eProtect.data) do
|
||||
registerQuene(ply, k)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
eProtect.queueNetworking = function(ply, specific)
|
||||
if ply then
|
||||
registerQuene(ply, specific)
|
||||
else
|
||||
for k,v in pairs(player.GetAll()) do
|
||||
if !IsValid(v) then continue end
|
||||
registerQuene(v, specific)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local screenshotRequested = {}
|
||||
local idRequested = {}
|
||||
local dataRequested = {}
|
||||
local limitSC = {}
|
||||
|
||||
local function requestData(ply, target, type)
|
||||
local data
|
||||
|
||||
if type == 1 then
|
||||
local sid = target:SteamID()
|
||||
if limitSC[sid] and CurTime() - limitSC[sid] < 10 then
|
||||
slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "sc-timeout", math.Round(10 - (CurTime() - limitSC[sid])), target:Nick()), ply)
|
||||
return end
|
||||
|
||||
limitSC[sid] = CurTime()
|
||||
|
||||
data = screenshotRequested
|
||||
elseif type == 2 then
|
||||
data = idRequested
|
||||
elseif type == 3 then
|
||||
data = dataRequested
|
||||
end
|
||||
|
||||
if data[target] then return end
|
||||
|
||||
data[target] = ply
|
||||
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(3, 3)
|
||||
net.WriteUInt(type, 2)
|
||||
net.WriteBool(false)
|
||||
net.Send(target)
|
||||
|
||||
timer.Simple(10, function()
|
||||
if !target or !ply then return end
|
||||
if data[target] then
|
||||
data[target] = nil
|
||||
slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "sc-failed", target:Nick()), ply)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("PlayerInitialSpawn", "eP:NetworkingQueuer", function(ply)
|
||||
eProtect.queueNetworking(ply)
|
||||
local sid = ply:SteamID()
|
||||
if punished[sid] then punished[sid] = nil end
|
||||
end)
|
||||
|
||||
local function verifyBannedAlt(ply, sid64, type)
|
||||
sid64 = sid64 or ply:SteamID64()
|
||||
local isBanned = slib.isBanned(sid64, function(banned, sid) if banned then if IsValid(ply) then slib.punish(ply, type, eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "punished-alt")) end end end)
|
||||
|
||||
if isBanned then
|
||||
slib.punish(ply, type, eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "punished-alt"))
|
||||
end
|
||||
|
||||
return isBanned
|
||||
end
|
||||
|
||||
local settingConverter = { // Its reverted on clientside
|
||||
[1] = 3,
|
||||
[2] = 1,
|
||||
[3] = 2
|
||||
}
|
||||
|
||||
hook.Add("PlayerInitialSpawn", "eP:AutomaticChecks", function(ply)
|
||||
local automatic_identifier = tonumber(eProtect.data.general["automatic-identifier"]) or 1
|
||||
|
||||
timer.Simple(1.5, function() -- Giving time to set usergroup.
|
||||
if !IsValid(ply) or !ply:IsPlayer() or ply:IsBot() or eProtect.data.general["bypassgroup"][ply:GetUserGroup()] or eProtect.data.general["bypass_sids"][ply:SteamID64()] or eProtect.data.general["bypass_sids"][ply:SteamID()] then return end
|
||||
|
||||
if eProtect.data.general["block-vpn"] and !eProtect.data.general["bypass-vpn"][ply:GetUserGroup()] and !eProtect.data.general["bypass-vpn"][ply:SteamID64()] then
|
||||
local ip = ""
|
||||
|
||||
for k,v in ipairs(string.ToTable(ply:IPAddress())) do
|
||||
if v == ":" then break end
|
||||
|
||||
ip = ip..v
|
||||
end
|
||||
|
||||
http.Fetch("https://proxycheck.io/v2/"..ip.."?vpn=1", function(result)
|
||||
result = result and util.JSONToTable(result)
|
||||
|
||||
if result[ip] and result[ip].proxy == "yes" then
|
||||
ply:Kick(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "vpn-blocked"))
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
if automatic_identifier > 0 then
|
||||
eProtect.correlateIP(ply, function(result)
|
||||
local correlatedIPs = result
|
||||
local plysid64, ownerplysid64 = ply:SteamID64(), ply:OwnerSteamID64()
|
||||
local familyShare = ply:SteamID64() ~= ply:OwnerSteamID64()
|
||||
local detections = !familyShare and !table.IsEmpty(correlatedIPs)
|
||||
local altsDetected = {}
|
||||
|
||||
if detections then
|
||||
local detect_type
|
||||
detections = ""
|
||||
if correlatedIPs and istable(correlatedIPs) and !table.IsEmpty(correlatedIPs) then
|
||||
detect_type = "correlated-ip"
|
||||
|
||||
for k,v in ipairs(correlatedIPs) do
|
||||
table.insert(altsDetected, v.sid64)
|
||||
end
|
||||
|
||||
detections = slib.getLang("eprotect", eProtect.config["language"], "correlated-ip")
|
||||
end
|
||||
|
||||
if familyShare then
|
||||
detect_type = "family-share"
|
||||
|
||||
detections = detections == "" and slib.getLang("eprotect", eProtect.config["language"], "family-share") or detections.." "..slib.getLang("eprotect", eProtect.config["language"], "and").." "..slib.getLang("eprotect", eProtect.config["language"], "family-share")
|
||||
table.insert(altsDetected, ownerplysid64)
|
||||
end
|
||||
|
||||
if detections ~= "" then
|
||||
local doneAction
|
||||
|
||||
if automatic_identifier == 1 then
|
||||
for k, v in ipairs(player.GetAll()) do
|
||||
if eProtect.data.general["notification-groups"][v:GetUserGroup()] then
|
||||
slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "auto-detected-alt", ply:Nick(), detections), v)
|
||||
end
|
||||
end
|
||||
|
||||
doneAction = true
|
||||
elseif automatic_identifier == 2 then
|
||||
for k,v in ipairs(altsDetected) do
|
||||
doneAction = doneAction or verifyBannedAlt(ply, v, 1)
|
||||
end
|
||||
elseif automatic_identifier == 3 then
|
||||
for k,v in ipairs(altsDetected) do
|
||||
doneAction = doneAction or verifyBannedAlt(ply, v, 2)
|
||||
end
|
||||
end
|
||||
|
||||
if doneAction then
|
||||
eProtect.logDetectionHandeler(ply, "alt-detection", slib.getLang("eprotect", eProtect.config["language"], detect_type), settingConverter[automatic_identifier], util.TableToJSON(altsDetected))
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
hook.Add("PlayerSay", "eP:OpenMenu", function(ply, text, public)
|
||||
if eProtect.config["command"] == string.lower(text) then
|
||||
if !eProtect.hasPermission(ply) then
|
||||
return text
|
||||
end
|
||||
|
||||
eProtect.networkData(ply)
|
||||
|
||||
openMenu(ply)
|
||||
return ""
|
||||
end
|
||||
end )
|
||||
|
||||
hook.Add("eP:PreNetworking", "eP:Restrictions", function(ply, netstring, len)
|
||||
if !eProtect.canNetwork(ply, netstring) then return false end
|
||||
if len >= 512000 then eProtect.logDetectionHandeler(ply, "net-overflow", netstring, 1) eProtect.punish(ply, 1, slib.getLang("eprotect", eProtect.config["language"], "kick-net-overflow")) return false end
|
||||
end)
|
||||
|
||||
hook.Add("eP:PreHTTP", "eP:PreventBlockedHTTP", function(url)
|
||||
if eProtect.data.general["httpfocusedurls"] then
|
||||
return eProtect.data.general["httpfocusedurlsisblacklist"] == !tobool(eProtect.data.general["httpfocusedurls"][url])
|
||||
end
|
||||
end)
|
||||
|
||||
timer.Create("eP:SaveCache", eProtect.config["process-save-queue"], 0, function()
|
||||
if !eProtect.saveQueue then return end
|
||||
eProtect.saveData()
|
||||
|
||||
eProtect.saveQueue = nil
|
||||
end)
|
||||
|
||||
net.Receive("eP:Handeler", function(len, ply)
|
||||
local gateway = net.ReadBit()
|
||||
local action = net.ReadUInt(2)
|
||||
|
||||
if tobool(gateway) then
|
||||
if !eProtect.hasPermission(ply) then return end
|
||||
|
||||
if action == 0 then
|
||||
local id = net.ReadUInt(1)
|
||||
local page = net.ReadUInt(15)
|
||||
local search = net.ReadString()
|
||||
|
||||
if id == 0 then
|
||||
eProtect.requestHTTPLog(ply, page, search)
|
||||
elseif id == 1 then
|
||||
eProtect.requestDetectionLog(ply, page, search)
|
||||
end
|
||||
elseif action == 1 then
|
||||
local specific = net.ReadUInt(3)
|
||||
local strings = {}
|
||||
|
||||
for i=1,specific do
|
||||
strings[i] = net.ReadString()
|
||||
end
|
||||
|
||||
local statement = net.ReadUInt(2)
|
||||
local data
|
||||
|
||||
if statement == 1 then
|
||||
data = net.ReadBool()
|
||||
elseif statement == 2 then
|
||||
data = net.ReadInt(32)
|
||||
elseif statement == 3 then
|
||||
local chunk = net.ReadUInt(32)
|
||||
data = net.ReadData(chunk)
|
||||
|
||||
data = util.Decompress(data)
|
||||
data = util.JSONToTable(data)
|
||||
|
||||
local converted_tbl = {}
|
||||
|
||||
for k, v in pairs(data) do
|
||||
if string.sub(k, 1, 6) == "sid64_" then
|
||||
local sid64 = string.sub(k, 7, #k)
|
||||
|
||||
if util.SteamIDFrom64(sid64) != "STEAM_0:0:0" then
|
||||
k = sid64
|
||||
end
|
||||
end
|
||||
|
||||
converted_tbl[k] = v
|
||||
end
|
||||
|
||||
data = converted_tbl
|
||||
end
|
||||
|
||||
local finaldestination = eProtect.data
|
||||
for k,v in ipairs(strings) do
|
||||
finaldestination = finaldestination[v]
|
||||
if k >= (#strings - 1) then break end
|
||||
end
|
||||
|
||||
finaldestination[strings[#strings]] = data
|
||||
|
||||
eProtect.saveQueue = true
|
||||
eProtect.queueNetworking(nil, strings[1])
|
||||
elseif action == 2 then
|
||||
local subaction = net.ReadUInt(3)
|
||||
local target = net.ReadUInt(14)
|
||||
|
||||
target = Entity(target)
|
||||
|
||||
if !IsValid(target) or !target:IsPlayer() then slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "invalid-player"), ply) return end
|
||||
|
||||
local sid = target:SteamID()
|
||||
|
||||
if subaction == 1 then
|
||||
eProtect.data.disabled[sid] = net.ReadBool()
|
||||
eProtect.queueNetworking(nil, "disabled")
|
||||
elseif subaction == 2 then
|
||||
requestData(ply, target, net.ReadUInt(2))
|
||||
elseif subaction == 3 then
|
||||
local bit = net.ReadBit()
|
||||
if tobool(bit) then
|
||||
eProtect.correlateIP(target, function(result)
|
||||
if !IsValid(target) or !IsValid(ply) then return end
|
||||
if table.IsEmpty(result) then slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "no-correlation", target:Nick()), ply) return end
|
||||
|
||||
result = util.TableToJSON(result)
|
||||
result = util.Base64Encode(result)
|
||||
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(4,3)
|
||||
net.WriteUInt(target:EntIndex(), 14)
|
||||
net.WriteString(result)
|
||||
net.WriteBit(1)
|
||||
net.Send(ply)
|
||||
end)
|
||||
else
|
||||
eProtect.showIPs(target, ply)
|
||||
end
|
||||
elseif subaction == 4 then
|
||||
local sid64 = target:SteamID64()
|
||||
local ownersid64 = target:OwnerSteamID64()
|
||||
|
||||
if sid64 == ownersid64 then
|
||||
slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "no-family-share", target:Nick()), ply)
|
||||
else
|
||||
slib.notify(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "has-family-share", target:Nick(), ownersid64), ply)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
if action == 1 then
|
||||
local subaction = net.ReadUInt(2)
|
||||
|
||||
local data
|
||||
|
||||
if subaction == 1 then
|
||||
data = screenshotRequested
|
||||
elseif subaction == 2 then
|
||||
data = idRequested
|
||||
elseif subaction == 3 then
|
||||
data = dataRequested
|
||||
end
|
||||
|
||||
if !data[ply] then if eProtect.config["punishMaliciousIntent"] then eProtect.punish(ply, 1, slib.getLang("eprotect", eProtect.config["language"], "kick-malicious-intent")) end return end
|
||||
local target = data[ply]
|
||||
data[ply] = nil
|
||||
|
||||
local id
|
||||
|
||||
if subaction == 3 then
|
||||
local chunk = net.ReadUInt(32)
|
||||
id = net.ReadData(chunk)
|
||||
else
|
||||
id = net.ReadString()
|
||||
end
|
||||
|
||||
if !id or id == "" then
|
||||
if eProtect.config["punishMaliciousIntent"] then
|
||||
eProtect.punish(ply, 1, slib.getLang("eprotect", eProtect.config["language"], "kick-malicious-intent"))
|
||||
end
|
||||
return end
|
||||
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(3, 3)
|
||||
net.WriteUInt(subaction, 2)
|
||||
net.WriteUInt(ply:EntIndex(), 14)
|
||||
net.WriteBool(true)
|
||||
|
||||
if subaction == 3 then
|
||||
local chunk = #id
|
||||
net.WriteUInt(chunk, 32)
|
||||
net.WriteData(id, chunk)
|
||||
else
|
||||
net.WriteString(id)
|
||||
end
|
||||
|
||||
net.Send(target)
|
||||
elseif action == 2 then
|
||||
local menu = net.ReadUInt(2)
|
||||
local menus = {
|
||||
[1] = "Loki",
|
||||
[2] = "Exploit City"
|
||||
}
|
||||
|
||||
eProtect.logDetectionHandeler(ply, "exploit-menu", menus[menu], 2)
|
||||
eProtect.punish(ply, 2, slib.getLang("eprotect", eProtect.config["language"], "banned-exploit-menu"))
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("eP:SQLConnected", "eP:TransferOldIPs", function()
|
||||
local files = file.Find("eprotect/ips/*", "DATA")
|
||||
for k,v in pairs(files) do
|
||||
local sid64 = string.gsub(v, ".json", "")
|
||||
|
||||
local ips = file.Read("eprotect/ips/"..v, "DATA")
|
||||
ips = util.JSONToTable(ips)
|
||||
if !ips then continue end
|
||||
|
||||
for ip, data in pairs(ips) do
|
||||
eProtect.registerIP(sid64, ip, data[1], data[2])
|
||||
end
|
||||
|
||||
file.Delete("eprotect/ips/"..v)
|
||||
end
|
||||
file.Delete("eprotect/ips")
|
||||
|
||||
local save = false
|
||||
|
||||
if eProtect.data.httpLogging then
|
||||
for url, v in pairs(eProtect.data.httpLogging) do
|
||||
eProtect.logHTTP(url, v.type, v.called)
|
||||
end
|
||||
|
||||
eProtect.data.httpLogging = nil
|
||||
|
||||
save = true
|
||||
end
|
||||
|
||||
if eProtect.data.punishmentLogging then
|
||||
for i = #eProtect.data.punishmentLogging, 1, -1 do
|
||||
local data = eProtect.data.punishmentLogging[i]
|
||||
|
||||
eProtect.logDetection(data.ply, "", data.reason, data.info, data.type)
|
||||
end
|
||||
|
||||
eProtect.data.punishmentLogging = nil
|
||||
|
||||
save = true
|
||||
end
|
||||
|
||||
if save then
|
||||
eProtect.saveData()
|
||||
end
|
||||
end)
|
||||
|
||||
eProtect.dataVerification()
|
||||
@@ -1,67 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
eProtect.overrides = eProtect.overrides or {}
|
||||
|
||||
if !eProtect.overrides["net.Incoming"] then
|
||||
eProtect.overrides["net.Incoming"] = true
|
||||
function net.Incoming( len, client )
|
||||
local i = net.ReadHeader()
|
||||
local strName = util.NetworkIDToString( i )
|
||||
|
||||
if ( !strName ) then return end
|
||||
|
||||
local func = net.Receivers[ strName:lower() ]
|
||||
if ( !func ) then return end
|
||||
|
||||
len = len - 16
|
||||
|
||||
local pre = hook.Run("eP:PreNetworking", client, strName, len)
|
||||
|
||||
if pre == false then return end
|
||||
|
||||
func( len, client )
|
||||
|
||||
hook.Run("eP:PostNetworking", client, strName, len)
|
||||
end
|
||||
end
|
||||
|
||||
if !eProtect.config["disablehttplogging"] and ((!VC and !XEON and !mLib) or eProtect.config["ignoreDRM"]) then
|
||||
if !eProtect.overrides["http.Fetch"] then
|
||||
eProtect.overrides["http.Fetch"] = true
|
||||
local oldFetch = http.Fetch
|
||||
function http.Fetch(...)
|
||||
local args = {...}
|
||||
local result = hook.Run("eP:PreHTTP", args[1], "fetch")
|
||||
|
||||
if result == false then return end
|
||||
|
||||
oldFetch(...)
|
||||
|
||||
hook.Run("eP:PostHTTP", args[1], "fetch")
|
||||
end
|
||||
end
|
||||
|
||||
if !eProtect.overrides["http.Post"] then
|
||||
eProtect.overrides["http.Post"] = true
|
||||
local oldPost = http.Post
|
||||
function http.Post(...)
|
||||
local args = {...}
|
||||
local result = hook.Run("eP:PreHTTP", args[1], "post")
|
||||
|
||||
if result == false then return end
|
||||
|
||||
oldPost(...)
|
||||
|
||||
hook.Run("eP:PostHTTP", args[1], "post")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,250 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
local query, db
|
||||
local escape_str = function(str) return SQLStr(str, true) end
|
||||
|
||||
local create_queries = {
|
||||
[1] = [[CREATE TABLE IF NOT EXISTS eprotect_ips(
|
||||
id INTEGER PRIMARY KEY %s,
|
||||
sid64 CHAR(17),
|
||||
ip CHAR(15),
|
||||
country CHAR(3),
|
||||
logged_time INTEGER DEFAULT 0
|
||||
)]],
|
||||
[2] = [[CREATE TABLE IF NOT EXISTS eprotect_detections(
|
||||
id INTEGER PRIMARY KEY %s,
|
||||
name CHAR(32),
|
||||
sid64 CHAR(17),
|
||||
reason CHAR(32),
|
||||
info CHAR(32),
|
||||
type INTEGER DEFAULT 0,
|
||||
logged_time INTEGER DEFAULT 0,
|
||||
additional_info TEXT NULL
|
||||
)]],
|
||||
[3] = [[CREATE TABLE IF NOT EXISTS eprotect_http(
|
||||
id INTEGER PRIMARY KEY %s,
|
||||
link CHAR(64),
|
||||
type CHAR(6),
|
||||
called INTEGER DEFAULT 0
|
||||
)]],
|
||||
[4] = [[ALTER TABLE eprotect_detections
|
||||
ADD additional_info TEXT NULL]]
|
||||
}
|
||||
|
||||
local function makeTables()
|
||||
for i = 1, #create_queries do
|
||||
query(string.format(create_queries[i], eProtect.config["storage_type"] == "sql_local" and "AUTOINCREMENT" or "AUTO_INCREMENT"))
|
||||
end
|
||||
end
|
||||
|
||||
if eProtect.config["storage_type"] == "mysql" then
|
||||
require("mysqloo")
|
||||
|
||||
query = function() end
|
||||
|
||||
local dbinfo = eProtect.config["mysql_info"]
|
||||
|
||||
db = mysqloo.connect(dbinfo.host, dbinfo.username, dbinfo.password, dbinfo.database, dbinfo.port)
|
||||
|
||||
function db:onConnected()
|
||||
print(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "mysql_successfull"))
|
||||
|
||||
query = function(str, func)
|
||||
local q = db:query(str)
|
||||
q.onSuccess = function(_, data)
|
||||
if func then
|
||||
func(data)
|
||||
end
|
||||
end
|
||||
|
||||
q.onError = function(_, err) end
|
||||
|
||||
q:start()
|
||||
end
|
||||
|
||||
escape_str = function(str) return db:escape(tostring(str)) end
|
||||
|
||||
makeTables()
|
||||
|
||||
hook.Run("eP:SQLConnected")
|
||||
end
|
||||
|
||||
function db:onConnectionFailed(err)
|
||||
print(eProtect.config["prefix"]..slib.getLang("eprotect", eProtect.config["language"], "mysql_failed"))
|
||||
print( "Error:", err )
|
||||
end
|
||||
|
||||
db:connect()
|
||||
else
|
||||
local oldFunc = sql.Query
|
||||
query = function(str, func)
|
||||
local result = oldFunc(str)
|
||||
|
||||
if func then
|
||||
func(result)
|
||||
end
|
||||
end
|
||||
|
||||
makeTables()
|
||||
end
|
||||
|
||||
local function handleCallbacksCorrelation(parent_tbl, correlated, callback)
|
||||
for k,v in ipairs(parent_tbl) do
|
||||
if !v then return end
|
||||
end
|
||||
|
||||
if !callback then return end
|
||||
callback(correlated or {})
|
||||
end
|
||||
|
||||
eProtect.correlateIP = function(target, callback)
|
||||
if !IsValid(target) then return end
|
||||
|
||||
local sid64, tbl = target:SteamID64(), {}
|
||||
|
||||
query("SELECT * FROM eprotect_ips WHERE sid64 = '"..sid64.."'", function(result)
|
||||
if result and result[1] then
|
||||
local parent_tbl = {}
|
||||
for k, v in ipairs(result) do
|
||||
parent_tbl[k] = false
|
||||
end
|
||||
|
||||
for key, plydata in ipairs(result) do
|
||||
query("SELECT * FROM eprotect_ips WHERE ip = '"..(plydata.ip).."'", function(result)
|
||||
if result and result[1] then
|
||||
for k,v in ipairs(result) do
|
||||
if v.sid64 == sid64 then continue end
|
||||
table.insert(tbl, {sid64 = v.sid64, ip = v.ip})
|
||||
end
|
||||
end
|
||||
|
||||
parent_tbl[key] = true
|
||||
|
||||
handleCallbacksCorrelation(parent_tbl, tbl, callback)
|
||||
end)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
eProtect.showIPs = function(target, ply)
|
||||
local sid64 = target:SteamID64()
|
||||
|
||||
query("SELECT * FROM eprotect_ips WHERE sid64 = '"..sid64.."'", function(result)
|
||||
if !IsValid(target) or !IsValid(ply) or !result or !result[1] then return end
|
||||
|
||||
result = util.TableToJSON(result)
|
||||
result = util.Base64Encode(result)
|
||||
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(4,3)
|
||||
net.WriteUInt(target:EntIndex(), 14)
|
||||
net.WriteString(result)
|
||||
net.WriteBit(0)
|
||||
net.Send(ply)
|
||||
end)
|
||||
end
|
||||
|
||||
eProtect.registerIP = function(sid64, ip, country, time)
|
||||
query("SELECT * FROM eprotect_ips WHERE ip = '"..ip.."' AND sid64 = '"..sid64.."'", function(result)
|
||||
if result and result[1] then return end
|
||||
query(string.format("INSERT INTO eprotect_ips(ip, sid64, country, logged_time) VALUES('%s', %s, '%s', %s)", escape_str(ip), sid64, escape_str(country), time or os.time()))
|
||||
end)
|
||||
end
|
||||
|
||||
eProtect.logDetection = function(name, sid64, reason, info, type, additional_info)
|
||||
additional_info = additional_info or ""
|
||||
|
||||
query(string.format("INSERT INTO eprotect_detections(name, sid64, reason, info, type, logged_time, additional_info) VALUES('%s', '%s', '%s', '%s', '%s', %s, '%s')", escape_str(name), escape_str(sid64), escape_str(reason), escape_str(info), escape_str(type), os.time(), escape_str(additional_info)))
|
||||
end
|
||||
|
||||
eProtect.logHTTP = function(link, type, called)
|
||||
link = escape_str(link)
|
||||
|
||||
query("SELECT * FROM eprotect_http WHERE link = '"..link.."'", function(result)
|
||||
if result and result[1] then
|
||||
query("UPDATE eprotect_http SET called = "..(result[1].called + 1).." WHERE link = '"..link.."'")
|
||||
return end
|
||||
|
||||
query(string.format("INSERT INTO eprotect_http(link, type, called) VALUES('%s', '%s', "..(tonumber(called) or 1)..")", link, escape_str(type)))
|
||||
end)
|
||||
end
|
||||
|
||||
local function networkData(ply, data, id)
|
||||
local compressed = util.Compress(util.TableToJSON(data))
|
||||
|
||||
net.Start("eP:Handeler")
|
||||
net.WriteUInt(5, 3)
|
||||
net.WriteUInt(id, 1)
|
||||
net.WriteUInt(#compressed, 32)
|
||||
net.WriteData(compressed, #compressed)
|
||||
net.Send(ply)
|
||||
end
|
||||
|
||||
local http_cd, detection_cd = {}, {}
|
||||
|
||||
eProtect.requestHTTPLog = function(ply, page, search)
|
||||
if http_cd[ply] and http_cd[ply] > CurTime() then return end
|
||||
http_cd[ply] = CurTime() + .1
|
||||
|
||||
search = search ~= "" and escape_str(search) or nil
|
||||
|
||||
local perpage, pageCount = 20, 1
|
||||
local start = perpage * ((tonumber(page) or 1) - 1)
|
||||
local data = {}
|
||||
|
||||
local search_str = search and " WHERE (link LIKE '%"..search.."%')" or ""
|
||||
|
||||
query("SELECT COUNT(id) FROM eprotect_http"..search_str, function(pageresult)
|
||||
if pageresult and pageresult[1] and pageresult[1]["COUNT(id)"] then
|
||||
data.pageCount = math.max(math.ceil((pageresult[1]["COUNT(id)"] or 0) / perpage), 1)
|
||||
end
|
||||
|
||||
data.page = page
|
||||
|
||||
query("SELECT * FROM eprotect_http "..search_str.." LIMIT "..start..", "..perpage, function(result)
|
||||
data.result = result
|
||||
|
||||
networkData(ply, data, 0)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
eProtect.requestDetectionLog = function(ply, page, search)
|
||||
if detection_cd[ply] and detection_cd[ply] > CurTime() then return end
|
||||
detection_cd[ply] = CurTime() + .1
|
||||
|
||||
search = search ~= "" and escape_str(search) or nil
|
||||
|
||||
local perpage, pageCount = 20, 1
|
||||
local start = perpage * ((tonumber(page) or 1) - 1)
|
||||
local data = {}
|
||||
|
||||
local search_str = search and " WHERE (sid64 LIKE '%"..search.."%' OR name LIKE '%"..search.."%') " or ""
|
||||
|
||||
query("SELECT COUNT(id) FROM eprotect_detections"..search_str, function(pageresult)
|
||||
if pageresult and pageresult[1] and pageresult[1]["COUNT(id)"] then
|
||||
data.pageCount = math.max(math.ceil((pageresult[1]["COUNT(id)"] or 0) / perpage), 1)
|
||||
end
|
||||
|
||||
data.page = page
|
||||
|
||||
query("SELECT * FROM eprotect_detections"..search_str.." ORDER BY id DESC LIMIT "..start..", "..perpage, function(result)
|
||||
data.result = result
|
||||
|
||||
networkData(ply, data, 1)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
if eProtect.config["storage_type"] == "sql_local" then
|
||||
hook.Run("eP:SQLConnected")
|
||||
end
|
||||
@@ -1,109 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
------------------------------------------------------
|
||||
-- NO NOT TOUCH ANYTHING IN HERE!!!!!!!!!
|
||||
------------------------------------------------------
|
||||
|
||||
eProtect = eProtect or {}
|
||||
|
||||
eProtect.BaseConfig = eProtect.BaseConfig or {}
|
||||
|
||||
eProtect.BaseConfig["disable-all-networking"] = {false, 1}
|
||||
|
||||
eProtect.BaseConfig["automatic-identifier"] = {1, 2, {min = 0, max = 3}}
|
||||
|
||||
eProtect.BaseConfig["block-vpn"] = {false, 3}
|
||||
|
||||
eProtect.BaseConfig["bypass-vpn"] = {{["76561198002319944"] = true}, 4, function()
|
||||
local list = {}
|
||||
|
||||
for k,v in ipairs(player.GetAll()) do
|
||||
local sid64 = v:SteamID64()
|
||||
if !sid64 then continue end
|
||||
list[sid64] = true
|
||||
end
|
||||
|
||||
if CAMI and CAMI.GetUsergroups then
|
||||
for k,v in pairs(CAMI.GetUsergroups()) do
|
||||
list[k] = true
|
||||
end
|
||||
end
|
||||
|
||||
return list
|
||||
end}
|
||||
|
||||
|
||||
eProtect.BaseConfig["notification-groups"] = {{["superadmin"] = true}, 5, CAMI and CAMI.GetUsergroups and function() local tbl = {} for k,v in pairs(CAMI.GetUsergroups()) do tbl[k] = true end return tbl end or {}}
|
||||
|
||||
eProtect.BaseConfig["ratelimit"] = {500, 6, {min = -1, max = 100000}}
|
||||
|
||||
eProtect.BaseConfig["timeout"] = {3, 7, {min = 0, max = 5000}}
|
||||
|
||||
eProtect.BaseConfig["overflowpunishment"] = {2, 8, {min = 0, max = 3}}
|
||||
|
||||
eProtect.BaseConfig["whitelistergroup"] = {{}, 9, function()
|
||||
local list = {}
|
||||
|
||||
if CAMI and CAMI.GetUsergroups then
|
||||
for k,v in pairs(CAMI.GetUsergroups()) do
|
||||
list[k] = true
|
||||
end
|
||||
end
|
||||
|
||||
return list
|
||||
end}
|
||||
|
||||
eProtect.BaseConfig["bypassgroup"] = {{}, 10, function()
|
||||
local list = {
|
||||
["superadmin"] = true,
|
||||
["owner"] = true
|
||||
}
|
||||
|
||||
if CAMI and CAMI.GetUsergroups then
|
||||
for k,v in pairs(CAMI.GetUsergroups()) do
|
||||
list[k] = true
|
||||
end
|
||||
end
|
||||
|
||||
return list
|
||||
end}
|
||||
|
||||
eProtect.BaseConfig["bypass_sids"] = {{["76561198002319944"] = true}, 11, function()
|
||||
local list = {}
|
||||
|
||||
for k,v in ipairs(player.GetAll()) do
|
||||
local sid64 = v:SteamID64()
|
||||
if !sid64 then continue end
|
||||
list[sid64] = true
|
||||
end
|
||||
|
||||
return list
|
||||
end}
|
||||
|
||||
eProtect.BaseConfig["httpfocusedurlsisblacklist"] = {true, 12}
|
||||
|
||||
eProtect.BaseConfig["httpfocusedurls"] = {{}, 13, function()
|
||||
local list = {}
|
||||
|
||||
local tbl_http = eProtect.data["requestedHTTP"] and eProtect.data["requestedHTTP"].result or {}
|
||||
|
||||
if tbl_http then
|
||||
for k,v in ipairs(tbl_http) do
|
||||
list[v.link] = true
|
||||
end
|
||||
end
|
||||
|
||||
return list
|
||||
end}
|
||||
|
||||
------------------------------------------------------
|
||||
-- NO NOT TOUCH ANYTHING IN HERE!!!!!!!!!
|
||||
------------------------------------------------------76561198002319944
|
||||
@@ -1,43 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
|
||||
eProtect.config = eProtect.config or {}
|
||||
|
||||
eProtect.config["language"] = "en"
|
||||
|
||||
eProtect.config["prefix"] = "[eProtect] "
|
||||
|
||||
eProtect.config["storage_type"] = "sql_local"-- (sql_local or mysql)
|
||||
|
||||
eProtect.config["disablehttplogging"] = false -- If a DRM is ran after eProtect it could break if they check for HTTP modifications! If so make this true.
|
||||
|
||||
eProtect.config["ignoreDRM"] = false
|
||||
|
||||
eProtect.config["scURL"] = "https://stromic.dev/eprotect/img.php" -- This is the URL used to handle screenshots, can be self hosted here: https://github.com/Stromic/eprotect-web
|
||||
|
||||
eProtect.config["punishMaliciousIntent"] = true
|
||||
|
||||
eProtect.config["disabledModules"] = {
|
||||
["identifier"] = false,
|
||||
["detection_log"] = false,
|
||||
["net_limiter"] = false,
|
||||
["net_logger"] = false,
|
||||
["exploit_patcher"] = false,
|
||||
["exploit_finder"] = false,
|
||||
["fake_exploits"] = false,
|
||||
["data_snooper"] = false
|
||||
}
|
||||
|
||||
eProtect.config["permission"] = {
|
||||
["owner"] = true,
|
||||
["superadmin"] = true
|
||||
}
|
||||
@@ -1,550 +0,0 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
eProtect = eProtect or {}
|
||||
|
||||
eProtect.config = eProtect.config or {}
|
||||
|
||||
eProtect.config["mysql_info"] = {
|
||||
host = "",
|
||||
port = 3306,
|
||||
database = "",
|
||||
username = "",
|
||||
password = ""
|
||||
}
|
||||
|
||||
eProtect.config["command"] = "!eprotect"
|
||||
|
||||
eProtect.config["process-save-queue"] = 10 --- This will check if we should save data to the file. 00
|
||||
|
||||
eProtect.data = eProtect.data or {}
|
||||
|
||||
eProtect.data.badNets = eProtect.data.badNets or {}
|
||||
|
||||
eProtect.registerBadNet = function(netstring, num)
|
||||
eProtect.data.badNets[netstring] = {type = num}
|
||||
end
|
||||
|
||||
|
||||
-- Credits to meepen for the table with known exploits and backdoors! <3
|
||||
|
||||
--- Known Exploits
|
||||
eProtect.registerBadNet("pplay_deleterow", 1)
|
||||
eProtect.registerBadNet("pplay_addrow", 1)
|
||||
eProtect.registerBadNet("pplay_sendtable", 1)
|
||||
eProtect.registerBadNet("WriteQuery", 1)
|
||||
eProtect.registerBadNet("SendMoney", 1)
|
||||
eProtect.registerBadNet("BailOut", 1)
|
||||
eProtect.registerBadNet("customprinter_get", 1)
|
||||
eProtect.registerBadNet("textstickers_entdata", 1)
|
||||
eProtect.registerBadNet("NC_GetNameChange", 1)
|
||||
eProtect.registerBadNet("ATS_WARP_REMOVE_CLIENT", 1)
|
||||
eProtect.registerBadNet("ATS_WARP_FROM_CLIENT", 1)
|
||||
eProtect.registerBadNet("ATS_WARP_VIEWOWNER", 1)
|
||||
eProtect.registerBadNet("CFRemoveGame", 1)
|
||||
eProtect.registerBadNet("CFJoinGame", 1)
|
||||
eProtect.registerBadNet("CFEndGame", 1)
|
||||
eProtect.registerBadNet("CreateCase", 1)
|
||||
eProtect.registerBadNet("rprotect_terminal_settings", 1)
|
||||
eProtect.registerBadNet("StackGhost", 1)
|
||||
eProtect.registerBadNet("RevivePlayer", 1)
|
||||
eProtect.registerBadNet("ARMORY_RetrieveWeapon", 1)
|
||||
eProtect.registerBadNet("TransferReport", 1)
|
||||
eProtect.registerBadNet("SimplicityAC_aysent", 1)
|
||||
eProtect.registerBadNet("pac_to_contraption", 1)
|
||||
eProtect.registerBadNet("SyncPrinterButtons76561198056171650", 1)
|
||||
eProtect.registerBadNet("sendtable", 1)
|
||||
eProtect.registerBadNet("steamid2", 1)
|
||||
eProtect.registerBadNet("Kun_SellDrug", 1)
|
||||
eProtect.registerBadNet("net_PSUnBoxServer", 1)
|
||||
eProtect.registerBadNet("pplay_deleterow", 1)
|
||||
eProtect.registerBadNet("pplay_addrow", 1)
|
||||
eProtect.registerBadNet("CraftSomething", 1)
|
||||
eProtect.registerBadNet("banleaver", 1)
|
||||
eProtect.registerBadNet("75_plus_win", 1)
|
||||
eProtect.registerBadNet("ATMDepositMoney", 1)
|
||||
eProtect.registerBadNet("Taxi_Add", 1)
|
||||
eProtect.registerBadNet("Kun_SellOil", 1)
|
||||
eProtect.registerBadNet("SellMinerals", 1)
|
||||
eProtect.registerBadNet("TakeBetMoney", 1)
|
||||
eProtect.registerBadNet("PoliceJoin", 1)
|
||||
eProtect.registerBadNet("CpForm_Answers", 1)
|
||||
eProtect.registerBadNet("DepositMoney", 1)
|
||||
eProtect.registerBadNet("MDE_RemoveStuff_C2S", 1)
|
||||
eProtect.registerBadNet("NET_SS_DoBuyTakeoff", 1)
|
||||
eProtect.registerBadNet("NET_EcSetTax", 1)
|
||||
eProtect.registerBadNet("RP_Accept_Fine", 1)
|
||||
eProtect.registerBadNet("RP_Fine_Player", 1)
|
||||
eProtect.registerBadNet("RXCAR_Shop_Store_C2S", 1)
|
||||
eProtect.registerBadNet("RXCAR_SellINVCar_C2S", 1)
|
||||
eProtect.registerBadNet("drugseffect_remove", 1)
|
||||
eProtect.registerBadNet("drugs_money", 1)
|
||||
eProtect.registerBadNet("CRAFTINGMOD_SHOP", 1)
|
||||
eProtect.registerBadNet("drugs_ignite", 1)
|
||||
eProtect.registerBadNet("drugseffect_hpremove", 1)
|
||||
eProtect.registerBadNet("DarkRP_Kun_ForceSpawn", 1)
|
||||
eProtect.registerBadNet("drugs_text", 1)
|
||||
eProtect.registerBadNet("NLRKick", 1)
|
||||
eProtect.registerBadNet("RecKickAFKer", 1)
|
||||
eProtect.registerBadNet("GMBG:PickupItem", 1)
|
||||
eProtect.registerBadNet("DL_Answering", 1)
|
||||
eProtect.registerBadNet("data_check", 1)
|
||||
eProtect.registerBadNet("plyWarning", 1)
|
||||
eProtect.registerBadNet("NLR.ActionPlayer", 1)
|
||||
eProtect.registerBadNet("timebombDefuse", 1)
|
||||
eProtect.registerBadNet("start_wd_emp", 1)
|
||||
eProtect.registerBadNet("kart_sell", 1)
|
||||
eProtect.registerBadNet("FarmingmodSellItems", 1)
|
||||
eProtect.registerBadNet("ClickerAddToPoints", 1)
|
||||
eProtect.registerBadNet("bodyman_model_change", 1)
|
||||
eProtect.registerBadNet("TOW_PayTheFine", 1)
|
||||
eProtect.registerBadNet("FIRE_CreateFireTruck", 1)
|
||||
eProtect.registerBadNet("hitcomplete", 1)
|
||||
eProtect.registerBadNet("hhh_request", 1)
|
||||
eProtect.registerBadNet("DaHit", 1)
|
||||
eProtect.registerBadNet("TCBBuyAmmo", 1)
|
||||
eProtect.registerBadNet("DataSend", 1)
|
||||
eProtect.registerBadNet("gBan.BanBuffer", 1)
|
||||
eProtect.registerBadNet("fp_as_doorHandler", 1)
|
||||
eProtect.registerBadNet("Upgrade", 1)
|
||||
eProtect.registerBadNet("TowTruck_CreateTowTruck", 1)
|
||||
eProtect.registerBadNet("TOW_SubmitWarning", 1)
|
||||
eProtect.registerBadNet("duelrequestguiYes", 1)
|
||||
eProtect.registerBadNet("JoinOrg", 1)
|
||||
eProtect.registerBadNet("pac_submit", 1)
|
||||
eProtect.registerBadNet("NDES_SelectedEmblem", 1)
|
||||
eProtect.registerBadNet("join_disconnect", 1)
|
||||
eProtect.registerBadNet("Morpheus.StaffTracker", 1)
|
||||
eProtect.registerBadNet("casinokit_chipexchange", 1)
|
||||
eProtect.registerBadNet("BuyKey", 1)
|
||||
eProtect.registerBadNet("BuyCrate", 1)
|
||||
eProtect.registerBadNet("FactionInviteConsole", 1)
|
||||
eProtect.registerBadNet("FacCreate", 1)
|
||||
eProtect.registerBadNet("1942_Fuhrer_SubmitCandidacy", 1)
|
||||
eProtect.registerBadNet("pogcp_report_submitReport", 1)
|
||||
eProtect.registerBadNet("hsend", 1)
|
||||
eProtect.registerBadNet("BuilderXToggleKill", 1)
|
||||
eProtect.registerBadNet("Chatbox_PlayerChat", 1)
|
||||
eProtect.registerBadNet("reports.submit", 1)
|
||||
eProtect.registerBadNet("services_accept", 1)
|
||||
eProtect.registerBadNet("Warn_CreateWarn", 1)
|
||||
eProtect.registerBadNet("NewReport", 1)
|
||||
eProtect.registerBadNet("soez", 1)
|
||||
eProtect.registerBadNet("GiveHealthNPC", 1)
|
||||
eProtect.registerBadNet("DarkRP_SS_Gamble", 1)
|
||||
eProtect.registerBadNet("buyinghealth", 1)
|
||||
eProtect.registerBadNet("DarkRP_preferredjobmodel", 1)
|
||||
eProtect.registerBadNet("whk_setart", 1)
|
||||
eProtect.registerBadNet("WithdrewBMoney", 1)
|
||||
eProtect.registerBadNet("DuelMessageReturn", 1)
|
||||
eProtect.registerBadNet("ban_rdm", 1)
|
||||
eProtect.registerBadNet("BuyCar", 1)
|
||||
eProtect.registerBadNet("ats_send_toServer", 1)
|
||||
eProtect.registerBadNet("dLogsGetCommand", 1)
|
||||
eProtect.registerBadNet("disguise", 1)
|
||||
eProtect.registerBadNet("gportal_rpname_change", 1)
|
||||
eProtect.registerBadNet("AbilityUse", 1)
|
||||
eProtect.registerBadNet("ClickerAddToPoints", 1)
|
||||
eProtect.registerBadNet("race_accept", 1)
|
||||
eProtect.registerBadNet("give_me_weapon", 1)
|
||||
eProtect.registerBadNet("FinishContract", 1)
|
||||
eProtect.registerBadNet("NLR_SPAWN", 1)
|
||||
eProtect.registerBadNet("Kun_ZiptieStruggle", 1)
|
||||
eProtect.registerBadNet("JB_Votekick", 1)
|
||||
eProtect.registerBadNet("Letthisdudeout", 1)
|
||||
eProtect.registerBadNet("ckit_roul_bet", 1)
|
||||
eProtect.registerBadNet("pac.net.TouchFlexes.ClientNotify", 1)
|
||||
eProtect.registerBadNet("ply_pick_shit", 1)
|
||||
eProtect.registerBadNet("TFA_Attachment_RequestAll", 1)
|
||||
eProtect.registerBadNet("BuyFirstTovar", 1)
|
||||
eProtect.registerBadNet("BuySecondTovar", 1)
|
||||
eProtect.registerBadNet("GiveHealthNPC", 1)
|
||||
eProtect.registerBadNet("MONEY_SYSTEM_GetWeapons", 1)
|
||||
eProtect.registerBadNet("MCon_Demote_ToServer", 1)
|
||||
eProtect.registerBadNet("withdrawp", 1)
|
||||
eProtect.registerBadNet("PCAdd", 1)
|
||||
eProtect.registerBadNet("ActivatePC", 1)
|
||||
eProtect.registerBadNet("PCDelAll", 1)
|
||||
eProtect.registerBadNet("viv_hl2rp_disp_message", 1)
|
||||
eProtect.registerBadNet("ATM_DepositMoney_C2S", 1)
|
||||
eProtect.registerBadNet("BM2.Command.SellBitcoins", 1)
|
||||
eProtect.registerBadNet("BM2.Command.Eject", 1)
|
||||
eProtect.registerBadNet("tickbooksendfine", 1)
|
||||
eProtect.registerBadNet("egg", 1)
|
||||
eProtect.registerBadNet("RHC_jail_player", 1)
|
||||
eProtect.registerBadNet("PlayerUseItem", 1)
|
||||
eProtect.registerBadNet("Chess Top10", 1)
|
||||
eProtect.registerBadNet("ItemStoreUse", 1)
|
||||
eProtect.registerBadNet("EZS_PlayerTag", 1)
|
||||
eProtect.registerBadNet("simfphys_gasspill", 1)
|
||||
eProtect.registerBadNet("sphys_dupe", 1)
|
||||
eProtect.registerBadNet("sw_gokart", 1)
|
||||
eProtect.registerBadNet("wordenns", 1)
|
||||
eProtect.registerBadNet("SyncPrinterButtons16690", 1)
|
||||
eProtect.registerBadNet("AttemptSellCar", 1)
|
||||
eProtect.registerBadNet("uPLYWarning", 1)
|
||||
eProtect.registerBadNet("atlaschat.rqclrcfg", 1)
|
||||
eProtect.registerBadNet("dlib.getinfo.replicate", 1)
|
||||
eProtect.registerBadNet("SetPermaKnife", 1)
|
||||
eProtect.registerBadNet("EnterpriseWithdraw", 1)
|
||||
eProtect.registerBadNet("SBP_addtime", 1)
|
||||
eProtect.registerBadNet("NetData", 1)
|
||||
eProtect.registerBadNet("CW20_PRESET_LOAD", 1)
|
||||
eProtect.registerBadNet("minigun_drones_switch", 1)
|
||||
eProtect.registerBadNet("NET_AM_MakePotion", 1)
|
||||
eProtect.registerBadNet("bitcoins_request_turn_off", 1)
|
||||
eProtect.registerBadNet("bitcoins_request_turn_on", 1)
|
||||
eProtect.registerBadNet("bitcoins_request_withdraw", 1)
|
||||
eProtect.registerBadNet("PermwepsNPCSellWeapon", 1)
|
||||
eProtect.registerBadNet("ncpstoredoact", 1)
|
||||
eProtect.registerBadNet("DuelRequestClient", 1)
|
||||
eProtect.registerBadNet("BeginSpin", 1)
|
||||
eProtect.registerBadNet("tickbookpayfine", 1)
|
||||
eProtect.registerBadNet("fg_printer_money", 1)
|
||||
eProtect.registerBadNet("IGS.GetPaymentURL", 1)
|
||||
eProtect.registerBadNet("AirDrops_StartPlacement", 1)
|
||||
eProtect.registerBadNet("SlotsRemoved", 1)
|
||||
eProtect.registerBadNet("FARMINGMOD_DROPITEM", 1)
|
||||
eProtect.registerBadNet("cab_sendmessage", 1)
|
||||
eProtect.registerBadNet("cab_cd_testdrive", 1)
|
||||
eProtect.registerBadNet("blueatm", 1)
|
||||
eProtect.registerBadNet("SCP-294Sv", 1)
|
||||
eProtect.registerBadNet("dronesrewrite_controldr", 1)
|
||||
eProtect.registerBadNet("desktopPrinter_Withdraw", 1)
|
||||
eProtect.registerBadNet("RemoveTag", 1)
|
||||
eProtect.registerBadNet("IDInv_RequestBank", 1)
|
||||
eProtect.registerBadNet("UseMedkit", 1)
|
||||
eProtect.registerBadNet("WipeMask", 1)
|
||||
eProtect.registerBadNet("SwapFilter", 1)
|
||||
eProtect.registerBadNet("RemoveMask", 1)
|
||||
eProtect.registerBadNet("DeployMask", 1)
|
||||
eProtect.registerBadNet("ZED_SpawnCar", 1)
|
||||
eProtect.registerBadNet("levelup_useperk", 1)
|
||||
eProtect.registerBadNet("passmayorexam", 1)
|
||||
eProtect.registerBadNet("Selldatride", 1)
|
||||
eProtect.registerBadNet("ORG_VaultDonate", 1)
|
||||
eProtect.registerBadNet("ORG_NewOrg", 1)
|
||||
eProtect.registerBadNet("ScannerMenu", 1)
|
||||
eProtect.registerBadNet("misswd_accept", 1)
|
||||
eProtect.registerBadNet("D3A_Message", 1)
|
||||
eProtect.registerBadNet("LawsToServer", 1)
|
||||
eProtect.registerBadNet("Shop_buy", 1)
|
||||
eProtect.registerBadNet("D3A_CreateOrg", 1)
|
||||
eProtect.registerBadNet("Gb_gasstation_BuyGas", 1)
|
||||
eProtect.registerBadNet("Gb_gasstation_BuyJerrycan", 1)
|
||||
eProtect.registerBadNet("MineServer", 1)
|
||||
eProtect.registerBadNet("AcceptBailOffer", 1)
|
||||
eProtect.registerBadNet("LawyerOfferBail", 1)
|
||||
eProtect.registerBadNet("buy_bundle", 1)
|
||||
eProtect.registerBadNet("AskPickupItemInv", 1)
|
||||
eProtect.registerBadNet("donatorshop_itemtobuy", 1)
|
||||
eProtect.registerBadNet("netOrgVoteInvite_Server", 1)
|
||||
eProtect.registerBadNet("Chess ClientWager", 1)
|
||||
eProtect.registerBadNet("AcceptRequest", 1)
|
||||
eProtect.registerBadNet("deposit", 1)
|
||||
eProtect.registerBadNet("CubeRiot CaptureZone Update", 1)
|
||||
eProtect.registerBadNet("NPCShop_BuyItem", 1)
|
||||
eProtect.registerBadNet("SpawnProtection", 1)
|
||||
eProtect.registerBadNet("hoverboardpurchase", 1)
|
||||
eProtect.registerBadNet("soundArrestCommit", 1)
|
||||
eProtect.registerBadNet("LotteryMenu", 1)
|
||||
eProtect.registerBadNet("updateLaws", 1)
|
||||
eProtect.registerBadNet("TMC_NET_FirePlayer", 1)
|
||||
eProtect.registerBadNet("thiefnpc", 1)
|
||||
eProtect.registerBadNet("TMC_NET_MakePlayerWanted", 1)
|
||||
eProtect.registerBadNet("SyncRemoveAction", 1)
|
||||
eProtect.registerBadNet("HV_AmmoBuy", 1)
|
||||
eProtect.registerBadNet("NET_CR_TakeStoredMoney", 1)
|
||||
eProtect.registerBadNet("nox_addpremadepunishment", 1)
|
||||
eProtect.registerBadNet("GrabMoney", 1)
|
||||
eProtect.registerBadNet("LAWYER.GetBailOut", 1)
|
||||
eProtect.registerBadNet("LAWYER.BailFelonOut", 1)
|
||||
eProtect.registerBadNet("br_send_pm", 1)
|
||||
eProtect.registerBadNet("GET_Admin_MSGS", 1)
|
||||
eProtect.registerBadNet("OPEN_ADMIN_CHAT", 1)
|
||||
eProtect.registerBadNet("LB_AddBan", 1)
|
||||
eProtect.registerBadNet("redirectMsg", 1)
|
||||
eProtect.registerBadNet("RDMReason_Explain", 1)
|
||||
eProtect.registerBadNet("JB_SelectWarden", 1)
|
||||
eProtect.registerBadNet("JB_GiveCubics", 1)
|
||||
eProtect.registerBadNet("SendSteamID", 1)
|
||||
eProtect.registerBadNet("wyozimc_playply", 1)
|
||||
eProtect.registerBadNet("SpecDM_SendLoadout", 1)
|
||||
eProtect.registerBadNet("sv_saveweapons", 1)
|
||||
eProtect.registerBadNet("DL_StartReport", 1)
|
||||
eProtect.registerBadNet("DL_ReportPlayer", 1)
|
||||
eProtect.registerBadNet("DL_AskLogsList", 1)
|
||||
eProtect.registerBadNet("DailyLoginClaim", 1)
|
||||
eProtect.registerBadNet("GiveWeapon", 1)
|
||||
eProtect.registerBadNet("GovStation_SpawnVehicle", 1)
|
||||
eProtect.registerBadNet("inviteToOrganization", 1)
|
||||
eProtect.registerBadNet("createFaction", 1)
|
||||
eProtect.registerBadNet("sellitem", 1)
|
||||
eProtect.registerBadNet("giveArrestReason", 1)
|
||||
eProtect.registerBadNet("unarrestPerson", 1)
|
||||
eProtect.registerBadNet("JoinFirstSS", 1)
|
||||
eProtect.registerBadNet("bringNfreeze", 1)
|
||||
eProtect.registerBadNet("start_wd_hack", 1)
|
||||
eProtect.registerBadNet("DestroyTable", 1)
|
||||
eProtect.registerBadNet("nCTieUpStart", 1)
|
||||
eProtect.registerBadNet("IveBeenRDMed", 1)
|
||||
eProtect.registerBadNet("FIGHTCLUB_StartFight", 1)
|
||||
eProtect.registerBadNet("FIGHTCLUB_KickPlayer", 1)
|
||||
eProtect.registerBadNet("ReSpawn", 1)
|
||||
eProtect.registerBadNet("CP_Test_Results", 1)
|
||||
eProtect.registerBadNet("AcceptBailOffer", 1)
|
||||
eProtect.registerBadNet("IS_SubmitSID_C2S", 1)
|
||||
eProtect.registerBadNet("IS_GetReward_C2S", 1)
|
||||
eProtect.registerBadNet("ChangeOrgName", 1)
|
||||
eProtect.registerBadNet("DisbandOrganization", 1)
|
||||
eProtect.registerBadNet("CreateOrganization", 1)
|
||||
eProtect.registerBadNet("newTerritory", 1)
|
||||
eProtect.registerBadNet("InviteMember", 1)
|
||||
eProtect.registerBadNet("sendDuelInfo", 1)
|
||||
eProtect.registerBadNet("DoDealerDeliver", 1)
|
||||
eProtect.registerBadNet("PurchaseWeed", 1)
|
||||
eProtect.registerBadNet("guncraft_removeWorkbench", 1)
|
||||
eProtect.registerBadNet("wordenns", 1)
|
||||
eProtect.registerBadNet("userAcceptPrestige", 1)
|
||||
eProtect.registerBadNet("vj_npcspawner_sv_create", 1)
|
||||
eProtect.registerBadNet("DuelMessageReturn", 1)
|
||||
eProtect.registerBadNet("Client_To_Server_OpenEditor", 1)
|
||||
eProtect.registerBadNet("GiveSCP294Cup", 1)
|
||||
eProtect.registerBadNet("GiveArmor100", 1)
|
||||
eProtect.registerBadNet("SprintSpeedset", 1)
|
||||
eProtect.registerBadNet("ArmorButton", 1)
|
||||
eProtect.registerBadNet("HealButton", 1)
|
||||
eProtect.registerBadNet("SRequest", 1)
|
||||
eProtect.registerBadNet("ClickerForceSave", 1)
|
||||
eProtect.registerBadNet("rpi_trade_end", 1)
|
||||
eProtect.registerBadNet("NET_BailPlayer", 1)
|
||||
eProtect.registerBadNet("vj_testentity_runtextsd", 1)
|
||||
eProtect.registerBadNet("vj_fireplace_turnon2", 1)
|
||||
eProtect.registerBadNet("requestmoneyforvk", 1)
|
||||
eProtect.registerBadNet("gPrinters.sendID", 1)
|
||||
eProtect.registerBadNet("FIRE_RemoveFireTruck", 1)
|
||||
eProtect.registerBadNet("drugs_effect", 1)
|
||||
eProtect.registerBadNet("drugs_give", 1)
|
||||
eProtect.registerBadNet("NET_DoPrinterAction", 1)
|
||||
eProtect.registerBadNet("opr_withdraw", 1)
|
||||
eProtect.registerBadNet("money_clicker_withdraw", 1)
|
||||
eProtect.registerBadNet("NGII_TakeMoney", 1)
|
||||
eProtect.registerBadNet("gPrinters.retrieveMoney", 1)
|
||||
eProtect.registerBadNet("revival_revive_accept", 1)
|
||||
eProtect.registerBadNet("chname", 1)
|
||||
eProtect.registerBadNet("NewRPNameSQL", 1)
|
||||
eProtect.registerBadNet("UpdateRPUModelSQL", 1)
|
||||
eProtect.registerBadNet("SetTableTarget", 1)
|
||||
eProtect.registerBadNet("SquadGiveWeapon", 1)
|
||||
eProtect.registerBadNet("BuyUpgradesStuff", 1)
|
||||
eProtect.registerBadNet("REPAdminChangeLVL", 1)
|
||||
eProtect.registerBadNet("SendMail", 1)
|
||||
eProtect.registerBadNet("DemotePlayer", 1)
|
||||
eProtect.registerBadNet("OpenGates", 1)
|
||||
eProtect.registerBadNet("VehicleUnderglow", 1)
|
||||
eProtect.registerBadNet("Hopping_Test", 1)
|
||||
eProtect.registerBadNet("CREATE_REPORT", 1)
|
||||
eProtect.registerBadNet("CreateEntity", 1)
|
||||
eProtect.registerBadNet("FiremanLeave", 1)
|
||||
eProtect.registerBadNet("DarkRP_Defib_ForceSpawn", 1)
|
||||
eProtect.registerBadNet("Resupply", 1)
|
||||
eProtect.registerBadNet("BTTTStartVotekick", 1)
|
||||
eProtect.registerBadNet("_nonDBVMVote", 1)
|
||||
eProtect.registerBadNet("REPPurchase", 1)
|
||||
eProtect.registerBadNet("deathrag_takeitem", 1)
|
||||
eProtect.registerBadNet("FacCreate", 1)
|
||||
eProtect.registerBadNet("InformPlayer", 1)
|
||||
eProtect.registerBadNet("lockpick_sound", 1)
|
||||
eProtect.registerBadNet("SetPlayerModel", 1)
|
||||
eProtect.registerBadNet("changeToPhysgun", 1)
|
||||
eProtect.registerBadNet("VoteBanNO", 1)
|
||||
eProtect.registerBadNet("VoteKickNO", 1)
|
||||
eProtect.registerBadNet("shopguild_buyitem", 1)
|
||||
eProtect.registerBadNet("MG2.Request.GangRankings", 1)
|
||||
eProtect.registerBadNet("RequestMAPSize", 1)
|
||||
eProtect.registerBadNet("gMining.sellMineral", 1)
|
||||
eProtect.registerBadNet("ItemStoreDrop", 1)
|
||||
eProtect.registerBadNet("optarrest", 1)
|
||||
eProtect.registerBadNet("TalkIconChat", 1)
|
||||
eProtect.registerBadNet("UpdateAdvBoneSettings", 1)
|
||||
eProtect.registerBadNet("ViralsScoreboardAdmin", 1)
|
||||
eProtect.registerBadNet("PowerRoundsForcePR", 1)
|
||||
eProtect.registerBadNet("showDisguiseHUD", 1)
|
||||
eProtect.registerBadNet("withdrawMoney", 1)
|
||||
eProtect.registerBadNet("SyncPrinterButtons76561198027292625", 1)
|
||||
eProtect.registerBadNet("phone", 1)
|
||||
eProtect.registerBadNet("STLoanToServer", 1)
|
||||
eProtect.registerBadNet("TCBDealerStore", 1)
|
||||
eProtect.registerBadNet("TCBDealerSpawn", 1)
|
||||
eProtect.registerBadNet("ts_buytitle", 1)
|
||||
eProtect.registerBadNet("gMining.registerAchievement", 1)
|
||||
eProtect.registerBadNet("gPrinters.openUpgrades", 1)
|
||||
|
||||
--- Known Backdoors
|
||||
eProtect.registerBadNet("Sbox_gm_attackofnullday_key", 2)
|
||||
eProtect.registerBadNet("c", 2)
|
||||
eProtect.registerBadNet("enablevac", 2)
|
||||
eProtect.registerBadNet("ULXQUERY2", 2)
|
||||
eProtect.registerBadNet("Im_SOCool", 2)
|
||||
eProtect.registerBadNet("MoonMan", 2)
|
||||
eProtect.registerBadNet("LickMeOut", 2)
|
||||
eProtect.registerBadNet("SessionBackdoor", 2)
|
||||
eProtect.registerBadNet("OdiumBackDoor", 2)
|
||||
eProtect.registerBadNet("ULX_QUERY2", 2)
|
||||
eProtect.registerBadNet("Sbox_itemstore", 2)
|
||||
eProtect.registerBadNet("Sbox_darkrp", 2)
|
||||
eProtect.registerBadNet("Sbox_Message", 2)
|
||||
eProtect.registerBadNet("_blacksmurf", 2)
|
||||
eProtect.registerBadNet("nostrip", 2)
|
||||
eProtect.registerBadNet("Remove_Exploiters", 2)
|
||||
eProtect.registerBadNet("Sandbox_ArmDupe", 2)
|
||||
eProtect.registerBadNet("rconadmin", 2)
|
||||
eProtect.registerBadNet("jesuslebg", 2)
|
||||
eProtect.registerBadNet("disablebackdoor", 2)
|
||||
eProtect.registerBadNet("blacksmurfBackdoor", 2)
|
||||
eProtect.registerBadNet("jeveuttonrconleul", 2)
|
||||
eProtect.registerBadNet("lag_ping", 2)
|
||||
eProtect.registerBadNet("memeDoor", 2)
|
||||
eProtect.registerBadNet("DarkRP_AdminWeapons", 2)
|
||||
eProtect.registerBadNet("Fix_Keypads", 2)
|
||||
eProtect.registerBadNet("noclipcloakaesp_chat_text", 2)
|
||||
eProtect.registerBadNet("_CAC_ReadMemory", 2)
|
||||
eProtect.registerBadNet("Ulib_Message", 2)
|
||||
eProtect.registerBadNet("Ulogs_Infos", 2)
|
||||
eProtect.registerBadNet("ITEM", 2)
|
||||
eProtect.registerBadNet("nocheat", 2)
|
||||
eProtect.registerBadNet("adsp_door_length", 2)
|
||||
eProtect.registerBadNet("ξpsilon", 2)
|
||||
eProtect.registerBadNet("JQerystrip.disable", 2)
|
||||
eProtect.registerBadNet("Sandbox_GayParty", 2)
|
||||
eProtect.registerBadNet("DarkRP_UTF8", 2)
|
||||
eProtect.registerBadNet("PlayerKilledLogged", 2)
|
||||
eProtect.registerBadNet("OldNetReadData", 2)
|
||||
eProtect.registerBadNet("Backdoor", 2)
|
||||
eProtect.registerBadNet("cucked", 2)
|
||||
eProtect.registerBadNet("NoNerks", 2)
|
||||
eProtect.registerBadNet("kek", 2)
|
||||
eProtect.registerBadNet("DarkRP_Money_System", 2)
|
||||
eProtect.registerBadNet("BetStrep", 2)
|
||||
eProtect.registerBadNet("ZimbaBackdoor", 2)
|
||||
eProtect.registerBadNet("something", 2)
|
||||
eProtect.registerBadNet("random", 2)
|
||||
eProtect.registerBadNet("strip0", 2)
|
||||
eProtect.registerBadNet("fellosnake", 2)
|
||||
eProtect.registerBadNet("idk", 2)
|
||||
eProtect.registerBadNet("||||", 2)
|
||||
eProtect.registerBadNet("EnigmaIsthere", 2)
|
||||
eProtect.registerBadNet("ALTERED_CARB0N", 2)
|
||||
eProtect.registerBadNet("killserver", 2)
|
||||
eProtect.registerBadNet("fuckserver", 2)
|
||||
eProtect.registerBadNet("cvaraccess", 2)
|
||||
eProtect.registerBadNet("_Defcon", 2)
|
||||
eProtect.registerBadNet("dontforget", 2)
|
||||
eProtect.registerBadNet("aze46aez67z67z64dcv4bt", 2)
|
||||
eProtect.registerBadNet("nolag", 2)
|
||||
eProtect.registerBadNet("changename", 2)
|
||||
eProtect.registerBadNet("music", 2)
|
||||
eProtect.registerBadNet("_Defqon", 2)
|
||||
eProtect.registerBadNet("xenoexistscl", 2)
|
||||
eProtect.registerBadNet("R8", 2)
|
||||
eProtect.registerBadNet("AnalCavity", 2)
|
||||
eProtect.registerBadNet("DefqonBackdoor", 2)
|
||||
eProtect.registerBadNet("fourhead", 2)
|
||||
eProtect.registerBadNet("echangeinfo", 2)
|
||||
eProtect.registerBadNet("PlayerItemPickUp", 2)
|
||||
eProtect.registerBadNet("thefrenchenculer", 2)
|
||||
eProtect.registerBadNet("elfamosabackdoormdr", 2)
|
||||
eProtect.registerBadNet("stoppk", 2)
|
||||
eProtect.registerBadNet("noprop", 2)
|
||||
eProtect.registerBadNet("reaper", 2)
|
||||
eProtect.registerBadNet("Abcdefgh", 2)
|
||||
eProtect.registerBadNet("JSQuery.Data(Post(false))", 2)
|
||||
eProtect.registerBadNet("pjHabrp9EY", 2)
|
||||
eProtect.registerBadNet("_Raze", 2)
|
||||
eProtect.registerBadNet("88", 2)
|
||||
eProtect.registerBadNet("Dominos", 2)
|
||||
eProtect.registerBadNet("NoOdium_ReadPing", 2)
|
||||
eProtect.registerBadNet("m9k_explosionradius", 2)
|
||||
eProtect.registerBadNet("gag", 2)
|
||||
eProtect.registerBadNet("_cac_", 2)
|
||||
eProtect.registerBadNet("_Battleye_Meme_", 2)
|
||||
eProtect.registerBadNet("legrandguzmanestla", 2)
|
||||
eProtect.registerBadNet("ULogs_B", 2)
|
||||
eProtect.registerBadNet("arivia", 2)
|
||||
eProtect.registerBadNet("_Warns", 2)
|
||||
eProtect.registerBadNet("xuy", 2)
|
||||
eProtect.registerBadNet("samosatracking57", 2)
|
||||
eProtect.registerBadNet("striphelper", 2)
|
||||
eProtect.registerBadNet("m9k_explosive", 2)
|
||||
eProtect.registerBadNet("GaySploitBackdoor", 2)
|
||||
eProtect.registerBadNet("_GaySploit", 2)
|
||||
eProtect.registerBadNet("slua", 2)
|
||||
eProtect.registerBadNet("Bilboard.adverts:Spawn(false)", 2)
|
||||
eProtect.registerBadNet("BOOST_FPS", 2)
|
||||
eProtect.registerBadNet("FPP_AntiStrip", 2)
|
||||
eProtect.registerBadNet("ULX_QUERY_TEST2", 2)
|
||||
eProtect.registerBadNet("FADMIN_ANTICRASH", 2)
|
||||
eProtect.registerBadNet("ULX_ANTI_BACKDOOR", 2)
|
||||
eProtect.registerBadNet("UKT_MOMOS", 2)
|
||||
eProtect.registerBadNet("rcivluz", 2)
|
||||
eProtect.registerBadNet("SENDTEST", 2)
|
||||
eProtect.registerBadNet("MJkQswHqfZ", 2)
|
||||
eProtect.registerBadNet("INJ3v4", 2)
|
||||
eProtect.registerBadNet("_clientcvars", 2)
|
||||
eProtect.registerBadNet("_main", 2)
|
||||
eProtect.registerBadNet("GMOD_NETDBG", 2)
|
||||
eProtect.registerBadNet("thereaper", 2)
|
||||
eProtect.registerBadNet("audisquad_lua", 2)
|
||||
eProtect.registerBadNet("anticrash", 2)
|
||||
eProtect.registerBadNet("ZernaxBackdoor", 2)
|
||||
eProtect.registerBadNet("bdsm", 2)
|
||||
eProtect.registerBadNet("waoz", 2)
|
||||
eProtect.registerBadNet("stream", 2)
|
||||
eProtect.registerBadNet("adm_network", 2)
|
||||
eProtect.registerBadNet("antiexploit", 2)
|
||||
eProtect.registerBadNet("ReadPing", 2)
|
||||
eProtect.registerBadNet("berettabest", 2)
|
||||
eProtect.registerBadNet("componenttolua", 2)
|
||||
eProtect.registerBadNet("theberettabcd", 2)
|
||||
eProtect.registerBadNet("negativedlebest", 2)
|
||||
eProtect.registerBadNet("mathislebg", 2)
|
||||
eProtect.registerBadNet("SparksLeBg", 2)
|
||||
eProtect.registerBadNet("DOGE", 2)
|
||||
eProtect.registerBadNet("FPSBOOST", 2)
|
||||
eProtect.registerBadNet("N::B::P", 2)
|
||||
eProtect.registerBadNet("PDA_DRM_REQUEST_CONTENT", 2)
|
||||
eProtect.registerBadNet("shix", 2)
|
||||
eProtect.registerBadNet("Inj3", 2)
|
||||
eProtect.registerBadNet("AidsTacos", 2)
|
||||
eProtect.registerBadNet("verifiopd", 2)
|
||||
eProtect.registerBadNet("pwn_wake", 2)
|
||||
eProtect.registerBadNet("pwn_http_answer", 2)
|
||||
eProtect.registerBadNet("pwn_http_send", 2)
|
||||
eProtect.registerBadNet("The_Dankwoo", 2)
|
||||
eProtect.registerBadNet("PRDW_GET", 2)
|
||||
eProtect.registerBadNet("fancyscoreboard_leave", 2)
|
||||
eProtect.registerBadNet("DarkRP_Gamemodes", 2)
|
||||
eProtect.registerBadNet("DarkRP_Armors", 2)
|
||||
eProtect.registerBadNet("yohsambresicianatik<3", 2)
|
||||
eProtect.registerBadNet("EnigmaProject", 2)
|
||||
eProtect.registerBadNet("PlayerCheck", 2)
|
||||
eProtect.registerBadNet("Ulx_Error_88", 2)
|
||||
eProtect.registerBadNet("FAdmin_Notification_Receiver", 2)
|
||||
eProtect.registerBadNet("DarkRP_ReceiveData", 2)
|
||||
eProtect.registerBadNet("Weapon_88", 2)
|
||||
eProtect.registerBadNet("__G____CAC", 2)
|
||||
eProtect.registerBadNet("AbSoluT", 2)
|
||||
eProtect.registerBadNet("mecthack", 2)
|
||||
eProtect.registerBadNet("SetPlayerDeathCount", 2)
|
||||
eProtect.registerBadNet("awarn_remove", 2)
|
||||
eProtect.registerBadNet("fijiconn", 2)
|
||||
eProtect.registerBadNet("nw.readstream", 2)
|
||||
eProtect.registerBadNet("LuaCmd", 2)
|
||||
eProtect.registerBadNet("The_DankWhy", 2)
|
||||
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,2 +0,0 @@
|
||||
<EFBFBD>PNG
|
||||
|
||||
|
Before Width: | Height: | Size: 8 B |
@@ -1,39 +0,0 @@
|
||||
--[[
|
||||
| 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 SAM_LOADED then return end
|
||||
|
||||
return {
|
||||
--
|
||||
-- Enable MySQL/sqlite
|
||||
-- Don't touch this if you don't know what it means
|
||||
--
|
||||
MySQL = true,
|
||||
|
||||
--
|
||||
-- MySQL host/ip
|
||||
--
|
||||
Host = "144.76.235.183",
|
||||
|
||||
--
|
||||
-- MySQL username
|
||||
--
|
||||
Username = "u22_9WSilnSy53",
|
||||
|
||||
--
|
||||
-- MySQL password
|
||||
--
|
||||
Password = "@mQRtjZidJE6dOKp1fT8FzR4",
|
||||
|
||||
--
|
||||
-- MySQL database
|
||||
--
|
||||
Database = "s22_sam_polish",
|
||||
}
|
||||