Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • Не хотите БАН?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок
  • Загляните на рынок

    Там вы можете продать или купить
    Всё что касается игровых серверов
  • 0
BorizzK

Такой вот вопос. Удаление обьектов с карты при выключении сервера.

Вопрос

Вобщем в процессе работы сервера происходят рандомные динамические события и вместе с ними на карте спавнятся некоторые обьекты

Если время их жизни истекает и настает время нового события и в радиусе видимости нет игроков обьекты удаляются с карты

Но

Если выключение корректно (запланированный рестарт например), вызов функции удаления происходит из деструктора класса

Все отрабатывает

Ошибок нет

Но после рестарта некоторые обьекты на месте

Тогда я замутил функцию-задержку с проверкой

 

	float TimeWait(Object object, float timeW)
	{
		float cTick = GetGame().GetTickTime() + timeW;
		while(object || GetGame().GetTickTime() < cTick )
		{
			if ( GetGame().GetTickTime() >= cTick ) break;
		}
		return GetGame().GetTickTime();
	}

и вызываю ее

 

if (object)	tW = TimeWait(object, timeW);

задержка реально происходит - делал ее 60 секунда да же

НО! обьекты эти после рестарта опять на месте

 

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

к тому же это полезно в случае крашей

 

и все же

почему обьекты не удаляются при завершении работы сервера?

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0
2 часа назад, BorizzK сказал:

почему обьекты не удаляются при завершении работы сервера?

Возможно удаление происходит уже после того, как сработало отключение связи с БД...

 

В деструктор добавь проверку Hive - есть ли он.

 

P.S. А вообще в деструкторе удалять объект...... ну это такое... Ведь деструктор и должен сработать при удалении\уничтожении))))) что же он будет удалять, если ты прямо из деструктора вызываешь еще раз удаление объекта) который и попал в деструктор потому что произошло уничтожение)

Хер его знает, что там могло произойти)

 

Добавляй свои объекты в список, какого либо класса - менеджера.

И вот в этом менеджере, внутри деструктора, просто пробегись по списку и грохни все объекты.

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

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


  • 0

NoNameUltima Не - я про деструктор класса в котором все работает

При создании 1 раз - при старте сервера отрабатывает конструктор

При выключении сервера и уничтожении класса деструктор

Этож аксиома и ты сам об этом знаешь


 

Цитата

 

Добавляй свои объекты в список, какого либо класса - менеджера.

И вот в этом менеджере, внутри деструктора, просто пробегись по списку и грохни все объекты.

 

 

Я это и делаю

некоторые удаляются а некоторые нет - рандомно

 

За минуту до рестарта

Как я это определю? А если рестарт мышкой или незапланированно через баттлу админом

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Тебе проще не связывать с рестартом, а сделать скрипт в 2 частях:
1) сам непосредственный спавн нужного при старте севрака
2) сохранение в процессе работы сервера этих объектов, например, в папке или xml-файле с записью координат и id нужного объекта
и непосредственно перед вызовом спавна тупо удалять все старые объекты с карты по известным и записанным тебе координатам.

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new перед вызовом спавна они и так удаляются - тк они в переменных класса - в массиве

они не удаляются в деструкторе при корректном выключении сервера когда класс деструктится

точнее - то удаляются то нет - либо удаляются но не все

сохраняю я их в профиле

 

у меня вот вопрос - тк проверить все руки не доходят

 

скажем создал я object

он в мире персистетно - те не как билдинг который не сохранится в базе - и имеет свой object id как и все скажем LargeTent<0b44c4aa>

он сохранится в базе и не удалится в деструкторе класса где он был создан при рестарте

при следующем старте у него будет такой же object id или нет?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 часа назад, BorizzK сказал:

При выключении сервера и уничтожении класса деструктор

Этож аксиома и ты сам об этом знаешь

Харе бредить.

При чем тут то что ты написал?

У тебя есть созданный объект.

При выключении сервера произошло его уничтожение(выделенная память была освобождена и т.д.) был вызван ДЕСТРУКТОР объекта - код который должен отработать при уничтожении объекта. И ты ПРЯМО В ДЕСТРУКТОРЕ вызываешь удаление того же объекта!!!!

15 часов назад, BorizzK сказал:

вызов функции удаления

 

