This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Вопрос Привязка объекта в педу

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
Решил дать планшет педу, но когда я это делаю, планшет спавнится внутри него. Вопрос как дать планшет ему в руку. Все делал на клиенте.

JavaScript:
mp.events.add('entityStreamIn', (entity) => {
    if (entity && entity.handle !== 0) {  
        if (entity == PoliceNPC) {
            PoliceNPC.taskPlayAnim("amb@code_human_wander_clipboard@male@base", "static", 8.0, 1.0, -1, 1, 1.0, false, false, false);
            const sack = mp.objects.new(mp.game.joaat('p_cs_clipboard'), PoliceNPC.position);
            sack.attachTo(PoliceNPC.handle, 0, 0, 0, 0, 0, 0, 0, true, true, false, true, 0, true)
        }
    }
});
 
Последнее редактирование:

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
Ты прикрепляешь предмет к 0 кости, которая отвечает за скелет (SKEL_ROOT) в целом.
JavaScript:
entity.attachTo(entity2, boneIndex, xPosOffset, yPosOffset, zPosOffset, xRot, yRot, zRot, p9, useSoftPinning, collision, isPed, vertexIndex, fixedRot);
там, где boneIndex - индекс кости (не ID кости, это разные вещи), к которой нужно аттачить предмет (в твоём случае это должна быть рука)
JavaScript:
PoliceNPC.getBoneIndex(28422) // получаем индекс кости правой руки
PoliceNPC.getBoneIndex(60309) // Получаем индекс кости левой руки
 
Реакции: spoky

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
т.е.
JavaScript:
sack.attachTo(PoliceNPC.handle, PoliceNPC.getBoneIndex(60309), 0, 0, 0, 0, 0, 0, true, true, false, true, 0, true)
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
т.е.
JavaScript:
sack.attachTo(PoliceNPC.handle, PoliceNPC.getBoneIndex(60309), 0, 0, 0, 0, 0, 0, true, true, false, true, 0, true)
Попробуй, но я бы еще отключил коллизию этому планшету
JavaScript:
sack.setCollision(false, false);
Плюс в самом .attachTo есть параметр collision, его тоже на false.
При правильном аттаче анимация сбиваться не должна.
 

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
JavaScript:
mp.events.add('entityStreamIn', (entity) => {
    if (entity && entity.handle !== 0) {  
        if (entity == PoliceNPC) {
            PoliceNPC.taskPlayAnim("amb@code_human_wander_clipboard@male@base", "static", 8.0, 1.0, -1, 1, 1.0, false, false, false);
            const sack = mp.objects.new(mp.game.joaat('p_cs_clipboard'), PoliceNPC.position);
            sack.attachTo(PoliceNPC.handle, PoliceNPC.getBoneIndex(60309), 0, 0, 0, 0, 0, 0, true, true, false, true, 0, true)
            sack.setCollision(false, false)
        }
    }
});

Планшета нет) Точнее он в нем
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
Убирай коллизию до того, как ты его аттачишь, плюс ты его спавнишь внутри него PoliceNPC.position.
Пробуй хотя бы вот так:

JavaScript:
mp.events.add('entityStreamIn', (entity) => {
    if (entity && entity.handle !== 0) {
        if (entity == PoliceNPC) {
            PoliceNPC.taskPlayAnim("amb@code_human_wander_clipboard@male@base", "static", 8.0, 1.0, -1, 1, 1.0, false, false, false);
            const sack = mp.objects.new(mp.game.joaat('p_cs_clipboard'), PoliceNPC.position);
            sack.setCollision(false, false);
            sack.attachTo(PoliceNPC.handle, PoliceNPC.getBoneIndex(60309), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false, false, false, false, 2, true);
        }
    }
});
Ну и тебе нужно обязательно дождаться, чтобы sack (объект) приобрёл handle, после его создания он может появиться не моментально, как требуется в коде, так что туда бы еще проверку на sack.handle != 0.
Плюс я бы в принципе не рекомендовал делать это именно таким образом, потому что при entityStreamOut нужно будет удалять этот объект, а ты не знаешь entity объекта. Создай систему, которая хранит такие вещи, чтобы можно было к ним обращаться после. Иначе в таком варианте рано или поздно будешь получать объекты планшетов, висящие в воздухе.
 
