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


Фотография

Помогите со скриптом. Возрождение с тем, что было при смерти.


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

#1 OFFLINE   Sta1lex

Sta1lex

    Рядовой

  • Пользователи
  • 2 сообщений

Отправлено 24 January 2016 - 01:09

Всем привет!

 

Нужен скрипт, чтобы при возрождении (респаун) все оставалось так же как перед смертью.

 

Остановился на том, что удалось все проделать с оружием и его модулями. Но с рюкзаком, жилетом, шлемом и очками возникает проблема. Я понимаю, что это другой тип объектов и возможно с ними надо по другому работать.

 

Вот сам скрипт:

 

 

while {true} do {
 
 waitUntil {!(alive player)};
 
 PlayerWeapons = weapons player;
 PlayerMagazines = magazines player;
 PlayerItems = items player;
 PlayerHandgunItems = HandgunItems player;
 PlayerPrimaryWeaponItems = PrimaryWeaponItems player;
 
 waitUntil {alive player};
 
 removeAllWeapons player;
 removeAllItems player;
 removeAllAssignedItems player;
 removeVest player;
 removeBackpack player;
 removeHeadgear player;
 removeGoggles player;
 
 
 {
 player addMagazine _x;
 } forEach PlayerMagazines;
 
 {
 player addWeapon _x;
 } forEach PlayerWeapons;
 
 {
 player addPrimaryWeaponItem _x;
 } forEach PlayerPrimaryWeaponItems;
 
 
 {
 player addHandgunItem _x;
 } forEach PlayerHandgunItems;
 
 
 };
 

 

 

Если я также попробую с backpack, vest или headgear скрипт выдает ошибку.

 

 

 

Заранее спасибо.


  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 24 January 2016 - 01:40

1. Рюкзак, каска, бронежилет, униформа - это не массивы и естественно у вас выдаёт ошибку на forEach, это тип строки - класс предмета в конфиге
2.

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

+ команды написанные в разделе see also
  • 0

#3 OFFLINE   Sta1lex

Sta1lex

    Рядовой

  • Пользователи
  • 2 сообщений

Отправлено 24 January 2016 - 21:18

Спасибо за направление. Получилось! Осталось одна проблема. При возрождении, обоймы, которые были в оружии, пропадают. Хочу добиться, чтобы игрок появлялся с обоймами и количеством патронов в них, как при смерти. Думаю, плесать надо от 

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

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

 

 
while {true} do {
 
 waitUntil {!(alive player)};
 
 // Save the weapon config of the player when he die.
 
 playerUniformitems = Uniformitems player;
 playergoggles = Goggles player;
 playerbackpackitems = Backpackitems player;
 playervestitems = Vestitems player;
 playervest = Vest player;
 playerbackpack = Backpack player;
 PlayerMagazines = magazines player;
 PlayerWeapons = weapons player;
 PlayerItems = items player;
 PlayerHandgunItems = HandgunItems player;
 PlayerPrimaryWeaponItems = PrimaryWeaponItems player;
 
 
 waitUntil {alive player};
 
 // Give back the weapons the player had when he died.
 
 removeAllWeapons player;
 removeAllItems player;
 removeAllAssignedItems player;
 removeVest player;
 removeBackpack player;
 removeHeadgear player;
 removeGoggles player;
 
 
 player addBackpack playerbackpack;
 player addVest playervest;
 player addGoggles playergoggles;
 
 {
 player additemtoUniform _x;
 } forEach playerUniformitems;
 
 
 {
 player additemtobackpack _x;
 } forEach playerbackpackitems;
 
 {
 player additemtovest _x;
 } forEach playervestitems;
 
 {
 player addMagazine _x;
 } forEach PlayerMagazines;
 
 
 {
 player addWeapon _x;
 } forEach PlayerWeapons;
 
 
 {
 player addPrimaryWeaponItem _x;
 } forEach PlayerPrimaryWeaponItems;
 
 
 {
 player addHandgunItem _x;
 } forEach PlayerHandgunItems;
 
 
 };

 

 


Сообщение отредактировал Sta1lex: 26 January 2016 - 02:00

  • 0

#4 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 01 March 2018 - 22:04

player addeventhandler ["killed",
{
 [player,[missionnamespace,"virtualinventory"]] call Bis_fnc_saveinventory;
}];
player addeventhandler ["respawn",
{
[player,[missionnamespace,"virtualinventory"]] call Bis_fnc_loadinventory;
}];

вставить в InitPlayerLocal.sqf
 


