• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается RAGE Multiplayer.
    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Вопрос Мусорки сборка Freedom

JerryMorality

Участник портала
2 Сен 2022
71
6
49
В общем в сборке freedom и остальных на этом моде есть система мусорок в которых можно лазить и лутать что в ней есть, но почему они постоянно пустые? Сколько не лазил по серверке так и не понял что нужно сделать чтобы начал генерироваться лут в случайном порядке?, кто разбирался с этим или знает что нужно сделать дайте знать


C#:
using GTANetworkAPI;
using System;
using System.Linq;
using NeptuneEVO.SDK;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Data;

namespace NeptuneEVO.Core
{
    class GarbageCans : Script
    {
        public static Dictionary<int, GarbageCan> List = new Dictionary<int, GarbageCan>();
        private static int LastID = 0;
        private static nLog Log = new nLog("GarbageCan");
        [ServerEvent(Event.ResourceStart)]
        public static void OnResourceStart()
        {
            try
            {
                var result = MySQL.QueryRead($"SELECT * FROM garbagecans");
                if (result == null || result.Rows.Count == 0)
                {
                    Log.Write("DB GarbageCans return null result.", nLog.Type.Warn);
                    return;
                }
                foreach (DataRow Row in result.Rows)
                {
                    int id = Convert.ToInt32(Row["id"].ToString());
                    Vector3 pos = JsonConvert.DeserializeObject<Vector3>(Row["pos"].ToString());
                    new GarbageCan(pos);
                    LastID = id;
                }
                Log.Write("Loaded", nLog.Type.Info);
            }
            catch (Exception e) { Log.Write(e.ToString(), nLog.Type.Error); }
        }
        [Command("creategc")]
        public static void CMD_CreateGarbageCan(Player player)
        {
            LastID++;
            Vector3 pos = player.Position - new Vector3(0, 0, 1.25);
            new GarbageCan(pos);
            MySQL.Query($"INSERT INTO `garbagecans` (`id`, `pos`, `items`) VALUES({LastID},'{JsonConvert.SerializeObject(pos)}','{JsonConvert.SerializeObject(new List<nItem>())}')");
        }
        public static GarbageCan GetNearestGarbageCan(Vector3 pos)
        {
            GarbageCan neareset = List[0];
            foreach (var v in List.Values)
            {
                if (pos.DistanceTo(v.Pos) < pos.DistanceTo(neareset.Pos))
                    neareset = v;
            }
            return neareset;
        }
        public static void RemoveAllInventory()
        {
            foreach(GarbageCan gc in List.Values)
            {
                gc.Inventory = new List<nItem>();
            }
        }
        public class GarbageCan
        {

