<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>arbtttrn6</title><generator>teletype.in</generator><description><![CDATA[Записываю о всяком полезном и интересном (Иногда)
Skribas mi pri diversa utila kaj interesa (Iafoje)
Pišu o vsakom pomočnom i interesnom (Ponekogda)]]></description><image><url>https://img4.teletype.in/files/3e/31/3e311cc0-a161-449a-b164-71d6d5b916d7.png</url><title>arbtttrn6</title><link>https://teletype.in/@arbtttrn6</link></image><link>https://teletype.in/@arbtttrn6?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/arbtttrn6?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/arbtttrn6?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 15 Apr 2026 23:26:41 GMT</pubDate><lastBuildDate>Wed, 15 Apr 2026 23:26:41 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@arbtttrn6/blender-material_okrugloj-setki</guid><link>https://teletype.in/@arbtttrn6/blender-material_okrugloj-setki?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6</link><comments>https://teletype.in/@arbtttrn6/blender-material_okrugloj-setki?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6#comments</comments><dc:creator>arbtttrn6</dc:creator><title>Материал округлой сетки в Blender</title><pubDate>Wed, 29 Oct 2025 07:49:36 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/42/ec/42ecd125-421c-4f37-8995-f7f8f6599d2f.png"></media:content><category>Vsakosti</category><description><![CDATA[<img src="https://img1.teletype.in/files/84/b7/84b797ad-1f91-4e7d-8ed8-68b222cfaf2c.png"></img>Делаем материал округлой сетки в Blender'е.]]></description><content:encoded><![CDATA[
  <p id="dsWO">Делаем материал округлой сетки в Blender&#x27;е.</p>
  <p id="7i3j">28/10/2025</p>
  <p id="kr1S">Добавить на геометрию материал, который будет решёткой.</p>
  <figure id="0EoV" class="m_custom">
    <img src="https://img1.teletype.in/files/84/b7/84b797ad-1f91-4e7d-8ed8-68b222cfaf2c.png" width="340" />
  </figure>
  <p id="swdk">В редакторе шейдеров используется <em>Principled BSDF</em>.</p>
  <p id="zYN4">За основной цвет отвечает параметр <em>Base Color</em>. В моём случае это <em>#0E0E0E</em>.</p>
  <p id="QdpT">Параметр <em>Specular</em> настраивается по желанию. В моём случае он равен <em>0.330</em>.</p>
  <p id="BJW3">Параметр <em>Roughness</em> также настраивается опционально. В моём случае он равен <em>0.687</em>.</p>
  <p id="t75l">К параметру <em>Alpha</em> узла <em>Principled BSDF</em> подключается параметр <em>Color</em> узла <em>ColorRamp</em>.</p>
  <p id="6rv6">Узел <em>ColorRamp</em> имеет режим цвета <em>RGB</em>, а интерполяция между цветовыми остановками как <em>Constant</em>.</p>
  <p id="0Gda">Цветовая остановка <em>0</em> равна <em>#000000</em> и находится на позиции <em>0.414</em>.</p>
  <p id="U5K2">Цветовая остановка <em>1</em> равна <em>#FFFFFF</em> и находится на позиции <em>0.430</em>.</p>
  <p id="hf4F">К параметру <em>Fac</em> узла <em>ColorRamp</em> подключён параметр <em>Distance</em> узла <em>Voronoi Texture</em>.</p>
  <p id="wTyS">У узла <em>Voronoi Texture</em> параметры: <em>Number of dimensions to output noise</em> равен <em>3D</em>; <em>The voronoi feature that the node will compute</em> равен <em>F1</em>; <em>The distance metric used to compute the texture</em> равен <em>Euclidean</em>.</p>
  <p id="4b03">Параметр <em>Scale</em> узла <em>Voronoi Texture</em> равен <em>74.800</em>.</p>
  <p id="A9vv">От узла <em>Voronoi Texture</em> параметр <em>Distance</em> также отходит к ещё одному узлу <em>ColorRamp</em>, у которого параметры также <em>RGB</em>, <em>Constant</em>. Цветовая остановка <em>0</em> равна <em>#000000</em> и находится на позиции <em>0.253</em>, а цветовая остановка <em>1</em> равна <em>#FFFFFF</em> и находится на позиции <em>0.452</em>.</p>
  <p id="idtr">Параметр этого узла <em>ColorRamp</em> отходит к параметру <em>Height</em> узла <em>Bump</em>.</p>
  <p id="vz26">От узла <em>Bump</em> параметр <em>Normal</em> отходит к одноимённому параметру в узле <em>Principled BSDF</em>.</p>
  <figure id="TBiF" class="m_custom">
    <img src="https://img4.teletype.in/files/f0/8c/f08c7aec-0c5b-4d19-8887-15ae832f1389.png" width="927" />
  </figure>
  <p id="slbn">Чтобы запечь эти текстуры, используется Cycles, где <em>Bake</em> (запекание) выбирается по параметру <em>Bake Type</em> (<em>Diffuse</em> с <em>Influence</em>: <em>Contributions</em>: <em>Color</em>; и <em>Normal</em>).</p>
  <p id="jIFA">При запекании необходимо держать эти текстуры активными.</p>

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@arbtttrn6/goldsrc-entity-pozicija-i-povorot-kak-v-redaktore</guid><link>https://teletype.in/@arbtttrn6/goldsrc-entity-pozicija-i-povorot-kak-v-redaktore?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6</link><comments>https://teletype.in/@arbtttrn6/goldsrc-entity-pozicija-i-povorot-kak-v-redaktore?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6#comments</comments><dc:creator>arbtttrn6</dc:creator><title>Goldsrc: Положение сущностей в игровом мире, соответствующее ихнему в редакторе карт</title><pubDate>Sun, 24 Aug 2025 18:44:31 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/95/ef/95efd553-d751-4d1a-b4cf-7bc177112085.png"></media:content><category>HalfLife</category><description><![CDATA[<img src="https://img2.teletype.in/files/59/10/5910baf3-ba73-4408-aa99-834355d81cb7.png"></img>Суть: По-умолчанию если ставить сущность под углом в редакторе карт, то в самой игре она падает по горизонтали. Решение без готового кода.]]></description><content:encoded><![CDATA[
  <p id="Abug">Суть: По-умолчанию если ставить сущность под углом в редакторе карт, то в самой игре она падает по горизонтали. Решение без готового кода.</p>
  <figure id="9Z39" class="m_retina">
    <img src="https://img2.teletype.in/files/59/10/5910baf3-ba73-4408-aa99-834355d81cb7.png" width="400" />
  </figure>
  <p id="vQbw">Стоит обратить взор на функцию &quot;void CBasePlayerItem::FallThink()&quot;, в которой имеются такие строки:</p>
  <pre id="tqsk" data-lang="cpp">pev-&gt;angles.x = 0;
