PDA

Просмотр полной версии : [Вопрос] Пропадают объекты



M1RoN
01.05.2017, 22:08
Приветствую всех
Вопрос такой
Имеется таймер на 250мс, который повторяется и внутри которого код:



switch(color_rainbow)
{
case 1:
{
if(IsValidDynamicObject(object_rainbow_player[playerid][0])) DestroyDynamicObject(object_rainbow_player[playerid][0]);
if(IsValidDynamicObject(object_rainbow_player[playerid][1])) DestroyDynamicObject(object_rainbow_player[playerid][1]);
GetPlayerPos(playerid, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2]);
object_rainbow_player[playerid][0] = CreateDynamicObject(19297, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);
object_rainbow_player[playerid][1] = CreateDynamicObject(19298, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);

color_rainbow = 2;
}
case 2:
{

if(IsValidDynamicObject(object_rainbow_player[playerid][2])) DestroyDynamicObject(object_rainbow_player[playerid][2]);
GetPlayerPos(playerid, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5]);
object_rainbow_player[playerid][2] = CreateDynamicObject(19298, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5], 0.0, 0.0, 0.0);

color_rainbow = 1;

}



Соответственно меняется объекты каждые 250мс. Спустя примерно 2-3 минуты работы данного таймера - начинают понемногу исчезать объекты
Как я понимаю - скорее всего лимит превышается, но не понимаю каким образом, ведь объекты то я удаляю перед созданием
Надеюсь на вашу помощь

DeimoS
01.05.2017, 23:22
Попробуй создать объект и проверить значение, которое вернёт IsValidDynamicObject.
Объекты точно удаляются?

M1RoN
01.05.2017, 23:26
Проверял, точно удаляются

DeimoS
02.05.2017, 00:45
Скинь полностью код системы в личку. Желательно в виде рабочего FS. Ну или подожди ещё кого. Мож найдётся тот, кто сможет по этому куску кода причину найти

MISTER_GONWIK
02.05.2017, 10:47
добавь break; в самый конец case 1:


switch(color_rainbow)
{

case 1:
{

if(IsValidDynamicObject(object_rainbow_player[playerid][0])) DestroyDynamicObject(object_rainbow_player[playerid][0]);
if(IsValidDynamicObject(object_rainbow_player[playerid][1])) DestroyDynamicObject(object_rainbow_player[playerid][1]);
GetPlayerPos(playerid, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2]);
object_rainbow_player[playerid][0] = CreateDynamicObject(19297, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);
object_rainbow_player[playerid][1] = CreateDynamicObject(19298, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);

color_rainbow = 2;
break;
}
case 2:
{

if(IsValidDynamicObject(object_rainbow_player[playerid][2])) DestroyDynamicObject(object_rainbow_player[playerid][2]);
GetPlayerPos(playerid, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5]);
object_rainbow_player[playerid][2] = CreateDynamicObject(19298, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5], 0.0, 0.0, 0.0);

color_rainbow = 1;
}
}

vasyok28
02.05.2017, 13:38
Возможно в зоне стрима много обьектов, пробуй создать обьекты без стриммера

M1RoN
02.05.2017, 15:53
добавь break; в самый конец case 1:

Это ж не цикл, зачем

- - - Добавлено - - -


Возможно в зоне стрима много обьектов, пробуй создать обьекты без стриммера

Создавал, не менялось ничего

DeimoS
02.05.2017, 16:36
Уверен, что таймер всегда 1 работает? Может где-то повторно запускаешь?

M1RoN
02.05.2017, 16:39
Уверен

DeimoS
02.05.2017, 16:47
Ну вот тебе простая команда

if (strcmp("/count", cmdtext, true) == 0)
{
new string[11];
format(string, sizeof(string), "%d", CountDynamicObjects());
SendClientMessage(playerid, -1, string);
return 1;
}
Введи её при запуске таймера и когда объекты начнут пропадать.

M1RoN
02.05.2017, 17:00
[15:59:07] 6682

[15:59:09] 6682

[15:59:15] 6691

[15:59:17] 6690

[15:59:20] 6685

[15:59:22] 6676

[15:59:26] 6672

[15:59:28] 6670

6682 - это короче пока не включал систему, то бишь - все объектов на сервере сколько есть
дальше - уже с включенной системой

MISTER_GONWIK
02.05.2017, 17:27
Это ж не цикл, зачем

- - - Добавлено - - -



Создавал, не менялось ничего

ну потому что если не прервать case то будут срабатывать и другие case (или ты хочешь сказать что у павн с этим всё норм?)

M1RoN
02.05.2017, 17:53
ну потому что если не прервать case то будут срабатывать и другие case (или ты хочешь сказать что у павн с этим всё норм?)

Если ты оператор switch будешь останавливать break - то у тебя вылезет ошибка:


