Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Позиционирование трейла с отступом от игрока
Naykon Дата: Суббота, 26.07.2014, 16:46:21 | Сообщение # 1
Сообщений: 439
Репутация: -4 [ +/- ]
Есть позиция игрока:

GetClientAbsOrigin(client, g_fOrigin);

Поправляем ее так чтобы трейл находился на расстоянии 100 за спиной игрока:

g_fOrigin[2] = g_fOrigin[2]+100.0;

Но если игрок повершется вокруг своей оси на 180 град. то трейл станет не сзади а спереди!!! Как сделать привязку чтоб трейл был всегда именно за спиной игрока!? Спасибо.
 
_wS_ Дата: Суббота, 26.07.2014, 17:40:25 | Сообщение # 2
 
horr0r Дата: Суббота, 26.07.2014, 18:44:43 | Сообщение # 3
Сообщений: 149
Репутация: 40 [ +/- ]
Я знаю, что у вС'а лучше. Но все же).
Вот попробуй мою функцию, я потестил, она работает).
Код
stock bool:GetAnglePosPlayer(client, Float:angle, Float:radius, Float:vec[3]) { //by horr0rjkee
   if(client==0 || !IsClientConnected(client)) return false;
   new Float:pos[3], Float:ang[3];
   GetClientEyeAngles(client, ang);   
   GetClientAbsOrigin(client, pos);
   vec[0] = pos[0] + Cosine(DegToRad(ang[1]+angle))*radius;
   vec[1] = pos[1] + Sine(DegToRad(ang[1]+angle))*radius;
   vec[2] = pos[2];
   return true;
}


То есть в твоем случае, позицию за спиной можно получить так:
Код

new Float:posvector[3];
GetAnglePosPlayer(client, 180.0, 100.0, posvector);

Первый аргумент - client. Тот чью позицию ищем.
Второй аргумент - на сколько градусов повернуть позицию. (В твоем случае 180 | 0 - спереди | 90 - справа | 180 - сзади | 270 - слева)
Третий аргумент - на какую дистанцию. (В твоем случае 100).
Четвертый - переменная, в которую запишется позиция.


Сообщение отредактировал horr0r - Суббота, 26.07.2014, 18:49:52
 
Naykon Дата: Суббота, 26.07.2014, 19:17:24 | Сообщение # 4
Сообщений: 439
Репутация: -4 [ +/- ]
На сколько я понимаю это нужно делать в таймере.. т.е преверять каждую 0.1 сек куда смотрит игрок и соответственно менять позицию трейла?

Добавлено (26.07.2014, 19:03:26)
---------------------------------------------
Можно ли избежать использования таймера?

Добавлено (26.07.2014, 19:17:24)
---------------------------------------------
horr0r, не совсем понимаю как это мне поможет. Мы создали трейл который будет всегда на расстоянии 100 от игрока и все время с одной стороны независибо от поворота прицела. Как минимум функция корректировки позиции должна запомнить куда смотрел игрок в момент создания трейла чтоб дальше изменять трейл относительно курсора..

обьясните если я что-то не догоняю..

Код
public Action:TrailTimer_Func(Handle:timer, any:client)  
{
    new Float:posvector[3];  
    GetAnglePosPlayer(client, 180.0, 100.0, posvector);
    TeleportEntity(StringToInt(_trail_index[client]), posvector, {0.0, 90.0, 0.0}, NULL_VECTOR);
}  

stock bool:GetAnglePosPlayer(client, Float:angle, Float:radius, Float:vec[3])
{
    if(client==0 || !IsClientConnected(client)) return false;  
    new Float:pos[3], Float:ang[3];  
    GetClientEyeAngles(client, ang);    
    GetClientAbsOrigin(client, pos);  
    vec[0] = pos[0] + Cosine(DegToRad(ang[1]+angle))*radius;  
    vec[1] = pos[1] + Sine(DegToRad(ang[1]+angle))*radius;  
    vec[2] = pos[2];  
    return true;  
}


В результате трейл улетает куда-то в космос (что впринцепи понятно..)
 
BarD Дата: Суббота, 26.07.2014, 19:23:41 | Сообщение # 5
Сообщений: 943
Репутация: 137 [ +/- ]
Думаю, все видели на некоторых картах трейлы, привязанные к гранатам. Их позиция не меняется, т.е при повороте, они тоже поворачиваются. Почему бы тебе не привязать трейл, скажем, к ножу игрока?


Сообщение отредактировал BarD - Суббота, 26.07.2014, 19:24:43
 
Naykon Дата: Суббота, 26.07.2014, 19:31:29 | Сообщение # 6
Сообщений: 439
Репутация: -4 [ +/- ]
Вообщем за функцию большое спасибо horr0r, не в обиду но я

Код
    vec[0] = pos[0] + Cosine(DegToRad(ang[1]+angle))*radius;   
     vec[1] = pos[1] + Sine(DegToRad(ang[1]+angle))*radius;   
     vec[2] = pos[2];  
где-то раньше видел)))

