跳转至

ModAPI-ModUtil

本文的函数定义在游戏脚本跟目录下的modutil.lua,是一系列适用于Mod环境的API,它们是klei专门提供给Mod开发者的,在Mod环境内不需要引用全局变量即可使用。这些API作用非常丰富,掌握好了可以让你的Mod开发水平更上一层楼。

API列表

其中可用范围的含义,全部是指可以在modmain和modworldgenmain中使用。

函数名 输入参数 作用 分类 可用范围 已解析
GetModConfigData optionname, get_local_config 获取模组配置数据 Mod系统 全部
ReloadFrontEndAssets (无参数) 重新加载前端资源 Mod系统 全部
ReloadPreloadAssets (无参数) 重新加载预加载资源 Mod系统 全部
AddGameMode game_mode, game_mode_text [已废弃]添加游戏模式。此功能转移到了modinfo中进行定义 地图 全部
AddLevel arg1, arg2, ... 添加level 地图 全部
AddLevelPreInit levelid, fn 修改level 地图 全部
AddLevelPreInitAny fn 修改全部level 地图 全部
AddLocation arg1, ... 添加location 地图 全部
AddRoom arg1, ... 添加room 地图 全部
AddRoomPreInit roomname, fn 修改room 地图 全部
AddStartLocation arg1, ... 添加startlocation 地图 全部
AddTask arg1, ... 添加task 地图 全部
AddTaskPreInit taskname, fn 修改task 地图 全部
AddTaskSet arg1, ... 添加taskset 地图 全部
AddTaskSetPreInit tasksetname, fn 修改taskset 地图 全部
AddTaskSetPreInitAny fn 修改全部taskset 地图 全部
AddCustomizeGroup category, name, text, desc, atlas, order 添加自定义分组 建房UI 全部
AddCustomizeItem category, group, name, itemsettings 添加自定义项目 建房UI 全部
GetCustomizeDescription description 获取自定义描述 建房UI 全部
RemoveCustomizeGroup category, name 删除自定义分组 建房UI 全部
RemoveCustomizeItem category, name 删除自定义项目 建房UI 全部
AddClassPostConstruct package, fn [猜测]与类修改有关,常用于UI组件修改 其它 全部
AddGamePostInit fn [猜测]添加游戏后初始化函数,较少用到 其它 全部
AddGlobalClassPostConstruct package, classname, fn [猜测]与类修改有关,可指定单个类,常用于UI组件修改 其它 全部
AddSimPostInit fn [猜测]添加模拟后初始化函数,较少用到 其它 全部
AddBrainPostInit brain, fn 修改brain AI 仅modmain
AddLoadingTip stringtable, id, tipstring, controltipdata 添加加载提示 Mod系统 仅modmain
AddModCharacter name, gender, modes 添加Mod角色 Mod系统 仅modmain
RegisterInventoryItemAtlas atlas, prefabname 注册物品栏物品图集 Mod系统 仅modmain
RemoveDefaultCharacter name 移除默认角色 Mod系统 仅modmain
RemoveLoadingTip stringtable, id 移除加载提示 Mod系统 仅modmain
SetLoadingTipCategoryIcon category, categoryatlas, categoryicon 设置加载提示类别图标 Mod系统 仅modmain
SetLoadingTipCategoryWeights weighttable, weightdata 设置加载提示类别权重 Mod系统 仅modmain
AddStategraphActionHandler stategraph, handler 给指定sg添加ActionHandler SG 仅modmain
AddStategraphEvent stategraph, event 给指定sg添加Event SG 仅modmain
AddStategraphPostInit stategraph, fn 修改指定sg SG 仅modmain
AddStategraphState stategraph, state 给指定sg添加state SG 仅modmain
AddAction id, str, fn 添加动作 动作 仅modmain
AddComponentAction actiontype, component, fn 添加组件动作 动作 仅modmain
AddComponentPostInit component, fn 修改指定组件 基础修改 仅modmain
AddPlayerPostInit fn 修改玩家 基础修改 仅modmain
AddPrefabPostInit prefab, fn 修改指定prefab 基础修改 仅modmain
AddPrefabPostInitAny fn 修改任意Prefab 基础修改 仅modmain
AddPopup id 添加弹窗,未知用途 其它 仅modmain
AddUserCommand command_name, data 添加用户命令 其它 仅modmain
AddVoteCommand command_name, init_options_fn, process_result_fn, vote_timeout 添加投票命令 其它 仅modmain
ExcludeClothingSymbolForModCharacter name, symbol 为模组角色排除服装符号 其它 仅modmain
LoadPOFile path, lang 加载翻译文件 其它 仅modmain
SetModHUDFocus focusid, hasfocus 设置ModHUD焦点 其它 仅modmain
AddModShadersInit fn 添加shader初始化函数 特效 仅modmain
AddModShadersSortAndEnable fn 添加shader排序和启用函数 特效 仅modmain
AddClientModRPCHandler namespace, name, fn 添加客户端ModRPCHandler 网络 仅modmain
AddModRPCHandler namespace, name, fn 添加ModRPCHandler 网络 仅modmain
AddReplicableComponent name 添加replica 网络 仅modmain
AddShardModRPCHandler namespace, name, fn 添加分片ModRPCHandler 网络 仅modmain
GetClientModRPC namespace, name 获取客户端ModRPC 网络 仅modmain
GetClientModRPCHandler namespace, name 获取客户端ModRPCHandler 网络 仅modmain
GetModRPC namespace, name 获取ModRPC 网络 仅modmain
GetModRPCHandler namespace, name 获取ModRPCHandler 网络 仅modmain
GetShardModRPC namespace, name 获取分片ModRPC 网络 仅modmain
GetShardModRPCHandler namespace, name 获取分片ModRPCHandler 网络 仅modmain
SendModRPCToClient id_table, ... 向客户端ModRPC 网络 仅modmain
SendModRPCToServer id_table, ... 向主机端发送ModRPC 网络 仅modmain
SendModRPCToShard id_table, ... 向分片发送ModRPC 网络 仅modmain
RemapSoundEvent name, new_name 重映射声音事件 音效 仅modmain
RemoveRemapSoundEvent name 移除重映射声音事件 音效 仅modmain
AddMinimapAtlas atlaspath 添加小地图图标 游戏UI 仅modmain
AddCharacterRecipe name, ingredients, tech, config, extra_filters 添加角色专属制作配方 制作 仅modmain
AddCookerRecipe cooker, recipe 添加烹饪配方 烹饪 仅modmain
AddDeconstructRecipe name, return_ingredients 添加拆解配方 制作 仅modmain
AddIngredientValues names, tags, cancook, candry 添加食材属性值(批量修改) 烹饪 仅modmain
AddPrototyperDef prototyper_prefab, data [待测试]添加原型制作器定义 制作 仅modmain
AddRecipe arg1, ... [已废弃]添加新制作配方 制作 仅modmain
AddRecipe2 name, ingredients, tech, config, filters 添加新制作配方 制作 仅modmain
AddRecipeFilter filter_def, index 添加制作配方分类过滤器 制作 仅modmain
AddRecipePostInit recipename, fn 修改指定制作配方 制作 仅modmain
AddRecipePostInitAny fn 修改任意制作配方 制作 仅modmain
AddRecipeTab rec_str, rec_sort, rec_atlas, rec_icon, rec_owner_tag, rec_crafting_station [已废弃]添加制作栏分类 制作 仅modmain
AddRecipeToFilter recipe_name, filter_name 将制作配方添加到分类过滤器 制作 仅modmain
Recipe ... [已废弃]创建配方 制作 仅modmain
RemoveRecipeFromFilter recipe_name, filter_name 从过滤器中移除制作配方 制作 仅modmain

