Резная кость: отдельный инструмент нитей цинерариев (#86)
Новый предмет necroCarvedBone: бедренная кость с железным колпачком, кольцом и светящимися рунами; в руке как нож некроманта, хват всегда нитяной и делает всё то же. Рецепт: кость, 10 кованого железа, щепоть праха; открывается вместе с цинерариями. Иконка, лист книги, тексты на 13 языках. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
96d930e5bb
commit
9d54cab98f
File diff suppressed because one or more lines are too long
@@ -1913,6 +1913,25 @@
|
|||||||
<property name="CustomIconTint" value="150, 205, 255"/>
|
<property name="CustomIconTint" value="150, 205, 255"/>
|
||||||
</item>
|
</item>
|
||||||
</append>
|
</append>
|
||||||
|
<!-- Резная кость (#86, 28.10.2026): отдельный инструмент нитей для урн - делает то же, что нож хватом для нитей
|
||||||
|
(HarmonySrc/CinerariumThreads.cs, IsThreadTool), для тех, кто хват у ножа не нашёл. Наследует нож для нитей:
|
||||||
|
хват 68 + поза рук мода (нож в левой руке), действия ножа перехвачены нитями. В руке лежит ровно как нож:
|
||||||
|
модель - копия префаба ножа со своей сеткой (BlenderWork/necroCarvedBone, Unity NecroCarvedBoneSetup.cs,
|
||||||
|
бандл necroknife): бедренная кость длиной с нож, головка на месте клинка, железный колпачок, кольцо на месте
|
||||||
|
гарды, руны цвета нитей. Новый предмет - сейвов ножа не касается. -->
|
||||||
|
<append xpath="/items">
|
||||||
|
<item name="necroCarvedBone">
|
||||||
|
<property name="Extends" value="necroWpnBladeNecroKnifeThread"/>
|
||||||
|
<property name="CreativeMode" value="Player"/>
|
||||||
|
<property name="Group" value="Tools/Traps,Necromancy"/>
|
||||||
|
<property name="Meshfile" value="#@modfolder(NecromancerTome):Resources/necroknife?necroCarvedBonePrefab.prefab"/>
|
||||||
|
<property name="CustomIcon" value="necroCarvedBone"/>
|
||||||
|
<property name="CustomIconTint" value="255, 255, 255"/>
|
||||||
|
<property name="DescriptionKey" value="necroCarvedBoneDesc"/>
|
||||||
|
<property name="ShowQuality" value="false"/>
|
||||||
|
<property name="EconomicValue" value="0"/>
|
||||||
|
</item>
|
||||||
|
</append>
|
||||||
<!-- Магические ингредиенты (18.10.2026): магическая пыль, хранилище магии (колба-«батарейка» в латунных клеммах с
|
<!-- Магические ингредиенты (18.10.2026): магическая пыль, хранилище магии (колба-«батарейка» в латунных клеммах с
|
||||||
маркировкой MAGIA KONSERVUJO / KAPACITO ✶ 30) и повреждённое хранилище. Пыль - из ступки (4 из повреждённого,
|
маркировкой MAGIA KONSERVUJO / KAPACITO ✶ 30) и повреждённое хранилище. Пыль - из ступки (4 из повреждённого,
|
||||||
30 из целого); пыль - будущий ингредиент камня портала, целое хранилище - деталь батарей/портала, сами хранилища
|
30 из целого); пыль - будущий ингредиент камня портала, целое хранилище - деталь батарей/портала, сами хранилища
|
||||||
|
|||||||
@@ -183,7 +183,7 @@
|
|||||||
<unlock_entry item="necroModKnifeGravesRepose" unlock_tier="4"/>
|
<unlock_entry item="necroModKnifeGravesRepose" unlock_tier="4"/>
|
||||||
<!-- 22.10.2026: урны - одной иконкой с recipes= (как комплекты брони в ванили): в окне навыка у строки только 14 иконок, в группе было 17 - последние урны не показывались («Не все рецепты цинерария доступны»). Клик по иконке - все урны списком. -->
|
<!-- 22.10.2026: урны - одной иконкой с recipes= (как комплекты брони в ванили): в окне навыка у строки только 14 иконок, в группе было 17 - последние урны не показывались («Не все рецепты цинерария доступны»). Клик по иконке - все урны списком. -->
|
||||||
<unlock_entry item="necroModKnifeDarkSense" unlock_tier="5"/>
|
<unlock_entry item="necroModKnifeDarkSense" unlock_tier="5"/>
|
||||||
<unlock_entry item="necroCinerarium" unlock_tier="5" recipes="necroCinerarium,necroCinerariumLogist,necroCinerariumWorker,necroCinerariumRepair,necroCinerariumLoot,necroCinerariumProspector"/>
|
<unlock_entry item="necroCinerarium" unlock_tier="5" recipes="necroCinerarium,necroCarvedBone,necroCinerariumLogist,necroCinerariumWorker,necroCinerariumRepair,necroCinerariumLoot,necroCinerariumProspector"/>
|
||||||
</display_entry>
|
</display_entry>
|
||||||
<!-- Ступенчатая разблокировка внутри группы. ПЕРЕРАСПРЕДЕЛЕНО 2026-09-09: четыре из
|
<!-- Ступенчатая разблокировка внутри группы. ПЕРЕРАСПРЕДЕЛЕНО 2026-09-09: четыре из
|
||||||
шести модов ножа (вода/еда/покой/чутьё) уехали отсюда в группу 1 - см. большой
|
шести модов ножа (вода/еда/покой/чутьё) уехали отсюда в группу 1 - см. большой
|
||||||
|
|||||||
@@ -618,6 +618,13 @@
|
|||||||
<ingredient name="resourceSewingKit" count="1"/>
|
<ingredient name="resourceSewingKit" count="1"/>
|
||||||
<ingredient name="resourceBeeswax" count="2"/>
|
<ingredient name="resourceBeeswax" count="2"/>
|
||||||
</recipe>
|
</recipe>
|
||||||
|
<!-- Резная кость (#86, 28.10.2026) - инструмент нитей: «Рецепт простой - одна кость и 10 железа» (кованое), «В рецепт
|
||||||
|
добавь щепотку праха». В рюкзаке, открывается вместе с урнами (progression.xml, та же строка). -->
|
||||||
|
<recipe name="necroCarvedBone" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl300">
|
||||||
|
<ingredient name="resourceBone" count="1"/>
|
||||||
|
<ingredient name="resourceForgedIron" count="10"/>
|
||||||
|
<ingredient name="resourceZombieAsh" count="5"/>
|
||||||
|
</recipe>
|
||||||
<!-- Урна рабочего (18.10: «Молоток годится») - рецепт урны и молоток; копия на соке чёрной розы. -->
|
<!-- Урна рабочего (18.10: «Молоток годится») - рецепт урны и молоток; копия на соке чёрной розы. -->
|
||||||
<recipe name="necroCinerariumWorker" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl300">
|
<recipe name="necroCinerariumWorker" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl300">
|
||||||
<ingredient name="resourceClayLump" count="30"/>
|
<ingredient name="resourceClayLump" count="30"/>
|
||||||
|
|||||||
@@ -75,14 +75,14 @@ namespace NecromancerTome
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Череп и нож (меч прилива) - модели предметов: в руке и на земле.</summary>
|
/// <summary>Череп, нож (меч прилива) и резная кость (#86) - модели предметов: в руке и на земле.</summary>
|
||||||
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.CloneModel))]
|
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.CloneModel))]
|
||||||
public static class Patch_ItemClass_CloneModel_BundleShaderFix
|
public static class Patch_ItemClass_CloneModel_BundleShaderFix
|
||||||
{
|
{
|
||||||
public static void Postfix(ItemClass __instance, AssetManagement.InstanceHandle<GameObject> __result)
|
public static void Postfix(ItemClass __instance, AssetManagement.InstanceHandle<GameObject> __result)
|
||||||
{
|
{
|
||||||
string n = __instance?.Name;
|
string n = __instance?.Name;
|
||||||
if (n != "necroSkull" && n != SnakeMode.KnifeName)
|
if (n != "necroSkull" && n != SnakeMode.KnifeName && n != CinerariumThreads.BoneName)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
public const string KnifeName = Patch_ItemClass_ExecuteAction_KnifePowerCost.KnifeName;
|
public const string KnifeName = Patch_ItemClass_ExecuteAction_KnifePowerCost.KnifeName;
|
||||||
public const string ThreadKnifeName = "necroWpnBladeNecroKnifeThread";
|
public const string ThreadKnifeName = "necroWpnBladeNecroKnifeThread";
|
||||||
|
/// <summary>Резная кость (#86, 28.10.2026): отдельный инструмент нитей - делает то же, что нож хватом для нитей, хват
|
||||||
|
/// всегда для нитей, меню хватов по R у неё нет. Для тех, кто не нашёл хват у ножа (пользователь: «чтобы игроки, которые
|
||||||
|
/// не обнаружили нитяной хват у ножа, легко могли найти отдельный инструмент управления цинерариями»).</summary>
|
||||||
|
public const string BoneName = "necroCarvedBone";
|
||||||
/// <summary>Как у провода электрики: ItemActionConnectPower.maxWireLength = 15.</summary>
|
/// <summary>Как у провода электрики: ItemActionConnectPower.maxWireLength = 15.</summary>
|
||||||
public const float MaxLength = 15f;
|
public const float MaxLength = 15f;
|
||||||
public const int MaxFrom = 8;
|
public const int MaxFrom = 8;
|
||||||
@@ -51,6 +55,9 @@ namespace NecromancerTome
|
|||||||
return n == SkullDecorPlace.CenterBlock || n == SkullDecorPlace.BackBlock || n == "necroSkullDecor";
|
return n == SkullDecorPlace.CenterBlock || n == SkullDecorPlace.BackBlock || n == "necroSkullDecor";
|
||||||
}
|
}
|
||||||
public static bool IsThreadKnife(ItemClass _i) => _i != null && _i.Name == ThreadKnifeName;
|
public static bool IsThreadKnife(ItemClass _i) => _i != null && _i.Name == ThreadKnifeName;
|
||||||
|
/// <summary>Инструмент нитей в руке: нож хватом для нитей или резная кость.</summary>
|
||||||
|
public static bool IsThreadTool(ItemClass _i) => _i != null && IsThreadToolName(_i.Name);
|
||||||
|
public static bool IsThreadToolName(string _n) => _n == ThreadKnifeName || _n == BoneName;
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
// Хват.
|
// Хват.
|
||||||
@@ -439,7 +446,7 @@ namespace NecromancerTome
|
|||||||
public static bool ToolInHand()
|
public static bool ToolInHand()
|
||||||
{
|
{
|
||||||
EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer();
|
EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer();
|
||||||
return pl != null && CinerariumThreads.IsThreadKnife(pl.inventory?.holdingItem);
|
return pl != null && CinerariumThreads.IsThreadTool(pl.inventory?.holdingItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update()
|
void Update()
|
||||||
@@ -492,7 +499,7 @@ namespace NecromancerTome
|
|||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer();
|
EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer();
|
||||||
if (pl == null || !CinerariumThreads.Start.HasValue || !CinerariumThreads.IsThreadKnife(pl.inventory?.holdingItem))
|
if (pl == null || !CinerariumThreads.Start.HasValue || !CinerariumThreads.IsThreadTool(pl.inventory?.holdingItem))
|
||||||
{
|
{
|
||||||
CinerariumThreads.Cancel();
|
CinerariumThreads.Cancel();
|
||||||
return;
|
return;
|
||||||
@@ -517,13 +524,13 @@ namespace NecromancerTome
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Нож для нитей не бьёт: ЛКМ и ПКМ - нити (на отпускание кнопки).</summary>
|
/// <summary>Нож для нитей и резная кость не бьют: ЛКМ и ПКМ - нити (на отпускание кнопки).</summary>
|
||||||
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.ExecuteAction))]
|
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.ExecuteAction))]
|
||||||
public static class Patch_ItemClass_ExecuteAction_ThreadKnife
|
public static class Patch_ItemClass_ExecuteAction_ThreadKnife
|
||||||
{
|
{
|
||||||
public static bool Prefix(ItemClass __instance, int _actionIdx, ItemInventoryData _data, bool _bReleased)
|
public static bool Prefix(ItemClass __instance, int _actionIdx, ItemInventoryData _data, bool _bReleased)
|
||||||
{
|
{
|
||||||
if (!CinerariumThreads.IsThreadKnife(__instance))
|
if (!CinerariumThreads.IsThreadTool(__instance))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
// Только от первого лица (16.10: «В виде от третьего лица что-то страшное»): поза и перенос ножа - для рук первого
|
// Только от первого лица (16.10: «В виде от третьего лица что-то страшное»): поза и перенос ножа - для рук первого
|
||||||
// лица; от третьего лица модель в руке - у тела, и нож улетал к невидимой руке первого лица.
|
// лица; от третьего лица модель в руке - у тела, и нож улетал к невидимой руке первого лица.
|
||||||
if (_player != null && _player.inventory?.holdingItem?.Name == CinerariumThreads.ThreadKnifeName &&
|
if (_player != null && CinerariumThreads.IsThreadToolName(_player.inventory?.holdingItem?.Name) &&
|
||||||
(_player.emodel as EModelSDCS)?.IsFPV == true && !SnakeMode.Active && !MindPalace.Active && !Possession.Active && !_player.IsDead())
|
(_player.emodel as EModelSDCS)?.IsFPV == true && !SnakeMode.Active && !MindPalace.Active && !Possession.Active && !_player.IsDead())
|
||||||
{
|
{
|
||||||
if (_threadSince < 0f)
|
if (_threadSince < 0f)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace NecromancerTome
|
|||||||
}
|
}
|
||||||
foreach (EntityPlayer p in w.Players.list)
|
foreach (EntityPlayer p in w.Players.list)
|
||||||
{
|
{
|
||||||
if (p == null || p.inventory?.holdingItem?.Name != CinerariumThreads.ThreadKnifeName || p.emodel == null ||
|
if (p == null || !CinerariumThreads.IsThreadToolName(p.inventory?.holdingItem?.Name) || p.emodel == null ||
|
||||||
p.emodel.IsFPV && !p.isEntityRemote)
|
p.emodel.IsFPV && !p.isEntityRemote)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -74,7 +74,7 @@ namespace NecromancerTome
|
|||||||
|
|
||||||
public static bool Applies(EntityAlive _e)
|
public static bool Applies(EntityAlive _e)
|
||||||
{
|
{
|
||||||
return TpHold > 0 && _e != null && _e.inventory?.holdingItem?.Name == CinerariumThreads.ThreadKnifeName;
|
return TpHold > 0 && _e != null && CinerariumThreads.IsThreadToolName(_e.inventory?.holdingItem?.Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 623 KiB After Width: | Height: | Size: 631 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
Reference in New Issue
Block a user