• Хостинг игровых серверов

    Максимальная производительность для ваших игровых серверов!

    Заказать сейчас

Помогите Вопрос по моему плагину на C#

a1exlarionov

21 Мар 2023
101
0
6
Знающие люди, помогите не могу найти откуда ошибка
Вот сам плагин:

using System.Collections.Generic;
using System.Text;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;

namespace Oxide.Plugins
{
[Info("CustomMenu", "YourName", "1.0.0")]
[Description("Добавляет пользовательское меню с вкладками и иконками.")]
class CustomMenu : RustPlugin
{
private const string MenuParentName = "CustomMenu";
private const string MenuButtonName = "CustomMenuButton";
private const string TabContainerName = "CustomTabContainer";
private const string TabButtonName = "CustomTabButton";
private const string TabIconName = "CustomTabIcon";
private const string TabTextName = "CustomTabText";

private readonly Dictionary<BasePlayer, CuiElementContainer> _menuElements = new Dictionary<BasePlayer, CuiElementContainer>();

private void Init()
{
foreach (var player in BasePlayer.activePlayerList)
{
CreateMenuElements(player);
}
}

private void Unload()
{
foreach (var player in BasePlayer.activePlayerList)
{
DestroyMenuElements(player);
}
}

private void OnPlayerInit(BasePlayer player)
{
CreateMenuElements(player);
}

private void OnPlayerDisconnected(BasePlayer player)
{
DestroyMenuElements(player);
}

private void CreateMenuElements(BasePlayer player)
{
if (_menuElements.ContainsKey(player)) return;

var menuContainer = new CuiElementContainer();

// Добавляем кнопку главного меню
menuContainer.Add(new CuiButtonComponent
{
Button =
{
Command = "custommenu.open",
Color = "0.5 0.5 0.5 0.7"
},
RectTransform =
{
AnchorMin = "0.01 0.85",
AnchorMax = "0.11 0.95"
},
Text =
{
Text = "Меню",
FontSize = 18,
Align = TextAnchor.MiddleCenter
}
}, MenuParentName, MenuButtonName);

_menuElements[player] = menuContainer;
CuiHelper.AddUi(player, menuContainer);
}

private void DestroyMenuElements(BasePlayer player)
{
CuiElement menuContainer;
if (!_menuElements.TryGetValue(player, out menuContainer)) return;

for (var i = 0; i < 15; i++)
{
var yPos = 0.8f - i * 0.05f;
var tabButtonName = TabButtonName + i.ToString();
var tabIconName = TabIconName + i.ToString();
var tabTextName = TabTextName + i.ToString();

menuContainer.Remove(tabButtonName);
menuContainer.Remove(tabIconName);
menuContainer.Remove(tabTextName);
}

menuContainer.Remove(TabContainerName);
_menuElements.Remove(player);
}

[ConsoleCommand("custommenu.tab")]
private void OpenTab(ConsoleSystem.Arg arg)
{
var player = arg.Player();
if (player == null) return;

int tabIndex;
if (int.TryParse(arg.cmd.Name.Substring(10), out tabIndex))
{
// код, который использует переменную tabIndex
}
else
{
return;
}

CuiHelper.DestroyUi(player, MenuParentName, TabContainerName);
CuiHelper.AddUi(player, new CuiElementContainer());
SendReply(player, string.Format("Вы открыли вкладку {0}.", tabIndex + 1));
}

[ChatCommand("custommenu.open")]
private void OpenMenu(BasePlayer player)
{
var tabContainer = new CuiElementContainer();

for (var i = 0; i < 15; i++)
{
var yPos = 0.8f - i * 0.05f;

tabContainer.Add(new CuiButtonComponent
{
Button =
{
Command = "custommenu.tab" + i,
Color = "0.5 0.5 0.5 0.7"
},
RectTransform =
{
AnchorMin = string.Format("0.01 {0:F}", yPos),
AnchorMax = string.Format("0.11 {0:F}", yPos + 0.04f)
},
Text =
{
Text = (i + 1).ToString(),
FontSize = 18,
Align = TextAnchor.MiddleCenter
}
}, MenuParentName, TabButtonName + i.ToString());

tabContainer.Add(new CuiElement
{
Name = TabIconName + i.ToString(),
Parent = MenuParentName,
Components =
{
new CuiRawImageComponent
{
Png = FileStorage.server.GetServerFile(string.Format("custommenu/icon{0}.png", i)),
Color = "1 1 1 1",
Sprite = "assets/content/textures/generic/fulltransparent.tga"
},
new CuiRectTransformComponent
{
AnchorMin = string.Format("0.12 {0:F}", yPos),
AnchorMax = string.Format("0.22 {0:F}", yPos + 0.04f)
}
}
});

tabContainer.Add(new CuiLabel
{
Text =
{
Text = string.Format("Вкладка {0}", i + 1),
FontSize = 16,
Align = TextAnchor.MiddleLeft
},
RectTransform =
{
AnchorMin = string.Format("0.23 {0:F}", yPos),
AnchorMax = string.Format("0.6 {0:F}", yPos + 0.04f)
}
}, MenuParentName, TabTextName + i.ToString());
}

_menuElements[player].Add(tabContainer, MenuParentName, TabContainerName);
CuiHelper.AddUi(player, _menuElements[player]);
}
}
}

