Читайте тему выше:
http://www.sukhoi.ru/forum/showthrea...=1#post1616450
car.cpp гоняет машинку по сплайновой дороге туда-сюда. Для поезда нужно проверять как будет работать, он же не развернется сам на рельсах )
Вид для печати
Читайте тему выше:
http://www.sukhoi.ru/forum/showthrea...=1#post1616450
car.cpp гоняет машинку по сплайновой дороге туда-сюда. Для поезда нужно проверять как будет работать, он же не развернется сам на рельсах )
Нет, он разрушает даже самолеты, которые приземлились на аэродроме, но эти самолеты должны быть созданы в той же миссии. Потому что вы создаете самолеты в других миссиях, скрипт не может получить OnPlaneLanded() и OnPlaneCrashLanded() для этих самолетов. Есть 2 решения:
1) Создать отдельный скрипт для уничтожения самолета в каждой миссии.
2) Сделать скрипт так, что он слушал события каждой миссии. В этом случае, необходимо добавить:
Код:public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle,missionNumber);
MissionNumberListener=-1; //Listen to events of every mission
}
--- Добавлено ---
Этот код дает вам много ошибок типа "Out of bounds", потому что он пытается убить второго двигателя и на самолете с одним двигателем.
Попробуйте изменить эти строки на:
Код:int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i=0; i<iNumOfEngines; i++)
{
aircraft.hitNamed ((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes),"Eng"+i.ToString()+"TotalFailure"));
}
Спасибо большое!!! Завтра потестирую в оффлайне и загружу на сервер. Вставлять MissionNumberListener=-1, как понимаю, лучше в начало файла?
Out of bounds мы получали по-моему именно для 2х-моторных 110х емнип (и только для них). Но в любом случае исправим.
Не подскажете, как корабли, танки, дымы минут через 50 - 75 убрать после их загрузки подмиссией?
Если объекты создаются только во время загрузки миссий, мы можем уменьшить эту проблему до: объекты должны умереть после минут XXX от их создания. Тогда, мы можем использовать:
Код:public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
//Ground objects will die after 50 min when counted from their birth
if (actor is AiGroundActor)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
--- Добавлено ---
В методе Init (). Он выполняется, когда миссия начинается. Нет никакой разницы, в каком порядке методы определены в классе, так что вы можете поместить его в начале, конце или середине.
Давайте брать пример. Игрок покидает Spitfire в воздухе, скрипт пытается сделать некоторые повреждения. Spitfire имеет только один двигатель, поэтому скрипт успешно убивает двигателя № 1. Тогда скрипт продолжается, и пытается убить двигатель № 2, которой не существует, и в результате появляется ошибка "Out of bounds".
Я просто предложили такие изменения кода, что скрипт будет убивать не более двигателей, чем есть в самолете.
Периодические загрузки миссии без использования TickCounter():
Код://Runs once, when mission is loaded
public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle,missionNumber);
//Planned missions
MissionLoader(30,10,"missions/Multi/Dogfight/bombers1.mis"); // 10s from main mission start and repeatedly every 30s
MissionLoader(100,60,"missions/Multi/Dogfight/bombers2.mis"); // 60s from main mission start and repeatedly every 100s
}
public void MissionLoader(int period, int offset, string mission)
{
if (offset > 0)
Timeout(offset, () => {MissionLoader(period,0,mission);});
else
{
GamePlay.gpPostMissionLoad(mission);
Timeout(period, () => {MissionLoader(period,0,mission);});
}
}
Спасибо, а как туда отложенные по времени текстовые сообщения вставить как здесь:
Мне трудно что-то менять в коде. Лучше вставлять целый работающий кусок в готовый скрипт, если есть такая возможность.Код:// v.1_17_00. bot-destroying script based on one by oreva
using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
public class Mission : AMission
{
// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}
if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}
/////////////////////////////////////////////////////////////////////////////////////
if (Time.tickCounter() % 135000 == 9000) // 135000=75 min repeat. 9000=5 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at D4!");
});
}
if (Time.tickCounter() % 135000 == 54000) // ; 135000=75 min repeat, 54000 - 30 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_ground01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to C4!");
});
}
if (Time.tickCounter() % 135000 == 99000) // 135000 == 99000 = 75 min repeat, 55 min delay
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Friendly aircrafts are under attack at D2!");
});
}
}
// destroys aircraft abandoned by a player. script by oreva
private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}
Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}
return true;
}
private void destroyPlane (AiAircraft aircraft) {
if (aircraft != null) {
aircraft.Destroy ();
}
}
private void explodeFuelTank (AiAircraft aircraft)
{
if (aircraft != null)
{
aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
}
}
private void destroyAiControlledPlane (AiAircraft aircraft) {
if (isAiControlledPlane (aircraft)) {
destroyPlane (aircraft);
}
}
private void damageAiControlledPlane (AiActor actor) {
if (actor == null || !(actor is AiAircraft)) {
return;
}
AiAircraft aircraft = (actor as AiAircraft);
if (!isAiControlledPlane (aircraft)) {
return;
}
if (aircraft == null) {
return;
}
aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng0TotalFailure);
aircraft.hitNamed (part.NamedDamageTypes.Eng1TotalFailure);
/***Timeout (240, () =>
{explodeFuelTank (aircraft);}
);
* ***/
Timeout (300, () =>
{destroyPlane (aircraft);}
);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave (player, actor, placeIndex);
Timeout (1, () =>
{damageAiControlledPlane (actor);}
);
}
public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
Timeout (300, () =>
{ destroyPlane(aircraft); }
);
}
public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(300, () =>
{ destroyPlane(aircraft); }
);
}
}
ps. Пока не было времени интегрировать предыдущие изменения, надеюсь займусь вечером.
Можно ли каким-то образом исключить отсюда артиллерию? Т.е. чтобы зенитки оставались.Код:public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
//Ground objects will die after 50 min when counted from their birth
if (actor is AiGroundActor)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
Или вы можете просто удалить объекты, созданные в подмиссиях. В этом случае, вы должны поставить все зенитки в основной миссии.Код:public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
//Ground objects (except AA Guns) will die after 50 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
Код:public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber,shortName,actor);
HUDmsg("Actor "+actor.Name()+" was created.");
//Ground objects (except ones created in main mission) will die after 50 min when counted from their birth
if (actor is AiGroundActor && missionNumber > 0)
Timeout (3000, () =>
{ if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
Спасибо большое! Возьмем 1й вариант, т.к. в подмиссиях иногда зенитки немного добавляем, где нужно.
Противотанковые пушки удалятся? (их лучше удалять, хотя не так принципиально пока их мало у нас совсем).
upd. Вот так получилось. Тестируем. Спасибо за помощь.
Код:// v.1_17_04. script by oreva, zaltys, small_bee
using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
public class Mission : AMission
{
// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}
if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}
///////////////////////
if (Time.tickCounter() % 162000 == 9000) // 162000=90 min repeat. 9000=5 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 500, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at D4!");
});
}
if (Time.tickCounter() % 162000 == 63000) // ; 162000=90 min repeat, 63000 - 35 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");
double initTime = 0.0;
Timeout(initTime += 500, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Friendly ships are under attack at C4!");
});
}
if (Time.tickCounter() % 162000 == 117000) // 162000 == 117000 = 90 min repeat, 65 min delay
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to D2!");
});
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// destroys aircraft abandoned by a player.
private bool isAiControlledPlane (AiAircraft aircraft)
{
if (aircraft == null)
{
return false;
}
Player [] players = GamePlay.gpRemotePlayers ();
foreach (Player p in players)
{
if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft)
{
return false;
}
}
return true;
}
private void destroyPlane (AiAircraft aircraft) {
if (aircraft != null) {
aircraft.Destroy ();
}
}
private void explodeFuelTank (AiAircraft aircraft)
{
if (aircraft != null)
{
aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded);
}
}
private void destroyAiControlledPlane (AiAircraft aircraft) {
if (isAiControlledPlane (aircraft)) {
destroyPlane (aircraft);
}
}
private void damageAiControlledPlane (AiActor actor) {
if (actor == null || !(actor is AiAircraft)) {
return;
}
AiAircraft aircraft = (actor as AiAircraft);
if (!isAiControlledPlane (aircraft)) {
return;
}
if (aircraft == null) {
return;
}
aircraft.hitNamed (part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed (part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed (part.NamedDamageTypes.FuelPumpFailure);
int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i = 0; i < iNumOfEngines; i++)
{
aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
}
/***Timeout (240, () =>
{explodeFuelTank (aircraft);}
);
* ***/
Timeout (300, () =>
{destroyPlane (aircraft);}
);
}
//////////////////////////////////////////
public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex)
{
base.OnPlaceLeave (player, actor, placeIndex);
Timeout (1, () =>
{damageAiControlledPlane (actor);}
);
}
public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftCrashLanded (missionNumber, shortName, aircraft);
Timeout (300, () =>
{ destroyPlane(aircraft); }
);
}
public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft)
{
base.OnAircraftLanded(missionNumber, shortName, aircraft);
Timeout(300, () =>
{ destroyPlane(aircraft); }
);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//Listen to events of every mission
public override void Init(maddox.game.ABattle battle, int missionNumber)
{
base.Init(battle, missionNumber);
MissionNumberListener = -1; //Listen to events of every mission
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects (except AA Guns) will die after 55 min when counted from their birth
if (actor is AiGroundActor)
if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
/****
//Ground objects will die after 55 min when counted from their birth
public override void OnActorCreated(int missionNumber, string shortName, AiActor actor)
{
base.OnActorCreated(missionNumber, shortName, actor);
//Ground objects will die after 55 min when counted from their birth
if (actor is AiGroundActor)
Timeout(3300, () =>
{
if (actor != null)
{ (actor as AiGroundActor).Destroy(); }
}
);
}
****/
}
Возможно, да. Я думаю, PT оружие будет maddox.game.world.AiGroundActorType.Artillery. Это список актеров наземных объектов:
Если вы хотите сохранить артиллерийских орудий и зенитных орудий, вам необходимо изменить так:Код:Unknown,
Medic,
Motorcycle,
ArmoredCar,
Tractor,
Car,
Amphibian,
SPG,
Tank,
Bus,
LightTruck,
Truck,
Trailer,
Balloon,
Generator,
Predictor,
Radar,
RadioBeacon,
RadioBeamProjector,
Listener,
AmmoComposition,
ContainerShort,
ContainerLong,
Artillery,
AAGun,
Plane,
EngineWagon,
FreightWagon,
PassengerWagon,
ShipMisc,
ShipTransport,
ShipSmallWarship,
ShipDestroyer,
ShipCruiser,
ShipBattleship,
ShipCarrier,
ShipSubmarine,
Bridge,
House
Код:if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun &&
(actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.Artillery)
Спасибо! Поднял тестовую Repka #3 с этим скриптом.
Подскажите, пожалуйста, танкеры вот таким образом по сплайнновой дороге, которая просто "дорога" (это невидимый путь?) будут бегать?
[NPC]
18_Chief Ship.Tanker_Medium1 gb /posx 264072.63/posy 205404.94 /script car.cpp/target 0_SplineRoad /sleep 0/skill 2/slowfire 10/tow00_00 1_Static
19_Chief Ship.Tanker_Medium1 de /posx 258181.84/posy 208404.95 /script car.cpp/target 1_SplineRoad /sleep 0/skill 2/slowfire 10/tow00_00 2_Static
Что означают параметры /sleep 0/skill 2/slowfire 10 ?
Какие для них предельные значения?
Прошу проверить часть скрипта, рандомно загружающую одну из 3х подмиссий, на предмет ошибки. не работает, миссии не грузит.
Заранее благодарствую.
upd. fixed http://www.sukhoi.ru/forum/showthrea...=1#post1621945Код:using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
public class Mission : AMission
{
// loading sub-missions
public override void OnTickGame()
{
if (Time.tickCounter() % 54000 == 12600) // 54000=30 min repeat. 12600=7 min delay.
{
// randomly selects 1 of several submissions
Random RandomIncident = new Random();
switch (RandomIncident.Next(1, 3))
{
case 1:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
// GamePlay.gpHUDLogCenter("mis1 loaded!");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
});
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!");
});
break;
case 2:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
// GamePlay.gpHUDLogCenter("mis2 loaded");
double initTime = 0.0;
Timeout(initTime += 500, () =>
{
GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!");
});
break;
case 3:
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
// GamePlay.gpHUDLogCenter("mis3 loaded!");
double initTime = 0.0;
Timeout(initTime += 600, () =>
{
GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
});
Timeout(initTime += 300, () =>
{
GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!");
});
break;
}
}
///////////////////////
//loads small submissions w/o messages
if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
}
if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
{
GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
}
}
}
--- Добавлено ---
Подскажите, как можно настраивать GamePlay.gpHUDLogCenter , чтобы писать мельче, другим цветом (ярко-синим, например) и внизу экрана. Как можно возврат каретки / перенос вставить, менять длительность показа?
Было бы неплохо все-таки дать игроку возможность по нажатию клавиши посмотреть текущие цели миссии, которые могут меняться в реальном времени. Например, можно на карте 2ю вкладку сделать для текущих целей и 3ю для общего брифинга, который был в начале миссии. Назначить горячие клавиши ALT-1, 2, 3 например. Для "онлайн-битвы за ресурсы" вещь необходимая.
Несколько вопросов возникло
1. Можно ли как-то узнать локаль игрока, подключившегося к серверу (язык его копии игры), что бы отправлять ему сообщения на его языке?
2. Можно ли отключить в чате сообщения о появлении самолетов в таком-то квадрате, а также сообщения кто куда упал и кто ему в этом помог?
3. И присоединяюсь к вопросу - было бы неплохо для HUD сообщения регулировать его позицию и цвет, а также сделать его многострочным (у меня не получилось). И аналогично, регулировать цвет сообщения в чате (по примеру сообщений о повреждениях).
4. Было бы классно добавить в онлайне что-то вроде таблицы с игроками (по кнопке S который), но содержимое такого окна мог бы регулировать сервер или миссия.
GamePlay.gpHUDLogCenter("",123); 123 - длительность показывания, ещё можно показывать определённым игрокам сообщение , по остальным вопросам - пока никак, возможно позже добавится более широкое управление.
угу, передал, вместе с улучшением карты будут думать как сделать.
погляжу, если можно.
в настройке инфоокна, емнип это сообщения сервера - убрать и не будут показываться. Или как сделать чтобы сам сервер не писал их?
насчёт худ-а согласен, надо что-то придумывать, а цвет сообщений в чате вроде и так настраивается, при настройке инфоокна.
ага, это планируется вроде.
Да, именно сервер. Сейчас он работает как хороший разведчик - скажем я хочу поднять "108-й со старшими офицерами", а сервер красным услужливо подсказывает, что такое дело там-то и там-то появилось.
Аналогично, что бы из миссии можно было задать цвет - скажем сообщение не настолько важное, что бы писать его перед носом большими красными буквами, но тем не менее достаточно полезное для того, что бы его выделить. К тому же чат можно промотать, что бы посмотреть, что приходило ранее, в отличие от HUD сообщений.
угу, понятно, надо наверное фильтр сделать с настройками из сервера.
ясно, в принципе к чату надо доступ наверное сделать серверу, это решит часть вопросов.
По поводу локали игрока - нельзя, но если SayToGroup() использовать с уже существующими сообщениями - они на языке игрока будут.
В режиме с включенными маркерами(иконками) самолетов можно ли как-то убрать с сервера (или скриптом) стрелки по краям экрана или сделать их абсолютно прозрачными для клиентов?
Можно ли настроить дальность, отображаемую сторону (свои/чужие) и цвет иконок самолетов?
Подскажите плз, как вращать обьекты в редакторе?
А можно ли сделать иконки для наземных целей? :-)