|
Форум Counter-Strike 1.6 Сервер Counter-Strike 1.6 Помощь по скриптингу Установка спрайта ( через message_begin или модуль engine ) (Установка спрайта ( через message_begin или модуль engine )) |
Установка спрайта ( через message_begin или модуль engine ) |
Дата: Воскресенье, 15.07.2018, 16:19 | Сообщение # 1
Скриптер
Дух ( Новичок )
Offline
![]()
В общем, моя проблема в том, что Pawn мне не позволяет использовать свою логику работы с объектами, и никак не даёт возможность присоединить двигающийся sprite за игроком. Я пробовал и через task с функцией message_begin, и через функции модуля engine ( set_pev и engfunc ), но никак сделать это не получается. Я знаю, что на форуме есть люди, которые за это знают ( p.s. я уже смотрел разные исходы, где прикрепляют что-то на подобии спрайта к игроку, но самолично у меня этого не получилось сделать ), и хотел бы у них узнать пример кода, как такое дело провернуть
Вот мои примеры кода, которые не работают ( последний результат - стоящий на месте спрайт ) Код new Sprite; public plugin_init() { register_think("Sprite", "Think_Sprite") } public SetSprite(id) { Sprite = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); static Origin[3]; pev(id, pev_origin, Origin); Origin[1] += 200; engfunc(EngFunc_SetOrigin, Sprite, Origin); engfunc(EngFunc_SetModel, Sprite, g_Sprite); // g_Sprite - запрекешанная модель самого спрайта entity_set_float(Sprite, EV_FL_scale, 0.2); set_pev(Sprite, pev_classname, "Sprite"); set_pev(Sprite, pev_solid, SOLID_NOT); set_pev(Sprite, pev_movetype, MOVETYPE_NOCLIP); set_pev(Sprite, pev_frame, 10.0); set_pev(Sprite, pev_nextthink, get_gametime()); } public Think_Sprite(id, Ent) { static Float:Origin[3] pev(id, pev_origin, Origin) Origin[2] += 300.0 set_pev(Ent, pev_origin, Origin) set_pev(Ent, pev_nextthink, get_gametime() + 0.1) } Возможно я где то напутал с синком, потому что опыта с его использованием - у меня мало. Нужный результат - поднять спрайт над моделью игрока ( объектом ) -> чтобы он всегда был над объектом, куда бы этот объект не переместился. Сразу спасибо всем, кто ответит на тему и как либо поможет |
Дата: Воскресенье, 15.07.2018, 20:36 | Сообщение # 2
Zombie Dev
Дух ( Новичок )
Offline
![]()
Энтити спрайта это не Sprite, а env_sprite. Если же нужно сделать идеальный спрайт над/в игроке, чтобы он плавно двигался за игроком, можно использовать TE_PLAYERATTACHMENT, в нём можно и модели также прикреплять, однако если нужно поворачивать спрайт/модель - то не получится, уже придётся делать через энтити. Если есть моя пушки Red Dragon Cannon - там можешь посмотреть как сделан полёт дракона над игроком, тоже самое и с спрайтом делаешь.
Про TE_PLAYERTTACHMENT - https://github.com/baso88/SC_AngelScript/wiki/TE_PLAYERATTACHMENT Также для истребления твоего спрайта в экстренных случаях, понадобиться TE_KILLPLAYERATTACHMENTS - https://github.com/baso88/SC_AngelScript/wiki/TE_KILLPLAYERATTACHMENTS Добавлено (15.07.2018, 20:36) Код static Origin[3]; pev(id, pev_origin, Origin);
Сообщение отредактировал xUnicorn - Воскресенье, 15.07.2018, 20:33
|
Дата: Воскресенье, 15.07.2018, 23:08 | Сообщение # 3
Скриптер
Эксперт
Offline
![]()
Зачем при создании присваивать координаты, если потом по логике кода они всё равно смещаются относительно игрока на 300 юнитов по Z координате? К тому же товарищ выше про тип Float подметил верно, хотя твой код бы работал, если бы в функции think'а у тебя случайным образом не появился лишний аргумент:
Код public Think_Sprite(id, Ent) Код public Think_Sprite(Ent) Для реалистичности лучше в think'е игрока работу с энтити проводить. А вообще лучше последовать совету товарища выше. Для следования спрайта за игроком создание энтити и не нужно вовсе.
Сообщение отредактировал EpisCape - Понедельник, 16.07.2018, 00:48
|
Дата: Понедельник, 16.07.2018, 03:22 | Сообщение # 4
Скриптер
Дух ( Новичок )
Offline
![]()
Вот контент с моим кодом [ вложения ]
Код public SetSprite(id) { Sprite = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); static Float:Origin[3]; pev(id, pev_origin, Origin); Origin[1] += 200; engfunc(EngFunc_SetOrigin, Sprite, Origin); engfunc(EngFunc_SetModel, Sprite, g_HeroSprite); entity_set_float(Sprite, EV_FL_scale, 0.2); set_pev(Sprite, pev_classname, "Sprite"); set_pev(Sprite, pev_solid, SOLID_NOT); set_pev(Sprite, pev_movetype, MOVETYPE_NOCLIP); set_pev(Sprite, pev_frame, 10.0); set_pev(Sprite, pev_nextthink, get_gametime()); } public Think_Sprite(id, Ent) { static Float:Origin[3] pev(id, pev_origin, Origin) Origin[2] += 300.0 set_pev(Ent, pev_origin, Origin) set_pev(Ent, pev_nextthink, get_gametime() + 0.1) } А вот с тем, которым предложил EpisCase - спрайта просто нет в игре Код public SetSprite(id) { if(!is_user_alive(id)) return PLUGIN_HANDLED; new iEnt = create_entity("info_null"); entity_set_edict(iEnt, EV_ENT_owner, id); entity_set_string(iEnt, EV_SZ_classname, "info_sprite"); entity_set_model(iEnt, g_HeroSprite); entity_set_int(iEnt, EV_INT_solid, SOLID_NOT); entity_set_int(iEnt, EV_INT_movetype, MOVETYPE_NOCLIP); entity_set_float(iEnt, EV_FL_scale, 0.2); entity_set_float(iEnt, EV_FL_frame, 10.0); entity_set_float(iEnt, EV_FL_nextthink, get_gametime() + 0.1); return PLUGIN_HANDLED; } public Think_Sprite(iEnt) { if(!is_valid_ent(iEnt)) return PLUGIN_HANDLED; static id; id = entity_get_edict(iEnt, EV_ENT_owner); if(!is_user_alive(id)) { entity_set_float(iEnt, EV_FL_nextthink, get_gametime() + 1.0); return PLUGIN_HANDLED; } static Float:fOrigin[3]; entity_get_vector(id, EV_VEC_origin, fOrigin); fOrigin[2] += 300; entity_set_vector(iEnt, EV_VEC_origin, fOrigin); entity_set_float(iEnt, EV_FL_nextthink, get_gametime() + 0.1); return PLUGIN_HANDLED; } Коды по сути - схожи. Можно сказать, мне осталось каким то волшебным образом убрать черную рамку и вести спрайт за игроком Прикрепления:
2544649.png
(1.44 Mb)
Сообщение отредактировал Dambas - Понедельник, 16.07.2018, 03:23
|
Дата: Понедельник, 16.07.2018, 11:16 | Сообщение # 5
Профи-ветеран
Offline
![]()
Что то вы слишком намудрили с функцией think EpisCape ввести EV_ENT_owner где будет храниться id владельца и использоваться в дальнейшем, так как think entity по класу выдает лишь ent объекта.
Я вижу более 3 вариантов решения данной задачи, возможно больше. Если проблема не решена пишите vk Добавлено (16.07.2018, 11:16) --------------------------------------------- Первый вариант Второй вариант Третий вариант с плавным перемещением для первого варианта Четвертный вариант с плавным перемещением для второго варианта При использовании message_begin функция упрощается и не появляется необходимость в получении координат объекта
Сообщение отредактировал pro100web - Понедельник, 16.07.2018, 11:17
|
| |||
| |||