Compare commits

..

No commits in common. "rpc_server" and "master" have entirely different histories.

2164 changed files with 1006091 additions and 41424 deletions

13
.gitignore vendored
View File

@ -10,16 +10,3 @@ src/server/log/
src/server/*.exe
src/server/gamedata/config/*.json
src/server/unit_test.go
src/server/teLog/*
src/server/teLog/log.2024-11-28
src/server/logs/ga_log/*.log
src/server/goroutine.prof
src/server/heap_after.pb.gz
src/server/test/logs/*
src/server/test/teLog/*
src/server/*.exe*
src/server/msg/Gameapi.pb.go
src/server/gen-go
src/server/GeoLite2-Country
src/server/test/GeoLite2-Country
src/server/msg/Gameapi_grpc.pb.go

179
src/server/GoUtil/GoUtil.go Normal file
View File

@ -0,0 +1,179 @@
package GoUtil
import (
"bytes"
"encoding/gob"
"math/rand"
"reflect"
"strconv"
"time"
)
// 实例化一个通过字符串映射函数切片的map
var eventByName = make(map[string][]*EventObj)
type EventObj struct {
Callback func([]interface{})
Obj interface{}
}
func (o *EventObj) isEqual(tar *EventObj) bool {
if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj {
return true
}
return false
}
// 注册事件,提供事件名和回调函数
func RegisterEvent(name string, callback func([]interface{}), Obj interface{}) {
eo := new(EventObj)
eo.Callback = callback
eo.Obj = Obj
// 通过名字查找事件列表
list := eventByName[name]
// 在列表切片中添加函数
list = append(list, eo)
// 将修改的事件列表切片保存回去
eventByName[name] = list
}
// 调用事件
func CallEvent(name string, param []interface{}) {
// 通过名字找到事件列表
list := eventByName[name]
// 遍历这个事件的所有回调
for _, eo := range list {
// 传入参数调用回调
eo.Callback(param)
}
}
func RemoveEvent(name string, callback func([]interface{}), Obj interface{}) {
// 通过名字找到事件列表
list := eventByName[name]
j := 0
eo := new(EventObj)
eo.Callback = callback
eo.Obj = Obj
// 遍历这个事件的所有回调
for _, v := range list {
if !v.isEqual(eo) {
list[j] = v
j++
}
}
eventByName[name] = list[:j]
// fmt.Println("len eventByName[name]:", len(eventByName[name]))
//fmt.Println("len eventByName[name]:", len(eventByName))
// fmt.Println("len list:", len(list))
}
func DeleteEleByValue(list []int, ele int) []int {
j := 0
for _, v := range list {
if v != ele {
list[j] = v
j++
}
}
ret := list[:j]
return ret
}
func BoolToInt32(b bool) int32 {
if b {
return 1
}
return 0
}
func IfTrue(a bool, b, c interface{}) interface{} {
if a {
return b
}
return c
}
func Int64(a interface{}) int64 {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return int64(v)
case int32:
return int64(v)
case int64:
return v
case float64:
return int64(v)
}
return 0
}
func Int(a interface{}) int {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return v
case int32:
return int(v)
case int64:
return int(v)
case float64:
return int(v)
case string:
r, err := strconv.Atoi(v)
if err != nil {
return 0
}
return r
}
return 0
}
func GobMarshal(data interface{}) ([]byte, error) {
var buf bytes.Buffer
encode := gob.NewEncoder(&buf)
err := encode.Encode(data)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func GobUnmarshal(data []byte, obj interface{}) error {
decode := gob.NewDecoder(bytes.NewReader(data))
err := decode.Decode(obj)
if err != nil {
return err
}
return nil
}
func GetServerIdByUid(uid int) int {
return int(uid / 100000)
}
func CreateOrderSn(uid int) string {
Now := time.Now()
return "order_" + strconv.Itoa(uid) + "_" + Now.Format("20060102150405") + RandString(6)
}
// 生成指定长度的随机字符串
func RandString(n int) string {
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
r := rand.New(rand.NewSource(time.Now().UnixNano()))
b := make([]byte, n)
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}

View File

@ -1,7 +1,7 @@
package GoUtil
import (
dailyTaskCfg "server/conf/daily_task"
dailyTaskCfg "server/conf/dailyTask"
"server/game/mod/item"
)
@ -12,13 +12,6 @@ func MapIntToSlice(m map[int]struct{}) []int32 {
}
return s
}
func MapIntToIntSlice(m map[int]struct{}) []int {
var s []int
for k := range m {
s = append(s, k)
}
return s
}
func MapIntToInt32(m map[int]int) map[int32]int32 {
r := make(map[int32]int32)
@ -28,14 +21,6 @@ func MapIntToInt32(m map[int]int) map[int32]int32 {
return r
}
func MapInt32ToInt(m map[int32]int32) map[int]int {
r := make(map[int]int)
for k, v := range m {
r[int(k)] = int(v)
}
return r
}
func GetMapKey(v any) []int {
if v == nil {
return []int{}
@ -80,29 +65,3 @@ func GetMapKey(v any) []int {
}
return []int{}
}
func DiffMap(a, b map[int]int) map[int]int {
diff := make(map[int]int)
for k, v := range a {
if v2, ok := b[k]; !ok || v != v2 {
diff[k] = v
}
}
for k, v := range b {
if _, ok := a[k]; !ok {
diff[k] = v
}
}
return diff
}
func GetMapIntValueByKey(m interface{}, key string) int {
mi, ok := m.(map[string]interface{})
if !ok {
return 0
}
if v, ok := mi[key]; ok {
return Int(v)
}
return 0
}

View File

@ -0,0 +1,8 @@
package GoUtil
func RandNum(start int, end int) int {
if start > end {
return 0
}
return start + GetRand().Intn(end-start+1)
}

View File

@ -6,9 +6,6 @@ import (
)
func RandMap(d map[int]int) int {
if len(d) == 0 {
return 0
}
total := 0
for _, v := range d {
total += v
@ -26,28 +23,7 @@ func RandMap(d map[int]int) int {
}
// 如果没有找到,返回一个默认值
return 0
}
func RandStringMap(d map[string]int) string {
total := 0
for _, v := range d {
total += v
}
// 生成一个 [0, total) 范围内的随机数
r := rand.Intn(total)
// 根据随机数选择一个键
for k, v := range d {
if r < v {
return k
}
r -= v
}
// 如果没有找到,返回一个默认值
return ""
return -1
}
// 从d中随机选取n个元素 不放回

View File

@ -0,0 +1,172 @@
package GoUtil
import (
"sort"
"strconv"
)
func IntToInt32(d []int) []int32 {
r := make([]int32, 0, len(d))
for _, d := range d {
r = append(r, int32(d))
}
return r
}
func RandPopSlice(slice []int) ([]int, int) {
slen := len(slice)
if slen == 0 {
return slice, -1
}
Id := GetRand().Intn(slen)
return append(slice[0:Id], slice[Id+1:]...), slice[Id]
}
func RandSlice(slice []int) int {
slen := len(slice)
if slen == 0 {
return 0
}
Id := GetRand().Intn(slen)
return slice[Id]
}
func RandSliceNum(slice []int, num int) []int {
r := make([]int, 0, num)
if num <= 0 || len(slice) < num {
return slice
}
for i := 0; i < num; i++ {
Id := GetRand().Intn(len(slice))
r = append(r, slice[Id])
slice = append(slice[0:Id], slice[Id+1:]...)
}
return r
}
func RandSliceNumNonAdjacent(slice []int, num int) []int {
if len(slice) < 2*num {
return nil
}
sort.Ints(slice)
result := make([]int, 0, num)
for len(result) < num {
Id := GetRand().Intn(len(slice))
result = append(result, slice[Id])
slice = SubAdjacentElemSlice(slice, Id)
}
return result
}
func SubAdjacentElemSlice(s []int, Id int) []int {
r := make([]int, 0, len(s))
for k, v := range s {
if k < Id-1 || k > Id+1 {
r = append(r, v)
}
}
return r
}
func RandStringSlice(slice []string) string {
slen := len(slice)
if slen == 0 {
return ""
}
Id := GetRand().Intn(slen)
return slice[Id]
}
func SliceStringToInt(s []string) []int {
if len(s) == 0 {
return []int{}
}
r := make([]int, 0, len(s))
for _, v := range s {
v1, _ := strconv.Atoi(v)
r = append(r, v1)
}
return r
}
func SliceIntToInt32(s []int) []int32 {
r := make([]int32, 0, len(s))
for _, v := range s {
r = append(r, int32(v))
}
return r
}
func PopElemSlice(s []int, Id int) ([]int, bool) {
for k, v := range s {
if v == Id {
return append(s[0:k], s[k+1:]...), true
}
}
return s, false
}
func ElemInSlice(s []int, Id int) bool {
for _, v := range s {
if v == Id {
return true
}
}
return false
}
func GetElemNum(s []int, Id int) int {
n := 0
for _, v := range s {
if v == Id {
n++
}
}
return n
}
func InArray(Id int, s []int) bool {
for _, v := range s {
if v == Id {
return true
}
}
return false
}
func InStringArray(Id string, s []string) bool {
for _, v := range s {
if v == Id {
return true
}
}
return false
}
// toInterfaceSlice converts a slice of strings to a slice of empty interfaces
func ToInterfaceSlice(slice []string) []interface{} {
result := make([]interface{}, len(slice))
for i, v := range slice {
result[i] = v
}
return result
}
// a - b
func SubSlices(a, b []int) []int {
result := make([]int, 0, len(a))
for _, num := range a {
if !InArray(num, b) {
result = append(result, num)
}
}
return result
}
func PopSlice(s []int) (int, []int) {
if len(s) == 0 {
return -1, s
}
return s[0], s[1:]
}

View File

@ -1,9 +1,6 @@
package GoUtil
import (
"server/conf"
"time"
)
import "time"
const (
SEVENDAYS = 604800
@ -30,16 +27,8 @@ func MonthZeroTimestamp() int64 {
func NextZeroTimestampDuration() int64 {
now := time.Now()
location := now.Location()
midnight := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, location)
nextMidnight := midnight.AddDate(0, 0, 1)
// Adjust for daylight saving time transitions
_, nowOffset := now.Zone()
_, nextMidnightOffset := nextMidnight.Zone()
offsetDifference := nextMidnightOffset - nowOffset
return nextMidnight.Unix() - now.Unix() + int64(offsetDifference)
midnight := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
return midnight.AddDate(0, 0, 1).Unix() - now.Unix()
}
// 获取距离下个中午十二点时间戳的秒数
@ -98,23 +87,10 @@ func GetWeekdayAndHour() (int, int) {
}
func ParseTime(timeStr string) int64 {
loc, _ := time.LoadLocation("Local")
t, _ := time.ParseInLocation("2006-01-02 15:04:05", timeStr, loc)
t, _ := time.Parse("2006-01-02 15:04:05", timeStr)
return t.Unix()
}
func ServerOpenTime() int64 {
return ParseTime(conf.Server.ServerOpenTime)
}
func GetServerOpenDay() int {
ServerStartTime := conf.Server.ServerOpenTime
t, _ := time.Parse("2006-01-02 15:04:05", ServerStartTime)
now := time.Now()
d := now.Sub(t)
return int(d.Hours() / 24)
}
// 获取时间戳距离现在过了多少个自然周
func WeeksSince(timestamp int64) int {
// 将时间戳转换为 time.Time 对象
@ -142,39 +118,3 @@ func FullWeeksSince(timestamp int64) int {
return currentWeek - startWeek
}
func ZeroTime(timestamp int64) int64 {
t := time.Unix(timestamp, 0)
return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()).Unix()
}
// 计算给定时间戳所在的 0 点到现在的 0 点过了几天
func DaysSince(timestamp int64) int {
// 获取给定时间戳的 0 点时间
t := time.Unix(timestamp, 0)
startOfDay := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())
// 获取当前时间的 0 点时间
now := time.Now()
startOfToday := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
// 计算两个时间之间的天数差
days := int(startOfToday.Sub(startOfDay).Hours() / 24)
return days
}
func IsSameDay(timestamp1, timestamp2 int64) bool {
t1 := time.Unix(timestamp1, 0)
t2 := time.Unix(timestamp2, 0)
return t1.Year() == t2.Year() && t1.YearDay() == t2.YearDay()
}
func IsFirstDayOfMonth() bool {
now := time.Now()
return now.Day() == 1
}
func NowMonth() int {
return int(time.Now().Month())
}

View File

@ -3,19 +3,13 @@ package MergeConst
type ProtocolType int32
const (
Protocol_Error_Account_Exist int32 = 100
Protocol_Error_Account_OR_PWD_ERROR int32 = 101
Protocol_Error_Account_OR_PWD_Short int32 = 102
Protocol_Error_Account_Fail int32 = 103
Protocol_Error_Account_NoExsit int32 = 104
Protocol_Error_Account_Code_Error int32 = 105
Protocol_Error_Account_Device_Error int32 = 106
Protocol_Error_Id_Not_Verify int32 = 107
Protocol_Error_Id_Verify_Error int32 = 108
Protocol_Error_Account_Ban int32 = 109
Protocol_Res_Buy_Cnt_Limit int32 = 110
Protocol_Res_Buy_CD int32 = 111
Protocol_Error_Account_Exist int32 = 100
Protocol_Error_Account_OR_PWD_ERROR int32 = 101
Protocol_Error_Account_OR_PWD_Short int32 = 102
Protocol_Error_Account_Fail int32 = 103
Protocol_Error_Account_NoExsit int32 = 104
Protocol_Res_Buy_Cnt_Limit int32 = 110
Protocol_Res_Buy_CD int32 = 111
Protocol_Email_Find_Fail int32 = 120
Protocol_Active_No_Exsit int32 = 130
Protocol_Active_7Day_Rewarded int32 = 131
@ -100,12 +94,10 @@ const G_Champion_settlement_Duration = 3600 * 23
const G_Champion_Unlock_Score = 2
const G_Champion_Max_Score = 44650
const G_Champion_People_Cnt = 50
const SUCCESS = 1
const (
ORDER_STATUS_IDLE = 0 // 订单未完成
ORDER_STATUS_PAY = 1 // 订单已支付
ORDER_STATUS_CANCEL = 2 // 订单取消
ORDER_STATUS_CANCLE = 2 // 订单取消
ORDER_STATUS_SHIP = 3 // 订单已发货
)
const GLOBAL_SERVER_ID = 0 // 全局服ID

View File

@ -1,8 +0,0 @@
package MergeConst
const (
Go_gc_percent = 200
Go_gc_memory_limit = 1024 << 20
Go_game_version = "1.0.3" // 游戏版本号,格式为 "主版本号.次版本号.修订号",每次发布新版本时需要更新
Go_log_delete_days = 3 // 日志删除天数,超过这个天数的日志文件将被删除
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

View File

@ -1,16 +0,0 @@
## 命名规范
- **清晰优先**:名称应准确表达含义,避免歧义。
- **导出规则**:导出标识符首字母大写,未导出首字母小写。
- **包名**:小写单词,简短且描述职责(如 `store`、`auth`)。
- **文件名**:小写(可下划线分隔),测试文件以 `_test.go` 结尾。
- **函数/变量/类型**:驼峰命名;导出使用 PascalCase例如 `UserService`、`CreateUser`)。
- **接口**:以行为命名,常用 `-er` 结尾(如 `Reader`、`Store`),避免 `I` 前缀。
- **缩写**:统一大小写(例如导出使用 `ID`、`URL`;未导出使用 `id`、`url`)。
- **错误**:包级错误使用 `Err` 前缀(如 `ErrNotFound`)。
- **Context 与并发**:统一使用 `ctx` 作 `context.Context`,通道命名要有语义(如 `done`, `jobs`)。
- **构造函数/选项**:使用 `NewType` 与 `WithXxx` 约定,避免多个布尔参数。

View File

@ -1,77 +0,0 @@
package backend
import (
"context"
"net"
"server/conf"
"server/game"
"server/msg"
"server/pkg/github.com/name5566/leaf/log"
"google.golang.org/grpc"
)
type backendServer struct {
msg.UnimplementedBackendServer
}
func (s *backendServer) ReloadActivity(ctx context.Context, req *msg.ReqActivityCfgReload) (*msg.ResActivityCfgReload, error) {
defer func() {
if r := recover(); r != nil {
log.Error("ReloadActivity panic: %v", r)
}
}()
log.Debug("Received ReloadActivity request: %v", req)
game.AcitivityCfgReload()
return nil, nil
}
func (s *backendServer) OrderShipping(ctx context.Context, req *msg.ReqOrderShipping) (*msg.ResOrderShipping, error) {
defer func() {
if r := recover(); r != nil {
log.Error("OrderShipping panic: %v", r)
}
}()
log.Debug("Received OrderShipping request: %v", req)
res, err := game.AdminShipping(req)
if err != nil {
log.Error("OrderShipping error: %v", err)
return nil, err
}
return res, nil
}
func (s *backendServer) UserDetail(ctx context.Context, req *msg.UserDetailParam) (*msg.ResUserDetail, error) {
defer func() {
if r := recover(); r != nil {
log.Error("UserDetail panic: %v", r)
}
}()
log.Debug("Received UserDetail request: %v", req)
res, err := game.AdminPlayerDetailInfo(req)
if err != nil {
log.Error("UserDetail error: %v", err)
return nil, err
}
return res, nil
}
func Start() {
if conf.Server.RPCAddr == "" {
log.Debug("RPC server address not configured, skipping gRPC server startup")
return
}
lis, err := net.Listen("tcp", conf.Server.RPCAddr)
if err != nil {
log.Error("failed to listen: %v", err)
return
}
s := grpc.NewServer()
msg.RegisterBackendServer(s, &backendServer{})
log.Debug("gRPC server listening on %s", conf.Server.RPCAddr)
if err := s.Serve(lis); err != nil {
log.Error("server exited with error: %v", err)
}
}

View File

@ -1,113 +0,0 @@
package main
import (
"fmt"
"runtime"
"server/game"
"server/game/mod/msg"
"testing"
)
// func TestBenchInit(t *testing.T) {
// f := "wmz00%d"
// for i := 0; i < 10000; i++ {
// UserName := fmt.Sprintf(f, i)
// game.G_GameLogicPtr.Db_AccountInfo.UserName = UserName
// game.G_GameLogicPtr.Db_AccountInfo.UserPassword = "123456"
// if game.G_GameLogicPtr.NewAccountInsertDataToDB() {
// fmt.Printf("UserName:%s\n init success", UserName)
// }
// }
// }
/*
*
cluster 消息处理基准测试
36716 34961 ns/op 1690 B/op 38 allocs/op
*/
func BenchmarkClusterMsg(b *testing.B) {
game.ClusterMgrInit()
runtime.GOMAXPROCS(8)
game.G_getGameLogic()
for i := 0; i < b.N; i++ {
m := &msg.Msg{
HandleType: msg.HANDLE_MOD_PLAYER_LOGIN,
Extra: 0,
}
game.MessageHandle(m)
}
}
func printMemUsage() {
var m runtime.MemStats
runtime.ReadMemStats(&m)
// 输出内存使用情况
fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
fmt.Printf("\tNumGC = %v\n", m.NumGC)
var playerCount int
game.G_GameLogicPtr.M_Players.Range(func(key, value interface{}) bool {
playerCount++
return true
})
fmt.Printf("\tPlayerNum = %v\n", playerCount)
}
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}
func BenchmarkChampionshipGroup(b *testing.B) {
for i := 0; i < b.N; i++ {
game.G_GameLogicPtr.CreateChampshipMgr()
game.G_GameLogicPtr.ChampshipMgr.Debug()
}
}
func BenchmarkPlayerInit(b *testing.B) {
for i := 0; i < b.N; i++ {
p := new(game.Player)
p.InitPlayer("3625212")
p.LoginBackData()
}
}
func BenchmarkPlayerBackup(b *testing.B) {
p := new(game.Player)
p.InitPlayer("3625212")
for i := 0; i < b.N; i++ {
p.BackUp()
}
}
func BenchmarkPlayerRecover(b *testing.B) {
p := new(game.Player)
p.InitPlayer("3625212")
backup := p.BackUp()
for i := 0; i < b.N; i++ {
p.Recover(backup)
}
}
func BenchmarkPlayerHandleMsg(b *testing.B) {
p := new(game.Player)
p.InitPlayer("3625212")
list := make([]*msg.Msg, 0, 1000)
for i := 0; i < 1000; i++ {
m := &msg.Msg{
HandleType: msg.HANDLE_MOD_PLAYER_LOGIN,
Type: msg.HANDLE_TYPE_APPLY,
From: 100001,
To: i + 100002,
Extra: 0,
}
list = append(list, m)
}
for i := 0; i < b.N; i++ {
for _, m := range list {
p.HandleMsg(m)
}
}
}

View File

@ -3,9 +3,9 @@ package mergeCluster
import (
"fmt"
"math"
"server/GoUtil"
"server/conf"
"server/game/mod/msg"
GoUtil "server/game_util"
"server/pkg/github.com/name5566/leaf/log"
"server/pkg/github.com/name5566/leaf/network"
"sync"
@ -16,9 +16,7 @@ const (
)
var FuncMap = map[int]func(*Agent, *msg.Msg) error{} // 消息处理函数
var funcMapMu sync.RWMutex // FuncMap 的读写锁
var CallbackChan = make(map[string]chan *msg.Msg) // 回调消息队列
var callbackChanMu sync.RWMutex // CallbackChan 的读写锁
var (
server *network.TCPServer // 服务器
Center *network.TCPClient // 集群中心
@ -32,14 +30,14 @@ func Init() {
server = new(network.TCPServer)
server.Addr = conf.Server.ListenAddr
server.MaxConnNum = int(math.MaxInt32)
server.PendingWriteNum = 1 << 14
server.PendingWriteNum = conf.PendingWriteNum
server.LenMsgLen = 4
server.MaxMsgLen = 1 << 16
server.MaxMsgLen = 4096
server.NewAgent = newServerAgent
server.Start()
}
if conf.Server.CenterAddr != "" && conf.Server.ServerType != "center" {
if conf.Server.CenterAddr != "" {
connectRemote(conf.Server.CenterAddr, ClusterCenterId, "center")
}
@ -49,11 +47,6 @@ func Init() {
registerFunc(msg.CLUSTER_EXIT, ClusterExit)
}
// GetCallbackChanMu 返回 CallbackChan 的读写锁,供外部包安全访问 CallbackChan
func GetCallbackChanMu() *sync.RWMutex {
return &callbackChanMu
}
func Destroy() {
if server != nil {
log.Release("closing cluster server")
@ -95,7 +88,7 @@ func (a *Agent) Run() {
m := msg.Msg{}
err = GoUtil.GobUnmarshal(data, &m)
if err != nil {
log.Debug("decode err: %v, data: %s", err, string(data))
log.Debug("decode err: %v", err)
return
}
err = processMsg(a, &m)

View File

@ -2,9 +2,9 @@ package mergeCluster
import (
"fmt"
"server/GoUtil"
"server/conf"
"server/game/mod/msg"
GoUtil "server/game_util"
"server/pkg/github.com/name5566/leaf/log"
"server/pkg/github.com/name5566/leaf/network"
"time"
@ -48,14 +48,19 @@ func HandShakeRecv(a *Agent, m *msg.Msg) error {
RemoteAddr: m.Extra.(string),
},
})
} else {
syncMsg := &msg.Msg{
Type: msg.CLUSTER_FRIEND_SYNC,
To: ServerId,
HandleType: msg.HANDLE_MOD_CLUSTER_SYNC,
}
sendGameMsg(syncMsg)
}
syncMsg := &msg.Msg{
Type: msg.CLUSTER_FRIEND_SYNC,
To: ServerId,
}
sendGameMsg(syncMsg)
fmt.Print("现有区服连接:")
serverAgent.Range(func(key, value interface{}) bool {
fmt.Print(key)
fmt.Print(",")
return true
})
fmt.Println()
return nil
}
@ -74,7 +79,7 @@ func ClusterJoin(a *Agent, m *msg.Msg) error {
return nil
}
log.Debug("ClusterJoin ServerId %v", clusterJoin.ServerId)
//connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
connectRemote(clusterJoin.RemoteAddr, clusterJoin.ServerId, "server")
return nil
}
@ -91,30 +96,23 @@ func connectRemote(RemoteAddr string, ConnType int, ConnLabel string) error {
client := new(network.TCPClient)
client.Addr = RemoteAddr
client.ConnNum = 1
client.PendingWriteNum = 1 << 14
client.PendingWriteNum = conf.PendingWriteNum
client.LenMsgLen = 4
client.MaxMsgLen = 1 << 16
client.MaxMsgLen = 4096
client.NewAgent = newAgent
client.ConnType = ConnType
client.ConnLabel = ConnLabel
client.ConnectInterval = time.Duration(time.Minute * 1)
client.ConnectInterval = time.Duration(time.Minute * 5)
if ConnType == ClusterCenterId { // 中心服断开重连
client.AutoReconnect = true
}
client.Start()
Center = client
clients = append(clients, client)
log.Debug("connet remote to addr:%s", RemoteAddr)
return nil
}
func SendServerMsg(m *msg.Msg, serverId int) error {
if m.UniKey == "" {
m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m))
}
if m.SendT == 0 {
m.SendT = GoUtil.Now()
}
if v, ok := serverAgent.Load(serverId); ok {
data, err := GoUtil.GobMarshal(m)
if err != nil {
@ -122,47 +120,10 @@ func SendServerMsg(m *msg.Msg, serverId int) error {
return err
}
v.(network.Agent).WriteMsg(data)
return nil
}
return fmt.Errorf("server %d not online", serverId)
}
func CallServerMsg(m *msg.Msg, serverId int) (*msg.Msg, error) {
if m.UniKey == "" {
m.UniKey = GoUtil.UniKey(fmt.Sprintf("%v,Cluster Msg", m))
}
if m.SendT == 0 {
m.SendT = GoUtil.Now()
}
v, ok := serverAgent.Load(serverId)
// 之后再发送消息
if !ok {
return nil, fmt.Errorf("server %d not online", serverId)
}
// 先注册回调通道,避免发送出去后对方快速返回导致丢失
newChan := make(chan *msg.Msg, 1)
registerChanel(m.UniKey, newChan)
defer unregisterChanel(m.UniKey)
data, err := GoUtil.GobMarshal(m)
if err != nil {
log.Debug("CallServerMsg GobMarshal err %v", err)
return nil, err
}
v.(network.Agent).WriteMsg(data)
// 等待返回(直接接收一次)
timeout := time.After(5 * time.Second)
select {
case backm := <-newChan:
if backm == nil {
return nil, fmt.Errorf("server %d not response", serverId)
}
// log.Debug("CallServerMsg reply %v", backm)
return backm, nil
case <-timeout:
return nil, fmt.Errorf("timeout waiting for server %d response", serverId)
}
}
func SendMsgAll(m *msg.Msg) {
data, err := GoUtil.GobMarshal(m)
if err != nil {
@ -177,12 +138,7 @@ func SendMsgAll(m *msg.Msg) {
func processMsg(a *Agent, m *msg.Msg) error {
var err error
funcMapMu.RLock()
fun, ok := FuncMap[m.Type]
funcMapMu.RUnlock()
if ok {
if fun, ok := FuncMap[m.Type]; ok {
err = fun(a, m)
} else {
MsgChan <- m //交由game Module消息处理
@ -191,21 +147,7 @@ func processMsg(a *Agent, m *msg.Msg) error {
}
func registerFunc(key int, fun func(*Agent, *msg.Msg) error) {
funcMapMu.Lock()
FuncMap[key] = fun
funcMapMu.Unlock()
}
func registerChanel(key string, chanel chan *msg.Msg) {
callbackChanMu.Lock()
CallbackChan[key] = chanel
callbackChanMu.Unlock()
}
func unregisterChanel(key string) {
callbackChanMu.Lock()
delete(CallbackChan, key)
callbackChanMu.Unlock()
}
func sendGameMsg(m *msg.Msg) {

View File

@ -1,8 +1,17 @@
package mergeCluster
import (
"encoding/gob"
"server/game/mod/msg"
)
func init() {
gob.Register(&msg.Msg{})
gob.Register(&ClusterJoinData{})
}
type ClusterJoinData struct {
ServerId int
Country int
RemoteAddr string
}

View File

@ -0,0 +1,41 @@
package startOrderCfg
import (
"server/gamedata"
"strconv"
)
type StartOrderCfg struct {
}
var CFG_NAME = "StartOrder"
func init() {
gamedata.InitCfg(CFG_NAME)
}
// 根据step 获取初始订单
func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
ret := make([]*gamedata.StartOrderData, 0)
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
return ret
}
for k, v := range data {
record := v.(map[string]interface{})
stepVal := gamedata.ParseInt(record["step"])
var MergeList []int
for _, vv := range record["merge_id_list"].([]interface{}) {
MergeList = append(MergeList, gamedata.ParseInt(vv))
}
if int(stepVal) == id {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
Step: int(stepVal),
MergeList: MergeList,
})
}
}
return ret
}

View File

@ -0,0 +1,46 @@
package activityCfg
import (
"server/GoUtil"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_ACTIVITY = "Activity"
)
func init() {
gamedata.InitCfg(CFG_ACTIVITY)
}
func GetActivityList() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
}
Now := GoUtil.Now()
var List []*gamedata.ActivityData
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
if Now >= StartTime && Now <= EndTime {
Id, _ := strconv.Atoi(k)
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
ActivityData := &gamedata.ActivityData{
Id: Id,
Type: Type,
Name: Name,
Title: Title,
}
List = append(List, ActivityData)
}
}
return List
}

View File

@ -1,144 +0,0 @@
package activityCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_ACTIVITY = "Activity"
CFG_ACTIVITY_GIFT = "ActivityGift"
)
func init() {
gamedata.InitCfg(CFG_ACTIVITY)
gamedata.InitCfg(CFG_ACTIVITY_GIFT)
}
func GetActivityGiftId(chargeId int) int {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
if err != nil {
log.Debug("GetActivityGiftId err:%v", err)
return 0
}
for _, v := range data {
ChargeId := gamedata.GetIntValue(v, "ChargeId")
if ChargeId == chargeId {
return gamedata.GetIntValue(v, "AId")
}
}
return 0
}
func GetActivityGiftItems(chargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
if err != nil {
log.Debug("GetActivityGiftItems err:%v", err)
return nil
}
for _, v := range data {
ChargeId := gamedata.GetIntValue(v, "ChargeId")
if ChargeId == chargeId {
Items := gamedata.GetItemList(v, "Items")
return Items
}
}
return nil
}
func GetActivityList() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
return nil
}
List := make([]*gamedata.ActivityData, 0, len(data))
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
Level := gamedata.GetIntValue(v, "Level")
ActivityData := &gamedata.ActivityData{
Id: GoUtil.Int(k),
Type: Type,
AType: gamedata.GetIntValue(v, "AType"),
Name: Name,
Title: Title,
Level: Level,
StartTime: StartTime,
EndTime: EndTime,
}
List = append(List, ActivityData)
}
return List
}
func GetActivityListOrigin() []*gamedata.ActivityData {
data, err := gamedata.GetData(CFG_ACTIVITY)
if err != nil {
log.Debug("GetActivityList err:%v", err)
return nil
}
List := make([]*gamedata.ActivityData, 0, len(data))
for k, v := range data {
StartTimeStr := gamedata.GetStringValue(v, "StartTime")
EndTimeStr := gamedata.GetStringValue(v, "EndTime")
StartTime := GoUtil.ParseTime(StartTimeStr)
EndTime := GoUtil.ParseTime(EndTimeStr)
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetActivityList parse id err:%v, key:%s", err, k)
continue
}
Type := gamedata.GetIntValue(v, "Type")
Name := gamedata.GetStringValue(v, "Name")
Title := gamedata.GetStringValue(v, "Title")
Level := gamedata.GetIntValue(v, "Level")
ActivityData := &gamedata.ActivityData{
Id: Id,
Type: Type,
AType: gamedata.GetIntValue(v, "AType"),
Name: Name,
Title: Title,
Level: Level,
StartTime: StartTime,
EndTime: EndTime,
}
List = append(List, ActivityData)
}
return List
}
func GetActivityRewardItems(ActId int) []*item.Item {
data, err := gamedata.GetData(CFG_ACTIVITY_GIFT)
if err != nil {
log.Debug("GetActivityRewardItems err:%v", err)
return nil
}
for _, v := range data {
ChargeId := gamedata.GetIntValue(v, "ChargeId")
AId := gamedata.GetIntValue(v, "AId")
if ChargeId == 0 && AId == ActId {
Items := gamedata.GetItemList(v, "Items")
return Items
}
}
return nil
}
func GetActivityRecycleMail(ActId int) (string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_ACTIVITY, ActId)
if err != nil {
log.Debug("GetActivityRecycleMail err:%v", err)
return "", "", ""
}
return gamedata.GetStringValue(data, "Title"), gamedata.GetStringValue(data, "Mail_Title"), gamedata.GetStringValue(data, "Mail_Content")
}

View File

