游戏截图

游戏内,新增一列按钮模拟“按键操作”,支持组合按键。

文件目录

1BM000  
2├─ scripts  
3│  └─ keybutton.lua  # 配置文件  

配置文件

 1
 2-- BM000/scripts/keybutton.lua
 3
 4-- 示例 (其他模组中的按键功能)
 5local fn_key_a_up = function()
 6    local doer=GetPlayer()
 7    doer.components.talker:Say("按键 A")
 8    print("按键 A")
 9end
10local fn_key_b_up = function()
11    local doer=GetPlayer()
12    doer.components.talker:Say("按键 B")
13    print("按键 B")
14end
15local fn_key_c_up = function()
16    local doer=GetPlayer()
17    doer.components.talker:Say("按键 C")
18    print("按键 C")
19end
20local fn_key_d_up = function()
21    local doer=GetPlayer()
22    if TheInput:IsKeyDown(KEY_CTRL) and (not TheInput:IsKeyDown(KEY_SHIFT)) then
23        doer.components.talker:Say("按键 Ctrl+D")
24        print("按键 Ctrl+D")
25    end
26end
27local fn_key_e_up = function()
28    local doer=GetPlayer()
29    if TheInput:IsKeyDown(KEY_CTRL) and TheInput:IsKeyDown(KEY_SHIFT) then
30        doer.components.talker:Say("按键 Ctrl+Shift+E")
31        print("按键 Ctrl+Shift+E")
32    end
33end
34TheInput:AddKeyUpHandler(KEY_A, fn_key_a_up)
35TheInput:AddKeyUpHandler(KEY_B, fn_key_b_up)
36TheInput:AddKeyUpHandler(KEY_C, fn_key_c_up)
37TheInput:AddKeyUpHandler(KEY_D, fn_key_d_up)
38TheInput:AddKeyUpHandler(KEY_E, fn_key_e_up)
39
40local keybutton = {
41
42	-- 模拟键盘:key1(按下),key2(按下),key(按下),key(抬起),key2(抬起),key1(抬起)
43	-- key: 必须,字符/键值,参考 scripts/constants.lua 文件。
44	-- str: 可选,设置按钮上显示的“字符串”。
45	-- key1: 可选,字符/键值,用于组合按键。
46	-- key2: 可选,字符/键值,用于组合按键。
47
48	{key="A"},
49	{key="B"},
50	{key="C"},
51	{key="D", str="D", key1="CTRL"},
52	{key=KEY_E, str="E", key1=KEY_CTRL, key2=KEY_SHIFT},
53
54	{key=KEY_T, str="T"},
55	{key=KEY_L, str="变身"},
56	{key=KEY_R, str="跳跃"},
57	{key=KEY_F11, str="查看"},
58}
59
60return keybutton

配置文件 - 进阶版

下面是我自用的配置文件,大佬可以自行更改。小白可以喂给 AI,然后提出修改要求。

  1
  2--------------------------------------------------
  3-- 按键功能:代码建议放到模组的 modmain.lua 文件(否则,代码出错,可能导致按键配置失效)
  4
  5-- 使用物品
  6local function useItem(doer, slot)
  7	local item = nil
  8	local target = nil
  9	local pt = doer:GetPosition()
 10	-- 物品栏 slot 为数字
 11	-- 装备栏 slot 为字符串
 12	local is_item_slot = type(0)==type(slot)
 13	local is_equip_slot = table.contains(EQUIPSLOTS, slot)
 14	if is_equip_slot then
 15		item = doer.components.inventory:GetEquippedItem(slot)
 16	else
 17		item = doer.components.inventory:GetItemInSlot(slot)
 18	end
 19	-- 没有物品,无法“使用”
 20	if not item then return end
 21	if is_item_slot and item.components.edible then
 22		if true then
 23			local buff = BufferedAction(doer, target, ACTIONS.EAT, item, pt)
 24			doer.components.locomotor:PushAction(buff, true)
 25		end
 26	elseif is_item_slot and item.components.healer then
 27		if true then
 28			local buff = BufferedAction(doer, target, ACTIONS.HEAL, item, pt)
 29			doer.components.locomotor:PushAction(buff, true)
 30		end
 31	elseif is_item_slot and item.components.instrument then
 32		if true then
 33			local buff = BufferedAction(doer, target, ACTIONS.PLAY, item, pt)
 34			doer.components.locomotor:PushAction(buff, true)
 35		end
 36	elseif is_item_slot and item.components.equippable then
 37		if true then
 38			local buff = BufferedAction(doer, target, ACTIONS.EQUIP, item, pt)
 39			doer.components.locomotor:PushAction(buff, true)
 40		end
 41	elseif is_item_slot and item.components.deployable then
 42		if item.components.deployable:CanDeploy(pt) then
 43			local buff = BufferedAction(doer, target, ACTIONS.DEPLOY, item, pt)
 44			doer.components.locomotor:PushAction(buff, true)
 45		end
 46	elseif is_equip_slot and item.components.useableitem then
 47		if item.components.useableitem:CanInteract()  then
 48			item.components.useableitem:StartUsingItem()
 49		end
 50	elseif is_equip_slot and item.components.terraformer then
 51		if item.components.terraformer:CanTerraformPoint(pt) then
 52			local buff = BufferedAction(doer, target, ACTIONS.TERRAFORM, item, pt)
 53			doer.components.locomotor:PushAction(buff, true)
 54		end
 55	elseif is_equip_slot and item.components.blinkstaff then
 56		pt = item.components.blinkstaff:GetBlinkPoint()
 57		item.components.blinkstaff:Blink(pt, doer)
 58	elseif is_equip_slot and item.components.throwable then
 59		pt = item.components.throwable:GetThrowPoint()
 60		item.components.throwable:Throw(pt, doer)
 61	else
 62		-- 其他
 63		local targ = item
 64		if targ and targ.components.inspectable then
 65			local desc = targ.components.inspectable:GetDescription(doer)
 66			if desc then
 67				doer.components.locomotor:Stop()
 68				doer.components.talker:Say(desc, 2.5, targ.components.inspectable.noanim)
 69			end
 70		end
 71	end
 72end
 73
 74local fn_key_1_up = function()
 75    local doer=GetPlayer()
 76    local slot = 1  -- 物品栏 1
 77    useItem(doer, slot)
 78end
 79local fn_key_2_up = function()
 80    local doer=GetPlayer()
 81    local slot = 2  -- 物品栏 2
 82    useItem(doer, slot)
 83end
 84local fn_key_3_up = function()
 85    local doer=GetPlayer()
 86    local slot = EQUIPSLOTS.HANDS  -- 装备栏 手
 87    useItem(doer, slot)
 88end
 89local fn_key_4_up = function()
 90    local doer=GetPlayer()
 91    local slot = EQUIPSLOTS.BODY  -- 装备栏 身
 92    useItem(doer, slot)
 93end
 94local fn_key_5_up = function()
 95    local doer=GetPlayer()
 96    local slot = EQUIPSLOTS.HEAD  -- 装备栏 头
 97    useItem(doer, slot)
 98end
 99TheInput:AddKeyUpHandler(KEY_1, fn_key_1_up)
100TheInput:AddKeyUpHandler(KEY_2, fn_key_2_up)
101TheInput:AddKeyUpHandler(KEY_3, fn_key_3_up)
102TheInput:AddKeyUpHandler(KEY_4, fn_key_4_up)
103TheInput:AddKeyUpHandler(KEY_5, fn_key_5_up)
104
105--------------------------------------------------
106
107
108
109
110
111--------------------------------------------------
112-- 按键配置:用于设置“按键”的映射关系,修改按钮显示的文字。
113
114-- 此文件会在进入游戏后加载,可使用 GetPlayer 等函数。
115local player = GetPlayer()
116
117local data_keybutton = {
118
119	-- 模拟键盘:key1(按下),key2(按下),key(按下),key(抬起),key2(抬起),key1(抬起)
120	-- key: 必须,字符/键值,参考 scripts/constants.lua 文件。
121	-- str: 可选,设置按钮上显示的“字符串”。
122	-- key1: 可选,字符/键值,用于组合按键。
123	-- key2: 可选,字符/键值,用于组合按键。
124
125	{key=KEY_5, str="[ 5 ]", },
126	{key=KEY_4, str="[ 4 ]", },
127	{key=KEY_3, str="[ 3 ]", },
128	{key=KEY_2, str="[ 2 ]", },
129	{key=KEY_1, str="[ 1 ]", },
130
131	{key=KEY_T, str="T"},
132	player.prefab=="wharang" and {key=KEY_L, str="变身"} or nil,
133	player.prefab=="wharang" and {key=KEY_R, str="跳跃"} or nil,
134	player.prefab=="wharang" and {key=KEY_F11, str="查看"} or nil,
135}
136
137return data_keybutton
138
139--------------------------------------------------