Entity в ReGameDLL: используем на полную

Сообщения
51
Реакции
147
Помог
1 раз(а)
ReGameDLL предоставляет довольно широкий инструментарий для создания и модификации карт, однако не всем и всегда известно об этом функционале. Предлагаю делиться здесь полезной информацией и наработками.

Начнём с тех entity, которые могут быть использованы без необходимости в установке редактора карт или каких-либо обширных познаний. Достаточно установить значение CVarsv_use_entity_file 2 в server.cfg и использовать .ent файлы из папки cstrike/maps для внесения изменений.
  • trigger_auto & trigger_once
trigger_auto существует и в оригинальном gamedll, где эта entity предназначена для одноразовой (единожды за игру) активации какого-либо объекта на старте карты, что делало entity практически абсолютно бесполезной для использования в CS. Исправления в ReGameDLL подарили этой сущности вторую жизнь, и теперь trigger_auto может автоматически активировать какой-либо объект в начале каждого раунда. А trigger_once после исправлений тоже получил возможность срабатывать раз за раунд, а не за игру.
Небольшой пример: добавив в .ent файл карты строки ниже, будем видеть некий текст через 10 секунд после старта раунда.
Код:
{
"classname" "trigger_auto"
"triggerstate" "1"
"delay" "10"
"target" "show_text"
}
{
"classname" "game_text"
"targetname" "show_text"
"message" "PLACEHOLDER TEXT"
"spawnflags" "1"
"channel" "1"
"fxtime" "0.25"
"holdtime" "1.2"
"fadeout" "0.5"
"fadein" "1.5"
"color2" "240 110 0"
"color" "100 100 100"
"effect" "0"
"y" "-1"
"x" "-1"
}
  • game_team_master, game_team_set, game_player_team
В ReGameDLL эти забытые и ситуативные entity работают, как им и положено, в отличие от оригинального gamedll.

game_team_master позволяет активировать объекты только членам определённой команды. Он может работать в двух "режимах": в первом случае для game_team_master нужно задать имя и индекс команды, которой позволено активировать объект, а самому объекту (кнопке, триггеру, двери и т.п.) задать key "master", значением которого будет выступать имя game_team_master. Во втором "режиме" можно активировать чем-либо game_team_master, который, в свою очередь, активирует другую цель, если индекс команды активирующего игрока совпадает со значением ключа "teamindex" этой entity. game_team_master можно использовать для того, чтобы нажатие кнопок, открытие дверей, активация триггеров, выдача оружия и т.п. работали для конкретной команды.

Пример:
добавляем это в .ent файл и получаем "HNS"/"Маньяка" для "бедных" без использования плагинов. Выдаём разную экипировку двум командам и затемняем экран только террористам.
Код:
{
"target" "fade_T"
"targetname" "game_playerspawn"
"delay" "0"
"triggerstate" "2"
"teamindex" "1"
"classname" "game_team_master"
}
{
"targetname" "fade_T"
"duration" "1"
"holdtime" "15"
"renderamt" "255"
"rendercolor" "0 0 0"
"spawnflags" "5"
"classname" "env_fade"
}
{
"master" "master_T"
"weapon_knife" "1"
"classname" "game_player_equip"
}
{
"targetname" "master_T"
"delay" "0"
"triggerstate" "0"
"teamindex" "1"
"classname" "game_team_master"
}
{
"targetname" "master_CT"
"delay" "0"
"triggerstate" "0"
"teamindex" "2"
"classname" "game_team_master"
}
{
"weapon_smokegrenade" "1"
"weapon_flashbang" "2"
"master" "master_CT"
"classname" "game_player_equip"
}
game_team_set при его активации назначает указанной в поле "target" энтити game_team_master индекс команды активатора. Придумать самостоятельный рабочий пример для любой карты без использования кнопок и дверей, поэтому он будет несколько сумбурным.
Оружие в начале раунда получает та команда, игрок которой умер последним:
Код:
{
"master" "equipment_team_master"
"weapon_knife" "1"
"weapon_usp" "1"
"classname" "game_player_equip"
}
{
"targetname" "equipment_team_master"
"delay" "0"
"triggerstate" "0"
"teamindex" "-1"
"classname" "game_team_master"
}
{
"target" "equipment_team_master"
"targetname" "game_playerdie"
"delay" "0"
"classname" "game_team_set"
}
game_player_team также работает в паре с game_team_master и позволяет перемещать игроков без убийства за указанную в конкретном game_team_master команду. Флаги 2 и 4 позволяют перемещать игрока за команду, убив его или разорвав на куски.
Сумбурный пример — переводим всех заспавнившихся за CT:
Код:
{
"targetname" "moveto_master"
"teamindex" "2"
"classname" "game_team_master"
}
{
"targetname" "game_playerspawn"
"target" "moveto_master"
"classname" "game_player_team"
}
  • item_airbox
item_airbox выполняет ту же функцию, что и armoury_entity, однако оружие не лежит на земле, а может парить в воздухе, вращаться и быть привязано к спрайту.
Добавить на карту можно так, заменив значения поля "origin" на нужные координаты:
Код:
{
"origin" "0 0 0"
"sprite_model" "sprites/blueflare2.spr"
"renderfx" "0"
"rendermode" "0"
"renderamt" "255"
"rendercolor" "0 0 0"
"item" "0"
"count" "1"
"angles" "0 0 270"
"avelocity" "0 -150 0"
"flyup" "3"
"delay" "0"
"sprite_renderfx" "0"
"sprite_rendermode" "5"
"sprite_renderamt" "255"
"sprite_rendercolor" "0 0 0"
"sprite_scale" "1.0"
"sprite_framerate" "10"
"classname" "item_airbox"
}
Разбор других энтити trigger_setorigin, trigger_random требует отдельного поста. Использование вышеописанных инструментов в связке с плагинами или даже вместо некоторых из них в определённых ситуациях может облегчить работу, однако минусом подобных модификаций карт является отсутствие совместимости с оригинальным gamedll.
 
Сообщения
2,489
Реакции
2,742
Помог
61 раз(а)
не подскажете. Вот я пробовал заменить armoury_entity на item_airbox. В итоге у меня оружие парило не просто в воздухе, а на дикой высоте где его не достать при нормальной гравитации ну никак. Менять параметры пробовал, но так и не угадал с верными значениями. Так вот вопрос: какие значения keyvalue нужно указывать, чтобы они чучуть от земли отрывались.
 
Сообщения
51
Реакции
147
Помог
1 раз(а)
fantom, высокое значение "delay" вкупе с высоким значением "flyup"?
Забыл указать, что оружие летит вверх/вниз со скоростью "flyup" на протяжении указанных в "delay" секунд и потом меняет направление. Больше "delay" - дольше путь - выше оружие
какие значения keyvalue нужно указывать, чтобы они чучуть от земли отрывались.
Можно попробовать что-то вроде:
"flyup" "24"
"delay" "1"
 
Последнее редактирование:
Сообщения
51
Реакции
147
Помог
1 раз(а)
Nordic Warrior,
до того, пока не перепроверил нумерацию target у trigger_random с нуля, думал, что он работает с ошибкой и не стоит пока делиться о нем информацией, к тому же, эта информация совпадает с уже имеющейся на "вики", но всё-таки вроде бы всё в порядке
  • point_clientcommand & point_servercommand

Как можно понять из названия, point_clientcommand позволяет отправить консольную команду клиенту. Entity должна быть активирована игроком, которому и будет отправлена команда.
Для того, чтобы отправить команду, необходимо указать пару "key" "value" для entity в виде "команда" "аргумент". Если у команды аргументов нет, следует указать "value" в виде "".
Всего в одном point_clientcommand можно указать до 16 команд для отправки.
Приведу несколько "неэтичный" пример, "вынуждающий" игрока отправить сообщение от своего лица и показывающий ему информацию о карте.
Код:
{
"targetname" "game_playerspawn"
"showbriefing" ""
"say_team" "Hello, teammates!"
"classname" "point_clientcommand"
}
Руководствуйтесь добросовестностью, применяя point_clientcommand.

point_servercommand аналогичен point_clientcommand, но отправляет команды серверу, на котором значение mp_allow_point_servercommand равно 1, а активатором этой entity может быть кто или что угодно.
В качестве примера отправим сообщения от лица сервера и установим нулевую гравитацию:
Код:
{
"classname" "point_servercommand"
"targetname" "zero_gravity"
"sv_gravity" "0"
"endround" "CT"
"swapteams" ""
"say" "Hello, Player! Welcome to Space!"
}
Если "убить" (удалить) entity, например, при помощи trigger_auto, указав для него keyvalue "killtarget" "имя нашего point_servercommand":
Код:
{
"classname" "trigger_auto"
"killtarget" "zero_gravity"
"delay" "15"
}
то значения изменённых CVar'ов "откатятся" до тех, что были до активации point_servercommand. В нашем случае гравитация станет по умолчанию.
Если необходимо этого избежать, можно установить флаг "spawnflags" "1" для point_servercommand, и после удаления entity гравитация останется "нулевой".
Идеи для использования — создание нового игрового сценария с завершением раунда после нажатия какой-либо кнопки на карте или уничтожения какого-либо объекта; оповещение о нахождении "пасхалки" на карте.
  • trigger_random