@ -1,7 +1,6 @@
package avatarCfg
import (
"math/rand"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
@ -21,7 +20,7 @@ func GetInitList() []int {
log.Debug("GetInitList err: %v", err)
return nil
}
r := make([]int, 0, len(data))
r := make([]int, 0)
for k, v := range data {
IsInit := gamedata.GetIntValue(v, "Init")
if IsInit == 1 {
@ -32,15 +31,6 @@ func GetInitList() []int {
return r
}
func GetRandInitId() int {
list := GetInitList()
if len(list) == 0 {
return 0
}
index := rand.Intn(len(list))
return list[index]
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_AVATAR)
if err != nil {
@ -50,17 +40,3 @@ func CheckExist(Id int) bool {
_, ok := data[strconv.Itoa(Id)]
return ok
}
func GetAllId() []int {
data, err := gamedata.GetData(CFG_AVATAR)
if err != nil {
log.Debug("GetAllId err: %v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id, _ := strconv.Atoi(k)
r = append(r, Id)
}
return r
}

View File

@ -0,0 +1,39 @@
package baseCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_BASE = "Base"
)
const (
ENERGY_SHOP_MUL = "energy_shop_mul"
)
func init() {
gamedata.InitCfg(CFG_BASE)
}
func GetEnergyByMul(T int) float64 {
data, err := gamedata.GetDataByKey(CFG_BASE, ENERGY_SHOP_MUL)
if err != nil {
log.Debug("GetEnergyByMul err:%v", err)
return 0
}
d := data["Value"].(map[string]interface{})
if len(d) == 0 {
return 0
}
T = min(T, len(d))
T1 := strconv.Itoa(T)
if v, ok := d[T1]; ok {
return v.(float64)
} else {
return 0
}
}

View File

@ -1,97 +0,0 @@
package baseCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_BASE = "Base"
)
const (
ENERGY_SHOP_MUL = "energy_shop_mul"
ENERGY_CFG = "BaseEnergy"
MAX_ENERGY_LEVEL = 999 // 最大能量等级上限
)
func init() {
gamedata.InitCfg(CFG_BASE)
gamedata.InitCfg(ENERGY_CFG)
}
func GetEnergyByMul(T int) float64 {
data, err := gamedata.GetDataByKey(CFG_BASE, ENERGY_SHOP_MUL)
if err != nil {
log.Debug("GetEnergyByMul err:%v", err)
return 0
}
valueData, ok := data["Value"]
if !ok {
log.Debug("GetEnergyByMul: Value field not found")
return 0
}
d, ok := valueData.(map[string]interface{})
if !ok || len(d) == 0 {
log.Debug("GetEnergyByMul: Value is not a valid map")
return 0
}
T = min(T, len(d))
T1 := strconv.Itoa(T)
if v, ok := d[T1]; ok {
if floatVal, ok := v.(float64); ok {
return floatVal
}
log.Debug("GetEnergyByMul: value is not float64, key=%s", T1)
}
return 0
}
func GetFriendReplyReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_BASE, "friend_reply")
if err != nil {
log.Debug("GetFriendReplyReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetEnergyByADNum() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_BASE, "ad_energy_gift")
if err != nil {
log.Debug("GetEnergyByADNum err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetMaxEnergyMul(Lv int, Energy int) int {
Mul := 0
for i := 1; i <= MAX_ENERGY_LEVEL; i++ {
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, i)
if err != nil {
break
}
UnlockLv := gamedata.GetIntValue(data, "UnlockLv")
needEnergy := gamedata.GetIntValue(data, "NeedEnergy")
if Lv < UnlockLv || Energy < needEnergy {
break
}
Mul = i - 1
}
return Mul
}
func GetLimitEnergyMul(Lv int) int {
data, err := gamedata.GetDataByIntKey(ENERGY_CFG, Lv+1)
if err != nil {
log.Debug("GetLimitEnergyMul err:%v, Lv=%d", err, Lv)
return 0
}
return gamedata.GetIntValue(data, "Limit")
}

View File

@ -1,8 +1,8 @@
package cardCfg
import (
"server/GoUtil"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
@ -28,73 +28,51 @@ func init() {
func GetAllCollectReward() []*item.Item {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "all_collect_reward")
if err != nil {
log.Debug("GetAllCollectReward err:%v", err)
return nil
log.Debug("GetAllCollectReward data not found")
}
if value, ok := data["Value"]; ok {
return item.ParseItem(value)
}
return nil
return item.ParseItem(data["Value"])
}
func GetStarById(Id int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("GetStarById err:%v, Id=%d", err, Id)
return 0
log.Debug("GetStarById data not found")
}
return gamedata.GetIntValue(data, "Star")
}
func GetRoundById(Id int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("GetRoundById err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Round")
}
// 获取开启卡包获得的卡牌数量
func GetPackRewardCnt(Star int) int {
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
if err != nil {
log.Debug("GetPackRewardCnt err:%v, Star=%d", err, Star)
return 0
log.Debug("GetPackRewardCnt data not found")
}
return gamedata.GetIntValue(data, "RewardCnt")
}
// 获取开启开包得x星卡
// 获取开启开包得x星卡
func GetPackMustHave(Star int) int {
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
if err != nil {
log.Debug("GetPackMustHave err:%v, Star=%d", err, Star)
return 0
log.Debug("GetPackMustHave data not found")
}
return gamedata.GetIntValue(data, "MustHave")
}
// 根据星级获取卡牌列表
func GetCardListByStar(Round, Star, IsGold int) []int {
func GetCardListByStar(Star, IsGold int) []int {
var CardList []int
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
if err != nil {
log.Debug("GetCardListByStar err:%v", err)
return nil
log.Debug("GetCardListByStar data not found")
}
CardList := make([]int, 0, len(data)/10)
for k, v := range data {
Extra := gamedata.GetIntValue(v, "Round")
if Round < Extra {
continue
}
vStar := gamedata.GetIntValue(v, "Star")
isGold := gamedata.GetIntValue(v, "IsGold")
if vStar == Star && IsGold == isGold {
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetCardListByStar parse id err:%v, key=%s", err, k)
continue
}
id, _ := strconv.Atoi(k)
CardList = append(CardList, id)
}
}
@ -102,20 +80,16 @@ func GetCardListByStar(Round, Star, IsGold int) []int {
}
// 获取随机卡牌
func GetRandListByStar(Star int) map[int]int {
func GetRandListByStar(Star int) []int {
var randList []int
data, err := gamedata.GetDataByIntKey(CARD_PACK_CFG_NAME, Star)
if err != nil {
log.Debug("GetRandListByStar err:%v, Star=%d", err, Star)
return nil
log.Debug("GetRandListByStar data not found")
}
r1 := gamedata.GetStringValue(data, "RandRate")
r2 := strings.Split(r1, ",")
randList := GoUtil.SliceStringToInt(r2)
r := make(map[int]int, len(randList))
for k, v := range randList {
r[k+1] = v
}
return r
randList = GoUtil.SliceStringToInt(r2)
return randList
}
// 获取卡牌收集奖励
@ -132,33 +106,33 @@ func GetCollectReward(Color int) ([]*item.Item, int) {
}
// 获取兑换奖励
func GetExchangeCfg(Id int) (int, []*item.Item) {
func GetExchangeCfg(Id int) (int, []*item.Item, []int) {
data, err := gamedata.GetDataByIntKey(CARD_EXCHANGE_CFG, Id)
if err != nil {
log.Debug("GetExchangeCfg err:%v, Id=%d", err, Id)
return 0, nil
log.Debug("GetExchangeCfg data not found")
return 0, nil, nil
}
itemNum := gamedata.GetIntValue(data, "Item")
itemList := []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, itemNum)}
CostStar := gamedata.GetIntValue(data, "CostStar")
itemList := gamedata.GetItemList(data, "Item")
return CostStar, itemList
CardPackStr := gamedata.GetStringValue(data, "CardPack")
s1 := CardPackStr[1 : len(CardPackStr)-1]
CardPack := GoUtil.SliceStringToInt(strings.Split(s1, ","))
return CostStar, itemList, CardPack
}
// 根据系列获取卡牌列表
func GetCardListByColor(Id int) []int {
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
if err != nil {
log.Debug("GetCardListByColor err:%v, Id=%d", err, Id)
return nil
log.Debug("GetCardListByColor data not found")
return []int{}
}
r := make([]int, 0, len(data)/5)
var r []int
for k, v := range data {
color := gamedata.GetIntValue(v, "PictureAlbum")
if color == Id {
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetCardListByColor parse id err:%v, key=%s", err, k)
continue
}
k1, _ := strconv.Atoi(k)
r = append(r, k1)
}
}
@ -166,42 +140,24 @@ func GetCardListByColor(Id int) []int {
}
// 获取所有卡牌id
func GetAllCardId(Round int) []int {
func GetAllCardId() []int {
data, err := gamedata.GetData(CARD_DETAIL_CFG_NAME)
if err != nil {
log.Debug("GetAllCardId err:%v, Round=%d", err, Round)
return nil
log.Debug("GetCardListByColor data not found")
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
Extra := gamedata.GetIntValue(v, "Round")
if Round < Extra {
continue
}
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetAllCardId parse id err:%v, key=%s", err, k)
continue
}
var r []int
for k := range data {
k1, _ := strconv.Atoi(k)
r = append(r, k1)
}
return r
}
func CheckCardIsGold(Id int) bool {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, Id)
if err != nil {
log.Debug("CheckCardIsGold err:%v, Id=%d", err, Id)
return false
}
return gamedata.GetIntValue(data, "IsGold") == 1
}
func GetCardDuration() int64 {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "duration")
if err != nil {
log.Debug("GetCardDuration err:%v", err)
return 0
log.Debug("GetCardDuration data not found")
}
return int64(gamedata.GetIntValue(data, "Value"))
}
@ -209,8 +165,7 @@ func GetCardDuration() int64 {
func GetExTimes() int {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "exchange_times")
if err != nil {
log.Debug("GetExTimes err:%v", err)
return 0
log.Debug("GetExTimes data not found")
}
return gamedata.GetIntValue(data, "Value")
}
@ -218,29 +173,7 @@ func GetExTimes() int {
func GetReqTimes() int {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "request_times")
if err != nil {
log.Debug("GetReqTimes err:%v", err)
return 0
log.Debug("GetReqTimes data not found")
}
return gamedata.GetIntValue(data, "Value")
}
func GetItemIdByCardId(CardId int) int {
data, err := gamedata.GetDataByIntKey(CARD_DETAIL_CFG_NAME, CardId)
if err != nil {
log.Debug("GetItemIdByCardId err:%v, CardId=%d", err, CardId)
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetSeasonFirstReward() []*item.Item {
data, err := gamedata.GetDataByKey(CARD_CONST_CFG_NAME, "season_first")
if err != nil {
log.Debug("GetSeasonFirstReward err:%v", err)
return nil
}
if value, ok := data["Value"]; ok {
return item.ParseItem(value)
}
return nil
}

View File

@ -1,155 +0,0 @@
package catnipCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CATNIP_TEMPLATE_CFG_NAME = "CatnipTemplate"
CATNIP_JACKPOT_CFG_NAME = "CatnipJackpot"
CATNIP_MULTIPLIER_CFG_NAME = "CatnipMultiplier"
CATNIP_GAME_CFG_NAME = "CatnipGame"
)
const (
CATNIP_REWARD_TYPE_LOW = 1
CATNIP_REWARD_TYPE_MID = 2
CATNIP_REWARD_TYPE_HIGH = 3
)
func init() {
gamedata.InitCfg(CATNIP_TEMPLATE_CFG_NAME)
gamedata.InitCfg(CATNIP_JACKPOT_CFG_NAME)
gamedata.InitCfg(CATNIP_MULTIPLIER_CFG_NAME)
gamedata.InitCfg(CATNIP_GAME_CFG_NAME)
}
func GetGameNum(Id int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetGameNum err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "PassNum")
}
func GetGameMaxProgress(Id int) int {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
log.Debug("GetGameMaxProgress err:%v, Id=%d", err, Id)
return 0
}
MaxProgress := 0
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != TemplateId {
continue
}
MaxProgress = max(MaxProgress, gamedata.GetIntValue(v, "Need"))
}
return MaxProgress
}
func GetJackpotItem(Mul int) (int, []*item.Item, int, int) {
data, err := gamedata.GetData(CATNIP_JACKPOT_CFG_NAME)
if err != nil {
log.Debug("GetJackpotItem err:%v, Mul=%d", err, Mul)
return 0, nil, 0, 0
}
JackpotType := GetJackpotType(Mul)
r := make(map[int]int, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Type") == JackpotType {
r[GoUtil.Int(k)] = 1
}
}
Id := GoUtil.RandMap(r)
if Id == 0 {
return 0, nil, 0, 0
}
itemData, err := gamedata.GetDataByIntKey(CATNIP_JACKPOT_CFG_NAME, Id)
if err != nil {
log.Debug("GetJackpotItem get itemData err:%v, Id=%d", err, Id)
return 0, nil, 0, 0
}
return Id, gamedata.GetItemList(itemData, "Items"), gamedata.GetIntValue(itemData, "Growth"), gamedata.GetIntValue(itemData, "FriendItems")
}
func GetJackpotType(Mul int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_MULTIPLIER_CFG_NAME, Mul)
if err != nil {
log.Debug("GetJackpotType err:%v, Mul=%d", err, Mul)
return 0
}
R := map[int]int{
CATNIP_REWARD_TYPE_LOW: gamedata.GetIntValue(data, "Low"),
CATNIP_REWARD_TYPE_MID: gamedata.GetIntValue(data, "Mid"),
CATNIP_REWARD_TYPE_HIGH: gamedata.GetIntValue(data, "High"),
}
return GoUtil.RandMap(R)
}
func GetTemplateId(Id int) int {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetTemplateId err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetProgressReward(Id int, Rewards []int, Progress int) ([]*item.Item, []int) {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
log.Debug("GetProgressReward err:%v, Id=%d", err, Id)
return nil, nil
}
Items := make([]*item.Item, 0, len(data))
Ids := make([]int, 0, len(data))
for k, v := range data {
rewardId := GoUtil.Int(k)
if !GoUtil.InArray(rewardId, Rewards) && gamedata.GetIntValue(v, "Need") < Progress && gamedata.GetIntValue(v, "Template") == TemplateId {
Items = append(Items, gamedata.GetItemList(v, "Items")...)
Ids = append(Ids, rewardId)
}
}
return Items, Ids
}
func GetProgressNum(Id int) int {
TemplateId := GetTemplateId(Id)
data, err := gamedata.GetData(CATNIP_GAME_CFG_NAME)
if err != nil {
log.Debug("GetProgressNum err:%v, Id=%d", err, Id)
return 0
}
Num := 0
for _, v := range data {
if gamedata.GetIntValue(v, "Template") == TemplateId {
Num++
}
}
return Num
}
func GetItemCost(Id, Mul int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetItemCost err:%v, Id=%d", err, Id)
return nil
}
return item.MutilItem(gamedata.GetItemList(data, "ItemCost"), Mul)
}
func GetGrandReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CATNIP_TEMPLATE_CFG_NAME, Id)
if err != nil {
log.Debug("GetGrandReward err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Reward")
}

View File

@ -0,0 +1,47 @@
package champshipCfg
import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_CHAMPSHIP_SCORE = "ChampshipScore"
CFG_CHAMPSHIP_RANK = "ChampshipRank"
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
)
func init() {
gamedata.InitCfg(CFG_CHAMPSHIP_SCORE)
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
}
func GetChessScore(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Score")
}
func GetReward(Reward, Score int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
return Reward, nil
}
r := make([]*item.Item, 0)
for k, v := range data {
Id := GoUtil.Int(k)
if Reward >= Id {
continue
}
Reward = max(Reward, Id)
if Score >= gamedata.GetIntValue(v, "Score") {
Items := item.ParseItem(gamedata.GetStringValue(v, "Items"))
r = item.Merge(r, Items)
}
}
return Reward, r
}

View File

@ -1,147 +0,0 @@
package champshipCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
CFG_CHAMPSHIP_SCORE = "ChampshipScore"
CFG_CHAMPSHIP_RANK = "ChampshipRank"
CFG_CHAMPSHIP_JACKPOT = "ChampshipJackpot"
CFG_CHAMPSHIP_GROUP = "ChampshipGroup"
CFG_CHAMPSHIP_CONST = "ChampshipConst"
)
func init() {
gamedata.InitCfg(CFG_CHAMPSHIP_SCORE)
gamedata.InitCfg(CFG_CHAMPSHIP_RANK)
gamedata.InitCfg(CFG_CHAMPSHIP_JACKPOT)
gamedata.InitCfg(CFG_CHAMPSHIP_GROUP)
gamedata.InitCfg(CFG_CHAMPSHIP_CONST)
}
func GetGroupId(N int) int {
data, err := gamedata.GetData(CFG_CHAMPSHIP_GROUP)
if err != nil {
log.Debug("GetGroupId err:%v, N=%d", err, N)
return 1
}
for k, v := range data {
if N >= gamedata.GetIntValue(v, "Min") && N <= gamedata.GetIntValue(v, "Max") {
return GoUtil.Int(k)
}
}
return 11
}
func GetChessScore(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_SCORE, ChessLv)
if err != nil {
log.Debug("GetChessScore err:%v, ChessLv=%d", err, ChessLv)
return 0
}
return gamedata.GetIntValue(data, "Score")
}
func GetReward(Reward, Score, activityId, orderFactor int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
log.Debug("GetReward err:%v, Reward=%d, Score=%d", err, Reward, Score)
return Reward, nil
}
r := make([]*item.Item, 0, len(data))
NewReward := Reward
for _, v := range data {
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if rewardGroupType != activityId {
continue
}
Id := gamedata.GetIntValue(v, "Step")
if Reward >= Id {
continue
}
if Score < gamedata.GetIntValue(v, "Total") {
continue
}
Items := item.ParseItem(gamedata.GetValue(v, "Items"))
r = item.Merge(r, Items)
NewReward = max(NewReward, Id)
starReward := gamedata.GetIntValue(v, "StarReward")
if starReward > 0 {
starnum := int((float64(starReward) * float64(orderFactor) / 500)) * 5
if starnum > 0 {
r = append(r, item.NewItem(item.ITEM_STAR_ID, starnum))
}
}
}
return NewReward, r
}
func GetRewardItems(Reward int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward)
if err != nil {
log.Debug("GetRewardItems err:%v, Reward=%d", err, Reward)
return nil, 0
}
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Score")
}
func GetRewardTotalScore(Reward int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHAMPSHIP_JACKPOT, Reward)
if err != nil {
log.Debug("GetRewardTotalScore err:%v, Reward=%d", err, Reward)
return 0
}
return gamedata.GetIntValue(data, "Total")
}
func GetRankReward(Rank, yesterdayActivityId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHAMPSHIP_RANK)
if err != nil {
log.Debug("GetRankReward err:%v, Rank=%d, yesterdayActivityId=%d", err, Rank, yesterdayActivityId)
return nil
}
for _, v := range data {
if Rank >= gamedata.GetIntValue(v, "Min") && Rank <= gamedata.GetIntValue(v, "Max") && yesterdayActivityId == gamedata.GetIntValue(v, "RewardGroupType") {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
func GetMaxRewardId() int {
data, err := gamedata.GetData(CFG_CHAMPSHIP_JACKPOT)
if err != nil {
log.Debug("GetMaxRewardId err:%v", err)
return 0
}
MaxId := 0
for k := range data {
Id := GoUtil.Int(k)
if Id > MaxId {
MaxId = Id
}
}
return MaxId
}
func GetChampshipActivityId() []int {
data, err := gamedata.GetDataByKey(CFG_CHAMPSHIP_CONST, "RewardGroupType_const")
if err != nil {
log.Debug("GetChampshipActivityId err:%v", err)
return nil
}
value := gamedata.GetStringValue(data, "Value")
var res []int
for _, v := range strings.Split(value, "|") {
id := GoUtil.Int(v)
if id > 0 {
res = append(res, id)
}
}
return res
}

View File

@ -0,0 +1,253 @@
package chargeCfg
import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
"sort"
"strings"
)
const (
CFG_CHARGE = "Charge"
CFG_DIAMOND_SHOP = "DiamondShop"
CFG_ENERGY_SHOP = "EnergyShop"
CFG_SEPCIAL_SHOP = "SpecialShop"
CFG_FREE_SHOP = "FreeShop"
CFG_CHARGE_CONST = "ChargeConst"
CFG_CHARGE_GIFT = "ChargeGift"
)
func init() {
gamedata.InitCfg(CFG_CHARGE)
gamedata.InitCfg(CFG_DIAMOND_SHOP)
gamedata.InitCfg(CFG_ENERGY_SHOP)
gamedata.InitCfg(CFG_SEPCIAL_SHOP)
gamedata.InitCfg(CFG_FREE_SHOP)
gamedata.InitCfg(CFG_CHARGE_CONST)
gamedata.InitCfg(CFG_CHARGE_GIFT)
}
func GetMoneyCharge(ChargeId int) float64 {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
return 0
}
return gamedata.GetFloatValue(data, "Money")
}
func GetDiamondShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_DIAMOND_SHOP)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, gamedata.GetIntValue(v, "Diamond"))}
}
}
return nil
}
func GetEnergyShopId(ChargeId int) int {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
Energy := gamedata.GetIntValue(v, "Energy")
if !First {
Energy += gamedata.GetIntValue(v, "FirstCharge")
}
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Energy)}
}
}
return nil
}
func GetSpecialShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetSpecialShopType(ChargeId int) int {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Type")
}
}
return 0
}
func GetFreeShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId)
if err != nil {
return nil
}
Item := gamedata.GetValue(data, "Items")
return item.ParseItem(Item)
}
func GetSpecialShopGrade(Money float64, Type int) int {
type grade struct {
id int
money float64
}
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
return 0
}
l := make([]grade, 0)
for _, v := range data {
if gamedata.GetIntValue(v, "Type") != Type {
continue
}
l = append(l, grade{
id: gamedata.GetIntValue(v, "Grade"),
money: GetMoneyCharge(gamedata.GetIntValue(v, "ChargeId")),
})
}
sort.Slice(l, func(i, j int) bool {
return l[i].money < l[j].money
})
for _, v := range l {
if Money < v.money {
return v.id
}
}
return 0
}
func GetUnlockShopLv() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetSpecialShopCount() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetAdChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyDuration() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyMaxDia() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyRandDia() (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand")
if err != nil {
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, ",")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.Int(strArr[0]), GoUtil.Int(strArr[1])
}
func GetPiggyBankChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetGiftReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetGiftLimit(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Count")
}
}
return 0
}
func GetGiftId(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetChargeInfo(ChargeId int) (float64, string) {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
return 0, ""
}
return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit")
}

View File

@ -1,418 +0,0 @@
package chargeCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"sort"
"strings"
)
const (
CFG_CHARGE = "Charge"
CFG_DIAMOND_SHOP = "DiamondShop" // 钻石商店
CFG_ENERGY_SHOP = "EnergyShop" // 体力商店
CFG_SEPCIAL_SHOP = "SpecialShop" // 特惠商店
CFG_FREE_SHOP = "FreeShop" // 免费商店
CFG_CHARGE_CONST = "ChargeConst" // 充值常量配置
CFG_CHARGE_GIFT = "ChargeGift" // 充值礼包
CFG_CHARGE_WISH = "ChargeWish" // 许愿配置
CFG_CHARGE_PETCOIN = "ChargePetCoin" // 宠物币充值配置
CFG_CHARGE_AD = "ChargeAD" // 广告充值配置
)
func init() {
gamedata.InitCfg(CFG_CHARGE)
gamedata.InitCfg(CFG_DIAMOND_SHOP)
gamedata.InitCfg(CFG_ENERGY_SHOP)
gamedata.InitCfg(CFG_SEPCIAL_SHOP)
gamedata.InitCfg(CFG_FREE_SHOP)
gamedata.InitCfg(CFG_CHARGE_CONST)
gamedata.InitCfg(CFG_CHARGE_GIFT)
gamedata.InitCfg(CFG_CHARGE_WISH)
gamedata.InitCfg(CFG_CHARGE_PETCOIN)
gamedata.InitCfg(CFG_CHARGE_AD)
}
func GetADReward(ChargeId int) ([]*item.Item, int) {
data, err := gamedata.GetData(CFG_CHARGE_AD)
if err != nil {
log.Debug("GetADReward err:%v, ChargeId=%d", err, ChargeId)
return nil, 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items")), gamedata.GetIntValue(v, "PetWork")
}
}
return nil, 0
}
func GetWeeklyDiscountDay() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_day")
if err != nil {
log.Debug("GetWeeklyDiscountDay err:%v", err)
return -1
}
return gamedata.GetIntValue(data, "Value")
}
func GetMoneyCharge(ChargeId int) float64 {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
log.Debug("GetMoneyCharge err:%v, ChargeId=%d", err, ChargeId)
return 0
}
return gamedata.GetFloatValue(data, "Money")
}
func GetDiamondShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_DIAMOND_SHOP)
if err != nil {
log.Debug("GetDiamondShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return []*item.Item{item.NewItem(item.ITEM_DIAMOND_ID, gamedata.GetIntValue(v, "Diamond"))}
}
}
return nil
}
func GetEnergyShopId(ChargeId int) int {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
log.Debug("GetEnergyShopId err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetWeeklyInfo(Pos int) (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
if err != nil {
log.Debug("GetWeeklyInfo err:%v, Pos=%d", err, Pos)
return 0, 0
}
valueData, ok := data["Value"]
if !ok {
log.Debug("GetWeeklyInfo: Value field not found")
return 0, 0
}
r, ok := valueData.([]interface{})
if !ok {
log.Debug("GetWeeklyInfo: Value is not []interface{}")
return 0, 0
}
for _, v := range r {
v1, ok := v.(map[string]interface{})
if !ok {
continue
}
Id := GoUtil.Int(v1["Id"])
if Id == Pos {
return GoUtil.Int(v1["Discount"]), GoUtil.Int(v1["Limit"])
}
}
return 0, 0
}
func GetWeeklyInfoAll() map[int]gamedata.WeeklyDiscountInfo {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_chess_shop")
if err != nil {
log.Debug("GetWeeklyInfoAll err:%v", err)
return nil
}
valueData, ok := data["Value"]
if !ok {
log.Debug("GetWeeklyInfoAll: Value field not found")
return nil
}
r, ok := valueData.([]interface{})
if !ok {
log.Debug("GetWeeklyInfoAll: Value is not []interface{}")
return nil
}
res := make(map[int]gamedata.WeeklyDiscountInfo, len(r))
for _, v := range r {
v1, ok := v.(map[string]interface{})
if !ok {
continue
}
Id := GoUtil.Int(v1["Id"])
res[Id] = gamedata.WeeklyDiscountInfo{
Id: GoUtil.Int(v1["Id"]),
Discount: GoUtil.Int(v1["Discount"]),
WeeklyLimit: GoUtil.Int(v1["Limit"]),
}
}
return res
}
func GetEnergyShopReward(ChargeId int, First bool) []*item.Item {
data, err := gamedata.GetData(CFG_ENERGY_SHOP)
if err != nil {
log.Debug("GetEnergyShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
Energy := gamedata.GetIntValue(v, "Energy")
if !First {
Energy += gamedata.GetIntValue(v, "FirstCharge")
}
return []*item.Item{item.NewItem(item.ITEM_ENERGY_ID, Energy)}
}
}
return nil
}
func GetSpecialShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
log.Debug("GetSpecialShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetSpecialShopType(ChargeId int) int {
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
log.Debug("GetSpecialShopType err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Type")
}
}
return 0
}
func GetFreeShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FREE_SHOP, ChargeId)
if err != nil {
log.Debug("GetFreeShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
Item := gamedata.GetValue(data, "Items")
return item.ParseItem(Item)
}
func GetSpecialShopGrade(Money float64, Type int) int {
type grade struct {
id int
money float64
}
data, err := gamedata.GetData(CFG_SEPCIAL_SHOP)
if err != nil {
log.Debug("GetSpecialShopGrade err:%v, Money=%.2f, Type=%d", err, Money, Type)
return 0
}
l := make([]grade, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Type") != Type {
continue
}
l = append(l, grade{
id: gamedata.GetIntValue(v, "Grade"),
money: GetMoneyCharge(gamedata.GetIntValue(v, "ChargeId")),
})
}
sort.Slice(l, func(i, j int) bool {
return l[i].money > l[j].money
})
if len(l) == 0 {
return 0
}
maxMoney := 0.0
for _, v := range l {
if Money >= v.money {
maxMoney = max(maxMoney, v.money)
}
}
for _, v := range l {
if v.money == maxMoney {
return v.id
}
}
return l[0].id
}
func GetUnlockShopLv() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "shop_unlock_lv")
if err != nil {
log.Debug("GetUnlockShopLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetSpecialShopCount() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "special_shop_count")
if err != nil {
log.Debug("GetSpecialShopCount err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetAdChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "ad_charge_id")
if err != nil {
log.Debug("GetAdChargeId err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyDuration() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_duration")
if err != nil {
log.Debug("GetPiggyDuration err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyMaxDia() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_max_diamond")
if err != nil {
log.Debug("GetPiggyMaxDia err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPiggyRandDia() (int, int) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_diamond_rand")
if err != nil {
log.Debug("GetPiggyRandDia err:%v", err)
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, ",")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.Int(strArr[0]), GoUtil.Int(strArr[1])
}
func GetPiggyBankChargeId() int {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "pig_charge_id")
if err != nil {
log.Debug("GetPiggyBankChargeId err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetGiftReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
log.Debug("GetGiftReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return item.ParseItem(gamedata.GetValue(v, "Items"))
}
}
return nil
}
func GetGiftLimit(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
log.Debug("GetGiftLimit err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetIntValue(v, "Count")
}
}
return 0
}
func GetGiftId(ChargeId int) int {
data, err := gamedata.GetData(CFG_CHARGE_GIFT)
if err != nil {
log.Debug("GetGiftId err:%v, ChargeId=%d", err, ChargeId)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return GoUtil.Int(k)
}
}
return 0
}
func GetChargeInfo(ChargeId int) (float64, string) {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
log.Debug("GetChargeInfo err:%v, ChargeId=%d", err, ChargeId)
return 0, ""
}
return gamedata.GetFloatValue(data, "Money"), gamedata.GetStringValue(data, "Unit")
}
func GetProduceName(ChargeId int) string {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE, ChargeId)
if err != nil {
log.Debug("GetProduceName err:%v, ChargeId=%d", err, ChargeId)
return ""
}
return gamedata.GetStringValue(data, "Remark")
}
func GetWishCount(ItemId int) int {
data, err := gamedata.GetDataByIntKey(CFG_CHARGE_WISH, ItemId)
if err != nil {
log.Debug("GetWishCount err:%v, ItemId=%d", err, ItemId)
return 0
}
return gamedata.GetIntValue(data, "Wish")
}
func GetPetCoinShopReward(ChargeId int) []*item.Item {
data, err := gamedata.GetData(CFG_CHARGE_PETCOIN)
if err != nil {
log.Debug("GetPetCoinShopReward err:%v, ChargeId=%d", err, ChargeId)
return nil
}
for _, v := range data {
if gamedata.GetIntValue(v, "ChargeId") == ChargeId {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
func GetWeeklyDiscountStartEnd() (int64, int64) {
data, err := gamedata.GetDataByKey(CFG_CHARGE_CONST, "weekly_discount_time")
if err != nil {
log.Debug("GetWeeklyDiscountStartEnd err:%v", err)
return 0, 0
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, "|")
if len(strArr) != 2 {
return 0, 0
}
return GoUtil.ParseTime(strArr[0]), GoUtil.ParseTime(strArr[1])
}

View File

@ -1,67 +0,0 @@
package collectCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_COLLECT = "Collect"
CFG_COLLECT_JACKPOT = "CollectJackpot"
)
func init() {
gamedata.InitCfg(CFG_COLLECT)
gamedata.InitCfg(CFG_COLLECT_JACKPOT)
}
func GetJackpotId() []int {
data, err := gamedata.GetData(CFG_COLLECT_JACKPOT)
if err != nil {
log.Debug("GetJackpotId err:%v", err)
return nil
}
ret := make([]int, 0, len(data))
for k := range data {
ret = append(ret, GoUtil.Int(k))
}
return ret
}
func GetJackpotItems(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_COLLECT_JACKPOT, Id)
if err != nil {
log.Debug("GetJackpotItems err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetRewardNeed(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id)
if err != nil {
log.Debug("GetRewardNeed err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Need")
}
func GetRewardType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_COLLECT, Id)
if err != nil {
log.Debug("GetRewardType err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Type")
}
func GetRewardLen() int {
data, err := gamedata.GetData(CFG_COLLECT)
if err != nil {
log.Debug("GetRewardLen err:%v", err)
return 0
}
return len(data)
}

View File

@ -7,19 +7,18 @@ import (
var (
// log conf
LogFlag = log.LstdFlags | log.Lmicroseconds
LogFlag = log.LstdFlags
// gate conf
PendingWriteNum = 2000 // 客户端链接的写入消息队列长度
MaxMsgLen uint32 = 65536 // 16KB
PendingWriteNum = 2000
MaxMsgLen uint32 = 16384 // 16KB
HTTPTimeout = 10 * time.Second
LenMsgLen = 2
LittleEndian = false
// skeleton conf
// 增加 goroutine 相关配置,避免 "Too many goroutines" 错误
GoLen = 50000 // 从 10000 增加到 50000控制并发 goroutine 数量
TimerDispatcherLen = 50000 // 从 10000 增加到 50000定时器队列长度
AsynCallLen = 50000 // 从 10000 增加到 50000异步调用队列长度
ChanRPCLen = 50000 // 从 10000 增加到 50000RPC 通道长度
GoLen = 10000
TimerDispatcherLen = 10000
AsynCallLen = 10000
ChanRPCLen = 10000
)

View File

@ -0,0 +1,89 @@
package dailyTaskCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
DAILY_TASK_CONST = "DailyTaskConst"
DAILY_TASK = "DailyTask"
DAILY_TASK_ACTIVE = "DailyTaskActive"
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
)
func init() {
gamedata.InitCfg(DAILY_TASK_CONST)
gamedata.InitCfg(DAILY_TASK)
gamedata.InitCfg(DAILY_TASK_ACTIVE)
gamedata.InitCfg(DAILY_TASK_JACKPOT)
}
// 获取任务列表
func GetTaskList(Lv int) map[int]string {
r := make(map[int]string)
data, err := gamedata.GetData(DAILY_TASK)
if err != nil {
log.Debug("GetTaskList get data nil")
return r
}
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
if Lv >= lv {
k1, _ := strconv.Atoi(k)
r[k1] = gamedata.GetStringValue(v, "Task")
}
}
return r
}
func GetTaskActiveId() []int {
data, err := gamedata.GetData(DAILY_TASK_ACTIVE)
if err != nil {
log.Debug("GetTaskActiveId get data nil")
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
Id, _ := strconv.Atoi(k)
r = append(r, Id)
}
return r
}
func GetTaskActiveById(Id int) int {
data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id)
if err != nil {
log.Debug("GetTaskActiveById get data nil")
return 0
}
return gamedata.GetIntValue(data, "Num")
}
type Jackpot struct {
Items []*item.Item
Is_card int
}
func GetTaskWeekJackpot() map[int]Jackpot {
r := make(map[int]Jackpot)
data, err := gamedata.GetData(DAILY_TASK_JACKPOT)
if err != nil {
log.Debug("GetTaskWeekJackpot get data nil")
return r
}
for k, v := range data {
Id, _ := strconv.Atoi(k)
isCard := gamedata.GetIntValue(v, "CardPack")
Item := item.ParseItem(gamedata.GetValue(v, "Items"))
r[Id] = Jackpot{
Items: Item,
Is_card: isCard,
}
}
return r
}

View File

@ -1,161 +0,0 @@
package dailyTaskCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
DAILY_TASK_CONST = "DailyTaskConst"
DAILY_TASK = "DailyTask"
DAILY_TASK_ACTIVE = "DailyTaskActive"
DAILY_TASK_JACKPOT = "DailyTaskJackpot"
DAILY_TASK_REWARD = "DailyTaskReward"
)
func init() {
gamedata.InitCfg(DAILY_TASK_CONST)
gamedata.InitCfg(DAILY_TASK)
gamedata.InitCfg(DAILY_TASK_ACTIVE)
gamedata.InitCfg(DAILY_TASK_JACKPOT)
gamedata.InitCfg(DAILY_TASK_REWARD)
}
func GetDailyTaskReward(Id, activityId int) []*item.Item {
data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil {
log.Debug("GetDailyTaskReward err:%v", err)
return nil
}
for _, v := range data {
sortId := gamedata.GetIntValue(v, "SortId")
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if sortId == Id && rewardGroupType == activityId {
items := gamedata.GetItemList(v, "ItemID")
petCoinBase := gamedata.GetIntValue(v, "PetCoinBase")
if petCoinBase > 0 {
items = append(items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: petCoinBase,
})
}
return items
}
}
return nil
}
func GetDailyTaskScore(Id, activityId int) int {
data, err := gamedata.GetData(DAILY_TASK_REWARD)
if err != nil {
log.Debug("GetDailyTaskScore err:%v", err)
return 0
}
for _, v := range data {
sortId := gamedata.GetIntValue(v, "SortId")
rewardGroupType := gamedata.GetIntValue(v, "RewardGroupType")
if sortId == Id && rewardGroupType == activityId {
return gamedata.GetIntValue(v, "ScoreReward")
}
}
return 0
}
func GetActivityIds() []int {
data, err := gamedata.GetDataByKey(DAILY_TASK_CONST, "RewardGroupType_const")
if err != nil {
log.Debug("GetActivityIds err:%v", err)
return nil
}
str := gamedata.GetStringValue(data, "Value")
strArr := strings.Split(str, "|")
result := make([]int, 0, len(strArr))
for _, v := range strArr {
a, _ := strconv.Atoi(v)
if a != 0 {
result = append(result, a)
}
}
return result
}
// 获取任务列表
func GetTaskList(Lv int) map[int]string {
data, err := gamedata.GetData(DAILY_TASK)
if err != nil {
log.Debug("GetTaskList err:%v, Lv=%d", err, Lv)
return nil
}
r := make(map[int]string, len(data))
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
if Lv >= lv {
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskList parse id err:%v, key=%s", err, k)
continue
}
r[k1] = gamedata.GetStringValue(v, "Task")
}
}
return r
}
func GetTaskActiveId() []int {
data, err := gamedata.GetData(DAILY_TASK_ACTIVE)
if err != nil {
log.Debug("GetTaskActiveId err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskActiveId parse id err:%v, key=%s", err, k)
continue
}
r = append(r, Id)
}
return r
}
func GetTaskActiveById(Id int) int {
data, err := gamedata.GetDataByIntKey(DAILY_TASK_ACTIVE, Id)
if err != nil {
log.Debug("GetTaskActiveById err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Num")
}
type Jackpot struct {
Items []*item.Item
Is_card int
}
func GetTaskWeekJackpot() map[int]Jackpot {
data, err := gamedata.GetData(DAILY_TASK_JACKPOT)
if err != nil {
log.Debug("GetTaskWeekJackpot err:%v", err)
return nil
}
r := make(map[int]Jackpot, len(data))
for k, v := range data {
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskWeekJackpot parse id err:%v, key=%s", err, k)
continue
}
isCard := gamedata.GetIntValue(v, "CardPack")
Item := item.ParseItem(gamedata.GetValue(v, "Items"))
r[Id] = Jackpot{
Items: Item,
Is_card: isCard,
}
}
return r
}

View File

@ -0,0 +1,95 @@
package decorateCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
DECORATE_COST = "DecorateCost"
INDOOR_PROGRESS = "IndoorProgress"
)
func init() {
gamedata.InitCfg("DecorateCost")
gamedata.InitCfg("IndoorProgress")
}
func GetStarCost(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("DecorateCost GetStarCost not found")
return 0
}
for _, v := range data {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["AreaId"]) == AreaId && gamedata.ParseInt(v1["SortId"]) == SortId {
return gamedata.ParseInt(v1["CostCount"])
}
}
return 0
}
func GetAreaId(id int) int {
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
if err != nil {
log.Debug("DecorateCost GetAreaId id:%v not found", id)
return 0
}
return gamedata.ParseInt(value["AreaId"])
}
func GetNextAreaId(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("DecorateCost GetStarCost not found")
return 0
}
for k, v := range data {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["AreaId"]) == AreaId && gamedata.ParseInt(v1["SortId"]) == SortId {
UnionKey, _ := strconv.Atoi(k)
nextId := UnionKey + 1
AreaId = GetAreaId(nextId)
return AreaId
}
}
return 0
}
func GetAllSortIdByAreaId(AreaId int) []int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("DecorateCost GetAllSortIdByAreaId not found")
return nil
}
var SortIdList []int
for _, v := range data {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["AreaId"]) == AreaId {
Sort := gamedata.ParseInt(v1["SortId"])
if Sort == 0 {
continue
}
SortIdList = append(SortIdList, Sort)
}
}
return SortIdList
}
func GetProgressReward(Scene, Lv int) []*item.Item {
value, err := gamedata.GetData("IndoorProgress")
if err != nil {
log.Debug("IndoorProgress GetProgressReward not found")
return nil
}
for _, v := range value {
v1 := v.(map[string]interface{})
if gamedata.ParseInt(v1["Scene"]) == Scene && gamedata.ParseInt(v1["Lv"]) == Lv {
return item.ParseItem(v1["Item"])
}
}
return nil
}

View File

@ -1,255 +0,0 @@
package decorateCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
DECORATE_COST = "DecorateCost"
INDOOR_PROGRESS = "IndoorProgress"
DECORATE_CONST = "DecorateConst"
DECORATE_AREA = "DecorateArea" // 装饰区域
)
func init() {
gamedata.InitCfg(DECORATE_COST)
gamedata.InitCfg(INDOOR_PROGRESS)
gamedata.InitCfg(DECORATE_CONST)
gamedata.InitCfg(DECORATE_AREA)
}
func GetStarCost(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetStarCost err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
return gamedata.GetIntValue(v, "CostCount")
}
}
return 0
}
func GetStarCostByAreaId(AreaId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetStarCost err:%v, AreaId=%d", err, AreaId)
return 0
}
var total int
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId {
total += gamedata.GetIntValue(v, "CostCount")
}
}
return total
}
func GetAreaId(id int) int {
value, err := gamedata.GetDataByIntKey("DecorateCost", id)
if err != nil {
log.Debug("GetAreaId err:%v, id=%d", err, id)
return 0
}
return gamedata.GetIntValue(value, "AreaId")
}
func GetNextAreaId(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetNextAreaId err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
UnionKey, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetNextAreaId parse key err:%v, key=%s", err, k)
return 0
}
nextId := UnionKey + 1
AreaId = GetAreaId(nextId)
return AreaId
}
}
return 0
}
func GetAllSortIdByAreaId(AreaId int) []int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetAllSortIdByAreaId err:%v, AreaId=%d", err, AreaId)
return nil
}
SortIdList := make([]int, 0, len(data)/5)
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId {
Sort := gamedata.GetIntValue(v, "SortId")
if Sort == 0 {
continue
}
SortIdList = append(SortIdList, Sort)
}
}
return SortIdList
}
func GetProgressReward(Scene, Lv int) []*item.Item {
value, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetProgressReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv)
return nil
}
for _, v := range value {
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
return gamedata.GetItemList(v, "AreaReward")
}
}
return nil
}
func GetDecoarteReward(Scene int, Lv int) []*item.Item {
value, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetDecoarteReward err:%v, Scene=%d, Lv=%d", err, Scene, Lv)
return nil
}
for _, v := range value {
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
return gamedata.GetItemList(v, "Item")
}
}
return nil
}
func GetAreaReward(AreaId int) []*item.Item {
value, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
if err != nil {
log.Debug("GetAreaReward err:%v, AreaId=%d", err, AreaId)
return nil
}
return gamedata.GetItemList(value, "Items")
}
// 获取一键装饰的解锁等级
func GetOneKeyDecorateUnlockLv() int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "OneKey")
if err != nil {
log.Debug("GetOneKeyDecorateUnlockLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
// 获取每次装饰增加的体力值
func GetDecorateAddEnergy() int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AddEnergy")
if err != nil {
log.Debug("GetDecorateAddEnergy err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetAreaPerPExp(AreaId int) int {
data, err := gamedata.GetDataByIntKey(DECORATE_AREA, AreaId)
if err != nil {
log.Debug("GetAreaPerPExp err:%v, AreaId=%d", err, AreaId)
return 0
}
return gamedata.GetIntValue(data, "PerPExp")
}
func GetDecoratePExp(AreaId, SortId int) int {
data, err := gamedata.GetData(DECORATE_COST)
if err != nil {
log.Debug("GetDecoratePExp err:%v, AreaId=%d, SortId=%d", err, AreaId, SortId)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "AreaId") == AreaId && gamedata.GetIntValue(v, "SortId") == SortId {
return gamedata.GetIntValue(v, "PetExp")
}
}
return 0
}
func GetAllPartId() []int {
data, err := gamedata.GetDataByKey(DECORATE_CONST, "AllPartId")
if err != nil {
log.Debug("GetAllPartId err:%v", err)
return nil
}
str := gamedata.GetStringValue(data, "Value")
r1 := strings.Split(str, "|")
PartIdList := make([]int, 0, len(r1))
for _, v := range r1 {
id, err := strconv.Atoi(v)
if err != nil {
log.Debug("GetAllPartId parse id err:%v, v=%s", err, v)
continue
}
PartIdList = append(PartIdList, id)
}
return PartIdList
}
func GetIdBySenceAndLv(Sence, Lv int) int {
data, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetIdBySenceAndLv err:%v, Sence=%d, Lv=%d", err, Sence, Lv)
return 0
}
for k, v := range data {
if gamedata.GetIntValue(v, "Scene") == Sence && gamedata.GetIntValue(v, "Lv") == Lv {
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetIdBySenceAndLv parse id err:%v, key=%s", err, k)
return 0
}
return id
}
}
return 0
}
func GetPartNumByAreaId(AreaId int) map[int]int {
data, err := gamedata.GetData(INDOOR_PROGRESS)
if err != nil {
log.Debug("GetPartNumByAreaId err:%v, AreaId=%d", err, AreaId)
return nil
}
res := make(map[int]int, len(data))
for k, v := range data {
Sence := gamedata.GetIntValue(v, "Scene")
if Sence != AreaId {
continue
}
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetPartNumByAreaId parse id err:%v, key=%s", err, k)
continue
}
PartNum := gamedata.GetIntValue(v, "Part")
if PartNum == 0 {
continue
}
res[id] = PartNum
}
return res
}
func GetAreaIdByIndoorId(IndoorId int) int {
data, err := gamedata.GetDataByIntKey(INDOOR_PROGRESS, IndoorId)
if err != nil {
log.Debug("GetAreaIdByIndoorId err:%v, IndoorId=%d", err, IndoorId)
return 0
}
return gamedata.GetIntValue(data, "Scene")
}

View File

@ -1,53 +0,0 @@
package emojiCfg
import (
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_EMOJI = "Emoji"
)
func init() {
gamedata.InitCfg(CFG_EMOJI)
}
func GetInitList() []int {
data, err := gamedata.GetData(CFG_EMOJI)
if err != nil {
log.Debug("GetInitList err:%v", err)
return nil
}
ret := make([]int, 0, len(data))
for k, v := range data {
Init := gamedata.GetIntValue(v, "Init")
if Init == 1 {
ret = append(ret, GoUtil.Int(k))
}
}
return ret
}
func GetAllList() []int {
data, err := gamedata.GetData(CFG_EMOJI)
if err != nil {
log.Debug("GetAllList err:%v", err)
return nil
}
ret := make([]int, 0, len(data))
for k := range data {
ret = append(ret, GoUtil.Int(k))
}
return ret
}
func GetEmojiName(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_EMOJI, Id)
if err != nil {
log.Debug("GetEmojiName err:%v, Id=%d", err, Id)
return ""
}
return gamedata.GetStringValue(data, "Name")
}

View File

@ -3,7 +3,6 @@ package endlessCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
@ -16,15 +15,14 @@ func init() {
gamedata.InitCfg(CFG_ENDLESS_JACKPOT)
}
func GetEnergy(Money float64) float64 {
func GetDiamond(Money float64) float64 {
data, err := gamedata.GetData(CFG_ENDLESS)
if err != nil {
log.Debug("GetEnergy err:%v, Money=%.2f", err, Money)
return 0
}
for _, v := range data {
if Money == gamedata.GetFloatValue(v, "Money") {
return gamedata.GetFloatValue(v, "Energy")
return gamedata.GetFloatValue(v, "Diamond")
}
}
return 0
@ -33,7 +31,6 @@ func GetEnergy(Money float64) float64 {
func NextMoney(Money float64) float64 {
data, err := gamedata.GetData(CFG_ENDLESS)
if err != nil {
log.Debug("NextMoney err:%v, Money=%.2f", err, Money)
return 0
}
for _, v := range data {
@ -47,7 +44,6 @@ func NextMoney(Money float64) float64 {
func GetChargeId(Money float64) int {
data, err := gamedata.GetData(CFG_ENDLESS)
if err != nil {
log.Debug("GetChargeId err:%v, Money=%.2f", err, Money)
return 0
}
for _, v := range data {
@ -58,29 +54,27 @@ func GetChargeId(Money float64) int {
return 0
}
func GetPerEnergy(Id int) float64 {
func GetPerDiamond(Id int) float64 {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetPerEnergy err:%v, Id=%d", err, Id)
return 0
}
for _, v := range data {
if Id == gamedata.GetIntValue(v, "ItemId") {
return gamedata.GetFloatValue(v, "Energy")
return gamedata.GetFloatValue(v, "Diamond")
}
}
return 0
}
func GetItemId(Energy float64, Type, Lv int) []int {
func GetItemId(Diamond float64, Type int) []int {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetItemId err:%v, Energy=%.2f, Type=%d, Lv=%d", err, Energy, Type, Lv)
return nil
}
ItemId := make([]int, 0, len(data))
var ItemId []int
for _, v := range data {
if Lv >= gamedata.GetIntValue(v, "Lv") && Energy >= gamedata.GetFloatValue(v, "Energy") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID {
if Diamond >= gamedata.GetFloatValue(v, "Diamond") && Type != gamedata.GetIntValue(v, "Type") && gamedata.GetIntValue(v, "ItemId") != item.ITEM_ENERGY_ID {
ItemId = append(ItemId, gamedata.GetIntValue(v, "ItemId"))
}
}
@ -90,7 +84,6 @@ func GetItemId(Energy float64, Type, Lv int) []int {
func GetType(ItemId int) int {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetType err:%v, ItemId=%d", err, ItemId)
return 0
}
for _, v := range data {
@ -101,15 +94,14 @@ func GetType(ItemId int) int {
return 0
}
func GetEnergyByItemId(ItemId int) float64 {
func GeDiamondByItemId(ItemId int) float64 {
data, err := gamedata.GetData(CFG_ENDLESS_JACKPOT)
if err != nil {
log.Debug("GetEnergyByItemId err:%v, ItemId=%d", err, ItemId)
return 0
}
for _, v := range data {
if ItemId == gamedata.GetIntValue(v, "ItemId") {
return gamedata.GetFloatValue(v, "Energy")
return gamedata.GetFloatValue(v, "Diamond")
}
}
return 0

View File

@ -0,0 +1,42 @@
package faceCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_FACE = "Face"
)
func init() {
gamedata.InitCfg(CFG_FACE)
}
func GetInitList() []int {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("GetInitList err: %v", err)
return nil
}
r := make([]int, 0)
for k, v := range data {
IsInit := gamedata.GetIntValue(v, "Init")
if IsInit == 1 {
k, _ := strconv.Atoi(k)
r = append(r, k)
}
}
return r
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("CheckExist err: %v", err)
return false
}
_, ok := data[strconv.Itoa(Id)]
return ok
}

View File

@ -1,74 +0,0 @@
package faceCfg
import (
"math/rand"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
CFG_FACE = "Face"
)
func init() {
gamedata.InitCfg(CFG_FACE)
}
func GetInitList() []int {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("GetInitList err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k, v := range data {
IsInit := gamedata.GetIntValue(v, "Init")
if IsInit == 1 {
id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetInitList parse id err:%v, key=%s", err, k)
continue
}
r = append(r, id)
}
}
return r
}
func GetRandInitId() int {
list := GetInitList()
if len(list) == 0 {
return 0
}
index := rand.Intn(len(list))
return list[index]
}
func CheckExist(Id int) bool {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("CheckExist err:%v, Id=%d", err, Id)
return false
}
_, ok := data[strconv.Itoa(Id)]
return ok
}
func GetAllId() []int {
data, err := gamedata.GetData(CFG_FACE)
if err != nil {
log.Debug("GetAllId err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetAllId parse id err:%v, key=%s", err, k)
continue
}
r = append(r, Id)
}
return r
}

View File

@ -1,70 +0,0 @@
package friendCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_NPC_FRIENDS = "NPCFriends"
CFG_CONST = "FriendConst"
)
func init() {
gamedata.InitCfg(CFG_NPC_FRIENDS)
gamedata.InitCfg(CFG_CONST)
}
func IsNpcFriend(Id int) bool {
_, err := gamedata.GetDataByIntKey(CFG_NPC_FRIENDS, Id)
if err != nil {
log.Debug("IsNpcFriend err:%v, Id=%d", err, Id)
return false
}
return true
}
func GetFriendSponsorNum() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_energy_bonus")
if err != nil {
log.Debug("GetFriendSponsorNum err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFriendLimitNum() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_limit")
if err != nil {
log.Debug("GetFriendLimitNum err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDailyRecommendLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_recommend_limit")
if err != nil {
log.Debug("GetDailyRecommendLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetApplyListLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_apply_list_limit")
if err != nil {
log.Debug("GetApplyListLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDailyGetApplyLimit() int {
data, err := gamedata.GetDataByKey(CFG_CONST, "friend_daily_get_apply_limit")
if err != nil {
log.Debug("GetDailyGetApplyLimit err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -1,87 +0,0 @@
package friendTreasureCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
)
const (
CFG_FRIEND_TREASURE_PROB = "FriendTreasureProb"
CFG_FRIEND_TREASURE_CHEST = "FriendTreasureChest"
CFG_FRIEND_TREASURE_CONST = "FriendTreasureConst"
)
func init() {
gamedata.InitCfg(CFG_FRIEND_TREASURE_PROB)
gamedata.InitCfg(CFG_FRIEND_TREASURE_CHEST)
gamedata.InitCfg(CFG_FRIEND_TREASURE_CONST)
}
func GetBigReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_FRIEND_TREASURE_CONST, "big_reward")
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Value")
}
func GetFriendTreasureProb(Num int) map[int]int {
data, err := gamedata.GetData(CFG_FRIEND_TREASURE_PROB)
if err != nil {
return nil
}
ProbMap := make(map[int]int)
for k, v := range data {
Id := GoUtil.Int(k)
Prob := gamedata.GetIntValue(v, "Prob")
ProbMap[Id] = Prob
}
AddProb := 0
n := 0
for k, v := range ProbMap {
if k > Num {
AddProb += v
n++
ProbMap[k] = 0
}
}
PerProb := AddProb / n
for k, v := range ProbMap {
if k <= Num && k != 1 {
ProbMap[k] = v + PerProb
}
}
return ProbMap
}
func GetProbAdd(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_FRIEND_TREASURE_PROB, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Add")
}
func GetChestProb() map[int]int {
data, err := gamedata.GetData(CFG_FRIEND_TREASURE_CHEST)
if err != nil {
return nil
}
ProbMap := make(map[int]int)
for k, v := range data {
Id := GoUtil.Int(k)
Prob := gamedata.GetIntValue(v, "Prob")
ProbMap[Id] = Prob
}
return ProbMap
}
func GetChestItems(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FRIEND_TREASURE_CHEST, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Items")
}

View File

@ -1,73 +0,0 @@
package fur_cfg
import (
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_FUR_CONST = "FurShopConst"
CFG_FUR_SHOP = "FurShop"
)
func init() {
gamedata.InitCfg(CFG_FUR_CONST)
gamedata.InitCfg(CFG_FUR_SHOP)
}
func GetFurShopCost(id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Cost")
}
func GetFurShopFreeTimes() int {
data, err := gamedata.GetDataByKey(CFG_FUR_CONST, "free_unlock")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFurShopTag(id int) int {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "TAG")
}
func GetFurShopName(id int) string {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetFurShopItem(id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_FUR_SHOP, id)
if err != nil {
return nil
}
itemId := gamedata.GetIntValue(data, "ItemID")
if itemId == 0 {
return nil
}
return []*item.Item{
{
Id: itemId,
Num: 1,
},
}
}
func GetFurShopCostNum(id int) int {
item := GetFurShopCost(id)
if len(item) == 0 {
return 0
}
return item[0].Num
}

View File

@ -1,118 +0,0 @@
package guesscolorCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
CFG_GUESS_COLOR_TEMPLATE = "GuessColorTemplate"
CFG_GUESS_COLOR_REWARD = "GuessColorReward"
)
func init() {
gamedata.InitCfg(CFG_GUESS_COLOR_TEMPLATE)
gamedata.InitCfg(CFG_GUESS_COLOR_REWARD)
}
func GetFirstPass(Id int) map[int]int {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetFirstPass err:%v, Id=%d", err, Id)
return nil
}
str := gamedata.GetStringValue(data, "FirstPass")
arr := strings.Split(str, "|")
ret := make(map[int]int, len(arr))
for k, v := range arr {
ret[k+1] = GoUtil.Int(v)
}
return ret
}
func GetLoseItem(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetLoseItem err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "ItemCost")
}
func GetFirstItem(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetFirstItem err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "FirstItem")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_GUESS_COLOR_TEMPLATE, Id)
if err != nil {
log.Debug("GetActivityItemId err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetRewardItem(Id int, Type int) []*item.Item {
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
if err != nil {
log.Debug("GetRewardItem err:%v, Id=%d, Type=%d", err, Id, Type)
return nil
}
for k, v := range data {
min := GoUtil.Int(k)
max := gamedata.GetIntValue(v, "Max")
if Id >= min && Id <= max {
if Type == 1 {
return gamedata.GetItemList(v, "Items1")
}
return gamedata.GetItemList(v, "Items2")
}
}
return nil
}
func GetPassNum(Id int) int {
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
if err != nil {
log.Debug("GetPassNum err:%v, Id=%d", err, Id)
return 0
}
for k, v := range data {
min := GoUtil.Int(k)
max := gamedata.GetIntValue(v, "Max")
if Id >= min && Id <= max {
return gamedata.GetIntValue(v, "Num")
}
}
return 0
}
func GetWinTime(Id int) int {
data, err := gamedata.GetData(CFG_GUESS_COLOR_REWARD)
if err != nil {
log.Debug("GetWinTime err:%v, Id=%d", err, Id)
return 0
}
for k, v := range data {
min := GoUtil.Int(k)
max := gamedata.GetIntValue(v, "Max")
if Id >= min && Id <= max {
Type := gamedata.GetIntValue(v, "Type")
if Type == 1 {
return gamedata.GetIntValue(v, "Win")
}
str := gamedata.GetStringValue(v, "Win")
arr := strings.Split(str, "|")
return GoUtil.RandNum(GoUtil.Int(arr[0]), GoUtil.Int(arr[1]))
}
}
return 0
}

View File

@ -1,119 +0,0 @@
package GuideTaskCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
)
const (
GUIDE_TASK_CONST = "GuideTaskConst"
GUIDE_TASK_TASK = "GuideTaskTask"
GUIDE_TASK_ACTIVE = "GuideTaskActive"
)
func init() {
gamedata.InitCfg(GUIDE_TASK_CONST)
gamedata.InitCfg(GUIDE_TASK_TASK)
gamedata.InitCfg(GUIDE_TASK_ACTIVE)
}
func GetTaskRewardById(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetTaskRewardById err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetTaskById(Id int) string {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetTaskById err:%v, Id=%d", err, Id)
return ""
}
return gamedata.GetStringValue(data, "Task")
}
func GetTaskActive(Id int) int {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetTaskActive err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Active")
}
func GetUnlock(Id int) int {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_TASK, Id)
if err != nil {
log.Debug("GetUnlock err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Unlock")
}
func GetActiveReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUIDE_TASK_ACTIVE, Id)
if err != nil {
log.Debug("GetActiveReward err:%v, Id=%d", err, Id)
return nil, 0
}
return gamedata.GetItemList(data, "Items"), gamedata.GetIntValue(data, "Active")
}
func GetActiveReward2(reward []int, Active int) []*item.Item {
data, err := gamedata.GetData(GUIDE_TASK_ACTIVE)
if err != nil {
log.Debug("GetActiveReward2 err:%v, Active=%d", err, Active)
return nil
}
for k, v := range data {
active := gamedata.GetIntValue(v, "Active")
if active < Active {
continue
}
if GoUtil.InArray(GoUtil.Int(k), reward) {
continue
}
return gamedata.GetItemList(v, "Items")
}
return nil
}
func GetUnlockLv() int {
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "UnlockLv")
if err != nil {
log.Debug("GetUnlockLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDays() int {
data, err := gamedata.GetDataByKey(GUIDE_TASK_CONST, "Days")
if err != nil {
log.Debug("GetDays err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetTaskList(Lv int) map[int]string {
data, err := gamedata.GetData(GUIDE_TASK_TASK)
if err != nil {
log.Debug("GetTaskList err:%v, Lv=%d", err, Lv)
return nil
}
r := make(map[int]string, len(data))
for k, v := range data {
k1, err := strconv.Atoi(k)
if err != nil {
log.Debug("GetTaskList parse id err:%v, key=%s", err, k)
continue
}
r[k1] = gamedata.GetStringValue(v, "Task")
}
return r
}

View File

@ -1,4 +1,4 @@
package guidecfg
package guildCfg
import (
"server/game/mod/item"
@ -7,17 +7,17 @@ import (
)
const (
GUIDE_REWARD = "GuideReward"
GUILD_REWARD = "GuildReward"
)
func init() {
gamedata.InitCfg(GUIDE_REWARD)
gamedata.InitCfg(GUILD_REWARD)
}
func GetGuideReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUIDE_REWARD, Id)
func GetGuildReward(Id int) ([]*item.Item, int) {
data, err := gamedata.GetDataByIntKey(GUILD_REWARD, Id)
if err != nil {
log.Debug("GetGuideReward err:%v, Id=%d", err, Id)
log.Debug("GuildCfg GetGuildReward Id:%v not found", Id)
return nil, 0
}
return item.ParseItem(gamedata.GetValue(data, "Items")), gamedata.GetIntValue(data, "Num")

View File

@ -1,35 +0,0 @@
package handbookCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_HANDBOOK = "Handbook"
CFG_HANDBOOK_CONST = "HandbookConst"
)
func init() {
gamedata.InitCfg(CFG_HANDBOOK)
gamedata.InitCfg(CFG_HANDBOOK_CONST)
}
func GetHandbookReward(Type string) []*item.Item {
data, err := gamedata.GetDataByKey(CFG_HANDBOOK, Type)
if err != nil {
log.Debug("GetHandbookReward err:%v, Type=%s", err, Type)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetHandbookCollectReward() []*item.Item {
data, err := gamedata.GetDataByKey(CFG_HANDBOOK_CONST, "collect_item")
if err != nil {
log.Debug("GetHandbookCollectReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Value")
}

View File

@ -1,24 +0,0 @@
package inviteCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_INVITE = "Invite"
)
func init() {
gamedata.InitCfg(CFG_INVITE)
}
func GetInviteReward(index int) (int, []*item.Item) {
data, err := gamedata.GetDataByIntKey(CFG_INVITE, index)
if err != nil {
log.Debug("GetInviteReward err:%v, index=%d", err, index)
return 0, nil
}
return gamedata.GetIntValue(data, "Need"), gamedata.GetItemList(data, "Items")
}

View File

@ -0,0 +1,48 @@
package itemCfg
import (
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
var CFG_NAME = "Item"
func init() {
gamedata.InitCfg(CFG_NAME)
}
func GetItemType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("ItemCfg GetItemType Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["IType"])
}
func GetItemEffect(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("ItemCfg GetItemEffect Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["Effect"])
}
func GetItemEffectList(Id int) []int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("ItemCfg GetItemEffect Id:%v not found", Id)
return []int{}
}
var res []int
str := gamedata.GetStringValue(data, "Effect")
a := strings.Split(str, ",")
for _, v := range a {
b, _ := strconv.Atoi(v)
res = append(res, b)
}
return res
}

View File

@ -1,64 +0,0 @@
package itemCfg
import (
languageCfg "server/conf/language"
"server/gamedata"
"server/msg"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
var CFG_NAME = "Item"
func init() {
gamedata.InitCfg(CFG_NAME)
}
func GetItemType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemType err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "IType")
}
func GetItemEffect(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemEffect err:%v, Id=%d", err, Id)
return 0
}
return gamedata.GetIntValue(data, "Effect")
}
func GetItemEffectList(Id int) []int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemEffectList err:%v, Id=%d", err, Id)
return nil
}
str := gamedata.GetStringValue(data, "Effect")
a := strings.Split(str, ",")
res := make([]int, 0, len(a))
for _, v := range a {
b, err := strconv.Atoi(v)
if err != nil {
log.Debug("GetItemEffectList parse err:%v, v=%s", err, v)
continue
}
res = append(res, b)
}
return res
}
func GetItemName(Id int) (string, string) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetItemName err:%v, Id=%d", err, Id)
return "", ""
}
name := gamedata.GetStringValue(data, "Name")
return languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, name), languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, name)
}

View File

@ -9,12 +9,9 @@ import (
)
var Server struct {
AppID int
AppPath string
LogLevel string
LogPath string
WSAddr string
RPCAddr string
CertFile string
KeyFile string
TCPAddr string
@ -31,12 +28,6 @@ var Server struct {
RedisAddr string
RedisPort string
RedisPwd string
RedisDb int
RedisWriteAddr string // 主写地址host:port 或 单独 host, 仍兼容旧 RedisAddr/RedisPort
RedisReadAddrs string // 只读地址逗号分隔host:port,...
RedisMasterName string // 哨兵模式下的 master 名称
RedisConnType string // "Direct" 或 "Sentinel"
GameName string
ServerType string
@ -48,28 +39,13 @@ var Server struct {
ListenAddr string
CenterAddr string
CenterNode int
RemoteAddr string
GameConfPath string
TELOGDIR string
GoogleVerify bool
Partition int
KafkaHost string
KafkaPort string
Version string
CountryCode string
IdVerify bool
RemoteAddr string
}
func init() {
filePath := "conf/server.json"
if len(os.Args) == 2 {
if os.Args[1] != "" && os.Args[1][0] != '-' {
filePath = os.Args[1]
}
}
file, err := os.Open(filePath)
// data, err := ioutil.ReadFile("conf/server.json")
file, err := os.Open("conf/server.json")
if err != nil {
panic(err)
}

View File

@ -1,64 +0,0 @@
package languageCfg
import (
"server/gamedata"
"server/msg"
)
const (
CFG_LANGUAGE = "LanguageData"
CFG_ALLLANGUAGE = "AllLanguage"
CFG_ALLLANGUAGE_CLIENT = "AllLanguageClient"
)
func init() {
gamedata.InitCfg(CFG_LANGUAGE)
gamedata.InitCfg(CFG_ALLLANGUAGE)
gamedata.InitCfg(CFG_ALLLANGUAGE_CLIENT)
}
func GetLanguage(lang msg.LANG_TYPE, key string) string {
res := _GetClientLanguage(lang, key)
if res != key {
return res
}
return _GetBackendLanguage(lang, key)
}
func _GetClientLanguage(lang msg.LANG_TYPE, key string) string {
data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE_CLIENT, key)
if err != nil {
return key
}
switch lang {
case msg.LANG_TYPE_LANG_EN:
return gamedata.GetStringValue(data, "en_US")
case msg.LANG_TYPE_LANG_PTBR:
return gamedata.GetStringValue(data, "pt_BR")
case msg.LANG_TYPE_LANG_CN:
return gamedata.GetStringValue(data, "zh_CN")
case msg.LANG_TYPE_LANG_ES_LATAM:
return gamedata.GetStringValue(data, "es_LATAM")
default:
return key
}
}
func _GetBackendLanguage(lang msg.LANG_TYPE, key string) string {
data, err := gamedata.GetDataByKey(CFG_ALLLANGUAGE, key)
if err != nil {
return key
}
switch lang {
case msg.LANG_TYPE_LANG_EN:
return gamedata.GetStringValue(data, "en_US")
case msg.LANG_TYPE_LANG_PTBR:
return gamedata.GetStringValue(data, "pt_BR")
case msg.LANG_TYPE_LANG_CN:
return gamedata.GetStringValue(data, "zh_CN")
case msg.LANG_TYPE_LANG_ES_LATAM:
return gamedata.GetStringValue(data, "es_LATAM")
default:
return key
}
}

View File

@ -0,0 +1,219 @@
package limitedTimeEventCfg
import (
"server/GoUtil"
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
CFG_LIMITED_TIME_EVENT = "LimitedTimeEvent"
CFG_LIMITED_TIME_EVENT_METEOR = "LimitedTimeEventMeteor"
CFG_LIMITED_TIME_EVENT_CHEST = "LimitedTimeEventChest"
CFG_LIMITED_TIME_EVENT_ORDER = "LimitedTimeEventOrder"
CFG_LIMITED_TIME_EVENT_SENCE = "LimitedTimeEventSence"
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
)
func init() {
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_METEOR)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_ORDER)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_FAST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
}
// 获取限时事件触发列表
func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT)
if err != nil {
log.Debug("GetLimitedTimeEventCfg err:%v", err)
return nil
}
var res []*gamedata.LimitedTimeEventData
Day, Hour := GoUtil.GetWeekdayAndHour()
for k, v := range data {
weekDay := gamedata.GetIntValue(v, "WeekDay")
startTime := gamedata.GetIntValue(v, "StartTime")
endTime := gamedata.GetIntValue(v, "EndTime")
if weekDay == Day && Hour >= startTime && Hour < endTime {
Id, _ := strconv.Atoi(k)
res = append(res, &gamedata.LimitedTimeEventData{
Id: Id,
EventId: gamedata.GetIntValue(v, "EventId"),
Duration: int64(gamedata.GetIntValue(v, "Duration")),
})
}
}
return res
}
// 获取流星雨加成
func GetMeteorAdd(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv)
if err != nil {
log.Debug("GetMeteorAdd err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Add")
}
// 获取宝箱雨奖励
func GetChestReward(Star int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
if err != nil {
log.Debug("GetChestReward err:%v", err)
return nil
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取超级订单奖励
func GetSuperOrderReward(Star int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER)
if err != nil {
log.Debug("GetSuperOrderReward err:%v", err)
return nil
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取场景冲刺奖励
func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE)
if err != nil {
log.Debug("GetSceneDashReward err:%v", err)
return 0, nil
}
for k, v := range data {
if Sence == gamedata.GetIntValue(v, "Sence") && Progress == gamedata.GetIntValue(v, "Progress") {
return GoUtil.Int(k), gamedata.GetItemList(v, "Items")
}
}
return 0, nil
}
func GetSenceJackpotProb() map[int]int {
r := make(map[int]int)
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
if err != nil {
log.Debug("GetSenceJackpotReward err:%v", err)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
return r
}
func GetSenceJackpotReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id)
if err != nil {
log.Debug("GetSenceJackpotReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Items")
}
// 获取连击快手奖励
func GetFastProduceReward(Times, Energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil {
log.Debug("GetSceneDashReward err:%v", err)
return nil
}
for _, v := range data {
if Times == gamedata.GetIntValue(v, "Times") && Energy <= gamedata.GetIntValue(v, "Max") && Energy >= gamedata.GetIntValue(v, "Min") {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
func GetProgressMax() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Progress_max")
if err != nil {
log.Debug("GetProgressMax err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "value")
}
func GetProgressRewardRand(Lv int) map[int]int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressRewardRand err:%v", err)
return nil
}
r := make(map[int]int)
for k, v := range data {
if Lv >= gamedata.GetIntValue(v, "Min") && Lv <= gamedata.GetIntValue(v, "Max") {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
}
return r
}
func GetProgressSelectNum(Lv int) int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Progress_lv_num")
if err != nil {
log.Debug("GetProgressSelectNum err:%v", err)
return 0
}
Str := gamedata.GetStringValue(data, "value")
Strarr := strings.Split(Str, ";")
for _, v := range Strarr {
a := strings.Split(v, ",")
if len(a) != 3 {
continue
}
Min, _ := strconv.Atoi(a[0])
Max, _ := strconv.Atoi(a[1])
if Lv >= Min && Lv <= Max {
Num, _ := strconv.Atoi(a[2])
return Num
}
}
return 0
}
func GetProgressReward(RewardId int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressReward err:%v", err)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
if Id == RewardId {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}

View File

@ -1,456 +0,0 @@
package limitedTimeEventCfg
import (
"math"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"sort"
"strings"
)
const (
CFG_LIMITED_TIME_EVENT = "LimitedTimeEvent"
CFG_LIMITED_TIME_EVENT_METEOR = "LimitedTimeEventMeteor"
CFG_LIMITED_TIME_EVENT_CHEST = "LimitedTimeEventChest"
CFG_LIMITED_TIME_EVENT_ORDER = "LimitedTimeEventOrder"
CFG_LIMITED_TIME_EVENT_SENCE = "LimitedTimeEventSence"
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT = "LimitedTimeEventChestJackpot"
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
CFG_LIMITED_TIME_EVENT_BONUS = "LimitedTimeEventBonus"
CFG_LIMITED_TIME_EVENT_MONEY = "LimitedTimeEventMoney"
CFG_LIMITED_TIME_EVENT_LUCKY = "LimitedTimeEventLucky"
CFG_LIMTTED_TIME_EVENT_DECORATE_OFF = "LimitedTimeEventDecorateOff"
)
func init() {
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_METEOR)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_ORDER)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_FAST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_BONUS)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_MONEY)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_LUCKY)
gamedata.InitCfg(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF)
}
// 获取限时事件触发列表
func GetLimitedTimeEventCfg() []*gamedata.LimitedTimeEventData {
return nil
}
func GetEventName(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT, Id)
if err != nil {
log.Debug("GetEventName err:%v, Id=%d", err, Id)
return ""
}
return gamedata.GetStringValue(data, "Name")
}
// 获取流星雨加成
func GetMeteorAdd(ChessLv int) int {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_METEOR, ChessLv)
if err != nil {
log.Debug("GetMeteorAdd err:%v, ChessLv=%d", err, ChessLv)
return 0
}
return gamedata.GetIntValue(data, "Add")
}
// 获取宝箱雨奖励
func GetChestReward(Star int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
if err != nil {
log.Debug("GetChestReward err:%v, Star=%d", err, Star)
return nil
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取超级订单奖励
func GetSuperOrderReward(energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_ORDER)
if err != nil {
log.Debug("GetSuperOrderReward err:%v, energy=%d", err, energy)
return nil
}
star := energy
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if star >= Min && star <= Max {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取场景冲刺奖励
func GetSceneDashReward(Sence, Progress int) (int, []*item.Item) {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE)
if err != nil {
log.Debug("GetSceneDashReward err:%v, Sence=%d, Progress=%d", err, Sence, Progress)
return 0, nil
}
for k, v := range data {
if Sence == gamedata.GetIntValue(v, "Sence") && Progress == gamedata.GetIntValue(v, "Progress") {
return GoUtil.Int(k), gamedata.GetItemList(v, "Items")
}
}
return 0, nil
}
// 获取场景冲刺奖池
func GetSenceJackpotProb() map[int]int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT)
if err != nil {
log.Debug("GetSenceJackpotProb err:%v", err)
return nil
}
r := make(map[int]int, len(data))
for k, v := range data {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
return r
}
// 获取场景冲刺奖励
func GetSenceJackpotReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT, Id)
if err != nil {
log.Debug("GetSenceJackpotReward err:%v, Id=%d", err, Id)
return nil
}
return gamedata.GetItemList(data, "Items")
}
// 获取连击快手奖励
func GetFastProduceReward(Energy int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil {
log.Debug("GetFastProduceReward err:%v, Energy=%d", err, Energy)
return nil
}
if len(data) == 0 {
return nil
}
// Convert map to slice for sorting
type sortData struct {
Id string
Energy float64
}
sortedList := make([]sortData, 0, len(data))
energy := float64(Energy) / 10.0
for k, v := range data {
dataEnergy := gamedata.GetFloatValue(v, "EnergyValue")
sortedList = append(sortedList, sortData{k, math.Abs(energy - dataEnergy)})
}
// Sort by Energy in ascending order
sort.Slice(sortedList, func(i, j int) bool {
return sortedList[i].Energy < sortedList[j].Energy
})
return gamedata.GetItemList(data[sortedList[0].Id], "Items")
}
// 获取连击快手最大次数
func GetFastProduceMaxTimes() int {
Max := 0
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_FAST)
if err != nil {
log.Debug("GetFastProduceMaxTimes err:%v", err)
return 0
}
for _, v := range data {
Max = max(gamedata.GetIntValue(v, "Times"), Max)
}
return Max
}
// 获取进度最大值
func GetProgressMax(Lv, Num int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
if err != nil {
log.Debug("GetProgressMax err:%v, Lv=%d, Num=%d", err, Lv, Num)
return 0
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Lv >= Min && Lv <= Max {
OrderNumStr := gamedata.GetStringValue(v, "OrderNum")
OrderNum := GoUtil.SplitInt(OrderNumStr, ",")
if Num >= len(OrderNum) {
return OrderNum[len(OrderNum)-1]
} else {
return OrderNum[Num]
}
}
}
return 0
}
func GetBonusLv(Lv int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
if err != nil {
log.Debug("GetBonusLv err:%v, Lv=%d", err, Lv)
return 0
}
for k, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Lv >= Min && Lv <= Max {
return GoUtil.Int(k)
}
}
return 0
}
// 获取进度奖励随机
func GetProgressRewardRand(Lv int) map[int]int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressRewardRand err:%v, Lv=%d", err, Lv)
return nil
}
r := make(map[int]int, len(data))
for k, v := range data {
if Lv >= gamedata.GetIntValue(v, "BonusLv") {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
}
return r
}
func GetJackpotIdByType(Type int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetJackpotIdByType err:%v, Type=%d", err, Type)
return 0
}
for k, v := range data {
Id := GoUtil.Int(k)
if Type == gamedata.GetIntValue(v, "Type") {
return Id
}
}
return 0
}
// 获取进度选择数量
func GetProgressSelectNum(Lv int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_BONUS)
if err != nil {
log.Debug("GetProgressSelectNum err:%v, Lv=%d", err, Lv)
return 0
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Lv >= Min && Lv <= Max {
return gamedata.GetIntValue(v, "Option")
}
}
return 0
}
// 获取进度奖励
func GetProgressReward(RewardId int) []*item.Item {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_JACKPOT)
if err != nil {
log.Debug("GetProgressReward err:%v, RewardId=%d", err, RewardId)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
if Id == RewardId {
return gamedata.GetItemList(v, "Items")
}
}
return nil
}
// 获取进度奖励类型
func GetProgressRewardType(RewardId int) int {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_JACKPOT, RewardId)
if err != nil {
log.Debug("GetProgressRewardType err:%v, RewardId=%d", err, RewardId)
return 0
}
return gamedata.GetIntValue(data, "Type")
}
func GetUnlockLv() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "unlock_lv")
if err != nil {
log.Debug("GetUnlockLv err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetCatSaleCD() int64 {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Event_Cooldown_7days")
if err != nil {
log.Debug("GetCatSaleCD err:%v", err)
return 0
}
return int64(gamedata.GetIntValue(data, "Value"))
}
func GetFirstEvent() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "First_Event")
if err != nil {
log.Debug("GetFirstEvent err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetFastCD() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Fast_Cd")
if err != nil {
log.Debug("GetFastCD err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPaybackDay() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "payback_day")
if err != nil {
log.Debug("GetPaybackDay err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetHighRollerNeedEnergy() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "High_Roller_Need_Energy")
if err != nil {
log.Debug("GetHighRollerNeedEnergy err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetThiefProb() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "Thief_Prob")
if err != nil {
log.Debug("GetThiefProb err:%v", err)
return 0
}
value := gamedata.GetStringValue(data, "Value")
a1 := strings.Split(value, "|")
prob := make(map[int]int, len(a1))
for _, v := range a1 {
a2 := strings.Split(v, ":")
prob[GoUtil.Int(a2[0])] = GoUtil.Int(a2[1])
}
return GoUtil.RandMap(prob)
}
// 招财猫
func GetMoneyCat(Id int) (float64, int) {
data, err := gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_MONEY, Id)
if err != nil {
log.Debug("GetMoneyCat err:%v, Id=%d", err, Id)
return 0.0, 0
}
return gamedata.GetFloatValue(data, "Mul"), gamedata.GetIntValue(data, "Cd")
}
func GetMoneyCatMax() int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_MONEY)
if err != nil {
log.Debug("GetMoneyCatMax err:%v", err)
return 0
}
return len(data)
}
func GetLuckyCatMaxEarning(Remain int) int {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_LUCKY)
if err != nil {
log.Debug("GetLuckyCatMaxEarning err:%v, Remain=%d", err, Remain)
return 0
}
type d struct {
t int
e int
}
l := make([]d, 0, len(data))
for k, v := range data {
t := GoUtil.Int(k)
e := gamedata.GetIntValue(v, "Earn")
l = append(l, d{t, e})
}
sort.Slice(l, func(i, j int) bool {
return l[i].t < l[j].t
})
for _, v := range l {
if Remain <= v.t {
return v.e
}
}
return 0
}
func GetCatTrickEnergy() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "CatTrick_ConsumeEnergy")
if err != nil {
log.Debug("GetCatTrickEnergy err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetCatTrickDiamond() int {
data, err := gamedata.GetDataByKey(CFG_LIMITED_TIME_EVENT_CONST, "CatTrick_RewardDiamond")
if err != nil {
log.Debug("GetCatTrickDiamond err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetDecorateOffDiscount(AreaId, StepId int) int {
data, err := gamedata.GetData(CFG_LIMTTED_TIME_EVENT_DECORATE_OFF)
if err != nil {
log.Debug("GetDecorateOffDiscount err:%v, AreaId=%d, StepId=%d", err, AreaId, StepId)
return 100
}
for _, v := range data {
StartAreaId := gamedata.GetIntValue(v, "StartArea")
EndAreaId := gamedata.GetIntValue(v, "EndArea")
StartStepId := gamedata.GetIntValue(v, "StartStep")
EndStepId := gamedata.GetIntValue(v, "EndStep")
if AreaId >= StartAreaId && AreaId <= EndAreaId && StepId >= StartStepId && StepId <= EndStepId {
return gamedata.GetIntValue(v, "Off")
}
}
return 100
}

View File

@ -1,112 +0,0 @@
package mailCfg
import (
"fmt"
languageCfg "server/conf/language"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/msg"
"strings"
)
const (
CFG_LOGIN_BACK = "LoginBack"
CFG_MAIL = "Mail"
MAIL_RECALL_ID = 12
MAIL_CHARGE_SEND_ID = 13
MAIL_CHARGE_RECEIVE_ID = 14
)
type TriggerMail struct {
Id int
Title string
SubTitle string
Content string
EnglistTitle string
SubTitleEn string
EnglistContent string
Items []*item.Item
Type int
Trigger []string
}
func init() {
gamedata.InitCfg(CFG_LOGIN_BACK)
gamedata.InitCfg(CFG_MAIL)
}
func GetLoginBack(Id string) (int, int) {
data, err := gamedata.GetDataByKey(CFG_LOGIN_BACK, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "Num1"), gamedata.GetIntValue(data, "Num2")
}
func GetTriggerMail() []*TriggerMail {
data, err := gamedata.GetData(CFG_MAIL)
if err != nil {
return nil
}
ret := make([]*TriggerMail, 0)
for k, v := range data {
T := gamedata.GetStringValue(v, "Trigger")
if T == "" {
continue
}
T1 := strings.Split(T, "|")
if len(T1) < 4 {
continue
}
data := &TriggerMail{
Id: GoUtil.Int(k),
Title: gamedata.GetStringValue(v, "Title"),
Content: gamedata.GetStringValue(v, "Content"),
EnglistTitle: gamedata.GetStringValue(v, "EnglistTitle"),
EnglistContent: gamedata.GetStringValue(v, "EnglistContent"),
Items: gamedata.GetItemList(v, "Items"),
Type: gamedata.GetIntValue(v, "Type"),
Trigger: strings.Split(T, "|"),
}
ret = append(ret, data)
}
return ret
}
func GetRecallMail(Title, ItemName, TitleEn, ItemNameEn string) (string, string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_MAIL, 12)
if err != nil {
return "", "", "", ""
}
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
return fmt.Sprintf(mt, Title), fmt.Sprintf(mc, Title, ItemName), fmt.Sprintf(mt_en, TitleEn), fmt.Sprintf(mc_en, Title, ItemNameEn)
}
func GetChargeSendMail(PlayerName string) (string, string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_MAIL, MAIL_CHARGE_SEND_ID)
if err != nil {
return "", "", "", ""
}
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
return mt, fmt.Sprintf(mc, PlayerName), mt_en, fmt.Sprintf(mc_en, PlayerName)
}
func GetChargeReceiveMail(PlayerName string, Content string) (string, string, string, string) {
data, err := gamedata.GetDataByIntKey(CFG_MAIL, MAIL_CHARGE_RECEIVE_ID)
if err != nil {
return "", "", "", ""
}
mt := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Title"))
mc := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_CN, gamedata.GetStringValue(data, "Content"))
mt_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Title"))
mc_en := languageCfg.GetLanguage(msg.LANG_TYPE_LANG_EN, gamedata.GetStringValue(data, "Content"))
return fmt.Sprintf(mt, PlayerName), fmt.Sprintf(mc, Content), fmt.Sprintf(mt_en, PlayerName), fmt.Sprintf(mc_en, Content)
}

View File

@ -0,0 +1,188 @@
package mergeDataCfg
import (
"errors"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
CFG_NAME = "MergeData"
CONST_NAME = "MergeDataConst"
// 棋子类型
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
CHESS_PRODUCT_SUB_TYPE = 2 // 次产物
CHESS_PRODUCT_SUB_EMIT_TYPE = 3 // 次发射器产物
)
func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CONST_NAME)
}
// 获取单个数据
func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return &gamedata.MergeDataRecord{}, errors.New("not found")
}
return &gamedata.MergeDataRecord{
Id: gamedata.ParseInt(data["Id"]),
Lv: gamedata.ParseInt(data["Lv"]),
MaxLv: gamedata.ParseInt(data["MaxLv"]),
SellType: gamedata.ParseString(data["SellType"]),
SellNum: gamedata.ParseInt(data["SellNum"]),
SellDiamond: gamedata.ParseInt(data["SellDiamond"]),
Color: gamedata.ParseString(data["Color"]),
Star: gamedata.ParseInt(data["Star"]),
Type: gamedata.ParseString(data["Type"]),
Emit_Product: gamedata.ParseString(data["Emit_Product"]),
CoolTime: gamedata.ParseInt(data["CoolTime"]),
}, nil
}
// 根据id获取棋子获得的星星
func GetStarById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["Star"])
}
// 根据等级和颜色获取棋子id
func GetChessIdByLvAndColor(Lv int, Color string) int {
if Lv == 0 || Color == "" {
return 0
}
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0
}
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
color := gamedata.GetStringValue(v, "Color")
if Lv == lv && color == Color {
Id, _ := strconv.Atoi(k)
return Id
}
}
return 0
}
// 根据Id获取棋子等级
func GetLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["Lv"])
}
// 根据Id获取棋子最大等级
func GetMaxLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.ParseInt(data["MaxLv"])
}
// 根据Id获取棋子类型
func GetTypeById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return ""
}
return gamedata.ParseString(data["Type"])
}
// 根据Id获取棋子类型
func GetColorById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetColorById GetOne Id:%v not found", Id)
return ""
}
return gamedata.ParseString(data["Color"])
}
// 根据Id获取发射器产出类型
func GetEmitProduceType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return []string{}
}
return strings.Split(gamedata.ParseString(data["Emit_Product"]), ",")
}
// 根据Id获取发射器Id
func GetEmitId(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return ""
}
return gamedata.ParseString(data["Emit_ID"])
}
// 获取常量
func GetConst(Key string) string {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return ""
}
return gamedata.ParseString(data["Value"])
}
// 获取常量
func GetConstInt(Key string) int {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return 0
}
return gamedata.ParseInt(data["Value"])
}
func GetExtraEmitId() map[string]struct{} {
Value := GetConst("EmitId_Extra_Order")
arr := strings.Split(Value, ",")
var r = make(map[string]struct{})
for _, v := range arr {
r[v] = struct{}{}
}
return r
}
func GetProductType(Chess int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Chess)
if err != nil {
log.Debug("GetProductType GetOne Id:%v not found", Chess)
return 0
}
return gamedata.ParseInt(data["PType"])
}
func GetChessBagMaxGrid() int {
return GetConstInt("chess_bag_max")
}
func GetChessBagBugNum() int {
return GetConstInt("chess_bag_buy")
}
func GetChessBagInitNum() int {
return GetConstInt("chess_bag_init")
}