Сообщение отредактировал Forsion: 01 March 2018 - 22:10

  • 0

#5 OFFLINE   armadillo

armadillo

    Ефрейтор

  • Пользователи
  • 34 сообщений
  • Откуда:Arma 2 Dayz

Отправлено 13 August 2018 - 13:41

player addeventhandler ["killed",
{
 [player,[missionnamespace,"virtualinventory"]] call Bis_fnc_saveinventory;
}];
player addeventhandler ["respawn",
{
[player,[missionnamespace,"virtualinventory"]] call Bis_fnc_loadinventory;
}];
вставить в InitPlayerLocal.sqf
Если перс крякнет в текстуре - велика вероятность что его сохранит голого
  • 0

#6 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 13 August 2018 - 14:54

гугли

getUnitLoadout

addMPEventHandler ["MPKilled".....

или

addEventHandler ["killed"...

 

дальше

profileNameSpace

missionNameSpace

 


Если перс крякнет в текстуре - велика вероятность что его сохранит голого

Что то я не замечал такого, но раз такое дело - добавь цикл, который будет каждые 5 сек будет сохранять инвентарь в доп. переменную, а в событии killed добавь проверку - если инвентарь пустой, - взять последний сохраненный с доп. переменной.

ЗЫ - Дюпать будет правда очень удобно в МП, - взял в руки 1 пушку, скинул на землю, сдох, пушка снова в руках +  на земле...

ЗЫЗЫ - в МП в таких случаях - когда сдох в текстурах, - можно отсылать к богемии, или звать админа, если он конечно соизволит логи глянуть.


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 13 August 2018 - 15:03

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

Ибо с большой долей вероятности при наступлении сего момента у перса начинают рубиться движком симуляции, что с большой долей вероятности может повлиять на корректность получаемых данных.

Как и сказал ультима, если нужно сохранить данные перса, с целью последующего восстановления этих данных, то эти данные нужно сохранять с неким, по вкусу таймингом, в процессе, пока перс ещё жив, а не в хандлерах.

 

ЗЫ

Или как вариант, повесить на перса хандлер на открытие-закрытие инвентаря, и через них обновлять данные о сохранении.


Сообщение отредактировал SteelRat: 13 August 2018 - 15:06

  • 0

#8 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1808 сообщений

Отправлено 15 August 2018 - 12:06

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

Во-первых, пока не испытывал проблем с сохранением данных игрока в обработчике события (если быть точным, то в обработчике события я присваиваю переменной данные игрока и отправляю их на сервер, где уже происходит сохранение).
Во-вторых, хотелось бы узнать о "разумных" вариантах сохранения. Причём, чтобы была исключена возможность получить двойной комплект, например, оружия (когда игрока убивают, он выходит из игры, потом заходит и получает свой шмот + шмот со своего же трупа).
 
У себя я сделал сохранение в такие моменты: раз в 2 минуты, при смерти и выходе с сервака. Как я уже написал, с проблемами не сталкивался.


Сообщение отредактировал Schatten: 15 August 2018 - 12:11

  • 0

#9 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 15 August 2018 - 13:01


У себя я сделал сохранение в такие моменты: раз в 2 минуты, при смерти и выходе с сервака. Как я уже написал, с проблемами не сталкивался.

У меня стоит сохранение в MPKilled, OnDisconnect, + раз в 20 минут синхрон с БД.

Синхронизация в цикле, по таймеру, - в принципе страховка, от падений сервака, и по большому счету не нужна нафиг. Так что откат в 20 минут, если уж серв соизволит упасть - ничего страшно. Не такое частое событие.(скорее - редкость)

*ЗЫ Ну тут еще момент такой - у меня автокик сделал игроков перед рестартом сервера, за минуту. Так что перед рестартом у всех ОнДисконнект сработает.


  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 15 August 2018 - 15:41

 

Во-первых, пока не испытывал проблем с сохранением данных игрока в обработчике события

 

Однако этот пост

https://arma3.ru/for...o-bylo/?p=80666

говорит о вполне вероятности получить проблему в обработчике события killed.


  • 0

#11 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 15 August 2018 - 15:57

ЗЫ

Вообще для реализации этой темы подходят хандлеры Put и Take.
Перс что то поднял, сохраняем данные из обработчика, перс что то скинул опять же сохраняем данные из обработчика.
Если это сетевой код, то что бы не бомбить сеть пока перс пол часа перекладывает туда сюда предметы, сохранять данные в глобальную переменную, и по событию killed и других событиях где это уместно, и как вариант по некому таймеру в добавок отправлять серверу эти данные для сохранения.


  • 0

#12 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1808 сообщений

Отправлено 15 August 2018 - 16:27

Однако этот пост
https://arma3.ru/for...o-bylo/?p=80666
говорит о вполне вероятности получить проблему в обработчике события killed.

Вообще не вижу никакой связи между застреванием в текстуре и тем, как могут не сохраниться шмотки игрока.
 

Вообще для реализации этой темы подходят хандлеры Put и Take.
Перс что то поднял, сохраняем данные из обработчика, перс что то скинул опять же сохраняем данные из обработчика.
Если это сетевой код, то что бы не бомбить сеть пока перс пол часа перекладывает туда сюда предметы, сохранять данные в глобальную переменную, и по событию killed и других событиях где это уместно, и как вариант по некому таймеру в добавок отправлять серверу эти данные для сохранения.

То есть к событиям открытия/закрытия инвентаря добавились события Put и Take... Плюс Killed, использование которого вроде бы недавно считалось "верхом не разумного". То есть используем 5 (!) обработчиков событий?

 

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


Сообщение отредактировал Schatten: 16 August 2018 - 13:27

  • 0

#13 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 15 August 2018 - 17:57


(если такая проблема действительно существует

Брешут. 100%.

 

addMissionEventHandler ["HandleDisconnect", Ultima_Server_Procedure_HandleDisconnect];

 

Работает гарантированно, и объект еще существует, в отличии от onPlayerDisconnected.

 

Для синхронизации, можно ограничится только одним HandleDisconnect.

 

Все остальное - страховка от падений сервера.

*У меня на сервере в МПКилл прописан скрипт, который заранее обновляет координаты, инвентарь, и т.п. на стартовый, и заносит их в БД, так что можно сказать, что синхрон еще и в МПКилл, хотя это не совсем так(не совсем корректно звучит).



события Put и Take

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


  • 0

#14 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

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

Отправлено 15 August 2018 - 18:07

P.S. А вообще - при чем тут 5 ЕХ или 25, - сабж то был в том, что именно при смерти надо что то сделать - получить инвентарь, а тут кроме как килл\мпкилл ничего нету. И если такая проблема всеж существует(что просто бред, т.к. и трупы с инвентарем остаются, и т.п. и даже АнтиРелогБот работает успешно как на А2 так и на А3), то все что можно описали выше.


  • 0

#15 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 16 August 2018 - 04:34

 

То есть к событиям открытия/закрытия инвентаря добавились события Put и Take... Плюс Killed, использование которого вроде бы недавно считалось "верхом не разумного". То есть используем 5 (!) обработчиков событий?

 

А это то что я сказал

 

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

Сохранять какие либо статы перса в момент смерти,с целью их вероятного восстановления после, именно это я и считаю верхом не разумного.

https://arma3.ru/for...o-bylo/?p=80668

И ни слова о том что использование хандлера killed не разумно в принципе.

Я вроде бы как на вполне татаро-русском, без акцента.

А сколько вешать, и зачем, хандлеров, 5, 10, 50, каждый решает себе сам.

 

События Put и Tаke были в арме уже с выходом в доступ альфы. И задолго до появления хандлеров про инвентарь.


ЗЫ

А по поводу что чему виной, хадлер или какой то другой код, который кто то наваял, да хер его знает, нам показали 5 строк кода.

Запросто может быть что параллельно с кодом вызываемым хандлером, вызывается ещё что то что начисто чистит инвентарь перса.


 


(если такая проблема действительно существует

Брешут. 100%.

 

addMissionEventHandler ["HandleDisconnect", Ultima_Server_Procedure_HandleDisconnect];

 

Работает гарантированно, и объект еще существует, в отличии от onPlayerDisconnected.

 

Для синхронизации, можно ограничится только одним HandleDisconnect.

 

Все остальное - страховка от падений сервера.

*У меня на сервере в МПКилл прописан скрипт, который заранее обновляет координаты, инвентарь, и т.п. на стартовый, и заносит их в БД, так что можно сказать, что синхрон еще и в МПКилл, хотя это не совсем так(не совсем корректно звучит).


 

 


события Put и Take

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

 

 

Это не дурость, дурость в кривых руках.

 

 

Если это сетевой код, то что бы не бомбить сеть пока перс пол часа перекладывает туда сюда предметы, сохранять данные в глобальную переменную, и по событию killed и других событиях где это уместно, и как вариант по некому таймеру в добавок отправлять серверу эти данные для сохранения.


  • 0

#16 OFFLINE   armadillo

armadillo

    Ефрейтор

  • Пользователи
  • 34 сообщений
  • Откуда:Arma 2 Dayz

Отправлено 20 September 2018 - 21:02

Bis_fnc_saveinventory в связке с killed  если перс крякнул в текстурах выдавал пустой инвентарь (хотя не всегда), это было у меня в 1,80/82 арме. щас им не пользуюсь. Put и Take и закрытие инвентаря, а также периодичные сохранения не помогут сохранить например количество патронов которое чел может выпалить перед смертью или количество предметов заюзанных без инвентаря. MPkilled я тогда не пробовал, а зря наверно. А killed с Bis_fnc_saveinventory  с завидной регулярностью присылал ересь. Итого самым стабильным вариантом именно для респавна оказалось доп.переменная + хандлер инвентаря + хандлер перезарядки + обновление на юзах предметов. что интересно  - в бд улетал инвентарь только если игрок жив, и ни одного кривого сохранения не было.


  • 0

#17 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 20 September 2018 - 22:57

 

Put и Take и закрытие инвентаря, а также периодичные сохранения не помогут сохранить например количество патронов которое чел может выпалить перед смертью или количество предметов заюзанных без инвентаря

Кол-во патронов в магазине юзаем соответствующим хандлером, который вызывается прикаждом выстреле, нужно указывать имя этого хандлера? А события Put и Take вызываются не только когда открыт ваш инвентарь, суть этих хандлеров именно в том что бы зафиксировать событие когда перс что то подобрал или дропнул.


  • 0

#18 OFFLINE   armadillo

armadillo

    Ефрейтор

  • Пользователи
  • 34 сообщений
  • Откуда:Arma 2 Dayz

Отправлено 21 September 2018 - 10:05

Хандлер фиред использовать планировал только в крайнем случае, т.к. идея обновлять количество магазинов каждый выстрел просто на всякий случай не особо нравится. И если итем при юзе скриптом заменяется другим в инвентаре, либо удаляется, каким образом пут сработает? Другое дело например - игрок не может умереть по идее не получив дамаг. Вот и сохранить все что нужно можно именно в момент когда damage игрока на критическом уровне, а прилетевший дамаг должен отправить его к предкам.В хандлере handledamage. getUnitLoadout в handledisconnect отрабатывает четко. Если getUnitLoadout будет также работать в mpkilled то задача полностью решена без особых бубнов.тогда и патроны в магазинах сохранятся и заряженные в оружии. Единственное что setUnitLoadout иногда маски некоторые не одевает, пока непонятно почему

Сообщение отредактировал armadillo: 21 September 2018 - 10:07

  • 0

#19 OFFLINE   armadillo

armadillo

    Ефрейтор

  • Пользователи
  • 34 сообщений
  • Откуда:Arma 2 Dayz

Отправлено 21 September 2018 - 10:31

P.S. А вообще - при чем тут 5 ЕХ или 25, - сабж то был в том, что именно при смерти надо что то сделать - получить инвентарь, а тут кроме как килл\мпкилл ничего нету. И если такая проблема всеж существует(что просто бред, т.к. и трупы с инвентарем остаются, и т.п. и даже АнтиРелогБот работает успешно как на А2 так и на А3), то все что можно описали выше.

Проблема в получении инвентаря была только если труп лежал в текстуре, либо пересекался с ней. Провалиться в текстуру и сдохнуть в ней в арме как за здрасьте. И если геймплей не предусматривает возврат экипировки на респавне, то эта проблема вполне понятно многим неведома.
  • 0

#20 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 22 September 2018 - 02:48

 

И если итем при юзе скриптом заменяется другим в инвентаре, либо удаляется, каким образом пут сработает?

Я понимаю, сделать простую тестовую миссию с парой десяток строк, на предмет отследить как работают данные хандлеры при манипуляциях с предметами через инвентарь, или как ведут себя хандлеры если предметы добавляются-удаляются кодом, подъёмная задача не для каждого.


 

Единственное что setUnitLoadout иногда маски некоторые не одевает, пока непонятно почему          

Если маска не сохраняется, то маска, по конфигу, это очки, а команда getUnitLoadout очки не сохраняет, на выходе, есть очки-маски, нет их, всегда в данных пустые ковычки. Фиксим это руками, после того как получили данные командой getUnitLoadout, получаем другой командой что висит на морде перса, и вставляем в полученные данные, сохраняемся.


Сообщение отредактировал SteelRat: 22 September 2018 - 02:50

  • 0




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