pev-&gt;angles.z = 0;</pre>
  <p id="lfSO">Эти строки отвечают за горизонтальное положение сущности после её появления в игровом мире, чтобы она там находилась естественно.</p>
  <p id="wKMK">Если их закомментировать/убрать, то модель сохранит свои углы, но при этом упадёт до своего &quot;origin&quot;.</p>
  <p id="EIKO">Есть простое решение в виде создания отдельного параметра, который будет отвечать за отключение/включение падения у сущности. Пусть это будет условное &quot;nophys&quot;.</p>
  <p id="JrwW">По-умолчанию этот параметр равен &quot;false&quot;. В &quot;Spawn&quot; сущности прописываем проверку на &quot;nophys&quot;, если он равен &quot;true&quot;, то — пишем код, подобный на &quot;FallInit()&quot; (кой в том же &quot;weapons.cpp&quot;), но устанавливаем &quot;movetype = NONE&quot;, иначе обычный &quot;FallInit()&quot;.</p>
  <p id="I8Bj">Сущности переписываем собственный &quot;KeyValue&quot; и ловим параметр &quot;nophys&quot; из карты. Как это делается, можно посмотреть в коде различных сущностей.</p>
  <p id="O0Es">В редакторе карт нужной сущности прописываем параметр &quot;nophys&quot; со значением &quot;1&quot;. Собираем карту и видим, что сущность сохранила своё положение, установленное в редакторе карт.</p>
  <hr />
  <p id="fnTs">Прошу оценить заметку; если есть какие-то вопросы и/или пожелания, прошу писать на почтовый ящик &quot;arturaiwasan[@]gmail.com&quot;.</p>
  <p id="YQsg">24.08.2025.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@arbtttrn6/goldsrc_half-life_sdk_thirdperson_vid_ot_tretjego</guid><link>https://teletype.in/@arbtttrn6/goldsrc_half-life_sdk_thirdperson_vid_ot_tretjego?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6</link><comments>https://teletype.in/@arbtttrn6/goldsrc_half-life_sdk_thirdperson_vid_ot_tretjego?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6#comments</comments><dc:creator>arbtttrn6</dc:creator><title>Вид от третьего лица со смещением в Goldsrc</title><pubDate>Thu, 05 Jun 2025 14:14:43 GMT</pubDate><category>HalfLife</category><description><![CDATA[Вид от третьего лица со смещением в Goldsrc. Half-Life SDK.]]></description><content:encoded><![CDATA[
  <p id="pqaE">Суть: Вид от третьего лица со смещением в Goldsrc. Half-Life SDK.</p>
  <p id="JzYM">Задумка и код: <a href="https://github.com/ScriptedSnark" target="_blank">ScriptedSnark</a>. А также немного мелочи от меня.</p>
  <p id="5xkZ">Я добавил включение смещения камеры (и &quot;прицела&quot;) только при виде от третьего лица. Т.е. если переменная &quot;thirdperson&quot; равна 0, то будет обычный вид от первого лица, но если переменная равна 1, то получим и смещение камеры и правильно смещённый прицел.</p>
  <hr />
  <p id="Iu6q">1) В &quot;./cl_dll/in_defs.h&quot; добавить: </p>
  <pre id="ySYD" data-lang="cpp">#define CAM_SHIFT_RIGHT 12.0f</pre>
  <p id="eKUy">Например, если мы хотим сделать смещение камеры на 12 единиц.</p>
  <p id="m1b2">2) В &quot;./dlls/player.cpp&quot; в конце секции включений (includes) добавить:</p>
  <pre id="U15n" data-lang="cpp">#include &quot;../cl_dll/in_defs.h&quot;</pre>
  <p id="9plb">3) В &quot;./dlls/player.cpp&quot; &quot;CBasePlayer::GetGunPosition&quot; привести к следующему виду:</p>
  <pre id="lE1l" data-lang="cpp">Vector CBasePlayer::GetGunPosition()
{
	Vector origin;
	if (cam_thirdperson == true)
	{
		origin = pev-&gt;origin + pev-&gt;view_ofs + gpGlobals-&gt;v_right * CAM_SHIFT_RIGHT;
	}
	else
	{
		origin = pev-&gt;origin + pev-&gt;view_ofs;
	}

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

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

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

        AngleVectors(camAngles, camForward, camRight, camUp);

        for (i = 0; i &lt; 3; i++)
        {
            pparams-&gt;vieworg[i] += -ofs[2] * camForward[i];
            pparams-&gt;vieworg[i] += CAM_SHIFT_RIGHT * camRight[i]; // Добавляем это
        }
    }</pre>
  <p id="9tJn">7) В &quot;./cl_dll/ev_common.cpp&quot; в конце секции с включений добавить:</p>
  <pre id="o0Ms" data-lang="cpp">#include &quot;in_defs.h&quot;</pre>
  <p id="UH7q">8) Там же перед &quot;void EV_GetGunPosition&quot; добавить:</p>
  <pre id="LWjn" data-lang="cpp">extern Vector v_angles;