View File

@ -1,619 +0,0 @@
package mergeDataCfg
import (
"errors"
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strconv"
"strings"
)
const (
CFG_NAME = "MergeData"
CONST_NAME = "MergeDataConst"
CFG_MERGE_EMIT = "MergeDataEmit"
// 棋子类型
CHESS_PRODUCT_MAIN_TYPE = 1 // 主产物
CHESS_PRODUCT_SECONDARY_TYPE = 2 // 次产物
CHESS_PRODUCT_SUB_TYPE = 3 // 子发射器产物
)
func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CONST_NAME)
gamedata.InitCfg(CFG_MERGE_EMIT)
}
func GetEmitTypeByColor(Color string) string {
data, err := gamedata.GetData(CFG_MERGE_EMIT)
if err != nil {
return ""
}
for k, v := range data {
ColorList := strings.Split(gamedata.GetStringValue(v, "Order_Type"), ",")
if GoUtil.InStringArray(Color, ColorList) {
return k
}
}
return ""
}
func GetEmitProduce(EmitType string) []string {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType)
if err != nil {
log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Product_Type"), ",")
}
func GetEmitOrderProduce(EmitType string) []string {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType)
if err != nil {
log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Order_Type"), ",")
}
// 获取单个数据
func GetOne(Id int) (*gamedata.MergeDataRecord, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return &gamedata.MergeDataRecord{}, errors.New("not found")
}
return &gamedata.MergeDataRecord{
Id: gamedata.GetIntValue(data, "Id"),
Lv: gamedata.GetIntValue(data, "Lv"),
MaxLv: gamedata.GetIntValue(data, "MaxLv"),
SellType: gamedata.GetStringValue(data, "SellType"),
SellNum: gamedata.GetIntValue(data, "SellNum"),
SellDiamond: gamedata.GetIntValue(data, "SellDiamond"),
Color: gamedata.GetStringValue(data, "Color"),
Star: gamedata.GetIntValue(data, "Star"),
Type: gamedata.GetStringValue(data, "Type"),
Emit_Product: gamedata.GetStringValue(data, "Emit_Product"),
CoolTime: gamedata.GetIntValue(data, "CoolTime"),
Emit_Type: gamedata.GetStringValue(data, "Emit_Type"),
}, nil
}
// 根据id获取棋子获得的星星
func GetStarById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Star")
}
func GetNameById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("MergeDataCfg GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Title")
}
// 根据等级和颜色获取棋子id
func GetChessIdByLvAndColor(Lv int, Color string) int {
if Lv == 0 || Color == "" {
return 0
}
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
// log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0
}
for k, v := range data {
lv := gamedata.GetIntValue(v, "Lv")
color := gamedata.GetStringValue(v, "Color")
if Lv == lv && color == Color {
Id, _ := strconv.Atoi(k)
return Id
}
}
// log.Debug("MergeDataCfg GetChessIdByLvAndColor lv:%v Color:%v not found", Lv, Color)
return 0
}
// 根据Id获取棋子等级
func GetLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
//log.Debug("GetLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Lv")
}
// 根据Id获取棋子最大等级
func GetMaxLvById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
// log.Debug("GetMaxLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "MaxLv")
}
// 根据Id获取棋子最大等级
func GetMaxLvByColor(Color string) int {
ChessId := GetChessIdByLvAndColor(1, Color)
data, err := gamedata.GetDataByIntKey(CFG_NAME, ChessId)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "MaxLv")
}
// 根据Id获取发射器最小等级
func GetEmitMinLvById(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
// log.Debug("GetEmitMinLvById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Emit_Min_Lv")
}
// 根据Id获取发射器修正系数
func GetEmitRatio(Id string) float64 {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
// log.Debug("GetEmitRatio GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetFloatValue(data, "Ratio")
}
func GetEmitRetire(Id string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, Id)
if err != nil {
log.Debug("GetEmitRetire GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "Retire")
}
func GetEmitProductNumByColor(Id string) int {
data, err := gamedata.GetData(CFG_MERGE_EMIT)
if err != nil {
log.Debug("GetEmitProductNumByColor GetOne Id:%v not found", Id)
return 0
}
for _, v := range data {
ColorList := strings.Split(gamedata.GetStringValue(v, "Product_Type"), ",")
if GoUtil.InStringArray(Id, ColorList) {
return len(strings.Split(gamedata.GetStringValue(v, "Product_Type"), ","))
}
}
return 0
}
// 根据Id获取棋子类型
func GetTypeById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetTypeById GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Type")
}
// 根据Id获取棋子类型
func GetColorById(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetColorById GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Color")
}
// 根据Id获取棋子类型
func GetSellNumById(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetSellNumById GetOne Id:%v not found", Id)
return 0
}
return gamedata.GetIntValue(data, "SellNum")
}
// 根据Id获取发射器产出类型
func GetEmitProduceType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetEmitProduceType GetOne Id:%v not found", Id)
return []string{}
}
return strings.Split(gamedata.GetStringValue(data, "Emit_Product"), ",")
}
// 根据Id获取发射器产出类型
func GetEmitProduceChessType(Id int) []string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
//log.Debug("GetEmitProduceChessType GetOne Id:%v not found", Id)
return []string{}
}
value := gamedata.GetStringValue(data, "Product_Type")
if value == "" {
return []string{}
}
return strings.Split(value, ",")
}
// 根据Id获取发射器Id
func GetEmitId(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
// log.Debug("GetEmitId GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Emit_ID")
}
func GetAllId() []int {
data, err := gamedata.GetData(CFG_NAME)
if err != nil {
return []int{}
}
key := make([]int, 0, len(data))
for k := range data {
key = append(key, GoUtil.Int(k))
}
return key
}
func GetEmitType(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Id)
if err != nil {
log.Debug("GetEmitType GetOne Id:%v not found", Id)
return ""
}
return gamedata.GetStringValue(data, "Emit_Type")
}
func GetEmitN(EmitSeries string) int {
data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitSeries)
if err != nil {
log.Debug("GetEmitN GetOne EmitSeries:%v not found", EmitSeries)
return 0
}
return gamedata.GetIntValue(data, "N")
}
// 获取常量
func GetConst(Key string) string {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return ""
}
return gamedata.GetStringValue(data, "Value")
}
// 获取常量
func GetConstInt(Key string) int {
data, err := gamedata.GetDataByKey(CONST_NAME, Key)
if err != nil {
log.Debug("GetConst GetOne Id:%s not found", Key)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetExtraEmitId() map[string]struct{} {
Value := GetConst("EmitId_Extra_Order")
arr := strings.Split(Value, ",")
var r = make(map[string]struct{})
for _, v := range arr {
r[v] = struct{}{}
}
return r
}
func GetChessBagMaxGrid() int {
return GetConstInt("chess_bag_max")
}
func GetChessBagBugNum() int {
return GetConstInt("chess_bag_buy")
}
func GetChessBagInitNum() int {
return GetConstInt("chess_bag_init")
}
func GetSourceChestItem() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "source_chest_reward")
if err != nil {
log.Debug("GetSourceChestItem GetOne not found")
return nil
}
Str := gamedata.GetStringValue(data, "Value")
A1 := strings.Split(Str, "|")
var r []*item.Item
if len(A1) < 2 {
return r
}
A2 := strings.Split(A1[0], "/")
A3 := GoUtil.StringToInt(A2)
A4 := GoUtil.RandSlice(A3)
r = append(r, item.NewItem(item.ITEM_DIAMOND_ID, A4))
B2 := strings.Split(A1[1], "/")
B3 := GoUtil.StringToInt(B2)
B4 := GoUtil.RandSlice(B3)
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
return r
}
func GetHighSourceChestItem() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "high_source_chest_reward")
if err != nil {
log.Debug("GetHighSourceChestItem GetOne not found")
return nil
}
Str := gamedata.GetStringValue(data, "Value")
A1 := strings.Split(Str, "|")
var r []*item.Item
if len(A1) < 2 {
return r
}
A2 := strings.Split(A1[0], "/")
A3 := GoUtil.StringToInt(A2)
A4 := GoUtil.RandSlice(A3)
r = append(r, item.NewItem(item.ITEM_DIAMOND_ID, A4))
B2 := strings.Split(A1[1], "/")
B3 := GoUtil.StringToInt(B2)
B4 := GoUtil.RandSlice(B3)
r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4))
return r
}
func GetRetireReward() []*item.Item {
data, err := gamedata.GetDataByKey(CONST_NAME, "retire_reward")
if err != nil {
log.Debug("GetRetireReward GetOne not found")
return nil
}
return gamedata.GetItemList(data, "Value")
}
func DynamicLevRev(Lv int, EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
// log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
if DynamicLv == "" {
return Lv
}
Arr := strings.Split(DynamicLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return Lv + NewLv
}
}
return Lv
}
func DynamicLev(Lv int, EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
if DynamicLv == "" {
return Lv
}
Arr := strings.Split(DynamicLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return Lv - NewLv
}
}
return Lv
}
func DynamicLev2(Lv int, EmitId int, Color1 string, Color2 string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return Lv
}
DynamicLv := gamedata.GetStringValue(data, "Dynamic")
if DynamicLv == "" {
return Lv
}
Arr := strings.Split(DynamicLv, ",")
BaseLv := Lv
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color1 == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
BaseLv = Lv + NewLv
}
}
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color2 == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return BaseLv - NewLv
}
}
return Lv
}
func DynamicAdjust(EmitId int, Color string, EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return 0
}
DynamicLv := ""
switch EnergyMul {
case 0:
DynamicLv = gamedata.GetStringValue(data, "Dynamic")
case 1, 2:
DynamicLv = gamedata.GetStringValue(data, "Dynamic1")
case 3, 4:
DynamicLv = gamedata.GetStringValue(data, "Dynamic2")
default:
DynamicLv = gamedata.GetStringValue(data, "Dynamic3")
}
if DynamicLv == "" {
return 0
}
Arr := strings.Split(DynamicLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return NewLv
}
}
return 0
}
func GetAdjust(EmitId int, Color string, EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
//log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId)
return 0
}
AdjustLv := ""
switch EnergyMul {
case 0:
AdjustLv = gamedata.GetStringValue(data, "Dynamic")
case 1, 2:
AdjustLv = gamedata.GetStringValue(data, "Dynamic1")
case 3, 4:
AdjustLv = gamedata.GetStringValue(data, "Dynamic2")
default:
AdjustLv = gamedata.GetStringValue(data, "Dynamic3")
}
if AdjustLv == "" {
return 0
}
Arr := strings.Split(AdjustLv, ",")
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
if len(Arr2) != 2 {
continue
}
if Color == Arr2[0] {
NewLv, _ := strconv.Atoi(Arr2[1])
return NewLv
}
}
return 0
}
func GetSellDiamondMul(EmitId int, Color string) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId)
if err != nil {
log.Debug("GetSellDiamondMul GetOne EmitId:%v not found", EmitId)
return 0
}
ProductEmit := gamedata.GetStringValue(data, "Emit_Product")
if ProductEmit == "" {
return 1
}
Arr := strings.Split(ProductEmit, ",")
if Color == Arr[0] {
return 1
}
if !GoUtil.InStringArray(Color, Arr) {
return 1
}
Emit_List := gamedata.GetStringValue(data, "Emit_List")
MainProb := getColorProb(Emit_List, Arr[0])
SubProb := getColorProb(Emit_List, Color)
return int(MainProb / SubProb)
}
func getColorProb(Emit_List string, Color string) float64 {
Arr := strings.Split(Emit_List, ",")
Prob := 0.0
for _, v := range Arr {
Arr2 := strings.Split(v, "=")
A1 := GoUtil.Int(Arr2[0])
A2, _ := strconv.ParseFloat(Arr2[1], 64)
A1Color := GetColorById(A1)
if A1Color != Color {
continue
}
Prob += A2 * float64(A1%10)
}
return Prob
}
func GetMergeStar(MergeList []int) int {
Star := 0
for _, v := range MergeList {
Star += GetStarById(v)
}
return Star
}
func GetAllChessBySeries(Series string) []int {
data, err := gamedata.GetData(CFG_NAME)
ProductList := GetEmitProduce(Series)
if err != nil {
return []int{}
}
var r []int
for k, v := range data {
Type := gamedata.GetStringValue(v, "Type")
if Type == "Emitter" {
EmitId := gamedata.GetStringValue(v, "Emit_ID")
if EmitId == Series {
r = append(r, GoUtil.Int(k))
}
}
if Type == "Product" {
Color := gamedata.GetStringValue(v, "Color")
if GoUtil.InStringArray(Color, ProductList) {
r = append(r, GoUtil.Int(k))
}
}
}
return r
}

View File

@ -1,130 +0,0 @@
package miningCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"strconv"
"strings"
)
const (
CFG_MINING_TEMPLATE = "MiningTemplate"
CFG_MINING_JACKPOT = "MiningJackpot"
CFG_MINING_GEM = "MiningGem"
CFG_MINING_PASS = "MiningPass"
)
func init() {
gamedata.InitCfg(CFG_MINING_TEMPLATE)
gamedata.InitCfg(CFG_MINING_JACKPOT)
gamedata.InitCfg(CFG_MINING_GEM)
gamedata.InitCfg(CFG_MINING_PASS)
}
func GetTemplate(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetLoseItem(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "ItemCost")
}
func GetStartItemNum(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "StartItemNum")
}
func GetPassArea(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return 0
}
Area := gamedata.GetStringValue(data, "Area")
strArr := strings.Split(Area, "*")
a, _ := strconv.Atoi(strArr[0])
b, _ := strconv.Atoi(strArr[1])
return a * b
}
func GetPassGem(Id int) []int {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return nil
}
Gem := gamedata.GetStringValue(data, "Gem")
strArr := strings.Split(Gem, "|")
result := make([]int, 0, len(strArr))
for _, v := range strArr {
a, _ := strconv.Atoi(v)
result = append(result, a)
}
return result
}
func GetRandItem() []*item.Item {
data, err := gamedata.GetData(CFG_MINING_JACKPOT)
if err != nil {
return nil
}
ProbMap := make(map[int]int)
for k, v := range data {
Id := GoUtil.Int(k)
ProbMap[Id] = gamedata.GetIntValue(v, "Prob")
}
RandId := GoUtil.RandMap(ProbMap)
Info, _ := gamedata.GetDataByIntKey(CFG_MINING_JACKPOT, RandId)
return gamedata.GetItemList(Info, "Items")
}
func GetPassItem(Id int, orderFactor int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_MINING_PASS, Id)
if err != nil {
return nil
}
items := gamedata.GetItemList(data, "Items")
starReward := gamedata.GetIntValue(data, "StarReward")
var starnum int
if starReward > 0 {
starnum = int((float64(starReward) * float64(orderFactor) / 500)) * 5
if starnum > 0 {
items = append(items, &item.Item{
Id: item.ITEM_STAR_ID,
Num: starnum,
})
}
}
return items
}
func GetPassItemList(orderFactor int) map[int][]*item.Item {
data, err := gamedata.GetData(CFG_MINING_PASS)
if err != nil {
return nil
}
result := make(map[int][]*item.Item)
for k := range data {
Id := GoUtil.Int(k)
result[Id] = GetPassItem(Id, orderFactor)
}
return result
}

View File

@ -1,43 +0,0 @@
package notification_cfg
import "server/gamedata"
const (
CFG_NOTIFICATION = "Notification"
)
func init() {
gamedata.InitCfg(CFG_NOTIFICATION)
}
func GetFriendApplyNotificationCooldown() int {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 2)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Cooldown")
}
func GetPetroomGameNotificationCooldown() (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 1)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "Cooldown"), gamedata.GetIntValue(data, "DailyLimit")
}
func GetPetroomGameNotificationMsg() (string, string) {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 1)
if err != nil {
return "", ""
}
return gamedata.GetStringValue(data, "TitleKey"), gamedata.GetStringValue(data, "InfoKey")
}
func GetFriendApplyNotificationMsg() (string, string) {
data, err := gamedata.GetDataByIntKey(CFG_NOTIFICATION, 2)
if err != nil {
return "", ""
}
return gamedata.GetStringValue(data, "TitleKey"), gamedata.GetStringValue(data, "InfoKey")
}

View File

@ -0,0 +1,38 @@
package orderCfg
import (
"server/gamedata"
)
const (
CFG_ORDER_DATA = "OrderData"
CFG_ORDER_CHESS_DATA = "OrderChessData"
)
func init() {
gamedata.InitCfg(CFG_ORDER_DATA)
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
}
func GetLvMin(EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_DATA, EnergyMul)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LvMin")
}
func GetLvMax(EnergyMul, N int) int {
if v, ok := gamedata.G_AllConfigsJsonData["OrderChessData"]; ok {
data := v.GetData()
for _, v := range data {
dEnergy := gamedata.GetIntValue(v, "EnergyMul")
Min := gamedata.GetIntValue(v, "MinN")
Max := gamedata.GetIntValue(v, "MaxN")
if dEnergy == EnergyMul && N >= Min && N <= Max {
return gamedata.GetIntValue(v, "MaxLv")
}
}
}
return 0
}

View File

@ -1,190 +0,0 @@
package orderCfg
import (
"math"
"server/gamedata"
"sort"
"strconv"
)
const (
CFG_ORDER_DATA = "OrderData"
CFG_ORDER_CHESS_DATA = "OrderChessData"
CFG_ORDER_NUM_DATA = "OrderNumData"
CFG_START_ORDER = "StartOrder"
CFG_CONST = "OrderConst"
CFG_ORDER_SCENE = "OrderScene"
CFG_ORDER_K = "OrderK"
)
func init() {
gamedata.InitCfg(CFG_ORDER_DATA)
gamedata.InitCfg(CFG_ORDER_CHESS_DATA)
gamedata.InitCfg(CFG_ORDER_NUM_DATA)
gamedata.InitCfg(CFG_START_ORDER)
gamedata.InitCfg(CFG_CONST)
gamedata.InitCfg(CFG_ORDER_SCENE)
gamedata.InitCfg(CFG_ORDER_K)
}
func GetOrderK(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_K, Lv)
if err != nil {
return 0
}
Energy := gamedata.GetIntValue(data, "Energy")
K := gamedata.GetFloatValue(data, "K")
return int(math.Round(float64(Energy)*K/10) * 10)
}
func GetOrderFactor(Scene int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_SCENE, Scene)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Factor")
}
func GetEmitExtraOrder() string {
data, err := gamedata.GetDataByKey(CFG_CONST, "EmitId_Extra_Order")
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Value")
}
func GetLvMin(EnergyMul int) int {
data, err := gamedata.GetDataByIntKey(CFG_ORDER_DATA, EnergyMul)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LvMin")
}
func GetLvMax(EnergyMul, N int) int {
data, err := gamedata.GetData(CFG_ORDER_CHESS_DATA)
if err != nil {
return 0
}
for _, v := range data {
dEnergy := gamedata.GetIntValue(v, "EnergyMul")
Min := gamedata.GetIntValue(v, "MinN")
Max := gamedata.GetIntValue(v, "MaxN")
if dEnergy == EnergyMul {
if N >= Min && N <= Max {
return gamedata.GetIntValue(v, "MaxLv")
}
}
}
return 0
}
func GetOrderNum(Level int) int {
data, err := gamedata.GetData(CFG_ORDER_NUM_DATA)
if err != nil {
return 0
}
for _, v := range data {
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Level >= Min && Level <= Max {
return gamedata.GetIntValue(v, "Num")
}
}
return 0
}
func GetStartOrderInfo(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
if err != nil {
return -1, -1
}
return gamedata.GetIntValue(data, "group"), gamedata.GetIntValue(data, "step")
}
func GetStartOrderList() []*gamedata.StartOrderData {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return []*gamedata.StartOrderData{}
}
ret := make([]*gamedata.StartOrderData, 0, len(data))
for k, v := range data {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
Appear: gamedata.GetStringValue(v, "appear"),
Preview: gamedata.GetStringValue(v, "preview"),
Items: gamedata.GetItemList(v, "reward"),
Group: gamedata.GetIntValue(v, "group"),
Step: gamedata.GetIntValue(v, "step"),
})
}
sort.Slice(ret, func(i, j int) bool {
return ret[i].Id < ret[j].Id
})
return ret
}
func GetStartOrderByStep(id int) []*gamedata.StartOrderData {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return []*gamedata.StartOrderData{}
}
ret := make([]*gamedata.StartOrderData, len(data))
for k, v := range data {
stepVal := gamedata.GetIntValue(v, "step")
if int(stepVal) == id {
OrderId, _ := strconv.Atoi(k)
ret = append(ret, &gamedata.StartOrderData{
Id: OrderId,
Step: int(stepVal),
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
})
}
}
sort.Slice(ret, func(i, j int) bool {
return ret[i].Id < ret[j].Id
})
return ret
}
func GetStartOrderById(id int) *gamedata.StartOrderData {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return nil
}
v, ok := data[strconv.Itoa(id)]
if !ok {
return nil
}
stepVal := gamedata.GetIntValue(v, "step")
return &gamedata.StartOrderData{
Id: id,
Step: int(stepVal),
MergeList: gamedata.GetIntSliceValue(v, "merge_id_list"),
}
}
func GetMaxStep() int {
data, err := gamedata.GetData(CFG_START_ORDER)
if err != nil {
return 0
}
max := 0
for _, v := range data {
stepVal := gamedata.GetIntValue(v, "step")
if int(stepVal) > max {
max = int(stepVal)
}
}
return max
}
func GetOrderType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_START_ORDER, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "type")
}

View File

@ -1,122 +0,0 @@
package passCfg
import (
"server/game/mod/item"
"server/gamedata"
"slices"
)
const (
CFG_PASS_TEMPLATE = "PassTemplate"
CFG_PASS = "Pass"
)
func init() {
gamedata.InitCfg(CFG_PASS_TEMPLATE)
gamedata.InitCfg(CFG_PASS)
}
func GetTemplate(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Template")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetLowChargeId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "LowChargeId")
}
func GetHighChargeId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PASS_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "HighChargeId")
}
func GetNewLevel(Template int, Score int, Reward []int) []int {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
NewReward := make([]int, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
LevelScore := gamedata.GetIntValue(v, "TotalScore")
Index := gamedata.GetIntValue(v, "Level")
if Score >= LevelScore && !slices.Contains(Reward, Index) {
NewReward = append(NewReward, Index)
}
}
return NewReward
}
func GetFreeChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "FreeReward")...)
}
}
return Items
}
func GetLowChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "LowReward")...)
}
}
return Items
}
func GetHighChargeItems(Template int, Reward []int) []*item.Item {
data, err := gamedata.GetData(CFG_PASS)
if err != nil {
return nil
}
Items := make([]*item.Item, 0, len(data))
for _, v := range data {
if gamedata.GetIntValue(v, "Template") != Template {
continue
}
Index := gamedata.GetIntValue(v, "Level")
if slices.Contains(Reward, Index) {
Items = append(Items, gamedata.GetItemList(data, "HighReward")...)
}
}
return Items
}

View File

@ -1,722 +0,0 @@
package playroomCfg
import (
"server/game/mod/item"
GoUtil "server/game_util"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
"strings"
)
const (
CFG_PLAYROOM_CONST = "PlayroomConst"
CFG_PLAYROOM_DECORATE = "PlayroomDecorate"
CFG_PLAYROOM_MOOD = "PlayroomMood"
CFG_PLAYROOM_PHYSIOLOGY = "PlayroomPhysiology"
CFG_PLAYROOM_PHYSIOLOGY_TYPE = "PlayroomPhysiologyType"
CFG_PLAYROOM_SHOP = "PlayroomShop"
CFG_PLAYROOM_DRESS = "PlayroomDress"
CFG_PLAYROOM_AIR = "PlayroomAir"
CFG_PLAYROOM_LOCK = "PlayroomLock"
CFG_PLAYROOM_DAILYTASK = "PlayroomDailyTask"
CFG_PLAYROOM_DAILYTASKREWARD = "PlayroomDailyTaskReward"
CFG_PLAYROOM_TASKJACKPOT = "PlayroomTaskJackpot"
CFG_PLAYROOM_ORDERITEM = "PlayroomOrderItem" // 订单物品
)
func init() {
gamedata.InitCfg(CFG_PLAYROOM_CONST)
gamedata.InitCfg(CFG_PLAYROOM_DECORATE)
gamedata.InitCfg(CFG_PLAYROOM_MOOD)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY)
gamedata.InitCfg(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
gamedata.InitCfg(CFG_PLAYROOM_SHOP)
gamedata.InitCfg(CFG_PLAYROOM_DRESS)
gamedata.InitCfg(CFG_PLAYROOM_AIR)
gamedata.InitCfg(CFG_PLAYROOM_LOCK)
gamedata.InitCfg(CFG_PLAYROOM_DAILYTASK)
gamedata.InitCfg(CFG_PLAYROOM_DAILYTASKREWARD)
gamedata.InitCfg(CFG_PLAYROOM_TASKJACKPOT)
gamedata.InitCfg(CFG_PLAYROOM_ORDERITEM)
}
func GetShopItem(Id int) (int, []*item.Item, int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
if err != nil {
return 0, nil, 0, 0
}
return gamedata.GetIntValue(data, "ItemId"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Discount"), gamedata.GetIntValue(data, "Limit")
}
func GetShopWeeklyLimit() map[int]gamedata.WeeklyDiscountInfo {
r := make(map[int]gamedata.WeeklyDiscountInfo)
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
if err != nil {
return r
}
for k, v := range data {
Id := GoUtil.Int(k)
Limit := gamedata.GetIntValue(v, "Limit")
if Limit == 0 {
continue
}
r[Id] = gamedata.WeeklyDiscountInfo{
Id: Id,
Discount: gamedata.GetIntValue(v, "Discount"),
WeeklyLimit: Limit,
}
}
return r
}
func GetShopWish(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_SHOP, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Wish")
}
func GetUnLockLv() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Lv")
if err != nil {
return 999
}
return gamedata.GetIntValue(data, "Value")
}
func GetGameOutline() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "GameOutline")
if err != nil {
return 999
}
return gamedata.GetIntValue(data, "Value")
}
func GetChipNum() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "ChipNum")
if err != nil {
return 12
}
return gamedata.GetIntValue(data, "Value")
}
func GetOrderStar() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Star")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetRewardStar() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RewardStar")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetTriggerCd() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "CD")
if err != nil {
return 1000
}
return gamedata.GetIntValue(data, "Value")
}
func GetFoodItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Food")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetCleanItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Clean")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetToyItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Toy")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetDailyItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Daily")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetPremiumItem() []int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PremiumItem")
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for _, v := range strings.Split(gamedata.GetStringValue(data, "Value"), ",") {
if v == "" {
continue
}
Id := GoUtil.Int(v)
r = append(r, Id)
}
return r
}
func GetInteractNum() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractNum")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInteractUnlock() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "InteractUnlock")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetVisitorItem() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "VisitorItem")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetWorkItem() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "WorkItem")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetWorkChargeId() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "WorkChargeId")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetJackpotNum() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "Jackpot")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInteract(Id, Type int) (int, []*item.Item, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0, nil, 0
}
if Type == 1 {
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost"), gamedata.GetIntValue(data, "Effect")
}
return gamedata.GetIntValue(data, "Type"), gamedata.GetItemList(data, "Cost2"), gamedata.GetIntValue(data, "Effect")
}
func GetInteractPhysiology(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "PType"), gamedata.GetIntValue(data, "PEffect")
}
func GetInteractPExp(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "PExp")
}
func GetInitDecorate() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Init") == 1 {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetDecorateList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DECORATE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetBuyItem(Id int) ([]*item.Item, []*item.Item) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_MOOD, Id)
if err != nil {
return nil, nil
}
return gamedata.GetItemList(data, "Cost2"), gamedata.GetItemList(data, "Buy")
}
func GetPhysiologyMax(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Max")
}
func GetPhysiologyDuration(Id int, Num int) int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY)
if err != nil {
return 0
}
for _, v := range data {
Type := gamedata.GetIntValue(v, "Type")
if Type != Id {
continue
}
Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max")
if Num >= Min && Num <= Max {
return gamedata.GetIntValue(v, "Per") * 60
}
}
return 0
}
func GetPhysiologyTypeList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetMoodEffect(Id int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_PHYSIOLOGY_TYPE, Id)
if err != nil {
return 0, 0
}
return gamedata.GetIntValue(data, "MType"), gamedata.GetIntValue(data, "MEffect")
}
func IsStokeCat(Id int) bool {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "StokeCatId")
if err != nil {
return false
}
return gamedata.GetIntValue(data, "Value") == Id
}
func IsTakeCat(Id int) bool {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "TakeCatId")
if err != nil {
return false
}
Ids := gamedata.GetIntSliceValue(data, "Value")
return GoUtil.InArray(Id, Ids)
}
func GetRoomPointInvite() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RoomPointInvite")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetRoomPointAdd() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "RoomPointAdd")
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func IsPlayCat(Id int) bool {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "PlayCatId")
if err != nil {
return false
}
Ids := gamedata.GetIntSliceValue(data, "Value")
return GoUtil.InArray(Id, Ids)
}
func GetInitAirList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_AIR)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Init") == 1 {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetAirList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_AIR)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetInitDressList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DRESS)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Init") == 1 {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetDressList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DRESS)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k := range data {
r = append(r, GoUtil.Int(k))
}
return r
}
func GetDressPart(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DRESS, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "IPart")
}
func GetDressName(Id int) string {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DRESS, Id)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetUnlockNeed(Type int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_LOCK, Type)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Need")
}
func GetUnlockName(Type int) string {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_LOCK, Type)
if err != nil {
return ""
}
return gamedata.GetStringValue(data, "Name")
}
func GetDailyTask(Type int) map[int]string {
data, err := gamedata.GetData(CFG_PLAYROOM_DAILYTASK)
if err != nil {
return nil
}
r := make(map[int]string)
r1 := make([]int, 0, len(data))
r2 := make(map[int]string)
for k, v := range data {
if gamedata.GetIntValue(v, "Type") == Type {
k1 := GoUtil.Int(k)
r[k1] = gamedata.GetStringValue(v, "Task")
r1 = append(r1, k1)
}
}
daily_group_num := 0
switch Type {
case 1:
daily_group_num = GetPlayroomTaskDailyNum1()
case 2:
daily_group_num = GetPlayroomTaskDailyNum2()
}
r3 := GoUtil.RandSliceNum(r1, daily_group_num)
for _, v := range r3 {
r2[v] = r[v]
}
return r2
}
func GetDailyTaskType(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DAILYTASK, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Type")
}
func GetDailyTaskReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DAILYTASKREWARD, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Items")
}
// 获取场景冲刺奖池
func GetTaskJackpotProb() map[int]int {
r := make(map[int]int)
data, err := gamedata.GetData(CFG_PLAYROOM_TASKJACKPOT)
if err != nil {
log.Debug("GetTaskJackpotProb err:%v", err)
return nil
}
for k, v := range data {
Id := GoUtil.Int(k)
r[Id] = gamedata.GetIntValue(v, "Prob")
}
return r
}
// 获取场景冲刺奖励
func GetTaskJackpotReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_TASKJACKPOT, Id)
if err != nil {
log.Debug("GetTaskJackpotReward err:%v", err)
return nil
}
return gamedata.GetItemList(data, "Items")
}
func GetPhysiologyList(MoodType int) []int {
data, err := gamedata.GetData(CFG_PLAYROOM_PHYSIOLOGY_TYPE)
if err != nil {
return []int{}
}
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "MType") == MoodType {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetInteractIdBath() []int {
return []int{11, 12, 13}
}
func GetOrderItemByGrade(Grade int) map[int][]int {
data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM)
if err != nil {
log.Debug("GetOrderItemByGrade err:%v", err)
return nil
}
r := make(map[int][]int)
for k, v := range data {
GradeStr := gamedata.GetStringValue(v, "Grade")
GradeList := make([]int, 0)
for _, v1 := range strings.Split(GradeStr, ",") {
v2 := GoUtil.Int(v1)
if v2 > 0 {
GradeList = append(GradeList, v2)
}
}
if !GoUtil.InArray(Grade, GradeList) {
continue
}
Id := GoUtil.Int(k)
Type := gamedata.GetIntValue(v, "Type")
if Type == 0 {
continue
}
if _, ok := r[Type]; !ok {
r[Type] = make([]int, 0)
}
if Id == 0 {
log.Debug("GetOrderItemByGrade Id is 0, Type:%v", Type)
continue
}
r[Type] = append(r[Type], Id)
}
return r
}
func GetOrderItemList() []int {
data, err := gamedata.GetData(CFG_PLAYROOM_ORDERITEM)
if err != nil {
log.Debug("GetOrderItemList err:%v", err)
return nil
}
r := make([]int, 0, len(data))
for k := range data {
Id := GoUtil.Int(k)
if Id == 0 {
log.Debug("GetOrderItemList Id is 0")
continue
}
r = append(r, Id)
}
return r
}
func GetPetOrderItemExpByList(ItemList []*item.Item) int {
r := 0
for _, v := range ItemList {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_ORDERITEM, v.Id)
if err != nil {
// log.Debug("GetPetOrderItemExpByList err:%v", err)
continue
}
Star := gamedata.GetIntValue(data, "Star")
r += Star * v.Num
}
return r
}
func GetShopItemAdNum(Id int) int {
data, err := gamedata.GetData(CFG_PLAYROOM_SHOP)
if err != nil {
log.Debug("GetShopItemAdNum err:%v", err)
return 0
}
for _, v := range data {
if gamedata.GetIntValue(v, "ItemId") == Id {
return gamedata.GetIntValue(v, "Dailystorage")
}
}
return 0
}
func GetDecoInfo(Id int) (int, string) {
data, err := gamedata.GetDataByIntKey(CFG_PLAYROOM_DECORATE, Id)
if err != nil {
log.Debug("GetDecoInfo err:%v", err)
return 0, ""
}
Type := gamedata.GetIntValue(data, "TypeEnum")
Name := gamedata.GetStringValue(data, "Chinese")
return Type, Name
}
func GetDailyTaskListById(Id int) []int {
data, err := gamedata.GetData(CFG_PLAYROOM_DAILYTASK)
if err != nil {
log.Debug("GetDailyTaskListById err:%v", err)
return nil
}
Type := GetDailyTaskType(Id)
r := make([]int, 0, len(data))
for k, v := range data {
if gamedata.GetIntValue(v, "Type") == Type {
r = append(r, GoUtil.Int(k))
}
}
return r
}
func GetItemAddPhysiology(Item map[int]int) int {
r := 0
data, err := gamedata.GetData(CFG_PLAYROOM_MOOD)
if err != nil {
log.Debug("GetItemAddPhysiology err")
return 0
}
for _, v := range data {
costItem := gamedata.GetItemList(v, "Cost2")
if len(costItem) < 1 {
continue
}
if costItem[0].Id == 0 {
continue
}
if val, ok := Item[costItem[0].Id]; ok {
r += gamedata.GetIntValue(v, "PEffect") * val
}
}
return r
}
func GetPlayroomTaskDailyNum1() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum1")
if err != nil {
log.Debug("GetPlayroomTaskDailyNum1 err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetPlayroomTaskDailyNum2() int {
data, err := gamedata.GetDataByKey(CFG_PLAYROOM_CONST, "dailytask_groupnum2")
if err != nil {
log.Debug("GetPlayroomTaskDailyNum2 err:%v", err)
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -1,78 +0,0 @@
package raceCfg
import (
"server/game/mod/item"
"server/gamedata"
)
const (
CFG_RACE_TEMPLATE = "RaceTemplate"
CFG_RACE_PASS = "RacePass"
)
func init() {
gamedata.InitCfg(CFG_RACE_TEMPLATE)
gamedata.InitCfg(CFG_RACE_PASS)
}
func GetRaceNum(Pass int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Pass)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Num")
}
func GetRaceNeed(Pass int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Pass)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Need")
}
func GetMaxPass(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "PassNum")
}
func GetActivityItemId(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetCD(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "Cd")
}
func GetCoin(Id int) int {
data, err := gamedata.GetDataByIntKey(CFG_RACE_TEMPLATE, Id)
if err != nil {
return 0
}
return gamedata.GetIntValue(data, "ItemId")
}
func GetExtraReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "ExtraReward")
}
func GetReward(Id int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_RACE_PASS, Id)
if err != nil {
return nil
}
return gamedata.GetItemList(data, "Reward")
}

View File

@ -1,52 +0,0 @@
package randnameCfg
import (
GoUtil "server/game_util"
"server/gamedata"
"strconv"
)
const (
CFG_RAND_NAME = "RandName"
)
func init() {
gamedata.InitCfg(CFG_RAND_NAME)
}
func GetRandName() string {
data, _ := gamedata.GetData(CFG_RAND_NAME)
Id := GoUtil.RandNum(1, len(data))
v, err := gamedata.GetDataByIntKey(CFG_RAND_NAME, Id)
if err != nil {
return "Lily"
}
return gamedata.GetStringValue(v, "EnName")
}
func GetRandNames(n int) []string {
rs := make([]string, 0)
data, err := gamedata.GetData(CFG_RAND_NAME)
if err != nil {
for i := 0; i < n; i++ {
id := strconv.Itoa(i + 1)
rs[i] = "Lily" + id
}
}
all := make([]int, len(data))
index := 0
for k := range data {
ik := GoUtil.Int(k)
all[index] = ik
index++
}
ids := GoUtil.RandSliceNumNonAdjacent(all, n)
for _, v := range ids {
v, err := gamedata.GetDataByIntKey(CFG_RAND_NAME, v)
if err != nil {
rs = append(rs, "Lucy")
}
rs = append(rs, gamedata.GetStringValue(v, "EnName"))
}
return rs
}

View File

@ -1,49 +1,32 @@
{
"AppID": 0,
"LogLevel": "debug",
"LogPath": "./log",
"TCPAddr": ":3602",
"WSAddr": ":3567",
"RPCAddr": ":50051",
"LogPath": "",
"TCPAddr": ":3565",
"WSAddr": ":3566",
"MySqlAddr": "127.0.0.1",
"MySqlPort": "3306",
"MySqlUsr": "root",
"MySqlPwd": "IOagNEq3C84c-20CmHEin5iODVc=",
"MySqlPwd": "root",
"MaxConnNum": 20000,
"DbName": "merge_pet_1",
"DbName": "Merge_Pet",
"HttpPort": ":8081",
"AppPath": "./app",
"TELOGDIR" : "./teLog/",
"GameName": "pet_home_local",
"RemoteAddr":"host.docker.internal:9001",
"GameName": "Merge_Pet",
"GameID": 1,
"ServerType":"node",
"ServerID": 1,
"ServerOpenTime": "2018-01-01 00:00:00",
"ServerName": "Merge_Pet",
"ServerStatus" : 1,
"ServerCenter" : 0,
"GameConfPath": "D:/Github/pet_home_server/src/server/gamedata/config/",
"ServerCenter" : 1,
"ListenAddr":":9002",
"CenterAddr": "127.0.0.1:7000",
"RemoteAddr":"127.0.0.1:9002",
"RedisAddr":"127.0.0.1",
"RedisPort" :"6379",
"RedisAddr":"127.0.0.1",
"RedisPort" :"6379",
"RedisPwd" :"",
"RedisWriteAddr":"127.0.0.1:6379",
"RedisReadAddrs":"127.0.0.1:6379",
"RedisMasterName":"mymaster",
"RedisConnType":"Direct",
"GoogleVerify":false,
"Partition":3,
"KafkaHost":"kafka-server",
"CountryCode":"004",
"KafkaPort":"9092",
"Version":"1.0.0",
"IdVerify":false
"ListenAddr": ":9001",
"CenterAddr": ":3560"
}

View File

@ -29,18 +29,18 @@ func GetSevenLoginReward() []*gamedata.SevenLoginRewardData {
var result []*gamedata.SevenLoginRewardData
for k, v := range data {
Id, _ := strconv.Atoi(k)
Energy := gamedata.GetFloatValue(v, "Energy")
Diamond := gamedata.GetIntValue(v, "Diamond")
RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{
Id: Id,
Energy: Energy,
Diamond: Diamond,
RewardNum: RewardNum,
})
}
return result
}
func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
func GetSevenLoginMonthReward() []*gamedata.SevenLoginRewardData {
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_MONTH)
if err != nil {
log.Debug("GetSevenLoginReward err:%v", err)
@ -48,23 +48,19 @@ func GetSevenLoginMonthReward(nowMonth int) []*gamedata.SevenLoginRewardData {
}
var result []*gamedata.SevenLoginRewardData
for k, v := range data {
month := gamedata.GetIntValue(v, "Month")
if month != nowMonth {
continue
}
Id, _ := strconv.Atoi(k)
Energy := gamedata.GetFloatValue(v, "Energy")
Diamond := gamedata.GetIntValue(v, "Diamond")
RewardNum := gamedata.GetIntValue(v, "RewardNum")
result = append(result, &gamedata.SevenLoginRewardData{
Id: Id,
Energy: Energy,
Diamond: Diamond,
RewardNum: RewardNum,
})
}
return result
}
func GetSevenLoginJackpot(isMonth, level int) []*gamedata.SevenLoginJackpotData {
func GetSevenLoginJackpot(IsMonth int) []*gamedata.SevenLoginJackpotData {
data, err := gamedata.GetData(CFG_SEVEN_LOGIN_JACKPOT)
if err != nil {
log.Debug("GetSevenLoginJackpot err:%v", err)
@ -73,24 +69,20 @@ func GetSevenLoginJackpot(isMonth, level int) []*gamedata.SevenLoginJackpotData
var result []*gamedata.SevenLoginJackpotData
for k, v := range data {
Id, _ := strconv.Atoi(k)
Energy := gamedata.GetFloatValue(v, "Energy")
Diamond := gamedata.GetIntValue(v, "Diamond")
Type := gamedata.GetIntValue(v, "Type")
Month := gamedata.GetIntValue(v, "Month")
Level := gamedata.GetIntValue(v, "Level")
if isMonth != Month && isMonth != 0 {
continue
}
if level < Level && level != 0 {
if IsMonth != Month && IsMonth != 0 {
continue
}
ItemMap := gamedata.GetValue(v, "Item")
Items := item.ParseItem(ItemMap)
result = append(result, &gamedata.SevenLoginJackpotData{
Id: Id,
Energy: Energy,
Items: Items,
Type: Type,
Month: Month,
Id: Id,
Diamond: Diamond,
Items: Items,
Type: Type,
Month: Month,
})
}
return result

View File

@ -18,7 +18,7 @@ func GetStartChessList() []int {
var ChessList []int
for _, v := range data {
v1 := v.(map[string]interface{})
ChessList = append(ChessList, gamedata.GetIntValue(v1, "MergeId"))
ChessList = append(ChessList, gamedata.ParseInt(v1["MergeId"]))
}
return ChessList
}

View File

@ -0,0 +1,85 @@
package userCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
var CFG_NAME = "UserData"
func init() {
gamedata.InitCfg(CFG_NAME)
}
// 获取用户能量倍数
func GetEnergyMulByLv(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetEnergyMulByLv lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "EnergyMul")
}
// 获取七天登录加成
func GetSevenloginAdd(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetSevenloginAdd lv:%v not found", Lv)
return 0
}
return gamedata.GetIntValue(data, "SevenLogin")
}
// 获取订单系数
func GetOrderNByLv(lv int) (int, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetOrderNByLv lv:%v not found", lv)
return 0, err
}
return gamedata.GetIntValue(data, "OrderN"), nil
}
// 获取升级经验
func GetLevUpExp(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpExp lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "Exp")
}
// 获取能量回复时间
func GetRecover(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetRecover lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "Recover")
}
// 获取解锁背包数量
func GetUnlockPack(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetUnlockPack lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "UnlockPack")
}
// 获取升级奖励
func GetLevUpReward(lv int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpReward lv:%v not found", lv)
return nil
}
itemMap := gamedata.GetValue(data, "Item")
itemList := item.ParseItem(itemMap)
return itemList
}

View File

@ -1,168 +0,0 @@
package userCfg
import (
"server/game/mod/item"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/log"
)
const (
CFG_NAME = "UserData"
CFG_NANE_CONST = "UserDataConst"
)
func init() {
gamedata.InitCfg(CFG_NAME)
gamedata.InitCfg(CFG_NANE_CONST)
}
// 获取用户能量倍数
func GetEnergyMulByLv(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetEnergyMulByLv lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "EnergyMul")
}
func GetEnergyMax(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetEnergyMax lv:%v not found", Lv)
return 0
}
return gamedata.GetIntValue(data, "MaxEnergy")
}
// 获取七天登录加成
func GetSevenloginAdd(Lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetSevenloginAdd lv:%v not found", Lv)
return 0
}
return gamedata.GetIntValue(data, "SevenLogin")
}
// 获取订单系数
func GetOrderNByLv(lv int) (int, error) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetOrderNByLv lv:%v not found", lv)
return 0, err
}
return gamedata.GetIntValue(data, "OrderN"), nil
}
// 获取升级经验
func GetLevUpExp(lv int) (int, int) {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpExp lv:%v not found", lv)
return 0, 0
}
return gamedata.GetIntValue(data, "Exp"), gamedata.GetIntValue(data, "PExp")
}
func GetNewLevUpExp(lv int, Exp int, PetExt int) (int, int) {
ExpLv := lv
PetLv := lv
for {
data1, err := gamedata.GetDataByIntKey(CFG_NAME, ExpLv)
if err != nil {
break
}
ExpNeed := gamedata.GetIntValue(data1, "Exp")
if Exp >= ExpNeed {
Exp -= ExpNeed
ExpLv++
} else {
break
}
}
for {
data2, err := gamedata.GetDataByIntKey(CFG_NAME, PetLv)
if err != nil {
break
}
PetNeed := gamedata.GetIntValue(data2, "PExp")
if PetExt >= PetNeed {
PetExt -= PetNeed
PetLv++
} else {
break
}
}
return ExpLv, PetLv
}
// 获取能量回复时间
func GetRecover(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetRecover lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "Recover")
}
// 获取解锁背包数量
func GetUnlockPack(lv int) int {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetUnlockPack lv:%v not found", lv)
return 0
}
return gamedata.GetIntValue(data, "UnlockPack")
}
// 获取升级奖励
func GetLevUpReward(lv int) []*item.Item {
data, err := gamedata.GetDataByIntKey(CFG_NAME, lv)
if err != nil {
log.Debug("UserDataCfg GetLevUpReward lv:%v not found", lv)
return nil
}
itemMap := gamedata.GetValue(data, "Item")
itemList := item.ParseItem(itemMap)
return itemList
}
func GetUnlock(Lv int) string {
data, err := gamedata.GetDataByIntKey(CFG_NAME, Lv)
if err != nil {
log.Debug("UserDataCfg GetUnlock lv:%v not found", Lv)
return ""
}
s1 := gamedata.GetStringValue(data, "Unlock_1")
s2 := gamedata.GetStringValue(data, "Unlock_2")
return s1 + "," + s2
}
func GetInitEnergy() int {
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Energy")
if err != nil {
log.Debug("UserDataCfg GetInitEnergy not found")
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInitDiamond() int {
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Diamond")
if err != nil {
log.Debug("UserDataCfg GetInitDiamond not found")
return 0
}
return gamedata.GetIntValue(data, "Value")
}
func GetInitStar() int {
data, err := gamedata.GetDataByKey(CFG_NANE_CONST, "Star")
if err != nil {
log.Debug("UserDataCfg GetInitStar not found")
return 0
}
return gamedata.GetIntValue(data, "Value")
}

View File

@ -56,17 +56,18 @@ type Parser struct {
//
// Examples
//
// // Standard parser without descriptors
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
// sched, err := specParser.Parse("0 0 15 */3 *")
// // Standard parser without descriptors
// specParser := NewParser(Minute | Hour | Dom | Month | Dow)
// sched, err := specParser.Parse("0 0 15 */3 *")
//
// // Same as above, just excludes time fields
// subsParser := NewParser(Dom | Month | Dow)
// sched, err := specParser.Parse("15 */3 *")
// // Same as above, just excludes time fields
// subsParser := NewParser(Dom | Month | Dow)
// sched, err := specParser.Parse("15 */3 *")
//
// // Same as above, just makes Dow optional
// subsParser := NewParser(Dom | Month | DowOptional)
// sched, err := specParser.Parse("15 */3")
//
// // Same as above, just makes Dow optional
// subsParser := NewParser(Dom | Month | DowOptional)
// sched, err := specParser.Parse("15 */3")
func NewParser(options ParseOption) Parser {
optionals := 0
if options&DowOptional > 0 {
@ -192,7 +193,7 @@ func normalizeFields(fields []string, options ParseOption) ([]string, error) {
if min < max && len(fields) == min {
switch {
case options&DowOptional > 0:
fields = append(fields, defaults[5])
fields = append(fields, defaults[5]) // TODO: improve access to default
case options&SecondOptional > 0:
fields = append([]string{defaults[0]}, fields...)
default:
@ -246,9 +247,7 @@ func getField(field string, r bounds) (uint64, error) {
}
// getRange returns the bits indicated by the given expression:
//
// number | number "-" number [ "/" number ]
//
// number | number "-" number [ "/" number ]
// or error parsing range.
func getRange(expr string, r bounds) (uint64, error) {
var (

View File

@ -1,129 +1,38 @@
package db
import (
"database/sql"
//"database/sql"
"fmt"
"reflect"
"server/MergeConst"
"server/GoUtil"
"server/conf"
GoUtil "server/game_util"
"server/pkg/github.com/name5566/leaf/log"
"strings"
"sync"
"time"
// "server/game"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
type user struct {
Id int `db:"user_id"`
Sex int `db:"sex"`
UserName string `db:"username"`
Email string `db:"email"`
}
var SqlDb *sqlx.DB
var sqlDbMu sync.RWMutex
// GetDB 线程安全地获取数据库连接
func GetDB() *sqlx.DB {
sqlDbMu.RLock()
defer sqlDbMu.RUnlock()
return SqlDb
}
// GetDBOrPanic 获取数据库连接,如果为 nil 则记录错误
func GetDBOrPanic() *sqlx.DB {
db := GetDB()
if db == nil {
log.Error("Database connection is nil, please check database initialization")
}
return db
}
// EnsureDB 确保数据库连接可用,如果不可用则返回错误
func EnsureDB() (*sqlx.DB, error) {
db := GetDB()
if db == nil {
return nil, fmt.Errorf("database connection is nil")
}
if err := db.Ping(); err != nil {
return nil, fmt.Errorf("database ping failed: %w", err)
}
return db, nil
}
// 封装创建连接
func connectMySQL() (*sqlx.DB, error) {
MysqlPwd, _ := GoUtil.Decrypt(conf.Server.MySqlPwd)
// 减少超时时间,避免长时间阻塞
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s?timeout=10s&readTimeout=15s&writeTimeout=15s&parseTime=true", conf.Server.MySqlUsr, MysqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
db, err := sqlx.Connect("mysql", connect)
if err != nil {
return nil, err
}
// 增加最大连接数,减少连接等待时间
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(20)
db.SetConnMaxLifetime(30 * time.Minute) // 减少连接生命周期
db.SetConnMaxIdleTime(5 * time.Minute) // 减少空闲时间
return db, nil
}
func InitDB() {
//"用户名:密码@[连接方式](主机名:端口号)/数据库名"
db, err := connectMySQL()
if err != nil {
log.Debug("connect mysql failed: %v", err)
return
}
sqlDbMu.Lock()
SqlDb = db
sqlDbMu.Unlock()
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s", conf.Server.MySqlUsr, conf.Server.MySqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
SqlDb = sqlx.MustConnect("mysql", connect) // 设置连接数据库的参数
SqlDb.SetMaxOpenConns(20) // 设置最大打开的连接数
log.Debug("connect mysql success")
// 定时检测与重连
go func() {
ticker := time.NewTicker(5 * time.Second) // 改为5秒检测一次降低频率
defer ticker.Stop()
for range ticker.C {
sqlDbMu.RLock()
cur := SqlDb
sqlDbMu.RUnlock()
if cur == nil {
log.Debug("mysql connection is nil, start reconnect")
ReconnectDB()
continue
}
// Ping 操作不持有锁,避免阻塞其他操作
if err := cur.Ping(); err != nil {
log.Debug("mysql ping failed: %v, start reconnect", err)
ReconnectDB()
}
}
}()
}
// 自动重连
func ReconnectDB() {
sqlDbMu.Lock()
defer sqlDbMu.Unlock()
newDb, err := connectMySQL()
if err != nil {
log.Debug("mysql reconnect failed: %v", err)
return
}
if SqlDb != nil {
_ = SqlDb.Close()
}
SqlDb = newDb
log.Debug("mysql reconnect success")
}
func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
tx, err := sqlDb.Begin()
tx, err := SqlDb.Begin()
if err != nil {
log.Debug("Transaction failed, err:%v\n", err)
return err
@ -151,6 +60,61 @@ func SeriesTransaction(sqlstrs []string, params [][]any) (err error) {
return
}
// 更新数据
func FormatUpdateOneAttrRow(u interface{}, tableName string, UpdateAttr string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len1 := t.Elem().NumField()
Fields := make([]string, len1)
Values := make([]interface{}, len1)
pp := reflect.ValueOf(u)
origin := "UPDATE " + tableName + " SET "
index := 0
var keyValue interface{}
for i := 0; i < len1; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") != Exclude {
if field.Tag.Get("db") == UpdateAttr {
Fields[index] = field.Tag.Get("db") + " = ?"
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
Values[index] = ufield.String()
}
if k == reflect.Int32 {
Values[index] = ufield.Int()
}
index++
}
} else {
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 {
keyValue = ufield.Int()
}
}
}
Values[index] = keyValue
// Values = append(Values, keyValue)
origin += strings.Join(Fields, ",")
strLen := len(origin)
origin = origin[:strLen-1]
origin = origin + " WHERE " + Exclude + " = ?"
sqlStr := origin
_, err = SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
return
}
return
}
// "UPDATE user SET age = ?, degree = ? WHERE id = ?"
func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
@ -181,7 +145,7 @@ func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
if k == reflect.Int32 || k == reflect.Int {
keyValue = ufield.Int()
}
}
@ -223,9 +187,6 @@ func FormatAllMemInsertDb(u interface{}, tableName string) (insertID int64, err
if k == reflect.Int32 {
Values[i] = ufield.Int()
}
if k == reflect.Int64 {
Values[i] = ufield.Int()
}
}
for i := range Fields {
Fields[i] = "`" + Fields[i] + "`"
@ -258,28 +219,6 @@ func GetPlayerBaseInfoFromDbByName(name string) *ResPlayerBaseInfo {
return &res
}
func GetPlayerBan(name string) int64 {
sqlStr := "SELECT ban FROM t_player_baseinfo WHERE user_name = ?"
var ban int64
if err := SqlDb.Get(&ban, sqlStr, name); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return 0
}
return ban
}
func UpdatePlayerBan(uid int64, ban int64) error {
sqlStr := "UPDATE t_player_baseinfo SET ban = ? WHERE dwUin = ?"
_, err := SqlDb.Exec(sqlStr, ban, uid)
return err
}
func UpdatePlayerBaseInfoName(oldName, newName string) error {
sqlStr := "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, newName, oldName)
return err
}
func GetPlayerBaseInfoFromDbById(id int32) *ResPlayerBaseInfo {
sqlStr := "SELECT * FROM t_player_baseinfo WHERE dwUin = ?"
var res ResPlayerBaseInfo
@ -294,92 +233,73 @@ func GetAccountInfoFromDb(name string) *Db_Account {
sqlStr := "SELECT * FROM t_account WHERE user_name = ?"
var res Db_Account
if err := SqlDb.Get(&res, sqlStr, name); err != nil {
log.Debug("登录的账号不存在:%s", name)
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "account", sqlStr, err)
return nil
}
return &res
}
func ResetAccountData(oldName, newName string) error {
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, newName, oldName)
if err != nil {
func FormatAllMemLoadDb(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len := t.Elem().NumField()
Fields := make([]string, len)
Values := make([]interface{}, len)
pp := reflect.ValueOf(u)
origin := "SELECT * FROM " + tableName + " WHERE "
index := 0
var keyValue interface{}
for i := 0; i < len; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") != Exclude {
Fields[index] = field.Tag.Get("db") + " = ?"
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
Values[index] = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values[index] = ufield.Int()
}
index++
} else {
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String {
keyValue = ufield.String()
}
if k == reflect.Int32 {
keyValue = ufield.Int()
}
}
}
Values[index] = keyValue
// Values = append(Values, keyValue)
origin += strings.Join(Fields, " AND ")
sqlStr := origin
if err := SqlDb.Get(u, sqlStr, Values...); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err)
return err
}
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, newName, oldName)
return err
}
func MappingAccountData(oldName, newName string) error {
sqlStr := "UPDATE t_account SET user_name = ? WHERE user_name = ?"
_, err := SqlDb.Exec(sqlStr, "", oldName)
if err != nil {
return err
}
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, "", oldName)
if err != nil {
return err
}
sqlStr = "UPDATE t_account SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, oldName, newName)
if err != nil {
return err
}
sqlStr = "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?"
_, err = SqlDb.Exec(sqlStr, oldName, newName)
return err
}
func UpdateAccountInfoToDb(account *Db_Account) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName)
return
}
func UpdateAccountInfoName(account *Db_Account, newName string) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET user_name = ? WHERE user_name = ?", newName, account.UserName)
return
}
func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) {
_, err = SqlDb.Exec("UPDATE t_account SET device_id = ? WHERE user_name = ?", account.DeviceId, account.UserName)
return
}
func GetServerData(d interface{}, Key string) (err error) {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
sql := "select * from t_server_mod where `key` = ?"
err = sqlDb.Get(d, sql, Key)
err = SqlDb.Get(d, sql, Key)
return
}
func SaveServerData(data *SqlServerModStruct) error {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?"
_, err := sqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
return err
}
func SaveServerDataWithTx(tx *sql.Tx, data *SqlServerModStruct) error {
sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?"
_, err := tx.Exec(sql, data.ModData, data.UpdataTime, data.Key)
_, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
return err
}
func InsertServerData(data *SqlServerModStruct) error {
sqlDb := GetDB()
if sqlDb == nil {
return fmt.Errorf("database connection is nil")
}
sql := "insert into t_server_mod (`mData` , `updateTime` ,`key`) Values (?,?,?)"
_, err := sqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
_, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key)
return err
}
@ -407,22 +327,113 @@ func GetPlayerClientData(d interface{}, Key string) (err error) {
return
}
func InsertData(u interface{}, tableName string) (insertID int64, err error) {
t := reflect.TypeOf(u)
len := t.Elem().NumField()
Fields := make([]string, 0)
Fields1 := make([]string, 0)
Values := make([]interface{}, 0)
pp := reflect.ValueOf(u)
origin := "INSERT INTO " + tableName + "("
for i := 0; i < len; i++ {
field := t.Elem().Field(i)
if field.Tag.Get("db") == "id" {
continue
}
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if k == reflect.String && ufield.String() == "" {
continue
}
if (k == reflect.Int32 || k == reflect.Int || k == reflect.Int64) && ufield.Int() == 0 {
continue
}
if k == reflect.String {
Values = append(Values, ufield.String())
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values = append(Values, ufield.Int())
}
Fields = append(Fields, field.Tag.Get("db"))
Fields1 = append(Fields1, "?")
}
for i := range Fields {
Fields[i] = "`" + Fields[i] + "`"
}
origin += strings.Join(Fields, ",")
origin += ") VALUES("
origin += strings.Join(Fields1, ",")
origin += ")"
sqlStr := origin
result, err := SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("InsertData exec failed, sql : %s ;err:%v\n", sqlStr, err)
return
}
insertID, err = result.LastInsertId()
if err != nil {
log.Debug("InsertData exec failed, err:%v\n", err)
return
}
return
}
func UpdateData(u interface{}, tableName string, Exclude string) (err error) {
t := reflect.TypeOf(u)
len1 := t.Elem().NumField()
Fields := make([]string, 0)
Values := make([]interface{}, 0)
pp := reflect.ValueOf(u)
origin := "UPDATE " + tableName + " SET "
var ExcludeValue interface{}
for i := 0; i < len1; i++ {
field := t.Elem().Field(i)
ufield := pp.Elem().FieldByName(field.Name)
k := ufield.Kind()
if field.Tag.Get("db") != Exclude && field.Tag.Get("db") != "id" {
if k == reflect.String {
Values = append(Values, ufield.String())
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
Values = append(Values, ufield.Int())
}
Fields = append(Fields, "`"+field.Tag.Get("db")+"` = ?")
}
if field.Tag.Get("db") == Exclude {
if k == reflect.String {
ExcludeValue = ufield.String()
}
if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 {
ExcludeValue = append(Values, ufield.Int())
}
}
}
Values = append(Values, ExcludeValue)
origin += strings.Join(Fields, ",")
origin = origin + " WHERE `" + Exclude + "` = ?"
sqlStr := origin
_, err = SqlDb.Exec(sqlStr, Values...)
if err != nil {
log.Debug("update failed, sql %s err:%v\n", sqlStr, err)
return
}
return
}
func GetServerMailData(data *[]*SqlServerMailStruct) error {
sql := "select * from system_mail_info"
err := SqlDb.Select(data, sql)
return err
}
func GetActivityData(data *[]*SqlActivityCfgStruct) error {
sql := "select `id`, `type`, `title`, `mail_title`, `mail_content`, `level_limit`, `start_time`, `end_time`, `cfg_buf`, `extra` from t_activity_mod"
err := SqlDb.Select(data, sql)
return err
}
func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency, Extra string) error {
sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`, `PayChannelExtra`) Values (?,?,?,?,?,?,?,?,?)"
func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency string) error {
sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`) Values (?,?,?,?,?,?,?,?)"
Now := GoUtil.Now()
_, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel, Extra)
_, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel)
return err
}
@ -433,49 +444,8 @@ func GetPlayerChargeData(OrderSn string) (*SqlChargeOrderStruct, error) {
return data, err
}
func GetPlayerChargeDataList(Uid int) ([]*SqlChargeOrderStruct, error) {
sql := "select * from t_player_charge where Uid = ? and PayStatus = ?"
data := &[]*SqlChargeOrderStruct{}
err := SqlDb.Select(data, sql, Uid, MergeConst.ORDER_STATUS_PAY)
return *data, err
}
func GetPlayerPayChannelOrderId(OrderSn string) (*SqlChargeOrderStruct, error) {
sql := "select * from t_player_charge where PayChannelOrderId = ?"
data := &SqlChargeOrderStruct{}
err := SqlDb.Get(data, sql, OrderSn)
return data, err
}
func UpdatePlayerChargeData(data *SqlChargeOrderStruct) error {
sql := "update t_player_charge set PayTime = ?, PayStatus = ?, PayChannelOrderId = ? where OrderId = ?"
_, err := SqlDb.Exec(sql, data.PayTime, data.PayStatus, data.PayChannelOrderId, data.OrderId)
return err
}
func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) {
sql := "select * from t_player_baseinfo where nick_name like ? limit 10"
data := &[]*ResPlayerBaseInfo{}
err := SqlDb.Select(data, sql, "%"+key+"%")
return *data, err
}
func GetCommendPlayerFromDb(uid, login int64, level int) ([]int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? AND logout_time > ? AND level >= ? ORDER BY logout_time DESC LIMIT 1000"
var res []int
if err := SqlDb.Select(&res, sqlStr, uid, login, level); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return nil, err
}
return res, nil
}
func GetDebugPlayer(uid int) ([]int, error) {
sqlStr := "SELECT dwUin FROM t_player_baseinfo WHERE dwUin != ? ORDER BY login_time DESC LIMIT 1000"
var res []int
if err := SqlDb.Select(&res, sqlStr, uid); err != nil {
log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err)
return nil, err
}
return res, nil
}

