Перейти к содержимому


Фотография

Странности с EventHandler


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 17 July 2018 - 18:35

Есть эвентхандлер Take для игроков на сервере. Инициализируется в initPlayerLocal.sqf

Смысл в том, что если игрок берет топор из любого контейнера то у него в одежке или броне появляется заряд для топора и еще один попадает в сам топор. Так вот проблема в том, что у некоторых это срабатывает, а у многих заряды вообще не появляются. Я уже хандлер в инит после респавна переносил - не помогает. И проверить не могу сам, потому что у меня то как раз все в порядке. 

Кто-нибудь может подсказать в каком направлении рыть?

player addEventHandler ["Take",
{ _unit = _this select 0;  _item = _this select 2;
 if (_item isEqualTo "WC_Axe") then
 {
    player addItem "Hatchet_Swing";
    player addSecondaryWeaponItem "Hatchet_Swing";
 };
 
}];

  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 17 July 2018 - 20:14

Zlobot, во-первых, прочитайт мой ответ в данной теме, там будет один момент, который может ломать вам все в сетевой игре
Во-вторых, что у вас там на счет возрождения?
  • 0

#3 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 18 July 2018 - 12:30

Zlobot, во-первых, прочитайт мой ответ в данной теме, там будет один момент, который может ломать вам все в сетевой игре
Во-вторых, что у вас там на счет возрождения?

Да, вероятно этот хандлер не у всех активируется. Эти траблы с JIP меня уже достали! При инициализации есть такой код, возможно избыточный.

В initPlayerLocal.sqf вначале ожидает: 

waitUntil {!isNull player};
waitUntil {sleep 0.1; !(isNil {player}) && player == player && alive player};

waitUntil {time > 0};//ждать пока миссия полностью не запустится

Потом в числе прочего вызывается скрипт: null = [player] execVM "Scripts\wc_survival_init.sqf"; 

А там опять ожидает...

if (_player != player) then { waitUntil {_player == player}; waitUntil {time > 10}; }; 

waitUntil { !(isNull (findDisplay 46)) };
И потом присваиваются переменные и там же хандлеры PUT и TAKE.
При респавне скрипт ждет закрытие диалога с выбором точки респа и потом инициализация всего нужного.
Вроде где-то было про некоторые хандлеры, что они работают до смерти юнитов, а потом их нужно по новой ставить. Может поэтому и косячит? Но с другой стороны у некоторых игроков все в порядке. Наверное действительно JIP подсирает.

Сообщение отредактировал Zlobot: 18 July 2018 - 12:37

  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2018 - 13:10

Zlobot, мне всегда было достаточно этого:

waitUntil {!(isNull player)};

А если нужно было, чтобы процесс начинался с начала миссии, то добавлял это:

waitUntil {time > 0};

Вроде где-то было про некоторые хандлеры, что они работают до смерти юнитов, а потом их нужно по новой ставить. Может поэтому и косячит?

Судя по

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

, это к Put и Take не относится.


  • 0

#5 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 18 July 2018 - 13:26

Zlobot, мне всегда было достаточно этого:

waitUntil {!(isNull player)};

А если нужно было, чтобы процесс начинался с начала миссии, то добавлял это:

waitUntil {time > 0}; 

Ну и я так думал.)) Однако, проблема возникает почему-то. Вроде для JIP еще рекомендуют: waitUntil{local player}; Добавлю и посмотрим, как будет.


  • 0

#6 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1791 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 18 July 2018 - 13:55

Zlobot, попробуй создать тестовую миссию. Создай файл initPlayerLocal.sqf с таким содержимым:

waitUntil {!(isNull player)};

player addEventHandler ["Put", {hint "Put";}];
player addEventHandler ["Take", {hint "Take";}];

и проверь: если подсказки появляются после смены роли, то косяк где-то в другом месте.


  • 0

#7 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 18 July 2018 - 15:03


то у него в одежке или броне появляется заряд для топора и еще один попадает в сам топор.

Сначала наделают фигни, а потом с помощью ЕХ пытаются ее порешать.

Вот не проще ли, добавить в контейнер магазин к топору? И пусть ставят юзают как обычную пушку с обычным магазином.

~пауза на 0.03(точильный круг, 10000 зарядов)


Сообщение отредактировал NoNameUltima: 18 July 2018 - 15:04

  • 0

#8 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 18 July 2018 - 15:49

NoNameUltima, магазин к топору - вы хоть сами представляете как это будет выглядеть в глазах пользователей?
Ему нужна система по типу как было в DayZ Mod, где у тебя топор всегда имел милион выстрелов и был заряжен, и я ничего плохого в этом не вижу прост опотому что по другому холодное оружие в арме более никак не реализовать
  • 0

#9 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 18 July 2018 - 19:12

 

Ему нужна система по типу как было в DayZ Mod

