Files
wnsrc/gamemodes/darkrp/plugins/containerlocks/sv_plugin.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

292 lines
7.9 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
| 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 netstream = netstream
local IsValid = IsValid
local ix = ix
local PLUGIN = PLUGIN
util.AddNetworkString("ixDoorPassword")
ix.log.AddType("containerlockSetOwner", function(client, inventoryId, ownerSteamID)
return string.format("%s has changed the container's %s owner '%s'.", client:Name(), inventoryId, ownerSteamID)
end)
ix.log.AddType("doorSetLock", function(client, doorEnt)
return string.format("%s has added a lock to a door. MapcreationID: %s, vector position: '%s'", client:Name(), doorEnt:MapCreationID(), doorEnt:GetPos())
end)
function PLUGIN:SetContainerPassword(client, entity, bShouldHaveLock, lockEntityID)
entity.shouldHaveLock = true
netstream.Start(client, "LockSetContainerPassword", entity, bShouldHaveLock, lockEntityID)
end
netstream.Hook("LockSetContainerPassword", function(client, entity, password, lockEntityID)
if (!IsValid(entity)) then return end
if !entity.Sessions and !entity:IsDoor() then
entity.Sessions = {}
end
if !entity.shouldHaveLock then
return false
end
local lockEntity = lockEntityID and Entity(lockEntityID)
if (password:utf8len() != 0) then
if entity:IsDoor() then
if IsValid(lockEntity) then
lockEntity.door = entity
lockEntity.password = password
lockEntity:SetPassword(password)
if client:GetCharacter():GetGroup() then
lockEntity.group = client:GetCharacter():GetGroup():GetID()
end
entity:Fire("Lock")
entity:Fire("Close")
entity.locked = lockEntity
ix.saveEnts:SaveEntity(lockEntity)
local doorPartner = entity:GetDoorPartner()
if (IsValid(doorPartner)) then
doorPartner:Fire("Lock")
doorPartner:Fire("Close")
end
entity:EmitSound("doors/door_latch3.wav")
end
ix.log.Add(client, "doorSetLock", entity, password:utf8len() != 0)
else
if (entity:GetClass() != "ix_wncontainer") then
entity:SetLocked(true)
entity.password = password
if client:GetCharacter():GetGroup() then
entity.group = client:GetCharacter():GetGroup():GetID()
end
end
entity:SetPassword(password)
ix.saveEnts:SaveEntity(entity)
local name = entity:GetDisplayName()
local inventory = entity:GetInventory()
ix.log.Add(client, "containerPassword", name, inventory:GetID(), password:utf8len() != 0)
end
client:NotifyLocalized("containerPassword", password)
else
client:GetCharacter():GetInventory():Add("cont_lock_t1")
if IsValid(lockEntity) then
lockEntity:Remove()
end
client:NotifyLocalized("You did not set a valid password!")
end
entity.shouldHaveLock = false
end)
netstream.Hook("LockOnCancel", function(client, entity)
if !entity.shouldHaveLock then
return false
end
client:GetCharacter():GetInventory():Add("cont_lock_t1")
entity:GetChildren()[1]:Remove()
entity.shouldHaveLock = false
end)
function PLUGIN:PlayerUseDoor(client, door)
if (!IsValid(client)) then return end
local doorPartner = door:GetDoorPartner()
local shouldUseDoorPartner = false
if !door.locked or door.locked and !IsValid(door.locked) then
if !doorPartner then return end
if !doorPartner.locked or doorPartner.locked and !IsValid(doorPartner.locked) then
return
end
shouldUseDoorPartner = true
end
if door.locked and !door.locked.password then
if !doorPartner then return end
if !doorPartner.locked.password then
return
end
shouldUseDoorPartner = true
end
if !door.GetSaveTable or door.GetSaveTable and !door:GetSaveTable() then
if !doorPartner then return end
if !doorPartner.GetSaveTable or doorPartner.GetSaveTable and !doorPartner:GetSaveTable() then
return
end
shouldUseDoorPartner = true
end
if !door:GetSaveTable()["m_bLocked"] then
if !doorPartner then return end
if !doorPartner:GetSaveTable()["m_bLocked"] then
return
end
shouldUseDoorPartner = true
end
if (door.Sessions and door.Sessions[client:SteamID()]) then
door:Fire("Unlock")
door.Sessions[client:SteamID()] = true
if (IsValid(doorPartner)) then
doorPartner:Fire("Unlock")
doorPartner.Sessions = doorPartner.Sessions or {}
doorPartner.Sessions[client:SteamID()] = true
end
door:EmitSound("doors/latchunlocked1.wav")
return
end
net.Start("ixDoorPassword")
net.WriteEntity(shouldUseDoorPartner and doorPartner or door)
net.Send(client)
end
net.Receive("ixDoorPassword", function(length, client)
if ((client.ixNextContainerPassword or 0) > RealTime()) then
client:Notify("Henüz başka bir parola denemesi yapamazsınız. Lütfen birkaç saniye bekleyin!")
return
end
if (!playerPasswordAttempts) then
playerPasswordAttempts = {}
end
if (!playerPasswordAttempts[client:SteamID()]) then
playerPasswordAttempts[client:SteamID()] = 1
elseif (playerPasswordAttempts[client:SteamID()] >= 10) then
client:Notify("Çok fazla yanlış şifre denemesi yaptınız!")
return
end
local entity = net.ReadEntity()
if !entity.locked or (entity.locked and !IsValid(entity.locked)) then return end
if !entity.locked.password then return end
local password = net.ReadString()
local dist = entity:GetPos():DistToSqr(client:GetPos())
if (dist < 16384 and password) then
if (entity.locked.password and entity.locked.password == password) then
entity:Fire("Unlock")
entity.Sessions = entity.Sessions or {}
entity.Sessions[client:SteamID()] = true
local doorPartner = entity:GetDoorPartner()
if (IsValid(doorPartner)) then
doorPartner:Fire("Unlock")
doorPartner.Sessions = doorPartner.Sessions or {}
doorPartner.Sessions[client:SteamID()] = true
end
entity:EmitSound("doors/latchunlocked1.wav")
client:Notify("Kapının kilidini açtınız.")
else
client:NotifyLocalized("wrongPassword")
playerPasswordAttempts[client:SteamID()] = playerPasswordAttempts[client:SteamID()] + 1
end
end
client.ixNextContainerPassword = RealTime() + 5
end)
function PLUGIN:RegisterSaveEnts()
ix.saveEnts:RegisterEntity("ix_containerlock", true, true, true, {
OnSave = function(entity, data) --OnSave
data.door = entity.door:MapCreationID()
data.password = entity.password
data.owner = entity:GetNetVar("owner")
data.group = entity.group
end,
OnRestore = function(entity, data) --OnRestore
local door = ents.GetMapCreatedEntity(data.door)
door.locked = entity
entity.door = door
entity:SetParent(door)
entity:SetNetVar("owner", data.owner)
entity.password = data.password
entity:SetPassword(data.password)
entity.group = data.group
door:Fire("Lock", true)
door:Fire("Close")
local doorPartner = door:GetDoorPartner()
if (IsValid(doorPartner)) then
doorPartner:Fire("Lock")
doorPartner:Fire("Close")
end
end,
ShouldSave = function(entity) --ShouldSave
return IsValid(entity.door)
end,
ShouldRestore = function(data) --ShouldRestore
local door = ents.GetMapCreatedEntity(data.door)
return IsValid(door) and door:IsDoor()
end
})
end
function PLUGIN:PrintDateSinceOnline(client, steamidNot64)
if !steamidNot64 then return end
local steamid64 = util.SteamIDTo64( steamidNot64 )
if !steamid64 or steamid64 and steamid64 == "" then return end
local query = mysql:Select("ix_players")
query:Select("steamid")
query:Select("last_join_time")
query:Select("play_time")
query:Select("steam_name")
query:Where("steamid", steamid64)
query:Limit(1)
query:Callback(function(result)
if (!result or (result and !istable(result)) or (istable(result) and #result == 0)) then
client:Notify("Oyuncu veritabanında bulunamadı!")
return
end
local playTime = math.Round(result[1].play_time / 3600, 1)
client:ChatPrint(result[1].steam_name .. " (" .. steamidNot64 .. "), was online " .. os.date("%x %X", result[1].last_join_time) .. ". Total play time: " .. playTime .. " hours.")
end)
query:Execute()
end