Compare commits
No commits in common. "rpc_server" and "master" have entirely different histories.
rpc_server
...
master
13
.gitignore
vendored
13
.gitignore
vendored
@ -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
179
src/server/GoUtil/GoUtil.go
Normal 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)
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
8
src/server/GoUtil/mathUtil.go
Normal file
8
src/server/GoUtil/mathUtil.go
Normal 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)
|
||||
}
|
||||
@ -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个元素 不放回
|
||||
172
src/server/GoUtil/sliceUtil.go
Normal file
172
src/server/GoUtil/sliceUtil.go
Normal 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:]
|
||||
}
|
||||
@ -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())
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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 |
@ -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` 约定,避免多个布尔参数。
|
||||
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
|
||||
@ -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) {
|
||||
@ -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
|
||||
}
|
||||
|
||||
41
src/server/conf/StartOrder/StartOrderCfg.go
Normal file
41
src/server/conf/StartOrder/StartOrderCfg.go
Normal 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
|
||||
}
|
||||
46
src/server/conf/activity/ActivityCfg.go
Normal file
46
src/server/conf/activity/ActivityCfg.go
Normal 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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
39
src/server/conf/base/BaseCfg.go
Normal file
39
src/server/conf/base/BaseCfg.go
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
47
src/server/conf/champship/ChampshipCfg.go
Normal file
47
src/server/conf/champship/ChampshipCfg.go
Normal 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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
253
src/server/conf/charge/ChargeCfg.go
Normal file
253
src/server/conf/charge/ChargeCfg.go
Normal 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")
|
||||
}
|
||||
@ -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])
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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 增加到 50000,RPC 通道长度
|
||||
GoLen = 10000
|
||||
TimerDispatcherLen = 10000
|
||||
AsynCallLen = 10000
|
||||
ChanRPCLen = 10000
|
||||
)
|
||||
|
||||
89
src/server/conf/dailyTask/DailyTaskCfg.go
Normal file
89
src/server/conf/dailyTask/DailyTaskCfg.go
Normal 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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
95
src/server/conf/decorate/DecorateCfg.go
Normal file
95
src/server/conf/decorate/DecorateCfg.go
Normal 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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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
|
||||
42
src/server/conf/face/FaceCfg.go
Normal file
42
src/server/conf/face/FaceCfg.go
Normal 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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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")
|
||||
@ -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")
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
48
src/server/conf/item/ItemCfg.go
Normal file
48
src/server/conf/item/ItemCfg.go
Normal 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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
219
src/server/conf/limitedTimeEvent/LimitedTimeEventCfg.go
Normal file
219
src/server/conf/limitedTimeEvent/LimitedTimeEventCfg.go
Normal 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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
188
src/server/conf/mergeData/MergeDataCfg.go
Normal file
188
src/server/conf/mergeData/MergeDataCfg.go
Normal 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")
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
38
src/server/conf/order/orderCfg.go
Normal file
38
src/server/conf/order/orderCfg.go
Normal 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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
}
|
||||
85
src/server/conf/user/UserData.go
Normal file
85
src/server/conf/user/UserData.go
Normal 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
|
||||
}
|
||||
@ -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")
|
||||
}
|
||||
@ -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 (
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
7
src/server/galog/.gitignore
vendored
7
src/server/galog/.gitignore
vendored
@ -1,7 +0,0 @@
|
||||
.DS_Store
|
||||
.vscode/
|
||||
.idea/
|
||||
*.log
|
||||
logs/
|
||||
ga_log/
|
||||
asset_log/
|
||||
@ -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 |
|
||||
| 并发=2,qps=200 | 1% | 52% | 0.08% | 7 |
|
||||
| 并发=5,qps=5000 | 4% | 52% | 1% | 7 |
|
||||
| 并发=5,qps=50000(队列1000,有阻塞) realqps=5000 | 40% | 52% | 30% | 7 |
|
||||
| 并发=5,qps=50000(队列10000,有阻塞) realqps=6500 | 6% | 52% | 1% | 7 |
|
||||
| 并发=20,qps=50000(队列10000,有阻塞) realqps=18000 | 10% | 52% | 3% | 7 |
|
||||
| 并发=50,qps=50000(队列10000) realqps=50000 | 35% | 52% | 10% | 7 |
|
||||
| 并发=100,qps=100000(队列10000) realqps=90000 | 75% | 52% | 16% | 7 |
|
||||
|
||||
- 压测结果:写入队列=10000,单核支持最高写入QPS约5w,CPU=75%。
|
||||
|
||||
- 监控结果如下:
|
||||

|
||||

|
||||
|
||||
## 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 |
|
||||
@ -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)
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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 }}`
|
||||
)
|
||||
@ -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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
@ -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 |
@ -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()
|
||||
}
|
||||
}
|
||||
@ -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 项目ID,GA侧分配,必填
|
||||
// opts.ClientID 客户端ID,GA侧分配,必填
|
||||
// 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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
785
src/server/game/ChampshipsManager.go
Normal file
785
src/server/game/ChampshipsManager.go
Normal 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)
|
||||
}
|
||||
48
src/server/game/ChargeFunc.go
Normal file
48
src/server/game/ChargeFunc.go
Normal 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())
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
115
src/server/game/FriendMgr.go
Normal file
115
src/server/game/FriendMgr.go
Normal 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
66
src/server/game/Gm.go
Normal 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
|
||||
}
|
||||
79
src/server/game/HttpSvr.go
Normal file
79
src/server/game/HttpSvr.go
Normal 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)
|
||||
|
||||
}
|
||||
242
src/server/game/LimiteEventManager.go
Normal file
242
src/server/game/LimiteEventManager.go
Normal 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 {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
72
src/server/game/LimitedTimeTrigger.go
Normal file
72
src/server/game/LimitedTimeTrigger.go
Normal 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
Loading…
Reference in New Issue
Block a user