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

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

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
Ron

Ошибка серверного мода VehicleActivityLogs

Вечер добрый, установлен  серверный мод VehicleActivityLogs, логи ведутся, с машинами все хорошо, но в crash логе пишет ошибку:

NULL pointer to instance
Class: 'CarScript'
Entity id:2929119

Function: '~CarScript@1729#1'
Stack trace:
VehicleActivityLogs/scripts/4_World/entities\vehicles\moddedcarscript.c:15

15 строка, как понимаю деструктор void ~CarScript().

moddedcarscript.c:

modded class CarScript
{
	PluginVehicleLogs m_VehicleLogger = PluginVehicleLogs.Cast(GetPlugin(PluginVehicleLogs));
	
    void CarScript()
    
	{
        if (GetGame().IsServer())
        {
            GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.LogPosition, 3, false, true);
        }
    }


	void ~CarScript()
	{
        if (GetGame().IsServer())
            LogPosition(false);
	}

    void LogPosition(bool init)
    {
		string msg = "initialized";
		if (!init)
			msg = "closed or destroyed";

        PluginVehicleLogs m_VehicleLogger = PluginVehicleLogs.Cast(GetPlugin(PluginVehicleLogs));
        m_VehicleLogger.Log(GetDisplayName() + " (" + this + " - pos " + GetPosition() + ") " + msg);
    }
}

При создании экземпляра класса, выполнится конструктор:

void CarScript()
    {
        if (GetGame().IsServer())
        {
            GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.LogPosition, 3, false, true);
        }
    }

и через 3 секунды вызовет функцию void LogPosition(bool init), со значение init = true, что отразится в логе файле.

void LogPosition(bool init)
    {
		string msg = "initialized";
		if (!init)
			msg = "closed or destroyed";

        PluginVehicleLogs m_VehicleLogger = PluginVehicleLogs.Cast(GetPlugin(PluginVehicleLogs));
        m_VehicleLogger.Log(GetDisplayName() + " (" + this + " - pos " + GetPosition() + ") " + msg);
    }

Ошибка получается возникает при вызове деструктора, который выполняется при корректном завершении работы сервера или уничтожении класса( верно?) и вызовет void LogPosition(bool init), со значение init = false, что отразится в логе файле.

void ~CarScript()
	{
        if (GetGame().IsServer())
            LogPosition(false);
	}

 В чем здесь загвоздка? Помогите разобраться.

Мои познания очень ограничены, может и глупость конечно, но в деструкторе, по условию - if (GetGame().IsServer()) - если игра запущена как сервер, то LogPosition(false);.       

Но это выполнится если уничтожение экземпляра класса произойдет при работающем сервере, а если он выключается? проверка -  if (GetGame().IsServer()) - вернет null(ничего), так как сервер уже выключился.

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

 

 

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


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

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

  • 0

Ошибка возникает, так как при деструкторе. т.е.

void ~CarScript()
	{
        if (GetGame().IsServer())
            LogPosition(false);
	}

вызывается функция LogPosition, в которой есть использование данных текущего класса, т.е. this, а при деструкторе объект этого же класса иногда не заполнен данными а NULL, проще говоря на момент выполнения функции уже удален.

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


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

Как же исправить такое или оставить как есть.     Да, при работающем сервере отрабатывает нормально, проверял(уничтожал авто, он в лог записывает о разрушении), получается временные рамки соблюдены, объект класса заполнен данными и еще не удален. При выключении, на момент выполнения функции уже все удалено((( 

 

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


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

тут я думаю надо переписывать общий формат записей в данном моде. Щас завязка там идет за объекте в классе, что мол создался - новая тачка, удалился - удалилась машинка.
А по факту же не совсем так все.
Например EEDelete(EntityAI parent) в

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

 

Также в родном классе есть функция OnUpdate( float dt )

Т.е. в теории на нее можно завязать и обновление координат машины в логах, ну или массиве каком-то своем.

Плюс советую поглядеть родной код класса, есть такие функции как OnContact, OnAttached,OnDeattached и т.п., все это тоже можно логировать же или использовать.

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

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

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

Поддержка