Помогите Нужна помощь новичку, пишу плагин ...

pagan

21 Фев 2023
94
10
17
Друзья я начинающий плагописец :)) прошу строго не судить, очень нужна ваша помощь
в плагине необходимо создать невидимый контейнер, открыть его вместе с инвентарём игрока,
переложить в него лут (это камень дерево и фрагменты металла) и при закрытии записать в дата файл,
при повторном открытии взять данные из дата файла и положить опять в контейнер (не инвентарь)
И вроде задача простая но я не понимаю куда копать и что делать уже неделю бьюсь пересмотрел чужие плагины
прочитал кучу манов, как создавать объект понял но дальше полный тупик...
C#:
    public class test : RustPlugin
    {
        //Это кнопка
        string Gui_ButBack = "[{\"name\":\"Bootionhorse\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"material\":\"\",\"color\":\"1 0 0 0.3492877\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.65 0.02333333\",\"anchormax\":\"0.835625 0.1477778\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"BtnBack\",\"parent\":\"Bootionhorse\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"Closebox\",\"color\":\"0 0 0 0.8352941\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02356893 0.02999994\",\"anchormax\":\"0.9831649 0.9642856\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"txtBootBack\",\"parent\":\"BtnBack\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"NEXT\",\"fontSize\":24,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.03521138 0.2199999\",\"anchormax\":\"0.9788731 0.8999999\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]}]";

        //Создать и открыть ящик по команде
        [ChatCommand("opbox")]//opbox
        private void openbox(BasePlayer player)
        {

            var pos = new Vector3(player.transform.position.x, player.transform.position.y - 1, player.transform.position.z);
            string box = "assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab";
            var view = GameManager.server.CreateEntity(box, pos) as StorageContainer;
            view.GetComponent<GroundWatch>().enabled = true;
            //Просто игрался с параметрами
            if (!view) return;
            view.limitNetworking = true;
            view.transform.position = pos;
            view.OwnerID = player.userID;
            view.name = "mybox";
            view.maxStackSize = 4;
            view.inventorySlots = 30;
            view.enableSaving = true;
            view.buildingID = 123456789;
            view.Spawn();
            //view.inventory.entityOwner = view;
            CuiHelper.AddUi(player, Gui_ButBack);
            timer.In(0.1f, delegate ()
            {
                view.PlayerOpenLoot(player);
            });

        //По нажатию кнопки закрыть инвентарь и записать положенный лут в дата файл
        //А именно фрагменты метала, дерево, камень = название и количесво
        }
        private BaseEntity FindBox(string boxNameOrId)
        {
            // Не работает уже не знаю как ((
            BaseEntity box = BaseNetworkable.serverEntities.Find(e => e.name.Contains(boxNameOrId));
            if (box != null)
            {
                return box;
            }

            uint boxId;
            if (uint.TryParse(boxNameOrId, out boxId))
            {
                box = BaseNetworkable.serverEntities.Find(e => e.net.ID == boxId);
            }

            return box;
        }
Заранее спасибо за помощь..
 
Друзья я начинающий плагописец :)) прошу строго не судить, очень нужна ваша помощь
в плагине необходимо создать невидимый контейнер, открыть его вместе с инвентарём игрока,
переложить в него лут (это камень дерево и фрагменты металла) и при закрытии записать в дата файл,
при повторном открытии взять данные из дата файла и положить опять в контейнер (не инвентарь)
И вроде задача простая но я не понимаю куда копать и что делать уже неделю бьюсь пересмотрел чужие плагины
прочитал кучу манов, как создавать объект понял но дальше полный тупик...
C#:
    public class test : RustPlugin
    {
        //Это кнопка
        string Gui_ButBack = "[{\"name\":\"Bootionhorse\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"material\":\"\",\"color\":\"1 0 0 0.3492877\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.65 0.02333333\",\"anchormax\":\"0.835625 0.1477778\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"BtnBack\",\"parent\":\"Bootionhorse\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"Closebox\",\"color\":\"0 0 0 0.8352941\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02356893 0.02999994\",\"anchormax\":\"0.9831649 0.9642856\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"txtBootBack\",\"parent\":\"BtnBack\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"NEXT\",\"fontSize\":24,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.03521138 0.2199999\",\"anchormax\":\"0.9788731 0.8999999\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]}]";

        //Создать и открыть ящик по команде
        [ChatCommand("opbox")]//opbox
        private void openbox(BasePlayer player)
        {

            var pos = new Vector3(player.transform.position.x, player.transform.position.y - 1, player.transform.position.z);
            string box = "assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab";
            var view = GameManager.server.CreateEntity(box, pos) as StorageContainer;
            view.GetComponent<GroundWatch>().enabled = true;
            //Просто игрался с параметрами
            if (!view) return;
            view.limitNetworking = true;
            view.transform.position = pos;
            view.OwnerID = player.userID;
            view.name = "mybox";
            view.maxStackSize = 4;
            view.inventorySlots = 30;
            view.enableSaving = true;
            view.buildingID = 123456789;
            view.Spawn();
            //view.inventory.entityOwner = view;
            CuiHelper.AddUi(player, Gui_ButBack);
            timer.In(0.1f, delegate ()
            {
                view.PlayerOpenLoot(player);
            });

        //По нажатию кнопки закрыть инвентарь и записать положенный лут в дата файл
        //А именно фрагменты метала, дерево, камень = название и количесво
        }
        private BaseEntity FindBox(string boxNameOrId)
        {
            // Не работает уже не знаю как ((
            BaseEntity box = BaseNetworkable.serverEntities.Find(e => e.name.Contains(boxNameOrId));
            if (box != null)
            {
                return box;
            }

            uint boxId;
            if (uint.TryParse(boxNameOrId, out boxId))
            {
                box = BaseNetworkable.serverEntities.Find(e => e.net.ID == boxId);
            }

            return box;
        }
Заранее спасибо за помощь..
почекай рюкзаки с юмода, там будет тебе ответ
 
  • Мне нравится
Реакции: pagan
почекай рюкзаки с юмода, там будет тебе ответ
Да чекал :)) И bank чекал, но ничего не понял, да конечно буду дальше смотреть, просто эта работа с объектами тёмный лес, думал кто пнёт в нужном направлении, спасибо за ответ :)
 
