When the client receives block entity data packets from the server for chunks containing ELamp blocks, EParamsSerializer.Deserialize is called with a null buffer, throwing an unhandled ArgumentNullException. Because the exception propagates through the render frame callback, the game window freezes entirely rather than displaying a crash dialog. The process must be killed via Task Manager.
This crash is 100% reproducible by entering a chunk containing placed EP lamps, and recurs every time the player re-enters that chunk.
The crash originates in EParamsSerializer.Deserialize at line 35, which passes the data parameter directly to whatever deserialization method follows without a null guard. When the tree attribute key holding the EP lamp's serialized parameter data is absent or null (for example, on block entities saved with an older version of the mod that used a different storage key), GetBytes(...) returns null and Deserialize is called with a null buffer.
Game Version: v1.22.3 (Stable)
6/22/2026 11:39:27 AM: Critical error occurred in the following mods:
electricalprogressivecore@3.2.3, electricalprogressivebasics@3.2.5, electricalprogressiveqol@3.2.2
System.ArgumentNullException: Value cannot be null. (Parameter 'buffer')
at System.ArgumentNullException.Throw(String paramName)
at ElectricalProgressive.Utils.EParamsSerializer.Deserialize(Byte[] data)
in ElectricalProgressive-Core\Utils\EParamsSerializer.cs:line 35
at ElectricalProgressive.Content.Block.BEBehaviorElectricalProgressive.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in ElectricalProgressive-Basics\Content\Block\BEBehaviorElectricalProgressive.cs:line 765
at Vintagestory.API.Common.BlockEntity.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in VintagestoryApi\Common\Collectible\Block\BlockEntity.cs:line 333
at ElectricalProgressive.Content.Block.BlockEntityEFacingBase.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in ElectricalProgressive-Basics\Content\Block\BlockEntityEFacingBase.cs:line 73
at ElectricalProgressive.Content.Block.ELamp.BlockEntityELamp.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in ElectricalProgressive-QOL\Content\Block\ELamp\BlockEntityELamp.cs:line 48
at Vintagestory.Client.NoObf.ClientSystemEntities.createBlockEntityFromPacket(Packet_BlockEntity packet, ClientMain game)
in VintagestoryLib\Client\Systems\Entities.cs:line 468
at Vintagestory.Client.NoObf.ClientChunk.AddOrUpdateBlockEntityFromPacket(Packet_BlockEntity p, ClientMain game)
in VintagestoryLib\Client\Model\ClientChunk.cs:line 428
at Vintagestory.Client.NoObf.GeneralPacketHandler.HandleBlockEntities(Packet_Server packet)
in VintagestoryLib\Client\Systems\GeneralPacketHandler.cs:line 433
at Vintagestory.Client.NoObf.ClientMain.ExecuteMainThreadTasks(Single deltaTime)
in VintagestoryLib\Client\ClientMain.cs:line 817
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt)
in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 173
Suggested minimal fix in EParamsSerializer.cs:
public static T Deserialize<T>(byte[] data) { if (data == null) return default; }
A similar null guard in BEBehaviorElectricalProgressive.FromTreeAttributes at line 765 before calling Deserialize would also be appropriate, so that a missing or null attribute results in a logged warning and a default state rather than an unhandled exception.
When the client receives block entity data packets from the server for chunks containing ELamp blocks, EParamsSerializer.Deserialize is called with a null buffer, throwing an unhandled ArgumentNullException. Because the exception propagates through the render frame callback, the game window freezes entirely rather than displaying a crash dialog. The process must be killed via Task Manager.
This crash is 100% reproducible by entering a chunk containing placed EP lamps, and recurs every time the player re-enters that chunk.
The crash originates in EParamsSerializer.Deserialize at line 35, which passes the data parameter directly to whatever deserialization method follows without a null guard. When the tree attribute key holding the EP lamp's serialized parameter data is absent or null (for example, on block entities saved with an older version of the mod that used a different storage key), GetBytes(...) returns null and Deserialize is called with a null buffer.
Game Version: v1.22.3 (Stable)
6/22/2026 11:39:27 AM: Critical error occurred in the following mods:
electricalprogressivecore@3.2.3, electricalprogressivebasics@3.2.5, electricalprogressiveqol@3.2.2
System.ArgumentNullException: Value cannot be null. (Parameter 'buffer')
at System.ArgumentNullException.Throw(String paramName)
at ElectricalProgressive.Utils.EParamsSerializer.Deserialize(Byte[] data)
in ElectricalProgressive-Core\Utils\EParamsSerializer.cs:line 35
at ElectricalProgressive.Content.Block.BEBehaviorElectricalProgressive.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in ElectricalProgressive-Basics\Content\Block\BEBehaviorElectricalProgressive.cs:line 765
at Vintagestory.API.Common.BlockEntity.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in VintagestoryApi\Common\Collectible\Block\BlockEntity.cs:line 333
at ElectricalProgressive.Content.Block.BlockEntityEFacingBase.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in ElectricalProgressive-Basics\Content\Block\BlockEntityEFacingBase.cs:line 73
at ElectricalProgressive.Content.Block.ELamp.BlockEntityELamp.FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldAccessForResolve)
in ElectricalProgressive-QOL\Content\Block\ELamp\BlockEntityELamp.cs:line 48
at Vintagestory.Client.NoObf.ClientSystemEntities.createBlockEntityFromPacket(Packet_BlockEntity packet, ClientMain game)
in VintagestoryLib\Client\Systems\Entities.cs:line 468
at Vintagestory.Client.NoObf.ClientChunk.AddOrUpdateBlockEntityFromPacket(Packet_BlockEntity p, ClientMain game)
in VintagestoryLib\Client\Model\ClientChunk.cs:line 428
at Vintagestory.Client.NoObf.GeneralPacketHandler.HandleBlockEntities(Packet_Server packet)
in VintagestoryLib\Client\Systems\GeneralPacketHandler.cs:line 433
at Vintagestory.Client.NoObf.ClientMain.ExecuteMainThreadTasks(Single deltaTime)
in VintagestoryLib\Client\ClientMain.cs:line 817
at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt)
in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 173
Suggested minimal fix in EParamsSerializer.cs:
public static T Deserialize<T>(byte[] data) { if (data == null) return default; }A similar null guard in BEBehaviorElectricalProgressive.FromTreeAttributes at line 765 before calling Deserialize would also be appropriate, so that a missing or null attribute results in a logged warning and a default state rather than an unhandled exception.