Micah Holmes Posted December 14, 2025 Report Posted December 14, 2025 Making some new fences and I'm crashing every time after I place it. Best I can tell it needs some logic for placing which I've seen before but does not seem to work. Here is the crash: crash: Running on 64 bit Linux (Linux Mint 22.1) [Kernel 6.8.0.88] with 31965 MB RAM Game Version: v1.21.5 (Stable) 12/13/2025 11:40:57 PM: Critical error occurred Loaded Mods: mudmod@1.0.0, plantsexpandedmod@1.0.4, game@1.21.5, woodworking@1.0.0, creative@1.21.5, survival@1.21.5 System.Exception: Can't create itemstack without block! at Vintagestory.API.Common.ItemStack..ctor(Block block, Int32 stacksize) in VintagestoryApi\Common\Collectible\ItemStack.cs:line 244 at Vintagestory.GameContent.BlockFence.OnPickBlock(IWorldAccessor world, BlockPos pos) in VSSurvivalMod\Block\BlockFence.cs:line 110 at Vintagestory.API.Common.Block.GetPlacedBlockName(IWorldAccessor world, BlockPos pos) in VintagestoryApi\Common\Collectible\Block\Block.cs:line 2199 at Vintagestory.Client.NoObf.HudElementBlockAndEntityInfo.ComposeBlockInfoHud() in VintagestoryLib\Client\Systems\Gui\Huds\HudElementBlockAndEntityInfo.cs:line 44 at Vintagestory.Common.GameTickListener.OnTriggered(Int64 ellapsedMilliseconds) in VintagestoryLib\Common\Model\GameTickListener.cs:line 25 at Vintagestory.Common.EventManager.TriggerGameTick(Int64 ellapsedMilliseconds, IWorldAccessor world) in VintagestoryLib\Common\EventManager.cs:line 102 at Vintagestory.Client.NoObf.ClientMain.MainRenderLoop(Single dt) in VintagestoryLib\Client\ClientMain.cs:line 836 at Vintagestory.Client.GuiScreenRunningGame.RenderToPrimary(Single dt) in VintagestoryLib\Client\MainMenu\Screens\GuiScreenRunningGame.cs:line 172 at Vintagestory.Client.ScreenManager.Render(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 719 at Vintagestory.Client.ScreenManager.OnNewFrame(Single dt) in VintagestoryLib\Client\ScreenManager.cs:line 663 at Vintagestory.Client.NoObf.ClientPlatformWindows.window_RenderFrame(FrameEventArgs e) in VintagestoryLib\Client\ClientPlatform\GameWindow.cs:line 112 at OpenTK.Windowing.Desktop.GameWindow.Run() at Vintagestory.Client.ClientProgram.Start(ClientProgramArgs args, String[] rawArgs) in VintagestoryLib\Client\ClientProgram.cs:line 338 at Vintagestory.Client.ClientProgram.<>c__DisplayClass10_0.<.ctor>b__1() in VintagestoryLib\Client\ClientProgram.cs:line 133 at Vintagestory.ClientNative.CrashReporter.Start(ThreadStart start) in VintagestoryLib\Client\ClientPlatform\ClientNative\CrashReporter.cs:line 95 Here is the code: { code: "lattice-fence", class: "BlockFence", behaviors: [ {name: "CanAttach", properties: { sides: ["up", "down"] } }, { name: "RopeTieable" } ], attributes: { supportsUnstableRock: true, isFence: true, particleCollBoxHeight: 1, handbook: { groupBy: ["woodenfence-*"] }, attachableToEntity: { categoryCode: "ropetiepost", requiresBehindSlots: 1, attachedShape: { base: "game:block/wood/fence/boatpost" }, texturePrefixCode: "lattice-fence-{wood}", seatConfig: { controllable: false, bodyYawLimit: 0.25, mountOffset: { x: 1, y: 0, z: 1.5 }, eyeHeight: 1, attributes: { ropeTieablesOnly: true } } } }, variantgroups: [ { code: "wood", states: ["oak" ], loadFromProperties: "game:block/wood" }, { code: "type", states: ["empty", "n", "e", "s", "w", "ne", "ns", "nw", "es", "ew", "sw", "nes", "new", "nsw", "esw", "nesw"] } ], creativeinventory: { "general": ["lattice-*-ew"], "decorative": ["lattice-*-ew"] }, shapebytype: { "*-empty": { base: "fence/lattice" }, "*-n": { base: "fence/lattice", rotateY: 270 }, "*-e": { base: "fence/lattice", rotateY: 180 }, "*-s": { base: "fence/lattice", rotateY: 90 }, "*-w": { base: "fence/lattice", rotateY: 0 }, "*-ns": { base: "fence/lattice", rotateY: 90 }, "*-ew": { base: "fence/lattice", rotateY: 0 }, "*-ne": { base: "fence/lattice", rotateY: 180 }, "*-nw": { base: "fence/lattice", rotateY: 270 }, "*-es": { base: "fence/lattice", rotateY: 90 }, "*-sw": { base: "fence/lattice", rotateY: 0 }, "*-nes": { base: "fence/lattice", rotateY: 180 }, "*-new": { base: "fence/lattice", rotateY: 270 }, "*-nsw": { base: "fence/lattice", rotateY: 0 }, "*-esw": { base: "fence/lattice", rotateY: 90 }, "*-nesw-free": { base: "fence/lattice", rotateY: 0 } }, blockmaterial: "Wood", texturesByType: { "*": { "wood": { base: "debarked/{wood}" } } /*"*-empty": { "wood": { base: "debarked/{wood}" } }, "*-n": { "wood": { base: "debarked/{wood}" } }, "*-e": { "wood": { base: "debarked/{wood}" } }, "*-s": { "wood": { base: "debarked/{wood}" } }, "*-w": { "wood": { base: "debarked/{wood}" } }, "*-ns": { "wood": { base: "debarked/{wood}" } }, "*-ew": { "wood": { base: "debarked/{wood}" } }, "*-ne": { "wood": { base: "debarked/{wood}" } }, "*-nw": { "wood": { base: "debarked/{wood}" } }, "*-es": { "wood": { base: "debarked/{wood}" } }, "*-sw": { "wood": { base: "debarked/{wood}" } }, "*-nes": { "wood": { base: "debarked/{wood}" } }, "*-new": { "wood": { base: "debarked/{wood}" } }, "*-nsw": { "wood": { base: "debarked/{wood}" } }, "*-esw": { "wood": { base: "debarked/{wood}" } }, "*-nesw-free": { "wood": { base: "debarked/{wood}" } }*/ }, sidesolid: { all: false }, sideopaque: { all: false }, resistance: 3, lightAbsorption: 0, sounds: { "place": "game:block/planks", "hit": "game:block/planks", "break": "game:block/planks", "walk": "game:walk/wood" }, selectionboxbytype: { "*-empty": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625 }, "*-n": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 270}, "*-e": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 180}, "*-s": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-w": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625}, "*-ns": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-gns": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ngs": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ew": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-egw": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-gew": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, }, selectionboxesbytype: { "*-sw": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-ne": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ] , "*-nw": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-es": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nes": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ], "*-new": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-nsw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-esw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nesw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625 } ] }, collisionboxbytype: { "*-empty": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625 }, "*-n": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 270}, "*-e": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 180}, "*-s": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-w": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625}, "*-ns": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-gns": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ngs": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ew": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-egw": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-gew": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, }, collisionboxesbytype: { "*-sw": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-ne": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ] , "*-nw": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-es": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nes": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ], "*-new": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-nsw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-esw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nesw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625 } ] }, combustibleProps: { burnTemperature: 600, burnDuration: 10, }, materialDensity: 600, tpHandTransform: { translation: { x: -1.5, y: -1, z: -1.2 }, rotation: { x: 5, y: -3, z: -96 }, scale: 0.37 }, groundTransform: { translation: { x: 0, y: 0.05, z: 0 }, rotation: { x: 90, y: -45, z: 0 }, origin: { x: 0.5, y: 0, z: 0.5 }, scale: 2.07 } } To the best of my knowledge i think it wants something like this: drops: [ { type: "block", code: "CODE NAME GOES HERE", quantity: { avg: 0.85, var: 0 } } ], Even when i put something similar in there, its does not like it and crashes with same error. So i think I'm missing something here
The Insanity God Posted December 14, 2025 Report Posted December 14, 2025 It's crashing because you have a "-" in the "code" field, this symbol is used as a separator for the variants defined in the variant group. In the case of BlockFence it has logic for always dropping the free (no snow cover) and ew (orientation) variant, this however is crashing because it's thinking that your base code is "lattice" and not "lattice-fence". (this custom dropping logic also means that the "drops" defined in the JSON are ignored btw) You also have an unrelated issue in your variant groups: 5 hours ago, Micah Holmes said: { code: "wood", states: ["oak" ], loadFromProperties: "game:block/wood" }, You are adding [ "oak" ] and also everything in "game:block/wood" which already contains oak, meaning it will attempt to create the oak variant twice. (This is not fatal but will give an ugly error log)
Micah Holmes Posted December 14, 2025 Author Report Posted December 14, 2025 Well I adjusted the code no crashing any more but I get errors in the log : 14.12.2025 10:48:41 [Error] Exception thrown while trying to parse json data of the type with code woodworking:latticefence, variant woodworking:latticefence-purpleheart-empty-free. Will ignore most of the attributes. Exception: 14.12.2025 10:48:41 [Error] Exception: Error converting value "blockfence" to type 'Vintagestory.API.Common.EnumItemClass'. Path 'drops[0].type'. ---> System.ArgumentException: Requested value 'blockfence' was not found. at Newtonsoft.Json.Utilities.EnumUtils.ParseEnum(Type enumType, NamingStrategy namingStrategy, String value, Boolean disallowNumber) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) --- End of inner exception stack trace --- at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Populate(JsonReader reader, Object target) at Newtonsoft.Json.JsonSerializer.PopulateInternal(JsonReader reader, Object target) at Vintagestory.API.Common.JsonUtil.PopulateObject(Object toPopulate, JToken token, JsonSerializer js) in VintagestoryApi\Util\JsonUtil.cs:line 96 at Vintagestory.ServerMods.NoObf.RegistryObjectType.CreateResolvedType[T](ICoreServerAPI api, AssetLocation fullcode, JObject jobject, JsonSerializer deserializer, OrderedDictionary`2 variant) in VSEssentials\Loading\RegistryObjectType.cs:line 303 14.12.2025 10:48:41 [Error] Exception thrown while trying to parse json data of the type with code woodworking:latticefence, variant woodworking:latticefence-purpleheart-n-free. Will ignore most of the attributes. Exception: This error is a little confusing. not sure why it cant find "blockfence" in the API. Is it trying to look in my mod for blockfence? New code: { code: "woodworking:latticefence", class: "game:BlockFence", behaviors: [ {name: "CanAttach", properties: { sides: ["up", "down"] } }, { name: "RopeTieable" } ], attributes: { supportsUnstableRock: true, isFence: true, particleCollBoxHeight: 1, handbook: { groupBy: ["woodenfence-*"] }, attachableToEntity: { categoryCode: "ropetiepost", requiresBehindSlots: 1, attachedShape: { base: "game:block/wood/fence/boatpost" }, texturePrefixCode: "fence-{wood}", seatConfig: { controllable: false, bodyYawLimit: 0.25, mountOffset: { x: 1, y: 0, z: 1.5 }, eyeHeight: 1, attributes: { ropeTieablesOnly: true } } } }, variantgroups: [ { code: "wood", states: ["purpleheart" ] }, { code: "type", states: ["empty", "n", "e", "s", "w", "ne", "ns", "nw", "es", "ew", "sw", "nes", "new", "nsw", "esw", "nesw"] }, { code: "cover", states: ["free"] } ], creativeinventory: { "general": ["latticefence-*-ew-free"], "decorative": ["latticefence-*-ew-free"] }, shapebytype: { "*-empty-free": { base: "fence/lattice" }, "*-n-free": { base: "fence/lattice", rotateY: 270 }, "*-e-free": { base: "fence/lattice", rotateY: 180 }, "*-s-free": { base: "fence/lattice", rotateY: 90 }, "*-w-free": { base: "fence/lattice", rotateY: 0 }, "*-ns-free": { base: "fence/lattice", rotateY: 90 }, "*-ew-free": { base: "fence/lattice", rotateY: 0 }, "*-ne-free": { base: "fence/lattice", rotateY: 180 }, "*-nw-free": { base: "fence/lattice", rotateY: 270 }, "*-es-free": { base: "fence/lattice", rotateY: 90 }, "*-sw-free": { base: "fence/lattice", rotateY: 0 }, "*-nes-free": { base: "fence/lattice", rotateY: 180 }, "*-new-free": { base: "fence/lattice", rotateY: 270 }, "*-nsw-free": { base: "fence/lattice", rotateY: 0 }, "*-esw-free": { base: "fence/lattice", rotateY: 90 }, "*-nesw-free": { base: "fence/lattice", rotateY: 0 } }, drawtypeByType: { "*-free": "JSON", "*-snow": "JSONAndSnowLayer" }, blockmaterial: "Wood", texturesByType: { "*": { "wood": { base: "debarked/{wood}" } } }, sidesolid: { all: false }, sideopaque: { all: false }, resistance: 3, lightAbsorption: 0, drops: [ { type: "blockfence", code: "latticefence{wood}{type}{cover}", quantity: { avg: 0.85, var: 0 } } ], sounds: { "place": "game:block/planks", "hit": "game:block/planks", "break": "game:block/planks", "walk": "game:walk/wood" }, selectionboxbytype: { "*-empty-*": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625 }, "*-n-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 270}, "*-e-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 180}, "*-s-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-w-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625}, "*-ns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-gns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ngs-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-egw-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-gew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, }, selectionboxesbytype: { "*-sw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-ne-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ] , "*-nw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-es-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nes-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ], "*-new-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-nsw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-esw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nesw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625 } ] }, collisionboxbytype: { "*-empty-*": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625 }, "*-n-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 270}, "*-e-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 180}, "*-s-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-w-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625}, "*-ns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-gns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ngs-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-egw-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-gew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, }, collisionboxesbytype: { "*-sw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-ne-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ] , "*-nw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-es-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nes-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ], "*-new-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-nsw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-esw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nesw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625 } ] }, combustibleProps: { burnTemperature: 600, burnDuration: 10, }, materialDensity: 600, tpHandTransform: { translation: { x: -1.5, y: -1, z: -1.2 }, rotation: { x: 5, y: -3, z: -96 }, scale: 0.37 }, groundTransform: { translation: { x: 0, y: 0.05, z: 0 }, rotation: { x: 90, y: -45, z: 0 }, origin: { x: 0.5, y: 0, z: 0.5 }, scale: 2.07 } } Not sure where to go from here on this one.
The Insanity God Posted December 14, 2025 Report Posted December 14, 2025 It's because the "drops" you defined are invalid 1 hour ago, Micah Holmes said: drops: [ { type: "blockfence", code: "latticefence{wood}{type}{cover}", quantity: { avg: 0.85, var: 0 } } ], "type" should be "block" not "blockfence" (type is purely to distinguish between "block" and "item") hence it's crashing, but you can just remove this entirely as BlockFence already has custom logic for dropping the correct variant and in doing so completely ignores the drops defined in the JSON file.
Micah Holmes Posted December 18, 2025 Author Report Posted December 18, 2025 Got it fixed using this code but now I'm getting weird behavior. When I place side by side it turns both. An when I stack on top of each other, it turns invisible { code: "woodworking:latticefence", class: "BlockFenceStackAware", behaviors: [ {name: "CanAttach", properties: { sides: ["up", "down"] } } ], attributes: { isFence: true, particleCollBoxHeight: 1, handbook: { groupBy: ["latticefence-*"] } }, variantgroups: [ { code: "wood", states: ["purpleheart" ] }, { code: "type", states: ["empty", "n", "e", "s", "w", "ne", "ns", "nw", "es", "ew", "sw", "nes", "new", "nsw", "esw", "nesw"] }, { code: "cover", states: ["free"] } ], creativeinventory: { "general": ["latticefence-*-ew-free"], "decorative": ["latticefence-*-ew-free"] }, shapebytype: { "*-empty-free": { base: "fence/lattice" }, "*-n-free": { base: "fence/lattice", rotateY: 270 }, "*-e-free": { base: "fence/lattice", rotateY: 180 }, "*-s-free": { base: "fence/lattice", rotateY: 90 }, "*-w-free": { base: "fence/lattice", rotateY: 0 }, "*-ns-free": { base: "fence/lattice", rotateY: 90 }, "*-ew-free": { base: "fence/lattice", rotateY: 0 }, "*-ne-free": { base: "fence/lattice", rotateY: 180 }, "*-nw-free": { base: "fence/lattice", rotateY: 270 }, "*-es-free": { base: "fence/lattice", rotateY: 90 }, "*-sw-free": { base: "fence/lattice", rotateY: 0 }, "*-nes-free": { base: "fence/lattice", rotateY: 180 }, "*-new-free": { base: "fence/lattice", rotateY: 270 }, "*-nsw-free": { base: "fence/lattice", rotateY: 0 }, "*-esw-free": { base: "fence/lattice", rotateY: 90 }, "*-nesw-free": { base: "fence/lattice", rotateY: 0 } }, drawtypeByType: { "*-free": "JSON", "*-snow": "JSONAndSnowLayer" }, blockmaterial: "Wood", texturesByType: { "*": { "wood": { base: "debarked/{wood}" } } }, sidesolid: { all: false }, sideopaque: { all: false }, resistance: 3, lightAbsorption: 0, sounds: { "place": "game:block/planks", "hit": "game:block/planks", "break": "game:block/planks", "walk": "game:walk/wood" }, selectionboxbytype: { "*-empty-*": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625 }, "*-n-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 270}, "*-e-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 180}, "*-s-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-w-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625}, "*-ns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-gns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ngs-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-egw-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-gew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, }, selectionboxesbytype: { "*-sw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-ne-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ] , "*-nw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-es-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nes-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ], "*-new-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-nsw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-esw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nesw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625 } ] }, collisionboxbytype: { "*-empty-*": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625 }, "*-n-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 270}, "*-e-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 180}, "*-s-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-w-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625}, "*-ns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-gns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ngs-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-egw-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-gew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, }, collisionboxesbytype: { "*-sw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-ne-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ] , "*-nw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-es-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nes-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ], "*-new-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-nsw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-esw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nesw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625 } ] }, combustibleProps: { burnTemperature: 600, burnDuration: 10, }, materialDensity: 600, tpHandTransform: { translation: { x: -1.5, y: -1, z: -1.2 }, rotation: { x: 5, y: -3, z: -96 }, scale: 0.37 }, groundTransform: { translation: { x: 0, y: 0.05, z: 0 }, rotation: { x: 90, y: -45, z: 0 }, origin: { x: 0.5, y: 0, z: 0.5 }, scale: 2.07 } } Tried commenting out a few different things to see if it has a effect but nothing seems to stop it. Not sure whats causing it, can only assume its behavior but I commented it out and still acts weird. Maybe its the fence class?
The Insanity God Posted December 19, 2025 Report Posted December 19, 2025 (edited) On 12/18/2025 at 3:50 AM, Micah Holmes said: class: "BlockFenceStackAware", You just changed your block class to ' BlockFenceStackAware' which requires a different kind of setup, like a "wall" texture and "-top" shapes. See `Vintagestory\assets\survival\blocktypes\stone\drystonefence-free.json` for example. Edited December 19, 2025 by The Insanity God
Micah Holmes Posted December 24, 2025 Author Report Posted December 24, 2025 (edited) @The Insanity God Adjusted code as advised only issue now is the fence can not be rotated. { code: "woodworking:latticefence", //class: "BlockFenceStackAware", class: "Block", behaviors: [ {name: "CanAttach", properties: { sides: ["up", "down"] } } ], attributes: { isFence: true, particleCollBoxHeight: 1, handbook: { groupBy: ["latticefence-*"] } }, variantgroups: [ { code: "wood", states: ["purpleheart" ] }, { code: "type", states: ["empty", "n", "e", "s", "w", "ne", "ns", "nw", "es", "ew", "sw", "nes", "new", "nsw", "esw", "nesw"] }, { code: "cover", states: ["free"] } ], creativeinventory: { "general": ["latticefence-*-ew-free"], "decorative": ["latticefence-*-ew-free"] }, shapebytype: { "*-empty-free": { base: "fence/lattice" }, "*-n-free": { base: "fence/lattice", rotateY: 270 }, "*-e-free": { base: "fence/lattice", rotateY: 180 }, "*-s-free": { base: "fence/lattice", rotateY: 90 }, "*-w-free": { base: "fence/lattice", rotateY: 0 }, "*-ns-free": { base: "fence/lattice", rotateY: 90 }, "*-ew-free": { base: "fence/lattice", rotateY: 0 }, "*-ne-free": { base: "fence/lattice", rotateY: 180 }, "*-nw-free": { base: "fence/lattice", rotateY: 270 }, "*-es-free": { base: "fence/lattice", rotateY: 90 }, "*-sw-free": { base: "fence/lattice", rotateY: 0 }, "*-nes-free": { base: "fence/lattice", rotateY: 180 }, "*-new-free": { base: "fence/lattice", rotateY: 270 }, "*-nsw-free": { base: "fence/lattice", rotateY: 0 }, "*-esw-free": { base: "fence/lattice", rotateY: 90 }, "*-nesw-free": { base: "fence/lattice", rotateY: 0 } }, drawtypeByType: { "*-free": "JSON", "*-snow": "JSONAndSnowLayer" }, blockmaterial: "Wood", texturesByType: { "*": { "wood": { base: "debarked/{wood}" } } }, sidesolid: { all: false }, sideopaque: { all: false }, resistance: 3, lightAbsorption: 0, sounds: { "place": "game:block/planks", "hit": "game:block/planks", "break": "game:block/planks", "walk": "game:walk/wood" }, selectionboxbytype: { "*-empty-*": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625 }, "*-n-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 270}, "*-e-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 180}, "*-s-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-w-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 0.625}, "*-ns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-gns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ngs-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625, rotateY: 90}, "*-ew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-egw-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, "*-gew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625}, }, selectionboxesbytype: { "*-sw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-ne-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ] , "*-nw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-es-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nes-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 180 } ], "*-new-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 270 } ], "*-nsw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 0 } ], "*-esw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.0625, z2: 0.625, rotateY: 90 } ], "*-nesw": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.0625, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.0625, z2: 0.625 } ] }, collisionboxbytype: { "*-empty-*": { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625 }, "*-n-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 270}, "*-e-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 180}, "*-s-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-w-*": { x1: 0, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 0.625}, "*-ns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-gns-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ngs-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625, rotateY: 90}, "*-ew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-egw-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, "*-gew-*": { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625}, }, collisionboxesbytype: { "*-sw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-ne-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ] , "*-nw-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-es-*": [ { x1: 0.375, y1: 0, z1: 0.375, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nes-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 180 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 180 } ], "*-new-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 270 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 270 } ], "*-nsw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 0 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 0 } ], "*-esw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1, rotateY: 90 }, { x1: 0, y1: 0, z1: 0.375, x2: 0.375, y2: 1.3125, z2: 0.625, rotateY: 90 } ], "*-nesw-*": [ { x1: 0.375, y1: 0, z1: 0, x2: 0.625, y2: 1.3125, z2: 1 }, { x1: 0, y1: 0, z1: 0.375, x2: 1, y2: 1.3125, z2: 0.625 } ] }, combustibleProps: { burnTemperature: 600, burnDuration: 10, }, materialDensity: 600, tpHandTransform: { translation: { x: -1.5, y: -1, z: -1.2 }, rotation: { x: 5, y: -3, z: -96 }, scale: 0.37 }, groundTransform: { translation: { x: 0, y: 0.05, z: 0 }, rotation: { x: 90, y: -45, z: 0 }, origin: { x: 0.5, y: 0, z: 0.5 }, scale: 2.07 } } Tried adding rotatatableInterval: { base: "22.5degnot45deg" }, but did not do anything Edited December 24, 2025 by Micah Holmes
The Insanity God Posted December 25, 2025 Report Posted December 25, 2025 (edited) @Micah Holmes On 12/24/2025 at 11:25 PM, Micah Holmes said: //class: "BlockFenceStackAware", class: "Block", Well the fence classes are designed to select the variant that would connect the correct sides (I assume this is what you mean with rotation) and you just removed that altogether so makes sense that rotation doesn't work anymore... On 12/24/2025 at 11:25 PM, Micah Holmes said: rotatatableInterval: { base: "22.5degnot45deg" }, This is only relevant for stuff with the "BlockGenericTypedContainer" class (or a class inheriting it). Other blocks would generally use "HorizontalOrientable" (or "OmniRotatable") behavior but this won't work very well for fences as it has more then just rotations (it has different variants for connecting multiple sides after all) Edited December 26, 2025 by The Insanity God
Solution Micah Holmes Posted December 27, 2025 Author Solution Report Posted December 27, 2025 (edited) @The Insanity God Well when I use this: code: "woodworking:latticefence", class: "BlockFenceStackAware", //class: "Block", The fence will disappear when I stack on top and does not behave correctly. Open to suggestions Update: Ive adjusted this code a million different ways. I think I'm going to give up on custom fence blocks for now. Even if I just change model and texture, it still does not want to work using base game code. Edited December 27, 2025 by Micah Holmes
Recommended Posts