ОН ЕПТЬ УЖЕ В ДЕСТРУКТОРЕ находится! А ты в деструкторе пишешь DeleteObject - и что ему делать? Функция DeleteObject, ОБЯЗАННА вызвать деструктор объекта, она вызывает, и ОПЯТЬ  и ОПЯТЬ и ОПЯТЬ, потому что каждый раз когда она его вызывает, там прописано тобой - DeleteObject

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

Ты какой то парадокс изобрел - петля времени прям.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima Есть класс

 

соскочило

сейчас поправлю пост

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima 

Я ПРО ВЫЗОВ УДАЛЕНИЯ ОБЬЕКТА В ДЕСТРУКТОРЕ КЛАССА ПИСАЛ
цитата: вызов функции удаления происходит из деструктора класса

Class MyClass
{
	
	Object object = NULL;
 
	void MyClass()
	{
		ClassInit();
	}

	void ~MyClass()
	{
		ObjectsClear();
	}

	void ClassInit()
	{
		object = GetGame().CreateObject("TestObject", "1000 10 1000");
	}

	void ObjectsClear()
	{
		object.Delete();
	}

}

При запуске сервера и инициализации класса или в процессе - там еще функции есть по таймеру - создаются обьекты на карте
В деструктора при выключении сервака вызов функции очистки

 

А ты думал я про какой деструктор?

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK хОтя мля. ну ты и велосипедист...

 

Этж псц....

 

чтобы создать тебе объект, надо сделать

 

GetGame().CreateObject("MyClass",........

Которая нативно создаст еще один объект внутри себя.

Этож псдц велосипед....... с тремя педалями.

 

я даже боюсь представить весь код)

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima 

Вот ты мне и обьясни свой ход мысли

 

Обьект класса будет существовать до тех пор пока не будет вызвано выключение сервера (корректное) (в итоге будет вызван деструктор) или не будет удален обьект класса

деструкторы классов вызываются в обратной последовательности относительно последовательно инициализации при включении

Те если мой класс инициализировался первым то при выключении он деструктнется последним

 

А следовательно пока запущен сервер клас будет существовать и будут существовать все его переменные и ссылки на созданные обьекты в них

Серверу покер в каком классе создан обьект

 

В логгировании все прекрасно видно

 

 

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK

По хорошему, тебе нужен простой класс, с объектом, в котором внутри деструктора прописать удаление из БД, но доступа к хайв дайз пока не предоставляет(и будет ли - хз)...

А функция DeleteObject удалит и из БД, но вот незадача, - только пока сервер работает.

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

так что решается это только 2 путями -

1. Создай скрипт который будет учитывать время ДО рестарта сервера, и за минуту до рестарта удалять корректно все объекты.

2. Так как ты и сделал сейчас - при респавне объекта проверять - нет ли такого же рядом.

 

ЗЫ - Первый скрипт для сервера все равно крайне желателен, - чтобы какой то ряд действий произвести - кик всех игроков к примеру и т.п. т.к. некоторые процессы возможно реализованны в ОнДисконнект.(операции с валютой и т.п.)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
4 минуты назад, BorizzK сказал:

Вот ты мне и обьясни свой ход мысли

Я тебе уже написал, что при выключении сервера, работа ХАЙВа (БД) может быть завершена ранее, чем твой скрипт в деструктор попадает, т.к. движку уже до 3.14зды, - деструкторы то отработают, но не гарантированно что удалят с базы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima Ну я таким путем и собрался идти

Те выходит при вызове заершения работы процесса он освобождает быза и дальнейшие действия уже происходят с памятью

Вот поэтому игроков и тп откатывает на момент ДО вызова завершения работы...

 

Понятно что при краше ни о каких деструкторах и тп речи быть не может потому оставлю как есть

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

NoNameUltima Я догадывался... дебилизм. Мне казалось логичным что двиг отключает и сохраняет базу после завершения всех функций и процедур...

 

Вобщем вопрос исчерпан

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK И кстати, в init.c есть инициализация хайв.

Создай переменную глобальную под него(только обязательно в папке 3_Game ) -

 

Hive GLOBAL_HIVE;

 

а в init.c вот этот код, в main

Hive ce = CreateHive();
    if ( ce )
        ce.InitOffline();

 

замен на

GLOBAL_HIVE = CreateHive();

if ( GLOBAL_HIVE )

{ GLOBAL_HIVE.InitOffline(); }

 

и вот после этого, в деструкторе объекта попробуй вписать

if ( GLOBAL_HIVE )

{ Print("Есть соединение с БД"); }

else

{ Print("Нет соединения с БД"); }

 

