Русское сообщество по скриптингу

Телепортация к игроку без застреваний

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Телепортация к игроку без застреваний

Сообщение ArKaNeMaN » 02 июл 2017, 17:44

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

static random
, i_tele, i_target; random = random_num(1,2)
        switch(random){
            case 1:{
                i_tele = i_Ct
                i_target 
= i_T
            
}
            case 2:{
                i_tele = i_T
                i_target 
= i_Ct
            
}
        }
        new Float:vVelocity[3]

        velocity_by_aim(i_target, 100, vVelocity)
        
        vVelocity
[2] = 0.00

        set_pev
(i_target, pev_velocity, vVelocity)
        
        new Float
:origin[3]; get_front_origin(i_target, -48.0, origin);
        set_pev(i_tele, pev_origin, origin);
        new Float:vangles[3]; pev(i_target, pev_v_angle, vangles);
        set_pev(i_tele, pev_v_angle, vangles);
        set_pev(i_tele, pev_angles, vangles);
        set_pev(i_tele, pev_fixangle, 1);
        
        CheckStuck
(id);

 

Код: Выделить всё

CheckStuck
(id){
    static const Float:g_flMoves[][3] =
    {
        {0.0,0.0,1.0},{0.0,0.0,-1.0},{0.0,1.0,0.0},{0.0,-1.0,0.0},{1.0,0.0,0.0},{-1.0,0.0,0.0},{-1.0,1.0,1.0},{1.0,1.0,1.0},{1.0,-1.0,1.0},{1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,-1.0},
        {0.0,0.0,2.0},{0.0,0.0,-2.0},{0.0,2.0,0.0},{0.0,-2.0,0.0},{2.0,0.0,0.0},{-2.0,0.0,0.0},{-2.0,2.0,2.0},{2.0,2.0,2.0},{2.0,-2.0,2.0},{2.0,2.0,-2.0},{-2.0,-2.0,2.0},{2.0,-2.0,-2.0},{-2.0,2.0,-2.0},{-2.0,-2.0,-2.0},
        {0.0,0.0,3.0},{0.0,0.0,-3.0},{0.0,3.0,0.0},{0.0,-3.0,0.0},{3.0,0.0,0.0},{-3.0,0.0,0.0},{-3.0,3.0,3.0},{3.0,3.0,3.0},{3.0,-3.0,3.0},{3.0,3.0,-3.0},{-3.0,-3.0,3.0},{3.0,-3.0,-3.0},{-3.0,3.0,-3.0},{-3.0,-3.0,-3.0},
        {0.0,0.0,4.0},{0.0,0.0,-4.0},{0.0,4.0,0.0},{0.0,-4.0,0.0},{4.0,0.0,0.0},{-4.0,0.0,0.0},{-4.0,4.0,4.0},{4.0,4.0,4.0},{4.0,-4.0,4.0},{4.0,4.0,-4.0},{-4.0,-4.0,4.0},{4.0,-4.0,-4.0},{-4.0,4.0,-4.0},{-4.0,-4.0,-4.0},
        {0.0,0.0,5.0},{0.0,0.0,-5.0},{0.0,5.0,0.0},{0.0,-5.0,0.0},{5.0,0.0,0.0},{-5.0,0.0,0.0},{-5.0,5.0,5.0},{5.0,5.0,5.0},{5.0,-5.0,5.0},{5.0,5.0,-5.0},{-5.0,-5.0,5.0},{5.0,-5.0,-5.0},{-5.0,5.0,-5.0},{-5.0,-5.0,-5.0}
    };
    
    new i
, flags, Float:vOrigin[3], Float:vNewOrigin[3], Float:vMins[3];
    flags = pev(id, pev_flags);
    pev(id, pev_origin, vOrigin);
    if(is_user_stuck(id, vOrigin, flags))
    {
        pev(id, pev_mins, vMins);
        for(= 0; i < sizeof(g_flMoves); i++)
        {
            vNewOrigin[0] = vOrigin[0] - vMins[0] * g_flMoves[i][0];
            vNewOrigin[1] = vOrigin[1] - vMins[1] * g_flMoves[i][1];
            vNewOrigin[2] = vOrigin[2] - vMins[2] * g_flMoves[i][2];
            if(!is_user_stuck(id, vNewOrigin, flags))
            {
                set_pev(id, pev_velocity, Float:{0.0, 0.0 , 0.0});
                set_pev(id, pev_flags, flags | FL_DUCKING);
                set_pev(id, pev_size, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 18.0});
                set_pev(id, pev_origin, vNewOrigin);
                break;
            }
        }
    }
}
 
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: Телепортация к игроку без застреваний