trigger_random служит для того, чтобы активировать другие entity в случайном порядке, и, опционально, в случайных промежутках времени.
У trigger_random есть три режима:
  1. "Обычный", когда по активации trigger_random тот активирует одну случайную entity из списка.
  2. "Timed" (при установке третьего бита / флага 8) , когда entity из списка активируются через случайное кол-во секунд между значениями "min_delay" и "max_delay", пока trigger_random не будет остановлен повторной активацией. Флагу "Timed" сопутствуют другие флаги - Start On (флаг 1), активирующий trigger_random на старте карты, и Trigger Once (флаг 2), который меняет обычное поведение Timed-триггера (активирование целей раз за разом до остановки через активацию trigger_random) на описанное выше как "обычный режим" (trigger_random выбирает одну цель после каждой своей активации через случайное время между значениями параметров "min_delay" и "max_delay").
  3. "Unique" (флаг 16), когда trigger_random из числа своих целей формирует список и в случайном порядке активирует каждую прописанную в нём цель по одному разу. Когда все entity из списка будут активированы, trigger_random с unique-флагом будет больше недоступен. Но если включить флаг (4) Reusable, trigger_random после активации всех entity в списке может сформировать новый и продолжать свою работу.
Флаги Unique и Timed могут быть совмещены.
Основные параметры trigger_random — это "targetN" (где N - номер цели, начиная с 0) и "target_count", в котором нужно задать число прописанных целей.
Максимальное значение параметра "target_count" равно 16.
Вот пример использования trigger_random, выдаём игроку один из случайных наборов оружия:
Код:
{
"target0" "assault_class"
"target1" "cqc_class"
"target2" "recon_class"
"target_count" "3"
"targetname" "game_playerspawn"
"classname" "trigger_random"
}
{
"ammo_762nato" "3"
"weapon_ak47" "1"
"weapon_knife" "1"
"targetname" "assault_class"
"spawnflags" "1"
"classname" "game_player_equip"
}
{
"weapon_usp" "1"
"weapon_scout" "1"
"ammo_762nato" "2"
"weapon_knife" "1"
"targetname" "recon_class"
"spawnflags" "1"
"classname" "game_player_equip"
}
{
"item_assaultsuit" "1"
"weapon_flashbang" "2"
"weapon_smokegrenade" "1"
"weapon_hegrenade" "1"
"weapon_xm1014" "1"
"weapon_deagle" "1"
"ammo_762nato" "3"
"weapon_knife" "1"
"targetname" "cqc_class"
"spawnflags" "1"
"classname" "game_player_equip"
}
Более интересные и подробные примеры использования в текстовом формате показать довольно трудно. Буду рад, если кто-то поделится примерами в формате новых карт, исходников или доработок оригинальных карт.
 
Последнее редактирование:
Сообщения
7
Реакции
4
gordon9k, извините, не могли бы вы подсказать? пробовал ваши примеры из статьи и столкнулся со следующей проблемой.
при использовании "player_weaponstrip" оружие не выдается совсем, пробовал и совместно с "multi_manager" и без.
пытаюсь использовать на примере классический аим карты, где в начале каждого раунда "player_weaponstrip" забирает всё оружие, а "game_player_equip" его выдает заново, только вооружение у команд пытаюсь сделать различным с помощью "game_team_master", но вероятно чего-то не понимаю. без "player_weaponstrip" всё работает. если вам несложно, могли бы вы показать рабочий пример моей задумки, что бы мне было от чего отталкиваться. буду очень благодарен.
 
Сообщения
51
Реакции
147
Помог
1 раз(а)
Rayn, если у Вас версия ReGameDLL 5.20.0.516 или новее, попробуйте без player_weaponstrip, а в game_player_equip просто поставьте флаг "Remove Weapons" ("spawnflags" "2")
 
Сообщения
7
Реакции
4
gordon9k, моя версия ReGameDLL подходит, но при добавлении "spawnflags" в свойства "game_player_equip", обоим командам выдается оружие прописанное только для CT. Если использую "spawnflags" для обычного "game_player_equip", без разделения на команды, то работает как и задумано.

Код:
{
"targetname" "master_T"
"delay" "0"
"triggerstate" "0"
"teamindex" "1"
"classname" "game_team_master"
}
{
"targetname" "master_CT"
"delay" "0"
"triggerstate" "0"
"teamindex" "2"
"classname" "game_team_master"
}
{
"master" "master_T"
"weapon_knife" "1"
"spawnflags" "2"
"classname" "game_player_equip"
}
{
"targetname" "master_CT"
"weapon_knife" "1"
"weapon_tmp" "1"
"ammo_9mm" "4"
"weapon_hegrenade" "1"
"spawnflags" "2"
"classname" "game_player_equip"
}
 
Сообщения
7
Реакции
4
gordon9k, нашел свою ошибку. просто невнимательно скопировал пример с вашего поста. нужно было заменить
"targetname" "master_CT" на "master" "master_CT" в "game_player_equip". все работает, спасибо за пример со "spawnflags", теперь можно отказаться от player_weaponstrip.
скажите, получается я могу заменять работу некоторых мини плагинов через entity карты. а что будет стабильней и производительней entity или плагин?
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу