<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>arbtttrn6</title><subtitle>Записываю о всяком полезном и интересном (Иногда)
Skribas mi pri diversa utila kaj interesa (Iafoje)
Pišu o vsakom pomočnom i interesnom (Ponekogda)</subtitle><author><name>arbtttrn6</name></author><id>https://teletype.in/atom/arbtttrn6</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/arbtttrn6?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/arbtttrn6?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-16T02:20:26.253Z</updated><entry><id>arbtttrn6:blender-material_okrugloj-setki</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/blender-material_okrugloj-setki?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Материал округлой сетки в Blender</title><published>2025-10-29T07:49:36.946Z</published><updated>2025-10-29T07:49:36.946Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/42/ec/42ecd125-421c-4f37-8995-f7f8f6599d2f.png"></media:thumbnail><category term="vsakosti" label="Vsakosti"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/84/b7/84b797ad-1f91-4e7d-8ed8-68b222cfaf2c.png&quot;&gt;Делаем материал округлой сетки в Blender'е.</summary><content type="html">
  &lt;p id=&quot;dsWO&quot;&gt;Делаем материал округлой сетки в Blender&amp;#x27;е.&lt;/p&gt;
  &lt;p id=&quot;7i3j&quot;&gt;28/10/2025&lt;/p&gt;
  &lt;p id=&quot;kr1S&quot;&gt;Добавить на геометрию материал, который будет решёткой.&lt;/p&gt;
  &lt;figure id=&quot;0EoV&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/84/b7/84b797ad-1f91-4e7d-8ed8-68b222cfaf2c.png&quot; width=&quot;340&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;swdk&quot;&gt;В редакторе шейдеров используется &lt;em&gt;Principled BSDF&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;zYN4&quot;&gt;За основной цвет отвечает параметр &lt;em&gt;Base Color&lt;/em&gt;. В моём случае это &lt;em&gt;#0E0E0E&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;QdpT&quot;&gt;Параметр &lt;em&gt;Specular&lt;/em&gt; настраивается по желанию. В моём случае он равен &lt;em&gt;0.330&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;BJW3&quot;&gt;Параметр &lt;em&gt;Roughness&lt;/em&gt; также настраивается опционально. В моём случае он равен &lt;em&gt;0.687&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;t75l&quot;&gt;К параметру &lt;em&gt;Alpha&lt;/em&gt; узла &lt;em&gt;Principled BSDF&lt;/em&gt; подключается параметр &lt;em&gt;Color&lt;/em&gt; узла &lt;em&gt;ColorRamp&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;6rv6&quot;&gt;Узел &lt;em&gt;ColorRamp&lt;/em&gt; имеет режим цвета &lt;em&gt;RGB&lt;/em&gt;, а интерполяция между цветовыми остановками как &lt;em&gt;Constant&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;0Gda&quot;&gt;Цветовая остановка &lt;em&gt;0&lt;/em&gt; равна &lt;em&gt;#000000&lt;/em&gt; и находится на позиции &lt;em&gt;0.414&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;U5K2&quot;&gt;Цветовая остановка &lt;em&gt;1&lt;/em&gt; равна &lt;em&gt;#FFFFFF&lt;/em&gt; и находится на позиции &lt;em&gt;0.430&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;hf4F&quot;&gt;К параметру &lt;em&gt;Fac&lt;/em&gt; узла &lt;em&gt;ColorRamp&lt;/em&gt; подключён параметр &lt;em&gt;Distance&lt;/em&gt; узла &lt;em&gt;Voronoi Texture&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;wTyS&quot;&gt;У узла &lt;em&gt;Voronoi Texture&lt;/em&gt; параметры: &lt;em&gt;Number of dimensions to output noise&lt;/em&gt; равен &lt;em&gt;3D&lt;/em&gt;; &lt;em&gt;The voronoi feature that the node will compute&lt;/em&gt; равен &lt;em&gt;F1&lt;/em&gt;; &lt;em&gt;The distance metric used to compute the texture&lt;/em&gt; равен &lt;em&gt;Euclidean&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;4b03&quot;&gt;Параметр &lt;em&gt;Scale&lt;/em&gt; узла &lt;em&gt;Voronoi Texture&lt;/em&gt; равен &lt;em&gt;74.800&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;A9vv&quot;&gt;От узла &lt;em&gt;Voronoi Texture&lt;/em&gt; параметр &lt;em&gt;Distance&lt;/em&gt; также отходит к ещё одному узлу &lt;em&gt;ColorRamp&lt;/em&gt;, у которого параметры также &lt;em&gt;RGB&lt;/em&gt;, &lt;em&gt;Constant&lt;/em&gt;. Цветовая остановка &lt;em&gt;0&lt;/em&gt; равна &lt;em&gt;#000000&lt;/em&gt; и находится на позиции &lt;em&gt;0.253&lt;/em&gt;, а цветовая остановка &lt;em&gt;1&lt;/em&gt; равна &lt;em&gt;#FFFFFF&lt;/em&gt; и находится на позиции &lt;em&gt;0.452&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;idtr&quot;&gt;Параметр этого узла &lt;em&gt;ColorRamp&lt;/em&gt; отходит к параметру &lt;em&gt;Height&lt;/em&gt; узла &lt;em&gt;Bump&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;vz26&quot;&gt;От узла &lt;em&gt;Bump&lt;/em&gt; параметр &lt;em&gt;Normal&lt;/em&gt; отходит к одноимённому параметру в узле &lt;em&gt;Principled BSDF&lt;/em&gt;.&lt;/p&gt;
  &lt;figure id=&quot;TBiF&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f0/8c/f08c7aec-0c5b-4d19-8887-15ae832f1389.png&quot; width=&quot;927&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;slbn&quot;&gt;Чтобы запечь эти текстуры, используется Cycles, где &lt;em&gt;Bake&lt;/em&gt; (запекание) выбирается по параметру &lt;em&gt;Bake Type&lt;/em&gt; (&lt;em&gt;Diffuse&lt;/em&gt; с &lt;em&gt;Influence&lt;/em&gt;: &lt;em&gt;Contributions&lt;/em&gt;: &lt;em&gt;Color&lt;/em&gt;; и &lt;em&gt;Normal&lt;/em&gt;).&lt;/p&gt;
  &lt;p id=&quot;jIFA&quot;&gt;При запекании необходимо держать эти текстуры активными.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:mass_effect_pcc_fajly_imenovanije</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/mass_effect_pcc_fajly_imenovanije?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>UnrealEngine 3: Mass Effect 2-3: Именование PCC файлов в игре</title><published>2025-10-22T09:08:59.994Z</published><updated>2025-10-22T09:08:59.994Z</updated><category term="mass-effect" label="MassEffect"></category><summary type="html">Инфа о именовании PCC файлов, используемых в ME2-3.</summary><content type="html">
  &lt;p id=&quot;RQZg&quot;&gt;Инфа о именовании PCC файлов, используемых в ME2-3.&lt;/p&gt;
  &lt;p id=&quot;00f2&quot;&gt;PCC имеют разные приставки/префиксы, определяющие то, что в них хранится:&lt;/p&gt;
  &lt;p id=&quot;uwLv&quot;&gt;&lt;strong&gt;BioA&lt;/strong&gt; — содержит содержимое уровней, текстуры, геометрию (меши). В редких случаях там могут быть последовательности анимаций и диалоги.&lt;/p&gt;
  &lt;p id=&quot;OPA2&quot;&gt;&lt;strong&gt;BioD&lt;/strong&gt; — содержит связанное с сюжетом содержимое: диалоги, постановки сцен, поведения камер, анимации, FaceFX, эффекты (VFX), триггеры/спуски достижений. Ещё могут быть: геометрия, материалы, текстуры и эффекты.&lt;/p&gt;
  &lt;p id=&quot;1XNp&quot;&gt;&lt;strong&gt;BioG&lt;/strong&gt; — содержит мужские и женские модели и материалы для лиц, волос, голов, одежды и брони; в том числе и для главгероя/игрока игры.&lt;/p&gt;
  &lt;p id=&quot;qpPa&quot;&gt;&lt;strong&gt;BioH&lt;/strong&gt; — содержит специфичное для команды игрока — модели, материалы, эффекты, искусственный интеллект и прочее.&lt;/p&gt;
  &lt;p id=&quot;MMTH&quot;&gt;&lt;strong&gt;BioP&lt;/strong&gt; — содержит основные файлы, управляющие базовым в игре: загрузки уровней, положение неписей на уровне, перемещение игрока по уровню и подобное.&lt;/p&gt;
  &lt;p id=&quot;LFYv&quot;&gt;Файлы BioA, BioD и BioP организованы по миссиям/уровням:&lt;/p&gt;
  &lt;p id=&quot;lkfY&quot;&gt;&lt;strong&gt;Cat001&lt;/strong&gt; - DLC «Из пепла»&lt;br /&gt;&lt;strong&gt;Cat002&lt;/strong&gt; - Приоритет Тессия&lt;br /&gt;&lt;strong&gt;Cat003&lt;/strong&gt; - Приоритет Цитадель 2 (Атака «Цербера»)&lt;br /&gt;&lt;strong&gt;Cat004&lt;/strong&gt; - Приоритет Штаб квартира «Цербера» (Станция «Кронос»)&lt;br /&gt;&lt;strong&gt;CerJcb&lt;/strong&gt; - Аррае: Бывшие учёные «Цербера»&lt;br /&gt;&lt;strong&gt;CerMir&lt;/strong&gt; - Приоритет Горизонт&lt;br /&gt;&lt;strong&gt;Cit001/2/3/4&lt;/strong&gt; - DLC «Цитадель»: Миссии&lt;br /&gt;&lt;strong&gt;CitApt&lt;/strong&gt; - DLC «Цитадель»: Апартаменты&lt;br /&gt;&lt;strong&gt;CitCas&lt;/strong&gt; - DLC «Цитадель»: Казино «Серебрянный берег»&lt;br /&gt;&lt;strong&gt;CitSim&lt;/strong&gt; - DLC «Цитадель»: Арена «Армакс Арсенал»&lt;br /&gt;&lt;strong&gt;CitHub&lt;/strong&gt; - Цитадель&lt;br /&gt;&lt;strong&gt;CitSam&lt;/strong&gt; - Месана: Сигнал бедствия (Монастырь ардат-якши)&lt;br /&gt;&lt;strong&gt;End001&lt;/strong&gt; - Приоритет: Земля (Перед попаданием на Цитадель)&lt;br /&gt;&lt;strong&gt;End002&lt;/strong&gt; - Приоритет: Земля (В Цитадели)&lt;br /&gt;&lt;strong&gt;Gth001&lt;/strong&gt; - Приоритет: Дредноут гетов&lt;br /&gt;&lt;strong&gt;Gth002&lt;/strong&gt; - Приоритет: Раннох&lt;br /&gt;&lt;strong&gt;GthLeg&lt;/strong&gt; - Раннох: Истребители гетов&lt;br /&gt;&lt;strong&gt;GthN7A&lt;/strong&gt; - Раннох: Адмирал Корис&lt;br /&gt;&lt;strong&gt;Kro001&lt;/strong&gt; - Приоритет: Сур&amp;#x27;Кеш&lt;br /&gt;&lt;strong&gt;Kro002&lt;/strong&gt; - Приоритет: Тучанка&lt;br /&gt;&lt;strong&gt;KroGar&lt;/strong&gt; - Приоритет: Палавен&lt;br /&gt;&lt;strong&gt;KroGru&lt;/strong&gt; - Аттический Траверс: Рахни&lt;br /&gt;&lt;strong&gt;KroN7a&lt;/strong&gt; - Тучанка: Турианский взвод&lt;br /&gt;&lt;strong&gt;KroN7b&lt;/strong&gt; - Тучанка: Бомба&lt;br /&gt;&lt;strong&gt;Lev001/2/3/4&lt;/strong&gt; - DLC «Левиафан»&lt;br /&gt;&lt;strong&gt;MPCer&lt;/strong&gt; - N7: Лаборатория «Цербера»&lt;br /&gt;&lt;strong&gt;MPDish&lt;/strong&gt; - N7: Центр связи&lt;br /&gt;&lt;strong&gt;MPNov&lt;/strong&gt; - N7: База истребителей «Цербера»&lt;br /&gt;&lt;strong&gt;MPRctr&lt;/strong&gt; - N7: Топливные реакторы&lt;br /&gt;&lt;strong&gt;MPSlum&lt;/strong&gt; - N7: Похищения «Цербером»&lt;br /&gt;&lt;strong&gt;MPTwr&lt;/strong&gt; - N7: Нападение «Цербера»&lt;br /&gt;&lt;strong&gt;Nor&lt;/strong&gt; - «Нормандия»&lt;br /&gt;&lt;strong&gt;Omg000/1/2A/3/4&lt;/strong&gt; - DLC «Омега»: Миссии&lt;br /&gt;&lt;strong&gt;OmgHub&lt;/strong&gt; - DLC «Омега»: Хаб станции «Омеги»&lt;br /&gt;&lt;strong&gt;OmgJck&lt;/strong&gt; - Гриссомская академия: Эвакуация&lt;br /&gt;&lt;strong&gt;ProEar&lt;/strong&gt; - Пролог: Земля&lt;br /&gt;&lt;strong&gt;ProMar&lt;/strong&gt; - Приоритет: Марс&lt;/p&gt;
  &lt;p id=&quot;tkz4&quot;&gt;Источники:&lt;/p&gt;
  &lt;ul id=&quot;x5D3&quot;&gt;
    &lt;li id=&quot;ZFhn&quot;&gt;&lt;a href=&quot;https://me3explorer.fandom.com/wiki/PCC_File_Format#Nomenclature_+_Contents&quot; target=&quot;_blank&quot;&gt;https://me3explorer.fandom.com/wiki/PCC_File_Format#Nomenclature_+_Contents&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;knqI&quot;&gt;&lt;a href=&quot;https://web.archive.org/web/20250809103057/https://me3explorer.fandom.com/wiki/PCC_File_Format#Nomenclature_+_Contents&quot; target=&quot;_blank&quot;&gt;https://web.archive.org/web/20250809103057/https://me3explorer.fandom.com/wiki/PCC_File_Format#Nomenclature_+_Contents&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>arbtttrn6:goldsrc-entity-pozicija-i-povorot-kak-v-redaktore</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/goldsrc-entity-pozicija-i-povorot-kak-v-redaktore?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Goldsrc: Положение сущностей в игровом мире, соответствующее ихнему в редакторе карт</title><published>2025-08-24T18:44:31.136Z</published><updated>2025-08-24T18:44:31.136Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/95/ef/95efd553-d751-4d1a-b4cf-7bc177112085.png"></media:thumbnail><category term="half-life" label="HalfLife"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/59/10/5910baf3-ba73-4408-aa99-834355d81cb7.png&quot;&gt;Суть: По-умолчанию если ставить сущность под углом в редакторе карт, то в самой игре она падает по горизонтали. Решение без готового кода.</summary><content type="html">
  &lt;p id=&quot;Abug&quot;&gt;Суть: По-умолчанию если ставить сущность под углом в редакторе карт, то в самой игре она падает по горизонтали. Решение без готового кода.&lt;/p&gt;
  &lt;figure id=&quot;9Z39&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/59/10/5910baf3-ba73-4408-aa99-834355d81cb7.png&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vQbw&quot;&gt;Стоит обратить взор на функцию &amp;quot;void CBasePlayerItem::FallThink()&amp;quot;, в которой имеются такие строки:&lt;/p&gt;
  &lt;pre id=&quot;tqsk&quot; data-lang=&quot;cpp&quot;&gt;pev-&amp;gt;angles.x = 0;
pev-&amp;gt;angles.z = 0;&lt;/pre&gt;
  &lt;p id=&quot;lfSO&quot;&gt;Эти строки отвечают за горизонтальное положение сущности после её появления в игровом мире, чтобы она там находилась естественно.&lt;/p&gt;
  &lt;p id=&quot;wKMK&quot;&gt;Если их закомментировать/убрать, то модель сохранит свои углы, но при этом упадёт до своего &amp;quot;origin&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;EIKO&quot;&gt;Есть простое решение в виде создания отдельного параметра, который будет отвечать за отключение/включение падения у сущности. Пусть это будет условное &amp;quot;nophys&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;JrwW&quot;&gt;По-умолчанию этот параметр равен &amp;quot;false&amp;quot;. В &amp;quot;Spawn&amp;quot; сущности прописываем проверку на &amp;quot;nophys&amp;quot;, если он равен &amp;quot;true&amp;quot;, то — пишем код, подобный на &amp;quot;FallInit()&amp;quot; (кой в том же &amp;quot;weapons.cpp&amp;quot;), но устанавливаем &amp;quot;movetype = NONE&amp;quot;, иначе обычный &amp;quot;FallInit()&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;I8Bj&quot;&gt;Сущности переписываем собственный &amp;quot;KeyValue&amp;quot; и ловим параметр &amp;quot;nophys&amp;quot; из карты. Как это делается, можно посмотреть в коде различных сущностей.&lt;/p&gt;
  &lt;p id=&quot;O0Es&quot;&gt;В редакторе карт нужной сущности прописываем параметр &amp;quot;nophys&amp;quot; со значением &amp;quot;1&amp;quot;. Собираем карту и видим, что сущность сохранила своё положение, установленное в редакторе карт.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;fnTs&quot;&gt;Прошу оценить заметку; если есть какие-то вопросы и/или пожелания, прошу писать на почтовый ящик &amp;quot;arturaiwasan[@]gmail.com&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;YQsg&quot;&gt;24.08.2025.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:goldsrc_half-life_sdk_thirdperson_vid_ot_tretjego</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/goldsrc_half-life_sdk_thirdperson_vid_ot_tretjego?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Вид от третьего лица со смещением в Goldsrc</title><published>2025-06-05T14:14:43.667Z</published><updated>2025-06-05T14:14:43.667Z</updated><category term="half-life" label="HalfLife"></category><summary type="html">Вид от третьего лица со смещением в Goldsrc. Half-Life SDK.</summary><content type="html">
  &lt;p id=&quot;pqaE&quot;&gt;Суть: Вид от третьего лица со смещением в Goldsrc. Half-Life SDK.&lt;/p&gt;
  &lt;p id=&quot;JzYM&quot;&gt;Задумка и код: &lt;a href=&quot;https://github.com/ScriptedSnark&quot; target=&quot;_blank&quot;&gt;ScriptedSnark&lt;/a&gt;. А также немного мелочи от меня.&lt;/p&gt;
  &lt;p id=&quot;5xkZ&quot;&gt;Я добавил включение смещения камеры (и &amp;quot;прицела&amp;quot;) только при виде от третьего лица. Т.е. если переменная &amp;quot;thirdperson&amp;quot; равна 0, то будет обычный вид от первого лица, но если переменная равна 1, то получим и смещение камеры и правильно смещённый прицел.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;Iu6q&quot;&gt;1) В &amp;quot;./cl_dll/in_defs.h&amp;quot; добавить: &lt;/p&gt;
  &lt;pre id=&quot;ySYD&quot; data-lang=&quot;cpp&quot;&gt;#define CAM_SHIFT_RIGHT 12.0f&lt;/pre&gt;
  &lt;p id=&quot;eKUy&quot;&gt;Например, если мы хотим сделать смещение камеры на 12 единиц.&lt;/p&gt;
  &lt;p id=&quot;m1b2&quot;&gt;2) В &amp;quot;./dlls/player.cpp&amp;quot; в конце секции включений (includes) добавить:&lt;/p&gt;
  &lt;pre id=&quot;U15n&quot; data-lang=&quot;cpp&quot;&gt;#include &amp;quot;../cl_dll/in_defs.h&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;9plb&quot;&gt;3) В &amp;quot;./dlls/player.cpp&amp;quot; &amp;quot;CBasePlayer::GetGunPosition&amp;quot; привести к следующему виду:&lt;/p&gt;
  &lt;pre id=&quot;lE1l&quot; data-lang=&quot;cpp&quot;&gt;Vector CBasePlayer::GetGunPosition()
{
	Vector origin;
	if (cam_thirdperson == true)
	{
		origin = pev-&amp;gt;origin + pev-&amp;gt;view_ofs + gpGlobals-&amp;gt;v_right * CAM_SHIFT_RIGHT;
	}
	else
	{
		origin = pev-&amp;gt;origin + pev-&amp;gt;view_ofs;
	}

	return origin;
}&lt;/pre&gt;
  &lt;p id=&quot;2A9M&quot;&gt;4) В &amp;quot;./dlls/player.h&amp;quot; классу &amp;quot;CBasePlayer&amp;quot; дать переменную:&lt;/p&gt;
  &lt;pre id=&quot;HeS6&quot; data-lang=&quot;cpp&quot;&gt;bool cam_thirdperson;&lt;/pre&gt;
  &lt;p id=&quot;esBl&quot;&gt;5) В &amp;quot;./dlls/client.cpp&amp;quot; в &amp;quot;CliendCommand&amp;quot; добавить:&lt;/p&gt;
  &lt;pre id=&quot;1GHe&quot; data-lang=&quot;cpp&quot;&gt;	else if (FStrEq(pcmd, &amp;quot;thirdperson&amp;quot;))
	{
		if (CMD_ARGC() &amp;lt; 2)
		{
			player-&amp;gt;cam_thirdperson = false;
			return;

		}
		player-&amp;gt;cam_thirdperson = atoi(CMD_ARGV(1)) ? true : false;
	}&lt;/pre&gt;
  &lt;p id=&quot;yDHt&quot;&gt;6) В &amp;quot;./cl_dll/view.cpp&amp;quot; найти &amp;quot;V_CalcNormalRefdef&amp;quot; и в нём найти условие с таким следующим комментарием:&lt;/p&gt;
  &lt;pre id=&quot;l0Pq&quot; data-lang=&quot;cpp&quot;&gt;    // Treating cam_ofs[2] as the distance
    if (0 != CL_IsThirdPerson())&lt;/pre&gt;
  &lt;p id=&quot;2QWH&quot;&gt;Приводим к такому виду:&lt;/p&gt;
  &lt;pre id=&quot;zIkq&quot; data-lang=&quot;cpp&quot;&gt;    // Treating cam_ofs[2] as the distance
    if (0 != CL_IsThirdPerson())
    {
        Vector ofs;

        ofs[0] = ofs[1] = ofs[2] = 0.0;

        CL_CameraOffset((float*)&amp;amp;ofs);

        VectorCopy(ofs, camAngles);
        camAngles[ROLL] = 0;

        AngleVectors(camAngles, camForward, camRight, camUp);

        for (i = 0; i &amp;lt; 3; i++)
        {
            pparams-&amp;gt;vieworg[i] += -ofs[2] * camForward[i];
            pparams-&amp;gt;vieworg[i] += CAM_SHIFT_RIGHT * camRight[i]; // Добавляем это
        }
    }&lt;/pre&gt;
  &lt;p id=&quot;9tJn&quot;&gt;7) В &amp;quot;./cl_dll/ev_common.cpp&amp;quot; в конце секции с включений добавить:&lt;/p&gt;
  &lt;pre id=&quot;o0Ms&quot; data-lang=&quot;cpp&quot;&gt;#include &amp;quot;in_defs.h&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;UH7q&quot;&gt;8) Там же перед &amp;quot;void EV_GetGunPosition&amp;quot; добавить:&lt;/p&gt;
  &lt;pre id=&quot;LWjn&quot; data-lang=&quot;cpp&quot;&gt;extern Vector v_angles;