: error 024: "break" or "continue" is out of context

vasyok28
02.05.2017, 18:03
Логируй координаты создание обьекта, возможно создаються на 0.0

- - - Добавлено - - -


ну потому что если не прервать case то будут срабатывать и другие case (или ты хочешь сказать что у павн с этим всё норм?)

В пхп сработает другие, в павн работает как else if

M1RoN
02.05.2017, 18:05
Логируй координаты создание обьекта, возможно создаються на 0.0

Погляди, я там выше скинул результаты подсчётов объектов до включения системы и после
Удаляются лишние объекты видимо, хотя по коду вроде как всё верно

vasyok28
02.05.2017, 18:24
Блин не заметил сразу, после удаление обьектов object_rainbow_player[playerid][0] = INVALID_OBJECT_ID;, ...

M1RoN
02.05.2017, 18:29
[17:28:10] 6677

[17:28:11] 6677

[17:28:12] 6677

[17:28:14] 6677

[17:28:17] 6677

[17:28:18] 6677

[17:28:24] 6677

[17:28:30] 6685

[17:28:32] 6684

[17:28:34] 6678

[17:28:36] 6675

[17:28:40] 6671

[17:28:43] 6665

[17:28:49] 6658

[17:28:52] 6650

[17:28:58] 6642

[17:29:07] 6614

[17:29:11] 6612

[17:29:12] 6612

[17:29:14] 6612

[17:29:18] 6612

vasyok28
02.05.2017, 18:34
[17:28:10] 6677

[17:28:11] 6677

[17:28:12] 6677

[17:28:14] 6677

[17:28:17] 6677

[17:28:18] 6677

[17:28:24] 6677

[17:28:30] 6685

[17:28:32] 6684

[17:28:34] 6678

[17:28:36] 6675

[17:28:40] 6671

[17:28:43] 6665

[17:28:49] 6658

[17:28:52] 6650

[17:28:58] 6642

[17:29:07] 6614

[17:29:11] 6612

[17:29:12] 6612

[17:29:14] 6612

[17:29:18] 6612

Так сделал?


switch(color_rainbow)
{
case 1:
{
if(IsValidDynamicObject(object_rainbow_player[playerid][0]))
{
DestroyDynamicObject(object_rainbow_player[playerid][0]);
object_rainbow_player[playerid][0] = INVALID_OBJECT_ID;
}
if(IsValidDynamicObject(object_rainbow_player[playerid][1]))
{
DestroyDynamicObject(object_rainbow_player[playerid][1]);
object_rainbow_player[playerid][1] = INVALID_OBJECT_ID;
}
GetPlayerPos(playerid, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2]);
object_rainbow_player[playerid][0] = CreateDynamicObject(19297, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);
object_rainbow_player[playerid][1] = CreateDynamicObject(19298, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);

color_rainbow = 2;
}
case 2:
{

if(IsValidDynamicObject(object_rainbow_player[playerid][2]))
{
DestroyDynamicObject(object_rainbow_player[playerid][2]);
object_rainbow_player[playerid][2] = INVALID_OBJECT_ID;
}
GetPlayerPos(playerid, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5]);
object_rainbow_player[playerid][2] = CreateDynamicObject(19298, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5], 0.0, 0.0, 0.0);

color_rainbow = 1;

}

M1RoN
02.05.2017, 18:35
Да.

DeimoS
02.05.2017, 19:46
Сделай вот так


new Float:player_pos_rainbow[MAX_PLAYERS][18],
object_rainbow_player[MAX_PLAYERS][9];



public OnPlayerConnect(playerid)
{
if(GetPVarInt(playerid, "RainbowTimer"))
{
for(new i; i < sizeof(object_rainbow_player[]); i++)
{
if(object_rainbow_player[playerid][i] == INVALID_OBJECT_ID)
continue;
DestroyDynamicObject(object_rainbow_player[playerid][i]);
object_rainbow_player[playerid][i] = INVALID_OBJECT_ID;
}
}
return 1;
}



stock ToggleRainbowTimerForPlayer(playerid)
{
if(GetPVarInt(playerid, "RainbowTimer"))
{
DeletePVar(playerid, "RainbowTimer");
for(new i; i < sizeof(object_rainbow_player[]); i++)
{
if(object_rainbow_player[playerid][i] == INVALID_OBJECT_ID)
continue;
DestroyDynamicObject(object_rainbow_player[playerid][i]);
object_rainbow_player[playerid][i] = INVALID_OBJECT_ID;
}
}
else
{
SetTimerEx("change_color_rainbow", 100, false, "ii", playerid, 1);
SetPVarInt(playerid, "RainbowTimer", 1);
}
return 1;
}




