• Страница 1 из 1
  • 1
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Установка спрайта ( через message_begin или модуль engine ) (Установка спрайта ( через message_begin или модуль engine ))
Установка спрайта ( через message_begin или модуль engine )
Дата: Воскресенье, 15.07.2018, 16:19 | Сообщение # 1
Zombie Dev
Дух ( Новичок )
Offline
  • Dambas
  • Репутация: 54
  • Сообщений:17
  • Скриптер
  • Статус пользователя https://vk.com/forum_bz - Группа с моими работами
В общем, моя проблема в том, что 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
  • xUnicorn
  • Репутация: 27
  • Сообщений:9
  • Скриптер
Энтити спрайта это не Sprite, а env_sprite. Если же нужно сделать идеальный спрайт над/в игроке, чтобы он плавно двигался за игроком, можно использовать TE_PLAYERATTACHMENT, в нём можно и модели также прикреплять, однако если нужно поворачивать спрайт/модель - то не получится, уже придётся делать через энтити. Если есть моя пушки Red Dragon Cannon - там можешь посмотреть как сделан полёт дракона над игроком, тоже самое и с спрайтом делаешь.

Про TE_PLAYERTTACHMENThttps://github.com/baso88/SC_AngelScript/wiki/TE_PLAYERATTACHMENT
Также для истребления твоего спрайта в экстренных случаях, понадобиться TE_KILLPLAYERATTACHMENTShttps://github.com/baso88/SC_AngelScript/wiki/TE_KILLPLAYERATTACHMENTS

Добавлено (15.07.2018, 20:36)
---------------------------------------------
Касаемо твоего прикпеплённого кода 
        

Код
static Origin[3];
        pev(id, pev_origin, Origin);
Ты забыл указать тип переменной Float: , так как возможно, при записи в переменную ниже, он записывает координаты 0 0 0 (я не уверен)
Сообщение отредактировал xUnicorn - Воскресенье, 15.07.2018, 20:33
Дата: Воскресенье, 15.07.2018, 23:08 | Сообщение # 3
Silver Elite Master
Эксперт
Offline
  • EpisCape
  • Репутация: 50
  • Сообщений:49
  • Опытный Скриптер
  • Статус пользователя По любым вопросам:
    [vk.com/episcape0]
Зачем при создании присваивать координаты, если потом по логике кода они всё равно смещаются относительно игрока на 300 юнитов по Z координате? К тому же товарищ выше про тип Float подметил верно, хотя твой код бы работал, если бы в функции think'а у тебя случайным образом не появился лишний аргумент:
Код
public Think_Sprite(id, Ent)
Функция register_think регистрирует think по класснэйму и передает только идентификатор энтити, но никак не игрока или еще что-то там. То есть:
Код
public Think_Sprite(Ent)
Если тебе так нравится такой способ, то вот тебе исправленный и оптимизированный вариант:
Для реалистичности лучше в think'е игрока работу с энтити проводить.
А вообще лучше последовать совету товарища выше. Для следования спрайта за игроком создание энтити и не нужно вовсе.
Сообщение отредактировал EpisCape - Понедельник, 16.07.2018, 00:48
Дата: Понедельник, 16.07.2018, 03:22 | Сообщение # 4
Zombie Dev
Дух ( Новичок )
Offline
  • Dambas
  • Репутация: 54
  • Сообщений:17
  • Скриптер
  • Статус пользователя https://vk.com/forum_bz - Группа с моими работами
Вот контент с моим кодом [ вложения ]


Код
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
  • pro100web
  • Репутация: 44
  • Сообщений:248
  • Проверенный
Что то вы слишком намудрили с функцией think EpisCape ввести EV_ENT_owner где будет храниться id владельца и использоваться в дальнейшем, так как think entity по класу выдает лишь ent объекта.
Я вижу более 3 вариантов решения данной задачи, возможно больше. Если проблема не решена пишите vk


Добавлено (16.07.2018, 11:16)
---------------------------------------------
Первый вариант


Второй вариант


Третий вариант с плавным перемещением для первого варианта



Четвертный вариант с плавным перемещением для второго варианта



При использовании message_begin функция упрощается и не появляется необходимость в получении координат объекта
Сообщение отредактировал pro100web - Понедельник, 16.07.2018, 11:17
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Установка спрайта ( через message_begin или модуль engine ) (Установка спрайта ( через message_begin или модуль engine ))
  • Страница 1 из 1
  • 1
Поиск:
(threadpage)