Files
wnsrc/gamemodes/helix/plugins/bastion/sv_hooks.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

193 lines
5.5 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local timer = timer
local pairs = pairs
local hook = hook
local CurTime = CurTime
local player = player
local ipairs = ipairs
local ix = ix
local IsValid = IsValid
local PLUGIN = PLUGIN
PLUGIN.disconnects = PLUGIN.disconnects or {}
PLUGIN.takeCounter = {}
timer.Create("ixBastionAntiTakeSpam", 1, 0, function()
for client, amount in pairs(PLUGIN.takeCounter) do
if (amount < 10) then continue end
if (!IsValid(client)) then continue end
for _, admin in ipairs(player.GetAll()) do
if (admin:IsSuperAdmin()) then
admin:NotifyLocalized("bastionItemTakeKick", client:Name())
end
end
client:Kick("Item take spam")
end
PLUGIN.takeCounter = {}
end)
function PLUGIN:CanPlayerInteractItem(client, action, item, data)
if (action == "take") then
if (self.takeCounter[client] and self.takeCounter[client] >= 5) then
if (self.takeCounter[client] == 5) then
for _, v in ipairs(player.GetAll()) do
if (v:IsSuperAdmin()) then
v:NotifyLocalized("bastionItemTakeWarn", client:Name())
end
end
client:NotifyLocalized("bastionTakingItemsTooQuickly")
end
self.takeCounter[client] = self.takeCounter[client] + 1
return false
end
elseif (action == "drop" and client.ixAntiItemSpam and client.ixAntiItemSpam > CurTime()) then
return false
end
end
function PLUGIN:PlayerInteractItem(client, action, item)
if (action == "take") then
self.takeCounter[client] = (self.takeCounter[client] or 0) + 1
end
end
PLUGIN.itemSpawns = {}
function PLUGIN:OnItemSpawned(entity)
if (IsValid(self.itemSpawns[entity.ixItemID])) then
if (self.itemSpawns[entity.ixItemID].ixItemID != entity.ixItemID) then
return -- just in case
end
--Now we are trying to spawn an item which already has an entity!
--Check if it is the same person, in case of weird behaviour
if (entity.ixSteamID == self.itemSpawns[entity.ixItemID]) then
local client = player.GetBySteamID(entity.ixSteamID)
if ((client.ixAntiItemSpam or 0) > CurTime()) then
for _, v in ipairs(player.GetAll()) do
if (v:IsSuperAdmin()) then
v:NotifyLocalized("bastionItemDropSpamKick", client:Name())
end
end
client:Kick("Item drop spam")
else
client.ixAntiItemSpam = CurTime() + 10
for _, v in ipairs(player.GetAll()) do
if (v:IsSuperAdmin()) then
v:NotifyLocalized("bastionItemDropSpamWarn", client:Name())
end
end
client:NotifyLocalized("bastionItemDropTooQuick")
end
end
self.itemSpawns[entity.ixItemID]:Remove()
self.itemSpawns[entity.ixItemID] = entity
else
self.itemSpawns[entity.ixItemID] = entity
end
end
function PLUGIN:CanPlayerCreateCharacter(client)
if (client.ixNextCharCreate and (client.ixNextCharCreate + ix.config.Get("charCreateInterval") * 60) > CurTime()) then
return false, "charCreateTooFast", ix.config.Get("charCreateInterval")
end
end
function PLUGIN:OnCharacterCreated(client)
if (!client:IsAdmin()) then
client.ixNextCharCreate = CurTime()
end
end
function PLUGIN:PlayerSpawnedProp(client, model, entity)
entity.ownerCharacter = client:GetName()
entity.ownerName = client:SteamName()
entity.ownerSteamID = client:SteamID()
end
function PLUGIN:OnPlayerHitGround(client, inWater, onFloater, speed)
local currentVelocity = client:GetVelocity()
client:SetVelocity(-Vector(currentVelocity.x, currentVelocity.y, 0))
end
function PLUGIN:PlayerInitialSpawn(client)
local receivers
if (!ix.config.Get("showConnectMessages", true)) then
receivers = {}
for _, ply in ipairs(player.GetAll()) do
if (ply:IsAdmin()) then
receivers[#receivers + 1] = ply
end
end
end
-- Give some time for the player's data to be loaded, just in case.
timer.Simple(1, function()
ix.chat.Send(nil, "new_connect", client:SteamName(), false, receivers)
end)
end
function PLUGIN:PlayerDisconnected(client)
local receivers
self.disconnects[client:SteamID64()] = {time = os.time(), charID = client:GetCharacter() and client:GetCharacter():GetID()}
if (!ix.config.Get("showDisconnectMessages", true)) then
receivers = {}
for _, ply in ipairs(player.GetAll()) do
if (ply:IsAdmin()) then
receivers[#receivers + 1] = ply
end
end
end
ix.chat.Send(nil, "new_disconnect", client:SteamName(), false, receivers)
end
function PLUGIN:PlayerLoadedCharacter(client, character, lastChar)
if (self.disconnects[client:SteamID64()]) then
local info = self.disconnects[client:SteamID64()]
if (info.timer) then
timer.Remove(info.timer)
if (IsValid(info.bannedBy)) then
if (info.charID) then
if (character:GetID() == info.charID) then
info.bannedBy:Notify(client:SteamName().." has reconnected and is back on their character "..character:GetName()..".")
end
else
info.bannedBy:Notify(client:SteamName().." has reconnected on a different character '"..character:GetName().."'.")
end
end
end
end
end
function PLUGIN:PlayerDeath(client, inflictor, attacker)
if (!client:GetCharacter()) then return end
ix.chat.Send(client, "bastionPlayerDeath", client:GetName() .. " (" .. client:SteamName() .. ") has died at " .. (client.ixArea and client.ixArea != "" and client.ixArea or "an Uncategorized Location") .. ".")
end
hook.Add("SAM.RanCommand", "BastionSamCommandLogs", function(client, cmd_name, args, cmd)
ix.log.Add(client, "bastionSamCommand", cmd_name, args, cmd)
end)