[HL2DM] Баг физики из-за плагина

Тема в разделе "Программирование / Скриптинг", создана пользователем iamdss, 15 июл 2015.

  1. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Приветствую. Из-за моего плагина ломается физика на сервере. Симптомы - начинают проваливаться гранаты под пол, затем, через пару часов, под пол уходят предметы (уходят постепенно, понемногу, в пол, затем совсем исчезают). Это случается спустя случайное время после запуска сервера, иногда это несколько часов, иногда - сутки, но обычно не более. Это суть проблемы. Теперь о плагине.

    Плагин защищает афк игроков, стоящих N секунд без движения, делая их неуязвимыми и накладывая эффект голограммы на модель игрока. Ключевой код плагина (код сокращён):

    Код:
    SetProtection(client)
    {
    	if (!IsValidClient(client))
    		return;
    
    	if (UnderProtection[client])			// Игрок не должен быть уже под защитой
    		return;
    
    	if (GetClientTeam(client) == TeamSpec)		// Не должен быть наблюдателем
    		return;
    
    	if (GetEngineTime() < NextProtection[client])	// Выдерживаем время с момента предыдущей защиты
    		return;
    
    	SetEntProp(client, Prop_Data, "m_takedamage", 0, 1);
    	set_rendering(client, FX:FxHologram, 255, 255, 255, Render:RENDER_TRANSADD, TRANSPARENSY);
    	SetEntData(client, g_offsCollisionGroup, 1, 4, true);
    	UnderProtection[client] = true;
    }
    Код, проверяющий игрока:

    Код:
    public IsValidClient(client)
    { 
    	if (!(1 <= client <= MaxClients)	||
    		!IsClientConnected(client)	||
    		!IsClientInGame(client)		||
    		!IsPlayerAlive(client)		||
    		IsFakeClient(client)
    	)
    	return false;
    	return true;
    }
    Рендеринг модели:

    Код:
    set_rendering(index, FX:fx=FxNone, r=255, g=255, b=255, Render:render=Normal, amount=255)
    {
    	SetEntProp(index, Prop_Send, "m_nRenderFX", _:fx, 1);
    	SetEntProp(index, Prop_Send, "m_nRenderMode", _:render, 1);	
    	SetEntData(index, RenderOffs, r, 1, true);
    	SetEntData(index, RenderOffs + 1, g, 1, true);
    	SetEntData(index, RenderOffs + 2, b, 1, true);
    	SetEntData(index, RenderOffs + 3, amount, 1, true);	
    }
    Проверка, защищён ли игрок:

    Код:
    bool:IsProtected(client)
    {
    	return GetEntProp(client, Prop_Data, "m_takedamage", 1) == 0;
    }
    Снятие защиты:

    Код:
    RemoveProtection(client)
    {
    	if(IsValidClient(client) && IsProtected(client))
    	{
    		SetEntProp(client, Prop_Data, "m_takedamage", 2, 1);
    		set_rendering(client);
    		SetEntData(client, g_offsCollisionGroup, 5, 4, true);
    		UnderProtection[client] = false;
    	}
    	NextProtection[client] = GetEngineTime() + FREEZE_TIME;
    }

    Ранее проблема наблюдалась чаще, пока я не добавил пару лишних проверок в IsValidClient, поэтому я полагаю, что это моя ошибка. Вероятно, я каким-то образом затрагиваю не только игроков, но что-то ещё. В чём может быть моя ошибка и что я могу сделать, чтобы найти и исправить её?
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.505
    Симпатии:
    1.961
    Не меняй коллизию и не будет проблемы.
     
  3. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Но тогда афк-игроки будут блокировать узкие места на карте. Думаю, не надо объяснять, что такой плагин был бы скорее вредным, чем полезным. Хотелось бы всё же сделать игроков прозрачными для коллизий.
     
  4. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Проблема не потеряла актуальности. Почему смена типа коллизии игрокам ломает мир? Или я мыслю узко и можно обойтись без этого? Я имею в виду блокирование других игроков афк-игроками.
     
  5. gibs

    gibs Фитиль народного волненья

    Сообщения:
    535
    Симпатии:
    133
    А почему бы просто не телепортировать афк куда-нибудь? Или переместить в спеки?
     
  6. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Можно, но это просто =) Мы не ищем лёгких путей, да и сам эффект голограммы всем игрокам нравится. Поэтому хотелось бы найти причину такого поведения, всё равно где-то кому-то это решение пригодится.

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