物品制作

AddRecipe2

作用: 添加一个新的制作配方

参数

  • name (string): 配方的名称。
  • ingredients (table): 配方所需的原料列表。
  • tech (string): 解锁该配方所需的科技名称。
  • (可选)config (table): 一个可选的配置表,包含以下字段:
    • (可选)placer(string): 放置物 prefab,用于显示一个建筑的临时放置物,在放下建筑后就会消失。
    • (可选)min_spacing (num): 建造物的最小间距。
    • (可选)nounlock (bool): 如果为 false,只能在对应的科技建筑旁制作。否则在初次解锁后,就可以在任意地点制作。
    • (可选)numtogive (num): 制作成功后,玩家将获得的物品数量。
    • (可选)builder_tag (string): 要求具备的制作者标签。如果人物没有此标签,便无法制作物品,可以用于人物的专属物品。
    • (必须)atlas (string): 物品图标所在的 atlas 文件路径,用于制作栏显示图片,其实不填也行,但图标会是空的。
    • (可选)image (string): 物品图标的文件名,其实 atlas 中已包含,不必再填。
    • (可选)testfn (function): 放置时的检测函数,比如有些建筑对地形有特殊要求,可以使用此函数检测。
    • (可选)product (string): 产出物,表示制作成功后产生的物品。默认
    • (可选)build_mode (string): 建造模式,必须使用常量表BUILDMODE,形如BUILDMODE.LAND,具体取值为无限制(NONE)、地上(LAND)和水上(WATER)。
    • (可选)build_distance (num): 建造距离,表示玩家与建筑之间的最大距离。
  • (可选)filters (table): 一个可选的过滤器列表,包含要将配方添加到的过滤器名称。