Добавлено (26.07.2014, 19:30:18)
---------------------------------------------
BarD, как вариант спасибо. И сразу напомни как получить позицию ножа? + Если игрок стоит и поворачивается вокруг своей оси то нож меняет позицию?

Добавлено (26.07.2014, 19:31:29)
---------------------------------------------
Можно ли получить индекс ножа у клиента и отловить его позицию? O_o (при условии что она в руках)

 
horr0r Дата: Суббота, 26.07.2014, 19:46:46 | Сообщение # 7
Сообщений: 149
Репутация: 40 [ +/- ]
Naykon, не надо телепортировать всегда треил.
Достаточно только прицепить его к нужной позиции.
Скинь код создания треила.
 
Naykon Дата: Суббота, 26.07.2014, 20:19:02 | Сообщение # 8
Сообщений: 439
Репутация: -4 [ +/- ]
мусор.


Сообщение отредактировал Naykon - Воскресенье, 27.07.2014, 22:03:37
 
horr0r Дата: Суббота, 26.07.2014, 20:42:36 | Сообщение # 9
Сообщений: 149
Репутация: 40 [ +/- ]
Попробуй проще. Вот мой код. Я в твоем не разбирался, уж очень он непонятный.
Код

new sprite = CreateEntityByName("env_spritetrail"), Float:vpos[3];
GetAnglePosPlayer(client, 180.0, 100.0, vpos);    
DispatchKeyValueVector(sprite, "origin", vpos);    
DispatchKeyValue(sprite, "lifetime", "0.5");
DispatchKeyValue(sprite, "startwidth", "8.0");
DispatchKeyValue(sprite, "endwidth", "1.0");
DispatchKeyValue(sprite, "spritename", "sprites/bluelaser1.vmt");    
DispatchKeyValue(sprite, "renderamt", "255");
DispatchKeyValue(sprite, "rendercolor", "255 255 255");
DispatchKeyValue(sprite, "rendermode", "5");
DispatchSpawn(sprite);    
SetVariantString("!activator");    
AcceptEntityInput(sprite, "SetParent", client);

Затестил. Этот код рабочий.


Сообщение отредактировал horr0r - Суббота, 26.07.2014, 20:48:03
 
Naykon Дата: Суббота, 26.07.2014, 22:25:00 | Сообщение # 10
Сообщений: 439
Репутация: -4 [ +/- ]
эмм... увы этот тип трейла не может корретно отображать рисунки.. (логотипы и т д)..

Добавлено (26.07.2014, 22:22:51)
---------------------------------------------
horr0r, подскажи как получить позицию сзади на 50 и в лево на 50..?

Добавлено (26.07.2014, 22:25:00)
---------------------------------------------
это имется в виду 1 позиция.

 
horr0r Дата: Суббота, 26.07.2014, 22:39:50 | Сообщение # 11
Сообщений: 149
Репутация: 40 [ +/- ]
А разве есть еще какие-либо типы треилов???
Entity - env_spritetrail.

GetAnglePosPlayer(client, 180.0, 50.0, vpos);
180.0 - сзади
90.0 - слева
270.0 - справа
0/360.0 - спереди


Сообщение отредактировал horr0r - Суббота, 26.07.2014, 22:41:10
 
Naykon Дата: Воскресенье, 27.07.2014, 00:08:01 | Сообщение # 12
Сообщений: 439
Репутация: -4 [ +/- ]
я имею ввиду твой код не корректно отображает картинки (типа адидас, логотипы и т д..)

Ты меня не понял. Мне нужно чтоб точка была одна (сзади за 50 и слево на 50).. кароче под углом 45 градусов.. вообщем тут геометрия осталась сам разберусь спс.

Добавлено (27.07.2014, 00:08:01)
---------------------------------------------
Каждую секунду я поправлял трейл назад клиента относительно его прицела с помошью функции horr0r (аналог wS). Но функция чтоб непосредственно извенить точку начала трейла я воспользовался TeleportEntity(StringToInt(_trail_index[client][0]), height, NULL_VECTOR, NULL_VECTOR); - однако, трейл телепортнулся в указанную точки и счез.. где я ошибся вопрос 1 поста остается Актуален.

 
Tokami Дата: Воскресенье, 27.07.2014, 00:56:49 | Сообщение # 13
Сообщений: 238
Репутация: 19 [ +/- ]
Naykon, благодарю за трейлы а то я пользовался способом horr0ra а твои трейлы мне нравится больше)
 
horr0r Дата: Воскресенье, 27.07.2014, 12:09:34 | Сообщение # 14
Сообщений: 149
Репутация: 40 [ +/- ]
Почему не может корректно отобразить?
Измени строку
Код

DispatchKeyValue(sprite, "spritename", "путь до треила");

Сейчас затестю. Логотип какой-нибудь.
 
BarD Дата: Воскресенье, 27.07.2014, 12:11:00 | Сообщение # 15
Сообщений: 943
Репутация: 137 [ +/- ]
Попробуй к ножу привязать.

Функция нахождения координат по индексу:

Код
new Float:pos[3];
GetEntPropVector(index, Prop_Send, "m_vecOrigin", pos);
 
  • Страница 1 из 1
  • 1
Поиск: