PDA

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



-atas-
01.10.2011, 22:13
2 универсальных скрипта на все случаи жизни

http://forum.1cpublishing.eu/showthread.php?t=26623

Не совсем понятно как это совместить с LocalizedMessages

sendChatMessageTo(-1, GetLocalizedMessage("ru", "Hello"), null); Это отправит сообщение только владельцам русской версии? А если нужно отправить всем, но на разных языках. Мысли вслух.

GetLocalizedMessage сам проверяет язык установленной игры у клиента?

--- Добавлено ---




А для Player есть LanguageName() - языковая проблема походу решена.



Все остальное примерно так


private string GetLocalizedMessage(string lang, string key)
{
switch(key)
{
case "Hello":
{
switch (lang)
{
case "ru": return "Привет!";
case "en": return "Hello!";
case "turtle": return "Cawabanga dude!";
}
} break;
}
return String.Empty;
}

Вот эти вещи как совместить можно, т.е. как этот скрипт узнает на каком конкретно языке писать конкретному пользователю?

Так будет работать?

GetLocalizedMessage(LanguageName(), "mission1");

private string GetLocalizedMessage(string lang, string key)
{
switch(key)
{
case "mission1":
{
if (lang = "ru")
{
return "Загружена миссия 1.";
}
else
{
return "Mission 1 loaded.";
}
} break;
}
return String.Empty;
}

-atas-
02.10.2011, 13:15
Kodial внес ясность. Теперь скрипты включают языки.
Вмето немецкого пока можно ставить английский текст, потом желающие переведут.


using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{

private void sendScreenMessageTo(int army, string msg, object[] parms)
{
if (army != -1)
{
//Singleplayer (for Testing)
if (GamePlay.gpRemotePlayers() == null || GamePlay.gpRemotePlayers().Length <= 0)
{
if (GamePlay.gpPlayer() != null && GamePlay.gpPlayer().Army() == army)
GamePlay.gpHUDLogCenter(null, msg, parms);

}
else // Multiplayer
{
List<Player> Players = new List<Player>();

foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army)
Players.Add(p);
}
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}
}
else GamePlay.gpHUDLogCenter(null, msg, parms);
}


private void sendChatMessageTo(int army, string msg, object[] parms)
{
if (army != -1)
{
//Singleplayer (for Testing)
if (GamePlay.gpRemotePlayers() == null || GamePlay.gpRemotePlayers().Length <= 0)
{
if (GamePlay.gpPlayer() != null && GamePlay.gpPlayer().Army() == army)
GamePlay.gpLogServer(null, msg, parms);

}
else // Multiplayer
{
List<Player> Players = new List<Player>();

foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army)
Players.Add(p);
}
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}
}
else GamePlay.gpLogServer(null, msg, parms);
}


private void sendScreenMessageTo(int army, string playerlanguage, string msg, object[] parms)
{
if (army != -1)
{
//Singleplayer (for Testing)
if (GamePlay.gpRemotePlayers() == null || GamePlay.gpRemotePlayers().Length <= 0)
{
if (GamePlay.gpPlayer() != null && GamePlay.gpPlayer().Army() == army && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
GamePlay.gpHUDLogCenter(null, msg, parms);

}
else // Multiplayer
{
List<Player> Players = new List<Player>();

foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}
}
else GamePlay.gpHUDLogCenter(null, msg, parms);
}


private void sendChatMessageTo(int army, string playerlanguage, string msg, object[] parms)
{
if (army != -1)
{
//Singleplayer (for Testing)
if (GamePlay.gpRemotePlayers() == null || GamePlay.gpRemotePlayers().Length <= 0)
{
if (GamePlay.gpPlayer() != null && GamePlay.gpPlayer().Army() == army && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
GamePlay.gpLogServer(null, msg, parms);
}
else // Multiplayer
{
List<Player> Players = new List<Player>();

foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}
}
else GamePlay.gpLogServer(null, msg, parms);
}


public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex)
{
base.OnPlaceEnter(player, actor, placeIndex);


//test
switch (player.LanguageName())
{
case "de":
sendScreenMessageTo(2, "de", "Hallo!", null);
break;
case "ru":
sendScreenMessageTo(2, "ru", "Привет!", null);
break;
default:
sendScreenMessageTo(2, "Hello!", null);
break;
}

}
}

-atas-
06.10.2011, 16:40
Исправлено http://forum.1cpublishing.eu/showpost.php?p=345082&postcount=2

-atas-
12.10.2011, 11:48
Исправлено