extern bool cam_thirdperson;&lt;/pre&gt;
  &lt;p id=&quot;LxrO&quot;&gt;9) В &amp;quot;EV_GetGunPosition&amp;quot; добавить:&lt;/p&gt;
  &lt;pre id=&quot;rlXr&quot; data-lang=&quot;cpp&quot;&gt;	if (0 != cam_thirdperson)
	{
		Vector forward, right, up;
		AngleVectors(v_angles, forward, right, up);

		VectorAdd(origin, (view_ofs + right * CAM_SHIFT_RIGHT), pos);
	}
	else
	{
		VectorAdd(origin, view_ofs, pos);
	}&lt;/pre&gt;
  &lt;p id=&quot;Mk28&quot;&gt;Здесь добавлена проверка на вид от третьего лица.&lt;/p&gt;
  &lt;p id=&quot;ZiIC&quot;&gt;В итоге функция выглядит так:&lt;/p&gt;
  &lt;pre id=&quot;ACXg&quot; data-lang=&quot;cpp&quot;&gt;void EV_GetGunPosition(event_args_t* args, float* pos, float* origin)
{
	int idx;

	idx = args-&amp;gt;entindex;

	Vector view_ofs = VEC_VIEW;

	if (EV_IsPlayer(idx))
	{
		// in spec mode use entity viewheigh, not own
		if (EV_IsLocal(idx) &amp;amp;&amp;amp; !IS_FIRSTPERSON_SPEC)
		{
			// Grab predicted result for local player
			gEngfuncs.pEventAPI-&amp;gt;EV_LocalPlayerViewheight(view_ofs);
		}
		else if (args-&amp;gt;ducking == 1)
		{
			view_ofs = VEC_DUCK_VIEW;
		}
	}

	if (0 != cam_thirdperson)
	{
		Vector forward, right, up;
		AngleVectors(v_angles, forward, right, up);

		VectorAdd(origin, (view_ofs + right * CAM_SHIFT_RIGHT), pos);
	}
	else
	{
		VectorAdd(origin, view_ofs, pos);
	}
}&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;QmZO&quot;&gt;Всё. Можно собирать код и смотреть результат.&lt;/p&gt;
  &lt;p id=&quot;xLiT&quot;&gt;Я в своей модификации (Half Effect) временно добавил такие строки в &amp;quot;userconfig.cfg&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;qIm4&quot;&gt;alias tps tps1 