extern bool cam_thirdperson;</pre>
  <p id="LxrO">9) В &quot;EV_GetGunPosition&quot; добавить:</p>
  <pre id="rlXr" data-lang="cpp">	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);
	}</pre>
  <p id="Mk28">Здесь добавлена проверка на вид от третьего лица.</p>
  <p id="ZiIC">В итоге функция выглядит так:</p>
  <pre id="ACXg" data-lang="cpp">void EV_GetGunPosition(event_args_t* args, float* pos, float* origin)
{
	int idx;

	idx = args-&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; !IS_FIRSTPERSON_SPEC)
		{
			// Grab predicted result for local player
			gEngfuncs.pEventAPI-&gt;EV_LocalPlayerViewheight(view_ofs);
		}
		else if (args-&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);
	}
}</pre>
  <hr />
  <p id="QmZO">Всё. Можно собирать код и смотреть результат.</p>
  <p id="xLiT">Я в своей модификации (Half Effect) временно добавил такие строки в &quot;userconfig.cfg&quot;:</p>
  <pre id="qIm4">alias tps tps1 
alias &quot;tps1&quot; &quot;thirdperson 1; cam_idealdist 25; cam_idealyaw 0; alias tps tps2&quot;
alias &quot;tps2&quot; &quot;firstperson; alias tps tps1&quot;
bind &quot;tab&quot; &quot;tps&quot;</pre>
  <p id="uyfH">По ним по клавише &quot;TAB&quot; происходит переход в вид от третьего лица с расстоянием в 25 и выравниванием угла камеры. При повторном нажатии клавиши &quot;TAB&quot; происходит возврат в вид от первого лица.</p>

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

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

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

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

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

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

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

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

