Add server configuration editor
This commit is contained in:
@@ -63,7 +63,7 @@ function migratePoint(value: unknown, defaultSubjectId: string, defaultSubjectTy
|
||||
function migrateSession(value: unknown, defaultPlayerId: string): SCUMPlayerSession | null { const record = object(value); const id = record && text(record.id); const playerId = record && (text(record.gamePlayerRecordId) ?? text(record.playerId) ?? defaultPlayerId); const startedAt = record && timestamp(record.startedAt); if (!id || !playerId || !startedAt) return null; const endedAt = timestamp(record.endedAt); return { id, playerId, kind: endedAt ? "logout" : "login", occurredAt: endedAt ?? startedAt }; }
|
||||
function migrateRisk(value: unknown): SCUMPlayerRisk | null { const record = object(value); const observedAt = record && (timestamp(record.occurredAt) ?? timestamp(record.lastObservedAt)); const kind = record && (text(record.ruleKey) ?? text(record.outcome)); const summary = record && (text(record.summary) ?? text(record.reason)); if (!observedAt || !kind || !summary) return null; return { kind, level: "medium", observedAt, summary }; }
|
||||
function migrateStateChange(value: unknown): { fieldKey: string; before: number; after: number } | null { const record = object(value); if (!record) return null; const fieldKey = text(record.fieldKey); const before = number(record.before); const after = number(record.after); return fieldKey && before !== undefined && after !== undefined ? { fieldKey, before, after } : null; }
|
||||
function declaredConfigFields(value: unknown): Record<string, string> | null { const fields = object(value); const allowed = new Set(configurationCatalog.map((field) => field.configKey)); if (!fields || !allowed.size) return null; const result: Record<string, string> = {}; for (const [key, field] of Object.entries(fields)) { if (allowed.has(key) && (typeof field === "string" || typeof field === "number" || typeof field === "boolean")) result[key] = String(field); } return Object.keys(result).length ? result : null; }
|
||||
function declaredConfigFields(value: unknown): Record<string, string> | null { const fields = object(value); const allowed = new Set(configurationCatalog.flatMap((field) => [field.configKey, field.configKey.replace(/^scum\./, "")])); if (!fields || !allowed.size) return null; const result: Record<string, string> = {}; for (const [key, field] of Object.entries(fields)) { if (allowed.has(key) && (typeof field === "string" || typeof field === "number" || typeof field === "boolean")) result[key] = String(field); } return Object.keys(result).length ? result : null; }
|
||||
function giftStatus(value: unknown): SCUMGiftGrant["status"] | null { return value === "pending-approval" || value === "queued" || value === "delivered" || value === "notification_failed" || value === "failed" || value === "unknown" ? value : null; }
|
||||
function stateStatus(value: unknown): SCUMStatePatch["status"] | null { if (value === "pending-approval" || value === "queued" || value === "unsupported" || value === "unknown" || value === "execution-unknown") return value === "execution-unknown" ? "unknown" : value; if (value === "confirmed") return "succeeded"; return value === "execution-failed" || value === "confirmation-failed" || value === "failed" ? "failed" : null; }
|
||||
function trajectorySubjectType(record: Record<string, unknown>): SCUMTrajectoryPoint["subjectType"] | null { if (record.kind === "player" || record.kind === "vehicle") return record.kind; return text(record.playerRecordId) || text(record.gamePlayerRecordId) ? "player" : text(record.vehicleId) ? "vehicle" : null; }
|
||||
|
||||
@@ -3,11 +3,19 @@ import type { SCUMConfigField, SCUMConfigPatch, SCUMFeatureAvailability, SCUMSta
|
||||
// These are safe fallback plugin catalogs. Plugin-owned declarations may narrow
|
||||
// them per server, but a game version never enables or disables a feature.
|
||||
export const configurationCatalog: readonly SCUMConfigField[] = [
|
||||
{ key: "server-name", fileKey: "scum-server-settings", configKey: "ServerName", label: "服务器名称", description: "显示在服务器浏览器与玩家连接界面。", control: "text", defaultValue: "SCUM Server", restartImpact: "restart-required" },
|
||||
{ key: "server-name", fileKey: "scum-server-settings", configKey: "scum.ServerName", label: "服务器名称", description: "显示在服务器浏览器与玩家连接界面。", control: "text", defaultValue: "SCUM Server", restartImpact: "restart-required" },
|
||||
{ key: "game-port", fileKey: "scum-server-settings", configKey: "GamePort", label: "游戏端口", description: "玩家连接所使用的游戏端口。", control: "port", minimum: 1, maximum: 65535, defaultValue: "7779", restartImpact: "restart-required" },
|
||||
{ key: "query-port", fileKey: "scum-server-settings", configKey: "QueryPort", label: "查询端口", description: "服务器查询和状态发现所使用的端口。", control: "port", minimum: 1, maximum: 65535, defaultValue: "27015", restartImpact: "restart-required" },
|
||||
{ key: "max-players", fileKey: "scum-server-settings", configKey: "MaxPlayers", label: "最大玩家数", description: "允许同时进入服务器的玩家上限。", control: "number", minimum: 1, maximum: 128, defaultValue: "128", restartImpact: "restart-required" },
|
||||
{ key: "welcome-message", fileKey: "scum-server-settings", configKey: "WelcomeMessage", label: "欢迎消息", description: "登录成功后由已声明的服务器扩展显示给玩家。", control: "text", defaultValue: "", restartImpact: "none" }
|
||||
{ key: "max-players", fileKey: "scum-server-settings", configKey: "scum.MaxPlayers", label: "最大玩家数", description: "允许同时进入服务器的玩家上限。", control: "number", minimum: 1, maximum: 128, defaultValue: "128", restartImpact: "restart-required" },
|
||||
{ key: "welcome-message", fileKey: "scum-server-settings", configKey: "scum.WelcomeMessage", label: "欢迎消息", description: "玩家登录后显示的欢迎消息。", control: "text", defaultValue: "", restartImpact: "none" },
|
||||
{ key: "server-description", fileKey: "scum-server-settings", configKey: "scum.ServerDescription", label: "服务器描述", description: "显示在服务器列表中的详细描述。", control: "text", defaultValue: "", restartImpact: "restart-required" },
|
||||
{ key: "server-password", fileKey: "scum-server-settings", configKey: "scum.ServerPassword", label: "服务器密码", description: "留空表示不设置连接密码。", control: "text", defaultValue: "", restartImpact: "restart-required" },
|
||||
{ key: "server-playstyle", fileKey: "scum-server-settings", configKey: "scum.ServerPlaystyle", label: "服务器玩法", description: "服务器使用的玩法类型,例如 PVE 或 PVP。", control: "text", defaultValue: "PVE", restartImpact: "restart-required" },
|
||||
{ key: "message-of-the-day", fileKey: "scum-server-settings", configKey: "scum.MessageOfTheDay", label: "每日公告", description: "玩家进入服务器后看到的每日公告。", control: "text", defaultValue: "", restartImpact: "none" },
|
||||
{ key: "allow-first-person", fileKey: "scum-server-settings", configKey: "scum.AllowFirstPerson", label: "允许第一人称", description: "允许玩家使用第一人称视角。", control: "boolean", defaultValue: "True", restartImpact: "restart-required" },
|
||||
{ key: "allow-third-person", fileKey: "scum-server-settings", configKey: "scum.AllowThirdPerson", label: "允许第三人称", description: "允许玩家使用第三人称视角。", control: "boolean", defaultValue: "True", restartImpact: "restart-required" },
|
||||
{ key: "allow-global-chat", fileKey: "scum-server-settings", configKey: "scum.AllowGlobalChat", label: "允许公频聊天", description: "允许玩家使用公频聊天。", control: "boolean", defaultValue: "True", restartImpact: "none" },
|
||||
{ key: "disable-base-building", fileKey: "scum-server-settings", configKey: "scum.DisableBaseBuilding", label: "禁用建家", description: "是否完全禁止玩家建造基地。", control: "boolean", defaultValue: "False", restartImpact: "restart-required" }
|
||||
];
|
||||
export const vehicleSpawnCatalog: readonly SCUMVehicleSpawnOption[] = [{ code: "BPC_Laika_C", label: "Laika" }, { code: "BPC_WolfsWagen_C", label: "WolfsWagen" }];
|
||||
export const stateFieldCatalog: readonly Omit<SCUMStateField, "value" | "editable" | "reason">[] = [{ key: "skills.running", label: "跑步技能", minimum: 0, maximum: 1000000 }, { key: "attributes.strength", label: "力量属性", minimum: 1, maximum: 8 }, { key: "attributes.stamina", label: "体力", minimum: 0, maximum: 100000 }, { key: "attributes.dexterity", label: "敏捷", minimum: 0, maximum: 100000 }, { key: "attributes.intelligence", label: "智力", minimum: 0, maximum: 100000 }];
|
||||
|
||||
@@ -596,41 +596,17 @@
|
||||
{
|
||||
"key": "server-name",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "ServerName",
|
||||
"configKey": "scum.ServerName",
|
||||
"label": "服务器名称",
|
||||
"description": "显示在服务器浏览器与玩家连接界面。",
|
||||
"control": "text",
|
||||
"defaultValue": "SCUM Server",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "game-port",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "GamePort",
|
||||
"label": "游戏端口",
|
||||
"description": "玩家连接所使用的游戏端口。",
|
||||
"control": "port",
|
||||
"minimum": 1,
|
||||
"maximum": 65535,
|
||||
"defaultValue": "7779",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "query-port",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "QueryPort",
|
||||
"label": "查询端口",
|
||||
"description": "服务器查询和状态发现所使用的端口。",
|
||||
"control": "port",
|
||||
"minimum": 1,
|
||||
"maximum": 65535,
|
||||
"defaultValue": "27015",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "max-players",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "MaxPlayers",
|
||||
"configKey": "scum.MaxPlayers",
|
||||
"label": "最大玩家数",
|
||||
"description": "允许同时进入服务器的玩家上限。",
|
||||
"control": "number",
|
||||
@@ -642,12 +618,92 @@
|
||||
{
|
||||
"key": "welcome-message",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "WelcomeMessage",
|
||||
"configKey": "scum.WelcomeMessage",
|
||||
"label": "欢迎消息",
|
||||
"description": "登录成功后由已声明的服务器扩展显示给玩家。",
|
||||
"control": "text",
|
||||
"defaultValue": "",
|
||||
"restartImpact": "none"
|
||||
},
|
||||
{
|
||||
"key": "server-description",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.ServerDescription",
|
||||
"label": "服务器描述",
|
||||
"description": "显示在服务器列表中的详细描述。",
|
||||
"control": "text",
|
||||
"defaultValue": "",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "server-password",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.ServerPassword",
|
||||
"label": "服务器密码",
|
||||
"description": "留空表示不设置连接密码。",
|
||||
"control": "text",
|
||||
"defaultValue": "",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "server-playstyle",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.ServerPlaystyle",
|
||||
"label": "服务器玩法",
|
||||
"description": "服务器使用的玩法类型,例如 PVE 或 PVP。",
|
||||
"control": "text",
|
||||
"defaultValue": "PVE",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "message-of-the-day",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.MessageOfTheDay",
|
||||
"label": "每日公告",
|
||||
"description": "玩家进入服务器后看到的每日公告。",
|
||||
"control": "text",
|
||||
"defaultValue": "",
|
||||
"restartImpact": "none"
|
||||
},
|
||||
{
|
||||
"key": "allow-first-person",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.AllowFirstPerson",
|
||||
"label": "允许第一人称",
|
||||
"description": "允许玩家使用第一人称视角。",
|
||||
"control": "boolean",
|
||||
"defaultValue": "True",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "allow-third-person",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.AllowThirdPerson",
|
||||
"label": "允许第三人称",
|
||||
"description": "允许玩家使用第三人称视角。",
|
||||
"control": "boolean",
|
||||
"defaultValue": "True",
|
||||
"restartImpact": "restart-required"
|
||||
},
|
||||
{
|
||||
"key": "allow-global-chat",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.AllowGlobalChat",
|
||||
"label": "允许公频聊天",
|
||||
"description": "允许玩家使用公频聊天。",
|
||||
"control": "boolean",
|
||||
"defaultValue": "True",
|
||||
"restartImpact": "none"
|
||||
},
|
||||
{
|
||||
"key": "disable-base-building",
|
||||
"fileKey": "scum-server-settings",
|
||||
"configKey": "scum.DisableBaseBuilding",
|
||||
"label": "禁用建家",
|
||||
"description": "是否完全禁止玩家建造基地。",
|
||||
"control": "boolean",
|
||||
"defaultValue": "False",
|
||||
"restartImpact": "restart-required"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user