Проблема с перемещением обьектов.
#1

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

PHP Code:
#define MAX_AIR 10
enum AirInf
{
Obj[2],
point,
boolmoving,
reis
};
new 
AInfo[MAX_AIR][AirInf];
public 
OnGameModeInit()
{
AInfo[0][reis] = 1;
//Aero
AInfo[0][Obj][0] = CreateObject(145531559.568725,-2451.655029,17.368839,13.000001,0.000000,-179.300262300);
AInfo[0][Obj][1] = CreateObject(145481559.568725,-2451.655029,17.368839,13.000001,0.000000,-179.300262300);
AInfo[0][moving] = true;
AInfo[0][point] = 52;
SetTimer("SetAirTimeOut"1000*30false);
return 
1;
}
public 
OnObjectMoved(objectid)
{
if(
objectid == AInfo[0][Obj][0])
{
switch(
AInfo[0][point])
{
case 
0MoveAirObjects(025); // (Ид самолёта, скорость перемещения)
case 1..4MoveAirObjects(018);
case 
5MoveAirObjects(022);
case 
6MoveAirObjects(027);
case 
7MoveAirObjects(031);
case 
8MoveAirObjects(036);
case 
9MoveAirObjects(040);
case 
10MoveAirObjects(045);
case 
11MoveAirObjects(049);
case 
12MoveAirObjects(052);
case 
13..19MoveAirObjects(055);
case 
20MoveAirObjects(025);
case 
21MoveAirObjects(025);
case 
22MoveAirObjects(020), SCMA(COLOR_YELLOW"???????? ??????? ?????? ?? Los-Santos ????????? ? San Fierro");
case 
23MoveAirObjects(018);
case 
24MoveAirObjects(015);
case 
25MoveAirObjects(013);
case 
26MoveAirObjects(013);
case 
27MoveAirObjects(013);
case 
28MoveAirObjects(018);
case 
29SetTimer("SetAirTimeOut"1000*60false), SendClientMessageToAll(COLOR_WHITE"???????? ??????? ?????? ?? Los-Santos ?????? ? San Fierro. ??????? ????? ??????"), AInfo[0][reis] = 2;
case 
30..32MoveAirObjects(06);
case 
33MoveAirObjects(010);
case 
34MoveAirObjects(010);
case 
35MoveAirObjects(030);
case 
36..41MoveAirObjects(055);
case 
42MoveAirObjects(035);
case 
43MoveAirObjects(030), SendClientMessageToAll(COLOR_WHITE"???????? ??????? ?????? ?? San Fierro ????????? ? Los-Santos");
case 
44MoveAirObjects(025);
case 
45MoveAirObjects(020);
case 
46..48MoveAirObjects(014);
case 
49MoveAirObjects(020);
case 
50,51MoveAirObjects(010);
case 
52SetTimer("SetAirTimeOut"1000*60false), SendClientMessageToAll(COLOR_WHITE"???????? ??????? ?????? ?? San Fierro ?????? ? Los-Santos. ??????? ????? ??????"), AInfo[0][reis] = 1;
case 
53MoveAirObjects(06);
case 
54MoveAirObjects(06), AInfo[0][reis] = 0;
case 
55SetTimer("SetAirTimeOut"1000*3false), AInfo[0][point] = 0;
default: 
SetTimer("SetAirTimeOut"1000*3false), AInfo[0][point] = 0;
}
}
return 
1;
}
public 
OnPlayerCommandText(playeridcmdtext[])
{
new 
cmd[256]б idx;
cmd strtok(cmdtextidx);
else if(
strcmp(cmd"/areset"true) == 0)
{
if(!
IsPlayerAdmin(playerid) return 1;
for(new 
i=0i<2;i++) DestroyObject(AInfo[0][Obj][i]);
AInfo[0][Obj][0] = CreateObject(145531454.598022,-2491.184326,17.252395,13.399991,0.000000,87.899986);
AInfo[0][Obj][1] = CreateObject(145481454.598022,-2491.184326,17.252395,13.399991,0.000000,87.899986);
AInfo[0][point] = 0;
AInfo[0][moving] = true;
SetTimer("SetAirTimeOut"1000*15false);
return 
1;
}
return 
0;
}
MoveAirObjects(planeoSpeed)
{
for(new 
0i<2i++)
{
switch(
plane)
{
case 
0:
{
if(
AInfo[plane][moving] == true)
{
switch(
AInfo[plane][point])
{
case 
0MoveObject(AInfo[plane][Obj][i], 2053.415283,-2492.926025,17.143045,oSpeed,13.299983,0.000000,88.399955);
case 
1MoveObject(AInfo[plane][Obj][i], 2098.265625,-2512.281494,17.120628,oSpeed,13.299983,0.000000,51.600120);
case 
2MoveObject(AInfo[plane][Obj][i], 2107.484619,-2544.301269,17.174470,oSpeed,13.299983,0.000000,4.600122);
case 
3MoveObject(AInfo[plane][Obj][i], 2092.409667,-2575.323486,17.162384,oSpeed,13.299983,0.000000,-40.399913);
case 
4MoveObject(AInfo[plane][Obj][i], 2015.240112,-2594.397460,17.358905,oSpeed,13.000012,0.000000,-86.799919);
case 
5MoveObject(AInfo[plane][Obj][i], 1897.592651,-2592.607177,18.471857,oSpeed,11.599986,0.199999,-90.499801);
case 
6MoveObject(AInfo[plane][Obj][i], 1720.748413,-2591.184814,22.432897,oSpeed,9.099978,0.199999,-90.499801);
case 
7MoveObject(AInfo[plane][Obj][i], 1426.416137,-2588.501953,59.629043,oSpeed,5.199979,-13.800008,-90.499801);
case 
8MoveObject(AInfo[plane][Obj][i], 1122.357910,-2517.029541,107.084152,oSpeed,5.199979,-13.800008,-98.399703);
case 
9MoveObject(AInfo[plane][Obj][i], 1017.066650,-2433.684082,125.725318,oSpeed,-1.100018,-17.899988,-128.399627);
case 
10MoveObject(AInfo[plane][Obj][i], 868.353637,-2286.289550,124.998863,oSpeed,-1.100018,-7.199974,-141.099685);
case 
11MoveObject(AInfo[plane][Obj][i], 585.755432,-1788.639892,176.751922,oSpeed,-1.100018,1.400022,-150.099822);
case 
12MoveObject(AInfo[plane][Obj][i], 159.691741,-1054.085815,322.882324,oSpeed,-1.100018,-10.099975,-164.700088);
case 
13MoveObject(AInfo[plane][Obj][i], 166.647766,-911.165161,348.001098,oSpeed,3.899980,-2.399979,177.199600);
case 
14MoveObject(AInfo[plane][Obj][i], 177.330413,-725.820556,373.951202,oSpeed,-1.900024,-2.399979,177.199600);
case 
15MoveObject(AInfo[plane][Obj][i], 110.533370,835.341796,502.952209,oSpeed,0.000000,0.000000,-162.300109);
case 
16MoveObject(AInfo[plane][Obj][i], -544.002319,1047.622192,543.323425,oSpeed,2.399999,16.000013,-131.200027);
case 
17MoveObject(AInfo[plane][Obj][i], -705.973876,791.303222,293.013702,oSpeed,15.300013,0.000000,-46.399974);
case 
18MoveObject(AInfo[plane][Obj][i], -1048.693115,449.043884,46.350074,oSpeed,20.500032,0.000000,-45.299987);
case 
19MoveObject(AInfo[plane][Obj][i], -1107.604370,384.274108,38.894912,oSpeed,14.500031,0.000000,-45.299987);
case 
20MoveObject(AInfo[plane][Obj][i], -1174.686523,317.887908,27.408067,oSpeed,7.900015,0.000000,-45.299987);
case 
21MoveObject(AInfo[plane][Obj][i], -1227.575073,265.549011,22.403526,oSpeed,7.900015,0.000000,-45.299987);
case 
22MoveObject(AInfo[plane][Obj][i], -1248.785766,244.558273,19.480550,oSpeed,10.700025,0.000000,-45.299987);
case 
23MoveObject(AInfo[plane][Obj][i], -1679.139892,-185.532638,17.941892,oSpeed,13.099999,0.000000,-45.200027);
case 
24MoveObject(AInfo[plane][Obj][i], -1695.961181,-233.497039,17.328351,oSpeed,13.400000,0.000000,-3.400011);
case 
25MoveObject(AInfo[plane][Obj][i], -1682.883300,-256.238708,17.671979,oSpeed,13.400000,0.000000,42.999961);
case 
26MoveObject(AInfo[plane][Obj][i], -1656.092407,-262.969451,17.699853,oSpeed,13.400000,0.000000,88.599937);
case 
27MoveObject(AInfo[plane][Obj][i], -1595.035644,-212.542785,17.701171,oSpeed,13.400000,0.000000,134.699966);
case 
28MoveObject(AInfo[plane][Obj][i], -1552.760742,-170.715759,17.772178,oSpeed,13.400000,0.000000,134.699966);
case 
29MoveObject(AInfo[plane][Obj][i], -1518.555419,-109.333564,18.187795,oSpeed,13.200015,0.000000,171.400192);
case 
30MoveObject(AInfo[plane][Obj][i], -1532.157348,-76.689056,17.863075,oSpeed,13.200015,0.000000,-134.799880);
case 
31MoveObject(AInfo[plane][Obj][i], -1536.346679,-42.216072,17.802696,oSpeed,13.200015,0.000000,174.399322);
case 
32MoveObject(AInfo[plane][Obj][i], -1516.995483,-24.341810,17.820735,oSpeed,13.200015,0.000000,135.098968);
case 
33MoveObject(AInfo[plane][Obj][i], -1413.463623,79.546203,22.965494,oSpeed,4.900009,0.000000,135.098968);
case 
34MoveObject(AInfo[plane][Obj][i], -1286.523803,206.923858,49.793090,oSpeed,2.500011,0.000000,135.098968);
case 
35MoveObject(AInfo[plane][Obj][i], -901.320007,593.456665,207.814437,oSpeed,-1.399988,0.000000,135.098968);
case 
36MoveObject(AInfo[plane][Obj][i], -40.318813,88.862854,240.656036,oSpeed,0.000000,-20.399991,37.200077);
case 
37MoveObject(AInfo[plane][Obj][i], -7.696372,-831.214904,277.685089,oSpeed,9.199999,-2.500000,0.000000);
case 
38MoveObject(AInfo[plane][Obj][i], 121.898445,-1369.732910,278.318206,oSpeed,10.999986,5.199996,11.300002);
case 
39MoveObject(AInfo[plane][Obj][i], 643.137451,-2368.281738,93.404571,oSpeed,10.999986,0.299993,36.500000);
case 
40MoveObject(AInfo[plane][Obj][i], 1014.185058,-2589.716796,103.512969,oSpeed,12.800020,0.000000,88.000038);
case 
41MoveObject(AInfo[plane][Obj][i], 1385.969848,-2594.836425,50.691898,oSpeed,12.800020,0.000000,89.700012);
case 
42MoveObject(AInfo[plane][Obj][i], 1566.364257,-2593.489501,24.509532,oSpeed,1.300023,0.000000,89.700012);
case 
43MoveObject(AInfo[plane][Obj][i], 1703.116943,-2593.850341,17.303533,oSpeed,13.100030,0.000000,90.000007);
case 
44MoveObject(AInfo[plane][Obj][i], 2074.068359,-2593.449951,20.942094,oSpeed,13.400031,0.000000,89.800010);
case 
45MoveObject(AInfo[plane][Obj][i], 2106.079833,-2572.491699,17.148210,oSpeed,13.400031,0.000000,133.699874);
case 
46MoveObject(AInfo[plane][Obj][i], 2110.058349,-2541.281250,17.114027,oSpeed,13.400031,0.000000,179.699905);
case 
47MoveObject(AInfo[plane][Obj][i], 2103.074218,-2510.155029,17.115751,oSpeed,13.400031,0.000000,-143.600051);
case 
48MoveObject(AInfo[plane][Obj][i], 2045.557128,-2494.081542,17.031759,oSpeed,13.400031,0.000000,-90.100059);
case 
49MoveObject(AInfo[plane][Obj][i], 1637.830810,-2493.318115,17.452402,oSpeed,13.000001,0.000000,-90.799987);
case 
50MoveObject(AInfo[plane][Obj][i], 1574.909667,-2472.258300,17.391979,oSpeed,13.000001,0.000000,-124.399719);
case 
51MoveObject(AInfo[plane][Obj][i], 1559.568725,-2451.655029,17.368839,oSpeed,13.000001,0.000000,-179.300262);
case 
52MoveObject(AInfo[plane][Obj][i], 1539.965942,-2470.382568,17.276123,oSpeed,13.000001,0.000000,133.699600);
case 
53MoveObject(AInfo[plane][Obj][i], 1511.613647,-2492.675048,17.360113,oSpeed,13.000001,0.000000,113.199653);
case 
54MoveObject(AInfo[plane][Obj][i], 1454.598022,-2491.184326,17.252395,oSpeed,13.399991,0.000000,87.899986);
default: 
MoveObject(AInfo[plane][Obj][i],1454.598022,-2491.184326,17.252395,300,13.3999910.000000,87.899986);
}
}
}
}
}
AInfo[0][point]++;
return 
1;
}
forward SetAirTimeOut();
public 
SetAirTimeOut()
{
switch (
AInfo[0][reis])
{
case 
0MoveAirObjects(025);
case 
1:SendClientMessageToAll(COLOR_WHITE"???????? ??????? ?????? ?? Los-Santos ???????? ? San Fierro"), MoveAirObjects(06);
case 
2SendClientMessageToAll(COLOR_WHITE"???????? ??????? ?????? ?? San Fierro ???????? ? Los-Santos "), MoveAirObjects(06);
}
return 
1;

Reply
#2

Единственный вариант - сохранять позицию объекта когда выходит последний игрок, удаляя объект, и стартовать с той же, когда игрок возвращается.
Ну или "предугадывать" примерную позицию объекта, раз траектория полёта и время между каждой из точек тебе известны
Reply
#3

Просто был такой случай когда в том самолёте сидело 2 человека. Из них один вышел с сервера и движение обьекта остановилось. Если бы проблема проявлялась только когда с сервера уходил последний игрок, я бы не парился. Я думал сделать таймер который бы перезапускал бы движение обьекта, если бы по какой то причине через заданный интервал времени обьект не появлялся в заданных координатах. Проблема в том что при повторном запуске движения создаётся ещё один обьект и начинает двигаться.
А если удалять обьект при выходе каждого игрока с сервера и создавать заново, то из за пинга и плохой синхронизации оставшиеся игроки в самолёте могут попросту из него выпасть.
Хотя. Если делать запорозку игрока на секунду на каждый цикл удаления и создания обьекта, то в принципе можно предотвратить выпадение. Идея неплохая. Подумаю над этим. Спасибо.
А по поводу запоминания позиции когда выходит последний игрок нет необходимости, так как в скрипте нумеруется каждый чекпоинт. Можно задать появление обьекта с последнего использованного чекпоинта.
Я вот что подумал. Не является ли стример виновником данного бага?
Просто такое ощущение что при выходе игрока меняется ид того обьекта или что то в этом роде.
Reply
#4

Хмм, странно поведение объектов...
Уверен, что больше нигде нет вызова кода создания объектов? Может оставил что с времён написания системы и её тестирования?
В консоль никаких ошибок не выдаёт? Crashdetect подключён?
Reply
#5

Крашдетект молчит, лог ничего не пишет по этому поводу, код всей системы вплоть до каждой команды и функции выложил в теме, больше нет ничего.
По поводу вызова создания обьектов системы только в 2 местах. При загрузке сервера и в команде ресета.
Потому то я и парюсь по этому поводу и не знаю где копать. Грешу на стример, так как поведение обьектов очень схоже с тем как работает в данная система с динамическими обьектами. Только проверить нет возможности, так как большая часть обьектов в моде на стримере.
Знать бы где копать.
Глюк с остановкой происходит только в момент выхода игрока. А если к примеру сервер запустить и зайти на него, то обьект движется как и положено.
Ну я возпользовавшись твоим советом набросал функцию удаления и повторного создания обьекта с сохранением последних кооржинат, в момент выходи игрока с сервера. Посмотрим что выйдет из этого.
Reply
#6

Quote:
Originally Posted by Sidorovich12
View Post
Только проверить нет возможности, так как большая часть обьектов в моде на стримере.
Можно вставить систему в пустой мод и запустить с этим модом сервер.
Сейчас попробую сам посмотреть что там не так


Quote:
Originally Posted by Sidorovich12
View Post
Ну я возпользовавшись твоим советом набросал функцию удаления и повторного создания обьекта с сохранением последних кооржинат, в момент выходи игрока с сервера. Посмотрим что выйдет из этого.
Не, это вряд ли поможет. Я немного затупил и не так понял проблему
Reply
#7

При каком онлайне происходит подобный баг? И в каких ситуациях?
Вставил код в пустой мод, зашёл двумя игроками, телепортировался к самолёту, одним вышел и никаких проблем
Reply
#8

Изредка проявляется при разном онлайне и каждый раз при входе первого игрока на пустой сервер.
Вообщем частично решил проблему.
При выходе последнего игрока удаляю полностью обьект, а при входе первого игрока он создаётся заново на изначальных координатах.
При наличии игроков на сервере проверяется движется ли обьект в односекундном таймере, сохраняя при этом координаты и углы вращения. Если обьект перестаёт двигаться, то сделал так чтобы он удалялся и пересоздавался по новой в последних сохранённых координатах и дальше двигался на следующую точку.
Спасибо за идею. Пока вроде не глюкает. Посмотрим что будет дальше.
Кстати ещё вопрос. Может знаешь есть ли для данного самолёта модели шасси?
А то как то стрёмно самолёт катается по полосе вися в воздухе
Reply
#9

Можно взять объекты колёс и наложить подходящую текстуру
Reply
#10

При запуске движения объекта функция возвращает время за которое он приодолеет это расстояние. Не хитрым математическим уравнением можно расчитать позицию самолёта когда он попадает в стрим игрока.
Reply
#11

Объект создан через стример или обычный ?
Reply
#12

В самой теме написано же. Обычные глобальные обьекты. Динамические использовать бесполезно, так как движение прекращается сразу же как только обьект пропадает из зоны стрима.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)