PDA

Просмотр полной версии : [Вопрос] Ограничение игрового пространства.



Роуди.
05.05.2018, 00:40
Здравствуйте, возник вопрос в доработке ( полной переработки ? ) функции
В конечном итоге должен быть вот такой результат (https://youtu.be/RMveF1rv6Eo)
Но результат тот, что на видео и тот что показан в этой функции очень не точный и воспроизводит не тот эффект.
Функция очень костыльная, тормозная и другие малоприятные эпитеты.
Хотелось бы что бы к сий функции приложил руку опытный и грамотный человек, если не трудно.


new Float: angle,
Float: a,
Float: b,
Float: c,
Float: d,
Float: x,
Float: y,
Float: z;
d=-1;
c=1.0;

if ( GetPVarInt(playerid, "fix_vixod") != 1)
{
if ( areaid == dynamicZoneDeatMatch || areaid == pluc_dynamic )
{
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, angle);
angle+=180.0;
if(angle > 360.0) angle-=360.0;
SetPlayerFacingAngle(playerid, angle);
SetCameraBehindPlayer(playerid);
angle=ConvertAngle(angle);
if(angle==0.0 || angle==90.0 || angle==180.0 || angle==360.0) angle-=0.0001;
if(angle > 90.0){ angle=90.0-(angle-90.0); d=1; }
if(angle < -90.0){ angle=(90.0-((angle*-1)-90.0))*-1; d=1; }
a=c*floatsin(angle,degrees);
b=floatsqroot(floatpower(c,2)-floatpower(a,2));
b=b*d;

SetPlayerPos(playerid, x+b, y+a, z);
printf("[gz] %f | %f | %f", x+b, y+a, z);
}
}
else
{
return false;
}
return true;
Спасибо.


if ( GetPVarInt(playerid, "fix_vixod") != 1)
Вещь, которая не дает плееру спавнится на элеваторе ( хз как описать вообщем :) )

Роуди.
12.05.2018, 22:43
все еще интересуюсь

Роуди.
28.10.2018, 23:56
Спустя 5 месяцев все еще интересуюсь

whale
29.10.2018, 00:01
// dell

DeimoS
29.10.2018, 07:08
stock SomeFunc(playerid, &Float:x, &Float:y, Float:distance)
{
new Float:a;
GetPlayerPos(playerid, x, y, a);
GetPlayerFacingAngle(playerid, a);
x += (distance * floatsin(-a, degrees));
y += (distance * floatcos(-a, degrees));
return 1;
}

CMD:test(playerid, params[])
{
new
Float:x,
Float:y,
Float:z;
GetPlayerPos(playerid, x, y, z);

SomeFunc(playerid, x, y, -3.0);

SetPlayerPos(playerid, x, y, z);
return 1;
}

x, y - текущие координаты игрока
distance - расстояние, на которое нужно откинуть относительно текущей точки (отрицательное значение - откинет назад. Положительное - вперёд)
К этому добавь проверку на нахождение в нужной зоне и всё.


Хотя что этот вариант, что твой - оба не очень надёжны, ибо игрок может успеть повернуть персонажа лицом к центру зоны, из-за чего игрока начнёт бесконечно выкидывать из центра (можно сделать костыль и спавнить игрока в центр зоны, если проверка сработает, например, 5 раз подряд).
В идеале нужно работать с координатами самой зоны, сопоставляя их с позицией игрока.