alias &amp;quot;tps1&amp;quot; &amp;quot;thirdperson 1; cam_idealdist 25; cam_idealyaw 0; alias tps tps2&amp;quot;
alias &amp;quot;tps2&amp;quot; &amp;quot;firstperson; alias tps tps1&amp;quot;
bind &amp;quot;tab&amp;quot; &amp;quot;tps&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;uyfH&quot;&gt;По ним по клавише &amp;quot;TAB&amp;quot; происходит переход в вид от третьего лица с расстоянием в 25 и выравниванием угла камеры. При повторном нажатии клавиши &amp;quot;TAB&amp;quot; происходит возврат в вид от первого лица.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:perenesti-model-iz-mass-effect-v-goldsrc-half-life</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/perenesti-model-iz-mass-effect-v-goldsrc-half-life?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Конвертация модели из Mass Effect (Unreal Engine 3) в Half-Life (Goldsrc)</title><published>2025-04-28T21:08:37.232Z</published><updated>2025-04-28T21:08:37.232Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/63/54/63541d9e-7f10-4232-b10b-88eda82049e3.png"></media:thumbnail><category term="half-life" label="HalfLife"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/eb/b1/ebb1c032-6aa4-447a-b6dc-66a28703108d.png&quot;&gt;Суть: Достать модель из Mass Effect и преобразовать её для использования в Goldsrc для Half-Life.</summary><content type="html">
  &lt;p id=&quot;93ds&quot;&gt;Суть: Достать модель из Mass Effect и преобразовать её для использования в Goldsrc для Half-Life.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;sWmn&quot;&gt;Для работы используются следующие инструменты:&lt;/p&gt;
  &lt;ul id=&quot;JjkI&quot;&gt;
    &lt;li id=&quot;bPpt&quot;&gt;&lt;a href=&quot;https://github.com/gildor2/UEViewer/&quot; target=&quot;_blank&quot;&gt;Umodel Viewer&lt;/a&gt; от &lt;a href=&quot;http://www.gildor.org&quot; target=&quot;_blank&quot;&gt;Gildor&lt;/a&gt; - для просмотра и извлечения моделей из игры;&lt;/li&gt;
    &lt;li id=&quot;DM6o&quot;&gt;&lt;a href=&quot;http://www.gimp.org/&quot; target=&quot;_blank&quot;&gt;GIMP&lt;/a&gt; - для правки текстур;&lt;/li&gt;
    &lt;li id=&quot;Z17N&quot;&gt;&lt;a href=&quot;http://www.blender.org/&quot; target=&quot;_blank&quot;&gt;Blender&lt;/a&gt; - для преобразования моделей в формат smd;&lt;/li&gt;
    &lt;li id=&quot;ntxF&quot;&gt;&lt;a href=&quot;http://steamreview.org/BlenderSourceTools/&quot; target=&quot;_blank&quot;&gt;Blender Source Tools&lt;/a&gt; - расширение для Blender для работы с qc/smd;&lt;/li&gt;
    &lt;li id=&quot;DMqO&quot;&gt;studiomdl - для сборки модели (для Half-Life подойдёт стандартный);&lt;/li&gt;
    &lt;li id=&quot;Hw0m&quot;&gt;&lt;a href=&quot;https://github.com/SamVanheer/HalfLifeAssetManager&quot; target=&quot;_blank&quot;&gt;Half-Life Asset Manager&lt;/a&gt; - для просмотра моделей;&lt;/li&gt;
    &lt;li id=&quot;scSr&quot;&gt;&lt;a href=&quot;https://imagemagick.org/&quot; target=&quot;_blank&quot;&gt;ImageMagick&lt;/a&gt; - для расширенной правки текстур.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Njhp&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;ODh3&quot;&gt;Открыть &amp;quot;Umodel.exe&amp;quot;. В появившемся окне в поле &amp;quot;Path to game files&amp;quot; указать путь до папки с игрой.&lt;/p&gt;
  &lt;p id=&quot;mhmS&quot;&gt;Дополнительно можно поставить галку на &amp;quot;Override game detection&amp;quot; и указать в первом нижнем поле &amp;quot;Unreal engine 3&amp;quot;, а во втором &amp;quot;Mass Effect&amp;quot;. Часть игры не важна.&lt;/p&gt;
  &lt;p id=&quot;ylPz&quot;&gt;Кликнуть &amp;quot;OK&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;wcbs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/16/0216ea86-5bdf-44a0-a4ad-e404402de87b.png&quot; width=&quot;508&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dBdF&quot;&gt;Появится окно, предлагающая выбрать пакет, который можно открыть или произвести над ним различные манипуляции с помощью кнопки &amp;quot;Tools&amp;quot;. Также здесь имеется поле &amp;quot;Filter&amp;quot; для поиска.&lt;/p&gt;
  &lt;figure id=&quot;4Vuc&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/92/f7/92f7f7cd-8c5c-4b12-a359-34f7bbbaa470.png&quot; width=&quot;778&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pBl9&quot;&gt;Выбрать нужный пакет, например: &amp;quot;BioA_Cat002_100Intro.pcc&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;lcpt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/36/d536fef2-10e9-4a6e-adca-32af0dbd2b2a.png&quot; width=&quot;778&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NXnq&quot;&gt;Откроется окно просмотра. Для того, чтобы смотреть только модели, нужно кликнуть на пункт &amp;quot;Navigate&amp;quot;  в меню окна и выбрать в нём пункт &amp;quot;Include meshes&amp;quot;. Для просмотра других моделей нажимать клавиши &amp;quot;PgUp&amp;quot; и &amp;quot;PgDn&amp;quot; соответственно.&lt;/p&gt;
  &lt;figure id=&quot;7ItV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/01/e8/01e8e61a-02f9-4ca3-b0b1-550bb9e5b9fe.png&quot; width=&quot;828&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sQfl&quot;&gt;Для экспорта текущей модели, нужно нажать кнопку &amp;quot;Ctrl+X&amp;quot; или кликнуть на пункт &amp;quot;Tools&amp;quot; в меню окна программы и выбрать пункт &amp;quot;Export current object&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;k7gE&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/2c/302cd51d-fdf0-452b-88ed-62b3c919ec91.png&quot; width=&quot;828&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;w5Ep&quot;&gt;Программа может предложить указать путь, по которому будут находиться экспортированные модели (Вкладка &amp;quot;Export&amp;quot;, поле &amp;quot;File Layout&amp;quot;, &amp;quot;Export to this folder&amp;quot;).&lt;/p&gt;
  &lt;p id=&quot;efYr&quot;&gt;Также можно будет указать формат экспортируемых объектов, например: glTF 2.0 (поле &amp;quot;Mesh Export&amp;quot;).&lt;/p&gt;
  &lt;figure id=&quot;5bdm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/d0/27d08ec6-d2a2-4d5e-9c2c-90e7667c4e56.png&quot; width=&quot;423&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;W4aU&quot;&gt;После экспорта в назначенной папке появятся папки: &amp;quot;LightMapTexture2D&amp;quot;, &amp;quot;Material3&amp;quot;, &amp;quot;MaterialInstanceConstant&amp;quot;, &amp;quot;StaticMesh3&amp;quot;, &amp;quot;Texture2D&amp;quot;. В &amp;quot;StaticMesh3&amp;quot; будут файлы модели. В &amp;quot;Texture2D&amp;quot; будут текстуры моделей.&lt;/p&gt;
  &lt;p id=&quot;i1Iy&quot;&gt;Если у какой-то модели текстура не находится, то можно узнать её имя, открыв текстовый файл формата &amp;quot;mat&amp;quot; в папке &amp;quot;Material3&amp;quot; или в папке &amp;quot;MaterialInstanceConstant&amp;quot;. &lt;/p&gt;
  &lt;figure id=&quot;DbY4&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f7/16/f7168bc8-3a57-4cb2-9d4d-0e0c06e2cbfe.png&quot; width=&quot;678&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7032&quot;&gt;Открыть Blender и импортировать файл glTF 2.0. Выбрать нужный файл.&lt;/p&gt;
  &lt;figure id=&quot;hexx&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f9/23/f92348fe-9307-461c-8125-bd20214d3b20.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4fVs&quot;&gt;В настройках Blender&amp;#x27;а включить расширение &amp;quot;Blender Source Tools&amp;quot; (Оно находится в разделе &amp;quot;Импорт/экспорт&amp;quot;).&lt;/p&gt;
  &lt;figure id=&quot;peQP&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a3/57/a357c98c-8e3e-4455-b853-1a61149f25f5.png&quot; width=&quot;626&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2i2n&quot;&gt;О требованиях к модели можно прочитать &lt;a href=&quot;https://the303.org/tutorials/gold_mdl.htm#intro&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt; (на английском языке).&lt;/p&gt;
  &lt;p id=&quot;xXIW&quot;&gt;Название материала модели должно быть равно названию текстуры, которая будет использоваться на модели. Например: Имя текстуры: &amp;quot;AmmoBox01.bmp&amp;quot;, тогда имя материала: &amp;quot;AmmoBox01.bmp&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;P7fh&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0b/a1/0ba1af0f-22ca-4ce5-82ce-c76672b8ce6e.png&quot; width=&quot;502&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;w3to&quot;&gt;Решения по конвертации текстуры могут быть разными в зависимости от самих текстур.&lt;/p&gt;
  &lt;p id=&quot;99s4&quot;&gt;Если текстура без альфа канала, то есть не имеет прозрачности, то можно идти следующими решениями:&lt;/p&gt;
  &lt;p id=&quot;vGRo&quot;&gt;1.1) Открыть текстуру в GIMP.&lt;/p&gt;
  &lt;figure id=&quot;BbPs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dd/f9/ddf9ed70-79c0-4f89-941b-e5ad226f962b.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;92pb&quot;&gt;1.2) Кликнуть на элемент меню &amp;quot;Изображение&amp;quot; и выбрать &amp;quot;Режим&amp;quot;-&amp;gt;&amp;quot;Индексированный&amp;quot;. &lt;/p&gt;
  &lt;figure id=&quot;9aNu&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bd/46/bd46c103-4851-4c1c-9644-96111de7bec3.png&quot; width=&quot;1366&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qIc6&quot;&gt;1.3) &amp;quot;Цветовая карта&amp;quot;: Выбрать пункт &amp;quot;Создать оптимальную палитру&amp;quot; и указать максимальное число цветов: 256. Кликнуть кнопку &amp;quot;Преобразовать&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;1nFP&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e9/18/e918a8b4-2e53-4944-b094-9701faa1a7bc.png&quot; width=&quot;443&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KS4t&quot;&gt;1.4) Экспортировать изображение как &amp;quot;bmp&amp;quot;-файл. При экспорте в BMP появится окно с параметрами. Раскрыть пункт &amp;quot;Параметры совместимости&amp;quot; и поставить крестик в квадрат &amp;quot;Не сохранять данные о цветовом пространстве&amp;quot;. Нажать &amp;quot;Экспорт&amp;quot;. Текстура готова.&lt;/p&gt;
  &lt;figure id=&quot;27cs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7b/82/7b82b6cd-96ba-4e03-8a1e-2a5017aa6ce0.png&quot; width=&quot;316&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6AA8&quot;&gt;2) Решение на случай, если нужно преобразовать большое количество текстур за раз. О нём я писал в своей заметке &lt;a href=&quot;https://arbtttrn6.neocities.org/ru_massovo-preobrazovatj-izobrazhenija-v-bmp-dlja-goldsrc-half-life&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;. Для работы сценария необходима Bash-совместимая командная оболочка и инструментарий ImageMagick.&lt;/p&gt;
  &lt;p id=&quot;x9FW&quot;&gt;3) Более простое решение, но в нём также используется библиотека ImageMagick.&lt;/p&gt;
  &lt;pre id=&quot;DhLC&quot; data-lang=&quot;bash&quot;&gt;mogrify -path ./ -compress none -format bmp -define bmp:format=bmp3 -colors 256 *.png&lt;/pre&gt;
  &lt;p id=&quot;83Yn&quot;&gt;В наборе команд выше изображения формата &amp;quot;png&amp;quot; будут преобразованы в формат &amp;quot;bmp&amp;quot;, употребляемый компиляторами моделей.&lt;/p&gt;
  &lt;p id=&quot;JDzN&quot;&gt;4.1) Иногда текстура может выглядеть так, как на изображении ниже.&lt;/p&gt;
  &lt;figure id=&quot;TMcA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/bf/f4bfab49-2625-477e-bed6-61625c204bf8.png&quot; width=&quot;485&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UeEw&quot;&gt;4.2) Чтобы привести это к видимому в игре виду, кликнуть на элемент меню окна GIMP под названием &amp;quot;Цвет&amp;quot;. Выбрать элемент &amp;quot;Составляющие&amp;quot; и егошний подэлемент &amp;quot;Разобрать&amp;quot;. В выпадающем списке &amp;quot;Цветовая модель&amp;quot; выбрать &amp;quot;RGBA&amp;quot; и нажать &amp;quot;ОК&amp;quot;&lt;/p&gt;
  &lt;figure id=&quot;7c4l&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/14/80/148083be-8eca-4ddd-abec-9c5a4cdffce7.png&quot; width=&quot;305&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kao8&quot;&gt;4.3) Выбрать слой под названием &amp;quot;альфа-канал&amp;quot; и удалить его.&lt;/p&gt;
  &lt;figure id=&quot;GfP4&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/10/80/10802260-67b2-4dc5-854b-b4545de1fe63.png&quot; width=&quot;947&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YSxH&quot;&gt;4.4) В том же меню &amp;quot;Цвет&amp;quot;-&amp;gt;&amp;quot;Составляющие&amp;quot;: Выбрать &amp;quot;Собрать&amp;quot; и указать &amp;quot;Цветовая модель&amp;quot;: &amp;quot;RGB&amp;quot; и нажать &amp;quot;ОК&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;dOpV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5b/2f/5b2f9da0-54ed-4bf1-883f-93140bd09155.png&quot; width=&quot;529&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FGyh&quot;&gt;4.5) Получаем текстуру в нужном виде.&lt;/p&gt;
  &lt;figure id=&quot;ujeV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/61/df/61df2137-150f-4685-944f-8c19e5e04fd1.png&quot; width=&quot;485&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;WJWN&quot;&gt;В Blender перейти в секцию &amp;quot;Scene&amp;quot; и раскрыть пункт &amp;quot;Экспорт в Source&amp;quot;. Выбрать путь экспорта. В качестве &amp;quot;Export Format&amp;quot; указать &amp;quot;SMD&amp;quot;. В &amp;quot;Target Engine&amp;quot; указать &amp;quot;Goldsrc&amp;quot;. Нажать на кнопку &amp;quot;Экспортировать&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;Pkvi&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5a/16/5a1679da-2cf8-42ff-9d04-970930156efc.png&quot; width=&quot;502&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KyVJ&quot;&gt;Нужно сгенерировать &amp;quot;qc&amp;quot; файл. Так как здесь речь о файле без анимаций, объект-декорация. То расширяемое решение следующее:&lt;/p&gt;
  &lt;pre id=&quot;8qpZ&quot; data-lang=&quot;bash&quot;&gt;#!/bin/bash