Ну я же написал :))
Не совсем понятно, что ты в итоге хочешь. Ну создать контейнер и переложить туда ресурсы можно. А дальше что? Каков итог у функциональности?
Ну я же написал :)) что будет попадать в дата файл потом извлекаться, по времени рассчитываться и вычитаться, это часть плагина, с остальным нет проблем вроде всё получается, но описывать его тут только всё запутает, с объектами я не знаком от слова совсем пытаюсь понять но инфы очень мало или очень старая :( Функциональность .. надо взять у пользователя ресурсы (он сам их отдаёт) и сохранить, когда он приходит в следующий раз идёт перерасчет и он открывает уже с меньшим количеством, может доложить или забрать.. Этот блок имитируют потребление ресурсов....
Я не очень понял вопроса ..
 
что будет попадать в дата файл потом извлекаться
в этом есть нужда? если вы включили сохранение контейнера:
далее просто при
когда он приходит в следующий раз
и забираете к примеру 30% всего что находится в контейнере, если я конечно верно понял

открывает уже с меньшим количеством
 
:( Функциональность .. надо взять у пользователя ресурсы (он сам их отдаёт) и сохранить, когда он приходит в следующий раз идёт перерасчет и он открывает уже с меньшим количеством, может доложить или забрать.. Этот блок имитируют потребление ресурсов....
Создавай json файл для хранилища, в него пишешь все, что игрок отдал, запоминаешь контейнер и игрока. Когда открывает снова, берешь данные с json, пересчитываешь, любым способом корректируешь нужное количество, возвращаешь в контейнер. Далее снова после взаимодействия игрока с контейнером обновляешь данные в json.
Лично я так вижу решение твоей проблемы, могу ошибаться.
 
что будет попадать в дата файл потом извлекаться
== в этом есть нужда? если вы включили сохранение контейнера:
Да, потому что контейнер может пропасть или ещё чего, а особенно не хотелось бы захламлять сервер лишними объектами
Но в том то и дело я не могу его открыть, понимаю что нужно использовать find или открывать по имени или id, но в коде есть в конце функция открытия но выдаёт ошибку:
// Не работает уже не знаю как ((
BaseEntity box = BaseNetworkable.serverEntities.Find(e => e.name.Contains(boxNameOrId));
if (box != null)

==Если я несу чушь скажи ьуь
Нет не несёшь, и спасибо тебе за ответ, я уже от отчаянья думаю как то забирать из инвентаря из созданного оконного интерфейса, но это будет крайне не удобно игроку :(
 
Создавай json файл для хранилища, в него пишешь все, что игрок отдал, запоминаешь контейнер и игрока. Когда открывает снова, берешь данные с json, пересчитываешь, любым способом корректируешь нужное количество, возвращаешь в контейнер. Далее снова после взаимодействия игрока с контейнером обновляешь данные в json.
Лично я так вижу решение твоей проблемы, могу ошибаться.
Ну как я писал выше я не могу открыть контейнер который создал, в этом и основная проблема я просто не знаю и не понимаю как к нему обратится, да ещё это делается с хука (функции) графической кнопке где если вводишь любой другой параметр кроме ConsoleSystem.Arg arg
[ConsoleCommand("Closebox")]

//StorageContainer view,
void Closeb(ConsoleSystem.Arg arg, StorageContainer view)
Кнопка перерастает работать
да и если просто создавать контейнер и заполнять из json а потом удалять будет надёжней и мусора на сервере будет меньше, если не прав поправьте :)) Спасибо за участие :)))))
 
