Книга некроманта 1.0 — первая публичная версия

Мод для 7 Days to Die 3.2: навык «Некромантия», растущий от счётчика убитых
зомби, тёмное оружие с шестью собственными модами, призывная нежить, пирамида
духов и сюжетный финал через Чёрный портал. Локализация на 13 языках.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MaNro5hAGTzcQ7rJNN2tCX
This commit is contained in:
Alex Cube
2026-09-09 21:13:03 +03:00
co-authored by Claude Opus 5
commit e8f064f5ec
102 changed files with 7010 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
<config>
<!-- "Пирамида Ереси" (Pyramid of Heresy) - user request 2026-08-31: a placeable ward that
periodically applies the existing Deviator charm (see HarmonySrc/PyramidWardPatch.cs,
reusing HarmonySrc/CharmPatch.cs's buffNecroDeviatorCharm wholesale - no new charm logic
was written, this just triggers the same buff on a timer) to any un-charmed zombie that
wanders into its radius, turning it against other zombies instead of the player/base - a
"barrier" in effect, not in physics: it never pushes or physically blocks anything, it
flips allegiance.
SHAPE: Shape="New" + Model="@:Shapes/pyramid.fbx" - the same standalone pyramid mesh
vanilla itself ships and uses for imposterPyramid's own LOD model (Data/Config/blocks.xml,
"*** blockNextGen imposters" section) - a real, solid, always-loaded asset, not invented
for this mod. Checked the "tentBiohazardRoofXxx" tent-roof pieces first (they're the
nearest thing to a "block with a pyramid top" already in vanilla) but rejected them - all
of them are 3x1x1/3x2x3 multi-blocks meant as building-sized tent roofs, wrong shape/scale
for a single placeable ward. Red per the user's request via TintColor="8A4142" - the exact
hex vanilla's own tentBiohazardRoofRed/tentBiohazardRoofCenterRed use for their red tint,
reused here rather than inventing a new one.
FIXED 2026-08-31 (user report: placed fine but genuinely invisible - "нету префаба"):
missing `Texture` property. EVERY vanilla block using this exact Shape="New" + a custom
standalone Model="@:Shapes/....fbx" (imposterPyramid itself, imposterQuarter,
imposterCTREighth, poiFillerBlock - checked all of them directly) always pairs it with an
explicit `Texture="N"` atlas index; ours never had one, which is the real, simple root
cause. Also switched Material from plain "Msteel" to "Msteel_shapes" + Texture="356" -
the exact Material/Texture pair vanilla's own `steelShapes` block (the real "shapes=All"
steel building family) uses for this same "New" shape renderer - plain "Msteel" is meant
for non-shape steel blocks (doors, hatches) and was never a matched pair with Shape="New"
to begin with. TintColor="8A4142" still multiplies on top as before.
User specifically asked to reuse the "Пирамида 1 м" ("Pyramid 1m") shape/prefab -
genuinely tried, but that specific shape turned out to be a NAMED VARIANT of the engine's
procedural multi-shape building system (`shapes="All"` blocks like `steelShapes`/
`concreteShapes` - see those in vanilla blocks.xml), not a standalone asset with its own
file path at all: decompiled `BlockShapeNew` (the C# class behind every Shape="New" block)
directly and it contains NO "Pyramid" string anywhere - the mapping from a shape's display
name to its actual geometry lives in compiled/binary shape-node data this decompile
couldn't reach, not in anything grep-able or copyable as a `Model=` path. Reproducing that
exact shape would mean reverse-engineering that binary shape data, real extra work with an
uncertain payoff - what shipped instead is the closest already-proven-working equivalent:
the same "New"-shape pyramid mesh `imposterPyramid` itself uses, now actually configured
correctly (see the fix above) so it renders for real. If the proportions look wrong next to
the in-game "Pyramid 1m" (e.g. too tall/full-block instead of a short 1m cap), that's a
scale tweak once it's visible, not a rendering bug - say so and it can be resized.
REWRITTEN 2026-09-01, Class changed from none to Class="CompositeTileEntity" +
CompositeFeatures/TEFeaturePyramidWard - two direct user findings drove this:
1. "Навожу прицел, но подсказка про E не появляется" - the original plain-Block +
Harmony-patches-on-Block approach never showed the E-prompt at all, because a
SEPARATE gate method (Block.HasBlockActivationCommands) was never patched and always
said "nothing to activate" for a plain decorative block.
2. "Сделай TileEntity" - direct request for the effect/zone toggle state to actually
survive a save/reload, which the old static-Dictionary-in-Harmony-patch version could
not do at all (documented as a known caveat before, now actually fixed).
Same syntax vanilla's own keystoneBlock (Land Claim) already uses for this exact
Class="CompositeTileEntity" + CompositeFeatures pattern - see HarmonySrc/
PyramidWardPatch.cs's own class doc comment on TEFeaturePyramidWard for the full decompiled
reasoning (why this is the sanctioned extension point, not a hardcoded-switch hack; the
E-menu/persistence/per-tick mechanics all live there now, not in this XML file). -->
<append xpath="/blocks">
<block name="necroHeresyPyramid">
<property name="CreativeMode" value="Player" />
<property name="DescriptionKey" value="necroHeresyPyramidDesc" />
<property name="Class" value="CompositeTileEntity" />
<property class="CompositeFeatures">
<property class="TEFeaturePyramidWard" />
</property>
<property name="Material" value="Msteel_shapes" />
<property name="Shape" value="New" />
<property name="Model" value="@:Shapes/pyramid.fbx" />
<property name="Texture" value="356" />
<property name="TintColor" value="8A4142" />
<!-- Real generated art (exch/pyramidOfSpirit.png, copied to
UIAtlases/ItemIconAtlas/) added 2026-09-02, per direct instruction - no
CustomIconTint alongside it (same lesson as every other real icon in this mod,
e.g. resourceZombieAsh: a real drawn icon already has its own correct color, tinting
it on top would recolor it unintentionally). TintColor above is unaffected - that's
the 3D block MESH's tint, a completely separate thing from the 2D inventory icon. -->
<property name="CustomIcon" value="pyramidOfSpirit" />
<property name="Group" value="Decoration" />
<property name="FilterTags" value="MC_building,SC_decor" />
<property name="Collide" value="movement,melee,bullet,arrow,rocket" />
<property name="StabilitySupport" value="false" />
<property name="MaxDamage" value="2000" />
<property name="EconomicValue" value="0" />
<property name="SellableToTrader" value="false" />
<drop event="Destroy" name="resourceScrapIron" count="10,20" />
</block>
</append>
</config>