forward change_color_rainbow(playerid, color_rainbow);
public change_color_rainbow(playerid, color_rainbow)
{
if(!GetPVarInt(playerid, "RainbowTimer"))
return 1;

switch(color_rainbow)
{
case 1:
{
if(object_rainbow_player[playerid][2] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][2]);
object_rainbow_player[playerid][2] = INVALID_OBJECT_ID;
}

GetPlayerPos(playerid, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5]);
object_rainbow_player[playerid][2] = CreateDynamicObject(19298, player_pos_rainbow[playerid][3], player_pos_rainbow[playerid][4], player_pos_rainbow[playerid][5], 0.0, 0.0, 0.0);
}
case 2:
{
if(object_rainbow_player[playerid][7] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][7]);
object_rainbow_player[playerid][7] = INVALID_OBJECT_ID;
}
if(object_rainbow_player[playerid][8] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][8]);
object_rainbow_player[playerid][8] = INVALID_OBJECT_ID;
}

GetPlayerPos(playerid, player_pos_rainbow[playerid][15], player_pos_rainbow[playerid][16], player_pos_rainbow[playerid][17]);
object_rainbow_player[playerid][7] = CreateDynamicObject(19296, player_pos_rainbow[playerid][15], player_pos_rainbow[playerid][16], player_pos_rainbow[playerid][17], 0.0, 0.0, 0.0);
object_rainbow_player[playerid][8] = CreateDynamicObject(19298, player_pos_rainbow[playerid][15], player_pos_rainbow[playerid][16], player_pos_rainbow[playerid][17], 0.0, 0.0, 0.0);
}
case 3:
{
if(object_rainbow_player[playerid][4] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][4]);
object_rainbow_player[playerid][4] = INVALID_OBJECT_ID;
}

GetPlayerPos(playerid, player_pos_rainbow[playerid][9], player_pos_rainbow[playerid][10], player_pos_rainbow[playerid][11]);
object_rainbow_player[playerid][4] = CreateDynamicObject(19296, player_pos_rainbow[playerid][9], player_pos_rainbow[playerid][10], player_pos_rainbow[playerid][11], 0.0, 0.0, 0.0);
}
case 4:
{
if(object_rainbow_player[playerid][5] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][5]);
object_rainbow_player[playerid][5] = INVALID_OBJECT_ID;
}
if(object_rainbow_player[playerid][6] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][6]);
object_rainbow_player[playerid][6] = INVALID_OBJECT_ID;
}

GetPlayerPos(playerid, player_pos_rainbow[playerid][12], player_pos_rainbow[playerid][13], player_pos_rainbow[playerid][14]);
object_rainbow_player[playerid][5] = CreateDynamicObject(19296, player_pos_rainbow[playerid][12], player_pos_rainbow[playerid][13], player_pos_rainbow[playerid][14], 0.0, 0.0, 0.0);
object_rainbow_player[playerid][6] = CreateDynamicObject(19297, player_pos_rainbow[playerid][12], player_pos_rainbow[playerid][13], player_pos_rainbow[playerid][14], 0.0, 0.0, 0.0);
}
case 5:
{
if(object_rainbow_player[playerid][3] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][3]);
object_rainbow_player[playerid][3] = INVALID_OBJECT_ID;
}

GetPlayerPos(playerid, player_pos_rainbow[playerid][6], player_pos_rainbow[playerid][7], player_pos_rainbow[playerid][8]);
object_rainbow_player[playerid][3] = CreateDynamicObject(19297, player_pos_rainbow[playerid][6], player_pos_rainbow[playerid][7], player_pos_rainbow[playerid][8], 0.0, 0.0, 0.0);
}
case 6:
{
if(object_rainbow_player[playerid][0] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][0]);
object_rainbow_player[playerid][0] = INVALID_OBJECT_ID;
}
if(object_rainbow_player[playerid][1] != INVALID_OBJECT_ID)
{
DestroyDynamicObject(object_rainbow_player[playerid][1]);
object_rainbow_player[playerid][1] = INVALID_OBJECT_ID;
}

GetPlayerPos(playerid, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2]);
object_rainbow_player[playerid][0] = CreateDynamicObject(19297, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);
object_rainbow_player[playerid][1] = CreateDynamicObject(19298, player_pos_rainbow[playerid][0], player_pos_rainbow[playerid][1], player_pos_rainbow[playerid][2], 0.0, 0.0, 0.0);
}
}
SetTimerEx("change_color_rainbow", 100, false, "ii", playerid, (++color_rainbow > 6 ? 1 : color_rainbow));
return 1;
}

Стартуй таймер так

ToggleRainbowTimerForPlayer(playerid)

Если и после этого будет исчезать, значит дело в чём-то другом, ибо у этот код число объектов оставляет преждним даже после отключения таймера с помощью повторного вызова ToggleRainbowTimerForPlayer