Сообщение RevCrew » 03 июл 2017, 12:46

ArKaNeMaN,
Код: Выделить всё
 CheckStuck(id); 

Мне кажется тут должен быть другой индекс?) Например i_tele
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Телепортация к игроку без застреваний

Сообщение ArKaNeMaN » 03 июл 2017, 14:18

RevCrew, Не заметил :-D
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: Телепортация к игроку без застреваний

Сообщение ArKaNeMaN » 08 июл 2017, 13:04

RevCrew, Всё ровно застревают инногда
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: Телепортация к игроку без застреваний

Сообщение артист666 » 09 июл 2017, 02:17

Тебе нужно, чтобы за спиной появлялся, или просто рядом?
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Телепортация к игроку без застреваний

Сообщение fl0wer » 09 июл 2017, 02:59

ArKaNeMaN писал(а):RevCrew, Всё ровно застревают инногда

Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
fl0wer
 
Сообщения: 1687
Зарегистрирован: 27 фев 2011, 21:35
Откуда: Россия, Ижевск
Благодарил (а): 240 раз.
Поблагодарили: 508 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++, Java, PAWN

Re: Телепортация к игроку без застреваний

Сообщение RevCrew » 09 июл 2017, 21:02

ArKaNeMaN, либо юзай то что выше кинули, либо можешь добавить checkstuck(i_target), если нету
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Телепортация к игроку без застреваний

Сообщение ArKaNeMaN » 09 июл 2017, 21:18

артист666, Рядом
Аватара пользователя
ArKaNeMaN
 
Сообщения: 105
Зарегистрирован: 03 авг 2016, 20:28
Благодарил (а): 26 раз.
Поблагодарили: 11 раз.
Опыт программирования: Около года
Языки программирования: AMXX
PHP
JS

Re: Телепортация к игроку без застреваний

Сообщение Garey » 15 июл 2017, 01:23

попробуйте в 4х (или 6) направлениях искать валидную точку относительно точки игрока
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>

public bool:Find3DValidSpot(id, Float:spot[3])
{
    new Float:start[3];
    pev(id, pev_origin, start);

    for(new i = 0; i < 3; i++)
    {           
            for
(new j = 0; j < 2; j++)
            {
                new Float:origin[3];
                origin = start;
                new Float:distance = 60.0 // Сколько от центра точки искать валидную точку
                if(!j)
                {
                    origin[i] -= distance;    
                
}
                else
                
{
                    origin[i] += distance;
                }
                
                if
(is_hull_vacant(origin, HULL_HUMAN))
                {
                    spot = origin;
                    return true;     
                
}
            }  
    
}
    return false;
}

stock is_hull_vacant(Float:origin[3], hull) {
 engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, 0)
 if (!get_tr2(0, TR_StartSolid) && !get_tr2(0, TR_AllSolid) && get_tr2(0, TR_InOpen)) return true;
 return false;
}

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

Добавлено спустя 1 минуту 39 секунд:
еще вариант телепортировать в игрока и пока они в одной точке делать их неосязаемыми относительно игроков
Аватара пользователя
Garey
 
Сообщения: 85
Зарегистрирован: 24 дек 2010, 03:12
Благодарил (а): 4 раз.
Поблагодарили: 37 раз.


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 13