# Выбранный компилятор
studiomdl ./$QC_FILE</pre>
  <p id="Sudb">Рекомендую изучить этот сценарий.</p>
  <p id="GieU">В командной строке (в терминале) вводим:</p>
  <pre id="bAF6" data-lang="bash">build_model.sh AmmoBox01.qc AmmoBox01</pre>
  <p id="pVca">И получаем вывод:</p>
  <pre id="NSI0" data-lang="bash">QC файл &#x27;Ammobox01.qc&#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</pre>
  <p id="zuB3">Модель готова к использованию на картах.</p>
  <p id="X1Pj">Посмотреть модель с помощью &quot;Half-Life Asset Manager&quot;. Чтобы узнать, какой размер модели относительно модели игрока, во вкладке &quot;Model Display&quot; поставить крестик у пункта &quot;Show Player Hitbox&quot;.</p>
  <figure id="h4S2" class="m_column">
    <img src="https://img2.teletype.in/files/9a/5b/9a5ba864-7bd4-41f7-8c60-8e0c0781e667.png" width="781" />
  </figure>
  <p id="AuAo">Вот и всё. Если есть какие-то вопросы, советы или пожелания, пишите в комментариях или на почту: arturaiwasan[собака]gmail.com</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-ramka-obvodka-u-entity</guid><link>https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-ramka-obvodka-u-entity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6</link><comments>https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-ramka-obvodka-u-entity?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6#comments</comments><dc:creator>arbtttrn6</dc:creator><title>Half-Life SDK: Рамка-обводка на выделяемой сущности</title><pubDate>Wed, 05 Mar 2025 13:56:14 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b3/cd/b3cd3174-30a8-4a73-a5e8-56de73284ae7.png"></media:content><category>HalfLife</category><description><![CDATA[<img src="https://img4.teletype.in/files/fe/42/fe426a11-fd44-46fd-82d8-c9ec41a3b105.png"></img>Суть: Рисование рамки вокруг сущности (entity), на которую смотрит игрок.]]></description><content:encoded><![CDATA[
  <p id="mhyR">Суть: Рисование рамки вокруг сущности (entity), на которую смотрит игрок.</p>
  <p id="L3wa">Итоговый результат:</p>
  <figure id="R1kG" class="m_column">
    <img src="https://img4.teletype.in/files/fe/42/fe426a11-fd44-46fd-82d8-c9ec41a3b105.png" width="528" />
  </figure>
  <p id="8jvl"><strong>(!) Кого интересует сразу решение рисования</strong> — может перейти на шаг 7-ой.</p>
  <p id="cMbF">1) В &quot;dlls/player.cpp&quot; получаем ищем нужную сущность. Например в CBasePlayer::UpdateStatusBar(). Сразу после проверки (pEntity-&gt;Classify() == CLASS_PLAYER) пишем:</p>
  <pre id="S74m" data-lang="cpp">else if (pEntity-&gt;Classify() != CLASS_PLAYER) // если сущность НЕ игрок
{
	if (pEntity-&gt;IsAlive()) // если сущность жива
	{
		MESSAGE_BEGIN(MSG_ONE, gmsgNpcHealth, NULL, this-&gt;pev); // gmsgNpcHealth у меня содержит инфу о наблюдаемом NPC вообще
		WRITE_STRING(STRING(pEntity-&gt;pev-&gt;classname)); // имя класса сущности (напр. monster_human_grunt)
		WRITE_SHORT(static_cast&lt;int&gt;(pEntity-&gt;pev-&gt;health)); // здоровье сущности
		WRITE_SHORT(static_cast&lt;int&gt;(pEntity-&gt;pev-&gt;max_health)); // максимальное здоровье сущности
		WRITE_SHORT(ENTINDEX(pEntity-&gt;edict())); // индекс сущности
		MESSAGE_END();
	}
	else // а это на всякий случай
	{
		MESSAGE_BEGIN(MSG_ONE, gmsgNpcHealth, NULL, this-&gt;pev);
		WRITE_STRING(&quot;&quot;);
		WRITE_SHORT(0);
		WRITE_SHORT(0);
		MESSAGE_END();
	}
}</pre>
  <p id="URt9">Нам для дела понадобится только &quot;ENTINDEX(pEntity-&gt;edict())&quot;.</p>
  <p id="jWtE">2) В &quot;dlls/UserMessages.h&quot; в самом конце, после остальных сообщений, пишем:</p>
  <pre id="pvp2" data-lang="cpp">inline int gmsgNpcHealth = 0;</pre>
  <p id="e3As">3) В &quot;dlls/UserMessages.cpp&quot; в функции &quot;LinkUserMessages()&quot; пишем:</p>
  <pre id="P7Gb" data-lang="cpp">gmsgNpcHealth = REG_USER_MSG(&quot;NpcHealth&quot;, -1);</pre>
  <p id="iQJ1">4) В &quot;cl_dll/hud.h&quot; в классе CHudStatusBar (class CHudStatusBar : public CHudBase) пишем (в условный protected):</p>
  <pre id="birj" data-lang="cpp">// Для удобства: в каком порядке отправили из &quot;dlls/player.cpp&quot;, в таком и записываем...