# Проверка наличия аргументов
if [ $# -lt 2 ]; then
  echo &amp;quot;Использование: $0 &amp;lt;имя_qc_файла&amp;gt; &amp;lt;smd_файлы...&amp;gt;&amp;quot;
  echo &amp;quot;  Например: $0 mymodel.qc body1 body2 body3&amp;quot;
  exit 1
fi

# Получение имени qc файла
QC_FILE=$1
shift

# Начало содержимого qc файла
echo &amp;quot;\$cd ./&amp;quot; &amp;gt; &amp;quot;$QC_FILE&amp;quot;
echo &amp;quot;\$cliptotextures&amp;quot; &amp;gt;&amp;gt; &amp;quot;$QC_FILE&amp;quot;
echo &amp;quot;\$scale 50&amp;quot; &amp;gt;&amp;gt; &amp;quot;$QC_FILE&amp;quot;

# Создание строк \$body studio для каждого smd файла
for SMD_FILE in &amp;quot;$@&amp;quot;; do
  echo &amp;quot;\$body studio $SMD_FILE&amp;quot; &amp;gt;&amp;gt; &amp;quot;$QC_FILE&amp;quot;
done

# Добавление остального содержимого
echo &amp;quot;\$origin 0 0 0&amp;quot; &amp;gt;&amp;gt; &amp;quot;$QC_FILE&amp;quot;
echo &amp;quot;\$sequence seq-name sequence loop fps 15 ACT_IDLE 1&amp;quot; &amp;gt;&amp;gt; &amp;quot;$QC_FILE&amp;quot;

echo &amp;quot;QC файл &amp;#x27;$QC_FILE&amp;#x27; успешно создан.&amp;quot;

# Создание sequence.smd
echo &amp;#x27;version 1
nodes
0 &amp;quot;root&amp;quot; -1
end
skeleton
time 0
0 0 0 0 0 0 0
time 1
0 0 0 0 0 0 0
end&amp;#x27; &amp;gt;&amp;gt; ./sequence.smd

# Выбранный компилятор
studiomdl ./$QC_FILE&lt;/pre&gt;
  &lt;p id=&quot;Sudb&quot;&gt;Рекомендую изучить этот сценарий.&lt;/p&gt;
  &lt;p id=&quot;GieU&quot;&gt;В командной строке (в терминале) вводим:&lt;/p&gt;
  &lt;pre id=&quot;bAF6&quot; data-lang=&quot;bash&quot;&gt;build_model.sh AmmoBox01.qc AmmoBox01&lt;/pre&gt;
  &lt;p id=&quot;pVca&quot;&gt;И получаем вывод:&lt;/p&gt;
  &lt;pre id=&quot;NSI0&quot; data-lang=&quot;bash&quot;&gt;QC файл &amp;#x27;Ammobox01.qc&amp;#x27; успешно создан.
entering ./Ammobox01.qc
grabbing .//Ammobox01_A.smd
grabbing .//sequence.smd
BMP AmmoBox01.bmp [512 512] (100%)  262912 bytes
---------------------
writing ./Ammobox01.mdl:
bones        388 bytes (1)
sequences    296 bytes (15 frames) [0:01]
vertices    8296 bytes (458 vertices, 180 normals)
mesh        9048 bytes (660 tris, 208 strips)
models     17532 bytes
textures  262996 bytes
total     281212&lt;/pre&gt;
  &lt;p id=&quot;zuB3&quot;&gt;Модель готова к использованию на картах.&lt;/p&gt;
  &lt;p id=&quot;X1Pj&quot;&gt;Посмотреть модель с помощью &amp;quot;Half-Life Asset Manager&amp;quot;. Чтобы узнать, какой размер модели относительно модели игрока, во вкладке &amp;quot;Model Display&amp;quot; поставить крестик у пункта &amp;quot;Show Player Hitbox&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;h4S2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/5b/9a5ba864-7bd4-41f7-8c60-8e0c0781e667.png&quot; width=&quot;781&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AuAo&quot;&gt;Вот и всё. Если есть какие-то вопросы, советы или пожелания, пишите в комментариях или на почту: arturaiwasan[собака]gmail.com&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:half-life-sdk-goldsrc-ramka-obvodka-u-entity</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-ramka-obvodka-u-entity?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Half-Life SDK: Рамка-обводка на выделяемой сущности</title><published>2025-03-05T13:56:14.708Z</published><updated>2025-03-05T13:57:26.764Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/b3/cd/b3cd3174-30a8-4a73-a5e8-56de73284ae7.png"></media:thumbnail><category term="half-life" label="HalfLife"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/fe/42/fe426a11-fd44-46fd-82d8-c9ec41a3b105.png&quot;&gt;Суть: Рисование рамки вокруг сущности (entity), на которую смотрит игрок.</summary><content type="html">
  &lt;p id=&quot;mhyR&quot;&gt;Суть: Рисование рамки вокруг сущности (entity), на которую смотрит игрок.&lt;/p&gt;
  &lt;p id=&quot;L3wa&quot;&gt;Итоговый результат:&lt;/p&gt;
  &lt;figure id=&quot;R1kG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fe/42/fe426a11-fd44-46fd-82d8-c9ec41a3b105.png&quot; width=&quot;528&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8jvl&quot;&gt;&lt;strong&gt;(!) Кого интересует сразу решение рисования&lt;/strong&gt; — может перейти на шаг 7-ой.&lt;/p&gt;
  &lt;p id=&quot;cMbF&quot;&gt;1) В &amp;quot;dlls/player.cpp&amp;quot; получаем ищем нужную сущность. Например в CBasePlayer::UpdateStatusBar(). Сразу после проверки (pEntity-&amp;gt;Classify() == CLASS_PLAYER) пишем:&lt;/p&gt;
  &lt;pre id=&quot;S74m&quot; data-lang=&quot;cpp&quot;&gt;else if (pEntity-&amp;gt;Classify() != CLASS_PLAYER) // если сущность НЕ игрок
{
	if (pEntity-&amp;gt;IsAlive()) // если сущность жива
	{
		MESSAGE_BEGIN(MSG_ONE, gmsgNpcHealth, NULL, this-&amp;gt;pev); // gmsgNpcHealth у меня содержит инфу о наблюдаемом NPC вообще
		WRITE_STRING(STRING(pEntity-&amp;gt;pev-&amp;gt;classname)); // имя класса сущности (напр. monster_human_grunt)
		WRITE_SHORT(static_cast&amp;lt;int&amp;gt;(pEntity-&amp;gt;pev-&amp;gt;health)); // здоровье сущности
		WRITE_SHORT(static_cast&amp;lt;int&amp;gt;(pEntity-&amp;gt;pev-&amp;gt;max_health)); // максимальное здоровье сущности
		WRITE_SHORT(ENTINDEX(pEntity-&amp;gt;edict())); // индекс сущности
		MESSAGE_END();
	}
	else // а это на всякий случай
	{
		MESSAGE_BEGIN(MSG_ONE, gmsgNpcHealth, NULL, this-&amp;gt;pev);
		WRITE_STRING(&amp;quot;&amp;quot;);
		WRITE_SHORT(0);
		WRITE_SHORT(0);
		MESSAGE_END();
	}
}&lt;/pre&gt;
  &lt;p id=&quot;URt9&quot;&gt;Нам для дела понадобится только &amp;quot;ENTINDEX(pEntity-&amp;gt;edict())&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;jWtE&quot;&gt;2) В &amp;quot;dlls/UserMessages.h&amp;quot; в самом конце, после остальных сообщений, пишем:&lt;/p&gt;
  &lt;pre id=&quot;pvp2&quot; data-lang=&quot;cpp&quot;&gt;inline int gmsgNpcHealth = 0;&lt;/pre&gt;
  &lt;p id=&quot;e3As&quot;&gt;3) В &amp;quot;dlls/UserMessages.cpp&amp;quot; в функции &amp;quot;LinkUserMessages()&amp;quot; пишем:&lt;/p&gt;
  &lt;pre id=&quot;P7Gb&quot; data-lang=&quot;cpp&quot;&gt;gmsgNpcHealth = REG_USER_MSG(&amp;quot;NpcHealth&amp;quot;, -1);&lt;/pre&gt;
  &lt;p id=&quot;iQJ1&quot;&gt;4) В &amp;quot;cl_dll/hud.h&amp;quot; в классе CHudStatusBar (class CHudStatusBar : public CHudBase) пишем (в условный protected):&lt;/p&gt;
  &lt;pre id=&quot;birj&quot; data-lang=&quot;cpp&quot;&gt;// Для удобства: в каком порядке отправили из &amp;quot;dlls/player.cpp&amp;quot;, в таком и записываем...