Ну как я писал выше я не могу открыть контейнер который создал, в этом и основная проблема я просто не знаю и не понимаю как к нему обратится, да ещё это делается с хука (функции) графической кнопке где если вводишь любой другой параметр кроме ConsoleSystem.Arg arg
[ConsoleCommand("Closebox")]

//StorageContainer view,
void Closeb(ConsoleSystem.Arg arg, StorageContainer view)
Кнопка перерастает работать
да и если просто создавать контейнер и заполнять из json а потом удалять будет надёжней и мусора на сервере будет меньше, если не прав поправьте :)) Спасибо за участие :)))))
Ты хочешь что бы по команде open box открывался созданный тобой сундук?(Если да, то игрок должен отправлять на сервер RPC для открытия целевого контейнера, вроде так, хотя точно хз, там надо более предметно смотреть)
Касательно поиска у всех BaseNetworkable(то от чего BaseEntity наследуется, есть netID уникальный, искать можешь по нему
А ваще можешь полазить в серверных дллках через dotpeek/dnspy, думаю понять что-то может помочь
 
  • Мне нравится
Реакции: pagan
Друзья я начинающий плагописец :)) прошу строго не судить, очень нужна ваша помощь
в плагине необходимо создать невидимый контейнер, открыть его вместе с инвентарём игрока,
переложить в него лут (это камень дерево и фрагменты металла) и при закрытии записать в дата файл,
при повторном открытии взять данные из дата файла и положить опять в контейнер (не инвентарь)
И вроде задача простая но я не понимаю куда копать и что делать уже неделю бьюсь пересмотрел чужие плагины
прочитал кучу манов, как создавать объект понял но дальше полный тупик...
C#:
    public class test : RustPlugin
    {
        //Это кнопка
        string Gui_ButBack = "[{\"name\":\"Bootionhorse\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"material\":\"\",\"color\":\"1 0 0 0.3492877\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.65 0.02333333\",\"anchormax\":\"0.835625 0.1477778\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"BtnBack\",\"parent\":\"Bootionhorse\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"Closebox\",\"color\":\"0 0 0 0.8352941\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.02356893 0.02999994\",\"anchormax\":\"0.9831649 0.9642856\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]},{\"name\":\"txtBootBack\",\"parent\":\"BtnBack\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"NEXT\",\"fontSize\":24,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.03521138 0.2199999\",\"anchormax\":\"0.9788731 0.8999999\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}]}]";

        //Создать и открыть ящик по команде
        [ChatCommand("opbox")]//opbox
        private void openbox(BasePlayer player)
        {

            var pos = new Vector3(player.transform.position.x, player.transform.position.y - 1, player.transform.position.z);
            string box = "assets/prefabs/deployable/woodenbox/woodbox_deployed.prefab";
            var view = GameManager.server.CreateEntity(box, pos) as StorageContainer;
            view.GetComponent<GroundWatch>().enabled = true;
            //Просто игрался с параметрами
            if (!view) return;
            view.limitNetworking = true;
            view.transform.position = pos;
            view.OwnerID = player.userID;
            view.name = "mybox";
            view.maxStackSize = 4;
            view.inventorySlots = 30;
            view.enableSaving = true;
            view.buildingID = 123456789;
            view.Spawn();
            //view.inventory.entityOwner = view;
            CuiHelper.AddUi(player, Gui_ButBack);
            timer.In(0.1f, delegate ()
            {
                view.PlayerOpenLoot(player);
            });

        //По нажатию кнопки закрыть инвентарь и записать положенный лут в дата файл
        //А именно фрагменты метала, дерево, камень = название и количесво
        }
        private BaseEntity FindBox(string boxNameOrId)
        {
            // Не работает уже не знаю как ((
            BaseEntity box = BaseNetworkable.serverEntities.Find(e => e.name.Contains(boxNameOrId));
            if (box != null)
            {
                return box;
            }

            uint boxId;
            if (uint.TryParse(boxNameOrId, out boxId))
            {
                box = BaseNetworkable.serverEntities.Find(e => e.net.ID == boxId);
            }

            return box;
        }
Заранее спасибо за помощь..
Привет! Рад видеть, что ты так старательно работаешь над своим плагином! Вот несколько советов, которые могут помочь тебе с задачей:

1. Для хранения лута и работы с файлами тебе понадобится использовать данные. Рекомендую посмотреть в сторону работы с данными в Unity, например, использовать PlayerPrefs или сериализацию.

2. Для создания невидимого контейнера, который будет отображаться только при определенных условиях, можешь использовать SetFlag, чтобы управлять видимостью контейнера.

3. Для записи лута в файл и последующего его извлечения при повторном открытии контейнера, можешь создать класс для хранения информации о луте (какие предметы и в каком количестве), сериализовать его и записать в файл, затем при открытии контейнера считать информацию из файла и восстановить лут.

Надеюсь, эти советы помогут тебе двигаться дальше с реализацией своего плагина. Удачи! Если у тебя возникнут дополнительные вопросы, не стесняйся спрашивать.

( ответ от чат гпт )
 
  • Мне нравится
Реакции: pagan
Спасибо за ответы вы мне очень помогли, я всё ещё сижу за кодами :)) контейнер я открываю и даже могу в него что то положить:
1710761895596.png
Я его снова открыть не могу :))) Каждый раз как я понимаю открывается новый, если у меня получится я обязательно выложу :))
Всем просто от души что откликнулись, благодарю друзья :))
 
