修改任务系统

This commit is contained in:
admin 2026-06-22 00:12:04 +08:00
parent 405fed5123
commit 5112693089
11 changed files with 1645 additions and 1013 deletions

214
.codex/mcp_996_gui_proxy.js Normal file
View file

@ -0,0 +1,214 @@
const URL = process.env.MCP_996_GUI_URL;
const AUTH = process.env.MCP_996_GUI_AUTH;
const fs = require("fs");
const LOG = process.env.MCP_996_GUI_LOG || "C:\\Users\\Administrator\\.codex\\mcp_996_gui_proxy.log";
function log(message) {
try {
fs.appendFileSync(LOG, `${new Date().toISOString()} ${message}\n`, "utf8");
} catch {
// Logging must never break the MCP server.
}
}
log(`start pid=${process.pid}`);
const tools = [
{
name: "list_rule_files",
description: "List all client GUI API rule files.",
inputSchema: { type: "object", properties: {}, additionalProperties: false },
},
{
name: "list_versions",
description: "List available client GUI API versions.",
inputSchema: { type: "object", properties: {}, additionalProperties: false },
},
{
name: "list_apis",
description: "Search client GUI APIs by keyword.",
inputSchema: {
type: "object",
properties: {
keyword: { type: "string", default: "" },
limit: { type: "integer", default: 50 },
version: { type: "string", default: "" },
},
additionalProperties: false,
},
},
{
name: "generate_lua",
description: "Generate client Lua code from the original natural language query.",
inputSchema: {
type: "object",
properties: {
query: { type: "string" },
top_k: { type: "integer", default: 3 },
version: { type: "string", default: "" },
},
required: ["query"],
additionalProperties: false,
},
},
{
name: "generate_lua_996",
description: "Alias of generate_lua for 996 API client GUI code generation.",
inputSchema: {
type: "object",
properties: {
query: { type: "string" },
top_k: { type: "integer", default: 3 },
version: { type: "string", default: "" },
},
required: ["query"],
additionalProperties: false,
},
},
];
let input = Buffer.alloc(0);
process.stdin.on("data", (chunk) => {
log(`stdin bytes=${chunk.length}`);
input = Buffer.concat([input, chunk]);
readMessages();
});
process.stdin.on("end", () => log("stdin end"));
process.on("uncaughtException", (error) => log(`uncaught ${error.stack || error.message || error}`));
function readMessages() {
while (true) {
let headerEnd = input.indexOf("\r\n\r\n");
let separatorLength = 4;
if (headerEnd < 0) {
headerEnd = input.indexOf("\n\n");
separatorLength = 2;
}
if (headerEnd < 0) return;
const header = input.slice(0, headerEnd).toString("ascii");
const match = /Content-Length:\s*(\d+)/i.exec(header);
if (!match) {
input = input.slice(headerEnd + separatorLength);
continue;
}
const length = Number(match[1]);
const start = headerEnd + separatorLength;
const end = start + length;
if (input.length < end) return;
const body = input.slice(start, end).toString("utf8");
input = input.slice(end);
log(`message ${body}`);
handle(JSON.parse(body)).catch((error) => {
respond(JSON.parse(body).id, null, {
code: -32603,
message: error && error.message ? error.message : String(error),
});
});
}
}
async function handle(message) {
if (message.id === undefined) return;
log(`handle ${message.method}`);
if (message.method === "initialize") {
respond(message.id, {
protocolVersion: message.params?.protocolVersion || "2025-03-26",
capabilities: { tools: { listChanged: false } },
serverInfo: { name: "996 Client GUI Proxy", version: "1.0.0" },
});
return;
}
if (message.method === "tools/list") {
respond(message.id, { tools });
return;
}
if (message.method === "tools/call") {
const name = message.params?.name;
const args = message.params?.arguments || {};
const result = await callRemote(name, args);
respond(message.id, { content: [{ type: "text", text: stringifyResult(result) }] });
return;
}
respond(message.id, null, { code: -32601, message: `Unknown method: ${message.method}` });
}
async function callRemote(name, args) {
if (!URL || !AUTH) throw new Error("MCP_996_GUI_URL or MCP_996_GUI_AUTH is missing");
const init = await post(null, {
jsonrpc: "2.0",
id: 1,
method: "initialize",
params: {
protocolVersion: "2025-03-26",
capabilities: {},
clientInfo: { name: "codex-996-gui-proxy", version: "1.0.0" },
},
});
const session = init.session;
await post(session, { jsonrpc: "2.0", method: "notifications/initialized", params: {} });
const response = await post(session, {
jsonrpc: "2.0",
id: 2,
method: "tools/call",
params: { name, arguments: args },
});
return response.data?.result ?? response.data;
}
async function post(session, payload) {
const headers = {
Authorization: AUTH,
Accept: "application/json, text/event-stream",
"Content-Type": "application/json",
};
if (session) headers["mcp-session-id"] = session;
const response = await fetch(URL, {
method: "POST",
headers,
body: JSON.stringify(payload),
});
const text = await response.text();
if (!response.ok) throw new Error(`Remote MCP HTTP ${response.status}: ${text}`);
return {
session: response.headers.get("mcp-session-id"),
data: parseMcpBody(text),
};
}
function parseMcpBody(text) {
if (!text || !text.trim()) return null;
const dataLine = text
.split(/\r?\n/)
.find((line) => line.startsWith("data:"));
return JSON.parse(dataLine ? dataLine.slice(5).trim() : text);
}
function stringifyResult(result) {
if (typeof result === "string") return result;
return JSON.stringify(result, null, 2);
}
function respond(id, result, error) {
const payload = error
? { jsonrpc: "2.0", id, error }
: { jsonrpc: "2.0", id, result };
const body = JSON.stringify(payload);
log(`respond id=${id} bytes=${Buffer.byteLength(body, "utf8")} error=${Boolean(error)}`);
process.stdout.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`);
}

3
.gitignore vendored
View file

@ -27,3 +27,6 @@ Mirserver/Mir200/!Setup.txt
Mirserver/DBServer/dbsrc.ini Mirserver/DBServer/dbsrc.ini
client/env.json client/env.json
# Local Codex MCP config
.codex/config.toml

View file

@ -3,7 +3,7 @@ ServerName=996Mir
ServerAddr=127.0.0.1 ServerAddr=127.0.0.1
GatePort=7200 GatePort=7200
GateAddr=127.0.0.1 GateAddr=127.0.0.1
ServerPath=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\DBServer\ ServerPath=E:\传奇版本\bayuMir\Mirserver\DBServer\
plateformid=1881 plateformid=1881
DynamicIPMode=0 DynamicIPMode=0
Attack=0 Attack=0
@ -28,12 +28,12 @@ ServerID=1881
ServerType=0 ServerType=0
[DBSetup] [DBSetup]
HeroDBName=box_6 HeroDBName=box
SQLIP=10.10.10.1 SQLIP=127.0.0.1
SQLUSERNAME=sa SQLUSERNAME=sa
SQLPASSWORD=www.996m2.com SQLPASSWORD=www.996m2.com
SQLPORT=1433 SQLPORT=1433
[DB] [DB]
LogDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\DBServer\\Log\ LogDir=E:\传奇版本\bayuMir\Mirserver\DBServer\\Log\

View file

@ -221,18 +221,18 @@ BoneKingMonster1=BoneCaptain
BoneKingMonster2=BoneArcher BoneKingMonster2=BoneArcher
BoneKingMonster3=BoneSpearman BoneKingMonster3=BoneSpearman
[Share] [Share]
BaseDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\share\ BaseDir=E:\传奇版本\bayuMir\Mirserver\Mir200\share\
GuildDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\GuildBase\Guilds\ GuildDir=E:\传奇版本\bayuMir\Mirserver\Mir200\GuildBase\Guilds\
GuildFile=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\ShareV\ GuildFile=E:\传奇版本\bayuMir\Mirserver\Mir200\ShareV\
VentureDir=d:\Mirserver11\Mir200\ShareV\ VentureDir=d:\Mirserver11\Mir200\ShareV\
ConLogDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\ConLogDir\ ConLogDir=E:\传奇版本\bayuMir\Mirserver\Mir200\ConLogDir\
CastleDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\Castle\ CastleDir=E:\传奇版本\bayuMir\Mirserver\Mir200\Castle\
EnvirDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\Envir\ EnvirDir=E:\传奇版本\bayuMir\Mirserver\Mir200\Envir\
MapDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\map\ MapDir=E:\传奇版本\bayuMir\Mirserver\Mir200\map\
NoticeDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\Notice\ NoticeDir=E:\传奇版本\bayuMir\Mirserver\Mir200\Notice\
PlugDir=.\ PlugDir=.\
LogDir=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\Log\ LogDir=E:\传奇版本\bayuMir\Mirserver\Mir200\Log\
CastleFile=F:\°ËÓò¹¥ËÙ\bayuMir\Mirserver\Mir200\Castle\List.txt CastleFile=E:\传奇版本\bayuMir\Mirserver\Mir200\Castle\List.txt
PayMentPointName=秒卡点 PayMentPointName=秒卡点
ChatDir=.\ChatLog\ ChatDir=.\ChatLog\
GameGold=人民币 GameGold=人民币

View file

@ -0,0 +1,113 @@
-- cfg_主线任务
local config = {
[1] = {
id = 1,
next = 2,
enabled = true,
title = "[主线]了解首充",
desc = "了解首充后前往任意地图击杀任意怪物5只。",
doingDesc = "前往任意地图击杀任意怪物。",
rewardText = "经验100万、金币5000",
visit = { type = "module", keys = { "ShouChongOBJ" }, open = "ShouChongOBJ_main" },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 5000 } },
},
[2] = {
id = 2,
next = 3,
enabled = true,
title = "[主线]拜访渡劫天尊",
desc = "拜访渡劫天尊后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit = { type = "npc", ids = { 6 }, scripts = { "转生" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 10000 } },
},
[3] = {
id = 3,
next = 4,
enabled = true,
title = "[主线]拜访神兽淬体",
desc = "拜访神兽淬体后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "神兽之血*50、神兽之骨*50",
visit = { type = "npc", ids = { 5 }, scripts = { "神兽淬体" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "item", "神兽之血", 50, 0 }, { "item", "神兽之骨", 50, 0 } },
},
[4] = {
id = 4,
next = 5,
enabled = true,
title = "[主线]拜访紫金仙人",
desc = "拜访紫金仙人后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、千年玄石*50、金币10000",
visit = { type = "npc", ids = { 189 }, scripts = { "紫金葫芦" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "item", "千年玄石", 50, 0 }, { "money", "金币", 10000 } },
},
[5] = {
id = 5,
next = 6,
enabled = true,
title = "[主线]了解绝学NPC",
desc = "了解绝学NPC后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "灵石*50、武林秘籍*1",
visit = { type = "npc", ids = { 12 }, scripts = { "绝学修炼" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "item", "灵石", 50, 0 }, { "item", "武林秘籍", 1, 0 } },
},
[6] = {
id = 6,
next = 7,
enabled = true,
title = "[主线]拜访幸运仙子",
desc = "拜访幸运仙子后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit = { type = "npc", ids = { 11 }, scripts = { "幸运项链" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 10000 } },
},
[7] = {
id = 7,
next = 8,
enabled = true,
title = "[主线]前往装备重铸",
desc = "前往装备重铸后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit = { type = "npc", ids = { 10 }, scripts = { "装备重铸" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 10000 } },
},
[8] = {
id = 8,
next = 9,
enabled = true,
title = "[主线]前往武器升级",
desc = "前往武器升级后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "黑铁矿石*4、金币10000",
visit = { type = "npc", ids = { 13 }, scripts = { "武器升级" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "item", "黑铁矿石", 4, 0 }, { "money", "金币", 10000 } },
},
[9] = {
id = 9,
next = nil,
enabled = true,
title = "[主线]任务结束",
desc = "主线任务已完成。",
doingDesc = "主线任务已完成。",
rewardText = "",
visit = nil,
target = nil,
rewards = {},
finish = true,
},
}
return config

View file

@ -0,0 +1,285 @@
-- cfg_主线任务
local config = {
[1] = {
next = 2,
enabled = true,
title = "[主线]了解首充",
desc = "了解首充后前往任意地图击杀任意怪物5只。",
doingDesc = "前往任意地图击杀任意怪物。",
rewardText = "经验100万、金币5000",
visit_type = "module",
ShouChongOBJ = "",
visit_open = "ShouChongOBJ_main",
visit_ids_1 = 0,
visit_scripts_1 = "",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "money",
name = "经验",
num = 1000000,
bind = 0,
},
[2] = {
type = "money",
name = "金币",
num = 5000,
bind = 0,
},
},
},
[2] = {
next = 3,
enabled = true,
title = "[主线]拜访渡劫天尊",
desc = "拜访渡劫天尊后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 6,
visit_scripts_1 = "转生",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "money",
name = "经验",
num = 1000000,
bind = 0,
},
[2] = {
type = "money",
name = "金币",
num = 10000,
bind = 0,
},
},
},
[3] = {
next = 4,
enabled = true,
title = "[主线]拜访神兽淬体",
desc = "拜访神兽淬体后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "神兽之血*50、神兽之骨*50",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 5,
visit_scripts_1 = "神兽淬体",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "item",
name = "神兽之血",
num = 50,
bind = 0,
},
[2] = {
type = "item",
name = "神兽之骨",
num = 50,
bind = 0,
},
},
},
[4] = {
next = 5,
enabled = true,
title = "[主线]拜访紫金仙人",
desc = "拜访紫金仙人后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、千年玄石*50、金币10000",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 189,
visit_scripts_1 = "紫金葫芦",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "money",
name = "经验",
num = 1000000,
bind = 0,
},
[2] = {
type = "item",
name = "千年玄石",
num = 50,
bind = 0,
},
[3] = {
type = "money",
name = "金币",
num = 10000,
bind = 0,
},
},
},
[5] = {
next = 6,
enabled = true,
title = "[主线]了解绝学NPC",
desc = "了解绝学NPC后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "灵石*50、武林秘籍*1",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 12,
visit_scripts_1 = "绝学修炼",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "item",
name = "灵石",
num = 50,
bind = 0,
},
[2] = {
type = "item",
name = "武林秘籍",
num = 1,
bind = 0,
},
},
},
[6] = {
next = 7,
enabled = true,
title = "[主线]拜访幸运仙子",
desc = "拜访幸运仙子后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 11,
visit_scripts_1 = "幸运项链",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "money",
name = "经验",
num = 1000000,
bind = 0,
},
[2] = {
type = "money",
name = "金币",
num = 10000,
bind = 0,
},
},
},
[7] = {
next = 8,
enabled = true,
title = "[主线]前往装备重铸",
desc = "前往装备重铸后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 10,
visit_scripts_1 = "装备重铸",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "money",
name = "经验",
num = 1000000,
bind = 0,
},
[2] = {
type = "money",
name = "金币",
num = 10000,
bind = 0,
},
},
},
[8] = {
next = 9,
enabled = true,
title = "[主线]前往武器升级",
desc = "前往武器升级后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "黑铁矿石*4、金币10000",
visit_type = "npc",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 13,
visit_scripts_1 = "武器升级",
target_type = "kill_mon",
target_count = 5,
target_map = "*",
target_mon = "*",
finish = false,
reward = {
[1] = {
type = "item",
name = "黑铁矿石",
num = 4,
bind = 0,
},
[2] = {
type = "money",
name = "金币",
num = 10000,
bind = 0,
},
},
},
[9] = {
next = 0,
enabled = true,
title = "[主线]任务结束",
desc = "主线任务已完成。",
doingDesc = "主线任务已完成。",
rewardText = "",
visit_type = "",
ShouChongOBJ = "",
visit_open = "",
visit_ids_1 = 0,
visit_scripts_1 = "",
target_type = "",
target_count = 0,
target_map = "",
target_mon = "",
finish = true,
reward = {},
},
}
return config

View file

@ -5,117 +5,67 @@ MainLineTaskOBJ.STATUS_WAIT_VISIT = 0
MainLineTaskOBJ.STATUS_DOING = 1 MainLineTaskOBJ.STATUS_DOING = 1
MainLineTaskOBJ.STATUS_FINISH = 9 MainLineTaskOBJ.STATUS_FINISH = 9
MainLineTaskOBJ.cfg = { MainLineTaskOBJ.cfg = Func.require("cfg_Ö÷ÏßÈÎÎñ")
[1] = {
id = 1, local function appendCfgValue(list, value)
next = 2, if value == nil or value == "" or tonumber(value) == 0 then
enabled = true, return
title = "[主线]了解首充", end
desc = "了解首充后前往任意地图击杀任意怪物5只。", table.insert(list, value)
doingDesc = "前往任意地图击杀任意怪物。", end
rewardText = "经验100万、金币5000",
visit = { type = "module", keys = { "ShouChongOBJ" } }, local function normalizeTaskCfg(cfg)
target = { type = "kill_mon", count = 5, map = "*", mon = "*" }, for id, task in pairs(cfg or {}) do
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 5000 } }, task.id = tonumber(task.id or id) or id
},
[2] = { if not task.visit and task.visit_type and task.visit_type ~= "" then
id = 2, local visit = { type = task.visit_type }
next = 3, if visit.type == "module" then
enabled = true, visit.keys = {}
title = "[主线]拜访渡劫天尊", appendCfgValue(visit.keys, task.visit_keys_1)
desc = "拜访渡劫天尊后前往任意地图击杀怪物5只。", if #visit.keys <= 0 and task.ShouChongOBJ ~= nil then
doingDesc = "前往任意地图击杀怪物。", table.insert(visit.keys, "ShouChongOBJ")
rewardText = "经验100万、金币10000", end
visit = { type = "npc", ids = { 6 }, scripts = { "转生" } }, if #visit.keys <= 0 and task.visit_open and task.visit_open ~= "" then
target = { type = "kill_mon", count = 5, map = "*", mon = "*" }, table.insert(visit.keys, string.gsub(task.visit_open, "_main$", ""))
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 10000 } }, end
}, if task.visit_open and task.visit_open ~= "" then
[3] = { visit.open = task.visit_open
id = 3, end
next = 4, elseif visit.type == "npc" then
enabled = true, visit.ids = {}
title = "[主线]拜访神兽淬体", appendCfgValue(visit.ids, task.visit_ids_1)
desc = "拜访神兽淬体后前往任意地图击杀怪物5只。", visit.scripts = {}
doingDesc = "前往任意地图击杀怪物。", appendCfgValue(visit.scripts, task.visit_scripts_1)
rewardText = "神兽之血*50、神兽之骨*50", end
visit = { type = "npc", ids = { 5 }, scripts = { "神兽淬体" } }, task.visit = visit
target = { type = "kill_mon", count = 5, map = "*", mon = "*" }, end
rewards = { { "item", "神兽之血", 50, 0 }, { "item", "神兽之骨", 50, 0 } },
}, if not task.target and task.target_type and task.target_type ~= "" then
[4] = { task.target = {
id = 4, type = task.target_type,
next = 5, count = tonumber(task.target_count) or 0,
enabled = true, map = task.target_map,
title = "[主线]拜访紫金仙人", mon = task.target_mon,
desc = "拜访紫金仙人后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、千年玄石*50、金币10000",
visit = { type = "npc", ids = { 189 }, scripts = { "紫金葫芦" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "item", "千年玄石", 50, 0 }, { "money", "金币", 10000 } },
},
[5] = {
id = 5,
next = 6,
enabled = true,
title = "[主线]了解绝学NPC",
desc = "了解绝学NPC后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "灵石*50、武林秘籍*1",
visit = { type = "npc", ids = { 12 }, scripts = { "绝学修炼" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "item", "灵石", 50, 0 }, { "item", "武林秘籍", 1, 0 } },
},
[6] = {
id = 6,
next = 7,
enabled = true,
title = "[主线]拜访幸运仙子",
desc = "拜访幸运仙子后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit = { type = "npc", ids = { 11 }, scripts = { "幸运项链" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 10000 } },
},
[7] = {
id = 7,
next = 8,
enabled = true,
title = "[主线]前往装备重铸",
desc = "前往装备重铸后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "经验100万、金币10000",
visit = { type = "npc", ids = { 10 }, scripts = { "装备重铸" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "money", "经验", 1000000 }, { "money", "金币", 10000 } },
},
[8] = {
id = 8,
next = 9,
enabled = true,
title = "[主线]前往武器升级",
desc = "前往武器升级后前往任意地图击杀怪物5只。",
doingDesc = "前往任意地图击杀怪物。",
rewardText = "黑铁矿石*4、金币10000",
visit = { type = "npc", ids = { 13 }, scripts = { "武器升级" } },
target = { type = "kill_mon", count = 5, map = "*", mon = "*" },
rewards = { { "item", "黑铁矿石", 4, 0 }, { "money", "金币", 10000 } },
},
[9] = {
id = 9,
next = nil,
enabled = true,
title = "[主线]任务结束",
desc = "主线任务已完成。",
doingDesc = "主线任务已完成。",
rewardText = "",
visit = nil,
target = nil,
rewards = {},
finish = true,
},
} }
end
if not task.rewards then
task.rewards = {}
for _, reward in ipairs(task.reward or {}) do
table.insert(task.rewards, {
reward.type,
reward.name,
tonumber(reward.num) or 0,
tonumber(reward.bind) or 0,
})
end
end
end
return cfg
end
MainLineTaskOBJ.cfg = normalizeTaskCfg(MainLineTaskOBJ.cfg)
function MainLineTaskOBJ:getTask(id) function MainLineTaskOBJ:getTask(id)
return self.cfg[tonumber(id or 1)] return self.cfg[tonumber(id or 1)]
@ -419,12 +369,33 @@ GameEvent.add(EventCfg.onKillMon, function(actor, mon, itype, kill, monName, map
MainLineTaskOBJ:onKillMon(actor, mon, itype, kill, monName, mapID) MainLineTaskOBJ:onKillMon(actor, mon, itype, kill, monName, mapID)
end, MainLineTaskOBJ) end, MainLineTaskOBJ)
MainLineTaskOBJ.allowFunc = { "query", "visit" } MainLineTaskOBJ.allowFunc = { "query", "visit", "route" }
function MainLineTaskOBJ:query(actor) function MainLineTaskOBJ:query(actor)
self:sync(actor) self:sync(actor)
end end
function MainLineTaskOBJ:route(actor)
if not isnotnull(actor) then
return
end
if self:getStatus(actor) ~= self.STATUS_WAIT_VISIT then
return
end
local id = self:getTaskId(actor)
local task = self:getValidTask(id)
if not task or task.finish or not task.visit then
return
end
local visit = task.visit
if visit.type == "module" and visit.open then
Message:SubLink(actor, visit.open)
return
end
if visit.type == "npc" and visit.ids and visit.ids[1] then
opennpcshowex(actor, tonumber(visit.ids[1]), 6, 2)
end
end
function MainLineTaskOBJ:visit(actor, p1, p2, p3, data) function MainLineTaskOBJ:visit(actor, p1, p2, p3, data)
local visitKey = p1 local visitKey = p1
if type(data) == "table" then if type(data) == "table" then

View file

@ -14,6 +14,10 @@ end
TaskShowOBJ.UIfile = getUifile() TaskShowOBJ.UIfile = getUifile()
TaskShowOBJ.mainLineData = nil TaskShowOBJ.mainLineData = nil
local function canRouteMainLine(data)
return data and tonumber(data.status or 0) == 0 and not data.finish
end
local function getShortDesc(data) local function getShortDesc(data)
local status = tonumber(data.status or 0) or 0 local status = tonumber(data.status or 0) or 0
if data.finish then if data.finish then
@ -60,6 +64,26 @@ local function getRewardItems(data)
end end
function TaskShowOBJ:createMainLineTouch()
if not self.ui or GUI:Win_IsNull(self.ui.TaskShow_Layout) then
return
end
self.ui.MainLineTouch_Layout = GUI:Layout_Create(self.ui.TaskShow_Layout, "MainLineTouch_Layout", 0, 58, 202, 130, false)
GUI:setTouchEnabled(self.ui.MainLineTouch_Layout, false)
GUI:addOnClickEvent(self.ui.MainLineTouch_Layout, function()
local data = self.mainLineData or (MainLineTaskOBJ and MainLineTaskOBJ.data)
if canRouteMainLine(data) then
ssrMessage:SubLink("MainLineTaskOBJ_route")
end
end)
end
function TaskShowOBJ:updateMainLineTouch(data)
if self.ui and self.ui.MainLineTouch_Layout and GUI:Win_IsNotNull(self.ui.MainLineTouch_Layout) then
GUI:setTouchEnabled(self.ui.MainLineTouch_Layout, canRouteMainLine(data))
end
end
function TaskShowOBJ:main() function TaskShowOBJ:main()
local parent = GUI:Win_FindParent(110) local parent = GUI:Win_FindParent(110)
if GUI:Win_IsNotNull(parent) then if GUI:Win_IsNotNull(parent) then
@ -71,6 +95,7 @@ function TaskShowOBJ:main()
self.ui = GUI:ui_delegate(parent) self.ui = GUI:ui_delegate(parent)
if self.UIfile == "game/Tongyong/TaskShowUI" then if self.UIfile == "game/Tongyong/TaskShowUI" then
self:createMainLineTouch()
self:renderMainLine(self.mainLineData or (MainLineTaskOBJ and MainLineTaskOBJ.data)) self:renderMainLine(self.mainLineData or (MainLineTaskOBJ and MainLineTaskOBJ.data))
ssrMessage:SubLink("MainLineTaskOBJ_query") ssrMessage:SubLink("MainLineTaskOBJ_query")
SL:ScheduleOnce(function() SL:ScheduleOnce(function()
@ -94,6 +119,7 @@ end
function TaskShowOBJ:renderMainLine(data) function TaskShowOBJ:renderMainLine(data)
if not data or not self.ui then if not data or not self.ui then
self:updateMainLineTouch(nil)
return return
end end
if GUI:Win_IsNotNull(self.ui.TaskTitle_Text) then if GUI:Win_IsNotNull(self.ui.TaskTitle_Text) then
@ -114,11 +140,13 @@ function TaskShowOBJ:renderMainLine(data)
if GUI:Win_IsNotNull(self.ui.TaskReward_Text) then if GUI:Win_IsNotNull(self.ui.TaskReward_Text) then
GUI:Text_setString(self.ui.TaskReward_Text, "奖励:") GUI:Text_setString(self.ui.TaskReward_Text, "奖励:")
end end
self:updateMainLineTouch(data)
if GUI:Win_IsNotNull(self.ui.RewardItems_Layout) then if GUI:Win_IsNotNull(self.ui.RewardItems_Layout) then
GUI:removeAllChildren(self.ui.RewardItems_Layout) GUI:removeAllChildren(self.ui.RewardItems_Layout)
local items = getRewardItems(data) local items = getRewardItems(data)
if #items <= 0 then if #items <= 0 then
local EmptyReward_Text = GUI:Text_Create(self.ui.RewardItems_Layout, "EmptyReward_Text", 0, 24, 12, "#ffd36a", "") local EmptyReward_Text = GUI:Text_Create(self.ui.RewardItems_Layout, "EmptyReward_Text", 0, 24, 12, "#ffd36a",
"")
GUI:setAnchorPoint(EmptyReward_Text, 0.00, 0.50) GUI:setAnchorPoint(EmptyReward_Text, 0.00, 0.50)
GUI:Text_enableOutline(EmptyReward_Text, "#000000", 1) GUI:Text_enableOutline(EmptyReward_Text, "#000000", 1)
return return
@ -129,19 +157,23 @@ function TaskShowOBJ:renderMainLine(data)
end end
local name = item.name or item[1] local name = item.name or item[1]
local count = tonumber(item.count or item[2]) or 1 local count = tonumber(item.count or item[2]) or 1
local x = 22 + (i - 1) * 44 local x = 22 + (i - 1) * 60
local y = 29 local y = 4
local index = SL:GetMetaValue("ITEM_INDEX_BY_NAME", name) local index = SL:GetMetaValue("ITEM_INDEX_BY_NAME", name)
if index then if index then
local itemShow = GUI:ItemShow_Create(self.ui.RewardItems_Layout, "RewardItem_" .. i, x, y, { local itemshow_bg = GUI:Image_Create(self.ui.RewardItems_Layout, "RewardItemBg_" .. i, x, y,
"res/custom/43/1.png")
local bg_size = GUI:getContentSize(itemshow_bg)
local itemShow = GUI:ItemShow_Create(itemshow_bg, "RewardItem_" .. i, bg_size.width / 2, bg_size.height / 2, {
index = index, index = index,
count = count, count = count,
bgVisible = true, bgVisible = false,
look = true look = true
}) })
GUI:setScale(itemShow, 0.86) GUI:setAnchorPoint(itemShow, 0.50, 0.50)
else else
local RewardText = GUI:Text_Create(self.ui.RewardItems_Layout, "RewardText_" .. i, x - 18, y, 11, "#ffd36a", tostring(name or "奖励")) local RewardText = GUI:Text_Create(self.ui.RewardItems_Layout, "RewardText_" .. i, x - 18, y, 11,
"#ffd36a", tostring(name or "奖励"))
GUI:setAnchorPoint(RewardText, 0.00, 0.50) GUI:setAnchorPoint(RewardText, 0.00, 0.50)
GUI:Text_enableOutline(RewardText, "#000000", 1) GUI:Text_enableOutline(RewardText, "#000000", 1)
end end
@ -157,15 +189,18 @@ function TaskShowOBJ:upLuanDou(data)
self.ui[list_Layout] = GUI:Layout_Create(self.ui.rank_list, list_Layout, 0, 0, 200, 30, false) self.ui[list_Layout] = GUI:Layout_Create(self.ui.rank_list, list_Layout, 0, 0, 200, 30, false)
local list_rank = string.format("list_rank_%d", i) local list_rank = string.format("list_rank_%d", i)
self.ui[list_rank] = GUI:Text_Create(self.ui[list_Layout], list_rank, 27, 16, 16, SL:GetHexColorByStyleId(255 - i), i) self.ui[list_rank] = GUI:Text_Create(self.ui[list_Layout], list_rank, 27, 16, 16,
SL:GetHexColorByStyleId(255 - i), i)
GUI:setAnchorPoint(self.ui[list_rank], 0.50, 0.50) GUI:setAnchorPoint(self.ui[list_rank], 0.50, 0.50)
local list_name = string.format("list_name_%d", i) local list_name = string.format("list_name_%d", i)
self.ui[list_name] = GUI:Text_Create(self.ui[list_Layout], list_name, 101, 16, 16, SL:GetHexColorByStyleId(255 - i), v[2]) self.ui[list_name] = GUI:Text_Create(self.ui[list_Layout], list_name, 101, 16, 16,
SL:GetHexColorByStyleId(255 - i), v[2])
GUI:setAnchorPoint(self.ui[list_name], 0.50, 0.50) GUI:setAnchorPoint(self.ui[list_name], 0.50, 0.50)
local list_jifen = string.format("list_jifen_%d", i) local list_jifen = string.format("list_jifen_%d", i)
self.ui[list_jifen] = GUI:Text_Create(self.ui[list_Layout], list_jifen, 172, 16, 16, SL:GetHexColorByStyleId(255 - i), v[3]) self.ui[list_jifen] = GUI:Text_Create(self.ui[list_Layout], list_jifen, 172, 16, 16,
SL:GetHexColorByStyleId(255 - i), v[3])
GUI:setAnchorPoint(self.ui[list_jifen], 0.50, 0.50) GUI:setAnchorPoint(self.ui[list_jifen], 0.50, 0.50)
end end

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
{"gm":0,"signkey":"634eff98723b31da43ed35f0dd4edf36","oper_mode":1,"modlist":"http://list.dhsf.xqhuyu.com/testmodlist/modlist_tool_1942.txt","resolution":"1024x768","channel":1} {"modlist":"http:\/\/list.dhsf.xqhuyu.com\/testmodlist\/modlist_tool_1942.txt","channel":1,"gm":0,"signkey":"634eff98723b31da43ed35f0dd4edf36","resolution":"1136x640","oper_mode":2}

11
csv/cfg_主线任务.csv Normal file
View file

@ -0,0 +1,11 @@
序列,下一任务,是否启用,标题,待拜访描述,进行中描述,奖励描述,拜访类型,模块Key_1,模块打开对象,NPC_ID_1,NPC脚本_1,目标类型,目标数量,目标地图,目标怪物,奖励_1_类型,奖励_1_名称,奖励_1_数量,奖励_1_绑定,奖励_2_类型,奖励_2_名称,奖励_2_数量,奖励_2_绑定,奖励_3_类型,奖励_3_名称,奖励_3_数量,奖励_3_绑定,是否结束任务
id,next,enabled,title,desc,doingDesc,rewardText,visit_type,visit_keys_1,visit_open,visit_ids_1,visit_scripts_1,target_type,target_count,target_map,target_mon,reward_1_type,reward_1_name,reward_1_num,reward_1_bind,reward_2_type,reward_2_name,reward_2_num,reward_2_bind,reward_3_type,reward_3_name,reward_3_num,reward_3_bind,finish
1,2,TRUE,[主线]了解首充,了解首充后前往任意地图击杀任意怪物5只。,前往任意地图击杀任意怪物。,经验100万、金币5000,module,ShouChongOBJ,ShouChongOBJ_main,,,kill_mon,5,*,*,money,经验,1000000,0,money,金币,5000,0,,,,,
2,3,TRUE,[主线]拜访渡劫天尊,拜访渡劫天尊后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,经验100万、金币10000,npc,,,6,转生,kill_mon,5,*,*,money,经验,1000000,0,money,金币,10000,0,,,,,
3,4,TRUE,[主线]拜访神兽淬体,拜访神兽淬体后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,神兽之血*50、神兽之骨*50,npc,,,5,神兽淬体,kill_mon,5,*,*,item,神兽之血,50,0,item,神兽之骨,50,0,,,,,
4,5,TRUE,[主线]拜访紫金仙人,拜访紫金仙人后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,经验100万、千年玄石*50、金币10000,npc,,,189,紫金葫芦,kill_mon,5,*,*,money,经验,1000000,0,item,千年玄石,50,0,money,金币,10000,0,
5,6,TRUE,[主线]了解绝学NPC,了解绝学NPC后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,灵石*50、武林秘籍*1,npc,,,12,绝学修炼,kill_mon,5,*,*,item,灵石,50,0,item,武林秘籍,1,0,,,,,
6,7,TRUE,[主线]拜访幸运仙子,拜访幸运仙子后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,经验100万、金币10000,npc,,,11,幸运项链,kill_mon,5,*,*,money,经验,1000000,0,money,金币,10000,0,,,,,
7,8,TRUE,[主线]前往装备重铸,前往装备重铸后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,经验100万、金币10000,npc,,,10,装备重铸,kill_mon,5,*,*,money,经验,1000000,0,money,金币,10000,0,,,,,
8,9,TRUE,[主线]前往武器升级,前往武器升级后前往任意地图击杀怪物5只。,前往任意地图击杀怪物。,黑铁矿石*4、金币10000,npc,,,13,武器升级,kill_mon,5,*,*,item,黑铁矿石,4,0,money,金币,10000,0,,,,,
9,,TRUE,[主线]任务结束,主线任务已完成。,主线任务已完成。,无,,,,,,,,,,,,,,,,,,,,,,TRUE
1 序列 下一任务 是否启用 标题 待拜访描述 进行中描述 奖励描述 拜访类型 模块Key_1 模块打开对象 NPC_ID_1 NPC脚本_1 目标类型 目标数量 目标地图 目标怪物 奖励_1_类型 奖励_1_名称 奖励_1_数量 奖励_1_绑定 奖励_2_类型 奖励_2_名称 奖励_2_数量 奖励_2_绑定 奖励_3_类型 奖励_3_名称 奖励_3_数量 奖励_3_绑定 是否结束任务
2 id next enabled title desc doingDesc rewardText visit_type visit_keys_1 visit_open visit_ids_1 visit_scripts_1 target_type target_count target_map target_mon reward_1_type reward_1_name reward_1_num reward_1_bind reward_2_type reward_2_name reward_2_num reward_2_bind reward_3_type reward_3_name reward_3_num reward_3_bind finish
3 1 2 TRUE [主线]了解首充 了解首充后,前往任意地图击杀任意怪物5只。 前往任意地图击杀任意怪物。 经验100万、金币5000 module ShouChongOBJ ShouChongOBJ_main kill_mon 5 * * money 经验 1000000 0 money 金币 5000 0
4 2 3 TRUE [主线]拜访渡劫天尊 拜访渡劫天尊后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 经验100万、金币10000 npc 6 转生 kill_mon 5 * * money 经验 1000000 0 money 金币 10000 0
5 3 4 TRUE [主线]拜访神兽淬体 拜访神兽淬体后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 神兽之血*50、神兽之骨*50 npc 5 神兽淬体 kill_mon 5 * * item 神兽之血 50 0 item 神兽之骨 50 0
6 4 5 TRUE [主线]拜访紫金仙人 拜访紫金仙人后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 经验100万、千年玄石*50、金币10000 npc 189 紫金葫芦 kill_mon 5 * * money 经验 1000000 0 item 千年玄石 50 0 money 金币 10000 0
7 5 6 TRUE [主线]了解绝学NPC 了解绝学NPC后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 灵石*50、武林秘籍*1 npc 12 绝学修炼 kill_mon 5 * * item 灵石 50 0 item 武林秘籍 1 0
8 6 7 TRUE [主线]拜访幸运仙子 拜访幸运仙子后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 经验100万、金币10000 npc 11 幸运项链 kill_mon 5 * * money 经验 1000000 0 money 金币 10000 0
9 7 8 TRUE [主线]前往装备重铸 前往装备重铸后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 经验100万、金币10000 npc 10 装备重铸 kill_mon 5 * * money 经验 1000000 0 money 金币 10000 0
10 8 9 TRUE [主线]前往武器升级 前往武器升级后,前往任意地图击杀怪物5只。 前往任意地图击杀怪物。 黑铁矿石*4、金币10000 npc 13 武器升级 kill_mon 5 * * item 黑铁矿石 4 0 money 金币 10000 0
11 9 TRUE [主线]任务结束 主线任务已完成。 主线任务已完成。 TRUE