为什么用星月邮箱
邮箱插件看起来简单,难的是那些「出事才会发现」的地方:跨服同时领取会不会领两次?背包满了东西去哪?玩家寄出的信对方一直不领怎么办? 全服补偿发了以后,下个月才进服的新玩家拿不拿得到?星月邮箱把这些情况都处理好了。
每封信只会被领取一次
领取附件时,插件先在数据库里用一条带条件的更新把这封信标记为「已领取」,只有标记成功的那一边才会发放附件。
- 玩家在两个子服同时打开邮箱、同时点领取:只有一边成功,另一边提示「已经被领取过了(可能在其他子服)」。
- 网络卡顿时狂点领取按钮:同一个玩家同时只能进行一次领取,不会重复发放。
- 数据库确认领取之后、物品 发出之前玩家刚好下线:领取会被撤销,邮件回到未领取状态,下次上线再领。
数据库里还会记下这封信是在哪个子服领取的,/sm log 可以查到。详见 跨服设置。
东西不会丢
| 情况 | 星月邮箱的处理 |
|---|---|
| 领取单封邮件时背包放不下 | 不领取,提示「背包空间不足,需要 N 个空格」,附件留在邮箱里 |
| 一键领取时背包只放得下一部分 | 放得下的邮件照常领取,放不下的整封留在邮箱里,提示还有几封没领 |
| 写信时关闭界面 / 点取消 | 放进去的附件退回背包 |
| 寄送失败(找不到收件人、金币不够、超过每日次数…) | 附件退回背包,邮费与附带的金币退回 |
| 退回时背包刚好满了 | 默认另寄一封「背包已满 · 物品退回」的信给自己(mail.overflow: mail),也可以改成掉在脚下 |
| 玩家寄出的信过期了对方还没领 | 附件(物品与附带的金币)自动退回给寄件人(mail.return-expired-to-sender) |
| 误删、误领了 | 删除 / 领取过的邮件默认保留 14 天,管理员可以用 /sm restore 恢复 |
| 附件数据读不出来(例如更新版本的子服寄出的物品) | 不发放、不标记领取,提示联系管理员,邮件留着等待在正确版本的子服领取 |
附件物品以 Paper 的完整物品数据保存,附魔、自定义名称、说明,以及 CraftEngine、ItemsAdder、MMOItems 等插件 写在物品上的数据都会原样保留。
全服邮件,新玩家也收得到
一封全服邮件在数据库里只存一份,玩家在任何一个子服上线(或打开邮箱)时才复制一份进他的邮箱:
- 发送时在线的玩家立刻收到;其他子服的在线玩家在几秒内收到。
- 离线的玩家下次上线收到。
- 选「全服(含新玩家)」时,之后第一次进服的新玩家也会收到,适合新人礼包、长期活动; 选「全服(不含新玩家)」只发给发送前就进过服的玩家,适合停机补偿。
- 每个玩家只会收到一封,几个子服同时发放也一样。
- 发错了可以
/sm cancel <编号>停止发放,已经收到的玩家不受影响。
玩家写信也有规矩
玩家互寄是很容易被滥用的功能,星月邮箱内置了服主需要的限制,全部可以在 config.yml 调整:
- 邮费(固定金币 / 点券,加上每个附件的额外金币)。
- 两次寄信之间的冷却、每人每天最多寄几封。
- 对方邮箱里未领取的玩家来信太多时拒收,避免刷信塞爆别人的邮箱。
- 物品黑名单:按材质,或按名称 / 说明里的文字(例如「绑定」「不可交易」)。
- 玩家 输入的标题与正文会去掉颜色代码、MiniMessage 标签也不会生效,不能伪装成系统邮件。
- 写信时在聊天栏输入的内容不会被其他玩家看到,聊天插件转发的消息也会被拦下。
给服主和开发者的便利
- 图形化:玩家写信、管理员写信都在箱子界面里完成,不用记指令。
- 模板:一封信在游戏里做好、存成模板,之后接到投票插件、活动插件、控制台指令上一句话发出。
- 可改的界面:三个菜单的每一个按钮都写在 YAML 里,支持自定义模型、
item-model、提示框样式、头颅材质;装了云界面 CloudUI 还有全屏的邮箱画面。 - 记录:收到、寄出、领取、删除、过期、恢复都有记录,
/sm log <玩家>一查就知道东西去哪了。 - API:其他插件几行代码就能把奖励寄进玩家邮箱,同系列的 StarCrate 星月造物就是这样把抽奖奖励寄给玩家的。见 开发者 API。