服务端(Go): - GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面 - GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新 - 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新) - 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍 - 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0) - 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算 启动器(Python/JS): - 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭 - GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐) - 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
package cerashop
|
|
|
|
import (
|
|
dnfrepo "longheng.io/server/internal/modules/dnf/repository"
|
|
)
|
|
|
|
// WalletCurrency 按名字标识账号钱包里的一个字段,供 GM / 管理接口读写。
|
|
//
|
|
// 存在的理由:钱包的三个字段分别落在账号 Metadata 的三个键上,键名是 cerashop 的
|
|
// 内部细节。GM 接口需要按名字操作它们(尤其是造测试数据:把点券清零、只留代币券),
|
|
// 所以在这里开一个受控的出口,而不是让调用方去猜 "account_token_cera" 这种字符串。
|
|
type WalletCurrency string
|
|
|
|
const (
|
|
// CurrencyCera 是点券。
|
|
CurrencyCera WalletCurrency = "cera"
|
|
// CurrencyTokenCera 是代币券。
|
|
CurrencyTokenCera WalletCurrency = "token_cera"
|
|
// CurrencyHappyTokenCera 是欢乐代币券。
|
|
CurrencyHappyTokenCera WalletCurrency = "happy_token_cera"
|
|
)
|
|
|
|
// MetadataKey 返回该字段在账号 Metadata 里的键名。
|
|
func (c WalletCurrency) MetadataKey() (string, bool) {
|
|
switch c {
|
|
case CurrencyCera:
|
|
return accountCeraMetadataKey, true
|
|
case CurrencyTokenCera:
|
|
return accountTokenCeraMetadataKey, true
|
|
case CurrencyHappyTokenCera:
|
|
return accountHappyTokenCeraMetadataKey, true
|
|
default:
|
|
return "", false
|
|
}
|
|
}
|
|
|
|
// Known 表示这是一个合法的钱包字段名。
|
|
func (c WalletCurrency) Known() bool {
|
|
_, ok := c.MetadataKey()
|
|
return ok
|
|
}
|
|
|
|
// BalanceOf 读该字段的当前值(未知字段返回 0,false)。
|
|
func (c WalletCurrency) BalanceOf(account dnfrepo.AccountRecord) (int64, bool) {
|
|
switch c {
|
|
case CurrencyCera:
|
|
return Balance(account), true
|
|
case CurrencyTokenCera:
|
|
return TokenCeraBalance(account), true
|
|
case CurrencyHappyTokenCera:
|
|
return HappyTokenCeraBalance(account), true
|
|
default:
|
|
return 0, false
|
|
}
|
|
}
|
|
|
|
// SetOn 把值写进账号记录(调用方负责保存账号记录)。未知字段返回 false,不做任何改动。
|
|
//
|
|
// 值会被夹到 [0, MaxWalletBalance]:客户端按有符号 32 位读这三个字段,超过上限会
|
|
// 显示成负数,所以这里直接挡住,而不是写进去等客户端出问题。
|
|
func (c WalletCurrency) SetOn(account *dnfrepo.AccountRecord, value int64) bool {
|
|
if account == nil || !c.Known() {
|
|
return false
|
|
}
|
|
if value < 0 {
|
|
value = 0
|
|
}
|
|
if value > MaxWalletBalance {
|
|
value = MaxWalletBalance
|
|
}
|
|
switch c {
|
|
case CurrencyCera:
|
|
SetBalance(account, value)
|
|
case CurrencyTokenCera:
|
|
SetTokenCeraBalance(account, value)
|
|
case CurrencyHappyTokenCera:
|
|
SetHappyTokenCeraBalance(account, value)
|
|
}
|
|
return true
|
|
}
|