|
|
Модератор форума: СМЕРШ, Slon |
Форум РЕДАКТОР - ArmA 1 Скрипты Проблемы при создании сетевой игры. (и методы решения.) |
Проблемы при создании сетевой игры. |
› Понедельник
› 16.02.2009
› 15:47
› Сообщение #
Проблема первая. Тригеры.
Очень удобные и необходимые в одиночных миссиях, при использовании в мульти тутже создают проблемы. Включаются то у всех сразу или несрабатывают вовсе хотя в одиночных тестах всё шло нормально. Есть несколько решений. 1: Тригеры установленые в редакторе используются только сервером, невызывают файлов а изменяют глобальные переменные которые контролируются уже работающим (циклично) скриптом. Пример строк условия и активации тригера expCond="Player in thislist"; expActiv="PlayBasa = true; publicVariable ""PlayBasa"""; в скрипте PlayBasa = false - установка publicVariable "PlayBasa" ~ 0.2 - - ожидание пока разойдётся по всем машинам @ PlayBasa - - - - ожидание изменения 2: в тригире 3: Тригер на объекте "Basa" Addtr = createTrigger ["EmptyDetector", position player]; Тригер для радиокоманд 0-0-1 ("Alpha") - название "Avia Bomb" Остальные команды используются реже. Полный список - |
› Четверг
› 19.02.2009
› 22:21
› Сообщение #
Проблема вторая - Маркеры.
А именно изменённые или появившиеся маркеры в процессе игры - цвет , размер, текст, тип. Входящий игрок получает лиш то, что было установлено в редакторе,и изменения невидит. Спосб решения - MarkMass = ["Mk1","Mk5","Mk2"] а всего будет 10 файл игрока файл сервера #Reload Остальные параметры маркера проявятся сами. |
› Пятница
› 27.02.2009
› 20:51
› Сообщение #
Проблема третья - Флаги
Если просто поставить флаг на карте то он браться небудет, необходимо назначить его какой нибуть стороне. Взять можно только флаг стороны противника. Для нормальной работы всем флагам надо дать имена. ~ Fl1, Fl2, Fl3... this setFlagSide WEST (или EAST, RESISTANCE) Теперь его можно взять. А потом надо от него избавиться. условие - (FlagOwner Fl1) in thislist Fl1 - имя флага который несёт игрок. Пока всё просто ? Рассмотрим вариант, три флага - С флагами Баз всё ясно , они должны принадлежать стороне базы, но чтобы на них небыло полотна ? side (Flagowner Fl1) == East : Fl1 setFlagSide West Fl1 setFlagSide resistance теперь надо взять Fl2, и в центре появится флаг Вот теперь непросто. |
› Четверг
› 09.04.2009
› 10:25
› Сообщение #
Проблема 4:
Одновременная передача сообщений на все машины. Набор команд "TITLE***" вызваный из скрипта нормально работает для одной машины, Обычно используют тригер активируемый глобальной переменной, для каждого типа "TITLE***" свой. Пример активации из скрипта : Сначала устанавливается переменная "Text1 = name Player" и объявляется глобальной publicVariable "Text1" ~1 - пауза пока идёт рассылка по машинам потом активируют тригер переменной "Mess = true" publicVariable "Mess" после срабатывания тригер сам обнуляет переменные. строки тригера: expCond="Mess" expActiv="titleText [format [""Сообщение %1\"",Text1]; Mess = false" Активировать его можно и из другого тригера или поинта, но при этом универсальные тексты часто передаются с эадержкой и на разных машинах показывает текущий или предидущий текст :::: Более Эфективно применять другой вариант. Можно заменить тригеры одним скриптом находящимся в режиме ожидания. Использует одну переменную для передачи текста и несколько для определения типа скрипт формата SQS #Start Messeg = "NONE" - текст или название из дескрипта mes1 = false - - - - выбор типа mes2 = false mes3 = false mes4 = false mes5 = false @Mes1 or Mes2 or Mes3 or Mes4 or Mes5 ~1 ? Mes1 : Titletext [Messeg, "plain down",0] ? Mes2 : hint Messeg ? Mes3 : titleRsc [Messeg, "PLAIN",1];playSound "soundname" ? Mes4 : playMusic Messeg ? Mes5 : createDialog "RscDisplayGame" (или - createDialog Messeg) goto "Start" скрипт формата SQF While {true} do { Messeg = "NONE"; mes1 = false; mes2 = false; mes3 = false; mes4 = false; mes5 = false; WaitUntil { Mes1 or Mes2 or Mes3 or Mes4 or Mes5}; sleep 1; if Mes1 then { Titletext [Messeg, "plain down",0]}; if Mes2 then { hint Messeg }; if Mes3 then { titleRsc [Messeg, "PLAIN",1];playSound "soundname" }; if Mes4 then { playMusic Messeg if Mes5 then { createDialog "RscDisplayGame" (или - createDialog Messeg) }; }; Такой скрипт запускается в начале игры на каждой машине, заменяет (здесь 5) тригеры недаёт сбоев при активации из тригеров и поинтов, а также допускает общение между игроками по именам (например обмен очками) ? Mes6 && (Messeg == Player): Player addScore 10 |
› Суббота
› 14.11.2009
› 17:28
› Сообщение #
Управление: видимой дистанцией, травой, погодой.
Это локальные настройки, те. в Мп у каждого игрока свои даже если они стоят рядом. видимая дистанция: Трава: Погода: все имеют один синтаксис setRain - Дождь |
| |||
| |||
Чат сайта |