View File

@ -4,7 +4,6 @@ import (
"context"
"server/conf"
"server/pkg/github.com/name5566/leaf/log"
"strings"
"time"
"github.com/redis/go-redis/v9"
@ -12,118 +11,34 @@ import (
var ctx = context.Background()
var RdbWrite *redis.Client
var RdbRead *redis.Client
var Rdb *redis.Client
// helper: 创建单个客户端addr 可以为 host:port 或 host
func connectClient(addr string) (*redis.Client, error) {
if addr == "" {
return nil, nil
}
// 如果没有端口且配置了旧的 RedisPort则尝试补端口
if !strings.Contains(addr, ":") && conf.Server.RedisPort != "" {
addr = addr + ":" + conf.Server.RedisPort
}
rdb := redis.NewClient(&redis.Options{
Addr: addr,
Password: conf.Server.RedisPwd,
DB: conf.Server.RedisDb,
})
if _, err := rdb.Ping(ctx).Result(); err != nil {
return nil, err
}
return rdb, nil
}
// InitRedis: 初始化读写分离客户端(向后兼容旧配置)
func InitRedis() {
// 决定写地址:优先使用 RedisWriteAddr其次使用旧的 RedisAddr:RedisPort
writeAddr := conf.Server.RedisWriteAddr
if writeAddr == "" {
if conf.Server.RedisAddr != "" {
writeAddr = conf.Server.RedisAddr
if conf.Server.RedisPort != "" && !strings.Contains(writeAddr, ":") {
writeAddr = writeAddr + ":" + conf.Server.RedisPort
}
}
}
rdb := redis.NewClient(&redis.Options{
Addr: conf.Server.RedisAddr + ":" + conf.Server.RedisPort,
Password: conf.Server.RedisPwd, // no password set
DB: 0,
})
// 决定读地址:优先使用 RedisReadAddrs逗号分隔若为空则回退到写地址
readAddrs := conf.Server.RedisReadAddrs
if strings.TrimSpace(readAddrs) == "" {
readAddrs = writeAddr
}
// 取第一个可用的只读地址(简单实现)
var readClient *redis.Client
for _, a := range strings.Split(readAddrs, ",") {
a = strings.TrimSpace(a)
if a == "" {
continue
}
c, err := connectClient(a)
if err == nil {
readClient = c
break
}
log.Debug("connect read addr %s failed: %v", a, err)
}
// 如果所有只读都不可用,尝试连接写地址作为回退
writeClient, err := connectClient(writeAddr)
_, err := rdb.Ping(ctx).Result()
if err != nil {
log.Debug("连接redis写节点出错错误信息%v", err)
// 若读已连上则也作为写回退,否则返回
if readClient != nil {
RdbWrite = readClient
RdbRead = readClient
log.Debug("只有只读节点可用,读写共用该节点")
return
}
log.Debug("连接redis出错错误信息%v", err)
return
}
// 如果读未连接成功,读回退到写
if readClient == nil {
readClient = writeClient
}
RdbWrite = writeClient
RdbRead = readClient
log.Debug("成功初始化 redis读写分离写: %v, 读: %v", writeAddr, readAddrs)
log.Debug("成功连接redis")
Rdb = rdb
}
// 写操作使用 RdbWrite
func RedisSetKey(key string, value string, expiration time.Duration) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Set(ctx, key, value, expiration).Err()
err := Rdb.Set(ctx, key, value, expiration).Err()
if err != nil {
log.Debug("redis set failed, err:%v\n", err)
}
}
// 新增:写入字节数据,避免 string 转换拷贝
func RedisSetKeyBytes(key string, value []byte, expiration time.Duration) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Set(ctx, key, value, expiration).Err()
if err != nil {
log.Debug("redis set failed, err:%v\n", err)
}
}
// 获取锁(写)
// 获取锁
func RedisLock(key string, value string, expiration time.Duration) bool {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return false
}
ok, err := RdbWrite.SetNX(ctx, key, value, expiration).Result()
ok, err := Rdb.SetNX(ctx, key, value, expiration).Result()
if err != nil {
log.Debug("redis lock failed, err:%v\n", err)
return false
@ -131,12 +46,8 @@ func RedisLock(key string, value string, expiration time.Duration) bool {
return ok
}
// 释放锁(写)
// 释放锁
func RedisUnlock(key string, value string) bool {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return false
}
script := `
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
@ -144,7 +55,7 @@ func RedisUnlock(key string, value string) bool {
return 0
end
`
result, err := RdbWrite.Eval(ctx, script, []string{key}, value).Result()
result, err := Rdb.Eval(ctx, script, []string{key}, value).Result()
if err != nil {
log.Debug("redis unlock failed, err:%v\n", err)
return false
@ -152,134 +63,25 @@ func RedisUnlock(key string, value string) bool {
return result.(int64) == 1
}
// 读操作使用 RdbRead
func RedisGetKey(key string) (string, error) {
if RdbRead == nil {
return "", nil
}
val, err := RdbRead.Get(ctx, key).Result()
val, err := Rdb.Get(ctx, key).Result()
if err != nil {
log.Debug("redis get failed, err:%v\n", err)
return "", err
}
return val, nil
}
func RedisGetKeyBytes(key string) ([]byte, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.Get(ctx, key).Bytes()
if err != nil {
return nil, err
}
return val, nil
}
func RedisDelKey(key string) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Del(ctx, key).Err()
err := Rdb.Del(ctx, key).Err()
if err != nil {
log.Debug("redis del failed, err:%v\n", err)
}
}
func RedisZAdd(key string, member string, score float64) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err()
err := Rdb.ZAdd(ctx, key, redis.Z{Score: score, Member: member}).Err()
if err != nil {
log.Debug("redis zadd failed, err:%v\n", err)
return
}
const maxRankSize int64 = 10000
count, err := RdbWrite.ZCard(ctx, key).Result()
if err != nil {
log.Debug("redis zcard failed, err:%v\n", err)
return
}
if count > maxRankSize {
removeCount := count - maxRankSize
err = RdbWrite.ZRemRangeByRank(ctx, key, 0, removeCount-1).Err()
if err != nil {
log.Debug("redis zremrangebyrank failed, err:%v\n", err)
}
}
}
func RedisZRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRangeWithScores(ctx, key, start, stop).Result()
if err != nil {
return nil, err
}
return val, nil
}
func RedisZRevRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRevRangeWithScores(ctx, key, start, stop).Result()
if err != nil {
return nil, err
}
return val, nil
}
func RedisZGetByIndexWithScore(key string, index int64) (*redis.Z, error) {
if RdbRead == nil {
return nil, nil
}
val, err := RdbRead.ZRangeWithScores(ctx, key, index, index).Result()
if err != nil {
return nil, err
}
if len(val) == 0 {
return nil, nil
}
return &val[0], nil
}
func RedisZRankWithScores(key, member string) (int64, float64, error) {
if RdbRead == nil {
return 0, 0, nil
}
val, err := RdbRead.ZRank(ctx, key, member).Result()
if err != nil {
return 0, 0, err
}
score, err := RdbRead.ZScore(ctx, key, member).Result()
if err != nil {
return 0, 0, err
}
return val, score, nil
}
func RedisZCard(key string) (int64, error) {
if RdbRead == nil {
return 0, nil
}
val, err := RdbRead.ZCard(ctx, key).Result()
if err != nil {
return 0, err
}
return val, nil
}
func RedisDel(key string) {
if RdbWrite == nil {
log.Debug("redis write client is nil")
return
}
err := RdbWrite.Del(ctx, key).Err()
if err != nil {
log.Debug("redis del failed, err:%v\n", err)
}
}

View File

@ -20,12 +20,10 @@ type Db_Account struct {
Channel string `db:"channel"`
DeviceId string `db:"device_id"`
AutoId int `db:"auto_id"`
IdName string `db:"id_name"`
IdNum string `db:"id_num"`
}
type ResPlayerBaseInfo struct {
DwUin int64 `db:"dwUin"`
DwUin int32 `db:"dwUin"`
Energy int32 `db:"energy"`
Star int32 `db:"star"`
RecoverTime int32 `db:"recover_time"`
@ -37,12 +35,11 @@ type ResPlayerBaseInfo struct {
Guild int32 `db:"guild"`
PackUnlockCount int32 `db:"pack_unlock_count"`
LastPlayTime int32 `db:"last_play_time"`
Ban int64 `db:"ban"`
EnergyBuyCount int32 `db:"EnergyBuyCount"`
UserName string `db:"user_name"`
NickName string `db:"nick_name"`
LoginTime int32 `db:"login_time"`
LogoutTime int32 `db:"logout_time"`
Node int32 `db:"node"`
Todayolinetime int32 `db:"todayolinetime"`
Rolecreatetime int32 `db:"rolecreatetime"`
EmitOrderCnt int32 `db:"EmitOrderCnt"`
DailyRenewTime int32 `db:"DailyRenewTime"`
@ -461,7 +458,7 @@ type SqlAddFriendStruct struct {
}
type SqlModStruct struct {
DwUin int64 `db:"dwUin"`
DwUin int32 `db:"dwUin"`
ModData []byte `db:"mData"`
UpdataTime int32 `db:"updateTime"`
}
@ -474,40 +471,15 @@ type SqlServerModStruct struct {
}
type SqlServerMailStruct struct {
Id int `db:"mail_id"`
Title string `db:"title"`
Content string `db:"content"`
SubTitle string `db:"subTitle"`
SubTitleEn string `db:"subTitle_en"`
TitleEn string `db:"title_en"`
ContentEn string `db:"content_en"`
TitlePtBr string `db:"title_ptbr"`
SubTitlePtBr string `db:"subTitle_ptbr"`
ContentPtBr string `db:"content_ptbr"`
TitleEsLatam string `db:"title_es_latam"`
SubTitleEsLatam string `db:"subTitle_es_latam"`
ContentEsLatam string `db:"content_es_latam"`
Items string `db:"items"`
Start_time int64 `db:"start_time"`
Register_time int64 `db:"register_time"`
End_time int64 `db:"end_time"`
Mail_type int `db:"mail_type"`
Send_type int `db:"send_type"`
To_uids string `db:"to_uids"`
CreateTime int64 `db:"create_time"`
}
type SqlActivityCfgStruct struct {
Id int `db:"id"`
Type int `db:"type"`
Title string `db:"title"`
MailTitle string `db:"mail_title"`
MailContent string `db:"mail_content"`
Level int `db:"level_limit"`
Start_time int64 `db:"start_time"`
End_time int64 `db:"end_time"`
Cfg []byte `db:"cfg_buf"`
Extra string `db:"extra"`
Id int `db:"mail_id"`
Title string `db:"title"`
Content string `db:"content"`
Items string `db:"items"`
Start_time int64 `db:"start_time"`
Register_time int64 `db:"register_time"`
End_time int64 `db:"end_time"`
Mail_type int `db:"mail_type"`
To_uids string `db:"to_uids"`
}
type SqlChargeOrderStruct struct {

View File

@ -1,41 +0,0 @@
package ga
import (
galog "github.com/tuyou/galog"
)
const (
PROJECT_ID = "20659"
CLIENT_ID = "Android_5.00_tyGuest,facebook.googleplay.0-hall20659.googleplay.Meowment"
)
var glogger *galog.GALogger
func init() {
glog, err := galog.NewGALogger("logs", PROJECT_ID, CLIENT_ID, galog.LogTypeTrack)
if err != nil {
panic(err)
}
glogger = glog
}
func GAlogEvent(event string, userID string, deviceID string, properties map[string]interface{}) {
newProperties := make(map[string]interface{})
for k, v := range properties {
// // JSON encode the value
// jsonBytes, err := json.Marshal(v)
// if err != nil {
// newProperties["proj_"+k] = fmt.Sprintf("%v", v) // 无法解析直接转为字符串
// continue
// }
// newProperties["proj_"+k] = string(jsonBytes)
newProperties["proj_"+k] = v
}
properties = newProperties
glogger.
GetEntry(event).
SetDeviceID(deviceID).
SetUserID(userID).
SetProperties(properties).
Flush()
}

View File

@ -1,7 +0,0 @@
.DS_Store
.vscode/
.idea/
*.log
logs/
ga_log/
asset_log/

View File

@ -1,292 +0,0 @@
# galog
galog是一个无三方依赖、支持单CPU最高5wQPS写入的ga-sdk组件可直接用于GA事实日志和资产日志打点。
> 说明:默认是异步写入模式,异步队列长度=100较大QPS时可自行调整详见参数
> - enableAsync
> - defaultAsyncMsgLen
## Usage
```golang
// ga日志初始化
projectID := "20433"
clientID := "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest"
glogger, err := galog.NewGALogger("logs", projectID, clientID, galog.LogTypeTrack)
if err != nil {
panic(err)
}
// ga日志打点调用
props := map[string]interface{}{
"ip_address": "127.0.0.1",
"proj_app_id": "10010",
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts": tt.UnixNano(),
}
glogger.
GetEntry("sdk_s_login_succ").
SetDeviceID("device001").
SetUserID("10086").
SetProperties(props).
Flush()
```
```golang
// asset日志初始化
projectID := "28"
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
glogger, err := galog.NewGALogger("logs", projectID, clientID, galog.LogTypeAsset)
if err != nil {
panic(err)
}
// asset日志打点调用
asset := galog.AssetProperties{}
asset.
SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", "uuid-v4")
glogger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
```
## suger usage
```golang
package chat_log
import (
"log"
"strconv"
"tygit.tuyoo.com/gocomponents/galog"
)
var (
slogger *galog.Logger
galogger *galog.GALogger
lerr error
)
// MustInitLoggerOnce 服务启动后初始化一次
func MustInitLoggerOnce() {
slogger, lerr = galog.NewServerLogger(&galog.ServerLogOptions{
LogDir: "run/logs",
EnableAsync: true,
AsyncQueueSize: 1000,
})
if lerr != nil {
log.Printf("MustInitLoggerOnce err: %s\n", lerr.Error())
panic("MustInitLoggerOnce err")
}
}
// MustInitGALoggerOnce 服务启动后初始化一次
func MustInitGALoggerOnce() {
galogger, lerr = galog.NewServerGALogger(&galog.ServerGALogOptions{
LogDir: "run/bi",
EnableAsync: true,
AsyncQueueSize: 1000,
ProjectID: ProjectId,
ClientID: ClientId,
LogType: galog.LogTypeTrack,
})
if lerr != nil {
log.Printf("MustInitGALoggerOnce err: %s\n", lerr.Error())
panic("MustInitGALoggerOnce err")
}
}
func LogToGANew(eventName, deviceId string, userId int64, prop map[string]interface{}, version string) {
lib := map[string]string{
"lib_type": "golang",
"lib_version": version,
}
galogger.
GetEntry(eventName).
SetDeviceID(deviceId).
SetUserID(strconv.FormatInt(userId, 10)).
SetLib(lib).
SetProperties(prop).
Flush()
}
```
## 日志目录结构
```
{logDir}/ga_log/{日志类型}_{hostname}_{年月日}_{小时}.log
{logDir}/asset_log/{日志类型}_{hostname}_{年月日}_{小时}.log
```
## Benchmark
- 测试机Mac-M1 8c 16G
- 同步写入模式
```
goos: darwin
goarch: arm64
pkg: tygit.tuyoo.com/gocomponents/galog
BenchmarkGaLog-8 87565 12831 ns/op 7590 B/op 90 allocs/op
BenchmarkAssetLog-8 234127 5832 ns/op 3028 B/op 44 allocs/op
PASS
ok tygit.tuyoo.com/gocomponents/galog 3.190s
# 100w行日志文件写入性能未见明显衰减
BenchmarkGaLog-8 89175 12481 ns/op 7590 B/op 90 allocs/op
BenchmarkAssetLog-8 195075 5933 ns/op 3028 B/op 44 allocs/op
```
- 异步写入模式(默认)
```
goos: darwin
goarch: arm64
pkg: tygit.tuyoo.com/gocomponents/galog
BenchmarkGaLog-8 95530 11331 ns/op 7599 B/op 90 allocs/op
BenchmarkAssetLog-8 337963 3512 ns/op 3032 B/op 44 allocs/op
PASS
ok tygit.tuyoo.com/gocomponents/galog 3.040s
# 120w行日志文件写入性能未见明显衰减
BenchmarkGaLog-8 116559 10450 ns/op 7598 B/op 90 allocs/op
BenchmarkAssetLog-8 335670 3512 ns/op 3032 B/op 44 allocs/op
```
## Load Testing
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o galog examples/hey.go
- 测试机sa101-ecs-bj4-pt57-test-wxy
- linux服务器配置2c4G
- 测试时间2024-02-26 17:45 ~ 18:45
```
./galog -n 1000000 -c 2 -q 100
```
| 压测说明 | CPU平台使用率 | 内存使用率 | IO平均使用率 | 进程打开的文件句柄数 |
|----- | ----- | ----- | ----- | ----- |
| 无任务 | 1% | 52% | 0.08% | 0 |
| 并发=2qps=200 | 1% | 52% | 0.08% | 7 |
| 并发=5qps=5000 | 4% | 52% | 1% | 7 |
| 并发=5qps=50000(队列1000有阻塞) realqps=5000 | 40% | 52% | 30% | 7 |
| 并发=5qps=50000(队列10000有阻塞) realqps=6500 | 6% | 52% | 1% | 7 |
| 并发=20qps=50000(队列10000有阻塞) realqps=18000 | 10% | 52% | 3% | 7 |
| 并发=50qps=50000(队列10000) realqps=50000 | 35% | 52% | 10% | 7 |
| 并发=100qps=100000(队列10000) realqps=90000 | 75% | 52% | 16% | 7 |
- 压测结果:写入队列=10000单核支持最高写入QPS约5wCPU=75%。
- 监控结果如下:
![img2.png](img/WX20240226-183250@2x.png)
![img2.png](img/WX20240226-184752@2x.png)
## ga日志格式范式
```json
{
"project_id": "20437",
"type": "track",
"event": "sdk_sword_holder_succ",
"event_time": 1708568434744,
"device_id": "",
"user_id": "908825698",
"client_id": "Android_5.1_tyGuest,weixinPay,tyAccount.alipay.0-hall20437.tuyoo.sdkonline",
"properties": {
"sdk_track_id": "3:6060:636978360:1708568434",
"sdk_sub_channel": "fish3d",
"country": "中国",
"proj_game_id": "",
"sdk_error_code": "",
"sdk_error_msg": "",
"city": "宁德市",
"sdk_sword_track_id": "807370ff-ceac-4ee3-b68f-50642ca4953c",
"sub_platform_id": "2",
"sdk_sword_holder_id": "320",
"sdk_sword_version": "v1.1.7",
"uuid": "56fdf0f9-9daa-4bf6-be69-88e15f05c36c",
"province": "福建省",
"sdk_login_channel_type": "",
"app_id": "20437",
"sdk_s_login_channel_type": "",
"sdk_main_channel": "official",
"game_id": "20437",
"sdk_s_route": "/api/sworder-server/rule/v1/getUserRisk",
"sdk_sword_holder_result": "999999",
"proj_cloud_id": "3",
"proj_app_id": "10010",
"ip_address": "59.58.58.18",
"sdk_sword_holder_type": "login",
"sdk_sword_holder_name": "非信任设备禁止登录",
"proj_client_id": "Android_5.505_tyGuest,tyAccount,yidunlogin.weixinPay,alipay,yinlian,jingdong,weixinShare.0-hall28.official.fish3d",
"sdk_sword_holder_process": "{\"330\":[\"[330-0]未命中\"]}",
"sdk_yidun_device_id": "UuCJztYTtxRETUVUAEaFoCQaw8H2qkWE",
"platform_id": "1",
"sub_channel_id": "sdkonline",
"proj_package_name": "",
"channel_id": "tuyoo"
},
"lib": {
"lib_version": "v1.0.0",
"lib_type": "go"
},
}
```
## asset日志格式范例
```json
{
"project_id": "28",
"type": "asset",
"event": "asset_increase",
"event_time": 1706631881042,
"device_id": "",
"user_id": "928426614",
"client_id": "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz",
"properties": {
"proj_ga_eventId": "STARTUP_QUEST_REWARD_COIN",
"proj_asset_value": "2",
"proj_asset_final": "2",
"proj_chip_type": "6",
"proj_asset_id": "13101",
"proj_asset_name": "\u9501\u5b9a",
"proj_asset_type": "free",
"proj_asset_time_limit": "0",
"proj_asset_start_time": "0",
"proj_asset_source": "",
"proj_tuyoo_order_id": "",
"game_id": "28",
"app_id": "10063",
"proj_project_id": "28",
"proj_client_id": "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz",
"uuid": "77b907688c624076a84ca7b4b29668a5"
},
"lib": {
"lib_version": "v1.0.0",
"lib_type": "go"
}
}
```
## Changelog
| 版本 | 修订说明 | 提交人 | 发布时间 |
|----- | ----- | ----- | ----- |
| v1.0.0 | galog 0依赖、支持异步写入、小时切割日志、ga和asset日志类型 | 田文 | 2024.02.22 |
| v1.1.0 | add suger | 田文 | 2025.06.30 |

View File

@ -1,78 +0,0 @@
package galog
import (
"sync"
)
var (
defaultBufPool = newBufPool()
)
const (
_size = 1024
_defaultLineEnding = "\n"
)
type BufPool struct {
p *sync.Pool
}
func newBufPool() BufPool {
return BufPool{p: &sync.Pool{
New: func() interface{} {
return &Buffer{bs: make([]byte, 0, _size)}
},
}}
}
// Get retrieves a Buffer from the pool, creating one if necessary.
func (p BufPool) Get() *Buffer {
buf := p.p.Get().(*Buffer)
buf.Reset()
buf.pool = p
return buf
}
func (p BufPool) put(buf *Buffer) {
p.p.Put(buf)
}
// Buffer is a thin wrapper around a byte slice. It's intended to be pooled, so
// the only way to construct one is via a Pool.
type Buffer struct {
bs []byte
pool BufPool
}
// AppendByte writes a single byte to the Buffer.
func (b *Buffer) AppendByte(v byte) {
b.bs = append(b.bs, v)
}
// AppendString writes a string to the Buffer.
func (b *Buffer) AppendString(s string) {
b.bs = append(b.bs, s...)
}
// Bytes returns a mutable reference to the underlying byte slice.
func (b *Buffer) Bytes() []byte {
return b.bs
}
// String returns a string copy of the underlying byte slice.
func (b *Buffer) String() string {
return string(b.bs)
}
// Reset resets the underlying byte slice. Subsequent writes re-use the slice's
// backing array.
func (b *Buffer) Reset() {
b.bs = b.bs[:0]
}
// Free returns the Buffer to its Pool.
//
// Callers must not retain references to the Buffer after calling Free.
func (b *Buffer) Free() {
b.pool.put(b)
}

View File

@ -1,139 +0,0 @@
package galog
var (
defaultLib = map[string]string{"lib_type": "go", "lib_version": "v1.0.0"}
)
type EntryBean struct {
// ProjectID 独立项目ID
ProjectID string `json:"project_id"`
// LogType 日志类型 默认是track
LogType LogType `json:"type"`
// Event 事件ID
Event string `json:"event"`
// EventTime 毫秒级时间
EventTime int64 `json:"event_time"`
// DeviceID 设备ID
DeviceID string `json:"device_id"`
// UserID 用户ID
UserID string `json:"user_id"`
// ClientID clientID
ClientID string `json:"client_id"`
// Properties 重要额外字段
Properties map[string]interface{} `json:"properties"`
// Lib 代码库
Lib map[string]string `json:"lib"`
}
type Entry struct {
logger *GALogger
bean *EntryBean
}
func (e *Entry) SetUserID(uid string) *Entry {
if uid == "" {
uid = "0"
}
e.bean.UserID = uid
return e
}
func (e *Entry) SetDeviceID(did string) *Entry {
e.bean.DeviceID = did
return e
}
func (e *Entry) SetLib(lib map[string]string) *Entry {
e.bean.Lib = lib
return e
}
func (e *Entry) SetClientID(cid string) *Entry {
e.bean.ClientID = cid
return e
}
func (e *Entry) SetProperties(props map[string]interface{}) *Entry {
e.bean.Properties = props
return e
}
// Flush 日志写入
func (e *Entry) Flush() {
defer e.logger.putEntry(e)
e.logger.biz(e.bean)
}
type AssetProperties map[string]interface{}
// SetAssetID 资产id
func (ap AssetProperties) SetAssetID(assetID string) AssetProperties {
ap["proj_asset_id"] = assetID
return ap
}
// SetAssetName 资产名称
func (ap AssetProperties) SetAssetName(assetName string) AssetProperties {
ap["proj_asset_name"] = assetName
return ap
}
// SetAssetType 资产付费类型
func (ap AssetProperties) SetAssetType(assetType string) AssetProperties {
ap["proj_asset_type"] = assetType
return ap
}
// SetAssetValue 资产变化数量
func (ap AssetProperties) SetAssetValue(assetValue string) AssetProperties {
ap["proj_asset_value"] = assetValue
return ap
}
// SetAssetFinal 资产变化后的剩余数量
func (ap AssetProperties) SetAssetFinal(assetFinal string) AssetProperties {
ap["proj_asset_final"] = assetFinal
return ap
}
// SetAssetTimeLimit 持续性资产持续时间
func (ap AssetProperties) SetAssetTimeLimit(assetTimeLimit string) AssetProperties {
ap["proj_asset_time_limit"] = assetTimeLimit
return ap
}
// SetAssetStartTime 持续性资产生效时间
func (ap AssetProperties) SetAssetStartTime(assetStartTime string) AssetProperties {
ap["proj_asset_start_time"] = assetStartTime
return ap
}
// SetAssetSource 变化的原因
func (ap AssetProperties) SetAssetSource(assetSource string) AssetProperties {
ap["proj_asset_source"] = assetSource
return ap
}
// SetAssetAssociated 变化关联资产
func (ap AssetProperties) SetAssetAssociated(assetAssociated string) AssetProperties {
ap["proj_asset_associated"] = assetAssociated
return ap
}
// SetTuyooOrderID SDK订单号
func (ap AssetProperties) SetTuyooOrderID(tuyooOrderID string) AssetProperties {
ap["proj_tuyoo_order_id"] = tuyooOrderID
return ap
}
// SetOrderID 游戏服订单号
func (ap AssetProperties) SetOrderID(assetOrderID string) AssetProperties {
ap["proj_order_id"] = assetOrderID
return ap
}
// SetKV 设置自定义字段必须通知到数据组,否则打点失败
func (ap AssetProperties) SetKV(k, v string) AssetProperties {
ap[k] = v
return ap
}

View File

@ -1,83 +0,0 @@
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"runtime"
"tygit.tuyoo.com/gocomponents/galog/examples/worker"
)
var (
output = flag.String("o", "", "")
c = flag.Int("c", 50, "")
n = flag.Int("n", 200, "")
q = flag.Float64("q", 0, "")
cpus = flag.Int("cpus", runtime.GOMAXPROCS(-1), "")
)
var usage = `Usage: hey [options...] <url>
Options:
-n Number of requests to run. Default is 200.
-c Number of workers to run concurrently. Total number of requests cannot
be smaller than the concurrency level. Default is 50.
-q Rate limit, in queries per second (QPS) per worker. Default is no rate limit.
-o Output type. If none provided, a summary is printed.
"csv" is the only supported alternative. Dumps the response
metrics in comma-separated values format.
-cpus Number of used cpu cores.
(default for current machine is %d cores)
`
func MainHey() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, usage, runtime.NumCPU())
}
flag.Parse()
runtime.GOMAXPROCS(*cpus)
num := *n
conc := *c
q := *q
if num <= 0 || conc <= 0 {
usageAndExit("-n and -c cannot be smaller than 1.")
}
if num < conc {
usageAndExit("-n cannot be less than -c.")
}
w := &worker.Work{
N: num,
C: conc,
QPS: q,
Output: *output,
}
w.Init()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
<-c
w.Stop()
}()
w.Run()
}
func usageAndExit(msg string) {
if msg != "" {
fmt.Fprint(os.Stderr, msg)
fmt.Fprintf(os.Stderr, "\n\n")
}
flag.Usage()
fmt.Fprintf(os.Stderr, "\n")
os.Exit(1)
}

View File

@ -1,107 +0,0 @@
package main
import (
"log"
"time"
"tygit.tuyoo.com/gocomponents/galog"
)
func main() {
log.Println("log ga asset server every 5 seconds.")
go logGA()
go logAsset()
logServer()
}
func logGA() {
projectID := "20433"
clientID := "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest"
logger, err := galog.NewServerGALogger(&galog.ServerGALogOptions{
ProjectID: projectID,
ClientID: clientID,
LogDir: "ga_log",
LogType: galog.LogTypeTrack,
EnableAsync: true,
AsyncQueueSize: 1000,
})
if err != nil {
log.Fatal(err)
}
t := time.NewTicker(5 * time.Second)
for tt := range t.C {
log.Println("logGA")
logger.
GetEntry("sdk_s_login_succ").
SetDeviceID("device001").
SetUserID("10086").
SetProperties(map[string]interface{}{
"ip_address": "127.0.0.1",
"proj_app_id": "10010",
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts": tt.UnixNano(),
}).
Flush()
}
}
func logAsset() {
projectID := "28"
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
logger, err := galog.NewGALogger(".", projectID, clientID, galog.LogTypeAsset)
if err != nil {
log.Fatal(err)
}
t := time.NewTicker(5 * time.Second)
asset := galog.AssetProperties{}
asset.SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", "uuid-v4")
for tt := range t.C {
log.Println("logAssert")
_ = tt
logger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
}
}
func logServer() {
slogger, _ := galog.NewServerLogger(&galog.ServerLogOptions{
LogDir: "logs",
EnableAsync: true,
AsyncQueueSize: 1000,
})
t := time.NewTicker(5 * time.Second)
for tt := range t.C {
log.Println("logServer")
_ = tt
msgMap := map[string]interface{}{
"CreateTime": time.Now().UnixNano() / int64(time.Microsecond),
"Host": "host",
"AppId": "10010",
"UserId": "12345",
"Level": "Notice",
"Entry": "Login",
"Func": "HandleLogin",
"TraceMsg": "HandlerWSFriApplyList|HandlerWSFriApplyList",
"Params": "{\"isoCode\":\"CN\",\"P0\":[3,\"Total: 3, End: 0, \"],\"pf\":\"wx\",\"appVer\":\"1.0\",\"sdkVer\":\"1.0\",\"ip\":\"58.247.195.158\",\"clientId\":\"7abd64bf-3fb6-4fef-a25e-e6562b7fb857\",\"timeZone\":\"Asia/Shanghai\",\"loginMark\":\"\",\"st\":1472}",
}
slogger.BizErr(msgMap)
}
}

View File

@ -1,43 +0,0 @@
package worker
import (
"fmt"
"text/template"
)
func newTemplate(output string) *template.Template {
outputTmpl := output
switch outputTmpl {
case "":
outputTmpl = defaultTmpl
case "csv":
outputTmpl = csvTmpl
}
return template.Must(template.New("tmpl").Funcs(tmplFuncMap).Parse(outputTmpl))
}
var tmplFuncMap = template.FuncMap{
"formatNumber": formatNumber,
"formatNumberInt": formatNumberInt,
}
func formatNumber(duration float64) string {
return fmt.Sprintf("%4.4f", duration)
}
func formatNumberInt(duration int) string {
return fmt.Sprintf("%d", duration)
}
var (
defaultTmpl = `
Summary:
Total: {{ formatNumber .Total.Seconds }} secs
Requests/sec: {{ formatNumber .Rps }}
TotalNumRes: {{ .NumRes }}
AvgTotal: {{ .AvgTotal }}
`
csvTmpl = `{{ $connLats := .ConnLats }}{{ $dnsLats := .DnsLats }}{{ $dnsLats := .DnsLats }}{{ $reqLats := .ReqLats }}{{ $delayLats := .DelayLats }}{{ $resLats := .ResLats }}{{ $statusCodeLats := .StatusCodes }}{{ $offsets := .Offsets}}response-time,DNS+dialup,DNS,Request-write,Response-delay,Response-read,status-code,offset{{ range $i, $v := .Lats }}
{{ formatNumber $v }},{{ formatNumber (index $connLats $i) }},{{ formatNumber (index $dnsLats $i) }},{{ formatNumber (index $reqLats $i) }},{{ formatNumber (index $delayLats $i) }},{{ formatNumber (index $resLats $i) }},{{ formatNumberInt (index $statusCodeLats $i) }},{{ formatNumber (index $offsets $i) }}{{ end }}`
)

View File

