PDA

Просмотр полной версии : [Вопрос] Не создаётся объект



Edwin
18.06.2017, 15:42
Почему может не создаваться объект для игрока?
Функция возвращает невалидный ID объекта. Странно, но код раньше работал, а в какой-то момент перестал
Объекты для игрока нигде особо не используются



object[playerid] = CreatePlayerObject(playerid, 19300, X, Y, Z, 0.0, 0.0, 0.0);
AttachCameraToPlayerObject(playerid, object[playerid]);

DeimoS
18.06.2017, 19:06
Так а какое количество CreateObject создаётся?
Так же если объектов стримера вокруг слишком много - ничего так же не будет работать.
Всё ведь завязано на лимите в 1000 объектов. И для всех функций лимит общий: хоть CreateObject, хоть CreatePlayerObject (CreateDynamicObject - это тот же самый CreateObject, только создаётся и удаляется стримером в определённые моменты)

Edwin
18.06.2017, 19:28
А есть какая функция посмотреть количество статических объектов?
Или перехват только делать?

DeimoS
18.06.2017, 19:32
Все функции, свзанные с объектами, можно в a_objects.inc увидеть.
Только перехват.

Edwin
18.06.2017, 23:27
Есть возможность как-то сократить количество предметов вокруг игрока в этот момент?

DeimoS
18.06.2017, 23:50
Так а ты удостоверился, что количество CreateObject минимально и дело именно в большом числе динамических объектов?

Не проще просто воспользоваться CreateDynamicObject с соответствующим параметром? Говорю же, на деле будет тот же CreatePlayerObject, только обрабатываемый стримером

Edwin
20.06.2017, 13:38
Так а ты удостоверился, что количество CreateObject минимально и дело именно в большом числе динамических объектов?

Не проще просто воспользоваться CreateDynamicObject с соответствующим параметром? Говорю же, на деле будет тот же CreatePlayerObject, только обрабатываемый стримером

Нет, как раз, всё то же самое. Я даже вывел на экран количество статичных и динамичных объектов в стриме.
Динамический объект я тоже пробовал, абсолютно тот же результат. Да и с чего ему быть другим, когда вокруг больше объектов, чем есть лимит?..
Отойдя в другое место объект создаётся нормально

DeimoS
20.06.2017, 14:19
Ну разве что через скрытие всех объектов, создания нового и показа всех объектов.
Попробуй Streamer_DestroyAllVisibleItems или Streamer_ToggleAllItems для скрытия

Edwin
20.06.2017, 16:07
Ну разве что через скрытие всех объектов, создания нового и показа всех объектов.
Попробуй Streamer_DestroyAllVisibleItems или Streamer_ToggleAllItems для скрытия

А чем они назад включаются?

DeimoS
20.06.2017, 17:15
Streamer_Update попробуй или Streamer_ToggleItemUpdate. Вообще открой инклуд стримера и там будет список всех функций. Среди них и подбирай подходящую

Edwin
20.06.2017, 19:49
Streamer_Update попробуй или Streamer_ToggleItemUpdate. Вообще открой инклуд стримера и там будет список всех функций. Среди них и подбирай подходящую

Так я ж так и делаю, только фиг там поймёшь что там кого обновляет и для чего там что нужно
Да и Streamer_DestroyAllVisibleItems не убирает ничего... Самое прикольное, что эффект нужный она даёт

DeimoS
21.06.2017, 01:28
Так я ж так и делаю, только фиг там поймёшь что там кого обновляет и для чего там что нужно

Так там примерно по названиям понять можно же, не? Ну или хотя бы методом научного тыка.

Как и говорил
Скрыть:

Streamer_ToggleAllItems(playerid, STREAMER_TYPE_OBJECT, false);
Streamer_Update(playerid, STREAMER_TYPE_OBJECT);

Показать:

Streamer_ToggleAllItems(playerid, STREAMER_TYPE_OBJECT, true);
Streamer_Update(playerid, STREAMER_TYPE_OBJECT);

Хотя сейчас пытался проверить создание CreateDynamicObject при лимите и всё нормально создаётся. Не будет создаваться только если лимит CreateObject/CreateDynamicObject превышен (точнее, "создаваться" (записываться в память стримера) и возвращать ID будет, но отображаться не будет).
CreateDynamicObject будет возвращать ID даже если объектов больше 1000

Edwin
21.06.2017, 08:40
Так там примерно по названиям понять можно же, не? Ну или хотя бы методом научного тыка.

Как и говорил
Скрыть:

Streamer_ToggleAllItems(playerid, STREAMER_TYPE_OBJECT, false);
Streamer_Update(playerid, STREAMER_TYPE_OBJECT);

Показать:

Streamer_ToggleAllItems(playerid, STREAMER_TYPE_OBJECT, true);
Streamer_Update(playerid, STREAMER_TYPE_OBJECT);

