赌博系统
赌博系统为 EliteMobs 加入赌场。玩家可以在四种小游戏中下注精英币,余额不足时借债,并可能遭到讨债人追捕。管理员可以配置系统的大部分设置,包括 21 点、抛硬币和猜大小的赔付倍率。不过,老虎机赔付和欠债上限固定在代码中。
设置
玩家通过专门配置的 NPC 进入游戏,需要默认授予的 elitemobs.gambling.npc 权限。四种游戏各有交互类型;庄家收益展示由 NPC 文件名决定。
要设置一个赌博 NPC,请创建一个 NPC 配置文件,并把 interactionType 设为以下值之一:
| 交互类型 | 说明 |
|---|---|
GAMBLING_BLACKJACK | 打开 21 点的下注菜单 |
GAMBLING_COINFLIP | 打开抛硬币的下注菜单 |
GAMBLING_SLOTS | 打开老虎机的下注菜单 |
GAMBLING_HIGHERLOWER | 打开猜大小的下注菜单 |
赌场老板 NPC 不使用特殊的交互类型。要设置它,请创建一个文件名为 gambling_den_owner.yml 的 NPC。庄家收益展示会根据该文件名自动出现在该 NPC 的头顶。
EliteMobs 为这五种角色提供了预制 NPC 配置,通常直接放置即可:
| 文件 | 角色 |
|---|---|
blackjack_dealer.yml | 21 点(庄家 Vincent) |
coin_flipper.yml | 抛硬币(Lucky Pete) |
slot_machine_operator.yml | 老虎机(Spinner Sam) |
card_shark.yml | 猜大小(纸牌高手 Ace Morgan) |
gambling_den_owner.yml | 庄家收益展示 |
游戏
21 点(Blackjack)
目标是让点数尽可能接近 21 点但不超过。本实现采用以下规则。
规则
- 玩家和庄家各发两张牌。
- 庄家的第二张牌在玩家停牌之前一直是暗牌。
- A 算 11 点或 1 点(在可能的情况下会自动调整以避免爆牌)。
- 花牌(J、Q、K)算 10 点。
- 庄家在 17 点停牌。
- 每次抽牌都是独立的有放回抽样,不存在可供算牌的有限牌堆。要牌后达到 21 点会自动停牌。
- 菜单为每手牌显示五个牌位。额外抽到的牌即使放不下,也会计入总点数。
- 玩家起手拿到天生 21 点时立即获得赔付,即使庄家也拿到天生 21 点也是如此。
操作
| 操作 | 说明 |
|---|---|
| 要牌(Hit) | 再抽一张牌。 |
| 停牌(Stand) | 保留当前手牌;随后由庄家行动。 |
| 加倍(Double Down) | 再支付一份等额赌注,将总下注翻倍,只抽一张牌,未爆牌则停牌。仅在持有 2 张牌的首次操作时可用,且剩余余额加信用额度必须能支付追加赌注。 |
赔付
| 结果 | 默认倍率 |
|---|---|
| 普通获胜(玩家点数高于庄家,或庄家爆牌) | 2.0x |
| 21 点(前两张牌即为 21 点) | 2.5x |
| 平局(Push) | 1.0x(返还下注) |
| 落败(玩家爆牌或庄家点数更高) | 0x(下注亏掉) |
关闭菜单
如果玩家在庄家回合期间关闭菜单,庄家的手牌会自动打完并结算结果。如果玩家在停牌之前关闭菜单,下注将被没收。
抛硬币(Coin Flip)
一个简单的 50/50 游戏。选择正面或反面,硬币决定你的命运。
玩法
- 游戏开始时会出现一个"正面"按钮和一个"反面"按钮。
- 点击其中一个做出选择。
- 播放抛硬币动画。
- 显示结果。
赔付
| 结果 | 默认倍率 |
|---|---|
| 猜对 | 1.9x |
| 立起(硬币立在边上) | 5.0x |
| 猜错 | 0x(下注亏掉) |
立起结果
硬币有 1% 的几率立在边上,而不是正面或反面。发生这种情况时,无论玩家选了什么都必定获胜,并且会获得下注额的 5 倍赔付。这一稀有事件会伴随特殊的聊天消息和视觉展示。
按这些默认值,正反面各有 49.5% 的概率。期望返还为赌注的 0.495 × 1.9 + 0.01 × 5 = 0.9905 倍,综合庄家优势为 0.95%。普通 1.9 倍抛硬币的 5% 庄家优势只适用于禁用立起结果的情况。倍率包含原始赌注。
关闭菜单
如果玩家在做出选择之前关闭菜单,下注将被没收。
老虎机(Slot Machine)
转动三个转轮,凑齐符号即可获胜。越稀有的符号赔得越多。
玩法
- 游戏开始时会出现一个 3x3 的转轮网格和一个"转动"按钮。
- 点击"转动"启动转轮。
- 每个转轮会依次伴随动画停下。
- 中间一行(赔付线)决定结果。
符号与赔付
各转轮按下表权重独立抽取符号。三个相同符号的赔付倍率是 100 / weight。中间一行恰好有两个相同符号即可获得该符号三个相同赔付的 25%,包括第一和第三格相同的情况。这是包含赌注的总返还额:樱桃或柠檬配对返还的金额低于原始赌注,即使菜单显示获胜也是如此。
| 符号 | 权重 | 几率 | 三连赔付 | 二连赔付 |
|---|---|---|---|---|
| Cherry | 35 | 35% | 2.86x | 0.71x |
| Lemon | 28 | 28% | 3.57x | 0.89x |
| Orange | 20 | 20% | 5.0x | 1.25x |
| Golden Bell | 10 | 10% | 10.0x | 2.5x |
| Silver Bar | 5 | 5% | 20.0x | 5.0x |
| Lucky 7 | 2 | 2% | 50.0x | 12.5x |
三个 Lucky 7 就是头奖(Jackpot),会附带特殊的视觉和音效。
关闭菜单
如果玩家在转动之前关闭菜单,下注将被没收。
结果显示后,Spin Again 会再收取一份等额赌注并返回准备界面。玩家随后需要点击 Spin;在两步之间关闭菜单会损失刚收取的赌注。
猜大小(Higher or Lower)
一个基于连胜的纸牌游戏。猜下一张牌比当前这张大还是小,逐步累积倍率。你可以随时兑现,也可以全押到底。
玩法
- 抽出并展示一张牌(数值范围为 2 到 14,其中 A = 14)。
- 猜下一张牌会比当前这张更大还是更小。
- 如果猜对,你的倍率会提升,被翻开的牌成为新的当前牌。
- 在至少猜对一次之后,你可以随时兑现(Cash Out)。
- 如果猜错,你会失去全部下注。
- 如果下一张牌与当前牌相等,同样算作落败。
连胜倍率
每猜对一次,你的奖金就会乘上所配置的倍率(默认 1.3x)。该倍率会叠乘:
| 连胜 | 倍率(默认) | 100 精英币下注的赔付 |
|---|---|---|
| 1 | 1.3x | 130 |
| 2 | 1.69x | 169 |
| 3 | 2.197x | 219.7 |
| 4 | 2.856x | 285.6 |
| 5 | 3.713x | 371.3 |
| ... | ... | ... |
| 12 | ~23.3x | ~2,330 |
最大连胜与自动兑现
最大连胜为 12。当玩家猜对 12 次时,会被自动兑现并领取奖金。这可以防止倍率失控。
关闭菜单
如果玩家在拥有连胜的情况下关闭菜单,会被自动兑现并获得当前奖金。如果在做出任何猜测之前就关闭,下注将被没收。
下注
在任何游戏开始之前,玩家都会看到一个下注菜单,用来选择自己的赌注。
下注限额
| 设置 | 默认值 |
|---|---|
| 最低下注 | 10 |
没有可配置的最高下注。菜单使用整数精英币赌注;全押(All In) 将余额与可用信用额度相加后舍去小数部分。
minBet 决定重置金额和减少按钮的下限。初始金额为 max(minBet, 10)。它不是通用交易限制:全押可以设置低于 minBet 的正数金额,只要付得起,当前的开始按钮就会接受。不要依赖此设置在所有操作中强制最低下注额。
下注菜单控件
下注菜单提供若干控件:
- 增减按钮 —— 提供三种幅度。余额至少为 100 且无欠债时,使用余额的 5%、10%、25%,舍去小数且至少为 1。否则使用固定的 10、50、100。
- 全押(All In) —— 把下注设为玩家付得起的最大值(包括可用信用额度)。
- 重置(Reset) —— 把下注重置为最低值。
- 开始(Play) —— 以当前下注开始游戏。只有在玩家付得起该下注时才可点击。
- 取消(Cancel) —— 不下注并关闭菜单。
菜单显示当前余额。欠债为正时才显示欠债和可用信用额度两行,但没有欠债的玩家也能使用信用额度。
欠债系统
玩家可以通过欠债押上超过自身余额的金额。赌场会提供一个固定上限内的信用额度。
欠债如何运作
- 当玩家下注超过其余额时,超出的部分会被记为赌债。
- 玩家能累积的最大欠债为 500 精英币。这是硬编码的,无法配置。
- 玩家不能下注到会让欠债超过上限的程度。
- 玩家获胜时,奖金会先用于偿还欠债,剩余部分才计入余额。通过 EliteMobs 获得的其他货币收入也先偿债,启用 Vault 集成时同样如此。购买附魔的退款不经过债务回收。
可用信用额度
欠债为有限数值时,可用信用额度为 max(0, maxDebt - currentDebt)。玩家有欠债时,下注菜单会显示该额度。
欠债警告
玩家欠下债务时会收到一条警告消息。只要还背着未清的欠债,讨债人就可能会来找他。
讨债人 Boss
讨债人是一个自定义 Boss,会生成出来追杀那些背着赌债的玩家。
生成条件
- 玩家必须有未清的赌债。
- 有一个周期性检查每 60 分钟(可配置)对所有在线玩家运行一次。
- 初始化后,首次检查会等待一个完整间隔。距离对该玩家的上次生成尝试也必须至少经过一个间隔;插件关闭时会重置此计时。
- 每次检查都有 50% 的几率(可配置)为符合条件的玩家生成讨债人。
- 每名玩家同一时间只能有一个处于活动状态的讨债人。
- 讨债人使用自定义 Boss 文件
debt_collector.yml。
周期性资格检查本身不排除任何世界或游戏模式,但正常的自定义 Boss 生成仍可能失败。还清欠债可阻止未来的周期性生成,却不会自动移除已经存在的讨债人。
等级缩放
附带的 debt_collector.yml 使用动态等级和 scaledCombat: true,战斗计算会适应各个玩家。生命值和伤害倍率由该 Boss 文件决定。生成流程不会直接把被追踪玩家的战斗等级赋给讨债人;修改 Boss 配置也会改变其缩放行为。
行为
- 讨债人会尝试十个水平距离为 5 到 10 格的地表位置。若都不合适,则退回到玩家高度,并在每个水平轴上偏移最多 5 格的位置。
- 它会立即锁定它被生成来针对的那名玩家。
- 它默认有 600 秒(10 分钟)的超时。如果在此时间内未被击杀,它就会消失,并警告玩家它会再来。
结果
| 结果 | 效果 |
|---|---|
| 讨债人被击杀 | 已记录的追踪目标若在线就会收到回归消息,即使是其他玩家击杀也一样。欠债不会减少。 |
| 玩家死于讨债人的直接攻击 | 死者欠债减少 50 精英币(可配置),还清时会收到通知。讨债人于 5 秒后移除。死亡处理要求最后造成伤害的实体本身就是 debt_collector.yml Boss,不会追溯弹射物发射者或之后的环境死亡。 |
| 管理器超时 | 移除讨债人并发送警告。以后某次周期性检查中,若玩家仍符合条件且随机判定成功,可能再次生成。 |
赌场老板
赌场老板在头顶以悬浮文字显示庄家收益(House Earnings)。数值为记录的赌注减去赔付,包含借债支付的赌注。它不是独立银行余额,也不是已经从欠债者处收回的现金总额。
- 正收益以绿色显示(例如
+1234.56)。 - 负收益(玩家赢的比输的多)以红色显示(例如
-567.89)。 - 该展示每秒更新一次。
- 庄家收益会被持久化保存到
house_earnings.yml,可在服务器重启后保留。
配置
所有赌博设置都存放在 GamblingSettings.yml 中。下面是影响玩法的关键设置。
通用设置
| 键 | 说明 | 默认值 |
|---|---|---|
gamblingEnabled | 启用或关闭整个赌博系统。关闭时,赌博 NPC 将不起作用,讨债人也不会生成。 | true |
minBet | 重置金额及减少按钮的下限;请参阅上文全押的限制。 | 10 |
注意:最大欠债(500.0)是硬编码的,无法配置。
加载器要求 minBet、讨债人检查间隔和超时为正整数;概率必须是 0 到 1 之间的有限值。赔付倍率和死亡减债额必须有限且非负。无效值会产生警告,并在已加载的配置中被替换为默认值。
赔付倍率
| 键 | 说明 | 默认值 |
|---|---|---|
payouts.blackjack.normal | 21 点普通获胜的赔付倍率。 | 2.0 |
payouts.blackjack.blackjack | 拿到天生 21 点(前两张牌即 21 点)的赔付倍率。 | 2.5 |
payouts.coinFlip.normal | 猜对正反面的赔付倍率。1.9 倍赔付只在禁用立起结果时产生 5% 庄家优势。 | 1.9 |
payouts.coinFlip.edgeChance | 硬币立在边上(奖励性获胜)的几率(0.0 到 1.0)。设为 0.0 即关闭。 | 0.01 |
payouts.coinFlip.edgePayout | 硬币立在边上时的赔付倍率。 | 5.0 |
payouts.higherLower.multiplierV2 | 猜大小中每猜对一次所应用的倍率。会叠乘。 | 1.3 |
抛硬币设置共用同一个 YAML 配置节:
payouts:
coinFlip:
normal: 1.9
edgeChance: 0.01
edgePayout: 5.0
如果你现有的文件在 payouts.coinFlip 处直接存储了一个数字,请把该值移到 normal 下,并添加两项硬币立起设置。EliteMobs 会禁用赌博并报告需要的修正,但不会改写文件。修正后请重新加载。
老虎机赔付
老虎机赔付不可配置。它们会用公式 100 / weight 从符号权重自动计算得出:
| 符号 | 权重 | 三连赔付 | 二连赔付 |
|---|---|---|---|
| Cherry | 35 | 2.86x | 0.71x |
| Lemon | 28 | 3.57x | 0.89x |
| Orange | 20 | 5.0x | 1.25x |
| Bell | 10 | 10.0x | 2.50x |
| Bar | 5 | 20.0x | 5.00x |
| Lucky 7 | 2 | 50.0x | 12.50x |
GamblingSettings.yml 中完全不存在 payouts.slots.* 这类键——该文件里唯一与老虎机相关的条目是 slots.* 界面文本(按钮名称、标签、结果标题)。赔付始终由硬编码的符号权重推导而来。
讨债人设置
| 键 | 说明 | 默认值 |
|---|---|---|
debtCollector.spawnChance | 每次检查时讨债人生成的几率(0.0 到 1.0)。 | 0.5 |
debtCollector.checkIntervalMinutes | 每隔多久(分钟)检查一次是否应为欠债玩家生成讨债人。 | 60 |
debtCollector.timeoutSeconds | 讨债人在未被击杀的情况下多久(秒)后消失。 | 600 |
debtCollector.debtReductionOnPlayerDeath | 讨债人击杀玩家时减少的欠债金额。 | 50.0 |
经济安全性
赌注在打开游戏前扣除。抛硬币和老虎机在结果动画前结算;猜大小在每次动画前记录猜测,兑现时付款。21 点在庄家抽牌结束后结算,若在庄家回合关闭菜单,则立即完成该手牌。赔付四舍五入到两位小数,并包含原始赌注。共用结果处理器防止同一笔待结算赔付重复发放。
玩家断线导致背包关闭时,也适用上述关闭菜单规则。这些保护并不能让未完成的游戏在服务器崩溃或插件关闭后恢复;请避免在游戏进行中重启。