@ -1,94 +0,0 @@
package worker
import (
"bytes"
"fmt"
"io"
"log"
"time"
)
type report struct {
avgTotal float64
rps float64
results chan *result
done chan bool
total time.Duration
numRes int64
output string
w io.Writer
}
func newReport(w io.Writer, results chan *result, output string, n int) *report {
return &report{
output: output,
results: results,
done: make(chan bool, 1),
w: w,
}
}
func runReporter(r *report) {
// Loop will continue until channel is closed
for res := range r.results {
r.numRes++
r.avgTotal += res.duration.Seconds()
}
// Signal reporter is done.
r.done <- true
}
func (r *report) finalize(total time.Duration) {
r.total = total
r.rps = float64(r.numRes) / r.total.Seconds()
r.print()
}
func (r *report) print() {
buf := &bytes.Buffer{}
if err := newTemplate(r.output).Execute(buf, r.snapshot()); err != nil {
log.Println("error:", err.Error())
return
}
r.printf(buf.String())
r.printf("\n")
}
func (r *report) printf(s string, v ...interface{}) {
fmt.Fprintf(r.w, s, v...)
}
func (r *report) snapshot() Report {
snapshot := Report{
AvgTotal: r.avgTotal,
Rps: r.rps,
Total: r.total,
NumRes: r.numRes,
}
return snapshot
}
type Report struct {
AvgTotal float64
Rps float64
Total time.Duration
NumRes int64
}
type LatencyDistribution struct {
Percentage int
Latency float64
}
type Bucket struct {
Mark float64
Count int
Frequency float64
}

View File

@ -1,176 +0,0 @@
package worker
import (
"fmt"
"io"
"os"
"strconv"
"sync"
"time"
"tygit.tuyoo.com/gocomponents/galog"
)
var startTime = time.Now()
// now returns time.Duration using stdlib time
func now() time.Duration { return time.Since(startTime) }
// Max size of the buffer of result channel.
const maxResult = 1000000
type result struct {
offset time.Duration
duration time.Duration
}
type Work struct {
// N is the total number of requests to make.
N int
// C is the concurrency level, the number of concurrent workers to run.
C int
// Qps is the rate limit in queries per second.
QPS float64
// Output represents the output type. If "csv" is provided, the
// output will be dumped as a csv stream.
Output string
// Writer is where results will be written. If nil, results are written to stdout.
Writer io.Writer
initOnce sync.Once
results chan *result
stopCh chan struct{}
start time.Duration
report *report
}
func (b *Work) writer() io.Writer {
if b.Writer == nil {
return os.Stdout
}
return b.Writer
}
// Init initializes internal data-structures
func (b *Work) Init() {
b.initOnce.Do(func() {
b.results = make(chan *result, min(b.C*1000, maxResult))
b.stopCh = make(chan struct{}, b.C)
b.initLogger()
})
}
// Run makes all the requests, prints the summary. It blocks until
// all work is done.
func (b *Work) Run() {
b.Init()
b.start = now()
b.report = newReport(b.writer(), b.results, b.Output, b.N)
// Run the reporter first, it polls the result channel until it is closed.
go func() {
runReporter(b.report)
}()
b.runWorkers()
b.Finish()
}
func (b *Work) Stop() {
// Send stop signal so that workers can stop gracefully.
for i := 0; i < b.C; i++ {
b.stopCh <- struct{}{}
}
}
func (b *Work) Finish() {
close(b.results)
total := now() - b.start
// Wait until the reporter is done.
<-b.report.done
b.report.finalize(total)
}
var logger *galog.GALogger
func (b *Work) initLogger() {
projectID := "28"
clientID := "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz"
logger, _ = galog.NewGALogger("logs", projectID, clientID, galog.LogTypeAsset)
}
func (b *Work) doSth() {
s := now()
// doSth here.
asset := galog.AssetProperties{}
asset.SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", strconv.Itoa(int(time.Now().UnixNano())))
logger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
t := now()
finish := t - s
b.results <- &result{
offset: s,
duration: finish,
}
}
func (b *Work) runWorker(n int) {
var throttle <-chan time.Time
if b.QPS > 0 {
t := time.NewTicker(time.Duration(1e6/(b.QPS)) * time.Microsecond)
throttle = t.C
}
for i := 0; i < n; i++ {
// Check if application is stopped. Do not send into a closed channel.
select {
case <-b.stopCh:
return
default:
if b.QPS > 0 {
<-throttle
}
b.doSth()
}
}
}
func (b *Work) runWorkers() {
var wg sync.WaitGroup
wg.Add(b.C)
fmt.Printf("==RUN worker==> N:%d C:%d QPS:%v b.N / b.C:%v", b.N, b.C, b.QPS, b.N/b.C)
// Ignore the case where b.N % b.C != 0.
for i := 0; i < b.C; i++ {
go func() {
b.runWorker(b.N / b.C)
wg.Done()
}()
}
wg.Wait()
}
func min(a, b int) int {
if a < b {
return a
}
return b
}

View File

@ -1,264 +0,0 @@
package galog
import (
"encoding/json"
"errors"
"fmt"
"os"
"path"
"path/filepath"
"strconv"
"strings"
"sync"
"time"
)
type fileLogWriter struct {
sync.RWMutex
Rotate bool `json:"rotate"`
Hourly bool `json:"hourly"`
// The opened file
Filename string `json:"filename"`
fileWriter *os.File
// Rotate hourly
MaxHours int64 `json:"maxhours"` // 默认不删除日志
hourlyOpenDate int
hourlyOpenTime time.Time
// Permissions for log file
Perm string `json:"perm"`
// Permissions for directory if it is specified in FileName
DirPerm string `json:"dirperm"`
RotatePerm string `json:"rotateperm"`
fileNameOnly, suffix string // like "project.log", project is fileNameOnly and .log is suffix
}
func newFileWriter() LogProvider {
w := &fileLogWriter{
Rotate: true, // 开启日志轮转
Hourly: true, // 开启日志小时轮转
RotatePerm: "0440",
Perm: "0660",
DirPerm: "0770",
}
return w
}
// Init file logger with json config.
// jsonConfig like:
//
// {"filename":"logs/glog.log"}
func (w *fileLogWriter) Init(config string) error {
err := json.Unmarshal([]byte(config), w)
if err != nil {
return err
}
if w.Filename == "" {
return errors.New("jsonconfig must have filename")
}
w.suffix = filepath.Ext(w.Filename)
w.fileNameOnly = strings.TrimSuffix(w.Filename, w.suffix)
if w.suffix == "" {
w.suffix = ".log"
}
err = w.startLogger()
return err
}
func (w *fileLogWriter) startLogger() error {
file, err := w.createLogFile()
if err != nil {
return err
}
if w.fileWriter != nil {
w.fileWriter.Close()
}
w.fileWriter = file
return w.initFd()
}
func (w *fileLogWriter) needRotateHourly(hour int) bool {
return w.Hourly && hour != w.hourlyOpenDate
}
func (w *fileLogWriter) createLogFile() (*os.File, error) {
perm, err := strconv.ParseInt(w.Perm, 8, 64)
if err != nil {
return nil, err
}
dirperm, err := strconv.ParseInt(w.DirPerm, 8, 64)
if err != nil {
return nil, err
}
filepath := path.Dir(w.Filename)
os.MkdirAll(filepath, os.FileMode(dirperm))
fd, err := os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(perm))
if err == nil {
os.Chmod(w.Filename, os.FileMode(perm))
}
return fd, err
}
func (w *fileLogWriter) initFd() error {
w.hourlyOpenTime = time.Now()
w.hourlyOpenDate = w.hourlyOpenTime.Hour()
if w.Hourly {
go w.hourlyRotate(w.hourlyOpenTime)
}
return nil
}
func (w *fileLogWriter) hourlyRotate(openTime time.Time) {
y, m, d := openTime.Add(1 * time.Hour).Date()
h := openTime.Add(1 * time.Hour).Hour()
nextHour := time.Date(y, m, d, h, 0, 0, 0, openTime.Location())
tm := time.NewTimer(time.Duration(nextHour.UnixNano() - openTime.UnixNano() + 100))
<-tm.C
w.Lock()
if w.needRotateHourly(time.Now().Hour()) {
if err := w.doRotate(); err != nil {
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
}
}
w.Unlock()
}
func (w *fileLogWriter) doRotate() error {
fName := ""
format := ""
var openTime time.Time
rotatePerm, err := strconv.ParseInt(w.RotatePerm, 8, 64)
if err != nil {
return err
}
_, err = os.Lstat(w.Filename)
if err != nil {
goto RESTART_LOGGER
}
if w.Hourly {
format = "20060102_15"
openTime = w.hourlyOpenTime
}
fName = w.fileNameOnly + fmt.Sprintf("_%s%s", openTime.Format(format), w.suffix)
_, err = os.Lstat(fName)
// return error if the last file checked still existed
if err == nil {
//return fmt.Errorf("rotate: cannot find free log number to rename %s", w.Filename)
}
w.fileWriter.Close()
// Rename the file to its new found name
// even if occurs error,we MUST guarantee to restart new logger
err = os.Rename(w.Filename, fName)
if err != nil {
goto RESTART_LOGGER
}
err = os.Chmod(fName, os.FileMode(rotatePerm))
RESTART_LOGGER:
startLoggerErr := w.startLogger()
if w.MaxHours > 0 {
go w.deleteOldLog()
}
if startLoggerErr != nil {
return fmt.Errorf("rotate startLogger: %s", startLoggerErr)
}
if err != nil {
return fmt.Errorf("rotate: %s", err)
}
return nil
}
func (w *fileLogWriter) deleteOldLog() {
dir := filepath.Dir(w.Filename)
absolutePath, err := filepath.EvalSymlinks(w.Filename)
if err == nil {
dir = filepath.Dir(absolutePath)
}
filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) {
defer func() {
if r := recover(); r != nil {
fmt.Fprintf(os.Stderr, "Unable to delete old log '%s', error: %v\n", path, r)
}
}()
if info == nil {
return
}
if w.Hourly {
if !info.IsDir() && info.ModTime().Add(1*time.Hour*time.Duration(w.MaxHours)).Before(time.Now()) {
if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) &&
strings.HasSuffix(filepath.Base(path), w.suffix) {
os.Remove(path)
}
}
}
return
})
}
// EncodeMsg encode log msg
func (*fileLogWriter) EncodeMsg(lm *LogMsg) []byte {
buf := defaultBufPool.Get()
buf.AppendString(lm.Msg)
buf.AppendString(_defaultLineEnding)
msg := buf.Bytes()
buf.Free()
return msg
}
// WriteMsg write msg to log and rotate
func (w *fileLogWriter) WriteMsg(lm *LogMsg) error {
h := lm.When.Hour()
if w.Rotate {
w.RLock()
if w.needRotateHourly(h) {
w.RUnlock()
w.Lock()
if w.needRotateHourly(h) {
if err := w.doRotate(); err != nil {
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
}
}
w.Unlock()
} else {
w.RUnlock()
}
}
msg := w.EncodeMsg(lm)
_, err := w.fileWriter.Write(msg)
return err
}
// Destroy close the file description, close file writer.
func (w *fileLogWriter) Destroy() {
w.fileWriter.Close()
}
// Flush flushes file logger.
func (w *fileLogWriter) Flush() {
w.fileWriter.Sync()
}
func init() {
Register(AdapterFile, newFileWriter)
}

View File

@ -1,99 +0,0 @@
package galog
import (
"fmt"
"os"
"strings"
"sync"
"time"
)
type GALogger struct {
logger *Logger
projectID string
clientID string
logType LogType
entryPool sync.Pool
}
type LogType string
const (
// LogTypeTrack 事实日志
LogTypeTrack LogType = "track"
// LogTypeAsset 资产日志
LogTypeAsset LogType = "asset"
)
const (
// enableAsync 启用异步写入模式
enableAsync = true
// defaultAsyncMsgLen 异步写入模式的队列长度QPS较大时可调整此值
defaultAsyncMsgLen int64 = 100
)
// NewGALogger
//
// logDir: 日志根目录 logs | /home/tywork
// projectID: projectID
// clientID: clientID
// logType: galog.LogTypeTrack | galog.LogTypeAsset
func NewGALogger(logDir, projectID, clientID string, logType LogType) (*GALogger, error) {
l := newLogger()
hostname, _ := os.Hostname()
filepath := fmt.Sprintf("ga_log/ga_%s.log", hostname)
if logType == LogTypeAsset {
filepath = fmt.Sprintf("asset_log/%s_%s.log", logType, hostname)
}
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(logDir, "/"), filepath)
err := l.setLogger(AdapterFile, configs)
if err != nil {
return nil, err
}
if enableAsync {
l.Async()
}
gaLogger := &GALogger{
logger: l,
projectID: projectID,
clientID: clientID,
logType: logType,
}
return gaLogger, nil
}
// GetEntry
func (gl *GALogger) GetEntry(event string) *Entry {
e, ok := gl.entryPool.Get().(*Entry)
if ok {
e.logger = gl
e.bean.ProjectID = gl.projectID
e.bean.LogType = gl.logType
e.bean.ClientID = gl.clientID
e.bean.Event = event
e.bean.EventTime = time.Now().UnixMilli()
e.bean.Lib = defaultLib
return e
}
return &Entry{
logger: gl,
bean: &EntryBean{
ProjectID: gl.projectID,
LogType: gl.logType,
ClientID: gl.clientID,
Event: event,
EventTime: time.Now().UnixMilli(),
Lib: defaultLib,
},
}
}
func (gl *GALogger) biz(v interface{}) {
gl.logger.BizErr(v)
}
func (gl *GALogger) putEntry(entry *Entry) {
entry.bean = &EntryBean{}
gl.entryPool.Put(entry)
}

View File

@ -1,85 +0,0 @@
package galog
import (
"testing"
"time"
)
var (
gaLogger *GALogger
assetLogger *GALogger
)
// go test -bench . -benchmem
func init() {
gaLogger, _ = NewGALogger("logs", "20433", "Android_5.0_tyGuest,weixinPay,tyAccount.alipay.0-hall20433.tuyoo.sdktest", LogTypeTrack)
assetLogger, _ = NewGALogger("logs", "28", "Android_4.827_tyGuest,nearme.nearme.0-hall28.oppo.bydzz", LogTypeAsset)
}
func BenchmarkGaLog(b *testing.B) {
for i := 0; i < b.N; i++ {
props := map[string]interface{}{
"ip_address": "127.0.0.1",
"proj_app_id": "10010",
"uuid": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts": time.Now().UnixNano(),
"ip_address1": "127.0.0.1",
"proj_app_id1": "10010",
"uuid1": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts1": time.Now().UnixNano(),
"ip_address2": "127.0.0.1",
"proj_app_id2": "10010",
"uuid2": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts2": time.Now().UnixNano(),
"ip_address3": "127.0.0.1",
"proj_app_id3": "10010",
"uuid3": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts4": time.Now().UnixNano(),
"proj_app_id25": "10010",
"uuid21": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts21": time.Now().UnixNano(),
"ip_address31": "127.0.0.1",
"proj_app_id31": "10010",
"uuid31": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts11": time.Now().UnixNano(),
"uuid3111": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts4111": time.Now().UnixNano(),
"proj_app_id21115": "10010",
"uuid111": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts111": time.Now().UnixNano(),
"ip_a11ddress31": "127.0.0.1",
"proj1_app_id31": "10010",
"uuid131": "4951d472-2c46-4fe5-9c4f-c35b6fb53f67",
"ts1111": time.Now().UnixNano(),
}
gaLogger.
GetEntry("sdk_s_login_succ").
SetDeviceID("device001").
SetUserID("10086").
SetProperties(props).
Flush()
}
}
func BenchmarkAssetLog(b *testing.B) {
for i := 0; i < b.N; i++ {
asset := make(AssetProperties)
asset.
SetAssetID("13101").
SetAssetName("\u9501\u5b9a").
SetAssetType("6").
SetAssetFinal("2").
SetAssetAssociated("3").
SetAssetStartTime("0").
SetAssetTimeLimit("0").
SetAssetSource("").
SetKV("uuid", "uuid-v4")
assetLogger.
GetEntry("asset_increase").
SetDeviceID("").
SetUserID("10086").
SetProperties(asset).
Flush()
}
}

View File

@ -1,3 +0,0 @@
module tygit.tuyoo.com/gocomponents/galog
go 1.20

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

View File

@ -1,261 +0,0 @@
package galog
import (
"encoding/json"
"fmt"
"os"
"sync"
"time"
"unsafe"
)
const (
AdapterFile = "file"
)
type LogMsg struct {
Msg string
When time.Time
}
// Logger defines the behavior of a log provider.
type LogProvider interface {
Init(config string) error
WriteMsg(lm *LogMsg) error
Destroy()
Flush()
}
type newLogProviderFunc func() LogProvider
var (
adapters = make(map[string]newLogProviderFunc)
)
// Register register a new log provider.
func Register(name string, log newLogProviderFunc) {
if log == nil {
panic("logs: Register provide is nil")
}
if _, dup := adapters[name]; dup {
panic("logs: Register called twice for provider " + name)
}
adapters[name] = log
}
type Logger struct {
lock sync.Mutex
asynchronous bool
wg sync.WaitGroup
msgChanLen int64
msgChan chan *LogMsg
closeChan chan struct{}
flushChan chan struct{}
outputs []*nameLogger
}
type nameLogger struct {
LogProvider
name string
}
var logMsgPool *sync.Pool
// newLogger return a new Logger.
func newLogger(channelLens ...int64) *Logger {
gl := new(Logger)
gl.msgChanLen = append(channelLens, 0)[0]
if gl.msgChanLen <= 0 {
gl.msgChanLen = defaultAsyncMsgLen
}
gl.flushChan = make(chan struct{}, 1)
gl.closeChan = make(chan struct{}, 1)
return gl
}
// Async sets the log to asynchronous and start the goroutine
func (gl *Logger) Async(msgLen ...int64) *Logger {
gl.lock.Lock()
defer gl.lock.Unlock()
if gl.asynchronous {
return gl
}
gl.asynchronous = true
if len(msgLen) > 0 && msgLen[0] > 0 {
gl.msgChanLen = msgLen[0]
}
gl.msgChan = make(chan *LogMsg, gl.msgChanLen)
logMsgPool = &sync.Pool{
New: func() interface{} {
return &LogMsg{}
},
}
gl.wg.Add(1)
go gl.startLogger()
return gl
}
// SetLogger provides a given logger adapter into Logger with config string.
// config must in in JSON format like {"interval":360}}
func (gl *Logger) setLogger(adapterName string, configs ...string) error {
config := append(configs, "{}")[0]
logAdapter, ok := adapters[adapterName]
if !ok {
return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName)
}
lg := logAdapter()
err := lg.Init(config)
if err != nil {
return err
}
gl.outputs = append(gl.outputs, &nameLogger{name: adapterName, LogProvider: lg})
return nil
}
func (gl *Logger) writeToLoggers(lm *LogMsg) {
for _, l := range gl.outputs {
err := l.WriteMsg(lm)
if err != nil {
fmt.Fprintf(os.Stderr, "unable to WriteMsg to adapter:%v,error:%v\n", l.name, err)
}
}
}
// Write implements io.Writer.
func (gl *Logger) Write(p []byte) (n int, err error) {
if len(p) == 0 {
return 0, nil
}
// writeMsg will always add a '\n' character
if p[len(p)-1] == '\n' {
p = p[0 : len(p)-1]
}
lm := &LogMsg{
Msg: string(p),
When: time.Now(),
}
// set levelLoggerImpl to ensure all log message will be write out
err = gl.writeMsg(lm)
if err == nil {
return len(p), nil
}
return 0, err
}
func (gl *Logger) writeMsg(lm *LogMsg) error {
if gl.asynchronous {
logM := logMsgPool.Get().(*LogMsg)
logM.Msg = lm.Msg
logM.When = lm.When
if gl.outputs != nil {
gl.msgChan <- lm
} else {
logMsgPool.Put(lm)
}
} else {
gl.writeToLoggers(lm)
}
return nil
}
func (gl *Logger) startLogger() {
gameOver := false
for {
select {
case bm, ok := <-gl.msgChan:
if ok {
gl.writeToLoggers(bm)
logMsgPool.Put(bm)
}
case <-gl.closeChan:
gl.flush()
for _, l := range gl.outputs {
l.Destroy()
}
gl.outputs = nil
gameOver = true
gl.wg.Done()
case <-gl.flushChan:
gl.flush()
gl.wg.Done()
}
if gameOver {
break
}
}
}
// Info Log INFO level message.
func (gl *Logger) Info(format string) {
lm := &LogMsg{
Msg: format,
When: time.Now(),
}
gl.writeMsg(lm)
}
// BizErr Log a json-interface
func (gl *Logger) BizErr(v interface{}) error {
buf, err := json.Marshal(v)
if err != nil {
return err
}
str := *(*string)(unsafe.Pointer(&buf))
gl.Info(str)
return nil
}
// Flush flush all chan data.
func (gl *Logger) Flush() {
if gl.asynchronous {
gl.flushChan <- struct{}{}
gl.wg.Wait()
gl.wg.Add(1)
return
}
gl.flush()
}
// Close close logger, flush all chan data and destroy all adapters in Logger.
func (gl *Logger) Close() {
if gl.asynchronous {
gl.closeChan <- struct{}{}
gl.wg.Wait()
close(gl.msgChan)
} else {
gl.flush()
for _, l := range gl.outputs {
l.Destroy()
}
gl.outputs = nil
}
close(gl.flushChan)
close(gl.closeChan)
}
func (gl *Logger) flush() {
if gl.asynchronous {
for {
if len(gl.msgChan) > 0 {
bm, ok := <-gl.msgChan
if !ok {
continue
}
gl.writeToLoggers(bm)
logMsgPool.Put(bm)
continue
}
break
}
}
for _, l := range gl.outputs {
l.Flush()
}
}

View File

@ -1,122 +0,0 @@
package galog
import (
"errors"
"fmt"
"os"
"strings"
)
type ServerLogOptions struct {
// LogDir 日志目录默认logs
LogDir string
// EnableAsync 是否开启异步写日志,默认开启
EnableAsync bool
// AsyncQueueSize 异步队列大小默认1000
AsyncQueueSize int64
}
// NewServerLogger 业务日志实例support JSON
//
// opts.LogDir 日志目录推荐logs
// opts.EnableAsync 是否开启异步写日志,默认开启
// opts.AsyncQueueSize 异步队列大小默认1000
// useage: logger.BizErr(map[string]interface{}{"type": "test"})
func NewServerLogger(opts *ServerLogOptions) (*Logger, error) {
if opts == nil {
opts = &ServerLogOptions{
LogDir: "logs",
EnableAsync: true,
AsyncQueueSize: 1000,
}
}
if opts.LogDir == "" {
opts.LogDir = "logs"
}
if opts.EnableAsync && opts.AsyncQueueSize == 0 {
opts.AsyncQueueSize = 1000
}
l := newLogger()
hostname, _ := os.Hostname()
filename := fmt.Sprintf("server_%s.log", hostname)
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(opts.LogDir, "/"), filename)
err := l.setLogger(AdapterFile, configs)
if err != nil {
return nil, err
}
if opts.EnableAsync && opts.AsyncQueueSize > 0 {
l.Async(opts.AsyncQueueSize)
}
return l, nil
}
type ServerGALogOptions struct {
// LogDir 日志目录默认galogs
LogDir string
// EnableAsync 是否开启异步写日志,默认开启
EnableAsync bool
// AsyncQueueSize 异步队列大小默认1000
AsyncQueueSize int64
// GA侧分配ProjectID
ProjectID string
// GA侧分配ClientID
ClientID string
LogType LogType
}
// NewServerGALogger GA日志实例support JSON
//
// opts.ProjectID 项目IDGA侧分配必填
// opts.ClientID 客户端IDGA侧分配必填
// opts.LogType 日志类型默认LogTypeTrack
// opts.LogDir 日志目录默认galogs
// opts.EnableAsync 是否开启异步写日志,默认开启
// opts.AsyncQueueSize 异步队列大小默认1000
func NewServerGALogger(opts *ServerGALogOptions) (*GALogger, error) {
if opts == nil {
return nil, errors.New("opts must not be empty")
}
if opts.EnableAsync && opts.AsyncQueueSize == 0 {
opts.AsyncQueueSize = 1000
}
if opts.LogDir == "" {
opts.LogDir = "galogs"
}
if opts.LogType == "" {
opts.LogType = LogTypeTrack
}
if opts.ProjectID == "" || opts.ClientID == "" {
return nil, errors.New("projectID or clientID must not be empty")
}
l := newLogger()
hostname, _ := os.Hostname()
filename := fmt.Sprintf("ga_%s.log", hostname)
if opts.LogType == LogTypeAsset {
filename = fmt.Sprintf("asset_%s.log", hostname)
}
configs := fmt.Sprintf(`{"filename":"%s/%s"}`, strings.TrimRight(opts.LogDir, "/"), filename)
err := l.setLogger(AdapterFile, configs)
if err != nil {
return nil, err
}
if opts.EnableAsync && opts.AsyncQueueSize > 0 {
l.Async(opts.AsyncQueueSize)
}
gaLogger := &GALogger{
logger: l,
projectID: opts.ProjectID,
clientID: opts.ClientID,
logType: opts.LogType,
}
return gaLogger, nil
}

View File

@ -1,34 +0,0 @@
package galog
import (
"testing"
"time"
)
var slogger *Logger
// go test -bench . -benchmem
func init() {
slogger, _ = NewServerLogger(&ServerLogOptions{
LogDir: "logs",
EnableAsync: true,
})
}
// BenchmarkServerLog-8 436682 3103 ns/op 1838 B/op 24 allocs/op
func BenchmarkServerLog(b *testing.B) {
for i := 0; i < b.N; i++ {
msgMap := map[string]interface{}{
"CreateTime": time.Now().UnixNano() / int64(time.Microsecond),
"Host": "host",
"AppId": "10010",
"UserId": "12345",
"Level": "Notice",
"Entry": "Login",
"Func": "HandleLogin",
"TraceMsg": "HandlerWSFriApplyList|HandlerWSFriApplyList",
"Params": "{\"isoCode\":\"CN\",\"P0\":[3,\"Total: 3, End: 0, \"],\"pf\":\"wx\",\"appVer\":\"1.0\",\"sdkVer\":\"1.0\",\"ip\":\"58.247.195.158\",\"clientId\":\"7abd64bf-3fb6-4fef-a25e-e6562b7fb857\",\"timeZone\":\"Asia/Shanghai\",\"loginMark\":\"\",\"st\":1472}",
}
slogger.BizErr(msgMap)
}
}

View File

