Нож некроманта и Кровь некроманта получили собственные модели, а Пирамида духов - собственную поверхность. Три разных способа, каждый выбран по тому, как устроен сам предмет. НОЖ И КРОВЬ - свои префабы в бандлах мода. Форма записи "#@modfolder(...)?prefab" подтверждена живым примером; геометрия у обоих ванильная, меняются материал и текстура. Текстуры генерируются скриптами (см. _private/tools), а не рисуются: правка вида сводится к правке констант и одному запуску. Нож: состаренная кость, почти чёрная обмотка, пурпур во впадинах, плюс слой под ручную роспись рун - он подмешивается в альбедо и в эмиссию, поэтому руны светятся. Слой пользовательский, генератор его никогда не перезаписывает. Положение росписи посчитано по геометрии: развёртка выгружена из меша, и подобрано смещение, при котором вся роспись ложится на одну плоскую грань. Раньше она перегибалась через кромку, обращённую к игроку. Кровь: банка вместо мешка. Заодно чинится расхождение, жившее с самого начала - описание предмета говорило "Банка, наполненная кровью", а наследуемый medicalBloodBag показывал sackPrefab, обычный мешок. Жидкость перерисована по маскам мешей, а не перекрашена тинтом: тинт предмета на этот меш не действует вовсе, у шейдера Game_EntityTintMaskSSS выигрывает _Color материала. ПИРАМИДА - своя краска в атласе блоков через собственный Harmony-патч. Ваниль своих текстур блоков не умеет: Texture у блока это индекс в готовом атласе, а запись краски несёт только TextureId/PaintCost/Group/SortIndex и никогда путь к картинке. Поэтому CustomBlockPaintPatch дописывает наш слой в массивы атласа на лету. Путь через свою модель (Shape="ModelEntity") пробовался и отложен: там остались нерешёнными столкновения и маджента на дальних экземплярах. Краска лучше тем, что блок остаётся обычным Shape="New" - со всеми работающими столкновениями, наведением по E и правильной посадкой, - а поверхность у него своя. Побочно краска доступна кисточкой под именем "Некротический прах". Параметры атласа не угаданы, а замерены в игре (BlockAtlasProbePatch): 512x512, DXT1 для альбедо и DXT5 для нормалей со specular, 10 мип-уровней, массивы нечитаемые - отсюда GPU-копирование и явные настройки импорта текстур. Зонд оставлен намеренно: номер краски в blocks.xml (608) это длина ванильного uvMapping, и после обновления игры он может сдвинуться - зонд печатает фактические числа при каждом запуске. Патчи обёрнуты целиком: они работают внутри загрузки игры, где вылетевшее исключение срывает шаг загрузки. Resources/necropyramid в коммит не идёт - на него никто не ссылается. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5F3AVwsusZHMqPBcSQcVJ
79 lines
4.0 KiB
XML
79 lines
4.0 KiB
XML
<Project Sdk="Microsoft.NET.Sdk">
|
|
|
|
<PropertyGroup>
|
|
<TargetFramework>netstandard2.1</TargetFramework>
|
|
<AssemblyName>NecromancerHarmony</AssemblyName>
|
|
<RootNamespace>NecromancerTome</RootNamespace>
|
|
<LangVersion>latest</LangVersion>
|
|
<Nullable>disable</Nullable>
|
|
<!-- The DLL is loaded straight out of the mod folder by the game, not via NuGet/deps.json. -->
|
|
<GenerateDependencyFile>false</GenerateDependencyFile>
|
|
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
|
<OutputPath>bin\</OutputPath>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup>
|
|
<!-- Game/Harmony assemblies: compile-time only, never copied into our output (they already
|
|
exist where the game loads them from). -->
|
|
<Reference Include="0Harmony">
|
|
<HintPath>..\..\0_TFP_Harmony\0Harmony.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<Reference Include="Assembly-CSharp">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\Assembly-CSharp.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<Reference Include="UnityEngine.CoreModule">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\UnityEngine.CoreModule.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<Reference Include="UnityEngine.ParticleSystemModule">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\UnityEngine.ParticleSystemModule.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<!-- Collider/Physics.IgnoreCollision for SummonPatch.cs's "pet passes through its owner"
|
|
(user request 2026-08-28) - lives in its own module, not CoreModule. -->
|
|
<Reference Include="UnityEngine.PhysicsModule">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\UnityEngine.PhysicsModule.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<!-- EntityAlive.PlayOneShot(string)'s own overload set touches AnimationEvent (2026-08-29,
|
|
BansheePatch.cs) - needed even though this mod never uses AnimationEvent directly, just
|
|
to satisfy the compiler's reference-resolution for that overload. -->
|
|
<Reference Include="UnityEngine.AnimationModule">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\UnityEngine.AnimationModule.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<!-- AssetBundle.LoadFromFile for CustomBlockPaintPatch.cs (2026-09-10) - the mod ships its
|
|
own block paint textures in Resources/necroatlas, and Unity keeps bundle loading in its
|
|
own module rather than CoreModule. -->
|
|
<Reference Include="UnityEngine.AssetBundleModule">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\UnityEngine.AssetBundleModule.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<!-- PlayerActionsLocal.Secondary (PlayerAction) for PortalStonePatch.cs's power-attack
|
|
channel-cancel (2026-08-29) - the game's own input layer, not something this mod
|
|
previously needed to touch directly. -->
|
|
<Reference Include="InControl">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\InControl.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<!-- UnityEngine.Input (raw mouse polling) for the same channel-cancel fix - Unity split
|
|
Input into its own module, not part of CoreModule. -->
|
|
<Reference Include="UnityEngine.InputLegacyModule">
|
|
<HintPath>..\..\..\7DaysToDie_Data\Managed\UnityEngine.InputLegacyModule.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
<!-- PyramidWardPatch.cs's TEFeaturePyramidWard.Write() calls into this instead of
|
|
PooledBinaryWriter.Write directly - see TEPersistenceSrc/NecromancerTEPersistence.csproj's
|
|
own comment for why that call can't compile in THIS project at all. Private=false: it's
|
|
built and deployed separately (its own dotnet build + copy to the mod root), same as
|
|
0Harmony above - not something this project's own build should try to copy/rebuild. -->
|
|
<Reference Include="NecromancerTEPersistence">
|
|
<HintPath>..\TEPersistenceSrc\bin\NecromancerTEPersistence.dll</HintPath>
|
|
<Private>false</Private>
|
|
</Reference>
|
|
</ItemGroup>
|
|
|
|
</Project>
|