Ну да, топор там именно и заряжался магазином, и стрелял как дедушкин тоз)


 

player addEventHandler ["Take",
{ _unit = _this select 0;  _item = _this select 2;
 if (_item isEqualTo "WC_Axe") then
 {
    player addItem "Hatchet_Swing";
    player addSecondaryWeaponItem "Hatchet_Swing";
 };
 
}];

Я дико извиняюсь, а где здесь собственно сами заряды!)

 

Далее, если в арме можно махать топором только если он сконфигурирован как пушка, то и топор в инвентарь добавляйте соответствующей командой, если это пушка то это пушка, а не итем. Не надо путать бабушку-арму, ей и так не легко.


  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 18 July 2018 - 19:20

ЗЫ

Я догнал, Ультима прав, решение на уровне, а найду я на жопу приключений), попробуйте сделать так, из кода вызываемого хандлером, сделайте ещё один вызов но уже спавном, и уже из спавна, добавьте итемы, только сделайте перед добавлением проверку на предмет, топор уже в слоте? Если ещё не в слоте, то пускаем цикл с проверкой до тех пор пока арма не создаст топор в нужном слоте.


Сообщение отредактировал SteelRat: 18 July 2018 - 19:21

  • 0

#11 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 18 July 2018 - 23:40


выглядеть в глазах пользователей

Да нормально -

Так же как и расхреначить танк топором_) Делают же такое в дейзе - привыкли)

Топор надо затачивать.

P.S. По теме - там магазин с прозрачной текстурой(или не имеет её), суть то одна и та же, ну 1000000 зарядов... Я просто предложил сделать его видимым и не парить моск.


  • 0

#12 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

  • Пользователи
  • 264 сообщений
  • Откуда:Moscow

Отправлено 19 July 2018 - 13:18

Какой это мод?
В “прогрузке” игрока как нибудь была задействована команда selectPlayer?

Сообщение отредактировал ReXcOr: 19 July 2018 - 13:23

  • 0

#13 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 20 July 2018 - 14:24

Щас по порядку отвечу.)

 

Я дико извиняюсь, а где здесь собственно сами заряды!)

 

топор - ставится в слот гранатометов. Проверка идет на совпадение берущегося предмета с названием класса топора и если тру, то добавляется заряд.  player addSecondaryWeaponItem "Hatchet_Swing" Второй в одежду, просто от тоски, что не у всех появляется первый.) В Arma 3 DEV 1.37, this command also supports weapon magazines. - из арма-вики.

 

 

 Я просто предложил сделать его видимым и не парить моск.

Магазин с текстуркой, видимый и его прекрасно можно выкинуть и подобрать, почти как у Вас, но типа "взмах". Не миллион, но 10к зарядов.

 

Какой это мод?
В “прогрузке” игрока как нибудь была задействована команда selectPlayer?

Мод мой собственный - Warcorps, стоит только на одном сервере. Данной команды не применялось. А что с ней?

 

 

Zlobot, попробуй создать тестовую миссию. Создай файл initPlayerLocal.sqf с таким содержимым:

waitUntil {!(isNull player)};

player addEventHandler ["Put", {hint "Put";}];
player addEventHandler ["Take", {hint "Take";}];

и проверь: если подсказки появляются после смены роли, то косяк где-то в другом месте.

Весь прикол в том, что конкретно у меня, что на тестах, что на игровом серваке все нормально. Заряды не появляются примерно у половины заходящих игроков, да и то не всегда. Я там исправил немного и после обновы мода посмотрим от JIP ли проблема или еще в чем.


  • 0

#14 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 20 July 2018 - 14:31

ЗЫ

Я догнал, Ультима прав, решение на уровне, а найду я на жопу приключений), попробуйте сделать так, из кода вызываемого хандлером, сделайте ещё один вызов но уже спавном, и уже из спавна, добавьте итемы, только сделайте перед добавлением проверку на предмет, топор уже в слоте? Если ещё не в слоте, то пускаем цикл с проверкой до тех пор пока арма не создаст топор в нужном слоте.

Это интересно. Если проблема окажется не в JIP клиентах, то попробую такой способ.


  • 0

#15 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 July 2018 - 20:10

 

Весь прикол в том, что конкретно у меня, что на тестах, что на игровом серваке все нормально. Заряды не появляются примерно у половины заходящих игроков, да и то не всегда. Я там исправил немного и после обновы мода посмотрим от JIP ли проблема или еще в чем.

Я вам выше предложил вариант вероятного решения проблемы.

Суть вашего алгоритма состоит в том, что вы добавляете обвес пушке в слоте гранотомёта, а теперь на минуточку, а что вы получите если ваш код отработает быстрее чем добавится в слот сам гранатомёт? Я отвечу, нет пушки в слоте, значит и добавлять обвес не куда, а так как машины у всех разные, у кого то 16 ядер, а у кого то китайский калькулятор, дальнейшую логику проследите сами.

