Създаване на entity със sprite който да следва играча

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
atmax
Извън линия
Потребител
Потребител
Мнения: 492
Регистриран на: 22 Мар 2018, 15:06
Се отблагодари: 37 пъти
Получена благодарност: 43 пъти

Създаване на entity със sprite който да следва играча

Мнение от atmax » 15 Ное 2020, 18:38

Целта ми е да добавя ефект който се взима от меню, когато го вземеш да получиш цветни кръгове около себе си, когато се spawn-еш.
Самия ефект за тези цветни кръгове, който искам да ползвам е TE_BEAMCYLINDER. Намерих в един сайт тема на OciXcrom, там е качил inc файл с такива ефекти. От там намерих този ефект, който ми трябва на мене. Но това не е достатъчно, понеже искам ефекта да следва играча докато не изчезне. Разбрах, че за целта трябва да създам обект, който да следва играча и да му задам тоя ефект, но понеже съм нов с fakemeta си нямам и на идея как ще стане това..
С този обект стигнах до тук и даже не знам, дали е правилно..

Код за потвърждение: Избери целия код

new sprite = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"));
if(!sprite)
	return PLUGIN_CONTINUE;
set_pev(sprite, pev_classname, "spritetest");
engfunc(EngFunc_SetModel, sprite, "sprites/shockwave.spr");
engfunc(EngFunc_SetSize, sprite, Float:{0.0,0.0,0.0}, Float:{0.0,0.0,0.0});
engfunc(EngFunc_SetOrigin, sprite, origin);
set_pev(sprite, pev_solid, SOLID_NOT);
set_pev(sprite, pev_movetype, MOVETYPE_FOLLOW);
set_pev(sprite, pev_aiment, id);
А това е stock-а написан от OciXcrom:

Код за потвърждение: Избери целия код

stock te_create_beam_cylinder(position[3], sprite, axis[3] = {0, 0, 0}, startframe = 0, framerate = 30, life = 10, width = 10, noise = 0, r = 0, g = 0, b = 255, a = 75, speed = 0, receiver = 0, bool:reliable = true)
{
	if(receiver && !is_user_connected(receiver))
		return 0;

	message_begin(get_msg_destination(receiver, reliable), SVC_TEMPENTITY, .player = receiver);
	write_byte(TE_BEAMCYLINDER);
	write_coord(position[0]);
	write_coord(position[1]);
	write_coord(position[2]);
	write_coord(axis[0]);
	write_coord(axis[1]);
	write_coord(axis[2]);
	write_short(sprite);
	write_byte(startframe);
	write_byte(framerate);
	write_byte(life);
	write_byte(width);
	write_byte(noise);
	write_byte(r);
	write_byte(g);
	write_byte(b);
	write_byte(a);
	write_byte(speed);
	message_end();

	return 1;
}
Та въпроса ми е: Как да създам този обект с въпросния ефект и да следва играча докато не изчезне ефекта?
Rest in peace my friend I always will remember you! 🖤👊

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Създаване на entity със sprite който да следва играча

Мнение от TheRedShoko » 16 Ное 2020, 02:20

Не ти трябва обект. Можеш да го направиш, използвайки координатите на играча, като подаваш на stock-а координатите на самия играч (можеш да ги вземеш чрез get_user_origin или някой от fakemeta/engine функциите (fakemeta/engine ти връщат float, трябва да ги cast-неш към int)). Precache-ваш си модела и запазваш id-то, което ти връща функцията. Подаваш го като параметъра sprite на stock-а. Правиш си някакъв вид повтарящ се обект (task, thinking entity) и на всяко извикване на обекта си изпълняваш stock-а за координатите на играча и sprite-а, който искаш.

Аватар
atmax
Извън линия
Потребител
Потребител
Мнения: 492
Регистриран на: 22 Мар 2018, 15:06
Се отблагодари: 37 пъти
Получена благодарност: 43 пъти

Създаване на entity със sprite който да следва играча

Мнение от atmax » 16 Ное 2020, 11:53

@TheRedShoko Нещо такова?

Код за потвърждение: Избери целия код

#define rcolor random(256)

new g_Entity, bool:b_HasEffect[33]

new const g_Classname[] = "Entity_Classname"
new const Float:f_ThinkingInterval = 2.0

public plugin_init()
{
	...
	for(new i; i<maxplayers; i++)
	{
		if (b_HasEffect[i])
		{
		g_Entity = create_entity("info_target")
	
		entity_set_string(g_Entity, EV_SZ_classname, g_Classname)
		entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval)
	
		register_think(g_Classname, "EntityThink")
		}
	}
}

public plugin_precache()
{
	shockwave = precache_model("sprites/shockwave.spr")
}

public EntityThink(Ent)
{
	if (Ent == g_Entity)
	{
		entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval)
		new playerpos[3]
	floatround(Float:playerpos, floatround_round)
	get_user_origin(id, playerpos, 3)
	te_create_beam_cylinder(playerpos, shockwave, .r = rcolor, .g = rcolor, .b = rcolor)	
	}
}

public my_handler(id, menu, item)
{
	if(!is_user_connected(id))
        return

	switch(item)
	{
		   case 1:
	b_HasEffect[id] = true;
	set_task(15.0, "remove_ent", id)
	}
}

public remove_ent(id)
{
	new ent = -1
    while( (find_ent_by_class(ent,g_Classname)) > 0 )
    {
        remove_entity(ent)
    }
}
Не обръщай внимание на това, че половината код го няма, написах го на телефона, набързо.
Идеята ми е дали това е начина и дали по този начин ще работи както трябва. Може и да съм се оплел с "мислещия обект", но както казах, нов съм с fakemeta и engine, за това нямам против да ме коригирате, ако някой може да добави нещо с удоволствие ще го изслушам.
Идеята е да разбера как работи и дали го правя правилно.
Тук се опитах да направя това, което ти ми каза и след 15 секунди да премахна ефекта(премахвайки този обект) за целта използвах task в my_handler.
Rest in peace my friend I always will remember you! 🖤👊

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Създаване на entity със sprite който да следва играча

Мнение от TheRedShoko » 16 Ное 2020, 12:16

Като за начало - създам само 1 обект, а не по 1 обект за всеки играч. Вътре в извикването на think-a на обекта ще обхождаш всички играчи и проверяваш кои от тях го имат. get_user_origin връща int, няма нужда да го кастваш. Също така ако кастваш нещо, то кастването трябва да се случи след като вече си присвоил стойността на променливата.

Аватар
atmax
Извън линия
Потребител
Потребител
Мнения: 492
Регистриран на: 22 Мар 2018, 15:06
Се отблагодари: 37 пъти
Получена благодарност: 43 пъти

Създаване на entity със sprite който да следва играча

Мнение от atmax » 16 Ное 2020, 12:26

Също така ако казваш нещо, то кадруването трябва да се случи след като вече си присвоил стойността на променливата.
Това не ми стана ясно, за коя променлива става въпрос?
Да нямаш предвид да присвоя позицията в handler-а?
Последно промяна от atmax на 16 Ное 2020, 12:34, променено общо 1 път.
Rest in peace my friend I always will remember you! 🖤👊

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Създаване на entity със sprite който да следва играча

Мнение от TheRedShoko » 16 Ное 2020, 12:33

Кастваш, кастването* autocorrect-a на телефона ми обича да се гаври с мен.

Аватар
atmax
Извън линия
Потребител
Потребител
Мнения: 492
Регистриран на: 22 Мар 2018, 15:06
Се отблагодари: 37 пъти
Получена благодарност: 43 пъти

Създаване на entity със sprite който да следва играча

Мнение от atmax » 16 Ное 2020, 12:37

Аха ясно, т. е. Трябва да обходя играчите в самия think и там да проверя дали имат ефекта и че няма нужда от floatround, тъй като get_origin връща int?
Rest in peace my friend I always will remember you! 🖤👊

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Създаване на entity със sprite който да следва играча

Мнение от TheRedShoko » 16 Ное 2020, 15:57

Да. Обхождаш си играчите в самия think и не ти трябва кастване, защото get_user_origin връща int. Пробвай се да си го направиш и пиши, ако имаш нужда от още помощ.

Аватар
atmax
Извън линия
Потребител
Потребител
Мнения: 492
Регистриран на: 22 Мар 2018, 15:06
Се отблагодари: 37 пъти
Получена благодарност: 43 пъти

Създаване на entity със sprite който да следва играча

Мнение от atmax » 16 Ное 2020, 18:46

Благодаря, успях да го подкарам! :beer:
Като цяло това е решението:
Не ти трябва обект. Можеш да го направиш, използвайки координатите на играча, като подаваш на stock-а координатите на самия играч (можеш да ги вземеш чрез get_user_origin или някой от fakemeta/engine функциите (fakemeta/engine ти връщат float, трябва да ги cast-неш към int)). Precache-ваш си модела и запазваш id-то, което ти връща функцията. Подаваш го като параметъра sprite на stock-а. Правиш си някакъв вид повтарящ се обект (task, thinking entity) и на всяко извикване на обекта си изпълняваш stock-а за координатите на играча и sprite-а, който искаш.
Ключаря да :lock:
Rest in peace my friend I always will remember you! 🖤👊

Заключено
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 13 госта