Add Ground Zero terrain pipeline and playable assets
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
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),
|
||||
"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_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()
|
||||
Reference in New Issue
Block a user