И вот ошибка:

Error while compiling: CustomMenu.cs(189,39): error CS1503: Argument `#1' cannot convert `Oxide.Game.Rust.Cui.CuiElementContainer' expression to type `Oxide.Game.Rust.Cui.CuiButton'
 
Ошибка возникает на строке 189, где вы используете метод Add для добавления tabContainer. Вместо этого вы должны использовать метод AddUi() для добавления контейнера tabContainer в интерфейс пользователя (UI). Попробуйте заменить строку:

CuiHelper.AddUi(player, tabContainer);

на:

CuiHelper.AddUi(player, _menuElements[player]);
 
Ошибка возникает на строке 189, где вы используете метод Add для добавления tabContainer. Вместо этого вы должны использовать метод AddUi() для добавления контейнера tabContainer в интерфейс пользователя (UI). Попробуйте заменить строку:

CuiHelper.AddUi(player, tabContainer);

на:

CuiHelper.AddUi(player, _menuElements[player]);
Нет всё осталось также
 
Нет всё осталось также
Попробуйте изменить код следующим образом:

Код:
public void ShowMainMenu(BasePlayer player)
{
    if (!_menuElements.ContainsKey(player))
    {
        var elements = new CuiElementContainer();

        // Create main container
        var mainContainer = new CuiPanel
        {
            Image = {
                Color = "0.1 0.1 0.1 0.8"
            },
            RectTransform = {
                AnchorMin = "0.4 0.4",
                AnchorMax = "0.6 0.6"
            }
        };

        // Create tab container
        var tabContainer = new CuiPanel
        {
            RectTransform = {
                AnchorMin = "0 0.8",
                AnchorMax = "1 1"
            }
        };
        var tabElements = new CuiElementContainer();
        // Create tabs
        var tabs = new[]
        {
            new {
                Name = "tab1",
                Title = "Tab 1",
                Commands = new[] {
                    "say Hello from tab 1!",
                    "echo Hello from tab 1!"
                }
            },
            new {
                Name = "tab2",
                Title = "Tab 2",
                Commands = new[] {
                    "say Hello from tab 2!",
                    "echo Hello from tab 2!"
                }
            }
        };
        var tabButtons = new CuiButton[tabs.Length];
        for (var i = 0; i < tabs.Length; i++)
        {
            var tab = tabs[i];

            // Create button
            var button = new CuiButton
            {
                Button = {
                    Color = "0.1 0.1 0.1 1",
                    Command = string.Join(";", tab.Commands),
                    FadeIn = 0.2f
                },
                RectTransform = {
                    AnchorMin = $"{i * 0.25f} 0",
                    AnchorMax = $"{(i + 1) * 0.25f} 1"
                },
                Text = {
                    Text = tab.Title,
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 18,
                    Font = "robotocondensed-regular.ttf"
                }
            };
            tabButtons[i] = button;
            tabElements.Add(button);

            // Create tab content
            var content = new CuiPanel
            {
                RectTransform = {
                    AnchorMin = "0 0",
                    AnchorMax = "1 0.8"
                },
                Image = {
                    Color = "0.2 0.2 0.2 1"
                }
            };
            var contentElements = new CuiElementContainer();
            contentElements.Add(new CuiLabel
            {
                RectTransform = {
                    AnchorMin = "0 0.9",
                    AnchorMax = "1 1"
                },
                Text = {
                    Text = $"Content for {tab.Title}",
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 18,
                    Font = "robotocondensed-regular.ttf"
                }
            });
            contentElements.Add(new CuiButton
            {
                Button = {
                    Color = "0.1 0.1 0.1 1",
                    Command = "say Hello from content!",
                    FadeIn = 0.2f
                },
                RectTransform = {
                    AnchorMin = "0.25 0.25",
                    AnchorMax = "0.75 0.75"
                },
                Text = {
                    Text = "Click me!",
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 18,
                    Font = "robotocondensed-regular.ttf"
                }
            });
            content.Elements.AddRange(contentElements);
            elements.Add(content, mainContainer, tabContainer);
        }
        tabElements.AddRange(tabButtons);
        elements.Add(tabContainer, mainContainer);
        _menuElements.Add(player, elements);
    }
    CuiHelper.DestroyUi(player, "mainMenu");
    CuiHelper.AddUi(player, _menuElements[player]);
}

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

