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


Фотография

Событие взрыва мины.


Лучший Ответ Schatten , 25 November 2017 - 18:14

В итоге делаю сейчас через цикл while. Но не таким способом как предлагаете вы. Боюсь мне не поможет данный пример, по той причине, что мне нужно сравнивать с записью в базе, потому как их будет очень много. Допустим 200 штук и каждая мина ставится при запуске сервера. Я и хотел что на событие я мог бы обрабатывать удаление, а так я вижу реальное решение это сравнивать по базе данных с её позицией и владельцем и классом, через какой то промежуток времени, чтоб не было большой нагрузки.

Какая нагрузка? Обращение к БД будет только тогда, когда взорвётся мина:

{
	_x spawn {
		_mine = _this;

		waitUntil {
			sleep 1;

			!(alive _mine)
		};

		[_mine] call deleteMineInfoFromDB;
	};
} forEach mines;

Нагрузка будет только если все мины взорвутся одновременно, но какова вероятность такого события?

Перейти к сообщению


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

#1 OFFLINE   murz85

murz85

    Ефрейтор

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

Отправлено 25 November 2017 - 00:10

Приветствую всех! Вообщем написал скрипт для сохранения мин в базу данных.
Скрипт писал для MP. Суть вопроса такова:

_mine addMPEventHandler ["MPKilled", {diag_log format["DEBUG BOOM:%1",_this];}];

_mine хранит объект мины с классом "APERSMine_Range_Ammo". Она появляется, все работает отменно, но не срабатывает событие. Само событие "MPKilled" срабатывает на уничтожение техники, юнита, но не хочет срабатывать на шахту(мину). Может кто знает как можно взять событие уничтожение привязать к мине? Может нужно использовать локальные события? Но я даже не предполагаю что может подойти.

 

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

Заранее благодарю за помощь


Сообщение отредактировал murz85: 25 November 2017 - 00:21

  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 25 November 2017 - 11:36

murz85, события killed не работает на ни на мины, ни на снаряды, ни на пулм. Тут нудно использовать ручной цикл:
while {alive _mine} do
{
  //Мина жива
};
//Мина мртва (Удалена или взорвалась)
Еще можно использовать событие

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

, но оно срабатывает не на взрыв, а на нанесение объекту урона от взрыва (Следовательно нужно будет создавать какой-нибудь объект, который при взрыве этой мины точно получит от нее урон от взрыва, но и тут есть косяк в том, что от любого взрыва (Кинул гранату - сработало, выстрели ли из БМП - сработало))
  • 0

#3 OFFLINE   murz85

murz85

    Ефрейтор

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

Отправлено 25 November 2017 - 18:04

По поводу "

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

" уже думал. В ряду его возможностей не подходит. В итоге делаю сейчас через цикл while. Но не таким способом как предлагаете вы. Боюсь мне не поможет данный пример, по той причине, что мне нужно сравнивать с записью в базе, потому как их будет очень много. Допустим 200 штук и каждая мина ставится при запуске сервера. Я и хотел что на событие я мог бы обрабатывать удаление, а так я вижу реальное решение это сравнивать по базе данных с её позицией и владельцем и классом, через какой то промежуток времени, чтоб не было большой нагрузки.

Уже сделал и все работает.
Есть другой вопрос, как назначить владельца данной мины? 
setOwner не работает.


addOwnedMine уже нашел ))))


  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 25 November 2017 - 18:14   Лучший Ответ

В итоге делаю сейчас через цикл while. Но не таким способом как предлагаете вы. Боюсь мне не поможет данный пример, по той причине, что мне нужно сравнивать с записью в базе, потому как их будет очень много. Допустим 200 штук и каждая мина ставится при запуске сервера. Я и хотел что на событие я мог бы обрабатывать удаление, а так я вижу реальное решение это сравнивать по базе данных с её позицией и владельцем и классом, через какой то промежуток времени, чтоб не было большой нагрузки.

Какая нагрузка? Обращение к БД будет только тогда, когда взорвётся мина:

{
	_x spawn {
		_mine = _this;

		waitUntil {
			sleep 1;

			!(alive _mine)
		};

		[_mine] call deleteMineInfoFromDB;
	};
} forEach mines;