char NPC_Name[256]; // 1 - classname
int NPC_Health; // 2 - health
int NPC_MaxHealth; // 3 - maxhealth
int NPC_Index; // 4 - индекс сущности&lt;/pre&gt;
  &lt;p id=&quot;DeTw&quot;&gt;5) В &amp;quot;cl_dll/statusbar.cpp&amp;quot; в начале файла, например после &amp;quot;DECLARE_MESSAGE(m_StatusBar, StatusValue);&amp;quot; декларируем/объявляем наше сообщение:&lt;/p&gt;
  &lt;pre id=&quot;vuQF&quot; data-lang=&quot;cpp&quot;&gt;DECLARE_MESSAGE(m_StatusBar, NpcHealth);&lt;/pre&gt;
  &lt;p id=&quot;M79t&quot;&gt;6) В &amp;quot;cl_dll/statusbar.cpp&amp;quot; где-нибудь в конце пишем код ниже. Здесь мы получаем и читаем содержимое, которое мы отправили в &amp;quot;dlls/player.cpp&amp;quot;.&lt;/p&gt;
  &lt;pre id=&quot;MvJ3&quot; data-lang=&quot;cpp&quot;&gt;bool CHudStatusBar::MsgFunc_NpcHealth(const char* pszName, int iSize, void* pbuf)
{
	BEGIN_READ(pbuf, iSize);

	strncpy(NPC_Name, READ_STRING(), sizeof(NPC_Name) - 1); // получаем classname
	NPC_Name[sizeof(NPC_Name) - 1] = &amp;#x27;\0&amp;#x27;;

	NPC_Health = READ_SHORT(); // получаем здоровье
	NPC_MaxHealth = READ_SHORT(); // получаем максимальное здоровье
	NPC_Index = READ_SHORT(); // получаем индекс

	m_iFlags |= HUD_ACTIVE;

	return true;
}&lt;/pre&gt;
  &lt;p id=&quot;r0gR&quot;&gt;7) В &amp;quot;cl_dll/statusbar.cpp&amp;quot; в &amp;quot;Draw()&amp;quot; (&amp;quot;bool CHudStatusBar::Draw(float fTime)&amp;quot;) после имеющегося кода пишем:&lt;/p&gt;
  &lt;pre id=&quot;TePQ&quot; data-lang=&quot;cpp&quot;&gt;cl_entity_t* pEntity = gEngfuncs.GetEntityByIndex(NPC_Index); // Ищем сущность с нашим индексом

if (pEntity &amp;amp;&amp;amp; pEntity-&amp;gt;model)
{
	DrawBoundingBox(pEntity);
}&lt;/pre&gt;
  &lt;p id=&quot;DZeK&quot;&gt;где &amp;quot;DrawBoundingBox&amp;quot; это следующая функция:&lt;/p&gt;
  &lt;pre id=&quot;cWNm&quot; data-lang=&quot;cpp&quot;&gt;void CHudStatusBar::DrawBoundingBox(cl_entity_t* pEntity)
{
	Vector vecMins = pEntity-&amp;gt;curstate.mins;
	Vector vecMaxs = pEntity-&amp;gt;curstate.maxs;
	Vector vecOrigin = pEntity-&amp;gt;curstate.origin;

	float flScreenX[8], flScreenY[8];
	bool bVisible = false;
	float minX = 9999, maxX = -9999, minY = 9999, maxY = -9999;

	for (int i = 0; i &amp;lt; 8; i++)
	{
		Vector corner = vecOrigin;
		corner.x += (i &amp;amp; 1) ? vecMaxs.x : vecMins.x;
		corner.y += (i &amp;amp; 2) ? vecMaxs.y : vecMins.y;
		corner.z += (i &amp;amp; 4) ? vecMaxs.z : vecMins.z;

		float screen[2];

		if (gEngfuncs.pTriAPI-&amp;gt;WorldToScreen(corner, screen) == 0)
		{
			flScreenX[i] = (screen[0] + 1) * gHUD.m_scrinfo.iWidth / 2;
			flScreenY[i] = (-screen[1] + 1) * gHUD.m_scrinfo.iHeight / 2;

			minX = min(minX, flScreenX[i]);
			maxX = max(maxX, flScreenX[i]);
			minY = min(minY, flScreenY[i]);
			maxY = max(maxY, flScreenY[i]);
			bVisible = true;
		}
	}

	if (!bVisible)
		return;
	
	// Рисование рамок

	int x = static_cast&amp;lt;int&amp;gt;(minX);
	int y = static_cast&amp;lt;int&amp;gt;(minY);
	int w = static_cast&amp;lt;int&amp;gt;(maxX - minX);
	int h = static_cast&amp;lt;int&amp;gt;(maxY - minY);

	gEngfuncs.pfnFillRGBA(x, y, w, 1, 255, 0, 0, 255);
	gEngfuncs.pfnFillRGBA(x, y + h, w, 1, 255, 0, 0, 255);
	gEngfuncs.pfnFillRGBA(x, y, 1, h, 255, 0, 0, 255);
	gEngfuncs.pfnFillRGBA(x + w, y, 1, h, 255, 0, 0, 255);
}&lt;/pre&gt;
  &lt;p id=&quot;FQR9&quot;&gt;Не забываем добавить эту функцию в &amp;quot;public&amp;quot; &amp;quot;CHudStatusBar&amp;quot;а:&lt;/p&gt;
  &lt;pre id=&quot;QQAl&quot; data-lang=&quot;cpp&quot;&gt;class CHudStatusBar : public CHudBase
{
public:
	
	...
	void DrawBoundingBox(cl_entity_t* pEntity);
	...
}&lt;/pre&gt;
  &lt;p id=&quot;MSZq&quot;&gt;Конечный результат можно украсить, нарисовав элементы рамки теми же спрайтами.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;TMQy&quot;&gt;(!) Возможно при сборке компилятор поругается на отсутствие функций &amp;quot;min/max&amp;quot; в &amp;quot;DrawBoundingBox&amp;quot;. Тогда в начале &amp;quot;cl_dll/statusbar.cpp&amp;quot; пишем:&lt;/p&gt;
  &lt;pre id=&quot;wc9m&quot; data-lang=&quot;cpp&quot;&gt;#define min(a,b) ((a) &amp;lt; (b) ? (a) : (b))
