服务端(Go): - GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面 - GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新 - 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新) - 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍 - 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0) - 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算 启动器(Python/JS): - 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭 - GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐) - 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"strings"
|
|
"time"
|
|
|
|
"longheng.io/server/internal/platform/config"
|
|
"longheng.io/server/pkg/contracts"
|
|
"longheng.io/server/pkg/protocol"
|
|
)
|
|
|
|
const logicRespCacheTable = "logic_idempotency_responses"
|
|
|
|
type logicResponseCache interface {
|
|
Store(context.Context, string, contracts.LogicPlayerResponse) error
|
|
Get(context.Context, string) (contracts.LogicPlayerResponse, bool, error)
|
|
Delete(context.Context, string) error
|
|
Snapshot() map[string]any
|
|
Close(context.Context) error
|
|
}
|
|
|
|
func newLogicRespCache(cfg config.IdempotencySection) logicResponseCache {
|
|
ttl := time.Duration(cfg.TTLSeconds) * time.Second
|
|
switch strings.ToLower(strings.TrimSpace(cfg.Kind)) {
|
|
case "redis":
|
|
return newRedisRespCache(cfg, ttl)
|
|
case "mysql":
|
|
return newMySQLRespCache(cfg, ttl)
|
|
case "mysql_redis":
|
|
return &hybridRespCache{
|
|
redis: newRedisRespCache(cfg, ttl),
|
|
mysql: newMySQLRespCache(cfg, ttl),
|
|
}
|
|
default:
|
|
return newMemRespCache(ttl)
|
|
}
|
|
}
|
|
|
|
func clonePlayerResp(response contracts.LogicPlayerResponse) contracts.LogicPlayerResponse {
|
|
response.Body = append([]byte(nil), response.Body...)
|
|
response.Metadata = protocol.CloneFrameMetadata(response.Metadata)
|
|
return response
|
|
}
|
|
|
|
func respCachePrefix(prefix string) string {
|
|
prefix = strings.Trim(strings.TrimSpace(prefix), ":")
|
|
if prefix == "" {
|
|
prefix = "idempotency"
|
|
}
|
|
return prefix + ":responses"
|
|
}
|
|
|
|
func digestRespCacheKey(value string) string {
|
|
sum := sha256.Sum256([]byte(value))
|
|
return hex.EncodeToString(sum[:])
|
|
}
|