From f8bbfc7fb3e4cdb94bd9f1f45e46d4b868d3ff6e Mon Sep 17 00:00:00 2001 From: shenlei Date: Wed, 30 Sep 2026 08:45:58 +0900 Subject: [PATCH] server: support skills at max level on a character's first login support_skills_max.quest sets 121/122/124/126-129/131 to their skill_proto max, the horse to level 30 (skill 130) and the horse skills 137-139 (140 for assassins), once per character. install.sh adds it to locale_list and pc.set_skill_level to quest_functions (qc rejects it otherwise), then make.py. Co-Authored-By: Claude Opus 5.5 --- tools/server/support-skills/README.md | 20 +++++++++++ tools/server/support-skills/install.sh | 35 ++++++++++++++++++ .../support-skills/support_skills_max.quest | 36 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 tools/server/support-skills/README.md create mode 100755 tools/server/support-skills/install.sh create mode 100644 tools/server/support-skills/support_skills_max.quest diff --git a/tools/server/support-skills/README.md b/tools/server/support-skills/README.md new file mode 100644 index 00000000..04933307 --- /dev/null +++ b/tools/server/support-skills/README.md @@ -0,0 +1,20 @@ +# 辅助技能满级(203 服务端) + +任务 `support_skills_max`:每个角色第一次登录时(新建角色第一次进游戏,已有角色下次登录),把辅助技能直接设到 +最高等级,只执行一次(之后任务状态是 `done`)。`pc.set_skill_level` 不消耗技能点,也不检查学习条件。 + +| 技能 | 等级 | +|---|---| +| 121 统御、124 采矿、129 幻化 | 40 | +| 122 连击 | 2 | +| 126 / 127 / 128 盛唐语 / 秦皇语 / 汉武语 | 20 | +| 131 召唤马匹 | 10 | +| 130 骑马 | 马的等级:`horse.set_level(30)`(`HORSE_MAX_LEVEL`) | +| 137 乱舞、138 突击、139 脱出;140 乱舞(弓)只给刺客 | 1 | + +钓鱼不是技能;123(制作物品)、125、141、142 在 203 的 skill_proto 里没有,不设。 + + sh install.sh # 在服务器上,从本目录运行;然后重启 game + +备份在 `/root/backup-support-skills/<时间>`(`locale_list`、`quest_functions`)。qc 只认 `quest_functions` 里列出的函数, +`pc.set_skill_level` 在 game 里有(`questlua_pc.cpp`)但清单里没有,install.sh 会补上。 diff --git a/tools/server/support-skills/install.sh b/tools/server/support-skills/install.sh new file mode 100755 index 00000000..63364afd --- /dev/null +++ b/tools/server/support-skills/install.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# Installs quest support_skills_max (README.md): run on the server from this directory, then restart game. +# Adds the quest (GBK) to the locale's quest directory and locale_list, pc.set_skill_level to quest_functions, +# and recompiles all quests. +set -eu + +SERVER=${SERVER:-/usr/metin2/server} +LOCALE=${LOCALE:-newcibn} +QUEST="$SERVER/share/locale/$LOCALE/quest" +HERE=$(cd "$(dirname "$0")" && pwd) +BACKUP=/root/backup-support-skills/$(date +%Y%m%d-%H%M%S) +export LC_ALL=C + +mkdir -p "$BACKUP" +cp -p "$QUEST/locale_list" "$QUEST/quest_functions" "$BACKUP/" +echo "backup: $BACKUP" + +iconv -f UTF-8 -t GBK "$HERE/support_skills_max.quest" > "$BACKUP/support_skills_max.gbk" +# A GBK trail byte 0x5C would be a backslash to qc. +if grep -q '\\' "$BACKUP/support_skills_max.gbk"; then echo "backslash byte in GBK" >&2; exit 1; fi +cat "$BACKUP/support_skills_max.gbk" > "$QUEST/support_skills_max.quest" + +# qc only accepts functions listed in quest_functions; game registers pc.set_skill_level (questlua_pc.cpp) +# but the list does not have it. +grep -qx pc.set_skill_level "$QUEST/quest_functions" || echo pc.set_skill_level >> "$QUEST/quest_functions" + +# make.py strips only the LF of a locale_list line (203's has no newline after the last line). +sed -i '' '/^support_skills_max\.quest/d' "$QUEST/locale_list" +[ -z "$(tail -c 1 "$QUEST/locale_list")" ] || echo >> "$QUEST/locale_list" +echo support_skills_max.quest >> "$QUEST/locale_list" + +# make.py's shebang (/usr/local/bin/python) does not exist on 203. +cd "$QUEST" && /usr/local/bin/python2.7 make.py > "$BACKUP/make.log" 2>&1 || { tail "$BACKUP/make.log" >&2; exit 1; } +ls object/notarget/login 2>/dev/null | grep support_skills_max || ls -R object | grep support_skills_max +echo "done; restart game" diff --git a/tools/server/support-skills/support_skills_max.quest b/tools/server/support-skills/support_skills_max.quest new file mode 100644 index 00000000..0e75776f --- /dev/null +++ b/tools/server/support-skills/support_skills_max.quest @@ -0,0 +1,36 @@ +-- Every character gets the support skills at their highest level on its first login (install.sh). +-- UTF-8 here; install.sh converts it to GBK for qc. Levels are the max_level of skill_proto on 203. +quest support_skills_max begin + state start begin + when login begin + local skills = { + { 121, 40 }, -- 统御 + { 122, 2 }, -- 连击 + { 124, 40 }, -- 采矿 + { 126, 20 }, -- 盛唐语 + { 127, 20 }, -- 秦皇语 + { 128, 20 }, -- 汉武语 + { 129, 40 }, -- 幻化 + { 131, 10 }, -- 召唤马匹 + { 137, 1 }, -- 乱舞 + { 138, 1 }, -- 突击 + { 139, 1 }, -- 脱出 + } + for i = 1, table.getn(skills) do + pc.set_skill_level(skills[i][1], skills[i][2]) + end + -- 乱舞(弓) is the assassin's (char_skill.cpp: SKILL_HORSE_WILDATTACK_RANGE). + if pc.get_job() == 1 then + pc.set_skill_level(140, 1) + end + -- 骑马 (130) is the horse level (CHARACTER::SetHorseLevel), at most HORSE_MAX_LEVEL 30. + if horse.get_level() < 30 then + horse.set_level(30) + end + syschat("辅助技能已全部提升到最高等级,马匹已升到30级。") + set_state("done") + end + end + state done begin + end +end