一个功能完善的 TShock/Terraria 服务器经济插件,集成商店、货币、职业、任务、NPC掉落五大系统。
| 系统 |
功能说明 |
| 🛒 黑市商店 |
支持多列分页展示、盲盒抽奖、购买冷却、进度/职业限制、执行指令 |
| 💰 货币系统 |
多货币支持、余额查询、玩家间转账、手持物品兑换货币 |
| ⚔️ 职业系统 |
可配置多职业、转职奖励物品/指令、聊天前缀染色、一次转职锁定 |
| 📜 任务系统 |
击杀/收集双类型任务、进度追踪、职业限制、货币+物品+指令奖励 |
| 👾 NPC掉落 |
击杀指定NPC奖励货币、伤害参与判定、Boss高亮提示 |
| 🎯 进度检查 |
支持Boss进度、事件进度、NPC拯救状态的中文别名与逻辑运算 |
- 将编译后的
黑市.dll 放入服务器的 ServerPlugins 文件夹
- 启动服务器,插件会自动在
tshock/黑市/ 目录生成默认配置文件
- 按需修改配置后执行
/reload 或重启服务器
tshock/
└── 黑市/
├── 黑市.json # 商店与兑换配置
├── 职业.json # 职业定义
├── 任务.json # 任务模板与列表
├── NPC掉落.json # NPC击杀奖励
└── 黑市.sqlite # SQLite 数据库
{
"购买浮动文本": true,
"购买聊天栏文本": false,
"兑换浮动文本": true,
"兑换聊天栏文本": false,
"每页显示行数": 10,
"显示列数": 1,
"兑换规则": [
{
"来源物品ID": 74,
"来源物品名称": "铂金币",
"目标货币": "元宝",
"兑换比例(1个来源物品换多少目标货币)": 1
}
],
"商品模板": {
"货币": "元宝",
"价格": 1,
"数量": 1,
"前缀": 0,
"进度": [],
"职业": [],
"指令": [],
"盲盒": [],
"冷却": 0
},
"商品列表": [
{
"名称": "生命水晶",
"价格": 10,
"物品": 29,
"进度": ["肉山"]
},
{
"名称": "墓碑*7",
"价格": 10,
"物品": 1175,
"数量": 7
}
]
}
{
"盲盒": [
{ "物品": 29, "数量": 1, "权重": 50 },
{ "物品": 74, "数量": 10, "权重": 30 },
{ "物品": 58, "数量": 5, "权重": 20 }
]
}
⚠️ 带指令的商品每次限购 1 个。
{
"默认职业名称": "入门",
"职业列表": [
{
"名称": "入门",
"描述": "初始职业,可转职为其他职业。",
"颜色": "AAAAAA",
"可转职": true,
"转职奖励物品": [],
"转职执行指令": []
},
{
"名称": "战士",
"描述": "擅长近战攻击。",
"颜色": "FF5555",
"可转职": false,
"转职奖励物品": [],
"转职执行指令": []
},
{
"名称": "法师",
"描述": "擅长魔法攻击。",
"颜色": "AA66FF",
"可转职": false,
"转职奖励物品": [
{ "物品ID": 3069, "数量": 1, "前缀": 0 }
],
"转职执行指令": []
}
]
}
| 字段 |
说明 |
颜色 |
6 位十六进制颜色码,影响聊天前缀颜色 |
可转职 |
true 表示可从该职业转出;false 表示锁定 |
转职奖励物品 |
转职时自动给予的物品列表 |
转职执行指令 |
转职时以服务器身份执行的指令 |
💡 玩家聊天时会自动显示 [职业名] 玩家名: 内容 的格式,并应用职业颜色。
{
"任务完成浮动文本": true,
"任务完成聊天栏文本": true,
"最大接取数量": 5,
"任务模板": {
"任务类型(0=击杀,1=获取物品)": 0,
"目标数量": 1,
"进度条件": "",
"允许职业": [],
"货币奖励": [],
"物品奖励": [],
"执行指令": []
},
"任务列表": [
{
"序号": 1,
"名称": "击杀史莱姆",
"描述": "击杀任意史莱姆累计10只",
"目标ID": 1,
"目标数量": 10,
"货币奖励": [
{ "货币名": "元宝", "数量": 100 }
]
},
{
"序号": 2,
"名称": "获取木材",
"描述": "收集50个木材",
"目标ID": 9,
"任务类型(0=击杀,1=获取物品)": 1,
"目标数量": 50,
"物品奖励": [
{ "物品ID": 29, "数量": 1, "前缀": 0 }
]
}
]
}
| 字段 |
类型 |
说明 |
任务类型 |
enum |
0=击杀, 1=获取物品 |
目标ID |
int |
击杀填 NPC ID,收集填物品 ID |
目标数量 |
int |
完成所需数量 |
进度条件 |
string |
接取前置进度要求(如 "肉山") |
允许职业 |
string[] |
可接取该任务的职业白名单 |
货币奖励 |
object[] |
{ "货币名": "", "数量": 0 } |
物品奖励 |
object[] |
{ "物品ID": 0, "数量": 1, "前缀": 0 } |
执行指令 |
string[] |
提交时执行,支持 {0} / {} 占位符 |
📝 获取物品任务会实时检测背包数量;击杀任务在 NPC 死亡时结算(需造成伤害)。
🔢 序号在保存时会自动按列表顺序重新编排为连续整数,服主只需排列顺序即可。
{
"击杀浮动文本": true,
"击杀聊天栏文本": true,
"掉落规则": [
{
"NPCID": 4,
"NPC名称": "克苏鲁之眼",
"货币名称": "功勋",
"掉落数量": 10
},
{
"NPCID": 1,
"NPC名称": "史莱姆",
"货币名称": "声望",
"掉落数量": 3
}
]
}
| 字段 |
说明 |
NPCID |
NPC 的 netID |
NPC名称 |
显示名称,支持自定义 |
货币名称 |
奖励的货币类型 |
掉落数量 |
每个参与击杀的玩家获得的数量 |
💡 只有对 NPC 造成过伤害的玩家才会获得奖励。掉落数 ≥ 5 或是 Boss 时会在聊天栏提示。
| 指令 |
参数 |
说明 |
/黑市 |
[页码] |
查看商品列表 |
/购买 |
<序号> [数量] |
购买指定商品 |
/兑换 |
[数量] |
将手持物品兑换为货币 |
/余额 |
- |
查看所有货币余额 |
/转账 |
<玩家名> <货币名> <数量> |
向其他玩家转账 |
/转职 |
[职业名] |
查看职业列表或转职 |
/任务 |
- |
查看任务列表与状态 |
/接取 |
<序号> |
接取指定任务 |
/提交 |
<序号> |
提交已完成任务领取奖励 |
/放弃 |
<序号> |
放弃已接取的任务 |
| 指令 |
参数 |
说明 |
/添加货币 |
<玩家名> <货币名> <数量> |
给玩家增加货币 |
/扣除货币 |
<玩家名> <货币名> <数量> |
扣除玩家货币 |
/设置货币 |
<玩家名> <货币名> <数量> |
设置玩家货币为指定值 |
/查询余额 |
<玩家名> |
查询指定玩家所有货币 |
/重置职业 |
<玩家名> |
将玩家职业重置为默认 |
/任务重置 |
<玩家名> <序号> |
重置玩家指定任务进度 |
黑市.使用 → /黑市
黑市.购买 → /购买
黑市.兑换 → /兑换
黑市.余额 → /余额
黑市.转账 → /转账
黑市.转职 → /转职
黑市.任务 → /任务
黑市.接取任务 → /接取
黑市.提交任务 → /提交
黑市.放弃任务 → /放弃
黑市.管理.添加货币 → /添加货币
黑市.管理.扣除货币 → /扣除货币
黑市.管理.设置货币 → /设置货币
黑市.管理.查询余额 → /查询余额
黑市.管理.重置职业 → /重置职业
黑市.管理.重置任务 → /任务重置
进度条件用于限制商品购买、任务接取等场景,支持以下中文别名:
| 别名 |
对应游戏进度 |
克眼 / 克苏鲁之眼 |
downedBoss1 |
克脑 / 世吞 / 世界吞噬者 |
downedBoss2 |
骷髅王 |
downedBoss3 |
肉山 / 肉后 / 困难模式 |
hardMode |
蜂王 / 蜂后 |
downedQueenBee |
史莱姆王 / 史王 |
downedSlimeKing |
一王后 / 任意机械Boss |
downedMechBossAny |
毁灭者 |
downedMechBoss1 |
双子魔眼 |
downedMechBoss2 |
机械骷髅王 |
downedMechBoss3 |
世纪之花 / 花后 / 世花 |
downedPlantBoss |
石巨人 / 石后 |
downedGolemBoss |
邪教徒 / 拜月教邪教徒 |
downedAncientCultist |
月亮领主 / 月总 |
downedMoonlord |
哥布林入侵 |
downedGoblins |
雪人军团 |
downedFrost |
海盗入侵 |
downedPirates |
火星入侵 |
downedMartians |
专家模式 |
expertMode |
税收官 |
savedTaxCollector |
哥布林工匠 |
savedGoblin |
巫师 |
savedWizard |
机械师 |
savedMech |
渔夫 |
savedAngler |
发型师 |
savedStylist |
酒馆老板 |
savedBartender |
& — 逻辑与(肉山&花后)
| — 逻辑或(克眼|克脑)
! — 逻辑非(!肉山)
也支持直接使用英文字段名,如 downedMoonlord。
SQLite 数据库位于 tshock/黑市/黑市.sqlite,包含以下表:
| 字段 |
类型 |
说明 |
玩家名 |
TEXT |
主键1 |
货币名 |
TEXT |
主键2 |
数量 |
INTEGER |
默认 0 |
| 字段 |
类型 |
说明 |
玩家名 |
TEXT |
主键1 |
商品序号 |
INTEGER |
主键2 |
结束时间 |
TEXT |
yyyy-MM-dd HH:mm:ss |
| 字段 |
类型 |
说明 |
玩家名 |
TEXT |
主键 |
当前职业 |
TEXT |
默认 "入门" |
| 字段 |
类型 |
说明 |
玩家名 |
TEXT |
主键1 |
任务序号 |
INTEGER |
主键2 |
状态 |
INTEGER |
0=未接取, 1=进行中, 2=已完成, 3=已提交 |
进度 |
INTEGER |
默认 0 |
黑市/
├── 黑市.cs # 插件入口,命令路由,聊天染色
├── 配置类.cs # 黑市配置、商品、兑换规则定义
├── 货币数据.cs # SQLite 数据库访问层(线程安全)
├── 职业系统.cs # 职业切换、奖励发放、权限检查
├── 职业配置.cs # 职业 JSON 配置加载与验证
├── 任务系统.cs # 任务进度追踪、提交、奖励发放
├── 任务配置.cs # 任务 JSON 配置加载、验证、自动序号编排
├── 掉落处理器.cs # NPC 伤害记录、击杀结算、任务联动
├── NPC掉落配置.cs # NPC 掉落 JSON 配置加载与验证
└── 进度映射器.cs # Terraria 进度字段的中文别名映射与表达式解析
- 线程安全:数据库操作使用
lock 保证并发安全;配置读取使用 ReaderWriterLockSlim。
- 配置热重载:支持
/reload 实时重载所有子配置,错误会汇总报告。
- 指令执行:商品/任务/职业中的指令支持
{0} 和 {} 占位符替换玩家名;购买指令会临时提升为超级管理员权限执行,绕过权限检查。
- 伤害参与判定:NPC 掉落奖励仅发放给实际造成过伤害的玩家,通过
NpcStrike 钩子记录。
- 自动序号:任务列表保存时自动重排为连续序号,降低服主维护成本。
MIT License © Mni Shark