@ -0,0 +1,785 @@
package game
import (
"fmt"
"math"
"math/rand"
"server/GoUtil"
"server/MergeConst"
"server/db"
"server/msg"
"sort"
"strconv"
"strings"
"time"
"github.com/robfig/cron/v3"
"google.golang.org/protobuf/proto"
)
type ChampshipsManager struct {
MStatus int32
MChampshipMap map[int32]*db.SqlChampshipsStruct
MChampshipPlayerMap map[int32][]*msg.ChampshipsPlayerInfo
IsSettle int32
IsLoadDB bool
MUpdateNotifyList []int32
McronSave *cron.Cron
McronSaveID cron.EntryID
RobotCronID cron.EntryID
RobotCronID10s cron.EntryID
MPlayerBaseInfoMap map[int32]*db.ResPlayerBaseInfo
}
func (p *ChampshipsManager) SaveDataFromDB(Key interface{}) bool {
return true
}
func (p *ChampshipsManager) AIGrow1() {
}
func (p *ChampshipsManager) DeleteOutLineChampship(CurChampshipsId int32) {
sqlStr := "DELETE FROM t_championships_data WHERE CurChampshipsId = ?"
for k, v := range p.MChampshipPlayerMap {
if v[0].CurChampshipsId == CurChampshipsId {
delete(p.MChampshipPlayerMap, k)
}
}
result, err := db.SqlDb.Exec(sqlStr, CurChampshipsId)
if err != nil {
fmt.Printf("exec failed, err:%v\n", err)
return
}
affectedRows, err := result.RowsAffected()
if err != nil {
fmt.Printf("get affected failed, err:%v\n", err)
return
} else {
fmt.Printf("delete t_championships_data affectedRows:%d\n", affectedRows)
}
}
func (p *ChampshipsManager) DeleteUneffectPlayer(deleteIds []int32) {
sqlStr := "DELETE FROM t_player_baseinfo WHERE dwUin = ?"
for i := 0; i < len(deleteIds); i++ {
_, err := db.SqlDb.Exec(sqlStr, deleteIds[i])
if err != nil {
fmt.Printf("exec failed, err:%v\n", err)
}
}
}
func (p *ChampshipsManager) GetFriendListId(id int32) []int32 {
sqlStr := "SELECT * FROM t_player_Friend_Data WHERE dwUin = ?"
sqlStruck := db.SqlFriendStruct{}
ret := []int32{}
if err := db.SqlDb.Get(&sqlStruck, sqlStr, id); err != nil {
fmt.Printf("get data failed, err:%v\n", err)
} else {
if sqlStruck.FriendList != "" {
arr := strings.Split(sqlStruck.FriendList, "_")
for i := 0; i < len(arr); i++ {
id, _ := strconv.ParseInt(arr[i], 10, 32)
ret = append(ret, int32(id))
}
}
}
return ret
}
func (p *ChampshipsManager) NotifyOpenNewChampShip(args []interface{}) {
go func() {
G_GameLogicPtr.M_SvrGlobal.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId + 1
G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime = args[0].(int32)
}()
}
func (p *ChampshipsManager) OpenNewChampShip(args []interface{}) {
G_GameLogicPtr.M_SvrGlobal.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId + 1
G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime = args[0].(int32)
p.MUpdateNotifyList = []int32{}
sqlStr := "SELECT * FROM t_player_baseinfo"
sqlStrucks := []db.ResPlayerBaseInfo{}
if err := db.SqlDb.Select(&sqlStrucks, sqlStr); err != nil {
fmt.Printf("get data failed, err:%v\n", err)
return
} else {
}
deleteIds := []int32{}
sqlStrucksList := []db.ResPlayerBaseInfo{}
for i := 0; i < len(sqlStrucks); i++ {
if sqlStrucks[i].UserName == "" {
deleteIds = append(deleteIds, sqlStrucks[i].DwUin)
} else {
sqlStrucksList = append(sqlStrucksList, sqlStrucks[i])
}
}
sqlStrucks = sqlStrucksList
p.DeleteUneffectPlayer(deleteIds)
sort.Slice(sqlStrucks, func(i, j int) bool {
if sqlStrucks[i].Level != sqlStrucks[j].Level {
return sqlStrucks[i].Level < sqlStrucks[j].Level
} else {
return sqlStrucks[i].Exp < sqlStrucks[j].Exp
}
})
var playerCnt int = 15
groups := int(math.Ceil((float64)(len(sqlStrucks)) / float64(playerCnt)))
StartRobotUin := 200000
p.MStatus = 1
rand.Seed(time.Now().Unix())
for i := 0; i < groups; i++ {
if i < groups-1 {
temp := db.SqlChampshipsStruct{}
temp.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo := []*msg.ChampshipsPlayerInfo{}
strr := []string{}
for j := 0; j < int(playerCnt); j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
res := strconv.Itoa(int(dwUin)) + "_" + "1" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_0"
strr = append(strr, res)
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = dwUin
playerinfo.IsGet = 0
playerinfo.IsPlayer = 1
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = 0
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
for j := int(playerCnt); j < 30; j++ {
StartRobotUin = StartRobotUin + 1
dwUin := StartRobotUin
enum := rand.Intn(4) + 1
res := strconv.Itoa(int(dwUin)) + "_" + "0" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_" + strconv.Itoa(enum)
strr = append(strr, res)
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = int32(dwUin)
playerinfo.IsGet = 0
playerinfo.IsPlayer = 0
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = int32(enum)
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
temp.GroupRankData = strings.Join(strr, ";")
insertId, _ := db.FormatAllMemInsertDb(&temp, "t_championships_data")
p.MChampshipPlayerMap[int32(insertId)] = CSPlayerInfo
for j := 0; j < int(playerCnt); j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
player, ok := G_GameLogicPtr.M_Players[dwUin]
if ok {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), true)
} else {
player = G_GameLogicPtr.FindOfflinePlayer(dwUin)
if player != nil {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), false)
} else {
sqlStrucks[i*int(playerCnt)+j].LastChampGroupID = sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID
sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID = int32(insertId)
db.FormatAllMemUpdateDb(&sqlStrucks[i*int(playerCnt)+j], "t_player_baseinfo", "dwUin")
}
}
}
} else {
remain := len(sqlStrucks) - (groups-1)*int(playerCnt)
cnt := 0
strr := []string{}
temp := db.SqlChampshipsStruct{}
temp.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo := []*msg.ChampshipsPlayerInfo{}
for j := 0; j < remain; j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
res := strconv.Itoa(int(dwUin)) + "_" + "1" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_0"
strr = append(strr, res)
cnt = cnt + 1
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = dwUin
playerinfo.IsGet = 0
playerinfo.IsPlayer = 1
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = 0
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
for j := cnt; j < 30; j++ {
StartRobotUin = StartRobotUin + 1
dwUin := StartRobotUin
enum := rand.Intn(4) + 1
res := strconv.Itoa(int(dwUin)) + "_" + "0" + "_" + "0" + "_" + "0" + "_" + "1" + "_" + strconv.Itoa(int(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)) + "_" + strconv.Itoa(enum)
strr = append(strr, res)
playerinfo := &msg.ChampshipsPlayerInfo{}
playerinfo.DwUin = int32(dwUin)
playerinfo.IsGet = 0
playerinfo.IsPlayer = 0
playerinfo.Score = 0
playerinfo.Times = 1
playerinfo.AIEnum = int32(enum)
playerinfo.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
CSPlayerInfo = append(CSPlayerInfo, playerinfo)
}
temp.GroupRankData = strings.Join(strr, ";")
insertId, _ := db.FormatAllMemInsertDb(&temp, "t_championships_data")
p.MChampshipPlayerMap[int32(insertId)] = CSPlayerInfo
for j := 0; j < remain; j++ {
dwUin := sqlStrucks[i*int(playerCnt)+j].DwUin
player, ok := G_GameLogicPtr.M_Players[dwUin]
if ok {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), true)
} else {
player = G_GameLogicPtr.FindOfflinePlayer(dwUin)
if player != nil {
player.GetIFGameData("PlayerBaseData").(*PlayerBaseData).SetChampshipID(int32(insertId), false)
} else {
sqlStrucks[i*int(playerCnt)+j].LastChampGroupID = sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID
sqlStrucks[i*int(playerCnt)+j].ChampshipsGroupID = int32(insertId)
db.FormatAllMemUpdateDb(&sqlStrucks[i*int(playerCnt)+j], "t_player_baseinfo", "dwUin")
}
}
}
}
}
p.IsLoadDB = true
p.AIScoreGrowth1h()
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
func (p *ChampshipsManager) OpenChampShipTimes(args []interface{}) {
p.MStatus = 2
notify := &msg.NotifyChampshipTimesOpen{}
notify.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipTimesOpen", data)
}
func (p *ChampshipsManager) CloseChampShipTimes(args []interface{}) {
p.MStatus = 1
notify := &msg.NotifyChampshipTimesClose{}
notify.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipTimesClose", data)
}
func (p *ChampshipsManager) Notify_Clock_Tick_Sec(args []interface{}) {
timeStamp := args[0].(int64)
t := time.Unix(timeStamp, 0).Local()
zero := timeStamp - (int64)(t.Hour()*3600+t.Minute()*60+t.Second())
OpenTime := zero + MergeConst.G_Champion_Start_Offset
OpenTimesTime := zero + MergeConst.G_Champion_Start_Effect_Time
CloseTimesTime := zero + MergeConst.G_Champion_Start_Effect_Time + MergeConst.G_Champion_Start_Effect_Durtion
DeleteLastTimesTime := zero + MergeConst.G_Champion_settlement_Duration
if G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime < int32(OpenTime) { //今日没有开启
if timeStamp >= OpenTime { //开启
GoUtil.CallEvent(MergeConst.Notify_Champion_Renew, []interface{}{int32(OpenTime)})
} else {
//开启时间未到
if p.MStatus == 1 {
GoUtil.CallEvent(MergeConst.Notify_EndChampShip, []interface{}{int32(OpenTime)})
}
}
} else {
if p.MStatus == 0 {
p.MStatus = 1
}
if !p.IsLoadDB {
p.LoadDbDataByGroupId(G_GameLogicPtr.M_SvrGlobal.CurChampshipsId)
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
p.LoadDbDataByGroupId(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
}
p.IsLoadDB = true
}
}
if p.MStatus == 1 {
if timeStamp >= OpenTimesTime && timeStamp <= CloseTimesTime {
GoUtil.CallEvent(MergeConst.Notify_OpenChampShipTimes, []interface{}{int32(OpenTime)})
}
}
if p.MStatus == 2 {
if timeStamp > CloseTimesTime {
GoUtil.CallEvent(MergeConst.Notify_CloseChampShipTimes, []interface{}{int32(OpenTime)})
}
}
if p.IsSettle == 0 {
if timeStamp <= DeleteLastTimesTime {
p.IsSettle = 1
} else {
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
p.DeleteOutLineChampship(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = 0
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
}
if p.IsSettle == 1 {
if timeStamp > DeleteLastTimesTime {
notify := &msg.NotifyChampshipSettleClose{}
notify.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.LastChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipSettleClose", data)
p.IsSettle = 0
if G_GameLogicPtr.M_SvrGlobal.LastChampshipsId > 0 {
p.DeleteOutLineChampship(G_GameLogicPtr.M_SvrGlobal.LastChampshipsId)
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = 0
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
}
}
func (p *ChampshipsManager) EndChampShip(args []interface{}) {
p.MStatus = 0
G_GameLogicPtr.M_SvrGlobal.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
notify := &msg.NotifyChampshipSettleOpen{}
notify.LastChampshipsId = G_GameLogicPtr.M_SvrGlobal.LastChampshipsId
data, _ := proto.Marshal(notify)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipSettleOpen", data)
notify1 := &msg.NotifyChampshipClose{}
notify1.CurChampshipsId = G_GameLogicPtr.M_SvrGlobal.CurChampshipsId
data1, _ := proto.Marshal(notify1)
G_GameLogicPtr.broadcastInfoAllPlayer("NotifyChampshipClose", data1)
p.NotifyRenewChampshipData()
}
func (p *ChampshipsManager) NotifyRenewChampshipData() {
for i := 0; i < len(p.MUpdateNotifyList); i++ {
groupid := p.MUpdateNotifyList[i]
playerlist, ok := p.MChampshipPlayerMap[groupid]
if ok {
for j := 0; j < len(playerlist); j++ {
if playerlist[j].IsPlayer == 1 {
dwUin := playerlist[j].DwUin
player, ok1 := G_GameLogicPtr.M_Players[dwUin]
if ok1 {
agent := player.GetAgentByPlayer()
notify := &msg.NotifyUpdateChampshipRank{}
notify.ChampshipsGroupID = groupid
notify.GroupRankDataList = playerlist
data, _ := proto.Marshal(notify)
G_getGameLogic().PackResInfo(agent, "NotifyUpdateChampshipRank", data)
} else {
}
}
}
}
}
p.MUpdateNotifyList = p.MUpdateNotifyList[0:0]
}
func (p *ChampshipsManager) ReqChampshipData(player *Player, buf []byte) {
req := &msg.ReqChampshipData{}
proto.Unmarshal(buf, req)
res := &msg.ResChampshipData{}
_, ok := p.MChampshipPlayerMap[req.ChampshipsGroupID]
if ok {
res.GroupRankDataList = p.MChampshipPlayerMap[req.ChampshipsGroupID]
}
res.ChampshipsGroupID = req.ChampshipsGroupID
res.Status = p.MStatus
res.IsSettle = p.IsSettle
res.EndTime = G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime + MergeConst.G_Champion_Duration
res.EndSettleTime = G_GameLogicPtr.M_SvrGlobal.StartChampshipsSvrTime - MergeConst.G_Champion_Start_Offset + MergeConst.G_Champion_Start_Effect_Time + MergeConst.G_Champion_Start_Effect_Durtion
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResChampshipData", data)
}
func (p *ChampshipsManager) InitManager() {
GoUtil.RegisterEvent(MergeConst.Notify_Champion_Renew, p.OpenNewChampShip, p)
GoUtil.RegisterEvent(MergeConst.Notify_OpenChampShipTimes, p.OpenChampShipTimes, p)
GoUtil.RegisterEvent(MergeConst.Notify_CloseChampShipTimes, p.CloseChampShipTimes, p)
GoUtil.RegisterEvent(MergeConst.Notify_EndChampShip, p.EndChampShip, p)
GoUtil.RegisterEvent(MergeConst.Notify_Clock_Tick_Sec, p.Notify_Clock_Tick_Sec, p)
p.MChampshipMap = make(map[int32]*db.SqlChampshipsStruct)
p.MChampshipPlayerMap = make(map[int32][]*msg.ChampshipsPlayerInfo)
p.MStatus = 0
p.IsSettle = 0
p.IsLoadDB = false
p.MUpdateNotifyList = []int32{}
p.McronSave = cron.New()
p.McronSaveID, _ = p.McronSave.AddFunc("@every 70s", func() {
p.NotifyRenewChampshipData()
})
p.RobotCronID, _ = p.McronSave.AddFunc("@every 1h", func() {
p.AIScoreGrowth1h()
})
p.RobotCronID10s, _ = p.McronSave.AddFunc("@every 15m", func() {
if p.MStatus == 2 {
p.RobotIntervalAddScore15m()
}
})
p.McronSave.Start()
}
func (p *ChampshipsManager) RobotIntervalAddScore() {
seed := time.Now().Unix()
rand.Seed(seed)
needToUpdateDb := []int32{}
for k, v := range p.MChampshipPlayerMap {
ishaveRobot := false
for i := 0; i < len(v); i++ {
if v[i].IsPlayer == 0 {
ishaveRobot = true
addScore := 3
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 1
} else {
if ran <= 50 {
addScore = addScore + 2
}
}
v[i].Score = v[i].Score + int32(addScore)
}
}
if ishaveRobot {
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == k {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
}
needToUpdateDb = append(needToUpdateDb, k)
}
}
for i := 0; i < len(needToUpdateDb); i++ {
p.SaveDbDataByGroupId(needToUpdateDb[i])
}
}
func (p *ChampshipsManager) GetMinGroupId() int32 {
var Min int32 = 0
for k := range p.MChampshipPlayerMap {
if Min == 0 {
Min = k
continue
}
if k < Min {
Min = k
}
}
return Min
}
func (p *ChampshipsManager) AIScoreGrowth1h() {
seed := time.Now().Unix()
rand.Seed(seed)
needToUpdateDb := []int32{}
// MinGroupId := p.GetMinGroupId()
for k, v := range p.MChampshipPlayerMap {
ishaveRobot := false
groupId := 0 //k - MinGroupId + 1
for i := 0; i < len(v); i++ {
if v[i].IsPlayer == 0 {
ishaveRobot = true
addScore := 0
if v[i].AIEnum == 1 {
var num1 float64 = 0.5
var num2 float64 = 5.5
groupId = rand.Intn(7) + 1
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
}
if v[i].AIEnum == 2 {
addScore = 16
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 6
} else {
if ran <= 50 {
addScore = addScore + 10
}
}
}
if v[i].AIEnum == 3 {
addScore = 16
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 10
} else {
if ran <= 75 {
addScore = addScore + 6
}
}
var num1 float64 = 0.5
var num2 float64 = 5.5
groupId = rand.Intn(7) + 1
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
}
if v[i].AIEnum == 4 {
var num1 float64 = 0.5
var num2 float64 = 5.5
groupId = rand.Intn(7) + 1
addScore = addScore + int(math.Floor(float64(groupId-1)*num1*num2))
score := rand.Intn(23)
addScore = addScore + score
}
v[i].Score = v[i].Score + int32(addScore)
}
}
if ishaveRobot {
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == k {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
}
needToUpdateDb = append(needToUpdateDb, k)
}
}
for i := 0; i < len(needToUpdateDb); i++ {
p.SaveDbDataByGroupId(needToUpdateDb[i])
}
}
func (p *ChampshipsManager) RobotIntervalAddScore15m() {
seed := time.Now().Unix()
rand.Seed(seed)
needToUpdateDb := []int32{}
for k, v := range p.MChampshipPlayerMap {
ishaveRobot := false
for i := 0; i < len(v); i++ {
if v[i].IsPlayer == 0 {
addScore := 0
if v[i].AIEnum == 1 {
ran := rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 10
} else {
if ran <= 75 {
addScore = addScore + 6
}
}
ran = rand.Intn(100) + 1
if ran <= 25 {
addScore = addScore + 5
} else {
if ran <= 50 {
addScore = addScore + 10
}
}
if addScore > 0 {
ishaveRobot = true
v[i].Score = v[i].Score + int32(addScore)
}
}
}
}
if ishaveRobot {
sort.Slice(v, func(i, j int) bool { return v[i].Score > v[j].Score })
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == k {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, k)
}
needToUpdateDb = append(needToUpdateDb, k)
}
}
for i := 0; i < len(needToUpdateDb); i++ {
p.SaveDbDataByGroupId(needToUpdateDb[i])
}
}
func (p *ChampshipsManager) SaveDbDataByGroupId(GroupId int32) {
_, ok := p.MChampshipPlayerMap[GroupId]
if ok {
List := p.MChampshipPlayerMap[GroupId]
strr := []string{}
for i := 0; i < len(List); i++ {
Item := List[i]
unit := strconv.Itoa(int(Item.DwUin)) + "_" + strconv.Itoa(int(Item.IsPlayer)) + "_" + strconv.Itoa(int(Item.Score)) + "_" + strconv.Itoa(int(Item.IsGet)) + "_" + strconv.Itoa(int(Item.Times)) + "_" + strconv.Itoa(int(Item.CurChampshipsId)) + "_" + strconv.Itoa(int(Item.AIEnum))
strr = append(strr, unit)
}
data := strings.Join(strr, ";")
sqlStruct := &db.SqlChampionshipsStruct{}
sqlStruct.ChampshipsGroupID = GroupId
sqlStruct.GroupRankData = data
sqlStruct.CurChampshipsId = List[0].CurChampshipsId
db.FormatAllMemUpdateDb(sqlStruct, "t_championships_data", "ChampshipsGroupID")
}
}
func (p *ChampshipsManager) LoadDbDataByGroupId(ChampshipsId int32) {
sqlStr := "SELECT * FROM t_championships_data WHERE CurChampshipsId = ?"
sqlStruck := []db.SqlChampionshipsStruct{}
if err := db.SqlDb.Select(&sqlStruck, sqlStr, ChampshipsId); err != nil {
fmt.Printf("get data failed, err:%v\n", err)
} else {
for m := 0; m < len(sqlStruck); m++ {
units := strings.Split(sqlStruck[m].GroupRankData, ";")
list := []*msg.ChampshipsPlayerInfo{}
for i := 0; i < len(units); i++ {
item := units[i]
strr := strings.Split(item, "_")
temp := &msg.ChampshipsPlayerInfo{}
dwuin, _ := strconv.Atoi(strr[0])
temp.DwUin = int32(dwuin)
IsPlayer, _ := strconv.Atoi(strr[1])
temp.IsPlayer = int32(IsPlayer)
Score, _ := strconv.Atoi(strr[2])
temp.Score = int32(Score)
IsGet, _ := strconv.Atoi(strr[3])
temp.IsGet = int32(IsGet)
Times, _ := strconv.Atoi(strr[4])
temp.Times = int32(Times)
CS, _ := strconv.Atoi(strr[5])
temp.CurChampshipsId = int32(CS)
AI, _ := strconv.Atoi(strr[6])
temp.AIEnum = int32(AI)
list = append(list, temp)
}
p.MChampshipPlayerMap[sqlStruck[m].ChampshipsGroupID] = list
}
}
}
func (p *ChampshipsManager) ReqChampshipAddScore(player *Player, buf []byte) {
req := &msg.ReqChampshipAddScore{}
proto.Unmarshal(buf, req)
res := &msg.ResChampshipAddScore{}
if p.MStatus == 0 {
res.ResultCode = MergeConst.Protocol_Champship_End
} else {
_, ok := p.MChampshipPlayerMap[req.GroupId]
if ok {
List := p.MChampshipPlayerMap[req.GroupId]
isHave := false
for i := 0; i < len(List); i++ {
if List[i].DwUin == player.M_DwUin {
List[i].Score = List[i].Score + req.AddScore
res.ResultCode = 0
isHave = true
break
}
}
sort.Slice(List, func(i, j int) bool { return List[i].Score > List[j].Score })
if !isHave {
res.ResultCode = MergeConst.Protocol_Champship_No_Join
} else {
res.GroupRankDataList = List
isAdd := false
for i := 0; i < len(p.MUpdateNotifyList); i++ {
if p.MUpdateNotifyList[i] == req.GroupId {
isAdd = true
break
}
}
if !isAdd {
p.MUpdateNotifyList = append(p.MUpdateNotifyList, req.GroupId)
}
p.SaveDbDataByGroupId(req.GroupId)
}
} else {
res.ResultCode = MergeConst.Protocol_Champship_No_Exsit
}
}
res.GroupId = req.GroupId
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResChampshipAddScore", data)
}
func (p *ChampshipsManager) ReqChampshipAddTime(player *Player, buf []byte) {
req := &msg.ReqChampshipAddTime{}
proto.Unmarshal(buf, req)
res := &msg.ResChampshipAddTime{}
if p.MStatus == 0 {
res.ResultCode = MergeConst.Protocol_Champship_End
} else {
_, ok := p.MChampshipPlayerMap[req.GroupId]
if ok {
List := p.MChampshipPlayerMap[req.GroupId]
isHave := false
for i := 0; i < len(List); i++ {
if List[i].DwUin == player.M_DwUin {
List[i].Times = List[i].Times + req.AddTimes
res.ResultCode = 0
isHave = true
break
}
}
sort.Slice(List, func(i, j int) bool { return List[i].Score > List[j].Score })
if !isHave {
res.ResultCode = MergeConst.Protocol_Champship_No_Join
} else {
res.GroupRankDataList = List
p.SaveDbDataByGroupId(req.GroupId)
}
} else {
res.ResultCode = MergeConst.Protocol_Champship_No_Exsit
}
}
res.GroupId = req.GroupId
agent := player.GetAgentByPlayer()
data, _ := proto.Marshal(res)
G_getGameLogic().PackResInfo(agent, "ResChampshipAddTime", data)
}

View File

@ -0,0 +1,48 @@
package game
import "server/pkg/github.com/name5566/leaf/log"
func Charge(p *Player, ChargeId int) {
ChargeFire(p, ChargeId) // 充值
EndlessFire(p, ChargeId) // 无尽礼包
PiggyBankFire(p, ChargeId) // 猪猪银行
}
func PiggyBankFire(p *Player, ChargeId int) {
PiggyBankMod := p.PlayMod.getPiggyBankMod()
Item := PiggyBankMod.Fire(ChargeId)
err := p.HandleItem(Item, "PiggyBank")
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
LimitedTimePiggyBankTrigger(p)
p.PlayMod.save()
p.PushClientRes(PiggyBankMod.BackData())
}
// 处理玩家充值
func ChargeFire(p *Player, ChargeId int) {
ChargeMod := p.PlayMod.getChargeMod()
Item := ChargeMod.Fire(ChargeId)
err := p.HandleItem(Item, "Charge")
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
p.PlayMod.save()
p.PushClientRes(ChargeMod.BackData())
}
// 处理玩家充值
func EndlessFire(p *Player, ChargeId int) {
EndlessMod := p.PlayMod.getEndlessMod()
Item := EndlessMod.Fire(ChargeId)
if Item == nil {
return
}
err := p.HandleItem(Item, "Endless")
if err != nil {
log.Debug("ChargeFire err : %s", err)
}
p.PlayMod.save()
p.PushClientRes(EndlessMod.BackData())
}

View File

@ -3,6 +3,7 @@ package game
import (
mergeCluster "server/cluster"
"server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
)
var clusterHandler map[int]func(*msg.Msg) error
@ -11,12 +12,21 @@ func ClusterMgrInit() {
go func() {
for {
m := <-mergeCluster.MsgChan
MessageHandle(m)
clusterHandlerProcess(m)
}
}()
}
func clusterHandlerProcess(m *msg.Msg) {
log.Debug("clusterHandlerProcess m %v", m)
if fun, ok := clusterHandler[m.Type]; ok {
fun(m)
} else {
log.Debug("clusterHandlerProcess not found handler %d", m.Type)
}
}
func RegisterClusterHandler(t int, fun func(*msg.Msg) error) {
clusterHandler[t] = fun
}
@ -29,30 +39,4 @@ func init() {
RegisterClusterHandler(msg.HANDLE_TYPE_REQ_CARD, FriendMgrSend)
RegisterClusterHandler(msg.HANDLE_TYPE_AGREE_CARD, FriendMgrSend)
RegisterClusterHandler(msg.CLUSTER_FRIEND_SYNC, ClusterFriendSync)
RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_INRANK, champshipInrankHandler)
RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_RANK_INFO, champshipRankInfoHandler)
RegisterClusterHandler(msg.HANDLE_TYPE_CHAMPSHIP_MY_RANK, champshipMyRankHandler)
}
func champshipInrankHandler(m *msg.Msg) error {
G_GameLogicPtr.ChampshipMgrSend(m)
return nil
}
func champshipRankInfoHandler(m *msg.Msg) error {
data := G_GameLogicPtr.ChampshipMgrCall(m)
m.To = m.From
m.From = 0
m.Extra = data
FriendMgrSend(m)
return nil
}
func champshipMyRankHandler(m *msg.Msg) error {
myRank := G_GameLogicPtr.ChampshipMgr.getMyRank(m.From)
m.To = m.From
m.From = 0
m.Extra = myRank
FriendMgrSend(m)
return nil
}

View File

@ -0,0 +1,115 @@
package game
import (
"fmt"
"server/GoUtil"
mergeCluster "server/cluster"
"server/conf"
"server/game/mod/msg"
"server/pkg/github.com/name5566/leaf/log"
)
type FriendMgr struct {
*ServerMod
}
type FirendData struct {
List map[int][]*msg.Msg
ClusterMsg map[int][]*msg.Msg
}
func (f *FriendMgr) Init() {
f.key = FRIEND_MGR_KEY
f.data = &FirendData{
List: make(map[int][]*msg.Msg),
ClusterMsg: make(map[int][]*msg.Msg),
}
// 注册处理函数
f.init()
f.RegisterHandler(msg.HANDLE_TYPE_APPLY, f.sendToPlayer)
f.RegisterHandler(msg.HADNLE_TYPE_AGREE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_DEL, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_SYNC, f.sync)
// 卡牌消息
f.RegisterHandler(msg.HANDLE_TYPE_REQ_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_REFUSE, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REG_CARD_FINISH, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_AGREE_CARD_FAIL, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_EX_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_SELECT_EX_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_ARGREE_EX_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_SELECT_CARD, f.sendToPlayer)
f.RegisterHandler(msg.HANDLE_TYPE_REFUSE_EX_CARD, f.sendToPlayer)
}
func (f *FriendMgr) getData() *FirendData {
return f.data.(*FirendData)
}
// 通知玩家
func (f *FriendMgr) sendToPlayer(m *msg.Msg) (interface{}, error) {
err := sendToPlayer(m)
if err != nil {
log.Debug("send to player error : %s\n", err)
ToServerId := GoUtil.GetServerIdByUid(m.To)
if ToServerId != conf.Server.ServerID {
f.getData().ClusterMsg[m.To] = append(f.getData().ClusterMsg[m.To], m) // 保存到集群消息
} else {
f.getData().List[m.To] = append(f.getData().List[m.To], m) // 保存到本地消息
}
f.update = true
return nil, err
}
log.Debug("send to player success")
return nil, nil
}
// 同步信息
func (f *FriendMgr) sync(m *msg.Msg) (interface{}, error) {
data := f.getData().List[m.From]
f.getData().List[m.From] = make([]*msg.Msg, 0)
return data, nil
}
// 发送消息给玩家
func sendToPlayer(m *msg.Msg) error {
p := G_GameLogicPtr.GetPlayerByUid(m.To)
if p == nil || p.stop {
return fmt.Errorf("player %d not online", m.To)
}
p.SendMsg(m)
return nil
}
func FriendMgrSend(m *msg.Msg) error {
ToServer := GoUtil.GetServerIdByUid(m.To)
if ToServer != conf.Server.ServerID {
err := mergeCluster.SendServerMsg(m, ToServer)
if err != nil { // 区服不在线
G_GameLogicPtr.FriendMgrSend(m)
return err
}
return nil
}
G_GameLogicPtr.FriendMgrSend(m)
return nil
}
// 集群好友消息同步
func ClusterFriendSync(m *msg.Msg) error {
log.Debug("ClusterFriendSync")
if v, ok := G_GameLogicPtr.FriendMgr.getData().ClusterMsg[m.To]; ok {
for _, msg := range v {
mergeCluster.SendServerMsg(msg, m.To)
}
}
return nil
}
func FriendMgrCall(m *msg.Msg) interface{} {
return G_GameLogicPtr.FriendMgrCall(m)
}

File diff suppressed because it is too large Load Diff

66
src/server/game/Gm.go Normal file
View File

@ -0,0 +1,66 @@
package game
import (
"server/game/mod/card"
"server/game/mod/item"
"server/msg"
"strconv"
"strings"
"google.golang.org/protobuf/proto"
)
func ReqGmCommand(args []interface{}) error {
_, player, buf := ParseArgs(args)
detail := &msg.ReqGmCommand{}
proto.Unmarshal(buf, detail)
arg := strings.Split(detail.Command, " ")
switch arg[0] {
case "additem":
id, _ := strconv.Atoi(arg[1])
num, _ := strconv.Atoi(arg[2])
player.HandleItem([]*item.Item{item.NewItem(id, num)}, "GM")
case "subitem":
id, _ := strconv.Atoi(arg[1])
num, _ := strconv.Atoi(arg[2])
player.HandleItem([]*item.Item{item.NewItem(id, -num)}, "GM")
case "reset_order":
player.PlayMod.mod_list.Order.Step = 0
player.PlayMod.mod_list.Order.InitData()
player.PushClientRes(player.PlayMod.mod_list.Order.BackData())
case "add_card_star":
num, _ := strconv.Atoi(arg[1])
player.PlayMod.mod_list.Card.ExchangeStar += num
player.PushClientRes(player.PlayMod.mod_list.Card.BackData())
case "addexp":
num, _ := strconv.Atoi(arg[1])
player.GetPlayerBaseMod().AddExp(num)
player.PushClientRes(&player.GetPlayerBaseMod().Data)
case "setlv":
num, _ := strconv.Atoi(arg[1])
player.GetPlayerBaseMod().Data.Level = int32(num)
player.GetPlayerBaseMod().Data.Exp = 0
player.PushClientRes(&player.GetPlayerBaseMod().Data)
case "zeroUpdate":
player.PlayMod.getVarMod().DailyResetTime = 0
player.ZeroUpdate([]interface{}{})
case "setSevenLoginActive":
num, _ := strconv.Atoi(arg[1])
player.PlayMod.getSevenLoginMod().Active = num
case "pay":
ChargeId, _ := strconv.Atoi(arg[1])
Charge(player, ChargeId)
case "resetCardReq":
CardMod := player.PlayMod.getCardMod()
CardMod.ReqFriend = make(map[int]*card.CardInfo)
CardMod.ExCard = make(map[int]*card.CardInfo)
CardMod.ExTimes = 10
CardMod.ReqTimes = 10
FriendMod := player.PlayMod.getFriendMod()
FriendMod.ApplyCard = make(map[int]*card.CardInfo)
FriendMod.ExchangeCard = make(map[int]*card.CardInfo)
FriendMod.SelectCard = make(map[int]*card.CardInfo)
}
return nil
}

View File

@ -0,0 +1,79 @@
package game
import (
"fmt"
"net/http"
"server/conf"
"server/msg"
// "server/msg"
"encoding/json"
"strconv"
"github.com/gorilla/mux"
)
type HttpManager struct {
Rounter *mux.Router
}
func (p *HttpManager) InitRounter() {
p.Rounter = mux.NewRouter()
p.InitFriendRouter()
p.InitPlayerProfileInfo()
http.ListenAndServe(conf.Server.HttpPort, p.Rounter)
}
func (p *HttpManager) InitFriendRouter() {
bs := p.Rounter.PathPrefix("/Friend").Subrouter()
bs.HandleFunc("/Add/{SenderId}/{ReceiveId}", p.AddFriend)
bs.HandleFunc("/Del/{SenderId}/{ReceiveId}", p.DeleteFriend)
}
func (p *HttpManager) InitPlayerProfileInfo() {
bs := p.Rounter.PathPrefix("/Profile").Subrouter()
bs.HandleFunc("/GetBrief/{Id}", p.GetPlayerProfileInfo)
}
func (p *HttpManager) GetPlayerProfileInfo(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
Id, ok := vars["Id"]
if ok {
Uin, _ := strconv.Atoi(Id)
data := G_GameLogicPtr.MPlayerProfileManager.HttpReqPlayerBriefProfileData(int32(Uin))
test := []*msg.ResPlayerBriefProfileData{data, data}
bytes, _ := json.Marshal(test)
v := []*msg.ResPlayerBriefProfileData{}
json.Unmarshal(bytes, &v)
fmt.Println("bytes Length:" + strconv.Itoa(len(v)))
fmt.Println("bytes Length:" + strconv.Itoa(len(v)))
w.Write(bytes)
}
}
func (p *HttpManager) AddFriend(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
SenderId, ok := vars["SenderId"]
if ok {
fmt.Println("AddFreind SenderId:" + SenderId)
}
ReceiveId, ok1 := vars["ReceiveId"]
if ok1 {
fmt.Println("AddFreind ReceiveId:" + ReceiveId)
}
}
func (p *HttpManager) DeleteFriend(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, ok := vars["id"]
if !ok {
fmt.Println("id is missing in parameters")
}
fmt.Println(`id := `, id)
}

View File

@ -0,0 +1,242 @@
package game
import (
"fmt"
"github.com/robfig/cron/v3"
"server/GoUtil"
"server/MergeConst"
"server/db"
"server/gamedata"
"strconv"
"strings"
"time"
"server/pkg/github.com/name5566/leaf/timer"
)
type LimitEventPeriod struct {
StartCronID cron.EntryID
EndTimer *timer.Timer
StartTime int32
EndTime int32
Duration int32
CronStr string
AddTimes int32
}
func NewLimitEventData(dataName string, dbName string, player *Player) *PlayerLimitData {
act := &PlayerLimitData{
PlayerData: NewPlayerData(dataName, player),
MDbName: dbName,
}
return act
}
func CreateLimiteEventData(ID int32, dataName string, player *Player) PlayerDataModule {
var data PlayerDataModule
if ID == 1 {
data = &PlayerChestRainData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Chest_Rain", player)}
}
if ID == 2 {
data = &PlayerSuperEmiterData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Super_Emiter", player)}
}
if ID == 3 {
data = &PlayerStarRainData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Star_Rain", player)}
}
if ID == 4 {
data = &PlayerHighRollerData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_High_Roller", player)}
}
if ID == 5 {
data = &PlayerSuperOrderData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Super_Order", player)}
}
if ID == 6 {
data = &PlayerSceneSprintData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Scene_Sprint", player)}
}
if ID == 7 {
data = &PlayerCardFestivalData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Card_Festival", player)}
}
if ID == 8 {
data = &PlayerDoubleHitData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Double_Hit", player)}
}
if ID == 9 {
data = &PlayerCardSwapData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Card_Swap", player)}
}
if ID == 10 {
data = &PlayerPetRobberData{PlayerLimitData: NewLimitEventData(dataName, "t_Limit_Pet_Robber", player)}
}
return data
}
type LimiteEventManager struct {
MStatus int32
CronList map[int][]string
IsSettle int32
IsLoadDB bool
MUpdateNotifyList []int32
McronSave *cron.Cron
McronSaveID cron.EntryID
RobotCronID cron.EntryID
RobotCronID10s cron.EntryID
m_MapCronEntryIDs map[int][]*LimitEventPeriod
Mdispatr *timer.Dispatcher
IsHighRoll bool
}
func (p *LimiteEventManager) GetLimitDataNameById(id int32) string {
LimitDataMap := make(map[int32]string)
LimitDataMap[1] = "PlayerChestRainData"
LimitDataMap[2] = "PlayerSuperEmiterData"
LimitDataMap[3] = "PlayerStarRainData"
LimitDataMap[4] = "PlayerHighRollerData"
LimitDataMap[5] = "PlayerSuperOrderData"
LimitDataMap[6] = "PlayerSceneSprintData"
LimitDataMap[7] = "PlayerCardFestivalData"
LimitDataMap[8] = "PlayerDoubleHitData"
LimitDataMap[9] = "PlayerCardSwapData"
LimitDataMap[10] = "PlayerPetRobberData"
return LimitDataMap[id]
}
func (p *LimiteEventManager) SaveDataFromDB(Key interface{}) bool {
return true
}
func (p *LimiteEventManager) GetSunDayZero() int64 {
timeStamp := time.Now().Unix()
t := time.Unix(timeStamp, 0).Local()
delta := int(t.Weekday()*3600*24) + t.Hour()*3600 + t.Minute()*60 + t.Second()
return int64(timeStamp) - int64(delta)
}
func (p *LimiteEventManager) GetLimitDataStatus(id int) *LimitEventPeriod {
timeStamp := time.Now().Unix()
keys := p.m_MapCronEntryIDs[id]
for i := 0; i < len(keys); i++ {
if timeStamp >= int64(keys[i].StartTime) && timeStamp < int64(keys[i].EndTime) {
return keys[i]
}
}
return nil
}
func (p *LimiteEventManager) GetIsHighRollerPersion() bool {
return p.IsHighRoll
}
// 1.宝箱雨
func (p *LimiteEventManager) InitManager() {
// 0 11 20 12 *
p.IsHighRoll = false
p.m_MapCronEntryIDs = map[int][]*LimitEventPeriod{}
c := cron.New()
LimiteCfg := gamedata.GetConfigByName("LimiteEvent")
WeekZero := p.GetSunDayZero()
timeStamp := time.Now().Unix()
p.Mdispatr = timer.NewDispatcher(10)
for i := 0; i < LimiteCfg.NumRecord(); i++ {
record := LimiteCfg.Record(i).(*gamedata.LimiteEvent)
startStrr := record.StartTime
starts := strings.Split(startStrr, "|")
DurStrr := record.Duration
Durs := strings.Split(DurStrr, "|")
AddTimesStrr := record.AddTimes
ats := strings.Split(AddTimesStrr, "|")
p.m_MapCronEntryIDs[record.Id] = []*LimitEventPeriod{}
for n := 0; n < len(starts); n++ {
LEP := &LimitEventPeriod{}
start := starts[n]
dur, _ := strconv.Atoi(Durs[n])
addt, _ := strconv.Atoi(ats[n])
LEP.StartCronID, _ = c.AddFunc(start, func() {
fmt.Println("Next: UTC", c.Entry(LEP.StartCronID).Next.Unix())
fmt.Println("CronStr:" + LEP.CronStr)
cur := int32(time.Now().Unix())
LEP.StartTime = int32(cur)
LEP.EndTime = int32(cur) + int32(dur)
if record.Id == 9 {
if G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime < LEP.StartTime {
card4Cfg, str4 := gamedata.GetRandomDifferenceSet(4, G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude)
card5Cfg, str5 := gamedata.GetRandomDifferenceSet(5, G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude)
G_GameLogicPtr.M_SvrGlobal.Limit4Card = int32(card4Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit5Card = int32(card5Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude = str4
G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude = str5
G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime = LEP.StartTime
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
GoUtil.CallEvent(MergeConst.OpenNewLimitEvent, []interface{}{record.Id, cur, cur + int32(dur), record.Type})
if record.Id == 4 {
p.IsHighRoll = true
}
go func() {
LeafTimer := p.Mdispatr.AfterFunc(time.Duration(dur)*time.Second, func() {
if record.Id == 4 {
p.IsHighRoll = false
}
})
LEP.EndTimer = LeafTimer
(<-p.Mdispatr.ChanTimer).Cb()
}()
})
LEP.Duration = int32(dur)
LEP.CronStr = start
LEP.AddTimes = int32(addt)
p.m_MapCronEntryIDs[record.Id] = append(p.m_MapCronEntryIDs[record.Id], LEP)
}
}
c.Start()
for k, v := range p.m_MapCronEntryIDs {
// record := LimiteCfg.Index(k).(*gamedata.LimiteEvent)
key := k
for i := 0; i < len(v); i++ {
Schedule := c.Entry(v[i].StartCronID).Schedule
Next := Schedule.Next(time.Unix(WeekZero, 0))
// fmt.Println("Next.Unix():" + strconv.Itoa(int(Next.Unix())))
value := v[i]
if timeStamp >= Next.Unix() && timeStamp < Next.Unix()+int64(value.Duration) {
fmt.Println("CronStr:" + value.CronStr)
if key == 4 {
p.IsHighRoll = true
}
if key == 9 {
if G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime < int32(Next.Unix()) {
card4Cfg, str4 := gamedata.GetRandomDifferenceSet(4, G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude)
card5Cfg, str5 := gamedata.GetRandomDifferenceSet(5, G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude)
G_GameLogicPtr.M_SvrGlobal.Limit4Card = int32(card4Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit5Card = int32(card5Cfg.Id)
G_GameLogicPtr.M_SvrGlobal.Limit4CardExclude = str4
G_GameLogicPtr.M_SvrGlobal.Limit5CardExclude = str5
G_GameLogicPtr.M_SvrGlobal.LimitCardSwapTime = int32(Next.Unix())
db.FormatAllMemUpdateDb(&G_GameLogicPtr.M_SvrGlobal, "t_server_global_data", "Id")
}
}
go func() {
delta := Next.Unix() + int64(value.Duration) - timeStamp
LeafTimer := p.Mdispatr.AfterFunc(time.Duration(delta)*time.Second, func() {
if key == 4 {
p.IsHighRoll = false
}
})
value.EndTimer = LeafTimer
value.StartTime = int32(Next.Unix())
value.EndTime = int32(Next.Unix()) + int32(value.Duration)
(<-p.Mdispatr.ChanTimer).Cb()
}()
} else {
}
}
}
}

View File

@ -0,0 +1,72 @@
package game
import (
"server/GoUtil"
"server/game/mod/limitedTimeEvent"
"server/msg"
"time"
)
// 限时事件触发器
func LimitedTimeEventTrigger(p *Player, AddEventId int) {
EndTime, TimeoutEvent, AddEvent := p.PlayMod.getLimitedTimeEventMod().Trigger()
remainingTime := GoUtil.NextHourRemain()
EndTime = GoUtil.IfTrue(EndTime > 0, min(EndTime, int(remainingTime)), int(remainingTime)).(int)
if AddEventId != 0 {
AddEvent = append(AddEvent, AddEventId)
}
if EndTime > 0 {
p.CallEvent(time.Duration(EndTime)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
LimitedTimeEventTrigger(p, 0)
p.SendClientRes()
}, "LimitedTimeEvent")
}
for _, v := range TimeoutEvent { // 事件到期处理
p.PushClientRes(&msg.LimitEventNotify{
Id: int32(v),
Type: limitedTimeEvent.EVENT_NOTIFY_TYPE_DEL,
})
switch v {
case limitedTimeEvent.EVENT_TYPE_HIGH_ROLLER:
MaxEnergyMul := p.GetPlayerBaseMod().GetMaxEnergyMul()
p.PlayMod.getBaseMod().ResetEnergyMul(MaxEnergyMul)
p.PushClientRes(p.PlayMod.getBaseMod().BackData())
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
p.PlayMod.getOrderMod().RemoveSuperOrder()
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
p.PlayMod.getCardMod().ResetCardFestival()
}
}
for _, v := range AddEvent { // 增加事件处理
switch v {
case limitedTimeEvent.EVENT_TYPE_SUPER_ORDER:
Emit := p.PlayMod.getChessMod().GetEmitList()
Lv := p.GetPlayerBaseMod().GetLevel()
p.PlayMod.getOrderMod().CreateSuperOrder(Lv, Emit)
p.PushClientRes(p.PlayMod.getOrderMod().BackData())
case limitedTimeEvent.EVENT_TYPE_CARD_FESTIVAL:
p.PlayMod.getCardMod().CreateCardFestival()
}
}
p.PushClientRes(p.PlayMod.getLimitedTimeEventMod().BackData())
p.PlayMod.save()
}
// 限时猪猪存钱罐触发器
func LimitedTimePiggyBankTrigger(p *Player) {
Remain := p.PlayMod.getPiggyBankMod().TimeOut()
if Remain > 0 {
p.CallEvent(time.Duration(Remain)*time.Second, func() {
p.lock.Lock()
defer p.lock.Unlock()
p.PlayMod.getPiggyBankMod().TimeOut()
p.SendClientRes()
}, "PiggyBank")
}
p.PushClientRes(p.PlayMod.getPiggyBankMod().BackData())
}

Some files were not shown because too many files have changed in this diff Show More