Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Troy1

Хелп. Защита игрока, поиск стен, окон и дверей.

Всем привет. пишу мод и столкнулся с проблемой в реализации.
Суть: Пытаюсь сделать проверку, если игрок стоит прям у окна или у дверного проёма он должен получать урон.
Делал вот так.

int wallHits = 0;
float d = 2.2; // Дистанция до стены. Если стена дальше — считаем, что там окно или проем.

// 8 направлений "снежинкой" для проверки стен вокруг игрока
// Используем Vector(x, y, z) для точности
ref array<vector> checkDirs = {
  Vector(d,0,0), Vector(-d,0,0), Vector(0,0,d), Vector(0,0,-d),
  Vector(d,0,d), Vector(-d,0,-d), Vector(d,0,-d), Vector(-d,0,d)
};

foreach (vector dir : checkDirs)
{
  // Пускаем горизонтальные лучи от позиции игрока (from)
  if (DayZPhysics.RayCastBullet(from, from + dir, collisionLayerMask, this, hitObject, hitPosition, hitNormal, hitFraction))
  {
    // ПРОВЕРКА: Это должна быть вертикальная стена (Y нормали < 0.5)
    // Чтобы не засчитать низкий потолок за стену
    if (Math.AbsFloat(hitNormal[1]) < 0.5) 
    {
      wallHits++; 
    }
  }
}

// УСЛОВИЕ БЕЗОПАСНОСТИ:
// В комнате wallHits будет 6-8. У окна или в проеме — 1-4.
if (wallHits < 5) 
{
  hasSafeCeiling = false; // Слишком открытое пространство (окно/дверь)
}

Пытался менять дистанции, но всё ровно не как не хочет работать.
Что я делаю не так, или я вообще делаю не то?
Мне нужно проверять игрока, в укрытии он или нет.
С высотой я разобрался, а вот с боковыми лучами у меня траблы и не во всех помещениях работает как нужно.
В некоторых помещениях вообще не работает, удаляешь строки проверки, начинает работать и то по высоте.
Просто забегаешь по навес и игрок под защитой, так не должно быть.
Помогите пожалуйста  решить задачу.

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0
class RayFromTo
{
    void RayFromTo( vector positionRayStart, vector positionRayEnd, PlayerBase playerBase )
    {
        
        RaycastRVParams                m_RaycastRVParams    =    new RaycastRVParams( positionRayStart, positionRayEnd, playerBase );
        array<ref RaycastRVResult>    m_RaycastRVResults    =    new array<ref RaycastRVResult>;
        Object                        m_RayObject;
        Object                        m_RayObjecParent;
        if ( DayZPhysics.RaycastRVProxy( m_RaycastRVParams, m_RaycastRVResults ) )
        {
            if ( m_RaycastRVResults.Count() < 0 )
            {
                Print( "RayResult < 0" );
                return;
            }
            m_RayObject    =    m_RaycastRVResults[ 0 ].obj;
            if ( !m_RayObject )
            {
                Print( "RayResult no Object" );
                return;
            }
            Print( "RayResult Object: " + m_RayObject );
            m_RayObjecParent    =    m_RayObject.parent;
            if ( m_RayObjecParent )
            {
                Print( "RayResult parent Object: " + m_RayObjecParent );
            }
            else
            {
                Print( "RayResult no parent Object" );
            }
        }
    }
}


PlayerBase    playerBase    =        ...;
vector         positionRayStart;
vector        positionRayEnd;

positionRayStart        =    playerBase.GetPosition;
positionRayStart[ 1 ]    =    positionRayStart[ 1 ] + 1.5;
positionRayEnd            =    positionRayStart + playerBase().GetDirection() * 3;    
new RayFromTo( positionRayStart, positionRayEnd, playerBase );

 

Share this post


Link to post
Share on other sites
MagicByte MagicByte MagicByte

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Troy1
      Всем привет. Суть в чём, пишу мод на событие и когда происходит событие, параллельно должна меняться скорость ветра, не могу понять как заставить скрипт управлять силой ветра. Понижать силу ветра получилось сделать, а вот повышать не как. Только после перезагрузки сервера сила ветра задаётся в нужном значение.
      Как сделать, что бы по вызову функции менялась сила ветра в большую или в меньшую сторону?
      protected void SetWind(float wind, float time) { if (!g_Game) return; Weather m_Weather = g_Game.GetWeather(); if (!m_Weather) return; m_Weather.SetWindMaximumSpeed(wind); m_Weather.SetWind(Vector(1/Math.Sqrt(3), 1/Math.Sqrt(3), 1/Math.Sqrt(3)) * wind); m_Weather.SetWindSpeed(wind); m_Weather.SetWindFunctionParams(1.0, 1.0, -1); } Это скрипт на понижение силы ветра.
      Работает понижение силы ветра в том случае, если до этого сила ветра была выше.
      Пример:
      Изначально на сервере сила ветра = 20 m/s А нужно понизить до 10 m/s
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • By Troy1
      Пока ждал помощи, решил вопрос!
      Тема закрыта!!!
    • By magliner
      Привет ! Ну вот моя история с вопросом в конце.. Я фанат Дэйз ванилы черноруси, заколебало сидеть на бездушных серверах со слабой админкой и терять лут от софтеров, решил создать под свои скромные запросы около ванильный сервер.. Нашел хорошего исполнителя, быстро и четко запустили отладили и ВОТ я имею СВОЙ сервер.. клас! вечер восторга и изучения
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

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

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

Поддержка