Перед тем как добавить итем проверьте что пушка уже в слоте.


  • 0

#16 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 21 July 2018 - 06:33

Суть вашего алгоритма состоит в том, что вы добавляете обвес пушке в слоте гранотомёта, а теперь на минуточку, а что вы получите если ваш код отработает быстрее чем добавится в слот сам гранатомёт? Я отвечу, нет пушки в слоте, значит и добавлять обвес не куда, а так как машины у всех разные, у кого то 16 ядер, а у кого то китайский калькулятор, дальнейшую логику проследите сами.

 

 

Перед тем как добавить итем проверьте что пушка уже в слоте.

 

Да-да, я понял для чего это нужно. Но ведь хандлер идет на событие взятия чего-либо и проверка идет именно на берущийся ствол. И только потом идет добавление зарядов и не только в оружие, но и в инвентарь. Однако Вы правы, проверка на наличие нужного оружия в слоте не помешает. Спасибо еще раз)


  • 0

#17 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 21 July 2018 - 11:55

Вот вам мой опыт из недавнего.
Я определил хандлер на открытие инвентаря, код вызываемый хандлером обращается к элементам дисплея инвентаря.
Я какое то время пытался понять почему мой код в хандлере не даёт нужного эффекта.
Всё оказалось банальным. Потому что я оказался не внимателен, к тому как работает данный хандлер.
А суть в том что код вызываемый хандлером вызывается в аккурат ПЕРЕД открытием самого дисплея инвентаря.
То есть, по нажатию клавиши вызова инвентаря, вызывается код определённый в хандлере, а после того как отработает код вызывается сам дисплей.
А так как я упустил этот нюанс, естественно мой код в хандлере обращался в пустоту, ибо интерфейс инвентаря ещё не существовал.

О чём я? Правильно, нужно быть внимательным к мелочам. И не лениться делать проверки на предмет существует ли объект к которому вы собираетесь обратиться.


Сообщение отредактировал SteelRat: 21 July 2018 - 11:57

  • 0

#18 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 16 August 2018 - 14:47

Чем дальше тем чудесатее. Как оказалось, по прежнему не срабатывают в МР всякие варианты предлагаемые выше. Поместил создание хандлеров прямо в инит игровых слотов,(или как они там называются в mission.sqm) результаты теже - у некоторых срабатывает, но у кого-то нет. Стал проверять хандлер "Take" и оказалась такая фигня: (слип поставил для проверки)

При взятии топора который без заряда и он и контейнер (откуда был взят) определяются нормально, но заряда пока нет. Отрабатывает 5 секунд - появляется в заряд и тут же переписывается хинт и показывает что итем уже не топор, а заряд, а контейнера нет вообще! То есть выходит что хандлер автоматом срабатывает еще раз но уже на инвентарь самого игрока. Или я чего-то вообще не понимаю.(

Далее еще веселее. Если брать топор в котором уже есть заряд, или заряд лежит рядом, или даже есть у игрока отдельно, то хинт показывает все правильно и не переписывается. Ну или он при повторе имеет те же данные. 

Если заменить создание магазина на стандартную форму "addMagazine" то результат аналогичен, но просто при подборе топора с зарядом, у игрока появляется лишний магазин, что понятно - он же вызывается до получения оружия. 

Возможно у игроков с большим лагом эта вот странность и влияет на результат. Как избежать пока не придумал, вариант со спавном топора и рядом к нему магазин срабатывает, но когда игрок теряет заряд (по любой причине) то заряда ему уже не получить.

код: 

player addEventHandler ["Take",{
_this spawn {
  _unit = _this select 0; 
  _cont = typeOf (_this select 1);
  _item = _this select 2;
 
  hint format["_unit %1, _item %2, _container %3",_unit, _item, _cont];
  sleep 5;
  if(_item isEqualTo "WC_Axe") then {
    //_unit addMagazine ["Hatchet_Swing",10000];
    waitUntil { _secWeapon = secondaryWeapon _unit; (_secWeapon isEqualTo "WC_Axe") };
   _unit addSecondaryWeaponItem "Hatchet_Swing";
   };
 };
}];
 
И кстати, если заменить оружие на любое другое с соответствующим ему магазином, эффект аналогичен.

Сообщение отредактировал Zlobot: 16 August 2018 - 15:09

  • 0

#19 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 16 August 2018 - 14:53

кому интересно вот картинки

1 - топор взят, заряда пока нет, хинт показывает все верно

2 - отработала задержка, создан заряд и хинт показывает уже что взят заряд

3 - взят топор с зарядом в нем. хинт норма

Прикрепленные файлы


  • 0




Яндекс.Метрика