CPI MultiVendor Lua#
Overview#
在 CPI (Consumer Price Index) 中提到了, 我们为了增加私服体验, 我们修改了很多材料的购买和出售价格来模拟拍卖行中的出售和购买行为. 在这个项目中, 我们创建了一个 cpi_multivendor.lua 脚本, 用来让玩家找一个特殊的 NPC, 然后进入商店菜单来购买这些物品. 由于我们总计会开发几一千多个物品, 所以我们将这些物品分门别类放在了不同的商店中, 然后为这个 NPC 创建了一个层级结构的菜单来让玩家选择不同的商店.
How it Work#
第一步, 我们需在数据库中创建许多 NPC Vendor 的定义. 这部分内容请参考 CPI (Consumer Price Index).
第二步, 有了许多 Vendor 之后, 我们需要将它们按照层级结构组织起来. 这个步骤我在这个 Google Sheet 中进行.
第三步, 将 Google Sheet 中的内容拷贝到本地 cpi_multivendor_lua_data.tsv 文件中. 然后用 gen_lua.py 将其转化为 Lua 脚本.
gen_lua.py
1# -*- coding: utf-8 -*-
2
3"""
4Google Sheet: https://docs.google.com/spreadsheets/d/1e4I2-d4JyVbsvOcdePruqev-rkyYYMUPrwkI_fieIYw/edit?gid=1169636448#gid=1169636448
5"""
6
7from pathlib import Path
8
9import jinja2
10import polars as pl
11import acore_eluna.tree_menu.api as tree_menu
12
13from acore_eluna.sync_lua_scripts import sync_lua_script_for_bmt_app_dev_us_east_1
14from acore_eluna.paths import dir_local_lua_scripts
15
16df = pl.read_csv("cpi_multivendor_lua_data.tsv", separator="\t")
17
18
19# --- Generate Lua Code
20def data_to_lua_code(data: dict) -> str:
21 npc_id = data["npc_id"]
22 return f"{{ npc_id = {npc_id} }}"
23
24
25lua_code_generator = tree_menu.LuaCodeGenerator(
26 id_start=374001,
27 item_option_icon=tree_menu.IconEnum.GOSSIP_ICON_VENDOR,
28 back_to_prev="返回 {parent_name}",
29 back_to_top="返回 主菜单",
30)
31option_list = lua_code_generator.dataframe_to_option_list(df)
32lua_code = lua_code_generator.generate_lua_code(option_list, data_to_lua_code)
33dir_here = Path(__file__).absolute().parent
34path_lua = dir_here / "lua_code.lua"
35path_lua.write_text(lua_code)
最终生成的 Lua 脚本长这个样子:
cpi_multivendor.lua
如果想了解这个脚本的原理, 请仔细阅读其中的注释.
然后, 就可以将其放到 manage/workspace/lua_scripts/ 目录下, 然后运行 manage/remote_bootstrap.py 脚本将其部署到 EC2 服务器上并自动 reload 既可. 注意游戏服务器 (包括 worldserver) 必须是已经启动的状态,