Последнее редактирование:

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
Все равно его не видно
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
Ты проверил до момента аттача, что объект успел создаться и имеет handle !== 0?
У меня он равен 0
Код:
mp.events.add('entityStreamIn', (entity) => {
    if (entity && entity.handle !== 0) {
        if (entity == PoliceNPC) {
            PoliceNPC.taskPlayAnim("amb@code_human_wander_clipboard@male@base", "static", 8.0, 1.0, -1, 1, 1.0, false, false, false);
            const sack = mp.objects.new(mp.game.joaat('p_cs_clipboard'), PoliceNPC.position);
            if(sack.handle !== 0){
                mp.gui.chat.push("test")
            }

            if(sack.handle === 0){
                mp.gui.chat.push(`0`)
            }
            mp.gui.chat.push(sack.handle)
            sack.setCollision(false, false);
            sack.attachTo(PoliceNPC.handle, PoliceNPC.getBoneIndex(60309), 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, false, false, false, false, 2, true);
        }
    }
});
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
Он не должен быть равен 0 в момент аттача, очевидно, 0 хэндл означает, что у игрока он еще не успел создаться. Пробуй дожидаться, пока он не станет чем-то кроме 0.
 

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
Я поставил проверку на кнопку и когда я подъезжаю он становится не 0. Но что нам это дало?
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
Повторю еще раз, тебе нужно в момент прогруза персонажа и создания объекта дождаться, чтобы handle стал !== 0, тогда он нормально прикрепится. Не знаю, как объяснить еще, если я прямым текстом ответил что нужно сделать
 

Рикардо

Начинающий специалист
15 Сен 2020
147
60
82
Вы че ХайКодеры то советуете? Любой атачмент идет через задержку, нужно все это дело (атач) писать внутри setTimeout.... Так устроенна платформа.... У Вас из за этого не спавнится объект)))

добавлю: Либо делать ассинхронно через вайл
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
Дядя Стёпа, ты дурак? (С)
У тебя какая-то неприязнь к роли или просто подростковый максимализм? Что конкретно тебя не устроило из советов? То, что он аттачился к 0 кости (скелету) или то, что я сказал, что нужно сделать ожидание момента, когда объект обретёт хэндл (по сути то же, что ты написал, только в моём случае более правильно описана причина, потому что "так устроена платформа" - слова человека, который не разбирается "почему", а просто принял, что должно быть как-то так)?
 
Реакции: Рикардо

Рикардо

Начинающий специалист
15 Сен 2020
147
60
82
Не приязни нет, но да, у Меня подросковый максимализм! Все верно ты написал, Я не к тому, что ты не знаешь (хотя Я тоже вообще ноль в данной платформе). У него как Я понял не спавнился объект, по этому Мне пришлось выкакать свою какашку на данный пост ))
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,770
1,577
211
28
Я просто не первый раз уже вижу подобного рода сообщения с твоей стороны в сторону 'хайкодеров', хотя разве роль как-то что-то меняет в твоих умениях и пониманиях или это такая обида, что у тебя роли нет? Пока не совсем понял.
По проблеме топик стартера:
У него спавнится объект, но он не успевает обрести хэндл, из-за этого любая дальнейшая работа с объектом не будет завершена, это не потому, что на платформе так устроено, это простая логика - объект не успел создаться на стороне мультиплеера, очевидно мы не можем взаимодействовать с ним до тех пор, вывод и решение простое - создать ожидание создания хэндла.
 
Реакции: Рикардо

Рикардо

Начинающий специалист
15 Сен 2020
147
60
82
У меня нет неприязности и нет обиды или еще что либо отрицательное в сторону ХайКодеров (это некая точка прикола).
P.S: У Меня была данная роль, но Я самовольно уволился с нее)) Так как Я не заслуживаю ее))
По проблеме топик стартера:

Я полностью с тобой согласен, по этому надо делать задержку, по другому он не заспавнится. Я не силен конечно в кодах или скриптах и вообще в целом нет понимания в данной платформе, но моя чуйка говорит, что нужно прописать тело сетТаймаут и в ней уже делать аттач!
 

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
С обоими согласен и у меня багается клиент, из за этого вчера не смог нормально это проверить, чтоб наверняка аттач закинул вообще в рендер для проверки и о боги все работает, дальше додумывать буду сам. Единственный вопрос который терзает мою земную тушу, придется ли это как-то показывать на сервере (если вдруг буду работать с игроком а не с педом) или клиент автоматически передаст данные на сервер?
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
3,812
1,866
208
35
само по себе ничего не передаётся xD
если ты работаешь с игроком - есть некая логика в том, чтобы аттачить к нему объект на сервере
а клиент дергать для синхронизации отображения с остальными игроками
 

dreamharakiri

Новый участник
25 Дек 2021
75
1
49
А как же тогда на сервере передавать аттач предмета к игроку?