using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{

#region MessageSystem

private void sendScreenMessageTo(int army, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}


private void sendChatMessageTo(int army, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}


private void sendScreenMessageTo(int army, string playerlanguage, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if ((GamePlay.gpPlayer().Army() == army || army == -1) && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if ((p.Army() == army || army == -1) && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}


private void sendChatMessageTo(int army, string playerlanguage, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if ((GamePlay.gpPlayer().Army() == army || army == -1) && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if ((p.Army() == army || army == -1) && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}


private void sendChatMessageTo(int army, string[] exepttoplayerlanguages, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}

foreach (string st in exepttoplayerlanguages)
{
Players.RemoveAll(item => item.LanguageName().Equals(st));
}

if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}


private void sendScreenMessageTo(int army, string[] exepttoplayerlanguages, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

foreach (string st in exepttoplayerlanguages)
{
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
}
foreach (string st in exepttoplayerlanguages)
{
Players.RemoveAll(item => item.LanguageName().Equals(st));
}

if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}


private void sendChatMessageTo(Player player, string msg, object[] parms)
{
if (player != null)
GamePlay.gpLogServer(new Player[] { player }, msg, parms);
}


private void sendScreenMessageTo(Player player, string msg, object[] parms)
{
if (player != null)
GamePlay.gpHUDLogCenter(new Player[] { player }, msg, parms);
}


private void sendChatMessageTo(Player player, string playerlanguage, string msg, object[] parms)
{
if (player != null)
if (player.LanguageName().Equals(playerlanguage))
GamePlay.gpLogServer(new Player[] { player }, msg, parms);
}


private void sendScreenMessageTo(Player player, string playerlanguage, string msg, object[] parms)
{
if (player != null)
if (player.LanguageName().Equals(playerlanguage))
GamePlay.gpHUDLogCenter(new Player[] { player }, msg, parms);
}


private void sendChatMessageTo(Player player, string[] exepttoplayerlanguages, string msg, object[] parms)
{

List<Player> Players = new List<Player>();

if (player != null)
Players.Add(player);

foreach (string st in exepttoplayerlanguages)
{
if(Players != null)
Players.RemoveAll(item => item.LanguageName().Equals(st));
}

if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}


private void sendScreenMessageTo(Player player, string[] exepttoplayerlanguages, string msg, object[] parms)
{
List<Player> Players = new List<Player>();

if (player != null)
Players.Add(player);

foreach (string st in exepttoplayerlanguages)
{
if (Players != null)
Players.RemoveAll(item => item.LanguageName().Equals(st));
}

if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}

#endregion

}

podvoxx
08.01.2012, 02:10
Выкладываю свой вариант локализации, основан на массивах. Компактней и читабельней switch..case



using System;
using System.Collections;
using maddox.game;
using maddox.game.world;
using maddox.GP;
using System.Collections.Generic;
using System.IO;

public class Mission : AMission
{
//=========================LOCALIZATION=============================
string[] languageArray = { "en", "ru", "de", "fr", "es", "cs", "it", "pl" };

//******************Localize Message Method*******************
private string getLocalizedMessage(string textTranslate)
{

string[] localizeArray;
string langIndex = GamePlay.gpPlayer().LanguageName();
switch (textTranslate)
{
case "Welcome to our server.":
{
localizeArray = new string[]
{
"Welcome to our server.EN",
"Добро пожаловать на наш сервер.RU",
"Welcome to our server.DE",
"Welcome to our server.FR",
"Welcome to our server.ES",
"Welcome to our server.CS",
"Welcome to our server.IT",
"Welcome to our server.PL"
};
return localizeArray.GetValue(Array.IndexOf(languageArray, langIndex)).ToString();
} break;
}
return textTranslate;
}
//======================================================================

//******************Send Chat Message Method*******************
private void sendChatMessageTo(int army, string msg, object[] parms)
{
List<Player> Players = new List<Player>();
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}

public override void OnBattleStarted()
{
base.OnBattleStarted();
MissionNumberListener = -1;

sendChatMessageTo(-1, getLocalizedMessage("Welcome to our server."), new object[] { });
}
}

Small_Bee
08.01.2012, 03:12
Ну тогда уже и я отмечусь :)

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



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.
Собственно старая версия этого класса использовалась в морском льве.

podvoxx
13.01.2012, 11:24
И правда ,зачем изобретать велосипед )) Использую готовое профессиональное решение, а освободившееся время потрачу на что-нибудь другое интересное. Спасибо за код :thx:

podvoxx
23.05.2012, 19:09
http://forum.1cpublishing.eu/showpost.php?p=428589&postcount=14

Локализация от Кодиака с использованием xml-файла