This commit is contained in:
lifestorm
2024-08-04 22:55:00 +03:00
parent 8064ba84d8
commit 73479cff9e
7338 changed files with 1718883 additions and 14 deletions

View File

@@ -0,0 +1,106 @@
--[[
| 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 = "Carte UCMR"
ITEM.model = Model("models/sky/cmuid.mdl")
ITEM.description = "Une carte pour l'UCMR."
ITEM.category = "Combine"
ITEM.skin = 3
ITEM.iconCam = {
pos = Vector(0, 0, 10),
ang = Angle(90, 90, 0),
fov = 45,
}
function ITEM:GetName()
local accessLevel = self:GetData("accessLevel", 1)
return "CMRU Level " .. accessLevel .. " Access Keycard"
end
function ITEM:GetDescription()
local idCard = ix.item.instances[self:GetData("cardID")]
return idCard and string.format(self.description.."\n\nCurrently bound to identity card #%s.", idCard:GetData("cardNumber")) or
(self:GetData("cardID") and self.description.."\n\nCurrently bound." or self.description)
end
ITEM.functions.Bind = {
name = "Bind ID Card",
icon = "icon16/vcard_edit.png",
OnClick = function(itemTable)
local cards = {}
for _, v in pairs(LocalPlayer():GetCharacter():GetInventory():GetItemsByUniqueID("id_card")) do
table.insert(cards, {
text = v:GetName(),
value = v
})
end
local cardsCount = table.Count(cards)
if (cardsCount > 1) then
Derma_Select("Bind ID Card to CMRU Card", "Please select a ID card to bind to this CMRU Card:",
cards, "Select ID card",
"Confirm Operation", function(value, name)
netstream.Start("ixBindCMRUCard", itemTable:GetID(), value:GetID())
end, "Cancel")
elseif (cardsCount == 1) then
Derma_Query("Are you sure you wish to bind your ID to this CMRU Card?", "Bind ID Card to CMRU Card",
"Confirm Operation", function()
netstream.Start("ixBindCMRUCard", itemTable:GetID(), cards[1].value:GetID())
end, "Cancel")
else
LocalPlayer():NotifyLocalized("You do not have ID card to bind to this CMRU Card.")
end
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then
return false
end
if (!IsValid(itemTable.player)) then
return false
end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!inventory:HasItem("id_card")) then
return false
end
if (itemTable:GetData("cardID")) then
return false
end
return true
end
}
ITEM.functions.SetAccessLevel = {
name = "Toggle Card Access Level",
icon = "icon16/vcard_add.png",
OnRun = function(itemTable)
local client = itemTable.player
local accessLevel = itemTable:GetData("accessLevel", 1)
accessLevel = accessLevel != 5 and accessLevel + 1 or 1
itemTable:SetData("accessLevel", accessLevel)
client:NotifyLocalized("You have set this card's Access Level to Access Level " .. accessLevel .. ".")
return false
end,
OnCanRun = function(itemTable)
return (!IsValid(itemTable.entity) and IsValid(itemTable.player) and (itemTable.player:Team() == FACTION_ADMIN or itemTable.player:IsCombine() or itemTable.player:GetCharacter():HasFlags("M"))) == true
end
}

View File

@@ -0,0 +1,181 @@
--[[
| 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 = "Carte de l'UTC"
ITEM.model = Model("models/n7/props/n7_cid_card.mdl")
ITEM.description = "Une carte CID de l'UTC."
ITEM.category = "Combine"
ITEM.skin = 3
ITEM.iconCam = {
pos = Vector(0, 0, 10),
ang = Angle(90, 90, 0),
fov = 45,
}
function ITEM:GetName()
local accessLevel = self:GetData("accessLevel", "- Niveau 0")
return "Carte de l'UTC " .. accessLevel .. ""
end
function ITEM:GetFactionInfo()
return self:GetData("faction", false) and ix.factionBudget.list[self:GetData("faction")] and "Lié à: " .. ix.factionBudget.list[self:GetData("faction")].name or "Cette carte n'est lié a aucune faction."
end
function ITEM:GetColorAppendix()
local info = {["green"] = self:GetFactionInfo()}
return info
end
function ITEM:GetDescription()
local idCard = ix.item.instances[self:GetData("cardID")]
return idCard and string.format(self.description.."\n\nActuellement lié au CID #%s.", idCard:GetData("cardNumber")) or
(self:GetData("cardID") and self.description.."\n\nActuellement lié." or self.description)
end
ITEM.functions.Bind = {
name = "Lier la carte CID",
icon = "icon16/vcard_edit.png",
OnClick = function(itemTable)
local cards = {}
for _, v in pairs(LocalPlayer():GetCharacter():GetInventory():GetItemsByUniqueID("id_card")) do
table.insert(cards, {
text = v:GetName(),
value = v
})
end
local cardsCount = table.Count(cards)
if (cardsCount > 1) then
Derma_Select("Lier le CID à la carte CID", "Veuillez sélectionner un CID à relier à cette carte :",
cards, "Sélectionner carte CID",
"Confirmer", function(value, name)
netstream.Start("ixBindCWUCard", itemTable:GetID(), value:GetID())
end, "Annuler")
elseif (cardsCount == 1) then
Derma_Query("Êtes-vous sûr de vouloir lier votre CID à cette carte ?", "Lier le CID à la carte CID",
"Confirmer", function()
netstream.Start("ixBindCWUCard", itemTable:GetID(), cards[1].value:GetID())
end, "Annuler")
else
LocalPlayer():NotifyLocalized("Vous n'avez pas de carte CID à lier.")
end
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then
return false
end
if (!IsValid(itemTable.player)) then
return false
end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!inventory:HasItem("id_card")) then
return false
end
if (itemTable:GetData("cardID")) then
return false
end
return true
end
}
ITEM.functions.SetAccessLevel = {
name = "Modifier le niveau d'accès",
icon = "icon16/vcard_add.png",
isMulti = true,
multiOptions = function(item, player)
local keys = table.GetKeys(ix.city.cwuAccess)
local accessLevels = {}
for _, accessLevel in pairs(keys) do
accessLevels[#accessLevels + 1] = {name = accessLevel, data = {aLevel = accessLevel .. " Accès"}}
end
return accessLevels
end,
OnRun = function(itemTable, accessLevel)
local client = itemTable.player
itemTable:SetData("accessLevel", accessLevel.aLevel)
client:NotifyLocalized("Vous avez fixé le niveau d'accès de cette carte à : " .. accessLevel.aLevel .. ".")
return false
end,
OnCanRun = function(itemTable)
return (!IsValid(itemTable.entity) and IsValid(itemTable.player) and (itemTable.player:Team() == FACTION_ADMIN or itemTable.player:IsCombine() or itemTable.player:GetCharacter():HasFlags("M"))) == true
end
}
ITEM.functions.SetFaction = {
name = "Set Card Faction",
icon = "icon16/vcard_add.png",
isMulti = true,
multiOptions = function(item, player)
local factions = {}
for id, faction in pairs(ix.factionBudget.list) do
factions[#factions + 1] = {name = faction.name, data = faction}
end
return factions
end,
OnRun = function(item, data)
item:SetData("faction", data.id)
return false
end,
OnCanRun = function(itemTable)
return (!IsValid(itemTable.entity) and IsValid(itemTable.player) and (itemTable.player:Team() == FACTION_ADMIN or itemTable.player:IsCombine() or itemTable.player:GetCharacter():HasFlags("M"))) == true
end
}
ITEM.functions.insert = {
name = "Insérez carte",
icon = "icon16/add.png",
OnRun = function(itemTable)
local client = itemTable.player
local ent = client:GetEyeTrace().Entity
if (!ent.CWUInsert) 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:CWUInsert(bSuccess)
end
return false
end,
OnCanRun = function(itemTable)
local client = itemTable.player
if (!client:GetEyeTrace().Entity.CWUInsert) then
return false
end
return true
end
}

View File

@@ -0,0 +1,106 @@
--[[
| 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 = "Carte de la H.A.A"
ITEM.model = Model("models/n7/props/n7_cid_card.mdl")
ITEM.description = "Une carte CID de la Haute Autorité Administrative."
ITEM.category = "Combine"
ITEM.skin = 1
ITEM.iconCam = {
pos = Vector(0, 0, 10),
ang = Angle(90, 90, 0),
fov = 45,
}
function ITEM:GetName()
local accessLevel = self:GetData("accessLevel", "- Niveau 0")
return "Carte de la Haute Autorité Administrative " .. accessLevel .. ""
end
function ITEM:GetDescription()
local idCard = ix.item.instances[self:GetData("cardID")]
return idCard and string.format(self.description.."\n\nActuellement lié au CID #%s.", idCard:GetData("cardNumber")) or
(self:GetData("cardID") and self.description.."\n\nActuellement lié." or self.description)
end
ITEM.functions.Bind = {
name = "Lier la carte CID",
icon = "icon16/vcard_edit.png",
OnClick = function(itemTable)
local cards = {}
for _, v in pairs(LocalPlayer():GetCharacter():GetInventory():GetItemsByUniqueID("id_card")) do
table.insert(cards, {
text = v:GetName(),
value = v
})
end
local cardsCount = table.Count(cards)
if (cardsCount > 1) then
Derma_Select("Lier le CID à la carte CID", "Veuillez sélectionner un CID à relier à cette carte :",
cards, "Sélectionner carte CID",
"Confirmer", function(value, name)
netstream.Start("ixBindDOBCard", itemTable:GetID(), value:GetID())
end, "Annuler")
elseif (cardsCount == 1) then
Derma_Query("Êtes-vous sûr de vouloir lier votre CID à cette carte ?", "Lier le CID à la carte CID",
"Confirmer", function()
netstream.Start("ixBindDOBCard", itemTable:GetID(), cards[1].value:GetID())
end, "Annuler")
else
LocalPlayer():NotifyLocalized("Vous n'avez pas de carte CID à lier.")
end
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then
return false
end
if (!IsValid(itemTable.player)) then
return false
end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!inventory:HasItem("id_card")) then
return false
end
if (itemTable:GetData("cardID")) then
return false
end
return true
end
}
ITEM.functions.SetAccessLevel = {
name = "Modifier le niveau d'accès",
icon = "icon16/vcard_add.png",
OnRun = function(itemTable)
local client = itemTable.player
local accessLevel = itemTable:GetData("accessLevel", "0")
local target = accessLevel == "- NIVEAU 1 (MEMBRE)" and "- NIVEAU 2 (ADMINISTRATION)" or "- NIVEAU 1 (MEMBRE)"
itemTable:SetData("accessLevel", target)
client:NotifyLocalized("Vous avez fixé le niveau d'accès de cette carte à : " .. target .. ".")
return false
end,
OnCanRun = function(itemTable)
return (!IsValid(itemTable.entity) and IsValid(itemTable.player) and (itemTable.player:Team() == FACTION_ADMIN or itemTable.player:IsCombine() or itemTable.player:GetCharacter():HasFlags("M"))) == true
end
}

View File

@@ -0,0 +1,66 @@
--[[
| 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 = "Fausse Carte CID de #00000"
ITEM.model = Model("models/n7/props/n7_cid_card.mdl")
ITEM.description = "Une carte CID de citoyen, attribuée à %s | CID n°%s\n\nCID : %s\nDescription génétique :\n%s.\n\nCette carte est la propriété de l'UTC. La possession illégale et l'usurpation d'identité sont punies, et entraîneront des sanctions par la Protection Civile. Si trouvée, merci de remettre immédiatement cette carte à l'équipe de la Protection Civile la plus proche."ITEM.category = "Combine"
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)
surface.SetDrawColor(110, 255, 110, 100)
surface.DrawRect(w - 14, h - 14, 8, 8)
end
end
function ITEM:GetName()
return "# Carte CID n° : " .. self:GetData("cid", "00000") .. ""
end
function ITEM:GetDescription()
return string.format(self.description,
self:GetData("name", "personne"),
self:GetData("cid", "00000"),
self:GetData("cardNumber", "00-0000-0000-00"),
self:GetData("geneticDesc", "N/A | N/A | YEUX N/A | CHEVEUX N/A"))
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: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

View File

@@ -0,0 +1,52 @@
--[[
| 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 = "Dispositif de création de carte CID"
ITEM.model = Model("models/props_lab/reciever01a.mdl")
ITEM.description = "Un appareil utilisé pour modifier les cartes CID vierges afin qu'elles ressemblent à de vraies cartes fonctionnelles."
ITEM.category = "Outils"
ITEM.functions.CreateID = {
name = "Créer une carte CID contrefaite",
icon = "icon16/vcard.png",
OnRun = function(itemTable)
local client = itemTable.player
client:RequestString("Nom", "Entrez le nom de la personne à qui cette fausse carte sera destinée", function(name)
client:RequestString("CID", "Entrez le CID de la personne à qui cette fausse carte sera destinée", function(cid)
client:RequestString("Description générique", "Entrez la description génétique de la personne à qui cette fausse carte sera destinée", function(desc)
local inventory = client:GetCharacter():GetInventory()
local card = inventory:HasItem("id_card_blank")
if (!card) then
client:Notify("Vous avez besoin d'une carte CID vierge pour faire une contrefaçon !")
client:EmitSound("buttons/combine_button_locked.wav")
return false
end
card:Remove()
inventory:Add("fake_id_card", 1, {
name = name,
cid = cid,
geneticDesc = desc
})
client:Notify("Fausse carte CID crée.")
client:EmitSound("ambient/machines/combine_terminal_idle2.wav")
end, "~... ANS | ~..M.. | YEUX ...")
end, "00000")
end, "")
return false
end
}

View File

@@ -0,0 +1,288 @@
--[[
| 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 = "Carte CID de #00000"
ITEM.model = Model("models/n7/props/n7_cid_card.mdl")
ITEM.description = "Une carte CID de citoyen, attribuée à %s | CID n°%s\n\nCID : %s\nDescription génétique :\n%s.\n\nCette carte est la propriété de l'UTC. La possession illégale et l'usurpation d'identité sont punies, et entraîneront des sanctions par la Protection Civile. Si trouvée, merci de remettre immédiatement cette carte à l'équipe de la Protection Civile la plus proche."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 "# Carte CID n° : " .. 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", "personne"),
self:GetData("cid", "00000"),
self:GetData("cardNumber", "00-0000-0000-00"),
self:GetData("geneticDesc", "N/A | N/A | YEUX N/A | CHEVEUX N/A"))
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", "INCONNU"))
insert:Insert("sender_cid", self:GetData("cid", "INVALIDE"))
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", "aucune raison donnée")
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 = "Attribuer crédits",
icon = "icon16/money_add.png",
OnClick = function(itemTable)
local client = itemTable.player
Derma_StringRequest("Attribuer crédits", "Combien de crédits voulez-vous attribuer ?", 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
}

View File

@@ -0,0 +1,19 @@
--[[
| 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 = "Carte CID vierge"
ITEM.model = Model("models/n7/props/n7_cid_card.mdl")
ITEM.description = "Une carte CID vierge sans aucune donnée, prête à être marquée."
ITEM.category = "Combine"
ITEM.iconCam = {
pos = Vector(0, 0, 10),
ang = Angle(90, 90, 0),
fov = 45,
}

View File

@@ -0,0 +1,114 @@
--[[
| 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 = "Dispositif de création de carte CID"
ITEM.model = Model("models/props_lab/reciever01d.mdl")
ITEM.description = "Dispositif utilisé pour lier des cartes CID vierges à une personne spécifique."
ITEM.category = "Combine"
ITEM.functions.CreateIDTarget = {
name = "Créer une carte CID pour la cible",
icon = "icon16/vcard_add.png",
OnRun = function(itemTable)
local client = itemTable.player
if (ix.config.Get("creditsNoConnection")) then
client:EmitSound("hl1/fvox/buzz.wav", 60, 100, 0.5)
return false
end
if (itemTable:CheckAccess(client, itemTable) == false) then
client:EmitSound("buttons/combine_button_locked.wav", 60, 100, 0.5)
return false
end
local data = {}
data.start = client:GetShootPos()
data.endpos = data.start + client:GetAimVector() * 96
data.filter = client
local target = util.TraceLine(data).Entity
if (IsValid(target) and target:IsPlayer() and target:GetCharacter()) then
client:SetAction("@scanning", 5)
client:EmitSound("buttons/button18.wav", 60, 100, 0.5)
client:DoStaredAction(target, function()
itemTable:CreateIDCard(client, target)
end, 5, function()
client:SetAction()
client:EmitSound("buttons/combine_button_locked.wav", 60, 100, 0.5)
end)
else
client:NotifyLocalized("plyNotValid")
end
return false
end,
OnCanRun = function(itemTable)
return !IsValid(itemTable.entity)
end
}
ITEM.functions.CreateIDSelf = {
name = "Créer une carte CID pour soi-même",
icon = "icon16/vcard.png",
OnRun = function(itemTable)
local client = itemTable.player
if (ix.config.Get("creditsNoConnection")) then
client:EmitSound("hl1/fvox/buzz.wav", 60, 100, 0.5)
return false
end
if (itemTable:CheckAccess(client, itemTable) == false) then
client:EmitSound("buttons/combine_button_locked.wav", 60, 100, 0.5)
return false
end
client:SetAction("@scanning", 5, function()
itemTable:CreateIDCard(client, client)
end)
client:EmitSound("buttons/button18.wav", 60, 100, 0.5)
return false
end
}
function ITEM:CreateIDCard(client, target)
local character = target:GetCharacter()
local cid = character:GetCid()
if (!cid) then
client:NotifyLocalized("idNotFound")
client:EmitSound("buttons/combine_button_locked.wav", 60, 100, 0.5)
return
end
local inventory = client:GetCharacter():GetInventory()
local blankCard = inventory:HasItem("id_card_blank")
if (!blankCard) then
client:NotifyLocalized("idNoBlank")
client:EmitSound("buttons/combine_button_locked.wav", 60, 100, 0.5)
return
end
blankCard:Remove()
character:CreateIDCard()
client:EmitSound("buttons/button4.wav", 60, 100, 0.5)
client:NotifyLocalized("idCardAdded")
ix.combineNotify:AddNotification("NTC:// Carte CID #" .. character:GetCid() .. " crée par " .. client:GetCombineTag())
end
function ITEM:CheckAccess(client, itemTable)
if (!client:HasActiveCombineSuit() and !ix.faction.Get(client:Team()).allowCIDCreator) then
client:NotifyLocalized("idNotAllowed")
return false
end
end

View File

@@ -0,0 +1,106 @@
--[[
| 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 = "MOE Access Card"
ITEM.model = Model("models/n7/props/n7_cid_card.mdl")
ITEM.description = "A Ministry of Enlightenment Access Keycard."
ITEM.category = "Combine"
ITEM.skin = 2
ITEM.iconCam = {
pos = Vector(0, 0, 10),
ang = Angle(90, 90, 0),
fov = 45,
}
function ITEM:GetName()
local accessLevel = self:GetData("accessLevel", "Member Access")
return "MOE " .. accessLevel .. " Keycard"
end
function ITEM:GetDescription()
local idCard = ix.item.instances[self:GetData("cardID")]
return idCard and string.format(self.description.."\n\nCurrently bound to identity card #%s.", idCard:GetData("cardNumber")) or
(self:GetData("cardID") and self.description.."\n\nCurrently bound." or self.description)
end
ITEM.functions.Bind = {
name = "Bind ID Card",
icon = "icon16/vcard_edit.png",
OnClick = function(itemTable)
local cards = {}
for _, v in pairs(LocalPlayer():GetCharacter():GetInventory():GetItemsByUniqueID("id_card")) do
table.insert(cards, {
text = v:GetName(),
value = v
})
end
local cardsCount = table.Count(cards)
if (cardsCount > 1) then
Derma_Select("Bind ID Card to MOE Card", "Please select a ID card to bind to this MOE Card:",
cards, "Select ID card",
"Confirm Operation", function(value, name)
netstream.Start("ixBindMOECard", itemTable:GetID(), value:GetID())
end, "Cancel")
elseif (cardsCount == 1) then
Derma_Query("Are you sure you wish to bind your ID to this MOE Card?", "Bind ID Card to MOE Card",
"Confirm Operation", function()
netstream.Start("ixBindMOECard", itemTable:GetID(), cards[1].value:GetID())
end, "Cancel")
else
LocalPlayer():NotifyLocalized("You do not have ID card to bind to this MOE Card.")
end
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then
return false
end
if (!IsValid(itemTable.player)) then
return false
end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!inventory:HasItem("id_card")) then
return false
end
if (itemTable:GetData("cardID")) then
return false
end
return true
end
}
ITEM.functions.SetAccessLevel = {
name = "Toggle Card Access Level",
icon = "icon16/vcard_add.png",
OnRun = function(itemTable)
local client = itemTable.player
local accessLevel = itemTable:GetData("accessLevel", "Member Access")
local target = accessLevel == "Member Access" and "Management Access" or "Member Access"
itemTable:SetData("accessLevel", target)
client:NotifyLocalized("You have set this card's Access Level to " .. target .. ".")
return false
end,
OnCanRun = function(itemTable)
return (!IsValid(itemTable.entity) and IsValid(itemTable.player) and (itemTable.player:Team() == FACTION_ADMIN or itemTable.player:IsCombine() or itemTable.player:GetCharacter():HasFlags("M"))) == true
end
}

View File

@@ -0,0 +1,226 @@
--[[
| 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 PLUGIN = PLUGIN
ITEM.name = "Terminal POS"
ITEM.model = Model("models/willardnetworks/props/posterminal.mdl")
ITEM.description = "Dispositif permettant à quelqu'un de demander à une autre personne de déposer des crédits sur une autre carte CID."
ITEM.category = "Combine"
function ITEM:GetDescription()
local idCard = ix.item.instances[self:GetData("cardID")]
return idCard and string.format(self.description.."\n\nLié à la carte CID n°#%s.", idCard:GetData("cardNumber")) or self.description
end
if (SERVER) then
function ITEM:AddTransactionID(id)
local ids = self:GetData("transactionIDs", {})
ids[#ids + 1] = id
self:SetData("transactionIDs", ids, false, false, true)
end
end
ITEM.functions.RequestCredits = {
name = "Demander des crédits",
icon = "icon16/money.png",
OnClick = function(itemTable)
local client = itemTable.player
if (ix.config.Get("creditsNoConnection")) then
client:EmitSound("hl1/fvox/buzz.wav", 60, 100, 0.5)
client:NotifyLocalized("errorNoConnection")
return false
end
Derma_StringRequest("Demander des crédits", "Combien de crédits demandez-vous ?", itemTable:GetData("lastAmount", 0), function(text)
local amount = tonumber(text)
if (amount) then
Derma_StringRequest("Demander des crédits - RAISON", "Entrez une raison pour cette transaction :", "", function(reason)
if (text == "") then
client:NotifyLocalized("reasonNotValid")
return
end
netstream.Start("ixRequestCredits", itemTable:GetID(), math.floor(amount), reason)
end)
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 (!itemTable:GetData("cardID", false)) then
return false
end
return true
end
}
ITEM.functions.Bind = {
name = "Lier la carte CID",
icon = "icon16/vcard_edit.png",
OnClick = function(itemTable)
local client = itemTable.player
if (ix.config.Get("creditsNoConnection")) then
client:EmitSound("hl1/fvox/buzz.wav", 60, 100, 0.5)
client:NotifyLocalized("errorNoConnection")
return false
end
local cards = {}
for _, v in pairs(client:GetCharacter():GetInventory():GetItemsByUniqueID("id_card")) do
table.insert(cards, {
text = v:GetName(),
value = v
})
end
local cardsCount = table.Count(cards)
if (cardsCount > 1) then
Derma_Select("Liaison du CID au terminal", "Veuillez sélectionner un CID à relier à ce terminal :",
cards, "Sélectionner la carte",
"Confirmer", function(value, name)
netstream.Start("ixBindTerminal", itemTable:GetID(), value:GetID())
end, "Annuler")
elseif (cardsCount == 1) then
Derma_Query("Êtes-vous sûr de vouloir lier CID à ce terminal ?", "Liaison du CID au terminal",
"Confirmer", function()
netstream.Start("ixBindTerminal", itemTable:GetID(), cards[1].value:GetID())
end, "Annuler")
else
client:NotifyLocalized("Vous n'avez pas de carte CID à lier.")
end
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then return false end
if (!IsValid(itemTable.player)) then return false end
if (itemTable:GetData("cardIDLock", false)) then return false end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!inventory:HasItem("id_card")) then return false end
if (!itemTable:GetData("cardID", false)) then return true end
if (inventory:GetItemCount("id_card") == 1 and inventory:GetItemByID(itemTable:GetData("cardID"))) then
return false
end
return true
end
}
ITEM.functions.ShowLog = {
name = "Transactions récentes",
icon = "icon16/eye.png",
OnRun = function(itemTable, data)
local inventory = itemTable.player:GetCharacter():GetInventory()
PLUGIN:SelectTransactions(itemTable.player, "pos", itemTable:GetID(), data and data[1], itemTable:GetData("cardIDLock", false) and !inventory:GetItemByID(itemTable:GetData("cardID")))
return false
end,
isMulti = true,
multiOptions = function(item, player)
local options = {{name = "1 jour", data = {1}}}
for i = 2, 6 do
options[#options + 1] = {name = i.." Jours", data = {i}}
end
options[#options + 1] = {name = "1 Semaine", data = {7}}
options[#options + 1] = {name = "2 Semaines", data = {14}}
options[#options + 1] = {name = "1 Mois", data = {30}}
options[#options + 1] = {name = "Plus", data = {-1}, OnClick = function(itemTable)
Derma_StringRequest("Registre", "Entrez le nombre de jours auxquels vous voulez voir les registres.", "7", function(text)
local amount = tonumber(text)
if (!amount or amount <= 0) then return end
net.Start("ixInventoryAction")
net.WriteString("ShowLog")
net.WriteUInt(itemTable.id, 32)
net.WriteUInt(itemTable.invID, 32)
net.WriteTable({amount})
net.SendToServer()
end)
return false
end}
return options
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then return false end
if (!IsValid(itemTable.player)) then return false end
if (!itemTable:GetData("cardID", false)) then return false end
return true
end
}
ITEM.functions.Lock = {
name = "Bloquer la Carte",
icon = "icon16/lock.png",
OnRun = function(itemTable)
itemTable:SetData("cardIDLock", true)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then return false end
if (!IsValid(itemTable.player)) then return false end
if (itemTable:GetData("cardIDLock", false)) then return false end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!itemTable:GetData("cardID", false)) then return false end
if (!inventory:GetItemByID(itemTable:GetData("cardID"))) then return false end
return true
end
}
ITEM.functions.LockUn = {
name = "Débloquer la Carte",
icon = "icon16/lock_open.png",
OnRun = function(itemTable)
itemTable:SetData("cardIDLock", false)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then return false end
if (!IsValid(itemTable.player)) then return false end
if (!itemTable:GetData("cardIDLock", false)) then return false end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!itemTable:GetData("cardID", false)) then return false end
if (!inventory:GetItemByID(itemTable:GetData("cardID"))) then return false end
return true
end
}

View File

@@ -0,0 +1,157 @@
--[[
| 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 PLUGIN = PLUGIN
REQUEST_CP = 0
REQUEST_MED = 1
REQUEST_WORK = 2
ITEM.name = "Dispositif d'aide"
ITEM.model = Model("models/gibs/shield_scanner_gib1.mdl")
ITEM.description = "Un petit appareil aux coins arrondis, abritant un bouton. Un petit logo du Cartel est visible.\n\nLes instructions sont : veuillez d'abord enregistrer cet appareil en tenant votre carte CID contre cet appareil. Une fois l'inscription terminée, vous pouvez demander l'assistance de la Protection Civile en appuyant sur le bouton et en précisant votre demande. Votre nom et votre CID sont automatiquement inclus dans la demande.\nVeuillez noter que l'utilisation abusive du dispositif de demande, les fausses déclarations à la Protection Civile et l'usurpation d'identité sont punissables sévèrements et entraîneront des poursuites par la Protection Civile."
ITEM.price = 20
ITEM.category = "Combine"
function ITEM:GetDescription()
local idCard = ix.item.instances[self:GetData("cardID")]
return idCard and string.format(self.description.."\n\nActuellement lié à la carte CID n°#%s.", idCard:GetData("cardNumber")) or self.description
end
local function GetRequestTable(data)
return {
name = data.actionName,
icon = "icon16/help.png",
OnClick = function(itemTable)
if (ix.config.Get("creditsNoConnection")) then
itemTable.player:EmitSound("hl1/fvox/buzz.wav", 60, 100, 0.5)
return
end
Derma_StringRequest(data.requestTitle, data.requestMessage, PLUGIN.text,
function(text)
if (text and string.utf8len(text) > 0) then
netstream.Start("ixRequest", itemTable:GetID(), text, data.requestType)
end
PLUGIN.text = nil
end,
function(text)
if (text == PLUGIN.text) then
PLUGIN.text = text
elseif (text and string.utf8len(text) > 0)then
PLUGIN.text = text
else
PLUGIN.text = nil
end
end, "FAIRE UNE DEMANDE", "ANNULER"
)
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then
return false
end
if (!itemTable:GetData("cardID", false)) then
return false
end
return true
end
}
end
ITEM.functions.RequestCp = GetRequestTable({
actionName = "Requête Protection Civile",
requestTitle = "Demander de l'aide à la Protection Civile",
requestMessage = "Entrez la raison de votre demande. Votre nom & votre CID sont automatiquement inclus.",
requestType = REQUEST_CP
})
ITEM.functions.RequestMed = GetRequestTable({
actionName = "Requête UCMR",
requestTitle = "Demander de l'aide à L'union Civile de Médecine et de Recherche",
requestMessage = "Entrez la raison de votre demande. Votre nom & votre CID sont automatiquement inclus. N'oubliez pas de dire votre position!",
requestType = REQUEST_MED
})
ITEM.functions.RequestCwu = GetRequestTable({
actionName = "Requête UTC",
requestTitle = "Demander de l'aide à l'Union des Travailleurs Civile",
requestMessage = "Entrez la raison de votre demande. Votre nom & votre CID sont automatiquement inclus.",
requestType = REQUEST_WORK
})
ITEM.functions.Bind = {
name = "Lié carte CID",
icon = "icon16/vcard_edit.png",
OnClick = function(itemTable)
local cards = {}
for _, v in pairs(LocalPlayer():GetCharacter():GetInventory():GetItemsByUniqueID("id_card")) do
table.insert(cards, {
text = v:GetName(),
value = v
})
end
local cardsCount = table.Count(cards)
if (cardsCount > 1) then
Derma_Select("Lier le CID au dispositif", "Veuillez sélectionner un CID à relier au dispositif :",
cards, "Sélectionner carte CID",
"Confirmer", function(value, name)
netstream.Start("ixBindRequestDevice", itemTable:GetID(), value:GetID())
end, "Annuler")
elseif (cardsCount == 1) then
Derma_Query("Êtes-vous sûr de vouloir lier votre CID à ce dispositif ?", "Lier le CID au dispositif",
"Confirmer", function()
netstream.Start("ixBindRequestDevice", itemTable:GetID(), cards[1].value:GetID())
end, "Annuler")
else
LocalPlayer():NotifyLocalized("Vous n'avez pas de carte CID à lier.")
end
end,
OnRun = function(itemTable)
return false
end,
OnCanRun = function(itemTable)
if (IsValid(itemTable.entity)) then
return false
end
if (!IsValid(itemTable.player)) then
return false
end
local inventory = itemTable.player:GetCharacter():GetInventory()
if (!inventory:HasItem("id_card")) then
return false
end
if (!itemTable:GetData("cardID", false)) then
return true
end
if (inventory:GetItemCount("id_card") == 1 and inventory:GetItemByID(itemTable:GetData("cardID"))) then
return false
end
return true
end
}
if (CLIENT) then
netstream.Hook("rdMoreThanOneText", function(text)
PLUGIN.rdText = text
end)
end