Перейти к содержанию

StDIABLO

Пользователи
  • Публикаций

    580
  • Зарегистрирован

  • Посещение

  • Победитель дней

    7

Весь контент StDIABLO

  1. Код глянь внимательно, и думай как компилятор.   Ты создал глобальный объект (в нашем случае это объект геймлогик) сам он невидим ни для сервера, ни для клиента. И есть в памяти и у сервера и у клиента. В его ините прописал создание другого объекта. Он также создался.  Объект гейм логик закончил свою работу и не нужен НИ СЕРВЕРУ НИ КЛИЕНТУ и может быть удален. В ООП есть всякие деструкторы для этих целей. Тут такого я не находил и приходится все чистить руками.   ps про JIP не говорю пока, для JIP надо функции делать чтобы синхронизация между сервером и клиентом JIP была во время соединения. Например вешать пару функций которые делаются по умолчанию только на сервере на JIP клиента. Т.о . синхронизировав все данные. (Об этом потом)     Что ты подразумаваешь под встроенным? Созданный сервером или редактором?     Я честно не знаю что лучше, пока не посмотрю стек армы, как хранятся переменные и прочее.   смотри код getPos this создает тебе массив чисел с плавающими точками. например [-25.1412341234,2013.452234,10] Технически, я уверен (без учета действий компилятора) что этот массив занимает СТОЛЬКО же  памяти что и [0,0,0] (Есть бит для знака, биты для обозначения положения плавающей точки, сами числа см. примеры хранения чисел в памяти)   т.е в памяти [-25.1412341234,2013.452234,10] хранится 3 числа где каждое число составляет из себя пакет данных. [0,0,0] это те же 3 пакета данных, только у каждого из пакетов  нули.   Тут начинается работа компиляторов, и анализатора кода, такие моменты (в нормальных компиляторах) отслеживаются и одинаковые константы "схлопываются" до уровня - одна константа и куча ссылок на нее. И в итоге получается массив [0, указатель на 0, указатель на 0] и в памяти получается так что [0,0,0] почти столько же занимает памяти что и [0] (еще немного данных на указатели, но указатель это не число оно меньше занимает памяти). А если можно сожрать памяти меньше зачем ее брать больше? Мы ж не гугл хром :)   Я конечно не уверен как сделан компилятор в A3, но это правило хорошего тона такую фичу встраивать в компиляторы. И даже если этой фичи нет, стоит так писать (мб завтра эта фича появится и код не надо будет переписывать под это).
  2.   Это все в зону isServer. Но ты не удаляешь объект, а делаешь формально его невидимым. Ты можешь обратно его в любой момент времени "ВКЛЮЧИТЬ", такч это не замена на невидимый хелипад.   Но запомни еще одно если есть возможность не создавать переменную - пользуйся ей. Исключений тут оч мало. т.е код: obj = [0,0,0] nearestObject 673047; obj hideObjectGlobal true; лучше (будет меньше занимать в памяти) будет таким ([0,0,0] nearestObject 673047) hideObjectGlobal true;   Все в блок (!isDedicated), возможно тебе понадобятся условия проверки на сторону (side player)  возможно не всем надо знать о зоне.       Смотри, лучше поставить вопрос не так, не замена, а удаление ненужных мне объектов и расстановка нужных по этим же координатам. Удаление/сокрытие ненужных по ID есть выше, ну а расстановкой новых объектов на их места - справится и обычный редактор.   Просто запомни init объекта читают все (и сервер и клиенты - лучшая синхронизация), а надо чтобы читал сервер (лучшее время работы,меньше лагов). Вот и смотри что тебе надо синхронизацию улучшить или лагодром устранить.
  3. Во первых почему не работает.   setDamage   Аргумент должен быть глобальным, а он у тебя вроде как локальный (приватный)  _tower1 код ниже должен сработать: ([0,0,0] nearestObject 523286) setDamage 1; тоже самое и с deleteVehicle.   А почему  сразу объект не удалить, напомни? Код ниже не работает? deleteVehicle ([0,0,0] nearestObject 523286); //код не пашет :( ниже обновленная версия   или  ([0,0,0] nearestObject 523286) enableSimulation false; ([0,0,0] nearestObject 523286) allowDamage false; ([0,0,0] nearestObject 523286) hideObjectGlobal true;//должно выполниться в блоке isServer (прост нет армы на работе прочекать не могу)
  4.   да это работает но это совершенно бессмыслено для клиента. лучше или:   1)или поставить 101 editor http://www.armaholic.com/page.php?id=20821 (показывает все равно не все объекты пришлось доделывать напильником) 2)или менять класс прямо через текстовый редактор в mission.sqm 3)или создавать объекты уже не в редакторе, а при запуске миссии самим сервером. (Благо эффект от createVehicle глобальный) самая лучшая реализация для расстановки ВСЕГО НА КАРТЕ, кроме самих клиентов)   ps не забывай удалять из памяти ненужные объекты //Game Logic - Objects - Game Logic ==> init field: tower = createVehicle ["Land_Cargo_Tower_V1_F", getPos this, [], 0, ""]; tower setDir 190; tower call BIS_fnc_boundingBoxMarker; //последняя функция должна добавлять маркер объекта на карту deleteVehicle this; //вроде так
  5.   просто обзываешь здание на карте и в юнит скф (в разделе для сервера)  <название дома> allowDamage false; Простое правило -> меньше обьектов не нужных для клиентов - лучше работает.  В твоем случае 1)клиенту совершенно не нужен этот объект гейм логик для работы. 2) все что написано в разделе init field ->выполняется всеми клиентами, а т.к эффект уже глобальный - это можно сделать только 1 раз но на сервере. и всем будет хорошо.
  6. воот эт портянка :) Проверять лениво, но научу как сделать (я считаю эту позицию правильной). Смотри разбиваешь все свои команды на global/local (с помощью wiki смотришь какой эффект от операции для сервера и клиента картинки ниже) в init sqf делаешь 2 блока кода 1 блок кода - код который выполняет ТОЛЬКО сервер (тут все твои команды и функции в итоге которые дают ) if (isServer) then { sleep 0.01; //твой код содержащий ТОЛЬКО глобальный эффект //или код для обработки скриптов и прочего говнокода что ты придумал }; 2 блок - БЛОК кода ТОЛЬКО ДЛЯ клиентов (тут все твои команды и функции в итоге которые дают локальный эффект) if (!isDedicated) then { sleep 0.01; //твой код содержащий ТОЛЬКО локальный эффект //и евент хендлеры и прочее говно для синхронизации с сервером. }; В чем суть фокуса, глобальный эффект уже подразумевает синхронизацию действия со всеми клиентами и сервером, а т.к в большинстве случаев на сервере больше ресурсов для обработки (математических, логических, триггерных) ситуаций, все эти задачи правильнее всего "вешать" на сервер. А клиенту давать или addEventHandler (в случае если эффект локальный ) или ничего (в случаях если это так надо или глобального эффекта ). Ну собственно вот и вся магия. (Поправьте если не так)
  7. [b][member=krech][/b], Это к вопросу шпагу или пистолет?   Я выбираю пистолет.    Ка50 - DCS World XD
  8. [member=almost], тут все относительно.... имхо дискриминация для тех кто на SFM будет :)   А если никому не говорить как ты летаешь - вообще никто и неузнает
  9. Я еще раз повторяю!! Я НЕЗАСТАВЛЯЮ ВСЕХ ПЕРЕХОДИТЬ НА АФМ. Я ПРОШУ СДЕЛАТЬ ТАК ЧТОБЫ ЭТО БЫЛО ДОБРОВОЛЬНО, МОЖЕШЬ ЛЕТАТЬ НА АФМ-  ЛЕТАЙ, неможешь - летай на SFM (как сейчас)
  10. спам флуд, и как обычно ничего по делу. Вы как при подьездные бабки сами белые и пушистые, но катя шл*ха, юра - наркоман, а павел - алкоголик.
  11. [sarcasm][member=Arcued],неее ты не прав, мы за третий вид большими стрелками над головами противников и чтобы был наконецто autoaim.[/sarcasm]   ТАкже я нехочу ДЛЯ ВСЕХ AFM, я хочу только для себя.   А по существу, я знаю позицию ГУП  по этому вопросу. Впринципе те задачи которые они передомной поставили - сейчас (1.52) не реализуемые, но придет время..... 
  12. Говнокод он как гравитация, стоит только один раз написать goto...

  13. [b][member=krech][/b],не складывай яблоки и мотоциклы. Имхо AFM стоит того чтобы потратить 20 часов на обучение полетам (самому же потом приятно будет летать). Например - полетай с SFM на самолетах DCS и AFM тамже. Совершенно разное управление, машину начинаешь чувствовать, что она управляется тобой, а не ездит по рельсам.
  14. Для начала http://wogames.info/tutorials/article/11-o-proekte/ Использование SFM на такого рода проектах я считаю аркадой. Осталось только ОГРОМНУЮ стрелку над противником рисовать и 3тий вид включить, да начнется деградирование. Вот ты говоришь что SFM - читы ( см выше "в 2 раза выше шансы на победу"), а я говорю что AFM дает преимущество перед SFM, но чтобы этим преимуществом пользоваться надо учиться летать заново на вертушках. Ну вот простой пример, на низких высотах с АФМ летать В РАЗЫ ПРОЩЕ (привет скриптам ПВО где не больше 30 метров полет), с АФМ можно летать и больше 180 и делать развороты какие хочется. Посадка с пролета - вообще делается закрытыми глазами. Да, теперь нельзя нажимать X Q чтобы победить лететь нормально, приходится постоянно дрочить Q и Z, чтобы не было проблем на поворотах и разворотах и следить за оборотами винта, но это ж проблема летчика и опыта летчика. Я ж не требую чтобы у всех был включен AFM - для начала сделать его добровольным.
  15. @pika4ytka,пилот выегнулся, и опозорился к АФМ это не относится
  16. @Mutagen, Если ты думаешь что с SFM проще победить то отключай, (можно еще и читов включить для уверенной победы, если ты играешь ради победы и фапаешь на нее не включай AFM) тебе никто не запретит! А вообще с АФМом вертушка становится более маневренной. Такчт я вот не так уверен в превосходстве SFM.
  17. @Buddy_guy,чот там совсем все сложно :) попросче в стиле хелло ворлд есть?
  18. Парни нужен примерчик: 1) Как создать интерфейс? (для начала окошко с кнопками, полем ввода или полоской ввода) 2) Как к этим кнопкам привязвыать действие? 3) При нажатии например на ctrl+r появлялось это окошко Есть у кого?
  19. Поменял switch (_this select 0) do { на switch (winside) do { и все заработало, чудеса :( прост _this select 0 это строка если чо :)
  20. Собстна инит enableSaving [false, false]; enableSentences false; //[] execvm "briefing.sqf"; //only for this missiom winside=0; publicVariable "winside"; if (isServer) then{ //рандомим машину _r= round(random 5); _obj = ([p_1,p_2,p_3,p_4,p_5,p_6] select _r); device setDir (getDir _obj); device setPosASL (getPosASL _obj); {deleteVehicle _x} forEach [p_1,p_2,p_3,p_4,p_5,p_6]; [] spawn { //чек машины в маркерах _timeRU=120; _timeUS=120; while {alive device} do { if ([device,"ru"] call WMT_fnc_IsTheUnitInsideMarker) then { _timeRU = _timeRU - 5; }; if ([device,"us"] call WMT_fnc_IsTheUnitInsideMarker) then { _timeUS = _timeUS - 5; }; if (_timeRU<5) then { winside =1; publicVariable "winside"; }; if (_timeUS<5) then { winside =2; publicVariable "winside"; }; sleep 5; }; winside =3; publicVariable "winside"; }; }; /* [] spawn { //us }; _trg = createTrigger ["EmptyDetector", getMarkerPos "us",false]; _trg setTriggerArea [250, 400, 0, false]; _trg setTriggerActivation ["ANY", "PRESENT", true]; _trg setTriggerStatements [ "device in thisList", "_vicUS = [] execVM 'CheckUS.sqf'; sleep 5;", ""]; */ if (!isDedicated) then{ "winside" addPublicVariableEventHandler { switch (_this select 0) do { case 0: { }; case 1: { [EAST, "ВС РФ Захватили машину"] call WMT_fnc_EndMission; }; case 2: { [WEST, "USAF Захватили машину"] call WMT_fnc_EndMission;}; case 3: { [sideEnemy, "Машина уничтожена - ничья"] call WMT_fnc_EndMission;}; default {}; }; }; }; Попробовал, чот миска не хочет рубиться после нахождения 120 сек на базе, хотя вроде все верно сделал. Есть идеи?
  21. Если я правильно понимаю - то в а2 все триггеры глобальные Пруф ниже https://community.bistudio.com/wiki/createTrigger createTrigger [type, position, makeGlobal] Parameters: [type, position, makeGlobal]: Array type: String position: Position2D, Position3D or Object makeGlobal (optional): Boolean - locality flag, true - trigger is global , false - trigger is local (available since Arma 3 v1.43.129935)
  22. Ну создание триггера локального ТОЛЬКО серверу изи -> (работает только в A3 если чо) if (isServer) then{ _vicUS = 0; _trg = createTrigger ["EmptyDetector", getMarkerPos "us",false]; _trg setTriggerArea [250, 400, 0, false]; _trg setTriggerActivation ["ANY", "PRESENT", true]; _trg setTriggerStatements [ "car in thisList", "_vicUS = [] execVM 'CheckUS.sqf';", ""];}; код CheckUS.sqf у меня пока не готов но все впереди. Чтото типа если timeus > 5 тогда timeus = timeus -5 ; sleep 5 иначе вызываем процедуру победы синей стороны. Получется триггер чекает машину в зоне (вродебы каждые 0.5 сек) если в зоне и время нахождения в зоне пока не подошло к концу (например timeus задать 1200 сек) вычитает время и ждет дальше подошло время - вызываем процедуру победы синей стороны (пока не написал). И вроде ВЕСЬ код (возможно кроме процедуры победы) будет выполнятся ТОЛЬКО на сервере.
  23. @swatSTEAM, А зачем эвент хендлер игрокам? Я как думал (поправь если не так): Задача на миске захватить и удержать: (прям белый снег вспомнился :) только там без триггера нахождение в зоне считается, через равноудаленность от объекта) Мозг мне подсказывает что лучше создать триггер (через инит локальный серверу) в его инициализации написать ANY + car in thisList. В активации -> вызов sqf которая чекает сколько времени простоял объект car в триггерной зоне. Если простоял достаточно - просто вызываю конец миссии через функцию wmt. т.е все вычисления на серве получаются, да и вообще клиенты не знают о триггере как объекте.
  24. Парни что лучше? 1) Создание триггеров в 2д редакторе (прям в миске) или 2) Создание такого триггера? if (isServer) then{_trg = createTrigger ["EmptyDetector", getMarkerPos "us",false];бла бла бла; }; Жопой чую, что триггерами и вычислениями внутри триггеров лучше считать на сервере (благо можно создать триггер локальный только серверу), но как поведут себя клиенты?. Есть удачные примеры реализации локальных серверу триггеров? WMT мне маловат по функционалу прост.
×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.