Нагрузка будет только если все мины взорвутся одновременно, но какова вероятность такого события?


Сообщение отредактировал Schatten: 25 November 2017 - 18:14

  • 0

#5 OFFLINE   murz85

murz85

    Ефрейтор

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

Отправлено 25 November 2017 - 18:24

Согласен тоже верно! Только вот вопрос, а разве waitUntil  не будет останавливать процесс?
Вообще по идеи это триггер для мины. Да слушайте надо попробовать. Спасибо! Отпишусь на днях.


  • 0

#6 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 25 November 2017 - 18:25

Допустим 200 штук и каждая мина ставится при запуске сервера

Самое бесполезное действие. Какова вероятность какого-либо события с объектом, если все "источники" событий находятся в не зоны этого объекта? Ответ: нулевая и поэтому: игрок вошел в зону А - сервер загрузил объекты в зоне А, игрок вышел из зоны А - сервер выгрузил объекты из зона А и т. д.
  • 0

#7 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 25 November 2017 - 18:31

Только вот вопрос, а разве waitUntil не будет останавливать процесс?


waitUntil останавливает поток, в котором запущен, до того момента, когда код вернет true. Проверка кода осуществляется его вызовом каждый (Исклбчение, высокая нагрузка на игру или использование других команд «задержки») фрейма симуляции (В А3 понятие идентичное FPS) и в этом коле вы можете писать все, что угодно (Хоть бесконечные циклы, хоть сложные вычисления, хоть sleep)

Сообщение отредактировал vlad333000: 25 November 2017 - 18:33

  • 0

#8 OFFLINE   murz85

murz85

    Ефрейтор

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

Отправлено 26 November 2017 - 14:19

Спасибо Влад за помощь вопрос решен.


  • 0

#9 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 26 January 2024 - 22:35

Здравствуйте, товарищи! А как же провести проверку при срабатывании сигнальной мины, а не при её разминировании? То есть, не заметил, наступил и враги прибежали. Заметил, разминировал и всё тихо.


  • 0

#10 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 01 February 2024 - 22:24

Здравствуйте, товарищи! А как же провести проверку при срабатывании сигнальной мины, а не при её разминировании? То есть, не заметил, наступил и враги прибежали. Заметил, разминировал и всё тихо.

Разобрался!

 
this addEventHandler ["Explode", {if(({_x distance  mine1 < 5} count playableUnits) > 0) then {trevoga=true; publicVariable "trevoga";};}];
это в инит мины с именем "mine1". Если враг на свою растяжку наступит, то аларма не будет


  • 0

#11 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 01 February 2024 - 22:24

Здравствуйте, товарищи! А как же провести проверку при срабатывании сигнальной мины, а не при её разминировании? То есть, не заметил, наступил и враги прибежали. Заметил, разминировал и всё тихо.

Разобрался!

 
this addEventHandler ["Explode", {if(({_x distance  mine1 < 5} count playableUnits) > 0) then {trevoga=true; publicVariable "trevoga";};}];
это в инит мины с именем "mine1". Если враг на свою растяжку наступит, то аларма не будет


  • 0

#12 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 04 February 2024 - 00:10

this addEventHandler ["Explode", {if(({_x distance  mine1 < 5} count playableUnits) > 0) then {trevoga=true; publicVariable "trevoga";};}];

if (!(local this)) exitWith { };

this addEventHandler [
    "Explode",
    {
        params ["_mine"];

        if ((playableUnits findIf { (_x distance _mine) < 5 }) >= 0) then {
            trevoga = true;

            publicVariable "trevoga";
        };
    }
];

  • 0

#13 OFFLINE   Cooler58

Cooler58

    Сержант

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

Отправлено 06 February 2024 - 23:10

 

this addEventHandler ["Explode", {if(({_x distance  mine1 < 5} count playableUnits) > 0) then {trevoga=true; publicVariable "trevoga";};}];

if (!(local this)) exitWith { };

this addEventHandler [
    "Explode",
    {
        params ["_mine"];

        if ((playableUnits findIf { (_x distance _mine) < 5 }) >= 0) then {
            trevoga = true;

            publicVariable "trevoga";
        };
    }
]; 
Schatten, спасибо за оптимизацию кода

  • 0




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