-
|
So I am trying to create a chest with random loot but I keep running into issues. import anvil
from random import choice, randint
loot_table = ["minecraft:poppy","minecraft:cocoa_beans"]
blocks = []
for i in range(50):
blocks.append(anvil.Block('minecraft', 'chest', {
"Items": [
{
"Count": randint(1, 4), "Slot": j, "id": choice(loot_table)
} for j in range(randint(1, 25))
]
}
))Without any modifications to NBT and anvil-parser2 module (I'm on Python 3.9.13, I removed folder names from error): Traceback (most recent call last):
File "\main.py", line 93, in <module>
region.save('r.0.0.mca')
File "\.venv\lib\site-packages\anvil\empty_region.py", line 300, in save
nbt_data = chunk.save()
File "\.venv\lib\site-packages\anvil\empty_chunk.py", line 176, in save
p = s.palette()
File "\.venv\lib\site-packages\anvil\empty_section.py", line 100, in palette
palette = set(self.blocks)
File "\.venv\lib\site-packages\anvil\block.py", line 54, in __hash__
return hash(self.name()) ^ hash(frozendict(self.properties))
TypeError: unhashable type: 'list'And I tried changing Traceback (most recent call last):
File "\main.py", line 93, in <module>
region.save('r.0.0.mca')
File "\.venv\lib\site-packages\anvil\empty_region.py", line 301, in save
nbt_data.write_file(buffer=chunk_data)
File "\.venv\lib\site-packages\nbt\nbt.py", line 709, in write_file
self._render_buffer(self.file)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 425, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 425, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 510, in _render_buffer
TAG_Byte(tag.id)._render_buffer(buffer)
AttributeError: 'list' object has no attribute 'id'Then I tried adding this after line 164 in empty_section.py: elif isinstance(value, list):
properties.tags.append(nbt.TAG_List(name=key, value=value))This came out: Traceback (most recent call last):
File "\main.py", line 93, in <module>
region.save('r.0.0.mca')
File "\.venv\lib\site-packages\anvil\empty_region.py", line 301, in save
nbt_data.write_file(buffer=chunk_data)
File "\.venv\lib\site-packages\nbt\nbt.py", line 709, in write_file
self._render_buffer(self.file)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 425, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 425, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 512, in _render_buffer
tag._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 417, in _render_buffer
TAG_Byte(self.tagID)._render_buffer(buffer)
File "\.venv\lib\site-packages\nbt\nbt.py", line 118, in _render_buffer
buffer.write(self.fmt.pack(self.value))
struct.error: required argument is not an integerJust want to add that I have never worked with NBT package. |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments
-
|
Ohh, the properties are like |
Beta Was this translation helpful? Give feedback.
-
|
Ah, good question, editing block entity NBT is not really supported in In your example it would be something like: from random import randint, choice
import amulet
from amulet.api.block import Block
from amulet.api.block_entity import BlockEntity
from amulet_nbt import NamedTag, CompoundTag, ListTag, IntTag, ByteTag, StringTag
loot_table = ["minecraft:poppy", "minecraft:cocoa_beans"]
level = amulet.load_level("/path/to/your/minecraft/saves/myworld")
game_version = ("java", (1, 21, 5))
items = [
CompoundTag({
'count': IntTag(randint(1, 4)),
'Slot': ByteTag(j),
'id': StringTag(choice(loot_table))
}) for j in range(randint(1, 25))
]
block_entity_nbt = NamedTag(CompoundTag({'Items': ListTag(items)}))
block_entity = BlockEntity(
"minecraft", "chest",
0, 64, 0,
block_entity_nbt
)
block = Block("minecraft", "chest")
level.set_version_block(0, 64, 0, "minecraft:overworld", game_version, block, block_entity)
level.save() |
Beta Was this translation helpful? Give feedback.

Ah, good question, editing block entity NBT is not really supported in
anvil-parser2, apologies!My suggestion would be to use an alternative package:
amulet-corewhich does support thisIn your example it would be something like: