用Python批量给Minecraft Classic重制版替换材质

Minecraft Classic的默认材质看久了,总觉得没有意思,既然Java版和基岩版可以换材质,那网页重制版又为什么不能呢?
其实要给网页版替换材质,只需把材质包里图像的名称改一改,换掉原图像就好了。当然,如果纯手动的话,要花很长时间,幸好我们还有Python,事情就容易很多啦。

完整Python代码如下(genTex用于重命名/裁剪/重新着色Minecraft材质包里的图像文件,renmPrev用来重命名渲染器生成的文件,genResized用来补全几个不需要三维渲染的图标。另外原木方块因为顶面和侧面材质不同,故物品栏图标需要单独手动渲染):

import os
from shutil import copyfile
from PIL import Image, ImageOps

#src_path = r'E:/Bobcorn/Textures/ocdpack187113693/assets/minecraft/textures/blocks/'
#src_path = r'G:/Bobcorn/Images/Block Renders/renders/'
src_path = r'G:/Bobcorn/Minecraft Classic Remake/assets/textures-ocd/'
out_path = r'./tex-maker/'

names = {
    'grass_top': 'grass',
    'grass_side': 'grass_dirt',
    'stone': 'stone',
    'dirt': 'dirt',
    'planks_oak': 'wood',
    'flower_rose': 'red_flower',
    'flower_dandelion':'yellow_flower',
    'water_still': 'water',
    'sapling_oak': 'bush',
    'cobblestone': 'rock',
    'bedrock': 'bedrock',
    'sand': 'sand',
    'gravel': 'gravel',
    'log_oak': 'tree_side',
    'log_oak_top': 'tree_top',
    'leaves_oak': 'leaves_opaque',
    'mushroom_red': 'red_mushroom',
    'mushroom_brown': 'brown_mushroom',
    'lava_still': 'lava',
    'gold_ore': 'rock_gold',
    'iron_ore': 'rock_bronze',
    'coal_ore': 'rock_coal',
    'gold_block': 'gold',
    'sponge': 'sponge',
    'glass': 'glass',
    'wool_colored_red': 'color0',
    'wool_colored_orange': 'color1',
    'wool_colored_yellow': 'color2',
    'wool_colored_lime': 'color3',
    'wool_colored_green': 'color4',
    'wool_colored_brown': 'color5',
    'wool_colored_light_blue': 'color6',
    'wool_colored_cyan': 'color7',
    'wool_colored_blue': 'color8',
    'wool_colored_black': 'color9',
    'wool_colored_purple': 'color10',
    'wool_colored_magenta': 'color11',
    'wool_colored_pink': 'color12',
    'wool_colored_gray': 'color13',
    'wool_colored_silver': 'color14',
    'wool_colored_white': 'color15'
}

#Names of preview icons...
names_prev = {
    'stone': '2',
    'dirt': '3',
    'wood': '4',
    'rock': '9',
    'sand': '11',
    'gravel': '12',
    'leaves_opaque': '14',
    'gold': '21',
    'sponge': '22',
    'glass': '23',
    'color0': '24',
    'color1': '25',
    'color2': '26',
    'color3': '27',
    'color4': '28',
    'color5': '29',
    'color6': '30',
    'color7': '31',
    'color8': '32',
    'color9': '33',
    'color10': '34',
    'color11': '35',
    'color12': '36',
    'color13': '37',
    'color14': '38',
    'color15': '39'
}

names_resz = {
    'red_flower': '5',
    'yellow_flower': '6',
    'bush': '8',
    'red_mushroom': '15',
    'brown_mushroom': '16'
}

rec = ['grass','leaves_opaque']
crp = ['rock_gold','rock_coal','rock_bronze']

def recolor(n):
    srci = Image.open(out_path + n + '.png').convert('RGBA')
    #Preserve the alpha value before converting it..
    r,g,b,alpha = srci.split()
    gray = srci.convert('L')
    rec = ImageOps.colorize(gray, (0,0,0), (255,255,255), (87,182,50), 0 ,255 ,157).convert('RGBA')
    #Recover its transparency..
    rec.putalpha(alpha)
    #rec.show()
    rec.save(out_path + n + '.png')

def crop(n):
    srci = Image.open(out_path + n + '.png') #.convert('L')
    cropped = srci.crop((0,0,srci.width,srci.width))
    #cropped.show()
    cropped.save(out_path + n + '.png')

def resize(n, op):
    srci = Image.open(src_path + n + '.png') #.convert('L')
    resized = srci.resize((32,32),Image.NEAREST)
    resized.save(op)

def genTex():
    #Prepare Output Folder...
    if (not os.path.exists(out_path)):
        os.mkdir(out_path)

    for i in names.keys():
        if (os.path.exists(src_path + i + '.png')):
            copyfile(src_path + i + '.png', out_path + names[i] + '.png')
        else:
            print('ERROR: File not found: ' + src_path + i + '.png')

    for j in rec:
        if (os.path.exists(out_path + j + '.png')):
            recolor(j)
        else:
            print('ERROR: File not found: ' + src_path + j + '.png')

    for k in crp:
        if (os.path.exists(out_path + k + '.png')):
            crop(k)
        else:
            print('ERROR: File not found: ' + src_path + k + '.png')

def genResized():
    #Prepare Output Folder...
    if (not os.path.exists(out_path)):
        os.mkdir(out_path)

    for i in names_resz.keys():
        if (os.path.exists(src_path + i + '.png')):
            resize(i, out_path + names_resz[i] + '.png')
        else:
            print('ERROR: File not found: ' + src_path + i + '.png')

def renmPrev():
    #Prepare Output Folder...
    if (not os.path.exists(out_path)):
        os.mkdir(out_path)

    for i in names_prev.keys():
        if (os.path.exists(src_path + i + '.png')):
            copyfile(src_path + i + '.png', out_path + names_prev[i] + '.png')
        else:
            print('ERROR: File not found: ' + src_path + i + '.png')

def main():
    #genTex()
    #renmPrev()
    genResized()

if __name__ == '__main__':
    main()

上两张效果图:

BD Craft(五边形材质包):

OCD材质包:

细心的读者可能发现了,物品栏里的材质并没有跟随方块的材质改变,这是因为这个重制版把物品的图标预先渲染成了图像。那么要想改变这个,就只能自己动手渲染了。可是Python并不能很方便地渲染这种三维图形,于是我便在网上找到了用于制作Minecraft方块预览图像的工具,并稍加改造,使得批量渲染变得更加方便。
可以在这里查看:https://codepen.io/devbobcorn/pen/LYZxgep

最终效果:

至此,材质包自定义圆满完成,撒花!

posted @ 2020-10-23 23:37  DevBobcorn  阅读(502)  评论(0编辑  收藏  举报