167 lines
5.5 KiB
Python
167 lines
5.5 KiB
Python
import unreal
|
|
|
|
|
|
RECIPE_FOLDER = "/Game/Agrarian/DataAssets/Recipes"
|
|
|
|
ITEM_DISPLAY = {
|
|
"wood": ("Wood", 1.0),
|
|
"stone": ("Stone", 1.5),
|
|
"fiber": ("Fiber", 0.1),
|
|
"hide": ("Hide", 0.7),
|
|
"primitive_frame": ("Primitive Frame", 3.0),
|
|
"primitive_wall_panel": ("Primitive Wall Panel", 4.0),
|
|
"primitive_roof_panel": ("Primitive Roof Panel", 4.0),
|
|
"campfire": ("Campfire", 12.0),
|
|
"primitive_shelter": ("Primitive Shelter", 25.0),
|
|
"simple_container": ("Simple Container", 8.0),
|
|
"basic_tool": ("Basic Tool", 1.2),
|
|
"bandage": ("Bandage", 0.1),
|
|
}
|
|
|
|
RECIPES = [
|
|
{
|
|
"asset": "DA_Recipe_Campfire",
|
|
"recipe_id": "campfire",
|
|
"display_name": "Campfire",
|
|
"ingredients": [("wood", 5), ("stone", 8), ("fiber", 2)],
|
|
"result": ("campfire", 1),
|
|
"craft_seconds": 8.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_PrimitiveShelter",
|
|
"recipe_id": "primitive_shelter",
|
|
"display_name": "Primitive Shelter",
|
|
"ingredients": [
|
|
("primitive_frame", 2),
|
|
("primitive_wall_panel", 4),
|
|
("primitive_roof_panel", 2),
|
|
("hide", 2),
|
|
("fiber", 6),
|
|
],
|
|
"result": ("primitive_shelter", 1),
|
|
"craft_seconds": 20.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_PrimitiveFrame",
|
|
"recipe_id": "primitive_frame",
|
|
"display_name": "Primitive Frame",
|
|
"ingredients": [("wood", 4), ("fiber", 2)],
|
|
"result": ("primitive_frame", 1),
|
|
"craft_seconds": 8.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_PrimitiveWallPanel",
|
|
"recipe_id": "primitive_wall_panel",
|
|
"display_name": "Primitive Wall Panel",
|
|
"ingredients": [("wood", 3), ("fiber", 2)],
|
|
"result": ("primitive_wall_panel", 1),
|
|
"craft_seconds": 6.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_PrimitiveRoofPanel",
|
|
"recipe_id": "primitive_roof_panel",
|
|
"display_name": "Primitive Roof Panel",
|
|
"ingredients": [("wood", 3), ("fiber", 3)],
|
|
"result": ("primitive_roof_panel", 1),
|
|
"craft_seconds": 7.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_BasicTool",
|
|
"recipe_id": "basic_tool",
|
|
"display_name": "Basic Tool",
|
|
"ingredients": [("wood", 1), ("stone", 2), ("fiber", 1)],
|
|
"result": ("basic_tool", 1),
|
|
"craft_seconds": 6.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_SimpleContainer",
|
|
"recipe_id": "simple_container",
|
|
"display_name": "Simple Container",
|
|
"ingredients": [("wood", 3), ("fiber", 6), ("hide", 2)],
|
|
"result": ("simple_container", 1),
|
|
"craft_seconds": 10.0,
|
|
"requires_campfire": False,
|
|
},
|
|
{
|
|
"asset": "DA_Recipe_Bandage",
|
|
"recipe_id": "bandage",
|
|
"display_name": "Bandage",
|
|
"ingredients": [("fiber", 3), ("hide", 1)],
|
|
"result": ("bandage", 1),
|
|
"craft_seconds": 4.0,
|
|
"requires_campfire": False,
|
|
},
|
|
]
|
|
|
|
|
|
def make_stack(item_id, quantity):
|
|
display_name, unit_weight = ITEM_DISPLAY[item_id]
|
|
stack = unreal.AgrarianItemStack()
|
|
stack.set_editor_property("item_id", item_id)
|
|
stack.set_editor_property("display_name", display_name)
|
|
stack.set_editor_property("quantity", quantity)
|
|
stack.set_editor_property("unit_weight", unit_weight)
|
|
return stack
|
|
|
|
|
|
def set_requires_campfire(recipe, value):
|
|
for property_name in ("requires_campfire", "b_requires_campfire"):
|
|
try:
|
|
recipe.set_editor_property(property_name, value)
|
|
return
|
|
except Exception:
|
|
continue
|
|
|
|
if value:
|
|
raise RuntimeError("Could not set bRequiresCampfire on recipe asset")
|
|
|
|
|
|
def create_or_load_recipe_asset(asset_name):
|
|
path = f"{RECIPE_FOLDER}/{asset_name}"
|
|
existing = unreal.EditorAssetLibrary.load_asset(path)
|
|
if existing:
|
|
return existing
|
|
|
|
factory = unreal.DataAssetFactory()
|
|
factory.set_editor_property("data_asset_class", unreal.AgrarianRecipeDataAsset)
|
|
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
|
|
asset = asset_tools.create_asset(asset_name, RECIPE_FOLDER, unreal.AgrarianRecipeDataAsset, factory)
|
|
if not asset:
|
|
raise RuntimeError(f"Could not create {path}")
|
|
return asset
|
|
|
|
|
|
def apply_recipe(asset, recipe_data):
|
|
recipe = unreal.AgrarianRecipe()
|
|
recipe.set_editor_property("recipe_id", recipe_data["recipe_id"])
|
|
recipe.set_editor_property("display_name", recipe_data["display_name"])
|
|
recipe.set_editor_property(
|
|
"ingredients",
|
|
[make_stack(item_id, quantity) for item_id, quantity in recipe_data["ingredients"]],
|
|
)
|
|
result_id, result_quantity = recipe_data["result"]
|
|
recipe.set_editor_property("result", make_stack(result_id, result_quantity))
|
|
recipe.set_editor_property("craft_seconds", recipe_data["craft_seconds"])
|
|
set_requires_campfire(recipe, recipe_data["requires_campfire"])
|
|
asset.set_editor_property("recipe", recipe)
|
|
unreal.EditorAssetLibrary.save_loaded_asset(asset)
|
|
|
|
|
|
def main():
|
|
unreal.EditorAssetLibrary.make_directory(RECIPE_FOLDER)
|
|
for recipe_data in RECIPES:
|
|
asset = create_or_load_recipe_asset(recipe_data["asset"])
|
|
apply_recipe(asset, recipe_data)
|
|
unreal.log(f"Configured recipe: {recipe_data['recipe_id']} -> {RECIPE_FOLDER}/{recipe_data['asset']}")
|
|
|
|
unreal.log("Agrarian recipe setup complete.")
|
|
|
|
|
|
main()
|