            public int ID { get; set; }
            public Vector3 Pos { get; set; }
            public List<nItem> Inventory = new List<nItem>();
            [JsonIgnore]
            public GTANetworkAPI.ColShape Shape { get; set; }
            [JsonIgnore]
            public Blip Blip { get; set; }
            public GarbageCan(Vector3 pos)
            {
                ID = LastID; Pos = pos; Inventory = new List<nItem>();
                Shape = NAPI.ColShape.CreateCylinderColShape(Pos, 2f, 2f, 0);
                //Blip = NAPI.Blip.CreateBlip(318, pos, 0.5f, 5, "Мусорка", 255, false);
                Shape.OnEntityEnterColShape += (s, entity) =>
                {
                    try
                    {
                        if (entity.IsInVehicle) return;
                        entity.SetData("INTERACTIONCHECK", 943);
                        entity.SetData("GARBAGECAN", this);
                        Trigger.PlayerEvent(entity, "client::showhintHUD", true, "Открыть мусорку");
                    }
                    catch (Exception e) { Console.WriteLine("shape.OnEntityEnterColshape: " + e.Message); }
                };
                Shape.OnEntityExitColShape += (s, entity) =>
                {
                    try
                    {
                        entity.SetData("INTERACTIONCHECK", -1);
                        entity.ResetData("GARBAGECAN");
                        Trigger.PlayerEvent(entity, "client::showhintHUD", false, "");
                    }
                    catch (Exception e) { Console.WriteLine("shape.OnEntityEnterColshape: " + e.Message); }
                };
                List.Add(ID, this);
                LastID++;
            }
            public static void CheckInfect(Player player)
            {
                if (player == null) return;
                if (Main.Players[player].Infect == 0) return;
                if (Main.Players[player].Infect == 1)
                {
                    Trigger.PlayerEvent(player, "startScreenEffect", "BikerFilter", 0, false);
                    Timers.StartOnce(120000, () => Trigger.PlayerEvent(player, "stopScreenEffect", "BikerFilter"));
                    Notify.Send(player, NotifyType.Warning, NotifyPosition.BottomCenter, $"Вы больны! Явитесь в EMS, иначе вы погибнете!", 3000);
                    int Health = NAPI.Player.GetPlayerHealth(player);
                    int getHealth = Health - 10;
                    NAPI.Player.SetPlayerHealth(player, getHealth);
                }
                if (Main.Players[player].Infect == 2)
                {
                    Trigger.PlayerEvent(player, "startScreenEffect", "BeastLaunch", 0, false);
                    Timers.StartOnce(120000, () => Trigger.PlayerEvent(player, "stopScreenEffect", "BeastLaunch"));
                    Notify.Send(player, NotifyType.Warning, NotifyPosition.BottomCenter, $"Вы отравились! Явитесь в EMS, иначе вы погибнете!", 3000);
                    int Health = NAPI.Player.GetPlayerHealth(player);
                    int getHealth = Health - 20;
                    NAPI.Player.SetPlayerHealth(player, getHealth);
                }
                if (Main.Players[player].Infect == 3)
                {
                    Trigger.PlayerEvent(player, "startScreenEffect", "DeathFailMPDark", 0, false);
                    Timers.StartOnce(120000, () => Trigger.PlayerEvent(player, "stopScreenEffect", "DeathFailMPDark"));
                    Notify.Send(player, NotifyType.Warning, NotifyPosition.BottomCenter, $"Вы больны! Явитесь в EMS, иначе вы погибнете!", 3000);
                    int Health = NAPI.Player.GetPlayerHealth(player);
                    int getHealth = Health - 25;
                    NAPI.Player.SetPlayerHealth(player, getHealth);
                }
                if (Main.Players[player].Infect == 4)
                {
                    Trigger.PlayerEvent(player, "startScreenEffect", "PPPurple", 0, false);
                    Timers.StartOnce(120000, () => Trigger.PlayerEvent(player, "stopScreenEffect", "PPPurple"));
                    Notify.Send(player, NotifyType.Warning, NotifyPosition.BottomCenter, $"Вы больны! Явитесь в EMS, иначе вы погибнете!", 3000);
                    int Health = NAPI.Player.GetPlayerHealth(player);
                    int getHealth = Health - 35;
                    NAPI.Player.SetPlayerHealth(player, getHealth);
                }
            }
            public void Open(Player player)
            {
                if (player.IsInVehicle) return;
                if (player.HasData("GARBAGECAN"))
                {
                    GarbageCan gc = player.GetData<GarbageCan>("GARBAGECAN");
                    InvInterface.OpenOut(player, gc.Inventory, "Мусорка", 21, 10000);
                    Random rand = new Random();
                    if (rand.NextDouble() < 0.05)
                    {
                        Main.Players[player].Infect = 1;
                        MySQL.Query($"UPDATE `characters` SET `infect`=1 WHERE `uuid`={Main.Players[player].UUID}");
                    }
                    if (player.HasData("GARBAGE_LASTID") && player.GetData<int>("GARBAGE_LASTID") != gc.ID)
                    {
                        BattlePass.AddProgressToQuest(player, 5, 1);
                    }
                    player.SetData<int>("GARBAGE_LASTID", gc.ID);
                }
            }
            public static int TryAdd(GarbageCan gc, nItem item)
            {
                var items = gc.Inventory;

                var tail = 0;
                if (nInventory.WeaponsItems.Contains(item.Type) || nInventory.MeleeWeaponsItems.Contains(item.Type) || nInventory.AmmoItems.Contains(item.Type) || nInventory.IgnoreItems.Contains(item.Type))
                {
                    if (items.Count >= 50) return -1;
                }
                else
                {
                    var count = 0;
                    foreach (var i in items)
                        if (i.Type == item.Type) count += nInventory.InventoryItems.Find(x => x.ItemType == i.Type).Stacks - i.Count;

                    var slots = 50;
                    var maxCapacity = (slots - items.Count) * nInventory.InventoryItems.Find(x => x.ItemType == item.Type).Stacks + count;
                    if (item.Count > maxCapacity) tail = item.Count - maxCapacity;
                }
                return tail;
            }
            public static void Add(GarbageCan gc, nItem item)
            {

                var items = gc.Inventory;

                if (nInventory.ClothesItems.Contains(item.Type) || nInventory.WeaponsItems.Contains(item.Type) || item.Type == ItemType.CarKey || nInventory.IgnoreItems.Contains(item.Type))
                {
                    items.Add(item);
                }
                else
                {
                    var count = item.Count;
                    for (int i = 0; i < items.Count; i++)
                    {
                        if (i >= items.Count) break;
                        if (items[i].Type == item.Type && items[i].Count < nInventory.InventoryItems.Find(x => x.ItemType == item.Type).Stacks)
                        {
                            var temp = nInventory.InventoryItems.Find(x => x.ItemType == item.Type).Stacks - items[i].Count;
                            if (count < temp) temp = count;
                            items[i].Count += temp;
                            count -= temp;
                        }
                    }

                    while (count > 0)
                    {
                        if (count >= nInventory.InventoryItems.Find(x => x.ItemType == item.Type).Stacks)
                        {
                            items.Add(new nItem(item.Type, nInventory.InventoryItems.Find(x => x.ItemType == item.Type).Stacks, item.Data));
                            count -= nInventory.InventoryItems.Find(x => x.ItemType == item.Type).Stacks;
                        }
                        else
                        {
                            items.Add(new nItem(item.Type, count, item.Data));
                            count = 0;
                        }
                    }
                }
            }
        }

    }
}