--[[ | 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/ --]] ITEM.name = "Karta identyfikacyjna #00000" ITEM.model = Model("models/n7/props/n7_cid_card.mdl") ITEM.description = "Obywatelska karta identyfikacyjna przypisana do %s, CID #%s.\n\nNumer karty: %s\nOpis genetyczny:\n%s.\n\nTa karta jest własnością Administracji Miasta Kombinatu. Nielegalne posiadanie i fałszowanie tożsamości są karalne oraz będą skutkować wszczęciem postępowania przez Civil Protection. W przypadku znalezienia czyjejś karty należy niezwłocznie zwrócić ją do najbliższego oddziału Civil Protection." ITEM.category = "Combine" ITEM.iconCam = { pos = Vector(0, 0, 10), ang = Angle(90, 90, 0), fov = 45, } if (CLIENT) then function ITEM:PaintOver(item, w, h) if (item:GetData("active")) then surface.SetDrawColor(110, 255, 110, 100) surface.DrawRect(w - 14, h - 14, 8, 8) end end end function ITEM:GetName() return "Karta identyfikacyjna #" .. self:GetData("cid", "00000") end -- It's also possible to use ITEM.KeepOnDeath = true function ITEM:KeepOnDeath(client) return self:GetData("owner") == client:GetCharacter():GetID() and self:GetData("active") end function ITEM:GetDescription() return string.format(self.description, self:GetData("name", "Nobody"), self:GetData("cid", "00000"), self:GetData("cardNumber", "00-0000-0000-00"), self:GetData("geneticDesc", "N/A | N/A | N/A OCZY | N/A WŁOSY")) end local prime = 9999999787 -- prime % 4 = 3! DO NOT CHANGE EVER local offset = 100000 -- slightly larger than sqrt(prime) is ok. DO NOT CHANGE EVER local block = 100000000 local function generateCardNumber(id) id = (id + offset) % prime local cardNum = 0 for _ = 1, math.floor(id/block) do cardNum = (cardNum + (id * block) % prime) % prime end cardNum = (cardNum + (id * (id % block) % prime)) % prime if (2 * id < prime) then return cardNum else return prime - cardNum end end function ITEM:GetCredits() return self:GetData("credits", 0) end function ITEM:HasCredits(amount) return amount <= self:GetData("credits", 0) end if (SERVER) then function ITEM:SetCredits(amount) self:SetData("credits", math.floor(amount)) return true end function ITEM:GiveCredits(amount, sender, reason) if (amount < 0 and !self:HasCredits(math.abs(amount))) then return false end if (amount == 0) then return true end if (sender) then local insert = mysql:Insert("ix_cid_transactions") insert:Insert("datetime", os.time()) insert:Insert("sender_name", sender) insert:Insert("sender_cid", "00000") insert:Insert("sender_cardid", 0) insert:Insert("receiver_name", self:GetData("name", "NIEZNANY")) insert:Insert("receiver_cid", self:GetData("cid", "NIEPRAWIDŁOWY")) insert:Insert("receiver_cardid", self: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", "no reason given") end insert:Insert("pos", 0) insert:Insert("read", 1) insert:Execute() end return self:SetCredits(amount + self:GetCredits()) end function ITEM:TakeCredits(amount, receiver, reason) if (amount > 0 and !self:HasCredits(amount)) then return false end if (amount == 0) then return true end if (receiver) then local insert = mysql:Insert("ix_cid_transactions") insert:Insert("datetime", os.time()) insert:Insert("sender_name", self:GetData("name", "NIEZNANY")) insert:Insert("sender_cid", self:GetData("cid", "NIEPRAWIDŁOWY")) insert:Insert("sender_cardid", self:GetID()) insert:Insert("receiver_name", receiver) insert:Insert("receiver_cid", "00000") insert:Insert("receiver_cardid", 0) 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", "no reason given") end insert:Insert("pos", 0) insert:Insert("read", 1) insert:Execute() end return self:SetCredits(self:GetCredits() - amount) end function ITEM:OnInstanced() local cardNum = Schema:ZeroNumber(generateCardNumber(self:GetID()), 10) self:SetData("cardNumber", string.utf8sub(cardNum, 1, 2).."-"..string.utf8sub(cardNum, 3, 6).."-"..string.utf8sub(cardNum, 7, 10).. "-"..Schema:ZeroNumber(cardNum % 97, 2)) end function ITEM:TransferData(newCard, wipe) newCard:SetData("credits", self:GetData("credits", 0)) newCard:SetData("nextRationTime", self:GetData("nextRationTime", 0)) if (wipe) then self:SetData("active", false) self:SetData("credits", 0) self:SetData("nextRationTime", 0) end end function ITEM:OnRemoved() if (self:GetData("active") != false) then local ownerId = self:GetData("owner") local data = {credits = self:GetData("credits", 0), ration = self:GetData("nextRationTime", 0)} if (ix.char.loaded[ownerId]) then ix.char.loaded[ownerId]:SetIdCardBackup(data) ix.char.loaded[ownerId]:SetIdCard(nil) end local updateQuery = mysql:Update("ix_characters_data") updateQuery:Update("data", util.TableToJSON(data)) updateQuery:Where("id", ownerId) updateQuery:Where("key", "idCardBackup") updateQuery:Execute() local idCardQuery = mysql:Update("ix_characters") idCardQuery.updateList[#idCardQuery.updateList + 1] = {"`idcard`", "NULL"} idCardQuery:Where("id", ownerId) idCardQuery:Where("schema", Schema and Schema.folder or "helix") idCardQuery:Execute() self:SetData("active", false) end end function ITEM:LoadOwnerGenericData(callback, error, ...) if (!callback) then return end local arg = {...} local queryObj = mysql:Select("ix_characters_data") queryObj:Where("id", self:GetData("owner", 0)) queryObj:Where("key", "genericdata") queryObj:Select("data") queryObj:Callback(function(result) if (!istable(result) or !result[1]) then if (error) then error(self, unpack(arg)) end else callback(self, util.JSONToTable(result[1].data or ""), unpack(arg)) end end) queryObj:Execute() end netstream.Hook("ixSetIDCardCredits", function(client, itemID, amount) ix.item.instances[itemID]:SetCredits(amount) end) end ITEM.functions.SetCredits = { name = "Ustaw Kredyty", icon = "icon16/money_add.png", OnClick = function(itemTable) local client = itemTable.player Derma_StringRequest("Ustaw Kredyty", "Na jaką wartość chcesz ustawić kredyty?", itemTable:GetData("credits", 0), function(text) local amount = tonumber(text) if (amount and amount >= 0) then netstream.Start("ixSetIDCardCredits", itemTable:GetID(), math.floor(amount)) else client:NotifyLocalized("numNotValid") end end) end, OnRun = function(itemTable) return false end, OnCanRun = function(itemTable) if (IsValid(itemTable.entity)) then return false end if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Set Credits")) then return false end if (!itemTable:GetData("active", false)) then return false end return true end } ITEM.functions.insert = { name = "Włóż CID", icon = "icon16/add.png", OnRun = function(itemTable) local client = itemTable.player local ent = client:GetEyeTrace().Entity if (!ent.CIDInsert) or client:EyePos():DistToSqr(ent:GetPos()) > 62500 then return false end local bSuccess, error = itemTable:Transfer(nil, nil, nil, client) if (!bSuccess and isstring(error)) then client:NotifyLocalized(error) return false else client:EmitSound("npc/zombie/foot_slide" .. math.random(1, 3) .. ".wav", 75, math.random(90, 120), 1) end if bSuccess and IsEntity(bSuccess) then ent:CIDInsert(bSuccess) end return false end, OnCanRun = function(itemTable) local client = itemTable.player if (!client:GetEyeTrace().Entity.CIDInsert) then return false end if (!itemTable:GetData("active", false)) then return false end return true end }