Хотя сейчас пытался проверить создание CreateDynamicObject при лимите и всё нормально создаётся. Не будет создаваться только если лимит CreateObject/CreateDynamicObject превышен (точнее, "создаваться" (записываться в память стримера) и возвращать ID будет, но отображаться не будет).
CreateDynamicObject будет возвращать ID даже если объектов больше 1000

У меня как: 550 объектов статических, и вокруг ещё в зоне стрима ~500 на момент создания
Если хочешь, пошли я тебе покажу всё с выводом на экран, что бы понятнее было

Немного всё же не понятно назначение этих функций. Streamer_ToggleAllItems.. "Переключение"... чего?
Streamer_Update... "обновить объекты"? По-моему, так себе названия)

DeimoS
21.06.2017, 12:18
У меня как: 550 объектов статических, и вокруг ещё в зоне стрима ~500 на момент создания
Если хочешь, пошли я тебе покажу всё с выводом на экран, что бы понятнее было
Так кинь код, которым создаёшь.
Я тебе тоже могу записать видео, где будет видно, что объект прекрасно создаётся.
И да, вполне возможно, что ты сидишь на старой версии стримера просто, в которой это может быть не учтено :)


Немного всё же не понятно назначение этих функций. Streamer_ToggleAllItems.. "Переключение"... чего?

Переключение того, что укажешь в параметре функции


Streamer_Update... "обновить объекты"? По-моему, так себе названия)

Причём тут объекты-то? В названии не указывается что именно обновляется. Это просто функция, которая обращается к коду, который обновляет данные для игрока. А уже какие данные она обновит - зависит от того, что в ней указать. Собственно, как и в предыдущей функции.
В стримере же не только объекты есть. И глупо было бы для каждого вида данных (объекты/пикапы/динамические зоны и т.п.) делать свою функцию.

Edwin
21.06.2017, 12:33
Так кинь код, которым создаёшь.
Я тебе тоже могу записать видео, где будет видно, что объект прекрасно создаётся.
И да, вполне возможно, что ты сидишь на старой версии стримера просто, в которой это может быть не учтено :)



Переключение того, что укажешь в параметре функции



Причём тут объекты-то? В названии не указывается что именно обновляется. Это просто функция, которая обращается к коду, который обновляет данные для игрока. А уже какие данные она обновит - зависит от того, что в ней указать. Собственно, как и в предыдущей функции.
В стримере же не только объекты есть. И глупо было бы для каждого вида данных (объекты/пикапы/динамические зоны и т.п.) делать свою функцию.

Так я это понимаю, что я, не вижу, думаешь, что указываю в параметрах объекты? Я говорю тебе просто на примере объектов
"Переключить что": переключить объекты? А что, они не переключены? Что такое вообще "переключить объекты"?

Nexius_Tailer
21.06.2017, 13:13
Так я это понимаю, что я, не вижу, думаешь, что указываю в параметрах объекты? Я говорю тебе просто на примере объектов
"Переключить что": переключить объекты? А что, они не переключены? Что такое вообще "переключить объекты"?
Это уже следствие языкового барьера, не более. Одно и то же слово может иметь не один перевод и в конкретной ситуации его интерпретация также может изменяться, так что здесь это не обязательно "переключить". По контексту скорее всего имеется в виду "включить/выключить видимость/присутствие чего-либо"

Edwin
21.06.2017, 14:31
Это уже следствие языкового барьера, не более. Одно и то же слово может иметь не один перевод и в конкретной ситуации его интерпретация также может изменяться, так что здесь это не обязательно "переключить". По контексту скорее всего имеется в виду "включить/выключить видимость/присутствие чего-либо"

Хорошо.
А почему Streamer_DestroyAllVisibleItems не уничтожает все видимые объекты?

DeimoS
21.06.2017, 15:52
Хорошо.
А почему Streamer_DestroyAllVisibleItems не уничтожает все видимые объекты?

Он их уничтожает, просто следует так же отключать и обновление данных об объектах для игрока через ToggleItemUpdate и тогда они не будут появляться вновь

Edwin
21.06.2017, 18:01
Он их уничтожает, просто следует так же отключать и обновление данных об объектах для игрока через ToggleItemUpdate и тогда они не будут появляться вновь

То есть, в моём случае тогда просто достаточно просто вызвать Streamer_DestroyAllVisibleItems, и тогда можно без использования ToggleItemUpdate спокойно бегать по "уничтоженным" объектам?

DeimoS
21.06.2017, 19:05
То есть, в моём случае тогда просто достаточно просто вызвать Streamer_DestroyAllVisibleItems, и тогда можно без использования ToggleItemUpdate спокойно бегать по "уничтоженным" объектам?