ну по крайней мере, посмотреть так ли это...

 

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, BorizzK сказал:

123new перед вызовом спавна они и так удаляются - тк они в переменных класса - в массиве

они не удаляются в деструкторе при корректном выключении сервера когда класс деструктится

точнее - то удаляются то нет - либо удаляются но не все

сохраняю я их в профиле

 

у меня вот вопрос - тк проверить все руки не доходят

 

скажем создал я object

он в мире персистетно - те не как билдинг который не сохранится в базе - и имеет свой object id как и все скажем LargeTent<0b44c4aa>

он сохранится в базе и не удалится в деструкторе класса где он был создан при рестарте

при следующем старте у него будет такой же object id или нет?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new они рандомно по карте спавнятся

место текущего спавна и так проверяется перед спавном по всем основным кретериям

но - если серв рестартнуть спан же может быть и в другом месте

потому я сохраняю при спавне в профиль сервера инфу о координатах и класснеймах что были заспавлены и при старте сервера в коонструкторе беру их оттуда и там подчищаю

 

просто хотел сделать совсем красиво

но не вышло

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

BorizzK я не про место текущего спавна говорю, а про место, которое выбрано скриптом для появления объекта. Проще говоря, вещь спавнится и сразу же записывается координата где именно. Скриптом ничего сложного нет такое сделать. Ровно как и очистку и прочее

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new да оно так и есть

в этом отношении все нормально

просто стало интересно почему при вырубании сервера и вызове функции очистки из деструктора класса объекты не удаляются из базы

а она оказывается отключается раньше

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

есть идея одна - сеня проверю отпишусь

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: Akie
      Вопрос в чем, как тому или иному предмету дать свойство, чтобы при использовании в инвентаре он удалялся и давал хумку, пытался сделать сам, сделал удаление предмета через функцию player removeMagazine, потом проверку на количество хумки, то есть, если хумка больше 2500 то _positive, если меньше то _negative, прописал выдачу в зависимости от условия к примеру :
      if (_Positive) then { player setVariable["humanity",(_HumanityVal+5000),true] }; прикрутил экзекут скрипта к Overwrites click actions, кнопка появилась, но при нажатии, ничего не происходит, ни удаления предмета, ни начисления хуманити, куда копать?

      Понимаю, что чего-то не хватает, а вот чего понять не могу, вот сам скрипт:
       
      private ["_item","_HumanityVal","_Negative","_Positive"] _item = "Итем класс нейм"; player removeMagazine _item; _HumanityVal = player getVariable["humanity",0]; if (_HumanityVal <= -2500) then {_Negative = true;}; if (_HumanityVal >= 2500) then {_Positive = true;}; if (_Positive) then { player setVariable["humanity",(_HumanityVal+5000),true] }; if (_Negative) then { player setVariable["humanity",(_HumanityVal-5000),true] }; Подскажите пожалуйста, что не так)
    • Автор: DrTauren
      На нашем сайте предусмотрена возможность рекламирования вашего игрового сервера/сайта/програмного обеспечения при помощи баннеров и ссылок.
       
      Баннеры под первым сообщением темы ↓
       
      Баннер на главной странице (над чатом) ↓
       
      Ссылки над первым сообщением темы ↓
       
      Ссылка на главной странице (над чатом) ↓
       
       

      Заявку вы можете заполнить в этой же теме, либо написать мне в ЛС.
      Любые сообщения не по теме запрещены.
    • Автор: Peresvet
      нипанимайу. как сменить карту на сервере?
    • Автор: BorizzK
      Вот предположим мы создали где-то экземпляр класса;
      ref Class newClass = new Class();
       
      1 Он удалится сам? При каких условиях?
      2 Как его удалить принудительно если он больше не нужен?
       
    • Автор: SpiritWolf
      Подскажите, может, кто сталкивался с проблемой, когда используешь суицид, персонаж ресается в том же месте, с тем же лутом.
      При этом после нажатия суицида, персонаж перемещается за карту, а после релога дюпается в месте смерти.
       
      P.S Вот такую ошибочку после суицида в логе сервера выдает:
       
      20:17:58 Error in expression <died set [count dayz_died, _playerID];
      _newObject setVariable ["bodyName",_play>
      20:17:58   Error position: <_newObject setVariable ["bodyName",_play>
      20:17:58   Error Undefined variable in expression: _newobject
      20:17:58 File z\addons\dayz_server\compile\server_playerDied.sqf, line 29
×
×
  • Создать...