--[[ | 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 = "#00000 Kimlik Kartı" ITEM.model = Model("models/n7/props/n7_cid_card.mdl") ITEM.description = "Vatandaş kimlik kartı, %s kişisine atanmış, CID #%s.\n\nKart Numarası: %s\nGenetik açıklama:\n%s.\n\nBu kart Combine Sivil Yönetimi'nin mülkiyetindedir. Yasak sahiplik ve kimlik sahtekarlığı yasa tarafından cezalandırılır ve Sivil Koruma tarafından dava edilir. Bulunursa, lütfen bu kartı derhal en yakın Sivil Koruma ekibine teslim edin." 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 "#" .. self:GetData("cid", "00000") .. " Kimlik Kartı" 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 EYES | N/A HAIR")) 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", "UNKNOWN")) insert:Insert("receiver_cid", self:GetData("cid", "INVALID")) 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", "UNKNOWN")) insert:Insert("sender_cid", self:GetData("cid", "INVALID")) 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 = "Set Credits", icon = "icon16/money_add.png", OnClick = function(itemTable) local client = itemTable.player Derma_StringRequest("Set Credits", "What do you want to set the credits to?", 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 = "Insert 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 }