???
Математика на уровне МГУ

Показано с 1 по 8 из 8

Тема: [Скрипт] Сообщение на экран и в чат для оффлана и онлайна

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #6

    Re: [Скрипт] Сообщение на экран и в чат для оффлана и онлайна

    Ну тогда уже и я отмечусь

    Класс для работы с языками

    Скрытый текст:
    Код:
        internal class LanguageManager
        {
            public string defaultLanguage;
            public IGamePlay gamePlay;
            public Dictionary<string, Dictionary<string, string>> lines = new Dictionary<string, Dictionary<string, string>>();
            public LanguageManager(IGamePlay gamePlay, string defaultLanguage, string langFolderPath)
            {
                this.defaultLanguage = defaultLanguage;
                this.gamePlay = gamePlay;
                //string fullPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), langFolderPath);
                //load(fullPath);
                load(langFolderPath);
            }
    
            public string GetString(string msgKey, string language)
            {
                string retval = msgKey;
                if (!lines.ContainsKey(language))
                {
                    language = defaultLanguage;
                }
                if (lines.ContainsKey(language) && lines[language].ContainsKey(msgKey))
                {
                    retval = lines[language][msgKey];
                }
                return retval;
            }
    
            public void SendMessageToAll(string msgKey, SendMsgTarget target, params string[] parameters)
            {
                Player[] players = gamePlay.gpRemotePlayers();
                if (players != null)
                {
                    send(players, msgKey, target, parameters);
                }
            }
    
            public void SendMessageToArmy(string msgKey, int army, SendMsgTarget target, params string[] parameters)
            {
                Player[] players = gamePlay.gpRemotePlayers();
                List<Player> acceptedPlayers = new List<Player>();
                if (players != null)
                {
                    foreach (Player player in players)
                    {
                        if (player.Army() == army) acceptedPlayers.Add(player);
                    }
                    if (acceptedPlayers.Count > 0)
                    {
                        send(acceptedPlayers.ToArray(), msgKey, target, parameters);
                    }
                }
            }
    
            public void SendMessageToPlayers(string msgKey, Player[] players, SendMsgTarget target, params string[] parameters)
            {
                if (players != null)
                {
                    send(players, msgKey, target, parameters);
                }
            }
    
            private void send(Player[] players, string msgKey, SendMsgTarget target, params string[] parameters)
            {
                Dictionary<string, List<Player>> sorted = new Dictionary<string, List<Player>>();
                foreach (Player player in players)
                {
                    string langName = player.LanguageName();
                    if (!lines.ContainsKey(langName))
                    {
                        langName = defaultLanguage;
                    }
                    if (!sorted.ContainsKey(langName))
                    {
                        sorted.Add(langName, new List<Player>());
                    }
                    sorted[langName].Add(player);
                }
                foreach (KeyValuePair<string, List<Player>> kvp in sorted)
                {
                    if (lines[kvp.Key].ContainsKey(msgKey))
                    {
                        switch (target)
                        {
                            case SendMsgTarget.ChatAndScreen:
                                {
                                    gamePlay.gpLogServer(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters);
                                    gamePlay.gpHUDLogCenter(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters);
                                } break;
                            case SendMsgTarget.Chat: gamePlay.gpLogServer(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters); break;
                            case SendMsgTarget.Screen: gamePlay.gpHUDLogCenter(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters); break;
                        }
                    }
                }
            }
    
            private void load(string langFolderPath)
            {
                IEnumerable<string> fileNames = Directory.EnumerateFiles(langFolderPath, "*.txt", SearchOption.TopDirectoryOnly);
                foreach (string filename in fileNames)
                {
                    parseLanguageFile(filename);
                }
            }
    
            private void parseLanguageFile(string filename)
            {
                string[] filelines = File.ReadAllLines(filename);
                string[] firstLine = filelines[0].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                if (firstLine[0].Equals("LanguageName"))
                {
                    string langName = firstLine[1];
                    if (!lines.ContainsKey(langName))
                    {
                        lines.Add(langName, new Dictionary<string, string>());
                    }
                    for (int i = 1; i < filelines.Length; i++)
                    {
                        string[] lineArr = filelines[i].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                        if (lineArr.Length != 2) continue;
                        lines[langName][lineArr[0]] = lineArr[1];
                    }
                }
            }
        }
    
        internal enum SendMsgTarget
        {
            Chat,
            Screen,
            ChatAndScreen
        }


    Инициализация:

    В конструкторе класса передаем следующие параметры
    1. IGamePlay gamePlay - собственно GamePlay наш дорогой, что бы менеджер мог найти игроков и отправлять сообщения.
    2. string defaultLanguage - язык, который будет использоваться по-умолчанию (если соотв. игроку языковой файл не существует).
    3. string langFolderPath - полный путь к папке, где хранятся языковые файлы.

    Методы
    Класс предоставляет четыре публичных метода для работы с ним.

    1. GetString(string msgKey, string language)
    Получить строку на требуемом языке. Первый параметр ключ строки, второй - язык. Может потребоваться, к примеру, для заполнения строк в миссионном меню на языке игрока.

    2. SendMessageToAll(string msgKey, SendMsgTarget target, params string[] parameters)
    Отправить сообщение всем игрокам.
    Первый параметр - ключ строки.
    Второй параметр перечисление, куда выводить сообщение. Может принимать три значения:
    • Chat - сообщение будет выведено в чат;
    • Screen - сообщение будет выведено по центру экрана большими красными буквами;
    • ChatAndScreen - сообщение будет выведено и в чат, и на экран.

    Третий параметр - массив параметров сообщения, использование аналогично родным методам. null если параметры не используются.

    3. SendMessageToArmy(string msgKey, int army, SendMsgTarget target, params string[] parameters)
    Отправить сообщение команде.
    Первый параметр - аналогично п.2.
    Второй параметр - целевая армия, 1 - красным, 2 - синим:
    Третий параметр - перечисление, аналогично п.2
    Четвертый параметр - аналогично п.2.

    4. SendMessageToPlayers(string msgKey, Player[] players, SendMsgTarget target, params string[] parameters)
    Отправить сообщение только указанным игрокам
    Второй параметр - массив игроков, которым надо отправить сообщение, остальное аналогично указанному выше.

    Структура языкового файла:
    Примитивный ini-подобный файл с парами ключ-значение. Ключ мы непосредственно используем в скрипте, класс на основе этого ключа выдает строку.
    Первая пара должна представлять собой название целевого языка.

    Требования
    1. Должен быть как минимум один языковой файл для языка по умолчанию, который вы передаете в конструкторе.
    2. Первой строкой в языковом файле должно быть наименование языка, для которого этот файл используется. Имя файла значения не имеет.
    3. Актуален для онлайн миссий.

    Преимущества
    1. Минимум кода для при использовании непосредственно в скрипте миссии.
    2. Нас не волнует язык игрока, класс самостоятельно выбирает нужный язык, и если его не существует, использует язык по-умолчанию.
    3. Не надо править/исправлять скрипт для добавления языков или изменения строк, все делается в языковых файлах.

    Полный cs-файл и пример языкового файла во вложении. cs-файл выдрал из проекта, поэтому при использовании может понадобится удалить/переименовать namespace.
    Собственно старая версия этого класса использовалась в морском льве.
    Вложения Вложения
    Крайний раз редактировалось Small_Bee; 08.01.2012 в 03:23.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •