Създаване на мислещо entity с Engine

В този раздел можете да намерите полезни кодове и уроци свързани с PAWN скриптинга.
Аватар
DaRk_StyLe
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 264
Регистриран на: 26 Окт 2016, 12:40
Се отблагодари: 11 пъти
Получена благодарност: 33 пъти

Създаване на мислещо entity с Engine

Мнение от DaRk_StyLe » 26 Авг 2017, 12:38

Здравейте,

В този кратък урок ще разгледаме как се създава мислещо (thinking) entity с помощта на Engine. Избираме Engine, тъй като филтрирането на различните entity-та става в кода на самия модул, което води до по-добра работа в сравнение с другите методи.
Най-честата употреба на мислещо entity е замяната на повтарящ се task, тъй като самата операция при създаване на task е тежка.

Нека преминем към същинската част на урока. Първо ще действаме стъпка по стъпка, а накрая ще видим и крайния резултат.
Добавяме Engine и създаваме няколко глобални променливи.

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

#include <amxmodx>
#include <engine>

new g_Entity // глобална променлива, която ще използваме за създаването на нашето мислещо entity 

new const g_Classname[] = "Entity_Classname" // classname за мислещото ни entity 
new const Float:f_ThinkingInterval = 3.0 // интервал, през който нашето entity ще мисли

Същинската част от кода - регистрирането на entity, задаване на classname, интервал на мислене

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

public plugin_init()
{
	register_plugin("Engine Thinking Entity", "1.0", "DaRk_StyLe @ amxx-bg.info/forum")
	
	g_Entity = create_entity("info_target") // създаваме g_Entity под формата на info_target entity 
	
	entity_set_string(g_Entity, EV_SZ_classname, g_Classname) // прилагаме classname, който сме задали горе
	entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // прилагаме времето, което сме избрали в началото
	
	register_think(g_Classname, "EntityThink") // регистрираме think със classname-а на нашето entity, и функция, в която ще се изпълнява кода
}

Функцията на мислещото entity

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

public EntityThink(Ent)
{
	if (Ent == g_Entity) // искаме да сме сигурни, че Ent е нашето info_target entity (g_Entity)
	{
		log_amx("%s is thinking!", g_Classname) // пробваме дали кода работи, като логваме в конзолата
		entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // след колко време операцията да се повтори
	}
}

Резултат от кода

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

L 08/26/2017 - 12:00:00: [test.amxx] Entity_Classname is thinking!
L 08/26/2017 - 12:00:03: [test.amxx] Entity_Classname is thinking!
L 08/26/2017 - 12:00:06: [test.amxx] Entity_Classname is thinking!
.....

Краен вариант на кода с добавени коментари

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

#include <amxmodx>
#include <engine>

new g_Entity // глобална променлива, която ще използваме за създаването на нашето мислещо entity 

new const g_Classname[] = "Entity_Classname" // classname за мислещото ни entity 
new const Float:f_ThinkingInterval = 3.0 // интервал, през който нашето entity ще мисли 

public plugin_init()
{
	register_plugin("Engine Thinking Entity", "1.0", "DaRk_StyLe @ amxx-bg.info/forum")
	
	g_Entity = create_entity("info_target") // създаваме g_Entity под формата на info_target entity 
	
	entity_set_string(g_Entity, EV_SZ_classname, g_Classname) // прилагаме classname, който сме задали горе
	entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // прилагаме времето, което сме избрали в началото
	
	register_think(g_Classname, "EntityThink") // регистрираме think със classname-а на нашето entity, и функция, в която ще се изпълнява кода
}

public EntityThink(Ent)
{
	if (Ent == g_Entity) // искаме да сме сигурни, че Ent е нашето info_target entity (g_Entity)
	{
		log_amx("%s is thinking!", g_Classname) // пробваме дали кода работи, като логваме в конзолата
		entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // след колко време операцията да се повтори
	}
}

Това е всичко на този етап. Както винаги - ако имате въпроси, не се двоумете да ги зададете!

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

Създаване на мислещо entity с Engine

Мнение от TheRedShoko » 26 Авг 2017, 20:07

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

#include <amxmodx>
#include <engine>

new g_Entity // глобална променлива, която ще използваме за създаването на нашето мислещо entity 

new const g_Classname[] = "Entity_Classname" // classname за мислещото ни entity 
new const Float:f_ThinkingInterval = 3.0 // интервал, през който нашето entity ще мисли 

public plugin_init()
{
	register_plugin("Engine Thinking Entity", "1.0", "DaRk_StyLe @ amxx-bg.info/forum")
	
	g_Entity = create_entity("info_target") // създаваме g_Entity под формата на info_target entity 
	
	if (is_valid_ent(g_Entity)) // Just in case
	{
		entity_set_string(g_Entity, EV_SZ_classname, g_Classname) // прилагаме classname, който сме задали горе
		entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // прилагаме времето, което сме избрали в началото
	
		register_think(g_Classname, "EntityThink") // регистрираме think със classname-а на нашето entity, и функция, в която ще се изпълнява кода
	}
}

public EntityThink(Ent)
{
	if (Ent == g_Entity) // искаме да сме сигурни, че Ent е нашето info_target entity (g_Entity)
	{
		log_amx("%s is thinking!", g_Classname) // пробваме дали кода работи, като логваме в конзолата
		entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // след колко време операцията да се повтори
	}
}

Аватар
DaRk_StyLe
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 264
Регистриран на: 26 Окт 2016, 12:40
Се отблагодари: 11 пъти
Получена благодарност: 33 пъти

Създаване на мислещо entity с Engine

Мнение от DaRk_StyLe » 26 Авг 2017, 21:32

Тази проверка е излишна, тъй като info_target е валиден classname, както и един от най-често използваните.

Аватар
SmirnoffBG
Извън линия
Потребител
Потребител
Мнения: 267
Регистриран на: 27 Ное 2016, 19:43
Местоположение: nz
Се отблагодари: 77 пъти
Получена благодарност: 38 пъти
Обратна връзка:

Създаване на мислещо entity с Engine

Мнение от SmirnoffBG » 27 Авг 2017, 05:22

Аз лично не виждам разлика с fakemeta, освен че тя е по бърза в изпълнението си.
ПП: даже мода който ползвам(SH) при новия начин на писане Engine е тотално отписан.

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

	g_Entity = create_entity("info_target") // създаваме g_Entity под формата на info_target entity 
	new NewEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
	
	entity_set_string(g_Entity, EV_SZ_classname, g_Classname) // прилагаме classname, който сме задали горе
	set_pev(NewEnt, pev_classname, "demoman_tripmine")

	entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // прилагаме времето, което сме избрали в началото
	set_pev(NewEnt, pev_nextthink, get_gametime() + 3.0)
	
	register_think(g_Classname, "EntityThink") // регистрираме think със classname-а на нашето entity, и функция, в която ще се изпълнява кода
	register_forward(FM_Think, "mine_think")

	public EntityThink(Ent)
	{
		if (Ent == g_Entity) // искаме да сме сигурни, че Ent е нашето info_target entity (g_Entity)
		{
			log_amx("%s is thinking!", g_Classname) // пробваме дали кода работи, като логваме в конзолата
			entity_set_float(g_Entity, EV_FL_nextthink, get_gametime() + f_ThinkingInterval) // след колко време операцията да се повтори
		}
	}
	public mine_think(ent)
	{
		if ( !pev_valid(ent) ) return FMRES_IGNORED

		static classname[32]
		classname[0] = '^0'
		pev(ent, pev_classname, classname, charsmax(classname))	

		if ( !equal(classname, "demoman_tripmine") ) return FMRES_IGNORED // Сканира името на класът защото мините са повече от една
		set_pev(ent, pev_nextthink, gametime + MINE_THINK)
	}
El-Super Respawn = 87.121.54.85:27016
BG Trewa Respawn = 91.92.137.205:27015

Аватар
DaRk_StyLe
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 264
Регистриран на: 26 Окт 2016, 12:40
Се отблагодари: 11 пъти
Получена благодарност: 33 пъти

Създаване на мислещо entity с Engine

Мнение от DaRk_StyLe » 27 Авг 2017, 06:18

Не виждаш разлика, но има такава. Филтрирането на различните entity-та става директно в кода на Еngine, затова той е по-ефикасният вариант. Поради тази причина Engine е по-бърз в изпълнението си, в случая. Дал си пример, който повечето няма да разберат, защото има неща, които не са дефинирани. Целта на темата не е да объркваме хората, а да им помогнем да разберат нещата.

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

Създаване на мислещо entity с Engine

Мнение от TheRedShoko » 27 Авг 2017, 09:08

Сложих проверката, защото ми се е случвало да ми хвърля грешка за invalid entity дори и при info_target ;/

Аватар
DaRk_StyLe
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 264
Регистриран на: 26 Окт 2016, 12:40
Се отблагодари: 11 пъти
Получена благодарност: 33 пъти

Създаване на мислещо entity с Engine

Мнение от DaRk_StyLe » 27 Авг 2017, 09:26

По-скоро е имало нещо нередно по-надолу в кода. Никога не съм виждал, а и не съм използвал подобна проверка при създаване на мислещо entity с info_target. Не съм имал проблеми. Възможно е да хвърли грешка, ако не направим проверка дали е нашето entity в register_think(), FM_Think и т.н, защото там се проверява лист с entity-та, което може да доведе до грешка, ако върне грешно entity.

Аватар
SmirnoffBG
Извън линия
Потребител
Потребител
Мнения: 267
Регистриран на: 27 Ное 2016, 19:43
Местоположение: nz
Се отблагодари: 77 пъти
Получена благодарност: 38 пъти
Обратна връзка:

Създаване на мислещо entity с Engine

Мнение от SmirnoffBG » 28 Авг 2017, 14:15

Незнам дали си бродил из "alliedmods" освен за плъгини,но виж следния цитат от тяхното wiki!
Unlike Engine, FakeMeta uses no CPU if it is not told to do anything (other than to exist). For this reason, it is recommended to use FakeMeta over Engine. There is nothing in Engine that is not in FakeMeta -- while some functionality might be less abstracted, it is still achievable, and usually with more flexibility.
И аз не желая да объркам никой, даже препоръчвам на хората който сега почват да се учат да ползват по-разбираемият Engine, но в крайна сметка Fakemeta е за предпочитане(поне от мен)
El-Super Respawn = 87.121.54.85:27016
BG Trewa Respawn = 91.92.137.205:27015

Аватар
DaRk_StyLe
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 264
Регистриран на: 26 Окт 2016, 12:40
Се отблагодари: 11 пъти
Получена благодарност: 33 пъти

Създаване на мислещо entity с Engine

Мнение от DaRk_StyLe » 28 Авг 2017, 19:31

Този цитат го знам много добре, точно той хвърля мнозина в голяма заблуда.

https://forums.alliedmods.net/showthread.php?t=88622
https://forums.alliedmods.net/showthrea ... post792014
https://forums.alliedmods.net/showpost. ... stcount=19
https://forums.alliedmods.net/showpost. ... stcount=26

Fakemeta извиква повече нативи, което генерира код всеки път, докато Engine си върши работата директно. Няма нещо като "най-добър модул", използва се модулът, който предоставя желаното от теб нещо по най-добрия начин.

Аватар
WaLkZ
Извън линия
Администратор
Администратор
Мнения: 799
Регистриран на: 05 Окт 2016, 21:13
Местоположение: Варна
Се отблагодари: 75 пъти
Получена благодарност: 227 пъти
Обратна връзка:

Създаване на мислещо entity с Engine

Мнение от WaLkZ » 28 Авг 2017, 20:42

По изпълнение на кода с нативите от ReAPI най-бързо ще работи. За съжаление ReAPI не е пълен заместител на нативите от fakemeta или engine. Но пък мисля, че е пълен заместител на cstrike. Ще бъде интересно едно замерване да се направи, както в тази тема https://forums.alliedmods.net/showthread.php?p=792014

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

Обратно към “Полезни кодове/уроци”

Кой е на линия

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