add sborka
This commit is contained in:
170
garrysmod/gamemodes/militaryrp/plugins/shop/sv_plugin.lua
Normal file
170
garrysmod/gamemodes/militaryrp/plugins/shop/sv_plugin.lua
Normal file
@@ -0,0 +1,170 @@
|
||||
local PLUGIN = PLUGIN
|
||||
|
||||
util.AddNetworkString("ixShop_OpenMenu")
|
||||
util.AddNetworkString("ixShop_BuyItem")
|
||||
util.AddNetworkString("ixShop_UpdateModel")
|
||||
util.AddNetworkString("ixShop_UpdateType")
|
||||
|
||||
ix.util.Include("sh_config.lua")
|
||||
|
||||
function PLUGIN:SaveData()
|
||||
local data = {}
|
||||
|
||||
for _, npc in ipairs(ents.FindByClass("ix_shop_npc")) do
|
||||
if IsValid(npc) then
|
||||
data[#data + 1] = {
|
||||
pos = npc:GetPos(),
|
||||
angles = npc:GetAngles(),
|
||||
model = npc:GetModel(),
|
||||
shopType = npc:GetShopType()
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
self:SetData(data)
|
||||
end
|
||||
|
||||
function PLUGIN:LoadData()
|
||||
for _, v in ipairs(self:GetData() or {}) do
|
||||
local npc = ents.Create("ix_shop_npc")
|
||||
if IsValid(npc) then
|
||||
npc:SetPos(v.pos)
|
||||
npc:SetAngles(v.angles)
|
||||
npc:SetModel(v.model or "models/humans/group01/male_01.mdl")
|
||||
npc:Spawn()
|
||||
|
||||
timer.Simple(0.1, function()
|
||||
if IsValid(npc) then
|
||||
npc:SetShopType(v.shopType or "general")
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:OnUnloaded()
|
||||
self:SaveData()
|
||||
end
|
||||
|
||||
-- Обработка изменения типа магазина
|
||||
net.Receive("ixShop_UpdateType", function(len, client)
|
||||
if not client:IsAdmin() then return end
|
||||
|
||||
local npc = net.ReadEntity()
|
||||
local shopType = net.ReadString()
|
||||
|
||||
if not IsValid(npc) or npc:GetClass() != "ix_shop_npc" then return end
|
||||
if client:GetPos():Distance(npc:GetPos()) > 300 then return end
|
||||
|
||||
npc:SetShopType(shopType)
|
||||
PLUGIN:SaveData()
|
||||
|
||||
client:Notify("Тип магазина изменен на: " .. shopType)
|
||||
end)
|
||||
|
||||
-- Обработка покупки предмета
|
||||
net.Receive("ixShop_BuyItem", function(len, client)
|
||||
local shopType = net.ReadString()
|
||||
local itemID = net.ReadString()
|
||||
|
||||
local shopData = PLUGIN.shops[shopType]
|
||||
if not shopData or not shopData.items[itemID] then
|
||||
client:Notify("Предмет не найден!")
|
||||
return
|
||||
end
|
||||
|
||||
local itemData = shopData.items[itemID]
|
||||
local character = client:GetCharacter()
|
||||
|
||||
if not character then return end
|
||||
|
||||
-- Проверка денег
|
||||
if not character:HasMoney(itemData.price) then
|
||||
client:Notify("Недостаточно денег! Требуется: " .. itemData.price .. "₽")
|
||||
return
|
||||
end
|
||||
|
||||
-- Проверка наличия предмета в базе ix.item
|
||||
local ixItem = ix.item.list[itemID]
|
||||
if not ixItem then
|
||||
client:Notify("Предмет не существует в базе данных!")
|
||||
return
|
||||
end
|
||||
|
||||
-- Попытка дать предмет
|
||||
if shopType == "drones" then
|
||||
local weaponClass = ixItem.class or itemID
|
||||
|
||||
-- Проверка, нет ли уже такого дрона у игрока
|
||||
if client:HasWeapon(weaponClass) then
|
||||
client:Notify("У вас уже есть этот дрон!")
|
||||
return
|
||||
end
|
||||
|
||||
-- Если это магазин дронов, даем оружие напрямую (SWEP)
|
||||
client:Give(weaponClass)
|
||||
client:SelectWeapon(weaponClass)
|
||||
else
|
||||
-- Для остальных магазинов добавляем в инвентарь
|
||||
local inventory = character:GetInventory()
|
||||
|
||||
if not inventory or isnumber(inventory) then
|
||||
client:Notify("Инвентарь еще загружается, подождите немного...")
|
||||
return
|
||||
end
|
||||
|
||||
if not inventory:Add(itemID) then
|
||||
client:Notify("Недостаточно места в инвентаре!")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- Списание денег
|
||||
character:TakeMoney(itemData.price)
|
||||
client:Notify("Вы купили " .. (ixItem.name or itemID) .. " за " .. itemData.price .. "₽")
|
||||
|
||||
-- Логирование покупки
|
||||
local serverlogsPlugin = ix.plugin.list["serverlogs"]
|
||||
if serverlogsPlugin then
|
||||
local message = string.format("%s купил %s за %d₽ (магазин: %s)",
|
||||
client:GetName(), (ixItem.name or itemID), itemData.price, shopData.name)
|
||||
serverlogsPlugin:AddLog("SHOP_PURCHASE", message, client, {
|
||||
itemID = itemID,
|
||||
itemName = (ixItem.name or itemID),
|
||||
price = itemData.price,
|
||||
shopType = shopType
|
||||
})
|
||||
end
|
||||
end)
|
||||
|
||||
-- Обработка изменения модели NPC
|
||||
net.Receive("ixShop_UpdateModel", function(len, client)
|
||||
if not client:IsAdmin() then return end
|
||||
|
||||
local npc = net.ReadEntity()
|
||||
local model = net.ReadString()
|
||||
|
||||
if not IsValid(npc) or npc:GetClass() != "ix_shop_npc" then return end
|
||||
if client:GetPos():Distance(npc:GetPos()) > 300 then return end
|
||||
|
||||
npc:SetModel(model)
|
||||
PLUGIN:SaveData()
|
||||
|
||||
client:Notify("Модель NPC изменена на: " .. model)
|
||||
end)
|
||||
|
||||
-- Команда для сохранения магазинов
|
||||
ix.command.Add("ShopSave", {
|
||||
description = "Сохранить все магазины",
|
||||
superAdminOnly = true,
|
||||
OnRun = function(self, client)
|
||||
local plugin = ix.plugin.Get("shop")
|
||||
if not plugin then
|
||||
return "@commandNoExist"
|
||||
end
|
||||
|
||||
plugin:SaveData()
|
||||
local count = #ents.FindByClass("ix_shop_npc")
|
||||
client:Notify("Магазины сохранены (" .. count .. " шт.)")
|
||||
end
|
||||
})
|
||||
Reference in New Issue
Block a user