Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Nescafe

JsonFileLoader

Здравствуйте, форумчане!
Потихоньку изучаю скриптинг и возник вопрос:

как загружать файл с папки profiles?
Если я правильно понимаю, то нужно отдельно создавать manager в 3_Game, а в 5_mission можно получать информацию только на стороне клиента(мода)
 

Имеется мод с UI, в нем есть правила, они загружались из самого мода, решил попробовать переделать на profiles:

создал скрипт в 3_Game\RulesConfig.c с содержимым:

class RulesConfig
{
	private const static string RulModFolder = "$profile:\\Rules\\";
	private const static string RulConfigName = "rules.json";
	ref array<ref RulesData> data;
	void Load() 
	{
		if (GetGame().IsServer()) 
		{
			if (FileExist(RulModFolder + RulConfigName))
			{ // If config exists, load file
				JsonFileLoader<ref array<ref RulesData>>.JsonLoadFile(RulModFolder + RulConfigName, data);
				Print("[RulesConfig] download");
			}
		}
	}
}
class RulesData {
    string title;
    ref array<string> subrules = new array<string>();
}
// Save config data
ref RulesConfig m_RulesConfig;
// Helper function to return Config data storage object
static RulesConfig GetRulesConfig()
{
	if(!m_RulesConfig)
	{
		Print("[RulesConfig] Init");
		m_RulesConfig = new RulesConfig;
		m_RulesConfig.Load();
	}

	return m_RulesConfig;
};

в скрипте 5_Mission\lobbymenu\interaction\rules

class RulesMenu: ScriptedWidgetEventHandler {
    Widget layoutRoot;
    GridSpacerWidget wrap;

    void RulesMenu(Widget parent) {
        //GetRulesConfig();
        BuildLayout(parent);
        FillRules();
        Print("[GetRulesConfig] show.");
    }

    void BuildLayout(Widget parent) {
        layoutRoot = GetGame().GetWorkspace().CreateWidgets("NM/assets/layouts/lobbymenu/interaction/rules/rules.layout", parent);
        CastTo(wrap, layoutRoot.FindAnyWidget("wrap"));
        layoutRoot.SetHandler(this);
    }

    void FillRules() {
        if (GetRulesConfig().data) {
            Print("[GetRulesConfig] show2");
            foreach(RulesData element: GetRulesConfig().data) {
                string title = element.title;
                TStringArray subrules = element.subrules;
                Widget groupRoot = GetGame().GetWorkspace().CreateWidgets("NM/assets/layouts/lobbymenu/interaction/rules/group.layout", wrap);
                TextWidget m_title = TextWidget.Cast(groupRoot.FindAnyWidget("title"));
                m_title.SetText(title);
                WrapSpacerWidget wrp = WrapSpacerWidget.Cast(groupRoot.FindAnyWidget("wrp"));
                foreach(string elm: subrules) {
                    Widget elementRoot = GetGame().GetWorkspace().CreateWidgets("NM/assets/layouts/lobbymenu/interaction/rules/element.layout", wrp);
                    TextWidget w_title = TextWidget.Cast(elementRoot.FindAnyWidget("title"));
                    w_title.SetText(elm);
                }
            }
        }
    }

    void Show() {
        layoutRoot.Show(true);
        SetFocus(layoutRoot);
    }

    void Hide() {
        layoutRoot.Show(false);
        SetFocus(null);
    }
}

в скрипте 5_Mission\missions\MissionServer.c:
 

modded class MissionServer
{
	override void OnInit()
	{
		GetRulesConfig();
		super.OnInit();
		Print("[GetRulesConfig] OnInit - Loaded config successfully.");
	}
}

 

но никак не получается получить данные с 3_game, осложнение для меня это :ref вместе с array(еще не совсем все это понимаю)
Прошу подсказать как сделать, какие ошибки, а желательно написать как будет правильно, чтобы было проще понять на примере
Не кидайтесь тапками, я только учусь:3

Edited by Nescafe (see edit history)

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

не вникая в кучу инфы в теме, скажу сразу - слишком сложную задачу в теме вы поставили.

JsonFileLoader лишь загружает или сохраняет json файл по указанному формату класса в переменную или из нее. Все. Соответственно где будет эта самая переменная -* там будут и данные, считанные из json файла. Читаем, например, на сервере, в переменную определенного класса своего - на стороне сервера в этой переменной именно он и будет. Что с этим делать дальше смотрите сами. Хотите используйте в другом скрипте, хотите - передавайте на сторону клиента через rpc тот же. Ваше дело.

Собственно rpc буквально зависит от того, что и как вы строите в своей работе. Есть штатные rpc

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Share this post


Link to post
Share on other sites



  • 0
8 минут назад, 123new сказал:

не вникая в кучу инфы в теме, скажу сразу - слишком сложную задачу в теме вы поставили.

JsonFileLoader лишь загружает или сохраняет json файл по указанному формату класса в переменную или из нее. Все. Соответственно где будет эта самая переменная -* там будут и данные, считанные из json файла. Читаем, например, на сервере, в переменную определенного класса своего - на стороне сервера в этой переменной именно он и будет. Что с этим делать дальше смотрите сами. Хотите используйте в другом скрипте, хотите - передавайте на сторону клиента через rpc тот же. Ваше дело.

Собственно rpc буквально зависит от того, что и как вы строите в своей работе. Есть штатные rpc

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Спасибо за ответ!
Смотря примеры других работы, увидел, что там читаются просто переменные и то на стороне сервера, не передаваясь клиенту, поэтому тут видимо гараздо сложнее будет передать текст да еще и с array на сторону клиента, наверно проще оставить текст правил и т.п. в самом .pbo и потом уже редактировать при надобности.

Share this post


Link to post
Share on other sites
  • 0
55 минут назад, Nescafe сказал:

Спасибо за ответ!
Смотря примеры других работы, увидел, что там читаются просто переменные и то на стороне сервера, не передаваясь клиенту, поэтому тут видимо гараздо сложнее будет передать текст да еще и с array на сторону клиента, наверно проще оставить текст правил и т.п. в самом .pbo и потом уже редактировать при надобности.

ну это кому как проще. Например, я в NightZone моде своем передаю данные по настройкам на клиент от сервера при коннекте к серверу в свой класс. И уже в своем классе оперирую с данными. Да, все это там в 4_World происходит, но кто сказал что нельзя комбинировать? например создать класс в 4_World и получить данные в переменную, а из 5_Mission например уже обращаться к функции своего класса, что создана в 4_World? Импровизируйте

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.