Files
2026-10-09 18:08:05 +08:00

121 lines
5.6 KiB
Python

# -*- coding: utf-8 -*-
"""把 sa_core 76 个材料做成网易版 AddOn 物品:beh json + res json + item_texture + zh_CN.lang + 贴图"""
import csv, os, json, shutil
BASE = r'e:\MCStudioDownload\work\3027246179@qq.com\Cpp\AddOn\309c2d420bc84ee986db9cdd070ff02a'
BEH = os.path.join(BASE, 'behavior_pack_kcH4M5u0', 'netease_items_beh')
RES = os.path.join(BASE, 'resource_pack_t7eJjrxY', 'netease_items_res')
TEX = os.path.join(BASE, 'resource_pack_t7eJjrxY', 'textures', 'items')
SRC_TEX = os.path.join(BASE, '_sa_material_textures')
ITEM_TEX = os.path.join(BASE, 'resource_pack_t7eJjrxY', 'textures', 'item_texture.json')
LANG = os.path.join(BASE, 'resource_pack_t7eJjrxY', 'texts', 'zh_CN.lang')
# 读取材料清单(序号,贴图文件,物品ID,中文名,英文名,路径)
mats = []
with open(os.path.join(BASE, '_sa_materials.csv'), encoding='utf-8-sig') as f:
for row in csv.reader(f):
if row and row[1].endswith('.png') and row[0].isdigit():
mats.append((row[1][:-4], row[3])) # (name, zh)
# 描述:特判字典 + 关键词兜底
SPECIAL = {
'dirty_water_bottle': '饮用可能引起饥饿',
'generator_manual': '学习手册并完成实践训练以操作汽油发电机。',
'matchbox': '点燃方块和火焰',
'sterilized_rags': '清洁医用布。使用后返还脏抹布',
'rope': '可放置且可攀爬,落上时可防止摔落伤害',
'jerry_can': '用于储存液体:右键液体源收集,Shift+右键倒出',
'saw_blade': '锯子部件,用于制作工具',
'money': '战利品货币',
'money_bundle': '一捆货币',
'blank': '',
}
META_KEYS = ('ashen_steel_ingot', 'ashen_steel_mixture', 'ashen_steel_nugget', 'ashen_steel_rod',
'metal_pipe', 'metal_sheet', 'small_metal_sheet', 'scrap_nugget',
'diamond_nugget', 'netherite_nugget')
FABRIC_KEYS = ('cloth', 'dirty_rags', 'dish_towel', 'fabric_patch', 'fiber_fabric', 'polyester',
'rags', 'sterilized_rags', 'kevlar', 'leather_strip')
THREAD_KEYS = ('thread', 'kevlar_thread', 'polyester_thread', 'copper_wire', 'insulated_copper_wire', 'wire')
FASTENER_KEYS = ('nails', 'screws', 'box_of_nails', 'box_of_screws', 'box_of_paperclips', 'paperclip')
SCRAP_KEYS = ('metal_scrap', 'electric_scrap', 'scrap_wood')
PLASTIC_KEYS = ('plastic', 'plastic_bag', 'plastic_plate', 'cardboard')
ADHESIVE_KEYS = ('glue', 'medical_adhesive', 'adhesive_tape', 'duct_tape')
def make_desc(name, zh):
if name in SPECIAL:
return SPECIAL[name]
if name in META_KEYS:
return '用于锻造与回收的金属材料。'
if name in SCRAP_KEYS:
return '可回收利用的材料。'
if name in FABRIC_KEYS:
return '用于缝制、修复与回收的织物材料。'
if name in THREAD_KEYS:
return '用于制作与缝合的线材。'
if name in FASTENER_KEYS:
return '用于组装的紧固件。'
if name in PLASTIC_KEYS:
return '可用于制作物品的塑料材料。'
if name in ADHESIVE_KEYS:
return '修复与组装的粘合材料。'
if name in ('battery', 'camera', 'cellphone', 'classic_watch', 'falsh_lights'):
return '可拆解的电子元件。'
if name in ('sulfur', 'sulfur_dust', 'charcoal_dust', 'gunpowder_bottle'):
return '可用于制作的化学材料。'
if name in ('empty_can', 'dented_can', 'tin_can', 'empty_glass_bottle'):
return '空容器,可回收利用。'
if name in ('water_bottle', 'water_bottle2', 'alcohol', 'rubbing_alcohol', 'cleaning_liquid',
'hair_gel', 'fermented_mash', 'gasoline_bucket'):
return '装有液体的容器。'
if name in ('lunch_bag',):
return '存放食物的袋子。'
return '合成与回收材料。'
# 1) 生成 beh / res json + 复制贴图
beh_tpl = {'format_version': '1.10', 'minecraft:item': {
'components': {'minecraft:max_stack_size': 64},
'description': {'category': 'dn_sa', 'identifier': 'dn_sa:%s'}}}
res_tpl = {'format_version': '1.10', 'minecraft:item': {
'components': {'minecraft:icon': 'dn_sa:%s'},
'description': {'identifier': 'dn_sa:%s'}}}
count = 0
for name, zh in mats:
beh_path = os.path.join(BEH, 'dn_sa_%s.json' % name)
res_path = os.path.join(RES, 'dn_sa_%s.json' % name)
with open(beh_path, 'w', encoding='utf-8') as f:
json.dump(beh_tpl, f, ensure_ascii=False, indent=4)
with open(res_path, 'w', encoding='utf-8') as f:
json.dump(res_tpl, f, ensure_ascii=False, indent=4)
shutil.copy2(os.path.join(SRC_TEX, name + '.png'), os.path.join(TEX, name + '.png'))
count += 1
print('已生成物品 json + 复制贴图:', count)
# 2) item_texture.json 追加
with open(ITEM_TEX, encoding='utf-8') as f:
it = json.load(f)
added = 0
for name, zh in mats:
key = 'dn_sa:%s' % name
if key not in it['texture_data']:
it['texture_data'][key] = {'textures': 'textures/items/%s' % name}
added += 1
with open(ITEM_TEX, 'w', encoding='utf-8') as f:
json.dump(it, f, ensure_ascii=False, indent=4)
print('item_texture.json 新增条目:', added, '| 总数:', len(it['texture_data']))
# 3) zh_CN.lang 追加 name + desc
lang = open(LANG, encoding='utf-8').read()
lines_added = 0
new_lines = []
existing = set(lang.splitlines())
for name, zh in mats:
nk = 'item.dn_sa:%s.name=%s' % (name, zh)
dk = 'item.dn_sa:%s.desc=%s' % (name, make_desc(name, zh))
if nk not in existing:
new_lines.append(nk); new_lines.append(dk); lines_added += 2
if new_lines:
with open(LANG, 'a', encoding='utf-8') as f:
f.write('\n' + '\n'.join(new_lines) + '\n')
print('zh_CN.lang 追加条目:', lines_added)