Select a prefab to view loot tables
Drag & Drop mapped_prefabs_data.json here
| Type | Description |
|---|---|
SELECTION (Pick N) | Randomly selects N items from the pool |
BUNDLE (All) | Guarantees all items in the section |
Included: [Table] | References another loot table |
| Yellow badges | Drop chance percentage |
You can generate data for any Hytale version using the files included with the game. No coding skills required!
Go to your Hytale installation folder and find this file:
.../Hytale/Install/package/latest/Assets.zip
Open Assets.zip and navigate into Assets/Server/.
Extract these two folders to the same folder as this tool:
Prefabs (contains structure data)Drops/Prefabs (contains loot tables)Run the script below to generate a new mapped_prefabs_data.json file.
import json
from pathlib import Path
# Configuration - paths relative to script location
DROP_TABLES_DIR = Path("./Drops/Prefabs")
PREFABS_ROOT_DIR = Path("./Prefabs")
OUTPUT_FILE = "mapped_prefabs_data.json"
def load_loot_tables(directory):
"""Load all loot table JSON files."""
loot_map = {}
if not directory.exists():
print(f"Error: {directory} not found")
print("Extract 'Drops\\Prefabs' from Assets.zip first")
return loot_map
for file_path in directory.rglob("*.json"):
try:
with open(file_path, 'r', encoding='utf-8') as f:
loot_map[file_path.stem] = json.load(f)
except Exception as e:
print(f"Error loading {file_path.name}: {e}")
return loot_map
def process_prefabs(prefabs_dir, loot_tables):
"""Process all prefab files and extract chest data."""
results = []
used_loot_ids = set()
if not prefabs_dir.exists():
print(f"Error: {prefabs_dir} not found")
print("Extract 'Prefabs' from Assets.zip first")
return results, used_loot_ids
for file_path in prefabs_dir.rglob("*.json"):
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
except:
continue
blocks = data.get("blocks")
if not isinstance(blocks, list):
continue
rel_path = file_path.relative_to(prefabs_dir)
prefab_info = {
"structure_name": rel_path.parts[0] if len(rel_path.parts) > 1 else "Root",
"prefab_name": file_path.name,
"relative_path_from_root": str(rel_path),
"total_chests": 0,
"chests": []
}
for block in blocks:
if block.get("name") == "Block_Spawner_Block":
components = block.get("components", {}).get("Components", {})
tier_id = components.get("BlockSpawner", {}).get("BlockSpawnerId")
if tier_id:
used_loot_ids.add(tier_id)
prefab_info["chests"].append({
"location": {"x": block["x"], "y": block["y"], "z": block["z"]},
"loot_table_id": tier_id
})
prefab_info["total_chests"] += 1
if prefab_info["total_chests"] > 0:
results.append(prefab_info)
return results, used_loot_ids
def main():
print("Hytale Loot Table Extractor")
print("=" * 40)
print(f"Looking for: {DROP_TABLES_DIR} and {PREFABS_ROOT_DIR}")
print()
all_loot_tables = load_loot_tables(DROP_TABLES_DIR)
print(f"Loaded {len(all_loot_tables)} loot tables")
prefabs_data, used_loot_ids = process_prefabs(PREFABS_ROOT_DIR, all_loot_tables)
print(f"Processed {len(prefabs_data)} prefabs with chests")
filtered_definitions = {
tid: all_loot_tables[tid] for tid in used_loot_ids if tid in all_loot_tables
}
output = {
"loot_table_definitions": filtered_definitions,
"prefabs": prefabs_data
}
print(f"Writing to {OUTPUT_FILE}...")
with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
json.dump(output, f, indent=2)
print(f"Success! {len(prefabs_data)} structures, {len(filtered_definitions)} loot tables")
if __name__ == "__main__":
main()
showMissingIconsReport() in console