SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 10/02/2017, 06:41 AM   #1
Sidorovich12
Little Clucker
 
Sidorovich12's Avatar
 
Join Date: Oct 2015
Location: Taraz
Posts: 14
Reputation: 0
Post Проблема с перемещением обьектов.

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

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;


Last edited by Sidorovich12; 10/02/2017 at 07:13 AM.
Sidorovich12 is offline   Reply With Quote
Old 10/02/2017, 10:29 AM   #2
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 292
Reputation: 8
Default Re: Проблема с перемещением обьектов.

Единственный вариант - сохранять позицию объекта когда выходит последний игрок, удаляя объект, и стартовать с той же, когда игрок возвращается.
Ну или "предугадывать" примерную позицию объекта, раз траектория полёта и время между каждой из точек тебе известны
Eims is offline   Reply With Quote
Old 10/02/2017, 10:38 AM   #3
Sidorovich12
Little Clucker
 
Sidorovich12's Avatar
 
Join Date: Oct 2015
Location: Taraz
Posts: 14
Reputation: 0
Default Re: Проблема с перемещением обьектов.

Просто был такой случай когда в том самолёте сидело 2 человека. Из них один вышел с сервера и движение обьекта остановилось. Если бы проблема проявлялась только когда с сервера уходил последний игрок, я бы не парился. Я думал сделать таймер который бы перезапускал бы движение обьекта, если бы по какой то причине через заданный интервал времени обьект не появлялся в заданных координатах. Проблема в том что при повторном запуске движения создаётся ещё один обьект и начинает двигаться.
А если удалять обьект при выходе каждого игрока с сервера и создавать заново, то из за пинга и плохой синхронизации оставшиеся игроки в самолёте могут попросту из него выпасть.
Хотя. Если делать запорозку игрока на секунду на каждый цикл удаления и создания обьекта, то в принципе можно предотвратить выпадение. Идея неплохая. Подумаю над этим. Спасибо.
А по поводу запоминания позиции когда выходит последний игрок нет необходимости, так как в скрипте нумеруется каждый чекпоинт. Можно задать появление обьекта с последнего использованного чекпоинта.
Я вот что подумал. Не является ли стример виновником данного бага?
Просто такое ощущение что при выходе игрока меняется ид того обьекта или что то в этом роде.
Sidorovich12 is offline   Reply With Quote
Old 10/02/2017, 10:53 AM   #4
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 292
Reputation: 8
Default Re: Проблема с перемещением обьектов.

Хмм, странно поведение объектов...
Уверен, что больше нигде нет вызова кода создания объектов? Может оставил что с времён написания системы и её тестирования?
В консоль никаких ошибок не выдаёт? Crashdetect подключён?
Eims is offline   Reply With Quote
Old 10/02/2017, 11:20 AM   #5
Sidorovich12
Little Clucker
 
Sidorovich12's Avatar
 
Join Date: Oct 2015
Location: Taraz
Posts: 14
Reputation: 0
Default Re: Проблема с перемещением обьектов.

Крашдетект молчит, лог ничего не пишет по этому поводу, код всей системы вплоть до каждой команды и функции выложил в теме, больше нет ничего.
По поводу вызова создания обьектов системы только в 2 местах. При загрузке сервера и в команде ресета.
Потому то я и парюсь по этому поводу и не знаю где копать. Грешу на стример, так как поведение обьектов очень схоже с тем как работает в данная система с динамическими обьектами. Только проверить нет возможности, так как большая часть обьектов в моде на стримере.
Знать бы где копать.
Глюк с остановкой происходит только в момент выхода игрока. А если к примеру сервер запустить и зайти на него, то обьект движется как и положено.
Ну я возпользовавшись твоим советом набросал функцию удаления и повторного создания обьекта с сохранением последних кооржинат, в момент выходи игрока с сервера. Посмотрим что выйдет из этого.
Sidorovich12 is offline   Reply With Quote
Old 10/02/2017, 01:43 PM   #6
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 292
Reputation: 8
Default Re: Проблема с перемещением обьектов.

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


Quote:
Originally Posted by Sidorovich12 View Post
Ну я возпользовавшись твоим советом набросал функцию удаления и повторного создания обьекта с сохранением последних кооржинат, в момент выходи игрока с сервера. Посмотрим что выйдет из этого.
Не, это вряд ли поможет. Я немного затупил и не так понял проблему
Eims is offline   Reply With Quote
Old 10/02/2017, 02:23 PM   #7
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 292
Reputation: 8
Default Re: Проблема с перемещением обьектов.

При каком онлайне происходит подобный баг? И в каких ситуациях?
Вставил код в пустой мод, зашёл двумя игроками, телепортировался к самолёту, одним вышел и никаких проблем
Eims is offline   Reply With Quote
Old 10/02/2017, 02:49 PM   #8
Sidorovich12
Little Clucker
 
Sidorovich12's Avatar
 
Join Date: Oct 2015
Location: Taraz
Posts: 14
Reputation: 0
Default Re: Проблема с перемещением обьектов.

Изредка проявляется при разном онлайне и каждый раз при входе первого игрока на пустой сервер.
Вообщем частично решил проблему.
При выходе последнего игрока удаляю полностью обьект, а при входе первого игрока он создаётся заново на изначальных координатах.
При наличии игроков на сервере проверяется движется ли обьект в односекундном таймере, сохраняя при этом координаты и углы вращения. Если обьект перестаёт двигаться, то сделал так чтобы он удалялся и пересоздавался по новой в последних сохранённых координатах и дальше двигался на следующую точку.
Спасибо за идею. Пока вроде не глюкает. Посмотрим что будет дальше.
Кстати ещё вопрос. Может знаешь есть ли для данного самолёта модели шасси?
А то как то стрёмно самолёт катается по полосе вися в воздухе
Sidorovich12 is offline   Reply With Quote
Old 10/02/2017, 04:35 PM   #9
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 292
Reputation: 8
Default Re: Проблема с перемещением обьектов.

Можно взять объекты колёс и наложить подходящую текстуру
Eims is offline   Reply With Quote
Old 11/02/2017, 08:34 AM   #10
White_116
High-roller
 
Join Date: Sep 2010
Location: Russia/116
Posts: 1,427
Reputation: 65
Default Re: Проблема с перемещением обьектов.

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

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Загрузка обьектов xStunt Русский/Russian 7 14/11/2014 01:15 PM
Атач обьектов на скин Кирилл Русский/Russian 9 31/05/2014 10:30 AM
Загрузка обьектов Kuroki Русский/Russian 42 18/01/2013 12:17 AM
Прогрузка Обьектов Legolas.W Русский/Russian 12 30/05/2012 01:41 AM
как перевести pwn код обьектов в .map? grandy Русский/Russian 10 31/08/2011 01:17 AM


All times are GMT. The time now is 03:56 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.