#define max(a,b) ((a) &amp;gt; (b) ? (a) : (b))&lt;/pre&gt;
  &lt;p id=&quot;p7G9&quot;&gt;Это решение есть в некоторых файлах Half-Life SDK.&lt;/p&gt;
  &lt;p id=&quot;Bzc8&quot;&gt;(!) И возможно ещё потребно будет подключить &amp;quot;TriangleAPI&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;7D3A&quot; data-lang=&quot;cpp&quot;&gt;#include &amp;quot;triangleapi.h&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;m85F&quot;&gt;На этом всё. Пишите, делитесь и т.д. и т.п. — будет интересно поглядеть.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:mass-effect-3-multuzanta-ludo-pocket-relay</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/mass-effect-3-multuzanta-ludo-pocket-relay?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Mass Effect 3: Kiel ludi multludante? Pocket Relay</title><published>2025-02-23T21:58:37.649Z</published><updated>2025-02-23T21:58:37.649Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/0c/dd/0cdd96d1-9207-462a-90ce-d922468854f9.png"></media:thumbnail><category term="mass-effect" label="MassEffect"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/97/62/976203c0-4fba-4c35-9890-1e78290990e0.png&quot;&gt;Ĉefaĵo: Uzado de aliflanka programo por multuzanta ludado en Mass Effect 3.</summary><content type="html">
  &lt;p id=&quot;GooM&quot;&gt;Ĉefaĵo: Uzado de aliflanka programo por multludanta ludado en Mass Effect 3.&lt;/p&gt;
  &lt;p id=&quot;udAl&quot;&gt;Problemo, eble, estos grava en estonteco, kiam elŝaltotaj serviloj de ludo aŭ vi ludas ludon en neVindozo.&lt;/p&gt;
  &lt;p id=&quot;gtek&quot;&gt;Al ni helpos &amp;quot;Pocket Relay&amp;quot;: &lt;a href=&quot;https://pocket-relay.pages.dev/&quot; target=&quot;_blank&quot;&gt;https://pocket-relay.pages.dev/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;RUdC&quot;&gt;Ĝi funkcias en Vindozo kaj Linukso — kliento kaj servilo.&lt;/p&gt;
  &lt;p id=&quot;BVMp&quot;&gt;1) Elŝutu &amp;quot;Pocket Relay Client&amp;quot; el ĉi: &lt;a href=&quot;https://pocket-relay.pages.dev/docs/client/standalone-client/&quot; target=&quot;_blank&quot;&gt;https://pocket-relay.pages.dev/docs/client/standalone-client/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;wGTY&quot;&gt;2) Elŝutu &amp;quot;Pocket Relay Server&amp;quot; el ĉi: &lt;a href=&quot;https://pocket-relay.pages.dev/docs/server/executable/&quot; target=&quot;_blank&quot;&gt;https://pocket-relay.pages.dev/docs/server/executable/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;5pdq&quot;&gt;3) Por lanĉi servilon, klaku programon (pocket-relay-windows/linux).&lt;/p&gt;
  &lt;figure id=&quot;LEus&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/6d/ac6df99f-ba53-497c-aeba-7ef785020975.png&quot; width=&quot;623&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;idpY&quot;&gt;4) Lanĉu &amp;quot;pocket-relay-client&amp;quot;on. &lt;/p&gt;
  &lt;p id=&quot;Xzfu&quot;&gt;4.1) Klaku &amp;quot;Patch Game&amp;quot; kaj elektu necesatan dosieon&lt;/p&gt;
  &lt;p id=&quot;WXYG&quot;&gt;(!) KOPIU VIAJN DOSIEROJN (!);&lt;/p&gt;
  &lt;p id=&quot;ILR0&quot;&gt;4.2) Enskribu adreson de via servilo;&lt;/p&gt;
  &lt;p id=&quot;PZoJ&quot;&gt;4.3) Klaku butonon &amp;quot;Set&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;tyFH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/69/c6/69c66ecc-5fec-4db9-b9b5-02a9a23f2234.png&quot; width=&quot;512&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Te3i&quot;&gt;Nun vi povas lanĉi &amp;quot;Mass Effect&amp;quot;on.&lt;/p&gt;
  &lt;p id=&quot;huDS&quot;&gt;SED iafoje necese registriĝi:&lt;/p&gt;
  &lt;p id=&quot;vuMQ&quot;&gt;5) Malfermu ludon kaj klaku butonon sur tekkomputilo (&amp;quot;Connect to EA Severs&amp;quot;).&lt;/p&gt;
  &lt;p id=&quot;UBgX&quot;&gt;6) Klaku &amp;quot;Create an Origin Account (EA)&amp;quot;, enskribu vian poŝton kaj pasvorton kaj klaku &amp;quot;Accept&amp;quot;on (&amp;quot;EA Terms of Service and Privacy Policy&amp;quot;).&lt;/p&gt;
  &lt;p id=&quot;8X0h&quot;&gt;7) Post tio aperos la ekrano kun informaĵo, ke &amp;quot;Origin&amp;quot;a profilo estas kreita. Klaku &amp;quot;Continue&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;37bJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;vjJF&quot;&gt;Nun vi povas lanĉi multuzantan ludon.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:half-life-sdk-goldsrc-iom-da-sonoj-por-armiloj</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-iom-da-sonoj-por-armiloj?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Half-Life SDK: Iom da sonoj de pafado</title><published>2025-02-15T19:54:39.892Z</published><updated>2025-02-15T19:54:39.892Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/b0/65/b06510cf-942f-4698-9a5b-4a500b48258a.png"></media:thumbnail><category term="half-life" label="HalfLife"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/4f/ef/4fef148e-93d1-4fe7-b474-4da02d488e9d.png&quot;&gt;Ĉefaĵo: Iom da pafsonoj por la armiloj.</summary><content type="html">
  &lt;p id=&quot;287V&quot;&gt;Ĉefaĵo: Iom da pafsonoj por la armilo.&lt;/p&gt;
  &lt;p id=&quot;eUwA&quot;&gt;Ekzemple, &amp;quot;MP5&amp;quot; en &amp;quot;dlls/mp5.cpp&amp;quot; en &amp;quot;::Precache()&amp;quot; per &amp;quot;PRECACHE_SOUND(...)&amp;quot; estas tri sonoj: &amp;quot;hks(1-3).wav&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;8AfN&quot;&gt;PRECACHE_SOUND(&amp;quot;weapons/hks1.wav&amp;quot;); 
