diff --git a/scripts/gen_potato_rotten.py b/scripts/gen_potato_rotten.py deleted file mode 100644 index 1880f15..0000000 --- a/scripts/gen_potato_rotten.py +++ /dev/null @@ -1,59 +0,0 @@ -import os -import urllib.request -from io import BytesIO - -from PIL import Image - -OUT = os.path.join( - os.path.dirname(__file__), - "..", - "ItemsAdder", - "tfmc_cooking", - "resourcepack", - "assets", - "tfmc_cooking", - "textures", - "item", - "vanilla", - "potato_rotten.png", -) -URL = ( - "https://raw.githubusercontent.com/InventivetalentDev/minecraft-assets/" - "1.21.1/assets/minecraft/textures/item/potato.png" -) - - -def make_rotten(img: Image.Image) -> Image.Image: - img = img.convert("RGBA").resize((16, 16), Image.NEAREST) - out = Image.new("RGBA", img.size) - px = img.load() - opx = out.load() - for y in range(img.height): - for x in range(img.width): - r, g, b, a = px[x, y] - if a == 0: - opx[x, y] = (0, 0, 0, 0) - continue - gray = 0.299 * r + 0.587 * g + 0.114 * b - nr = int(r * 0.35 + gray * 0.45 + 28) - ng = int(g * 0.30 + gray * 0.40 + 32) - nb = int(b * 0.25 + gray * 0.30 + 18) - opx[x, y] = ( - max(0, min(255, nr)), - max(0, min(255, ng)), - max(0, min(255, nb)), - a, - ) - return out - - -def main() -> None: - os.makedirs(os.path.dirname(OUT), exist_ok=True) - with urllib.request.urlopen(URL, timeout=30) as resp: - data = resp.read() - make_rotten(Image.open(BytesIO(data))).save(OUT) - print("wrote", OUT) - - -if __name__ == "__main__": - main() diff --git a/scripts/gen_sausage_items_yaml.py b/scripts/gen_sausage_items_yaml.py deleted file mode 100644 index e61ae88..0000000 --- a/scripts/gen_sausage_items_yaml.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Print ItemsAdder YAML block for all 24 sausage items.""" -STATES = ("raw", "cooked", "rotten", "burnt") -STATE_LABEL = {"raw": "Raw", "cooked": "Cooked", "rotten": "Rotten", "burnt": "Burnt"} - - -def item_block(item_id: str, display_name: str, model_path: str) -> str: - return f""" {item_id}: - display_name: "{display_name}" - resource: - material: TROPICAL_FISH - generate: false - model_path: {model_path} -""" - - -def main() -> None: - lines = [] - for state in STATES: - label = STATE_LABEL[state] - lines.append(item_block( - f"sausage_{state}", - f"Sausage {label}", - f"item/ingredients/sausage/sausage_{state}", - )) - for state in STATES: - label = STATE_LABEL[state] - for n in range(1, 6): - count = 6 - n - lines.append(item_block( - f"sausage_chain_{state}_{n}", - f"Sausage Chain {label} ({count})", - f"item/ingredients/sausage/sausage_chain_{state}_{n}", - )) - print("\n".join(lines)) - - -if __name__ == "__main__": - main() diff --git a/scripts/gen_sausage_models.py b/scripts/gen_sausage_models.py deleted file mode 100644 index 96ede0e..0000000 --- a/scripts/gen_sausage_models.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Clone sausage model JSONs for cooked/rotten/burnt states (texture path swap only).""" -import json -import os - -MODEL_DIR = os.path.join( - os.path.dirname(__file__), - "..", - "ItemsAdder", - "tfmc_cooking", - "resourcepack", - "assets", - "tfmc_cooking", - "models", - "item", - "ingredients", - "sausage", -) - -STATES = ("cooked", "rotten", "burnt") -TEXTURE_PREFIX = "tfmc_cooking:item/ingredients/sausage/sausage_" - - -def swap_textures(data: dict, state: str) -> None: - tex = f"{TEXTURE_PREFIX}{state}" - textures = data.get("textures", {}) - for key in list(textures.keys()): - val = textures[key] - if isinstance(val, str) and "sausage_" in val: - textures[key] = tex - - -def write_json(path: str, data: dict) -> None: - with open(path, "w", encoding="utf-8") as f: - json.dump(data, f, indent="\t") - f.write("\n") - print("wrote", os.path.basename(path)) - - -def main() -> None: - raw_single = os.path.join(MODEL_DIR, "sausage_raw.json") - with open(raw_single, encoding="utf-8") as f: - single_template = json.load(f) - - for state in STATES: - data = json.loads(json.dumps(single_template)) - swap_textures(data, state) - write_json(os.path.join(MODEL_DIR, f"sausage_{state}.json"), data) - - for n in range(1, 6): - raw_chain = os.path.join(MODEL_DIR, f"sausage_chain_raw_{n}.json") - with open(raw_chain, encoding="utf-8") as f: - chain_template = json.load(f) - for state in STATES: - data = json.loads(json.dumps(chain_template)) - swap_textures(data, state) - write_json(os.path.join(MODEL_DIR, f"sausage_chain_{state}_{n}.json"), data) - - -if __name__ == "__main__": - main() diff --git a/scripts/gen_sausage_variants.py b/scripts/gen_sausage_variants.py deleted file mode 100644 index 6e20b19..0000000 --- a/scripts/gen_sausage_variants.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Generate sausage_cooked/rotten/burnt.png from sausage_raw using pork_steak color deltas.""" -import os - -from PIL import Image - -BASE = os.path.join( - os.path.dirname(__file__), - "..", - "ItemsAdder", - "tfmc_cooking", - "resourcepack", - "assets", - "tfmc_cooking", - "textures", - "item", - "ingredients", -) - -SAUSAGE_DIR = os.path.join(BASE, "sausage") -PORK_DIR = os.path.join(BASE, "pork") - -STATES = ("cooked", "rotten", "burnt") - - -def load_rgba(path: str) -> Image.Image: - return Image.open(path).convert("RGBA") - - -def channel_delta(src: Image.Image, dst: Image.Image) -> tuple[float, float, float, float]: - """Mean per-channel offset from src to dst on opaque pixels.""" - spx = src.load() - dpx = dst.load() - sums = [0.0, 0.0, 0.0, 0.0] - count = 0 - for y in range(src.height): - for x in range(src.width): - sr, sg, sb, sa = spx[x, y] - if sa < 8: - continue - dr, dg, db, da = dpx[x, y] - if da < 8: - continue - sums[0] += dr - sr - sums[1] += dg - sg - sums[2] += db - sb - sums[3] += da - sa - count += 1 - if count == 0: - return (0.0, 0.0, 0.0, 0.0) - return tuple(v / count for v in sums) - - -def apply_delta(img: Image.Image, delta: tuple[float, float, float, float]) -> Image.Image: - out = Image.new("RGBA", img.size) - px = img.load() - opx = out.load() - for y in range(img.height): - for x in range(img.width): - r, g, b, a = px[x, y] - if a == 0: - opx[x, y] = (0, 0, 0, 0) - continue - nr = int(max(0, min(255, r + delta[0]))) - ng = int(max(0, min(255, g + delta[1]))) - nb = int(max(0, min(255, b + delta[2]))) - na = int(max(0, min(255, a + delta[3]))) - opx[x, y] = (nr, ng, nb, na) - return out - - -def main() -> None: - sausage_raw_path = os.path.join(SAUSAGE_DIR, "sausage_raw.png") - pork_raw_path = os.path.join(PORK_DIR, "pork_steak_raw.png") - if not os.path.isfile(sausage_raw_path): - raise SystemExit(f"Missing {sausage_raw_path}") - if not os.path.isfile(pork_raw_path): - raise SystemExit(f"Missing {pork_raw_path}") - - sausage_raw = load_rgba(sausage_raw_path) - pork_raw = load_rgba(pork_raw_path) - - os.makedirs(SAUSAGE_DIR, exist_ok=True) - - for state in STATES: - pork_state_path = os.path.join(PORK_DIR, f"pork_steak_{state}.png") - if not os.path.isfile(pork_state_path): - raise SystemExit(f"Missing {pork_state_path}") - pork_state = load_rgba(pork_state_path) - delta = channel_delta(pork_raw, pork_state) - out = apply_delta(sausage_raw, delta) - out_path = os.path.join(SAUSAGE_DIR, f"sausage_{state}.png") - out.save(out_path) - print("wrote", out_path, "delta", tuple(round(d, 2) for d in delta)) - - -if __name__ == "__main__": - main() diff --git a/scripts/gen_yeast_dough_rotten.py b/scripts/gen_yeast_dough_rotten.py deleted file mode 100644 index bdf1bf9..0000000 --- a/scripts/gen_yeast_dough_rotten.py +++ /dev/null @@ -1,60 +0,0 @@ -import os - -from PIL import Image - -ROOT = os.path.join( - os.path.dirname(__file__), - "..", - "ItemsAdder", - "tfmc_cooking", - "resourcepack", - "assets", - "tfmc_cooking", - "textures", - "item", -) - -PAIRS = [ - ("intermediate", "yeast.png", "yeast_rotten.png"), - ("intermediate", "dough.png", "dough_rotten.png"), - ("bulk", "yeast.png", "yeast_rotten.png"), - ("bulk", "dough.png", "dough_rotten.png"), - ("intermediate", "flour.png", "flour_rotten.png"), - ("bulk", "flour.png", "flour_rotten.png"), -] - - -def make_rotten(img: Image.Image) -> Image.Image: - img = img.convert("RGBA") - out = Image.new("RGBA", img.size) - px = img.load() - opx = out.load() - for y in range(img.height): - for x in range(img.width): - r, g, b, a = px[x, y] - if a == 0: - opx[x, y] = (0, 0, 0, 0) - continue - gray = 0.299 * r + 0.587 * g + 0.114 * b - nr = int(r * 0.35 + gray * 0.45 + 28) - ng = int(g * 0.30 + gray * 0.40 + 32) - nb = int(b * 0.25 + gray * 0.30 + 18) - opx[x, y] = ( - max(0, min(255, nr)), - max(0, min(255, ng)), - max(0, min(255, nb)), - a, - ) - return out - - -def main() -> None: - for folder, src_name, dest_name in PAIRS: - src = os.path.join(ROOT, folder, src_name) - dest = os.path.join(ROOT, folder, dest_name) - make_rotten(Image.open(src)).save(dest) - print("wrote", dest) - - -if __name__ == "__main__": - main() diff --git a/src/main/java/net/tfminecraft/cooking/utils/TrackCombiner.java b/src/main/java/net/tfminecraft/cooking/utils/TrackCombiner.java deleted file mode 100644 index 4968759..0000000 --- a/src/main/java/net/tfminecraft/cooking/utils/TrackCombiner.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.tfminecraft.cooking.utils; - -import java.util.Map; - -import net.tfminecraft.cooking.item.tag.TagTrack; -import net.tfminecraft.cooking.loader.TrackLoader; -import net.tfminecraft.cooking.item.FoodItem; - -public class TrackCombiner { - public static TagTrack getCombinedTracks(Map items, String id) { - TagTrack track = TrackLoader.getByString(id); - if(track == null) return null; - if(!track.isAgeable()) return track; - int count = 0; - int total = 0; - for(Map.Entry entry : items.entrySet()) { - FoodItem item = entry.getKey(); - int amount = entry.getValue(); - if(item.hasTagTrack(id)) { - count += amount; - total += item.getTagTrack(id).getValue()*amount; - } - } - if(total > 0 && count > 0) { - track.setValue(total/count); - } - return track; - } -}