Нет, в твоём случае сначала нужно отключить обновление объектов, а после уже уничтожать их.
Эта функция лишь вызывает DestroyPlayerObject, после которой плагин сразу же вызывает CreatePlayerObject, так как обновление данных об объектах не отключено и, соответственно, плагин думает, что объекты вокруг просто не показаны для игрока и их нужно показать (срабатывает условие, за счёт которого показываются объекты, которые только попадают в зону стрима игрока. А ToggleItemUpdate как раз и отключает это условие).

Edwin
21.06.2017, 21:22
Нет, в твоём случае сначала нужно отключить обновление объектов, а после уже уничтожать их.
Эта функция лишь вызывает DestroyPlayerObject, после которой плагин сразу же вызывает CreatePlayerObject, так как обновление данных об объектах не отключено и, соответственно, плагин думает, что объекты вокруг просто не показаны для игрока и их нужно показать (срабатывает условие, за счёт которого показываются объекты, которые только попадают в зону стрима игрока. А ToggleItemUpdate как раз и отключает это условие).

Так а смысл тогда их апдейтить? Если я их удаляю, сразу создаю нужный объект, и они, как раз, все на место возвращаются

DeimoS
22.06.2017, 02:32
Так а смысл тогда их апдейтить? Если я их удаляю, сразу создаю нужный объект, и они, как раз, все на место возвращаются

Так а где я говорил удалять их? Мой последний вариант никак не связан с Streamer_DestroyAllVisibleItems.
Да и, как уже говорил, всё без этих махинаций должно работать. По крайней мере, с последней версией стримера

Edwin
22.06.2017, 13:22
Так а где я говорил удалять их? Мой последний вариант никак не связан с Streamer_DestroyAllVisibleItems.
Да и, как уже говорил, всё без этих махинаций должно работать. По крайней мере, с последней версией стримера

Так ведь вот я и говорю: получается, достаточно простого Streamer_DestroyAllVisibleItems.. если я правильно всё понял?

DeimoS
22.06.2017, 15:33
Так ведь вот я и говорю: получается, достаточно простого Streamer_DestroyAllVisibleItems.. если я правильно всё понял?

Если ты хочешь именно скрыть объекты, чтоб создать новый - нет, не достаточно.
Перечитай ещё раз предыдущие сообщения и попробуй сам, если не поймёшь. Собственно, этим ты должен был уже давно заняться, а не допытывать тут меня :) Уже давно нашёл бы решение.

Edwin
22.06.2017, 15:40
Если ты хочешь именно скрыть объекты, чтоб создать новый - нет, не достаточно.
Перечитай ещё раз предыдущие сообщения и попробуй сам, если не поймёшь. Собственно, этим ты должен был уже давно заняться, а не допытывать тут меня :) Уже давно нашёл бы решение.

Так я же и говорю, что работает! :)
Занялся уже давно конечно)

DeimoS
22.06.2017, 15:46
Так я же и говорю, что работает! :)
Занялся уже давно конечно)

Ну так тогда поделился бы с остальными своим вариантом :) А то вдруг у людей та же проблема будет и у них так же не будет работать стример, как работает у меня О_о

Edwin
22.06.2017, 15:55
Так ведь я же уже и поделился


Да и Streamer_DestroyAllVisibleItems не убирает ничего... Самое прикольное, что эффект нужный она даёт

Вот таким образом вся проблема решилась, спасибо Деймосу



Streamer_DestroyAllVisibleItems(playerid, STREAMER_TYPE_OBJECT);
noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, X, Y, Z, 0.0, 0.0, 0.0);
AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]);

DeimoS
22.06.2017, 16:03
Можешь для нашего столика провести эксперимент и убрать Streamer_DestroyAllVisibleItems? То бишь, без него попробуй создать объект. Мои опыты показывают, что дело не в нём :)

Edwin
22.06.2017, 16:07
Можешь для нашего столика провести эксперимент и убрать Streamer_DestroyAllVisibleItems? То бишь, без него попробуй создать объект. Мои опыты показывают, что дело не в нём :)

Просто, когда я задавал этот вопрос, код отличался от этого как раз только отсутствием этой строчки)
Ну сейчас пепроверю, конечно, для точности

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

Проверка показала следующие результаты:

Без дестроя объект == 65535, камера где-то в воздухе, двигать ей нельзя



http://savepic.ru/14506714m.png (http://savepic.ru/14506714.htm)



Со вставкой дестроя перед созданием ситуация меняется:


Статичные объекты сразу видно, камеру мышкой иногда с первого раза двигать нельзя, но летать можно


http://savepic.ru/14495451m.png (http://savepic.ru/14495451.htm)

если немного отлететь, объекты, как и положено всем динамическим, появятся на своём месте


http://savepic.ru/14524122m.png (http://savepic.ru/14524122.htm)

DeimoS
23.06.2017, 13:45
Либо у тебя стример какой-то странный, либо у меня. Ну не суть.


Чтоб объекты сразу появились, можно использовать Streamer_Update после перемещения камеры.

Закрыто.