1.4.1: утечка видеопамяти от трупов «Жертвы», труп лежит 5 минут
Было: CorpseLootPatch перекрашивал труп через renderer.materials и Tint(), и ничего за собой не убирал. Копии материалов Unity с объектом не удаляет, перекрашенная текстура была несжатой RGBA32 (16-64 МБ) и читаемой (копия ещё и в RAM), кеш только рос. Лог игры: Texture.currentTextureMemory 1,2 -> 7,4 ГБ за два часа при desired ~3,5 ГБ, FPS 60 -> 11. Те же жалобы на Nexus (sanovskiy, Kriloko, Megaladon43). Стало: каждый перекрашенный труп записан (рендереры, материалы, текстуры), тик раз в секунду удаляет всё за трупом, которого нет в мире, текстура удаляется со счётчиком пользователей. Текстура не больше 1024, DXT, makeNoLongerReadable. Проверено в игре: обыск и истечение срока доводят счёт до «трупов 0, текстур 0». Необысканный труп лежит 300 с вместо 3600 (указание пользователя). buffNecroZombieKillTrackerDisplay: update_rate .1 -> 1 (отзыв zomb1); урон ножа растёт после убийства, проверено. Документы: версия 1.4.1, README (статус + несовместимость с 3.3 experimental), описания Nexus и сайта (пять минут вместо часа), NEXUS_CHANGELOG/FILE_SUMMARY_1.4.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
67dd410358
commit
77b56be9ae
+6
-2
@@ -30,12 +30,16 @@
|
|||||||
<buff name="buffNecroZombieKillTrackerDisplay" icon="ui_game_symbol_skull" icon_color="150,0,0" name_key="buffNecroZombieKillTrackerDisplayName" description_key="buffNecroZombieKillTrackerDisplayDesc">
|
<buff name="buffNecroZombieKillTrackerDisplay" icon="ui_game_symbol_skull" icon_color="150,0,0" name_key="buffNecroZombieKillTrackerDisplayName" description_key="buffNecroZombieKillTrackerDisplayDesc">
|
||||||
<stack_type value="ignore"/>
|
<stack_type value="ignore"/>
|
||||||
<duration value="0"/>
|
<duration value="0"/>
|
||||||
<update_rate value=".1"/>
|
<!-- Было ".1" (10 раз в секунду). 2026-09-24 стало "1" по отзыву zomb1 на Nexus
|
||||||
|
(подозревал в этом падение FPS): тик только пересчитывает урон ножа из числа
|
||||||
|
убийств, а оно меняется лишь при убийстве - после убийства урон догоняет не позже
|
||||||
|
чем через секунду. -->
|
||||||
|
<update_rate value="1"/>
|
||||||
<display_value value="necroNecromancyLevelCVar"/>
|
<display_value value="necroNecromancyLevelCVar"/>
|
||||||
|
|
||||||
<!-- Нож некроманта (BACKLOG.md item 5, user request 2026-08-28): "урон умножается на
|
<!-- Нож некроманта (BACKLOG.md item 5, user request 2026-08-28): "урон умножается на
|
||||||
скилл некроманта ... и делится на 10". Computed here (this buff already ticks
|
скилл некроманта ... и делится на 10". Computed here (this buff already ticks
|
||||||
10x/sec on every player via update_rate) rather than on the knife item itself,
|
once a second - 10x/sec before 1.4.1 - on every player via update_rate) rather than on the knife item itself,
|
||||||
since a held item has no update tick of its own - reading a live CVar from a
|
since a held item has no update tick of its own - reading a live CVar from a
|
||||||
passive_effect (confirmed working: vanilla's own $PlayerLevelBonus, computed in
|
passive_effect (confirmed working: vanilla's own $PlayerLevelBonus, computed in
|
||||||
buffs.xml and read elsewhere via passive_effect value="@$PlayerLevelBonus") needs
|
buffs.xml and read elsewhere via passive_effect value="@$PlayerLevelBonus") needs
|
||||||
|
|||||||
@@ -54,9 +54,11 @@ namespace NecromancerTome
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class CorpseLoot
|
public static class CorpseLoot
|
||||||
{
|
{
|
||||||
/// <summary>Сколько секунд лежит помеченный труп. У ванильного мешка с лутом 3600, и
|
/// <summary>Сколько секунд лежит помеченный труп. В 1.4.0 было 3600, как у ванильного мешка с
|
||||||
/// причин быть скромнее нет: труп и есть мешок.</summary>
|
/// лутом; 2026-09-24 уменьшено до 5 минут по указанию пользователя: «если игрок не будет
|
||||||
public const float CorpseSecondsAfterDeath = 3600f;
|
/// убирать, у него FPS начнёт падать» - каждый лежащий труп это отрисовываемая модель со
|
||||||
|
/// своими копиями материалов, а необобранных за час набирается много.</summary>
|
||||||
|
public const float CorpseSecondsAfterDeath = 300f;
|
||||||
|
|
||||||
/// <summary>Во что красится труп. Тёмно-багровый: издалека видно, что этот не как все, и
|
/// <summary>Во что красится труп. Тёмно-багровый: издалека видно, что этот не как все, и
|
||||||
/// при этом не выглядит подсветкой из другой игры.</summary>
|
/// при этом не выглядит подсветкой из другой игры.</summary>
|
||||||
@@ -81,9 +83,42 @@ namespace NecromancerTome
|
|||||||
/// кадре, когда сущность умирает. Добивается односекундным тиком PetFollowPatch.</summary>
|
/// кадре, когда сущность умирает. Добивается односекундным тиком PetFollowPatch.</summary>
|
||||||
public static readonly HashSet<int> PendingTint = new HashSet<int>();
|
public static readonly HashSet<int> PendingTint = new HashSet<int>();
|
||||||
|
|
||||||
|
/// <summary>УТЕЧКА ПАМЯТИ, НАЙДЕНА 2026-09-24 (жалоба: «память течёт, лечится только
|
||||||
|
/// перезапуском»). Версия 1.4.0 перекрашивала труп и НИЧЕГО за собой не убирала:
|
||||||
|
///
|
||||||
|
/// - `renderer.materials` создаёт копии материалов, и Unity НЕ удаляет их вместе с
|
||||||
|
/// объектом - они живут до перезапуска;
|
||||||
|
/// - перекрашенная текстура создавалась несжатой (RGBA32, 16-64 МБ на штуку) и оставалась
|
||||||
|
/// читаемой, то есть лежала дважды - в видеопамяти и копией в оперативной;
|
||||||
|
/// - кеш текстур только рос.
|
||||||
|
///
|
||||||
|
/// Лог игры (`60sec delta: ... current: ..., desired: ...` - это Texture.currentTextureMemory)
|
||||||
|
/// показал рост видеопамяти текстур с 1,2 до 7,4 ГБ за два часа при нужных игре ~3,5 ГБ, и
|
||||||
|
/// FPS упал с 60 до 11. За сессию было перекрашено 53 трупа по 4-10 материалов.
|
||||||
|
///
|
||||||
|
/// Теперь каждый перекрашенный труп записан здесь вместе с копиями материалов и текстурами,
|
||||||
|
/// а тик раз в секунду (ReleaseGoneCorpses) убирает за теми, кого уже нет. Текстура
|
||||||
|
/// удаляется, когда её не использует ни один труп.</summary>
|
||||||
|
public class TintedCorpse
|
||||||
|
{
|
||||||
|
public readonly List<Renderer> Renderers = new List<Renderer>();
|
||||||
|
public readonly List<Material> Materials = new List<Material>();
|
||||||
|
public readonly List<Texture2D> Textures = new List<Texture2D>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly Dictionary<int, TintedCorpse> Tinted = new Dictionary<int, TintedCorpse>();
|
||||||
|
|
||||||
|
/// <summary>Сколько трупов сейчас носит каждую перекрашенную текстуру.</summary>
|
||||||
|
public static readonly Dictionary<Texture2D, int> TextureUsers = new Dictionary<Texture2D, int>();
|
||||||
|
|
||||||
|
/// <summary>Предел стороны перекрашенной текстуры. Исходные 2048-4096; труп рассматривают
|
||||||
|
/// вблизи, но 1024 со сжатием это ~1 МБ вместо 16-64 МБ, и разница на глаз незаметна.</summary>
|
||||||
|
public const int MaxTintSize = 1024;
|
||||||
|
|
||||||
/// <summary>Повторная попытка перекраски. Зовётся из общего тика раз в секунду.</summary>
|
/// <summary>Повторная попытка перекраски. Зовётся из общего тика раз в секунду.</summary>
|
||||||
public static void RetryPendingTints(World _world)
|
public static void RetryPendingTints(World _world)
|
||||||
{
|
{
|
||||||
|
ReleaseGoneCorpses(_world);
|
||||||
if (PendingTint.Count == 0 || _world == null)
|
if (PendingTint.Count == 0 || _world == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -103,6 +138,92 @@ namespace NecromancerTome
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>Уборка за исчезнувшими трупами. Трупом считается исчезнувшим, когда его нет в
|
||||||
|
/// мире И уничтожены все его рендереры: удалять материал, который ещё рисуется, нельзя.</summary>
|
||||||
|
public static void ReleaseGoneCorpses(World _world)
|
||||||
|
{
|
||||||
|
if (Tinted.Count == 0 || _world == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<int> gone = null;
|
||||||
|
foreach (KeyValuePair<int, TintedCorpse> pair in Tinted)
|
||||||
|
{
|
||||||
|
if (_world.GetEntity(pair.Key) != null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
bool rendered = false;
|
||||||
|
foreach (Renderer renderer in pair.Value.Renderers)
|
||||||
|
{
|
||||||
|
if (renderer != null)
|
||||||
|
{
|
||||||
|
rendered = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rendered)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (gone == null)
|
||||||
|
{
|
||||||
|
gone = new List<int>();
|
||||||
|
}
|
||||||
|
gone.Add(pair.Key);
|
||||||
|
}
|
||||||
|
if (gone == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach (int id in gone)
|
||||||
|
{
|
||||||
|
TintedCorpse corpse = Tinted[id];
|
||||||
|
Tinted.Remove(id);
|
||||||
|
SearchableCorpses.Remove(id);
|
||||||
|
foreach (Material material in corpse.Materials)
|
||||||
|
{
|
||||||
|
if (material != null)
|
||||||
|
{
|
||||||
|
UnityEngine.Object.Destroy(material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (Texture2D texture in corpse.Textures)
|
||||||
|
{
|
||||||
|
ReleaseTexture(texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Debug.Log("[NecromancerTome] CorpseLoot: убрано за исчезнувшими трупами: " + gone.Count +
|
||||||
|
", осталось трупов " + Tinted.Count + ", текстур " + TextureUsers.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ReleaseTexture(Texture2D _texture)
|
||||||
|
{
|
||||||
|
if (_texture == null || !TextureUsers.TryGetValue(_texture, out int users))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (users > 1)
|
||||||
|
{
|
||||||
|
TextureUsers[_texture] = users - 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TextureUsers.Remove(_texture);
|
||||||
|
List<Texture> keys = new List<Texture>();
|
||||||
|
foreach (KeyValuePair<Texture, Texture2D> pair in TintedTextures)
|
||||||
|
{
|
||||||
|
if (pair.Value == _texture)
|
||||||
|
{
|
||||||
|
keys.Add(pair.Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (Texture key in keys)
|
||||||
|
{
|
||||||
|
TintedTextures.Remove(key);
|
||||||
|
}
|
||||||
|
UnityEngine.Object.Destroy(_texture);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool IsSearchable(Entity _entity)
|
public static bool IsSearchable(Entity _entity)
|
||||||
{
|
{
|
||||||
return _entity != null && SearchableCorpses.Contains(_entity.entityId);
|
return _entity != null && SearchableCorpses.Contains(_entity.entityId);
|
||||||
@@ -165,6 +286,11 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!Tinted.TryGetValue(_corpse.entityId, out TintedCorpse record))
|
||||||
|
{
|
||||||
|
record = new TintedCorpse();
|
||||||
|
Tinted[_corpse.entityId] = record;
|
||||||
|
}
|
||||||
int tinted = 0;
|
int tinted = 0;
|
||||||
foreach (Renderer renderer in renderers)
|
foreach (Renderer renderer in renderers)
|
||||||
{
|
{
|
||||||
@@ -177,7 +303,13 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// Копии материалов создаются этой строкой, и все они теперь наши - записываем
|
||||||
|
// каждую, даже ту, что перекрасить не удалось: удалять её тоже нам.
|
||||||
Material[] instances = renderer.materials;
|
Material[] instances = renderer.materials;
|
||||||
|
if (!record.Renderers.Contains(renderer))
|
||||||
|
{
|
||||||
|
record.Renderers.Add(renderer);
|
||||||
|
}
|
||||||
for (int i = 0; i < instances.Length && i < shared.Length; i++)
|
for (int i = 0; i < instances.Length && i < shared.Length; i++)
|
||||||
{
|
{
|
||||||
Material material = instances[i];
|
Material material = instances[i];
|
||||||
@@ -185,6 +317,10 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!record.Materials.Contains(material))
|
||||||
|
{
|
||||||
|
record.Materials.Add(material);
|
||||||
|
}
|
||||||
string albedo = GhostTraderPatch.FindAlbedoProperty(material);
|
string albedo = GhostTraderPatch.FindAlbedoProperty(material);
|
||||||
if (albedo == null)
|
if (albedo == null)
|
||||||
{
|
{
|
||||||
@@ -196,6 +332,9 @@ namespace NecromancerTome
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
material.SetTexture(albedo, repainted);
|
material.SetTexture(albedo, repainted);
|
||||||
|
record.Textures.Add(repainted);
|
||||||
|
TextureUsers.TryGetValue(repainted, out int users);
|
||||||
|
TextureUsers[repainted] = users + 1;
|
||||||
tinted++;
|
tinted++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -222,13 +361,19 @@ namespace NecromancerTome
|
|||||||
RenderTexture previous = RenderTexture.active;
|
RenderTexture previous = RenderTexture.active;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
rt = RenderTexture.GetTemporary(_source.width, _source.height, 0,
|
// Уменьшение идёт бесплатно, самим Blit в RenderTexture меньшего размера. Стороны
|
||||||
|
// кратны четырём - иначе Compress ниже откажется сжимать.
|
||||||
|
float scale = Mathf.Min(1f, (float)MaxTintSize / Mathf.Max(_source.width, _source.height));
|
||||||
|
int width = Mathf.Max(4, (int)(_source.width * scale) / 4 * 4);
|
||||||
|
int height = Mathf.Max(4, (int)(_source.height * scale) / 4 * 4);
|
||||||
|
|
||||||
|
rt = RenderTexture.GetTemporary(width, height, 0,
|
||||||
RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB);
|
RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB);
|
||||||
Graphics.Blit(_source, rt);
|
Graphics.Blit(_source, rt);
|
||||||
RenderTexture.active = rt;
|
RenderTexture.active = rt;
|
||||||
|
|
||||||
painted = new Texture2D(_source.width, _source.height, TextureFormat.RGBA32, false);
|
painted = new Texture2D(width, height, TextureFormat.RGBA32, false);
|
||||||
painted.ReadPixels(new Rect(0f, 0f, _source.width, _source.height), 0, 0);
|
painted.ReadPixels(new Rect(0f, 0f, width, height), 0, 0);
|
||||||
|
|
||||||
Color32[] pixels = painted.GetPixels32();
|
Color32[] pixels = painted.GetPixels32();
|
||||||
for (int i = 0; i < pixels.Length; i++)
|
for (int i = 0; i < pixels.Length; i++)
|
||||||
@@ -240,12 +385,19 @@ namespace NecromancerTome
|
|||||||
pixels[i] = p;
|
pixels[i] = p;
|
||||||
}
|
}
|
||||||
painted.SetPixels32(pixels);
|
painted.SetPixels32(pixels);
|
||||||
painted.Apply(false, false);
|
// Сжатие в DXT (вчетверо-восьмеро меньше RGBA32) и makeNoLongerReadable=true: без
|
||||||
|
// него копия пикселей оставалась в оперативной памяти рядом с видеопамятью.
|
||||||
|
painted.Compress(false);
|
||||||
|
painted.Apply(false, true);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.LogError("[NecromancerTome] CorpseLoot: не удалось перекрасить текстуру '" +
|
Debug.LogError("[NecromancerTome] CorpseLoot: не удалось перекрасить текстуру '" +
|
||||||
_source.name + "': " + e.Message);
|
_source.name + "': " + e.Message);
|
||||||
|
if (painted != null)
|
||||||
|
{
|
||||||
|
UnityEngine.Object.Destroy(painted);
|
||||||
|
}
|
||||||
painted = null;
|
painted = null;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
|||||||
+1
-1
@@ -4,6 +4,6 @@
|
|||||||
<DisplayName value="Necromancer's Tome" />
|
<DisplayName value="Necromancer's Tome" />
|
||||||
<Description value="A dark necromancy progression for 7 Days to Die 3.2: a kill-count-driven skill tree with cursed weapons, charm/deviation magic, undead companions that keep station with you and attack what you point at, base-defence wards, and a story-ending Black Portal ritual. Fully localized into 13 languages. Single-player; requires EAC off." />
|
<Description value="A dark necromancy progression for 7 Days to Die 3.2: a kill-count-driven skill tree with cursed weapons, charm/deviation magic, undead companions that keep station with you and attack what you point at, base-defence wards, and a story-ending Black Portal ritual. Fully localized into 13 languages. Single-player; requires EAC off." />
|
||||||
<Author value="Alex Cube" />
|
<Author value="Alex Cube" />
|
||||||
<Version value="1.4.0" />
|
<Version value="1.4.1" />
|
||||||
<Website value="https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/" />
|
<Website value="https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/" />
|
||||||
</xml>
|
</xml>
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
FIXED: the frame rate drop that grew the longer you played (thanks sanovskiy, Kriloko and Megaladon43 for the reports). Every red Victim corpse painted its own full-size copy of the zombie's textures and never released them, together with copies of its materials - within a couple of hours that was gigabytes of video memory. The painted textures are now small and compressed, shared between corpses, and everything is released as soon as the corpse is gone.
|
||||||
|
CHANGED: an unsearched Victim corpse now stays for 5 minutes instead of an hour.
|
||||||
|
CHANGED: the Necromancy tracker refreshes the knife's damage once a second instead of 10 times a second (thanks zomb1 for pointing at it). Nothing changes in play: the damage only moves when you kill.
|
||||||
|
IMPORTANT: this version is for game version 3.2. It is NOT compatible with 3.3 experimental (latest_experimental): there the Spatial Vault stops saving its contents, so items in it are lost, and the Pyramid of Heresy fails to load. Please stay on 3.2 with this mod for now; a 3.3 version will be released separately.
|
||||||
|
Drop-in over 1.4.0, saves carry over. Single-player. The mod ships Harmony libraries, so EasyAntiCheat must be off.
|
||||||
@@ -30,7 +30,7 @@ To uninstall, delete the folder. The mod adds items and one block, so a save tha
|
|||||||
|
|
||||||
[b]Turn the horde on itself.[/b] The [b]Spirit Stone[/b] is thrown; the zombie it touches switches sides and starts tearing into the others instead of you. The [b]Scroll of Deviation[/b] does the same to everything in the blast radius at once.
|
[b]Turn the horde on itself.[/b] The [b]Spirit Stone[/b] is thrown; the zombie it touches switches sides and starts tearing into the others instead of you. The [b]Scroll of Deviation[/b] does the same to everything in the blast radius at once.
|
||||||
|
|
||||||
[b]A blade that grows with you.[/b] The [b]Necromancer's Knife[/b] is carved from a thighbone - a straight amputation-knife edge, a bone guard, a rope-wrapped grip and runes that glow. It scales its damage with your Necromancy level - nearly useless in unskilled hands, lethal once you are levelled. It heals you for half the damage dealt and marks the wounded zombie as a Victim: its corpse turns red and stays for an hour, and searching it leaves a Victim's bag of necromantic ingredients. [b]Six mods fit this knife and nothing else[/b]: water and food drawn straight out of corpses, protection from heat and cold, slowed victims, an area power-attack storm bought with your own health, and every nearby zombie marked on your compass and map.
|
[b]A blade that grows with you.[/b] The [b]Necromancer's Knife[/b] is carved from a thighbone - a straight amputation-knife edge, a bone guard, a rope-wrapped grip and runes that glow. It scales its damage with your Necromancy level - nearly useless in unskilled hands, lethal once you are levelled. It heals you for half the damage dealt and marks the wounded zombie as a Victim: its corpse turns red and stays for five minutes, and searching it leaves a Victim's bag of necromantic ingredients. [b]Six mods fit this knife and nothing else[/b]: water and food drawn straight out of corpses, protection from heat and cold, slowed victims, an area power-attack storm bought with your own health, and every nearby zombie marked on your compass and map.
|
||||||
|
|
||||||
[b]Undead that fight for you.[/b] Summoning books raise a [b]zombie dog, bear, wolf or griffin[/b] - permanent companions, one of each kind at a time, recalled into the book with a power attack. [b]Pharaoh’s Swarm[/b] release a swarm that scatters wide and stings zombies onto your side. The [b]Banshee's Scroll[/b] screams up a small horde that is [i]not[/i] on your side at all - use it on purpose.
|
[b]Undead that fight for you.[/b] Summoning books raise a [b]zombie dog, bear, wolf or griffin[/b] - permanent companions, one of each kind at a time, recalled into the book with a power attack. [b]Pharaoh’s Swarm[/b] release a swarm that scatters wide and stings zombies onto your side. The [b]Banshee's Scroll[/b] screams up a small horde that is [i]not[/i] on your side at all - use it on purpose.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Fixes the FPS drop: Victim corpses leaked video memory until restart. Unsearched corpses now stay 5 minutes. For game 3.2 only - NOT compatible with 3.3 experimental (Spatial Vault contents get lost). Drop-in over 1.4.0.
|
||||||
Binary file not shown.
Binary file not shown.
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
*English version below — scroll past the Russian half.*
|
*English version below — scroll past the Russian half.*
|
||||||
|
|
||||||
**Версия 1.4.0** — для 7 Days to Die 3.2. Автор: Alex Cube.
|
**Версия 1.4.1** — для 7 Days to Die 3.2 (с 3.3 experimental не совместима). Автор: Alex Cube.
|
||||||
|
|
||||||
- Страница мода: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
|
- Страница мода: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
|
||||||
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
|
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
|
||||||
@@ -162,6 +162,10 @@ HUD за этим следят два индикатора: череп в ста
|
|||||||
|
|
||||||
## Статус
|
## Статус
|
||||||
|
|
||||||
|
Версия 1.4.1 — **исправлено падение FPS**. Красный труп «Жертвы» оставлял в памяти свои текстуры и материалы и не отдавал их до перезапуска игры: за пару часов набегали гигабайты видеопамяти, и FPS падал в разы. Теперь всё убирается вместе с трупом, а сам труп лежит 5 минут, а не час. Урон ножа пересчитывается раз в секунду, а не 10 раз.
|
||||||
|
|
||||||
|
**Мод рассчитан на игру 3.2 и НЕ совместим с 3.3 experimental**: там перестаёт сохраняться содержимое Пространственного хранилища и ломается Пирамида Ереси. Версия под 3.3 выйдет отдельно.
|
||||||
|
|
||||||
Версия 1.4.0 — **питомцы переписаны заново**, и первый из них теперь доступен рано: **Дух крысы**
|
Версия 1.4.0 — **питомцы переписаны заново**, и первый из них теперь доступен рано: **Дух крысы**
|
||||||
(Некромантия 3, 60 упокоенных зомби). Все питомцы идут за вами, сами ни на кого не нападают и
|
(Некромантия 3, 60 упокоенных зомби). Все питомцы идут за вами, сами ни на кого не нападают и
|
||||||
ждут приказа: повторное применение свитка при живом питомце натравливает его на цель под
|
ждут приказа: повторное применение свитка при живом питомце натравливает его на цель под
|
||||||
@@ -244,7 +248,7 @@ HUD за этим следят два индикатора: череп в ста
|
|||||||
|
|
||||||
# Necromancer's Tome (English)
|
# Necromancer's Tome (English)
|
||||||
|
|
||||||
**Version 1.4.0** - for 7 Days to Die 3.2. By Alex Cube.
|
**Version 1.4.1** - for 7 Days to Die 3.2 (not compatible with 3.3 experimental). By Alex Cube.
|
||||||
|
|
||||||
- Mod page: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
|
- Mod page: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
|
||||||
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
|
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
|
||||||
@@ -299,7 +303,7 @@ Five tiers, each opening part of the arsenal (the table gives both the zombie co
|
|||||||
knife, a bone guard, a rope-wrapped grip and glowing runes. Its damage grows with the Necromancy
|
knife, a bone guard, a rope-wrapped grip and glowing runes. Its damage grows with the Necromancy
|
||||||
skill: nearly useless in unskilled hands, lethal for a levelled player. Heals the wielder for
|
skill: nearly useless in unskilled hands, lethal for a levelled player. Heals the wielder for
|
||||||
half the damage dealt and marks the wounded zombie as a Victim - its corpse turns red and stays
|
half the damage dealt and marks the wounded zombie as a Victim - its corpse turns red and stays
|
||||||
for an hour; searching it makes it vanish and leave a Victim's bag of ingredients.
|
for five minutes; searching it makes it vanish and leave a Victim's bag of ingredients.
|
||||||
- **Six mods for the Necromancer's Knife only** - ordinary knife mods will not fit this weapon,
|
- **Six mods for the Necromancer's Knife only** - ordinary knife mods will not fit this weapon,
|
||||||
and these will not fit any other: **Tears of the Dead** (2 water from every zombie killed with
|
and these will not fit any other: **Tears of the Dead** (2 water from every zombie killed with
|
||||||
the blade), **Scavenger's Feast** (2 food per corpse), **Grave's Repose** (protection from heat
|
the blade), **Scavenger's Feast** (2 food per corpse), **Grave's Repose** (protection from heat
|
||||||
@@ -406,6 +410,10 @@ story scenes play without stopping time.
|
|||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
|
Version 1.4.1 - **the FPS drop is fixed**. A red Victim corpse left its textures and materials in memory and never gave them back until the game was restarted: within a couple of hours that was gigabytes of video memory, and the frame rate fell several times over. Everything is now cleaned up with the corpse, and the corpse itself stays for 5 minutes instead of an hour. The knife's damage is refreshed once a second instead of 10 times.
|
||||||
|
|
||||||
|
**The mod is built for game version 3.2 and is NOT compatible with 3.3 experimental**: there the Spatial Vault stops saving its contents and the Pyramid of Heresy breaks. A 3.3 version will come separately.
|
||||||
|
|
||||||
Version 1.4.0 - **pets have been rewritten**, and the first of them now comes early: the **Rat
|
Version 1.4.0 - **pets have been rewritten**, and the first of them now comes early: the **Rat
|
||||||
Spirit** (Necromancy 3, 60 zombies put to rest). Every pet follows you, attacks nobody on its own
|
Spirit** (Necromancy 3, 60 zombies put to rest). Every pet follows you, attacks nobody on its own
|
||||||
and waits for an order: using the scroll again while the pet is alive sends it after whatever is
|
and waits for an order: using the scroll again while the pet is alive sends it after whatever is
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><strong>Камень духов</strong> — брошенный камень, светящийся некромантской энергией. Задетый зомби переходит на вашу сторону и начинает рвать других зомби вместо вас.</li>
|
<li><strong>Камень духов</strong> — брошенный камень, светящийся некромантской энергией. Задетый зомби переходит на вашу сторону и начинает рвать других зомби вместо вас.</li>
|
||||||
<li><strong>Свиток девиации</strong> — то же самое, но по площади: переманивает сразу всех зомби в радиусе взрыва. Расходуется при использовании.</li>
|
<li><strong>Свиток девиации</strong> — то же самое, но по площади: переманивает сразу всех зомби в радиусе взрыва. Расходуется при использовании.</li>
|
||||||
<li><strong>Нож некроманта</strong> — клинок, выточенный из бедренной кости: прямое лезвие, как у ампутационного ножа, костяная гарда, рукоять в верёвочной обмотке и светящиеся руны. Урон растёт вместе с навыком Некромантии: почти бесполезен в неопытных руках, смертоносен у прокачанного игрока. Лечит владельца на половину нанесённого урона и метит раненого зомби как Жертву — труп такого зомби краснеет и лежит час; при обыске он исчезает, оставляя мешок Жертвы с ингредиентами.</li>
|
<li><strong>Нож некроманта</strong> — клинок, выточенный из бедренной кости: прямое лезвие, как у ампутационного ножа, костяная гарда, рукоять в верёвочной обмотке и светящиеся руны. Урон растёт вместе с навыком Некромантии: почти бесполезен в неопытных руках, смертоносен у прокачанного игрока. Лечит владельца на половину нанесённого урона и метит раненого зомби как Жертву — труп такого зомби краснеет и лежит пять минут; при обыске он исчезает, оставляя мешок Жертвы с ингредиентами.</li>
|
||||||
<li><strong>Шесть модов только для этого ножа</strong> — вода и еда прямо из трупов (Слёзы мертвеца, Пир падальщика), защита от жары и холода (Могильный покой), замедление раненых (Хватка мертвеца), силовая атака-буря по площади за двойную цену здоровья и выносливости (Мёртвая буря) и подсветка всех зомби поблизости на карте и компасе (Тёмное чутьё). Обычные моды в этот нож не встают, а эти не встают ни во что другое.</li>
|
<li><strong>Шесть модов только для этого ножа</strong> — вода и еда прямо из трупов (Слёзы мертвеца, Пир падальщика), защита от жары и холода (Могильный покой), замедление раненых (Хватка мертвеца), силовая атака-буря по площади за двойную цену здоровья и выносливости (Мёртвая буря) и подсветка всех зомби поблизости на карте и компасе (Тёмное чутьё). Обычные моды в этот нож не встают, а эти не встают ни во что другое.</li>
|
||||||
<li><strong>Кровь некроманта</strong> — ритуальный ресурс: пустая банка, любой нож в руках и 90% текущего здоровья за одну порцию. Ингредиент для самых тёмных рецептов.</li>
|
<li><strong>Кровь некроманта</strong> — ритуальный ресурс: пустая банка, любой нож в руках и 90% текущего здоровья за одну порцию. Ингредиент для самых тёмных рецептов.</li>
|
||||||
<li><strong>Кожа жертвы</strong> и <strong>Прах зомби</strong> — падают с зомби, помеченного ножом как Жертва. Основа книг призыва и большинства некромантских рецептов.</li>
|
<li><strong>Кожа жертвы</strong> и <strong>Прах зомби</strong> — падают с зомби, помеченного ножом как Жертва. Основа книг призыва и большинства некромантских рецептов.</li>
|
||||||
@@ -93,7 +93,7 @@ A dedicated <strong>Necromancy</strong> skill levels not from perk points and no
|
|||||||
<ul>
|
<ul>
|
||||||
<li><strong>Spirit Stone</strong> — a thrown stone lit with necromantic energy. The zombie it touches switches to your side and starts tearing into other zombies instead of you.</li>
|
<li><strong>Spirit Stone</strong> — a thrown stone lit with necromantic energy. The zombie it touches switches to your side and starts tearing into other zombies instead of you.</li>
|
||||||
<li><strong>Scroll of Deviation</strong> — the same effect, but area-wide: it charms every zombie in the blast radius at once. Consumed on use.</li>
|
<li><strong>Scroll of Deviation</strong> — the same effect, but area-wide: it charms every zombie in the blast radius at once. Consumed on use.</li>
|
||||||
<li><strong>Necromancer's Knife</strong> — a blade carved from a thighbone: a straight edge like an amputation knife, a bone guard, a rope-wrapped grip and glowing runes. Its damage scales with the Necromancy skill: nearly useless in unskilled hands, lethal for a levelled player. Heals the wielder for half the damage dealt and marks the wounded zombie as a Victim — its corpse turns red and stays for an hour; searching it makes it vanish and leave a Victim's bag of ingredients.</li>
|
<li><strong>Necromancer's Knife</strong> — a blade carved from a thighbone: a straight edge like an amputation knife, a bone guard, a rope-wrapped grip and glowing runes. Its damage scales with the Necromancy skill: nearly useless in unskilled hands, lethal for a levelled player. Heals the wielder for half the damage dealt and marks the wounded zombie as a Victim — its corpse turns red and stays for five minutes; searching it makes it vanish and leave a Victim's bag of ingredients.</li>
|
||||||
<li><strong>Six mods for this knife only</strong> — water and food straight out of corpses (Tears of the Dead, Scavenger's Feast), protection from heat and cold (Grave's Repose), slowed victims (Dead Man's Grip), an area power-attack storm at double the health and stamina cost (Dead Storm), and every nearby zombie marked on your map and compass (Dark Sense). Ordinary knife mods will not fit this weapon, and these will not fit any other.</li>
|
<li><strong>Six mods for this knife only</strong> — water and food straight out of corpses (Tears of the Dead, Scavenger's Feast), protection from heat and cold (Grave's Repose), slowed victims (Dead Man's Grip), an area power-attack storm at double the health and stamina cost (Dead Storm), and every nearby zombie marked on your map and compass (Dark Sense). Ordinary knife mods will not fit this weapon, and these will not fit any other.</li>
|
||||||
<li><strong>Necromancer's Blood</strong> — a ritual resource: an empty jar, any knife in hand and 90% of your current health per portion. An ingredient for the darkest recipes.</li>
|
<li><strong>Necromancer's Blood</strong> — a ritual resource: an empty jar, any knife in hand and 90% of your current health per portion. An ingredient for the darkest recipes.</li>
|
||||||
<li><strong>Victim's Skin</strong> and <strong>Zombie Ash</strong> — dropped by a zombie marked as a Victim. The basis of the summoning books and most necromantic recipes.</li>
|
<li><strong>Victim's Skin</strong> and <strong>Zombie Ash</strong> — dropped by a zombie marked as a Victim. The basis of the summoning books and most necromantic recipes.</li>
|
||||||
|
|||||||
Reference in New Issue
Block a user