char NPC_Name[256]; // 1 - classname
int NPC_Health; // 2 - health
int NPC_MaxHealth; // 3 - maxhealth
int NPC_Index; // 4 - индекс сущности</pre>
  <p id="DeTw">5) В &quot;cl_dll/statusbar.cpp&quot; в начале файла, например после &quot;DECLARE_MESSAGE(m_StatusBar, StatusValue);&quot; декларируем/объявляем наше сообщение:</p>
  <pre id="vuQF" data-lang="cpp">DECLARE_MESSAGE(m_StatusBar, NpcHealth);</pre>
  <p id="M79t">6) В &quot;cl_dll/statusbar.cpp&quot; где-нибудь в конце пишем код ниже. Здесь мы получаем и читаем содержимое, которое мы отправили в &quot;dlls/player.cpp&quot;.</p>
  <pre id="MvJ3" data-lang="cpp">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] = &#x27;\0&#x27;;

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

	m_iFlags |= HUD_ACTIVE;

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

if (pEntity &amp;&amp; pEntity-&gt;model)
{
	DrawBoundingBox(pEntity);
}</pre>
  <p id="DZeK">где &quot;DrawBoundingBox&quot; это следующая функция:</p>
  <pre id="cWNm" data-lang="cpp">void CHudStatusBar::DrawBoundingBox(cl_entity_t* pEntity)
{
	Vector vecMins = pEntity-&gt;curstate.mins;
	Vector vecMaxs = pEntity-&gt;curstate.maxs;
	Vector vecOrigin = pEntity-&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 &lt; 8; i++)
	{
		Vector corner = vecOrigin;
		corner.x += (i &amp; 1) ? vecMaxs.x : vecMins.x;
		corner.y += (i &amp; 2) ? vecMaxs.y : vecMins.y;
		corner.z += (i &amp; 4) ? vecMaxs.z : vecMins.z;

		float screen[2];

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

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

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

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-neskolko-zvukov-dlja-strelby</guid><link>https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-neskolko-zvukov-dlja-strelby?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6</link><comments>https://teletype.in/@arbtttrn6/half-life-sdk-goldsrc-neskolko-zvukov-dlja-strelby?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=arbtttrn6#comments</comments><dc:creator>arbtttrn6</dc:creator><title>Half-Life SDK: Разнообразные звуки стрельбы</title><pubDate>Sat, 15 Feb 2025 19:12:07 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b0/65/b06510cf-942f-4698-9a5b-4a500b48258a.png"></media:content><category>HalfLife</category><description><![CDATA[<img src="https://img1.teletype.in/files/4f/ef/4fef148e-93d1-4fe7-b474-4da02d488e9d.png"></img>Суть: Несколько звуков стрельбы для оружия.]]></description><content:encoded><![CDATA[
  <p id="9s8K">Суть: Несколько звуков стрельбы для оружия.</p>
  <p id="E4xi">Например, у &quot;MP5&quot; в &quot;dlls/mp5.cpp&quot; в &quot;::Precache()&quot; с помощью операции &quot;PRECACHE_SOUND(...)&quot; взято три звука: &quot;hks(1-3).wav&quot;:</p>
  <pre id="tYvp">    PRECACHE_SOUND(&quot;weapons/hks1.wav&quot;);
    PRECACHE_SOUND(&quot;weapons/hks2.wav&quot;);
    PRECACHE_SOUND(&quot;weapons/hks3.wav&quot;);</pre>
  <p id="F3vW"> Проигрывание звуков в &quot;cl_dlls/ev_hldm.cpp&quot; в функции &quot;EV_FireMP5&quot;:</p>
  <pre id="Lugc">switch (gEngfuncs.pfnRandomLong(0, 1))
	{
	case 0:
		gEngfuncs.pEventAPI-&gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &quot;weapons/hks1.wav&quot;, 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong(0, 0xf));
		break;
	case 1:
		gEngfuncs.pEventAPI-&gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &quot;weapons/hks2.wav&quot;, 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong(0, 0xf));
		break;
	}</pre>
  <p id="GvpE">Здесь ставим свои звуки. Количество проигрываемых звуков регулируем вторым параметром &quot;gEngfuncs.pfnRandomLong(a, b)&quot;. Например, если нужно проиграть три звука, то завместо 1 (единицы) пишем 2 (два) и додаём ещё один &quot;case&quot; (&quot;case 2:&quot;), копируя содержимое других &quot;case&quot;. Только не забудьте додать нужный звук в &quot;PRECACHE_SOUND&quot; в функцию &quot;Precache&quot; нужного оружия.</p>
  <p id="yM9t">Для других оружий всё тоже самое. Например, для &quot;glock&quot; в файле &quot;cl_dlls/ev_hldm.cpp&quot; в функции &quot;EV_FireGlock1&quot;:</p>
  <p id="Tr8C">Вместо:</p>
  <pre id="VwmV">gEngfuncs.pEventAPI-&gt;EV_PlaySound(idx, origin, CHAN_WEAPON, &quot;weapons/pl_gun3.wav&quot;, gEngfuncs.pfnRandomFloat(0.92, 1.0), ATTN_NORM, 0, 98 + gEngfuncs.pfnRandomLong(0, 3));</pre>
  <p id="mc5w">Додаём &quot;switch-case&quot; как в у &quot;MP5&quot; и кешируем звук в &quot;Precache&quot;.</p>
  <p id="b49z">Вот и всё.</p>

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

]]></content:encoded></item></channel></rss>