mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
389
gamemodes/darkrp/plugins/cid/sv_plugin.lua
Normal file
389
gamemodes/darkrp/plugins/cid/sv_plugin.lua
Normal file
@@ -0,0 +1,389 @@
|
||||
--[[
|
||||
| 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 ix = ix
|
||||
local string = string
|
||||
local os = os
|
||||
local CurTime = CurTime
|
||||
local IsValid = IsValid
|
||||
local netstream = netstream
|
||||
|
||||
local PLUGIN = PLUGIN
|
||||
|
||||
util.AddNetworkString("changeLockAccess")
|
||||
util.AddNetworkString("changeLockAccessCmru")
|
||||
|
||||
ix.log.AddType("creditIDCardSetCredits", function(client, itemId, amount)
|
||||
return string.format("%s a défini les crédits le crédits de #%d à %d.", client:SteamName(), itemId, amount)
|
||||
end)
|
||||
|
||||
-- CID GENERATION
|
||||
local prime = 99787 -- prime % 4 = 3! DO NOT CHANGE EVER
|
||||
local offset = 320 -- slightly larger than sqrt(prime) is ok. DO NOT CHANGE EVER
|
||||
local block = 1000
|
||||
function PLUGIN:GenerateCid(id)
|
||||
id = (id + offset) % prime
|
||||
|
||||
local cid = 0
|
||||
|
||||
for _ = 1, math.floor(id/block) do
|
||||
cid = (cid + (id * block) % prime) % prime
|
||||
end
|
||||
|
||||
cid = (cid + (id * (id % block) % prime)) % prime
|
||||
|
||||
if (2 * id < prime) then
|
||||
return Schema:ZeroNumber(cid, 5)
|
||||
else
|
||||
return Schema:ZeroNumber(prime - cid, 5)
|
||||
end
|
||||
end
|
||||
|
||||
ix.log.AddType("creditTransaction", function(client, senderCard, receiverCard, amount, posDevice, reason, senderCID, receiverCID)
|
||||
local senderCardCid
|
||||
local receiverCardCid
|
||||
|
||||
if !senderCID then
|
||||
senderCardCid = senderCard:GetData("cid", "INVALIDE")
|
||||
else
|
||||
senderCardCid = (tostring(senderCard:GetData("cid", "00000")) == "00000" and senderCID or senderCard:GetData("cid", "INVALIDE"))
|
||||
end
|
||||
|
||||
if !receiverCID then
|
||||
receiverCardCid = receiverCard:GetData("cid", "INVALIDE")
|
||||
else
|
||||
receiverCardCid = (tostring(receiverCard:GetData("cid", "00000") ) == "00000" and receiverCID or receiverCard:GetData("cid", "INVALIDE"))
|
||||
end
|
||||
|
||||
local senderName = senderCard:GetData("name", "INCONNU")
|
||||
|
||||
if (IsValid(client) and client:HasActiveCombineMask()) then
|
||||
senderName = "IDENTITÉ CONFIDENTIELLE"
|
||||
senderCardCid = "CONFIDENTIELLE"
|
||||
end
|
||||
|
||||
local insert = mysql:Insert("ix_cid_transactions")
|
||||
insert:Insert("datetime", os.time())
|
||||
insert:Insert("sender_name", senderName)
|
||||
insert:Insert("sender_cid", senderCardCid)
|
||||
insert:Insert("sender_cardid", senderCard:GetID())
|
||||
insert:Insert("receiver_name", receiverCard:GetData("name", "INCONNU"))
|
||||
insert:Insert("receiver_cid", receiverCardCid)
|
||||
insert:Insert("receiver_cardid", receiverCard:GetID())
|
||||
insert:Insert("amount", amount)
|
||||
if (reason and reason != "") then
|
||||
insert:Insert("reason", string.len(reason) > 250 and string.sub(reason, 1, 250) or reason)
|
||||
else
|
||||
insert:Insert("reason", "aucune raison donnée")
|
||||
end
|
||||
|
||||
if (posDevice) then
|
||||
insert:Insert("pos", posDevice:GetID())
|
||||
insert:Insert("read", 0)
|
||||
insert:Callback(function(result, _, insertID)
|
||||
posDevice:AddTransactionID(insertID)
|
||||
end)
|
||||
else
|
||||
insert:Insert("pos", 0)
|
||||
insert:Insert("read", 1)
|
||||
end
|
||||
insert:Execute()
|
||||
|
||||
return string.format("%s (CID : %s - Objet : %s) a envoyé %d crédits à %s (CID : %s - Objet : %s) via un %s.",
|
||||
senderCard:GetData("name"),
|
||||
senderCardCid,
|
||||
senderCard:GetID(),
|
||||
amount,
|
||||
receiverCard:GetData("name"),
|
||||
receiverCardCid,
|
||||
receiverCard:GetID(),
|
||||
posDevice and string.format("Terminal POS pour '%s'", reason) or "Terminal"
|
||||
)
|
||||
end)
|
||||
|
||||
function PLUGIN:DatabaseConnected()
|
||||
local query = mysql:Create("ix_cid_transactions")
|
||||
query:Create("id", "INT UNSIGNED NOT NULL AUTO_INCREMENT")
|
||||
query:Create("datetime", "INT NOT NULL")
|
||||
query:Create("sender_name", "VARCHAR(255) NOT NULL")
|
||||
query:Create("sender_cid", "VARCHAR(255) NOT NULL")
|
||||
query:Create("sender_cardid", "INT NOT NULL")
|
||||
query:Create("receiver_name", "VARCHAR(255) NOT NULL")
|
||||
query:Create("receiver_cid", "VARCHAR(255) NOT NULL")
|
||||
query:Create("receiver_cardid", "INT NOT NULL")
|
||||
query:Create("amount", "INT NOT NULL")
|
||||
query:Create("pos", "INT NOT NULL")
|
||||
query:Create("read", "TINYINT(1) NOT NULL")
|
||||
query:Create("reason", "VARCHAR(255) DEFAULT NULL")
|
||||
query:PrimaryKey("id")
|
||||
query:Execute()
|
||||
end
|
||||
|
||||
function PLUGIN:SelectTransactions(client, key, value, maxAge, bNoIncludeRead, customCallback)
|
||||
if (client.ixNextTransactionSelect and client.ixNextTransactionSelect > CurTime()) then
|
||||
client.ixNextTransactionSelect = CurTime() + 1
|
||||
return
|
||||
end
|
||||
client.ixNextTransactionSelect = CurTime() + 1
|
||||
|
||||
maxAge = maxAge or 7
|
||||
local query = mysql:Select("ix_cid_transactions")
|
||||
if (key == "cid") then
|
||||
query.whereList[#query.whereList + 1] = "(`sender_cid` = '"..query:Escape(value).."' OR `receiver_cid` = '"..query:Escape(value).."')"
|
||||
else
|
||||
query:Where(key, value)
|
||||
end
|
||||
query:WhereGTE("datetime", os.time() - maxAge * 24 * 3600)
|
||||
if (bNoIncludeRead) then
|
||||
query:Where("read", 0)
|
||||
end
|
||||
query:Select("id")
|
||||
query:Select("datetime")
|
||||
query:Select("sender_name")
|
||||
query:Select("sender_cid")
|
||||
query:Select("receiver_name")
|
||||
query:Select("receiver_cid")
|
||||
query:Select("amount")
|
||||
query:Select("reason")
|
||||
if (key == "pos") then
|
||||
query:Select("pos")
|
||||
query:Select("read")
|
||||
end
|
||||
query:Callback(function(result)
|
||||
if (!IsValid(client)) then return end
|
||||
if customCallback then
|
||||
customCallback(result)
|
||||
return
|
||||
end
|
||||
|
||||
netstream.Start(client, "ixCreditTransactionLog", result, key == "pos" and !bNoIncludeRead)
|
||||
end)
|
||||
query:OrderByDesc("datetime")
|
||||
query:Execute()
|
||||
end
|
||||
|
||||
function PLUGIN:MarkTransactionsRead(id, bAllFromPos, bRead, pos)
|
||||
local query = mysql:Update("ix_cid_transactions")
|
||||
if (bAllFromPos) then
|
||||
query:Where("pos", id)
|
||||
else
|
||||
query:Where("pos", pos)
|
||||
query:Where("id", id)
|
||||
end
|
||||
query:Update("read", bRead and 1 or 0)
|
||||
query:Execute()
|
||||
end
|
||||
|
||||
netstream.Hook("ixTransactionSetRead", function(client, id, bAllFromPos, bRead, pos)
|
||||
local inventory = client:GetCharacter():GetInventory()
|
||||
local item = inventory:GetItemByID(pos or id)
|
||||
if (!item or (item:GetData("cardIDLock") and !inventory:GetItemByID(item:GetData("cardID")))) then
|
||||
return
|
||||
end
|
||||
|
||||
PLUGIN:MarkTransactionsRead(id, bAllFromPos, bRead, pos)
|
||||
end)
|
||||
|
||||
function PLUGIN:CreateIDCard(character, inventory, credits)
|
||||
local genericdata = character:GetGenericdata()
|
||||
local age, height, eyeColor = character:GetAge(), character:GetHeight(), character:GetEyeColor()
|
||||
local data = {
|
||||
owner = character:GetID(),
|
||||
cid = character:GetCid(),
|
||||
name = character:GetName(),
|
||||
geneticDesc = age.." | "..height.." | YEUX "..eyeColor.."",
|
||||
active = true,
|
||||
credits = credits or 0
|
||||
}
|
||||
|
||||
if (character:GetFaction() == FACTION_VORT) then
|
||||
data.geneticDesc = age.." | "..height
|
||||
|
||||
if (istable(genericdata)) then
|
||||
genericdata.cid = data["cid"]
|
||||
character:SetGenericdata(genericdata)
|
||||
character:Save()
|
||||
end
|
||||
end
|
||||
|
||||
local success, error = inventory:Add("id_card", 1, data)
|
||||
|
||||
if (!success) then
|
||||
character:GetPlayer():NotifyLocalized(error or "unknownError")
|
||||
end
|
||||
end
|
||||
|
||||
-- Generic transaction stuff
|
||||
local function DoCreditTransaction(recipientCard, sendingCard, transactionAmount, sending, recipient, bPosDevice, reason, senderCid, receiverCid)
|
||||
if (!recipientCard or !sendingCard) then
|
||||
if (IsValid(sending)) then sending:NotifyLocalized("posError") end
|
||||
if (IsValid(recipient)) then recipient:NotifyLocalized("posError") end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
local amount = transactionAmount
|
||||
local senderCard = sendingCard
|
||||
local receiverCard = recipientCard
|
||||
local receiver = recipient
|
||||
local sender = sending
|
||||
local amountPercent = amount / 100
|
||||
local vat = ix.config.Get("transactionVatPercent", 2)
|
||||
vat = math.Round(amountPercent * vat)
|
||||
|
||||
if (amount < 0) then
|
||||
amount = amount * -1
|
||||
|
||||
senderCard = recipientCard
|
||||
receiverCard = sendingCard
|
||||
sender = recipient
|
||||
receiver = sending
|
||||
end
|
||||
|
||||
if (senderCard:HasCredits(amount + vat)) then
|
||||
senderCard:TakeCredits(amount + vat)
|
||||
ix.city.main:AddCredits(vat)
|
||||
receiverCard:GiveCredits(amount)
|
||||
|
||||
if (IsValid(sender)) then
|
||||
sender:NotifyLocalized("posTransactionSuccess")
|
||||
|
||||
netstream.Start(sender, "TerminalUpdateCredits", amount)
|
||||
end
|
||||
|
||||
if (IsValid(receiver)) then receiver:NotifyLocalized("posTransactionSuccess") end
|
||||
ix.log.Add(sending, "creditTransaction", sendingCard, recipientCard, transactionAmount, bPosDevice, reason, senderCid, receiverCid)
|
||||
else
|
||||
if (IsValid(sender)) then sender:NotifyLocalized("transactionNoMoney") end
|
||||
if (IsValid(receiver)) then receiver:NotifyLocalized("transactionNoMoney") end
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:CreditTransaction(receiverCardID, senderCardID, amount, sender, receiver, bPosDevice, reason, senderCid, receiverCid)
|
||||
senderCid = senderCid or false
|
||||
receiverCid = receiverCid or false
|
||||
|
||||
if (ix.config.Get("creditsNoConnection")) then
|
||||
if (IsValid(sender)) then sender:NotifyLocalized("errorNoConnection") end
|
||||
if (IsValid(receiver)) then receiver:NotifyLocalized("errorNoConnection") end
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
if (!receiverCardID or !senderCardID) then
|
||||
if (IsValid(sender)) then sender:NotifyLocalized("posError") end
|
||||
if (IsValid(receiver)) then receiver:NotifyLocalized("posError") end
|
||||
return
|
||||
end
|
||||
|
||||
if (!ix.item.instances[receiverCardID]) then
|
||||
ix.item.LoadItemByID(receiverCardID, nil, function(receiverCard)
|
||||
if (ix.item.instances[senderCardID]) then
|
||||
DoCreditTransaction(receiverCard, ix.item.instances[senderCardID], amount, sender, receiver, bPosDevice, reason, senderCid, receiverCid)
|
||||
else
|
||||
ix.item.LoadItemByID(senderCardID, function(senderCard)
|
||||
DoCreditTransaction(receiverCard, senderCard, amount, sender, receiver, bPosDevice, reason, senderCid, receiverCid)
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if (!ix.item.instances[senderCardID]) then
|
||||
ix.item.LoadItemByID(senderCardID, function(senderCard)
|
||||
DoCreditTransaction(ix.item.instances[receiverCardID], ix.item.instances[senderCardID], amount, sender, receiver, bPosDevice, reason, senderCid, receiverCid)
|
||||
end)
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
DoCreditTransaction(ix.item.instances[receiverCardID], ix.item.instances[senderCardID], amount, sender, receiver, bPosDevice, reason, senderCid, receiverCid)
|
||||
end
|
||||
|
||||
-- CHAR funcs
|
||||
do
|
||||
local CHAR = ix.meta.character
|
||||
|
||||
function CHAR:CreateIDCard(credits)
|
||||
PLUGIN:CreateIDCard(self, self:GetInventory(), credits)
|
||||
end
|
||||
|
||||
function CHAR:GetCredits()
|
||||
local itemID = self:GetIdCard()
|
||||
if (!itemID or !ix.item.instances[itemID]) then
|
||||
return 0
|
||||
end
|
||||
|
||||
return ix.item.instances[itemID]:GetCredits()
|
||||
end
|
||||
|
||||
function CHAR:HasCredits(amount)
|
||||
local itemID = self:GetIdCard()
|
||||
if (!itemID or !ix.item.instances[itemID]) then
|
||||
return false
|
||||
end
|
||||
|
||||
return amount <= ix.item.instances[itemID]:GetCredits()
|
||||
end
|
||||
|
||||
function CHAR:SetCredits(amount)
|
||||
local itemID = self:GetIdCard()
|
||||
if (!itemID or !ix.item.instances[itemID]) then
|
||||
return false
|
||||
end
|
||||
|
||||
ix.item.instances[itemID]:SetCredits(amount)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function CHAR:GiveCredits(amount, sender, reason)
|
||||
local itemID = self:GetIdCard()
|
||||
if (!itemID or !ix.item.instances[itemID]) then
|
||||
return false
|
||||
end
|
||||
|
||||
return ix.item.instances[itemID]:GiveCredits(amount, sender, reason)
|
||||
end
|
||||
|
||||
function CHAR:TakeCredits(amount, receiver, reason)
|
||||
local itemID = self:GetIdCard()
|
||||
if (!itemID or !ix.item.instances[itemID]) then
|
||||
return false
|
||||
end
|
||||
|
||||
return ix.item.instances[itemID]:TakeCredits(amount, receiver, reason)
|
||||
end
|
||||
end
|
||||
|
||||
local playerMeta = FindMetaTable("Player")
|
||||
|
||||
function playerMeta:SelectCIDCard(onSuccess, onFail)
|
||||
local items = self:GetCharacter():GetInventory():GetItemsByUniqueID("id_card")
|
||||
local count = table.Count(items)
|
||||
|
||||
if (count == 1) then
|
||||
onSuccess(items[1])
|
||||
elseif (count == 0) then
|
||||
if (onFail) then
|
||||
onFail()
|
||||
end
|
||||
else
|
||||
self.ixSelectCIDSuccess = onSuccess
|
||||
|
||||
if (onFail) then
|
||||
self.ixSelectCIDFail = onFail
|
||||
end
|
||||
|
||||
netstream.Start(self, "ixSelectCID", isfunction(onFail))
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user