Каждый раз как я понимаю открывается новый
Потому что при создании контейнера, тебе нужно ему присвоить id или имя, которое будет храниться именно за этим контейнером и игроком. При повторном открытии считываешь игрока и принадлежащий ему контейнер, открываешь нужный контейнер, содержимое также подгружаешь из файла.
 
Так вроде это делаю:

C#:
            view.limitNetworking = true;
            view.transform.position = pos;
            view.OwnerID = player.userID;
            //!!!!!!!!!!!!!!!!!!!!!!!!
            view.name = "mybox";
           //!!!!!!!!!!!!!!!!!!!!!!!!!
            view.maxStackSize = 4;
            view.inventorySlots = 30;
            view.enableSaving = true;
            view.buildingID = 123456789;
            view.Spawn();
Я не понимаю как его найти и открыть :)))
 
Опиши свой класс взаимодействия с дата файлом, там сделай метод преобразующий твой список предметов из этого бокса в список объектов класса (назовем его PluginItem), а так же метод образования предметов из списка сохраненных объектов класса PluginItem. при закрытии сохраняй дата файл в виде словаря, где ключ это steamID игрока а value это List<PluginItem>,
при повторном открытии используй созданный ранее метод для образования предметов в созданном новом боксе.
---
Не обязательно привязывать игрока к какому-то определенному ящику, ты можешь его создавать при взаимодействии и удалять сразу после закрытия (используй для этого хуки oxide)
(это вкратце, я многое опустил)
 
  • Мне нравится