代码示例

-- 文件: modmain.lua
local recipe_name = "lotus_umbrella" -- 配方唯一名称,不可重复,通常用prefab名
local ingredients = {Ingredient("cutgrass", 1), Ingredient("twigs", 1)} -- 原料表
local tech = TECH.NONE -- 所需科技,必须使用常量表TECH的值
local config = {
    atlas = "images/inventoryimages/lotus_umbrella.xml",
}
AddRecipe2(recipe_name, ingredients, tech, config)
STRINGS.RECIPE_DESC.LOTUS_UMBRELLA = "荷叶做的雨伞" -- 制作栏描述

AddCharacterRecipe

作用: 添加角色专属制作配方。实际上参数和作用都和AddRecipe2一样,专属体现在config中的builder_tag

参数 - name (string): 配方的名称。 - ingredients (table): 配方所需的原料列表。 - tech (string): 解锁该配方所需的科技名称。 - (可选) config (table): 一个可选的配置表,同AddRecipe2 - (可选) filters (table): 一个可选的过滤器列表,包含要将配方添加到的额外过滤器名称。

返回值:

  • rec (Recipe2): 创建的 Recipe2 对象。

代码示例

-- 创建一个角色专属配方,只有可读书的人才能使用
local config2 = {
    atlas = "images/inventoryimages/lotus_umbrella.xml",
    builder_tag = "reader",
    product = "lotus_umbrella", -- 当recipe名不是prefab名时,需要显式指定
}
AddCharacterRecipe("lotus_umbrella_few", {Ingredient("cutgrass", 1)}, TECH.NONE, config2, {"SAMANSHA"})

AddRecipeFilter

作用: 添加一个新的配方过滤器。

参数

  • filter_def (table): 过滤器定义,包括以下字段:
    • name (string): 过滤器的ID。主要用于两处,一是 STRINGS.UI.CRAFTING_FILTERS[name]。赋值给出在UI界面上显示的过滤器名字,二是在其它API使用过滤器作为参数时用于指代,请参考示例代码。
    • atlas (string 或 function): 图标的图集,可以是字符串或函数。
    • image (string 或 function): 显示在制作菜单中的图标,可以是字符串或函数。
    • (可选) image_size (table): 自定义图像尺寸,默认64。
    • (可选) custom_pos (table): 自定义的过滤器位置,默认为false。 如果为 true,则过滤器图标不会被添加到网格中,而是把这个分类下的物品都放在mod物品分类下。
    • recipes (table): 不支持此字段! 请创建过滤器后,将过滤器传递给 AddRecipe2()AddRecipeToFilter() 函数。
  • (可选) index (number): 插入过滤器定义的索引。如果提供,将在指定索引处插入过滤器定义;否则,将过滤器定义添加到列表末尾。

代码示例

-- 加载资源
Assets = {
    Asset("ATLAS", "images/craft_samansha_icon.xml"),
}
-- 定义一个新的过滤器对象
local filter_samansha_def = {
    name = "SAMANSHA",
    atlas = "images/craft_samansha_icon.xml",
    image = "craft_samansha_icon.tex"
}
-- 添加自定义过滤器
AddRecipeFilter(filter_samansha_def, 1)
STRINGS.UI.CRAFTING_FILTERS.SAMANSHA ="自定义过滤器" -- 制作栏中显示的名字
-- 创建一个配方,并将其添加到自定义过滤器中,注意用的是过滤器的name参数值
AddRecipe2("my_custom_recipe", ingredients, tech, config, {"SAMANSHA"})

AddRecipeToFilter

作用: 将配方添加到指定的过滤器中。

参数

  • recipe_name (string): 要添加的配方名称。
  • filter_name (string): 要添加配方的过滤器名称。

代码示例

-- 将荷叶伞放到「雨具」分类
AddRecipeToFilter("lotus_umbrella","RAIN")

RemoveRecipeFromFilter

作用: 从指定的过滤器中移除配方。

参数

  • recipe_name (string): 要移除的配方名称。
  • filter_name (string): 要从中移除配方的过滤器名称。

代码示例

-- 将斧头移出「工具」分类
RemoveRecipeFromFilter("axe", "TOOLS")

AddDeconstructRecipe

作用: 添加分解配方,不会在任何过滤器下出现,这只是供「分解法杖」或敲碎不可制作的物品而设计的。