PRECACHE_SOUND(&amp;quot;weapons/hks2.wav&amp;quot;); 
PRECACHE_SOUND(&amp;quot;weapons/hks3.wav&amp;quot;);&lt;/pre&gt;
  &lt;p id=&quot;tYYw&quot;&gt;Sonludado estas en &amp;quot;cl_dlls/ev_hldm.cpp&amp;quot; en funkcio &amp;quot;EV_FireMP5&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;4QQd&quot;&gt;switch (gEngfuncs.pfnRandomLong(0, 1))
	{
	case 0:
		gEngfuncs.pEventAPI-&amp;gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &amp;quot;weapons/hks1.wav&amp;quot;, 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong(0, 0xf));
		break;
	case 1:
		gEngfuncs.pEventAPI-&amp;gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &amp;quot;weapons/hks2.wav&amp;quot;, 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong(0, 0xf));
		break;
	}&lt;/pre&gt;
  &lt;p id=&quot;Kf1x&quot;&gt;Ĉi tie ni instalas proprajn sonojn. Kiomon de sonoj ni regulas per dua parametro de &amp;quot;gEngfuncs.pfnRandomLong(a, b)&amp;quot;. Ekzemple, se necese estas ludi tri sonojn, do anstataŭ 1 ni skribas 2 kaj aldonas plie unun &amp;quot;case&amp;quot; (&amp;quot;case 2:&amp;quot;), kopiante enhavon de aliaj &amp;quot;case&amp;quot;. Nur ne forgesu aldoni necesatan sonon en &amp;quot;PRECACHE_SOUND&amp;quot;on en funkcion &amp;quot;Precache&amp;quot; de necesata armilo.&lt;/p&gt;
  &lt;p id=&quot;8giP&quot;&gt;Por aliaj armiloj ĉio estas sama. Ekzemple, por &amp;quot;glock&amp;quot; en dosiero &amp;quot;cl_dlls/ev_hldm.cpp&amp;quot; en funkcio &amp;quot;EV_FireGlock1&amp;quot;:&lt;/p&gt;
  &lt;p id=&quot;zuSa&quot;&gt;Anstataŭ:&lt;/p&gt;
  &lt;pre id=&quot;WLeE&quot;&gt;gEngfuncs.pEventAPI-&amp;gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &amp;quot;weapons/pl_gun3.wav&amp;quot;, gEngfuncs.pfnRandomFloat(0.92, 1.0), ATTN_NORM, 0, 98 + gEngfuncs.pfnRandomLong(0, 3));&lt;/pre&gt;
  &lt;p id=&quot;EvcC&quot;&gt;Aldonas &amp;quot;switch-case&amp;quot;on kiel en &amp;quot;MP5&amp;quot; kaj kaŝmemoras sonon en &amp;quot;Precache&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;0vZy&quot;&gt;Nu jene.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:half-life-sdk-goldsrc-neskolko-zvukov-dlja-strelby</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-neskolko-zvukov-dlja-strelby?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Half-Life SDK: Разнообразные звуки стрельбы</title><published>2025-02-15T19:12:07.788Z</published><updated>2025-02-15T19:12:07.788Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/b0/65/b06510cf-942f-4698-9a5b-4a500b48258a.png"></media:thumbnail><category term="half-life" label="HalfLife"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/4f/ef/4fef148e-93d1-4fe7-b474-4da02d488e9d.png&quot;&gt;Суть: Несколько звуков стрельбы для оружия.</summary><content type="html">
  &lt;p id=&quot;9s8K&quot;&gt;Суть: Несколько звуков стрельбы для оружия.&lt;/p&gt;
  &lt;p id=&quot;E4xi&quot;&gt;Например, у &amp;quot;MP5&amp;quot; в &amp;quot;dlls/mp5.cpp&amp;quot; в &amp;quot;::Precache()&amp;quot; с помощью операции &amp;quot;PRECACHE_SOUND(...)&amp;quot; взято три звука: &amp;quot;hks(1-3).wav&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;tYvp&quot;&gt;    PRECACHE_SOUND(&amp;quot;weapons/hks1.wav&amp;quot;);
    PRECACHE_SOUND(&amp;quot;weapons/hks2.wav&amp;quot;);
    PRECACHE_SOUND(&amp;quot;weapons/hks3.wav&amp;quot;);&lt;/pre&gt;
  &lt;p id=&quot;F3vW&quot;&gt; Проигрывание звуков в &amp;quot;cl_dlls/ev_hldm.cpp&amp;quot; в функции &amp;quot;EV_FireMP5&amp;quot;:&lt;/p&gt;
  &lt;pre id=&quot;Lugc&quot;&gt;switch (gEngfuncs.pfnRandomLong(0, 1))
	{
	case 0:
		gEngfuncs.pEventAPI-&amp;gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &amp;quot;weapons/hks1.wav&amp;quot;, 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong(0, 0xf));
		break;
	case 1:
		gEngfuncs.pEventAPI-&amp;gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &amp;quot;weapons/hks2.wav&amp;quot;, 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong(0, 0xf));
		break;
	}&lt;/pre&gt;
  &lt;p id=&quot;GvpE&quot;&gt;Здесь ставим свои звуки. Количество проигрываемых звуков регулируем вторым параметром &amp;quot;gEngfuncs.pfnRandomLong(a, b)&amp;quot;. Например, если нужно проиграть три звука, то завместо 1 (единицы) пишем 2 (два) и додаём ещё один &amp;quot;case&amp;quot; (&amp;quot;case 2:&amp;quot;), копируя содержимое других &amp;quot;case&amp;quot;. Только не забудьте додать нужный звук в &amp;quot;PRECACHE_SOUND&amp;quot; в функцию &amp;quot;Precache&amp;quot; нужного оружия.&lt;/p&gt;
  &lt;p id=&quot;yM9t&quot;&gt;Для других оружий всё тоже самое. Например, для &amp;quot;glock&amp;quot; в файле &amp;quot;cl_dlls/ev_hldm.cpp&amp;quot; в функции &amp;quot;EV_FireGlock1&amp;quot;:&lt;/p&gt;
  &lt;p id=&quot;Tr8C&quot;&gt;Вместо:&lt;/p&gt;
  &lt;pre id=&quot;VwmV&quot;&gt;gEngfuncs.pEventAPI-&amp;gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &amp;quot;weapons/pl_gun3.wav&amp;quot;, gEngfuncs.pfnRandomFloat(0.92, 1.0), ATTN_NORM, 0, 98 + gEngfuncs.pfnRandomLong(0, 3));&lt;/pre&gt;
  &lt;p id=&quot;mc5w&quot;&gt;Додаём &amp;quot;switch-case&amp;quot; как в у &amp;quot;MP5&amp;quot; и кешируем звук в &amp;quot;Precache&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;b49z&quot;&gt;Вот и всё.&lt;/p&gt;

</content></entry><entry><id>arbtttrn6:goldsrc-dismovigxemaj-pordoj-multi-manager</id><link rel="alternate" type="text/html" href="https://teletype.in/@arbtttrn6/goldsrc-dismovigxemaj-pordoj-multi-manager?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=arbtttrn6"></link><title>Goldsrc dismoviĝemaj pordoj</title><published>2025-02-07T19:44:57.557Z</published><updated>2025-02-07T22:00:18.800Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/1f/99/1f995dc0-ec5d-453f-bd80-5612758bdb2d.png"></media:thumbnail><category term="half-life" label="HalfLife"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/aa/6d/aa6d8c93-a43b-4a7a-b027-2957fe58c63e.png&quot;&gt;Bazo: Pordoj, kiuj dismoviĝas en flakojn.</summary><content type="html">
  &lt;p id=&quot;r2ST&quot;&gt;Bazo: Pordoj, kiuj dismoviĝas en flakojn.&lt;/p&gt;
  &lt;p id=&quot;RDax&quot;&gt;Ideon kreis kaj realigis NightFox (Discord: &amp;quot;__nightfox&amp;quot;).&lt;/p&gt;
  &lt;figure id=&quot;3KYS&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/6d/aa6d8c93-a43b-4a7a-b027-2957fe58c63e.png&quot; width=&quot;404&quot; /&gt;
    &lt;figcaption&gt;La rezulto. Pordoj dismoviĝas en flankojn kaj post iom da tempo fermiĝas&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PV6w&quot;&gt;1) Krei du &amp;quot;brash&amp;quot;ojn kaj konverti ilin en &amp;quot;func_door&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;UKBS&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/38/05/3805494f-236a-4d93-b5d6-fcd9e4f827e9.png&quot; width=&quot;717&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;tE1X&quot;&gt;2) Doni al du pordoj saman nomon. En ekzemplo ili estas nomitaj kiel &amp;quot;doors&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;oSHQ&quot;&gt;3) Krei &amp;quot;entity&amp;quot;on &amp;quot;multi_manager&amp;quot; kaj doni al ĝi nomon, ekzemple &amp;quot;controller&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;BZgr&quot;&gt;4) Depremi butonon &amp;quot;Smart&amp;quot; kaj aldoni parametron &amp;quot;doors&amp;quot; (nomon de viaj du pordoj) kaj valoron 0.5 — ĉi tio estas tempo laŭ sekundoj ĝis ŝultado de pordoj. Aldoni plu parametron &amp;quot;doors&amp;quot; kun valoro 3 — ĉi tio ankoraŭfoje ŝultos pordojn. Ĉi tio estas &amp;quot;bazaj&amp;quot; necesataj parametroj.&lt;/p&gt;
  &lt;figure id=&quot;LLN9&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9d/ff/9dff67ee-663e-4981-b286-12ba820dde1e.png&quot; width=&quot;559&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ysts&quot;&gt;5) Krei &amp;quot;entity&amp;quot;on &amp;quot;func_button&amp;quot; kaj doni al parametro &amp;quot;Target&amp;quot; nomon de via &amp;quot;multi_manager&amp;quot; (ekz. &amp;quot;controller&amp;quot;). Rigardu, por la parametro &amp;quot;Health&amp;quot; de &amp;quot;func_button&amp;quot; estis 0, ĉar laŭ alia valoro la butono funkcios nur post pafo en ĝi.&lt;/p&gt;
  &lt;figure id=&quot;HOMJ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0c/fc/0cfc688e-30db-4780-869b-aeb15a3f2242.png&quot; width=&quot;559&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TM4o&quot;&gt;6) Kompili mapon kaj rigardi la rezulton en ludo. Nun, dum premado de butono, pordoj malfermos, dismoviĝi en flankojn, kaj fermiĝi. &lt;/p&gt;

</content></entry></feed>