mirror of
https://github.com/Corfirean/coa-server-manager.git
synced 2026-11-12 20:11:02 +00:00
Merge remote-tracking branch 'origin/feat/ahbot-single-switch' into integrate/prebuild-20261023
This commit is contained in:
commit
1bc4060121
10 files changed
+17
-10
No files matched your search
@@ -0,0 +1,7 @@
|
||||
---
|
||||
area: manager
|
||||
type: changed
|
||||
audience: admins
|
||||
title: The Auction House Bot card has a single switch
|
||||
---
|
||||
The separate "Post auctions" option is gone; turning the module on is enough. A server build with the single-switch Auction House Bot is needed, and an old EnableSeller line in the config is ignored.
|
||||
+1
-1
@@ -82,7 +82,7 @@ export {};
|
||||
"playerbots":[{"key": "AiPlayerbot.RandomBotAutologin", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.MinRandomBots", "value": "500", "default": "500", "doc": ""}, {"key": "AiPlayerbot.MaxRandomBots", "value": "500", "default": "500", "doc": ""}, {"key": "AiPlayerbot.RandomBotAccountCount", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.RandomBotMinLevel", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.RandomBotMaxLevel", "value": "60", "default": "60", "doc": ""}, {"key": "AiPlayerbot.SyncLevelWithPlayers", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.RandomBotInvitePlayer", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.RandomBotJoinLfg", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.RandomBotJoinBG", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.RandomBotAutoJoinBG", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.RandomBotTalk", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.RandomBotEmote", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.RandomBotSuggestDungeons", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.CoaClassesOnly", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.CoaSmartHeal", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.CoaSmartTank", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.CoaSpecRotations", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.CoaInterruptCoordination", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.MaxAddedBots", "value": "40", "default": "40", "doc": ""}, {"key": "AiPlayerbot.BotAutologin", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.DisabledWithoutRealPlayer", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.AddClassCommand", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.KeepAltsInGroup", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.CoaRecruitSameFaction", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.CoaLfgBots", "value": "1", "default": "1", "doc": ""}, {"key": "AiPlayerbot.RandomBotXPRate", "value": "1.0", "default": "1.0", "doc": ""}, {"key": "AiPlayerbot.FollowDistance", "value": "1.5", "default": "1.5", "doc": ""}, {"key": "AiPlayerbot.Enabled", "value": "0", "default": "0", "doc": ""}, {"key": "AiPlayerbot.RandomBotAccountPrefix", "value": "\"rndbot\"", "default": "\"rndbot\"", "doc": ""}, {"key": "AiPlayerbot.RandomBotUpdateInterval", "value": "20", "default": "20", "doc": ""}],
|
||||
"companions":[{key:"CoaBots.Enable",value:"1",default:"1",doc:"Master switch of the companion bots."},{key:"CoaBots.RandomSpawn.DefaultCount",value:"10",default:"10",doc:""}],
|
||||
"content-scaling":[{key:"CoAContentScaling.Enable",value:"1",default:"1",doc:"Scale dungeons and raids to the group."}, ...[{key:"CoAContentScaling.LFG.AllowPartialGroups",value:"1"},{key:"CoAContentScaling.World.Leech.Enable",value:"0"},{key:"CoAContentScaling.World.Leech.Percent",value:"5.0"},{key:"CoAContentScaling.Difficulty.DamageMultiplier",value:"1.0"},{key:"CoAContentScaling.SoloAssist.Mode",value:"1"},{key:"CoAContentScaling.GroupScaling.Enable",value:"1"},{key:"CoAContentScaling.LFG.DefaultMode",value:"CurrentParty"},{key:"CoAContentScaling.LFG.DefaultChallengeSize",value:"0"},{key:"CoAContentScaling.Debug",value:"0"}].map(s=>({...s,default:s.value,doc:""}))],
|
||||
"ah-bot":[...Object.keys(auctionCategories).flatMap(category => Object.keys(auctionQualities).map(quality => ({key:`AuctionHouseBot.ListProportion.Category${category}.Quality${quality}`,value:String(quality === "Normal" && !["Quest","Key","Generic","Reagent"].includes(category) ? 50 : quality === "Rare" && ["Armor","Weapon"].includes(category) ? 5 : 0),default:String(quality === "Normal" && !["Quest","Key","Generic","Reagent"].includes(category) ? 50 : quality === "Rare" && ["Armor","Weapon"].includes(category) ? 5 : 0),doc:""}))), {key:"AuctionHouseBot.Enable",value:"false",default:"false",doc:""}, ...[{key:"AuctionHouseBot.GUIDs",value:"0"},{key:"AuctionHouseBot.EnableSeller",value:"true"},{key:"AuctionHouseBot.CoA.ObtainableItemsOnly",value:"true"},{key:"AuctionHouseBot.ItemsPerCycle",value:"150"},{key:"AuctionHouseBot.MinutesBetweenSellCycle",value:"1"},{key:"AuctionHouseBot.Alliance.MinItems",value:"15000"},{key:"AuctionHouseBot.Alliance.MaxItems",value:"15000"}].map(s=>({...s,default:s.value,doc:""}))],
|
||||
"ah-bot":[...Object.keys(auctionCategories).flatMap(category => Object.keys(auctionQualities).map(quality => ({key:`AuctionHouseBot.ListProportion.Category${category}.Quality${quality}`,value:String(quality === "Normal" && !["Quest","Key","Generic","Reagent"].includes(category) ? 50 : quality === "Rare" && ["Armor","Weapon"].includes(category) ? 5 : 0),default:String(quality === "Normal" && !["Quest","Key","Generic","Reagent"].includes(category) ? 50 : quality === "Rare" && ["Armor","Weapon"].includes(category) ? 5 : 0),doc:""}))), {key:"AuctionHouseBot.Enable",value:"false",default:"false",doc:""}, ...[{key:"AuctionHouseBot.GUIDs",value:"0"},{key:"AuctionHouseBot.CoA.ObtainableItemsOnly",value:"true"},{key:"AuctionHouseBot.ItemsPerCycle",value:"150"},{key:"AuctionHouseBot.MinutesBetweenSellCycle",value:"1"},{key:"AuctionHouseBot.Alliance.MinItems",value:"15000"},{key:"AuctionHouseBot.Alliance.MaxItems",value:"15000"}].map(s=>({...s,default:s.value,doc:""}))],
|
||||
"tbc-content":[{key:"CoATBC.Enable",value:"1",default:"1",doc:"Outland dungeons and raids."}],
|
||||
"wotlk-content":[{key:"CoAWotLK.Enable",value:"1",default:"1",doc:"Northrend dungeons and raids."}],
|
||||
};
|
||||
|
||||
@@ -768,7 +768,7 @@ const de: Partial<Record<keyof typeof en, string>> = {
|
||||
"mod.noSettings": "Keine weiteren Einstellungen. Verwende den Modulschalter oben.",
|
||||
"err.bot_modules_conflict.title": "Zwei Bot-Module sind aktiviert",
|
||||
"err.bot_modules_conflict.message": "Deaktiviere CoA Companions oder SQUID Playerbots unter Module vor dem Serverstart.",
|
||||
"mod.ahbot.setup": "Modul und Verkäufer aktivieren. Der Server legt beim ersten Start selbst einen Auktionscharakter an (Konto AHBOT), eine GUID ist nicht nötig. Ein Charakter bietet in den Auktionshäusern beider Fraktionen an. Der CoA-Filter nutzt Beute-, Händler- und Berufstabellen; Stufengrenzen gelten zusätzlich. Erfordert einen Serverbuild mit CoA-Auktionsfilter und automatischem Auktionscharakter.",
|
||||
"mod.ahbot.setup": "Modul aktivieren. Der Server legt beim ersten Start selbst einen Auktionscharakter an (Konto AHBOT), eine GUID ist nicht nötig. Ein Charakter bietet in den Auktionshäusern beider Fraktionen an. Der CoA-Filter nutzt Beute-, Händler- und Berufstabellen; Stufengrenzen gelten zusätzlich. Erfordert einen Serverbuild mit CoA-Auktionsfilter und automatischem Auktionscharakter.",
|
||||
"mod.enchanter.add": "Verzauberer platzieren: Stellt euch an die gewünschte Stelle und gebt .npc add 601015 ein",
|
||||
"mod.enchanter.remove": "Verzauberer entfernen: Ziel auf den NPC setzen und .npc delete eingeben",
|
||||
"mod.ahbot.allSettings": "Alle Auktionseinstellungen",
|
||||
|
||||
@@ -807,7 +807,7 @@ const en = {
|
||||
"mod.ahbot.weightsHint": "Relative weights, not percentages. 0 excludes a quality; larger values make it more frequent. If all defaults are zero, enabling selects common quality. Other item filters still apply.",
|
||||
"mod.ahbot.noTypes": "All types are disabled. The seller has no types to choose for new listings.",
|
||||
"mod.noSettings": "There are no additional settings. Use the module switch above.",
|
||||
"mod.ahbot.setup": "Turn on the module and the seller. The server creates its own auction character (account AHBOT) the first time it starts, so no GUID is needed. One character lists in both factions' auction houses. The CoA filter selects items from loot tables, vendors and professions; level restrictions also apply. Requires a server build with the CoA auction filter and the automatic auction character.",
|
||||
"mod.ahbot.setup": "Turn on the module. The server creates its own auction character (account AHBOT) the first time it starts, so no GUID is needed. One character lists in both factions' auction houses. The CoA filter selects items from loot tables, vendors and professions; level restrictions also apply. Requires a server build with the CoA auction filter and the automatic auction character.",
|
||||
"mod.enchanter.add": "Place the enchanter: stand where you want him and enter .npc add 601015",
|
||||
"mod.enchanter.remove": "Remove the enchanter: target him and enter .npc delete",
|
||||
"mod.ahbot.allSettings": "All settings",
|
||||
|
||||
@@ -768,7 +768,7 @@ const es: Partial<Record<keyof typeof en, string>> = {
|
||||
"mod.noSettings": "No hay ajustes adicionales. Usa el interruptor del módulo de arriba.",
|
||||
"err.bot_modules_conflict.title": "Hay dos módulos de bots activos",
|
||||
"err.bot_modules_conflict.message": "Desactiva CoA Companions o SQUID Playerbots en Módulos antes de iniciar el servidor.",
|
||||
"mod.ahbot.setup": "Activa el módulo y el vendedor. El servidor crea por sí mismo un personaje de subastas (cuenta AHBOT) en el primer arranque, no hace falta GUID. Un solo personaje publica en las casas de subastas de ambas facciones. El filtro CoA usa botín, vendedores y profesiones; los límites de nivel se aplican además. Requiere un servidor con filtro de subastas CoA y personaje de subastas automático.",
|
||||
"mod.ahbot.setup": "Activa el módulo. El servidor crea por sí mismo un personaje de subastas (cuenta AHBOT) en el primer arranque, no hace falta GUID. Un solo personaje publica en las casas de subastas de ambas facciones. El filtro CoA usa botín, vendedores y profesiones; los límites de nivel se aplican además. Requiere un servidor con filtro de subastas CoA y personaje de subastas automático.",
|
||||
"mod.enchanter.add": "Colocar al encantador: ponte donde quieras y escribe .npc add 601015",
|
||||
"mod.enchanter.remove": "Quitar al encantador: selecciona al PNJ y escribe .npc delete",
|
||||
"mod.ahbot.allSettings": "Todos los ajustes de subastas",
|
||||
|
||||
@@ -768,7 +768,7 @@ const fr: Partial<Record<keyof typeof en, string>> = {
|
||||
"mod.noSettings": "Aucun réglage supplémentaire. Utilisez l’interrupteur du module ci-dessus.",
|
||||
"err.bot_modules_conflict.title": "Deux modules de bots sont activés",
|
||||
"err.bot_modules_conflict.message": "Désactivez CoA Companions ou SQUID Playerbots dans Modules avant de démarrer le serveur.",
|
||||
"mod.ahbot.setup": "Activez le module et le vendeur. Le serveur crée lui-même un personnage d’enchères (compte AHBOT) au premier démarrage, aucun GUID n’est nécessaire. Un seul personnage met en vente dans les hôtels des ventes des deux factions. Le filtre CoA utilise le butin, les vendeurs et les métiers ; les limites de niveau s’ajoutent. Nécessite un serveur avec le filtre d’enchères CoA et le personnage d’enchères automatique.",
|
||||
"mod.ahbot.setup": "Activez le module. Le serveur crée lui-même un personnage d’enchères (compte AHBOT) au premier démarrage, aucun GUID n’est nécessaire. Un seul personnage met en vente dans les hôtels des ventes des deux factions. Le filtre CoA utilise le butin, les vendeurs et les métiers ; les limites de niveau s’ajoutent. Nécessite un serveur avec le filtre d’enchères CoA et le personnage d’enchères automatique.",
|
||||
"mod.enchanter.add": "Placer l’enchanteur : placez-vous à l’endroit voulu et saisissez .npc add 601015",
|
||||
"mod.enchanter.remove": "Retirer l’enchanteur : ciblez le PNJ et saisissez .npc delete",
|
||||
"mod.ahbot.allSettings": "Tous les réglages d’enchères",
|
||||
|
||||
@@ -790,7 +790,7 @@ const ru: Partial<Record<keyof typeof en, string>> = {
|
||||
"mod.ahbot.weightsHint": "Это относительные веса, а не проценты. 0 исключает качество; большее значение повышает частоту. Если все значения по умолчанию равны нулю, включается обычное качество. Остальные фильтры продолжают действовать.",
|
||||
"mod.ahbot.noTypes": "Все типы отключены. Продавцу не из чего выбирать новые лоты.",
|
||||
"mod.noSettings": "Дополнительных настроек нет. Используйте переключатель модуля выше.",
|
||||
"mod.ahbot.setup": "Включите модуль и продавца. Сервер сам создаст персонажа аукциона (аккаунт AHBOT) при первом запуске, GUID вводить не нужно. Один персонаж выставляет лоты в аукционах обеих фракций. Фильтр CoA оставляет предметы из таблиц добычи, торговцев и профессий; ограничения уровней действуют дополнительно. Нужна сборка сервера с фильтром аукциона CoA и автоматическим персонажем аукциона.",
|
||||
"mod.ahbot.setup": "Включите модуль. Сервер сам создаст персонажа аукциона (аккаунт AHBOT) при первом запуске, GUID вводить не нужно. Один персонаж выставляет лоты в аукционах обеих фракций. Фильтр CoA оставляет предметы из таблиц добычи, торговцев и профессий; ограничения уровней действуют дополнительно. Нужна сборка сервера с фильтром аукциона CoA и автоматическим персонажем аукциона.",
|
||||
"mod.enchanter.add": "Разместить НПС зачарователя: встаньте в нужное место и введите команду .npc add 601015",
|
||||
"mod.enchanter.remove": "Удалить НПС зачарователя: возьмите НПС в цель и введите команду .npc delete",
|
||||
"mod.ahbot.allSettings": "Все настройки",
|
||||
|
||||
@@ -768,7 +768,7 @@ const zh = {
|
||||
"mod.noSettings": "没有其他设置,请使用上方模块开关。",
|
||||
"err.bot_modules_conflict.title": "已启用两个机器人模块",
|
||||
"err.bot_modules_conflict.message": "启动服务器前,请在模块中关闭CoA Companions或SQUID Playerbots。",
|
||||
"mod.ahbot.setup": "启用模块和卖家即可。服务器首次启动时会自动创建拍卖角色(账号AHBOT),无需填写GUID。一个角色即可在双方阵营的拍卖行上架。CoA筛选使用掉落、商人和专业物品表,等级限制另行生效。需要包含CoA拍卖筛选和自动拍卖角色的服务器版本。",
|
||||
"mod.ahbot.setup": "启用模块即可。服务器首次启动时会自动创建拍卖角色(账号AHBOT),无需填写GUID。一个角色即可在双方阵营的拍卖行上架。CoA筛选使用掉落、商人和专业物品表,等级限制另行生效。需要包含CoA拍卖筛选和自动拍卖角色的服务器版本。",
|
||||
"mod.enchanter.add": "放置附魔师NPC:站在想要的位置,输入 .npc add 601015",
|
||||
"mod.enchanter.remove": "删除附魔师NPC:选中该NPC,输入 .npc delete",
|
||||
"mod.ahbot.allSettings": "所有拍卖设置",
|
||||
|
||||
@@ -109,7 +109,6 @@ add("CoACustomRaces.BotsEnable", "bool",
|
||||
|
||||
const ah = "AuctionHouseBot.";
|
||||
add(ah + "GUIDs", "string", ["Auction characters", "Персонажи аукциона", "Auktionscharaktere", "Personnages d’enchères", "Personajes de subasta", "拍卖角色"], ["Leave 0 and the server creates and uses its own auction character. To use your own, enter GUIDs separated by commas, without spaces; use dedicated offline characters, not companion bots.", "Оставьте 0, и сервер сам создаст и будет использовать своего персонажа аукциона. Чтобы использовать своих, укажите GUID через запятую без пробелов; нужны отдельные офлайн-персонажи, не боты-компаньоны.", "Bei 0 legt der Server selbst einen Auktionscharakter an und nutzt ihn. Eigene Charaktere: GUIDs durch Kommas, ohne Leerzeichen; separate Offline-Charaktere verwenden, keine Begleiter-Bots.", "Laissez 0 : le serveur crée et utilise son propre personnage d’enchères. Pour les vôtres, indiquez des GUID séparés par des virgules sans espaces ; personnages dédiés hors ligne, pas des bots compagnons.", "Deja 0 y el servidor crea y usa su propio personaje de subastas. Para usar los tuyos, indica GUID separados por comas sin espacios; personajes dedicados desconectados, no bots acompañantes.", "保持0时由服务器自动创建并使用拍卖角色。要使用自己的角色,请以逗号分隔填写GUID,不加空格;使用专用离线角色,勿用伙伴机器人。"], { advanced: true });
|
||||
add(ah + "EnableSeller", "bool", ["Post auctions", "Выставлять лоты", "Auktionen einstellen", "Publier des enchères", "Publicar subastas", "发布拍卖"], ["Let the auction characters sell items. The module switch is also required.", "Разрешает персонажам продавать предметы. Нужен включённый модуль.", "Erlaubt Verkäufe. Der Modulschalter muss ebenfalls aktiv sein.", "Autorise les ventes. Le module doit aussi être activé.", "Permite vender. También requiere el módulo activado.", "允许拍卖角色出售物品,还需启用模块。"]);
|
||||
add(ah + "CoA.ObtainableItemsOnly", "bool", ["Only obtainable items", "Только доступные в игре предметы", "Nur erhältliche Gegenstände", "Objets accessibles uniquement", "Solo objetos obtenibles", "仅可获取物品"], ["List items from world loot, vendors and professions. Other item filters still apply.", "Выставляет предметы из добычи, торговцев и профессий. Остальные фильтры продолжают действовать.", "Listet Gegenstände aus Beute, Händlern und Berufen. Weitere Filter gelten weiterhin.", "Publie les objets de butin, vendeurs et métiers. Les autres filtres s’appliquent.", "Publica objetos de botín, vendedores y profesiones. Los demás filtros siguen activos.", "发布来自掉落、商人和专业的物品,其他筛选仍生效。"]);
|
||||
add(ah + "ItemsPerCycle", "int", ["Listings per cycle", "Лотов за цикл", "Angebote pro Durchlauf", "Annonces par cycle", "Anuncios por ciclo", "每轮上架数量"], ["Maximum items posted during one auction update.", "Максимум предметов за одно обновление аукциона.", "Maximale Angebote pro Auktionsaktualisierung.", "Nombre maximal d’objets par mise à jour.", "Máximo de objetos por actualización.", "每轮拍卖更新最多上架的物品数量。"], { min: 0 });
|
||||
for (const [kind, titles] of [
|
||||
@@ -143,6 +142,7 @@ for (const [prefix, labels, bounds, titles] of [
|
||||
add(ah + prefix + ".Enabled", "bool", labels, desc);
|
||||
bounds.forEach((bound, i) => add(ah + prefix + "." + bound, "int", [`${titles[0]}: ${i ? "maximum" : "minimum"}`, `${titles[1]}: ${i ? "максимум" : "минимум"}`, `${titles[2]}: ${i ? "Maximum" : "Minimum"}`, `${titles[3]} : ${i ? "maximum" : "minimum"}`, `${titles[4]}: ${i ? "máximo" : "mínimo"}`, `${titles[5]}:${i ? "最大" : "最小"}`], desc, { min: 0 }));
|
||||
}
|
||||
export const retiredModuleKeys = new Set(["AuctionHouseBot.EnableSeller"]);
|
||||
export function moduleEnableKey(id: string) { return catalog.modules.find(m => m.id === id)?.enable_key; }
|
||||
export const auctionCategories: Record<string, string[]> = {
|
||||
Consumable: ["Consumables", "Расходники", "Verbrauchsgüter", "Consommables", "Consumibles", "消耗品"],
|
||||
|
||||
@@ -6,7 +6,7 @@ import { cn } from "@/lib/utils";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card } from "@/components/ui/card";
|
||||
import { useHuman, useI18n, useSchemaText, type Key } from "@/i18n";
|
||||
import { auctionWeightKey, canonicalModuleValue, moduleEnableKey, moduleField } from "@/lib/moduleSettings";
|
||||
import { auctionWeightKey, canonicalModuleValue, moduleEnableKey, moduleField, retiredModuleKeys } from "@/lib/moduleSettings";
|
||||
import { AuctionTypes } from "@/screens/AuctionTypes";
|
||||
import type { UnsavedChangesGuard } from "@/lib/unsavedGuard";
|
||||
|
||||
@@ -409,7 +409,7 @@ function ModuleSettings({ serverId, module, onSaved, onRegisterGuard }: { server
|
||||
else next[key] = value;
|
||||
return next;
|
||||
});
|
||||
const available = items?.filter(s => s.key !== moduleEnableKey(module.id)) ?? [];
|
||||
const available = items?.filter(s => s.key !== moduleEnableKey(module.id) && !retiredModuleKeys.has(s.key)) ?? [];
|
||||
const advancedCount = available.filter(s => !auctionWeightKey(s.key) && (!moduleField(s.key, locale, s.field) || moduleField(s.key, locale, s.field)?.advanced)).length;
|
||||
const visible = available.filter(s => {
|
||||
if (module.id === "ah-bot" && auctionWeightKey(s.key)) return false;
|
||||
|
||||
Reference in new issue
Block a user