参数

  • name (string): 要添加配方的prefab名。
  • return_ingredients (string): 返还的材料

代码示例

-- 分解斧头得到一个燧石
AddDeconstructRecipe("axe", {Ingredient("flint", 1)})

AddPrototyperDef

作用: 自定义原型机(研究或制作站)在制作菜单中的显示方式。光看这个名字有点难理解,其实原型机就是指科学机器、炼金机器、远古制作台这类东西,过年活动时的神龛也算此类。角色站在旁边时可以制作对应的物品 参数

  • prototyper_prefab (string): 用于原型机的prefab名
  • prototyper_def (table)
    • icon_atlas (string): 图标文档
    • icon_image (string): 图标图片
    • action_str (string): 「建造」按钮显示的字符串,比如神龛显示的是「供奉」
    • is_crafting_station (bool): 是否是制作站,也就是是否只能在停留附近时才能制作对应物品
    • filter_text (string): 在过滤器上的名称

代码示例

local prototyper_prefab = "moon_altar"
prototyper_def = {
    icon_atlas = "images/xxxx.xml", 
    icon_image = "moon_altar.tex",
    is_crafting_station = true,
    action_str = "生产",
    filter_text = "月之产品“
},

AddPrototyperDef(prototyper_prefab, prototyper_def) 

AddRecipePostInit

作用: 修改指定的Recipe

参数

  • recipe (string): 要修改的recipe名
  • fn (function): 修改函数,传入参数为这个recipe对象

代码示例

local function fn(recipe)
    -- 修改制作栏描述
    recipe.description = "适合砍树"
end

AddRecipePostInit("axe", fn)

AddRecipePostInitAny

作用: 修改任意Recipe

参数

  • fn (function): 修改函数,传入参数为recipe对象。这个修改会对所有的recipe生效

代码示例

local function fn(recipe)
    -- 统一修改制作栏描述
    local old_str = recipe.description
    recipe.description = "描述: " ... old_str
end

AddRecipePostInitAny(fn)

已废弃

以下API已废弃,不推荐在新的Mod制作中使用

  • AddRecipe 添加新制作配方
  • Recipe 创建配方
  • AddRecipeTab 添加制作栏分类

其它

AddUserCommand

作用: 向游戏中添加一个自定义用户命令。

参数

  • name (string): 命令的名称。
  • data (table): 命令的详细信息,包括以下字段:
    • (可选) aliases (table): 命令的别名列表。
    • (可选) prettyname (string): 写在UI上的名称。
    • (可选) desc (string): 命令的描述。
    • permission (string): 命令所需的权限(如:COMMAND_PERMISSION.USER)。
    • (可选) slash (boolean): 是否在命令前加斜杠。
    • (可选) usermenu (boolean): 是否在用户菜单中显示命令。
    • (可选) servermenu (boolean): 是否在服务器菜单中显示命令。
    • (可选) params (table): 命令的参数列表。
    • (可选) paramsoptional (table): 参数是否可选的布尔值列表。
    • (可选) localfn (function): 本地函数,当命令被调用时执行。
    • (可选) serverfn (function): 服务器函数,当命令被调用时执行。
    • (可选)vote (boolean): 是否允许对此命令进行投票,默认为false。
    • (可选)votetimeout (number): 投票持续时间(秒)。
    • (可选)voteminstartage (number): 用户必须在服务器上待至少多少秒才能开始投票。
    • (可选)voteminpasscount (number): 投票通过所需的最小票数。
    • (可选)votecountvisible (boolean): 投票结果是否对玩家可见。
    • (可选)voteallownotvoted (boolean): 是否允许未投票的玩家看到投票结果。
    • (可选)voteoptions (table): 投票选项
    • (可选)votetitlefmt (string): 投票标题的格式
    • (可选)votenamefmt (string): 投票名称的格式
    • (可选)votepassedfmt (string): 投票通过后的显示信息
    • (可选)votecanstartfn (function): 检查投票是否可以开始的函数
    • (可选)voteresultfn (function): 根据投票结果执行相应操作的函数

代码示例

AddUserCommand("hello", {
    aliases = {"hi", "hey"},
    prettyname = "Hello Command",
    desc = "Say hello to the server",
    permission = GLOBAL.COMMAND_PERMISSION.USER,
    slash = true,
    usermenu = false,
    servermenu = false,
    params = {"intro"},
    paramsoptional = {true},
    vote = false,
    serverfn = function(params, caller)
        if params.intro ~= nil then
            GLOBAL.TheNet:Say("Hello, everyone! "..params.intro)
        else
            GLOBAL.TheNet:Say("Hello, everyone!")
        end
    end,
})

评论