Реакции: pagan
Так вроде это делаю:

C#:
            view.limitNetworking = true;
            view.transform.position = pos;
            view.OwnerID = player.userID;
            //!!!!!!!!!!!!!!!!!!!!!!!!
            view.name = "mybox";
           //!!!!!!!!!!!!!!!!!!!!!!!!!
            view.maxStackSize = 4;
            view.inventorySlots = 30;
            view.enableSaving = true;
            view.buildingID = 123456789;
            view.Spawn();
Я не понимаю как его найти и открыть :)))
Попробуй использовать уникальный идентификатор или имя для поиска контейнера при повторном открытии. В твоем случае, когда создаешь контейнер, задай ему уникальное имя, которое будет использоваться для его последующего поиска и открытия. Например, можно использовать имя игрока и уникальный идентификатор контейнера вместе. При открытии контейнера снова, найди его по этому имени и уникальному идентификатору, затем открой его содержимое. Надеюсь, это поможет тебе справиться с проблемой!
 
Попробуй использовать уникальный идентификатор или имя для поиска контейнера при повторном открытии. В твоем случае, когда создаешь контейнер, задай ему уникальное имя, которое будет использоваться для его последующего поиска и открытия. Например, можно использовать имя игрока и уникальный идентификатор контейнера вместе. При открытии контейнера снова, найди его по этому имени и уникальному идентификатору, затем открой его содержимое. Надеюсь, это поможет тебе справиться с проблемой!
gpt
 
Привет! Если у тебя возникли проблемы с поиском и повторным открытием контейнера, я могу дать тебе некоторые рекомендации.

1. Уникальное имя: Как уже упоминалось, попробуй присвоить каждому контейнеру уникальное имя, которое будет использоваться для их идентификации. Таким образом, когда тебе понадобится открыть определенный контейнер, ты сможешь найти его по этому имени.

2. Уникальный идентификатор: Также можно использовать уникальный идентификатор для каждого контейнера, чтобы облегчить их поиск и взаимодействие. При создании контейнера задай ему уникальный идентификатор, который будешь использовать для последующего поиска.

3. Запись и поиск данных: При открытии контейнера, сохраняй информацию об имени или идентификаторе контейнера в файле данных, чтобы при следующем открытии ты мог найти и открыть нужный контейнер.

Надеюсь, эти советы помогут тебе лучше управлять поиском и открытием контейнеров в твоем плагине. Удачи с дальнейшей разработкой! Если у тебя есть дополнительные вопросы, не стесняйся спрашивать.
 
Привет! Если у тебя возникли проблемы с поиском и повторным открытием контейнера, я могу дать тебе некоторые рекомендации.

1. Уникальное имя: Как уже упоминалось, попробуй присвоить каждому контейнеру уникальное имя, которое будет использоваться для их идентификации. Таким образом, когда тебе понадобится открыть определенный контейнер, ты сможешь найти его по этому имени.

2. Уникальный идентификатор: Также можно использовать уникальный идентификатор для каждого контейнера, чтобы облегчить их поиск и взаимодействие. При создании контейнера задай ему уникальный идентификатор, который будешь использовать для последующего поиска.

3. Запись и поиск данных: При открытии контейнера, сохраняй информацию об имени или идентификаторе контейнера в файле данных, чтобы при следующем открытии ты мог найти и открыть нужный контейнер.

Надеюсь, эти советы помогут тебе лучше управлять поиском и открытием контейнеров в твоем плагине. Удачи с дальнейшей разработкой! Если у тебя есть дополнительные вопросы, не стесняйся спрашивать.
зачем ты вставляешь сюда ответы от гпт?
 
Активность
Пока никто не печатает сообщение

Похожие темы