Код:
public void ShowMainMenu(BasePlayer player)
{
    if (!_menuElements.ContainsKey(player))
    {
        var elements = new CuiElementContainer();

        // Create main container
        var mainContainer = new CuiPanel
        {
            Image = {
                Color = "0.1 0.1 0.1 0.8"
            },
            RectTransform = {
                AnchorMin = "0.4 0.4",
                AnchorMax = "0.6 0.6"
            }
        };

        // Create tab container
        var tabContainer = new CuiPanel
        {
            RectTransform = {
                AnchorMin = "0 0.8",
                AnchorMax = "1 1"
            }
        };
        var tabElements = new CuiElementContainer();
        // Create tabs
        var tabs = new[]
        {
            new {
                Name = "tab1",
                Title = "Tab 1",
                Commands = new[] {
                    "say Hello from tab 1!",
                    "echo Hello from tab 1!"
                }
            },
            new {
                Name = "tab2",
                Title = "Tab 2",
                Commands = new[] {
                    "say Hello from tab 2!",
                    "echo Hello from tab 2!"
                }
            }
        };
        var tabButtons = new CuiButton[tabs.Length];
        for (var i = 0; i < tabs.Length; i++)
        {
            var tab = tabs[i];

            // Create button
            var button = new CuiButton
            {
                Button = {
                    Color = "0.1 0.1 0.1 1",
                    Command = string.Join(";", tab.Commands),
                    FadeIn = 0.2f
                },
                RectTransform = {
                    AnchorMin = $"{i * 0.25f} 0",
                    AnchorMax = $"{(i + 1) * 0.25f} 1"
                },
                Text = {
                    Text = tab.Title,
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 18,
                    Font = "robotocondensed-regular.ttf"
                }
            };
            tabButtons[i] = button;
            tabElements.Add(button);

            // Create tab content
            var content = new CuiPanel
            {
                RectTransform = {
                    AnchorMin = "0 0",
                    AnchorMax = "1 0.8"
                },
                Image = {
                    Color = "0.2 0.2 0.2 1"
                }
            };
            var contentElements = new CuiElementContainer();
            contentElements.Add(new CuiLabel
            {
                RectTransform = {
                    AnchorMin = "0 0.9",
                    AnchorMax = "1 1"
                },
                Text = {
                    Text = $"Content for {tab.Title}",
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 18,
                    Font = "robotocondensed-regular.ttf"
                }
            });
            contentElements.Add(new CuiButton
            {
                Button = {
                    Color = "0.1 0.1 0.1 1",
                    Command = "say Hello from content!",
                    FadeIn = 0.2f
                },
                RectTransform = {
                    AnchorMin = "0.25 0.25",
                    AnchorMax = "0.75 0.75"
                },
                Text = {
                    Text = "Click me!",
                    Align = TextAnchor.MiddleCenter,
                    FontSize = 18,
                    Font = "robotocondensed-regular.ttf"
                }
            });
            content.Elements.AddRange(contentElements);
            elements.Add(content, mainContainer, tabContainer);
        }
        tabElements.AddRange(tabButtons);
        elements.Add(tabContainer, mainContainer);
        _menuElements.Add(player, elements);
    }
    CuiHelper.DestroyUi(player, "mainMenu");
    CuiHelper.AddUi(player, _menuElements[player]);
}

Этот код похож на ваш, но я добавил использование CuiElementContainer для управления контейнерами и элементами интерфейса. Это может помочь избежать ошибок, связанных с добавлением элементов внутри контейнеров. Если это не помогает, пожалуйста, предоставьте весь код, чтобы я мог более точно определить причину ошибки.
С какой строки начать изменения?
 
С какой строки начать изменения?
Изменения нужно внести весь код целиком. Я предоставил новую версию метода ShowMainMenu с использованием CuiElementContainer для управления контейнерами и элементами интерфейса. Вы можете скопировать и вставить этот код в вашу программу. Не забудьте импортировать CuiElementContainer в ваш файл.
 
Можешь предоставить весь изменённый код
Изменения нужно внести весь код целиком. Я предоставил новую версию метода ShowMainMenu с использованием CuiElementContainer для управления контейнерами и элементами интерфейса. Вы можете скопировать и вставить этот код в вашу программу. Не забудьте импортировать CuiElementContainer в ваш файл.
 
CuiHelper.DestroyUi(player, MenuParentName, TabContainerName); Не может принимать 3 аргумента, только 2.
Исправишь это, вылезет еще ошибка по tabContainer.Add(new CuiButtonComponent
Возможно еще все что связано с этим menuContainer.Remove(tabButtonName);
1682427493791.png
 
Активность
Пока никто не печатает сообщение