Merge branch 'develop' into sdk

This commit is contained in:
hahwu 2025-01-06 16:41:32 +08:00
commit b328f9b6ea
20 changed files with 3244 additions and 3047 deletions

View File

@ -2,8 +2,13 @@ package GoUtil
import ( import (
"bytes" "bytes"
"crypto/aes"
"crypto/cipher"
crand "crypto/rand"
"encoding/base64"
"encoding/gob" "encoding/gob"
"fmt" "fmt"
"io"
"math/rand" "math/rand"
"reflect" "reflect"
"strconv" "strconv"
@ -19,6 +24,54 @@ type EventObj struct {
Obj interface{} Obj interface{}
} }
const (
SECRET_KEY = ")VQbB(vpy=U(wcp)"
)
// 加密字符串
func Encrypt(plainText string) (string, error) {
block, err := aes.NewCipher([]byte(SECRET_KEY))
if err != nil {
return "", err
}
cipherText := make([]byte, aes.BlockSize+len(plainText))
iv := cipherText[:aes.BlockSize]
if _, err := io.ReadFull(crand.Reader, iv); err != nil {
return "", err
}
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(cipherText[aes.BlockSize:], []byte(plainText))
return base64.URLEncoding.EncodeToString(cipherText), nil
}
// 解密字符串
func Decrypt(cipherText string) (string, error) {
cipherTextBytes, err := base64.URLEncoding.DecodeString(cipherText)
if err != nil {
return "", err
}
block, err := aes.NewCipher([]byte(SECRET_KEY))
if err != nil {
return "", err
}
if len(cipherTextBytes) < aes.BlockSize {
return "", fmt.Errorf("cipherText too short")
}
iv := cipherTextBytes[:aes.BlockSize]
cipherTextBytes = cipherTextBytes[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(cipherTextBytes, cipherTextBytes)
return string(cipherTextBytes), nil
}
func (o *EventObj) isEqual(tar *EventObj) bool { func (o *EventObj) isEqual(tar *EventObj) bool {
if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj { if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj {
return true return true

View File

@ -192,3 +192,11 @@ func GetReqTimes() int {
} }
return gamedata.GetIntValue(data, "Value") 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 data not found")
}
return gamedata.GetIntValue(data, "ItemId")
}

View File

@ -29,6 +29,7 @@ var Server struct {
RedisAddr string RedisAddr string
RedisPort string RedisPort string
RedisPwd string RedisPwd string
RedisDb int
GameName string GameName string
ServerType string ServerType string

View File

@ -16,6 +16,7 @@ const (
CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot" CFG_LIMITED_TIME_EVENT_SENCE_JACKPOT = "LimitedTimeEventSenceJackpot"
CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast" CFG_LIMITED_TIME_EVENT_FAST = "LimitedTimeEventFast"
CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot" CFG_LIMITED_TIME_EVENT_JACKPOT = "LimitedTimeEventJackpot"
CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT = "LimitedTimeEventChestJackpot"
CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst" CFG_LIMITED_TIME_EVENT_CONST = "LimitedTimeEventConst"
CFG_LIMITED_TIME_EVENT_BONUS = "LimitedTimeEventBonus" CFG_LIMITED_TIME_EVENT_BONUS = "LimitedTimeEventBonus"
) )
@ -31,6 +32,7 @@ func init() {
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT) gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_JACKPOT)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST) gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CONST)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_BONUS) gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_BONUS)
gamedata.InitCfg(CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT)
} }
// 获取限时事件触发列表 // 获取限时事件触发列表
@ -49,20 +51,47 @@ func GetMeteorAdd(ChessLv int) int {
} }
// 获取宝箱雨奖励 // 获取宝箱雨奖励
func GetChestReward(Star int) []*item.Item { func GetChestReward(Star int) ([]*item.Item, int, int, int) {
data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST) data, err := gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST)
if err != nil { if err != nil {
log.Debug("GetChestReward err:%v", err) log.Debug("GetChestReward err:%v", err)
return nil return nil, 0, 0, 0
} }
for _, v := range data { Grade := 0
for k, v := range data {
Min := gamedata.GetIntValue(v, "Min") Min := gamedata.GetIntValue(v, "Min")
Max := gamedata.GetIntValue(v, "Max") Max := gamedata.GetIntValue(v, "Max")
if Star >= Min && Star <= Max { if Star >= Min && Star <= Max {
return gamedata.GetItemList(v, "Items") Grade = GoUtil.Int(k)
break
} }
} }
return nil
data, err = gamedata.GetData(CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT)
if err != nil {
log.Debug("GetChestReward err:%v", err)
return nil, 0, 0, 0
}
RandMap := make(map[int]int)
for k, v := range data {
Prob := gamedata.GetIntValue(v, "Prob")
if Grade == gamedata.GetIntValue(v, "Grade") {
Id := GoUtil.Int(k)
RandMap[Id] = Prob
}
}
Id := GoUtil.RandMap(RandMap)
data, err = gamedata.GetDataByIntKey(CFG_LIMITED_TIME_EVENT_CHEST_JACKPOT, Id)
if err != nil {
log.Debug("GetChestReward err:%v", err)
return nil, 0, 0, 0
}
Items := gamedata.GetItemList(data, "Items")
CardLv := gamedata.GetIntValue(data, "CardLv")
Lv := gamedata.GetIntValue(data, "Lv")
Jackpot := gamedata.GetIntValue(data, "Jackpot")
return Items, CardLv, Lv, Jackpot
} }
// 获取超级订单奖励 // 获取超级订单奖励

View File

@ -1,13 +1,13 @@
{ {
"AppID": 1, "AppID": 1,
"LogLevel": "debug", "LogLevel": "debug",
"LogPath": "", "LogPath": "./log",
"TCPAddr": ":3565", "TCPAddr": ":3565",
"WSAddr": ":3566", "WSAddr": ":3566",
"MySqlAddr": "127.0.0.1", "MySqlAddr": "127.0.0.1",
"MySqlPort": "3306", "MySqlPort": "3306",
"MySqlUsr": "root", "MySqlUsr": "root",
"MySqlPwd": "root", "MySqlPwd": "IOagNEq3C84c-20CmHEin5iODVc=",
"MaxConnNum": 20000, "MaxConnNum": 20000,
"DbName": "Merge_Pet", "DbName": "Merge_Pet",
"HttpPort": ":8081", "HttpPort": ":8081",

View File

@ -25,7 +25,8 @@ var SqlDb *sqlx.DB
func InitDB() { func InitDB() {
//"用户名:密码@[连接方式](主机名:端口号)/数据库名" //"用户名:密码@[连接方式](主机名:端口号)/数据库名"
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s", conf.Server.MySqlUsr, conf.Server.MySqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName) MysqlPwd, _ := GoUtil.Decrypt(conf.Server.MySqlPwd)
connect := fmt.Sprintf("%s:%s@(%s:%s)/%s", conf.Server.MySqlUsr, MysqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName)
SqlDb = sqlx.MustConnect("mysql", connect) // 设置连接数据库的参数 SqlDb = sqlx.MustConnect("mysql", connect) // 设置连接数据库的参数
SqlDb.SetMaxOpenConns(20) // 设置最大打开的连接数 SqlDb.SetMaxOpenConns(20) // 设置最大打开的连接数
log.Debug("connect mysql success") log.Debug("connect mysql success")

View File

@ -17,7 +17,7 @@ func InitRedis() {
rdb := redis.NewClient(&redis.Options{ rdb := redis.NewClient(&redis.Options{
Addr: conf.Server.RedisAddr + ":" + conf.Server.RedisPort, Addr: conf.Server.RedisAddr + ":" + conf.Server.RedisPort,
Password: conf.Server.RedisPwd, // no password set Password: conf.Server.RedisPwd, // no password set
DB: 0, DB: conf.Server.RedisDb,
}) })
_, err := rdb.Ping(ctx).Result() _, err := rdb.Ping(ctx).Result()

View File

@ -491,6 +491,10 @@ func (p *Player) HandleItem(itemList []*item.Item, Label string) error {
"change_num": v.Num, "change_num": v.Num,
"change_after": p.GetPlayerBaseMod().GetDiamond(), "change_after": p.GetPlayerBaseMod().GetDiamond(),
}) })
case item.ITEM_TYPE_CARD: // 卡牌
CardMod := p.PlayMod.getCardMod()
Effect := itemCfg.GetItemEffect(v.Id)
CardMod.AddCard(Effect)
case item.ITEM_TYPE_CARD_PACK: // 卡包 case item.ITEM_TYPE_CARD_PACK: // 卡包
CardMod := p.PlayMod.getCardMod() CardMod := p.PlayMod.getCardMod()
Effect := itemCfg.GetItemEffect(v.Id) Effect := itemCfg.GetItemEffect(v.Id)

View File

@ -7,6 +7,7 @@ import (
"server/GoUtil" "server/GoUtil"
"server/MergeConst" "server/MergeConst"
cardCfg "server/conf/card" cardCfg "server/conf/card"
limitedTimeEventCfg "server/conf/limitedTimeEvent"
mergeDataCfg "server/conf/mergeData" mergeDataCfg "server/conf/mergeData"
miningCfg "server/conf/mining" miningCfg "server/conf/mining"
"server/db" "server/db"
@ -177,6 +178,7 @@ func ReqRewardOrder(args []interface{}) error {
proto.Unmarshal(buf, req) proto.Unmarshal(buf, req)
OrderMod := player.PlayMod.getOrderMod() OrderMod := player.PlayMod.getOrderMod()
ChessMod := player.PlayMod.getChessMod() ChessMod := player.PlayMod.getChessMod()
CardMod := player.PlayMod.getCardMod()
LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod()
Item, mergeList, OrderType, Star, err := OrderMod.RewardOrder(int(req.OrderId)) Item, mergeList, OrderType, Star, err := OrderMod.RewardOrder(int(req.OrderId))
if OrderType == order.Trigger_type { // playroom触发式订单获取额外道具 if OrderType == order.Trigger_type { // playroom触发式订单获取额外道具
@ -195,15 +197,36 @@ func ReqRewardOrder(args []interface{}) error {
Item = item.Merge(Item, AddItem) Item = item.Merge(Item, AddItem)
} }
if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_CHEST_RAIN) { //宝箱雨活动 if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_CHEST_RAIN) { //宝箱雨活动
AddItem := LimitedTimeEventMod.GetChestReward(mergeList) AddItem, CardLv, ProductLv, Jackpot := LimitedTimeEventMod.GetChestReward(mergeList)
Item = item.Merge(Item, AddItem) ChestRainItems := make([]*item.Item, 0)
if len(AddItem) > 0 { if len(AddItem) > 0 {
ChestRainItems = AddItem
}
JackpotId := 0
if CardLv > 0 {
CardId := CardMod.RandCard(CardLv)
ItemId := cardCfg.GetItemIdByCardId(CardId)
ChestRainItems = []*item.Item{{Id: ItemId, Num: 1}}
}
if ProductLv > 0 {
Color := order.RandChessColor(ChessMod.GetOrderEmit())
ChessId := mergeDataCfg.GetChessIdByLvAndColor(ProductLv, Color)
ChestRainItems = append(ChestRainItems, &item.Item{Id: ChessId, Num: 1})
}
if Jackpot > 0 {
ProbList := limitedTimeEventCfg.GetSenceJackpotProb()
JackpotId = GoUtil.RandMap(ProbList)
ChestRainItems = limitedTimeEventCfg.GetSenceJackpotReward(JackpotId)
}
Item = item.Merge(Item, ChestRainItems)
if len(ChestRainItems) > 0 {
player.PushClientRes(&msg.ResChessRainReward{ player.PushClientRes(&msg.ResChessRainReward{
Chest: int32(AddItem[0].Id), Items: item.ItemToMsg(ChestRainItems),
Id: int32(JackpotId),
}) })
player.TeLog("time_limited_event_action", map[string]interface{}{ player.TeLog("time_limited_event_action", map[string]interface{}{
"event_type": "chest_rain", "event_type": "chest_rain",
"item_list": AddItem, "item_list": ChestRainItems,
}) })
} }
} }

View File

@ -2,6 +2,11 @@ package game
import ( import (
"fmt" "fmt"
"server/GoUtil"
cardCfg "server/conf/card"
limitedTimeEventCfg "server/conf/limitedTimeEvent"
mergeDataCfg "server/conf/mergeData"
"server/game/mod/item"
"server/game/mod/order" "server/game/mod/order"
"server/game/mod/sevenLogin" "server/game/mod/sevenLogin"
"server/msg" "server/msg"
@ -98,3 +103,33 @@ func UnitLimitProgress(p *Player) error {
LimitedTimeEventMod.AddProgress(6) LimitedTimeEventMod.AddProgress(6)
return nil return nil
} }
func UnitLimitedTimeEvent(p *Player) error {
LimitedTimeEventMod := p.PlayMod.getLimitedTimeEventMod()
CardMod := p.PlayMod.getCardMod()
ChessMod := p.PlayMod.getChessMod()
mergeList := []int{1, 2, 30}
ChestRainItems := make([]*item.Item, 0)
AddItem, CardLv, ProductLv, Jackpot := LimitedTimeEventMod.GetChestReward(mergeList)
if len(AddItem) > 0 {
ChestRainItems = AddItem
}
JackpotId := 0
if CardLv > 0 {
CardId := CardMod.RandCard(CardLv)
ItemId := cardCfg.GetItemIdByCardId(CardId)
ChestRainItems = []*item.Item{{Id: ItemId, Num: 1}}
}
if ProductLv > 0 {
Color := order.RandChessColor(ChessMod.GetOrderEmit())
ChessId := mergeDataCfg.GetChessIdByLvAndColor(ProductLv, Color)
ChestRainItems = append(ChestRainItems, &item.Item{Id: ChessId, Num: 1})
}
if Jackpot > 0 {
ProbList := limitedTimeEventCfg.GetSenceJackpotProb()
JackpotId = GoUtil.RandMap(ProbList)
ChestRainItems = limitedTimeEventCfg.GetSenceJackpotReward(JackpotId)
}
fmt.Print(ChestRainItems, JackpotId)
return nil
}

View File

@ -38,6 +38,7 @@ func AdminPlayerInfo(args []interface{}) error {
} }
res := make(map[string]interface{}) res := make(map[string]interface{})
res["Name"] = player.PlayMod.getBaseMod().NickName res["Name"] = player.PlayMod.getBaseMod().NickName
res["Uid"] = player.M_DwUin
res["AreaId"] = player.PlayMod.getDecorateMod().GetAreaId() res["AreaId"] = player.PlayMod.getDecorateMod().GetAreaId()
res["Charge"] = player.PlayMod.getChargeMod().Charge res["Charge"] = player.PlayMod.getChargeMod().Charge
res["Level"] = player.GetPlayerBaseMod().GetLevel() res["Level"] = player.GetPlayerBaseMod().GetLevel()
@ -49,6 +50,7 @@ func AdminPlayerInfo(args []interface{}) error {
res["Login"] = player.GetPlayerBaseMod().Data.LoginTime res["Login"] = player.GetPlayerBaseMod().Data.LoginTime
res["Cumulative"] = player.PlayMod.getBaseMod().Cumulative res["Cumulative"] = player.PlayMod.getBaseMod().Cumulative
res["TodayCumulative"] = player.PlayMod.getBaseMod().TodayCumulative res["TodayCumulative"] = player.PlayMod.getBaseMod().TodayCumulative
res["Bonus"] = player.PlayMod.getLimitedTimeEventMod().Progress
OrderMap := make(map[int]interface{}) OrderMap := make(map[int]interface{})
Index := 0 Index := 0
for k, v := range player.PlayMod.getOrderMod().OrderList { for k, v := range player.PlayMod.getOrderMod().OrderList {

View File

@ -535,3 +535,7 @@ func (c *CardMod) GetHandbookReward(CardId int) ([]*item.Item, error) {
} }
return nil, fmt.Errorf("GetHandbookReward not find card") return nil, fmt.Errorf("GetHandbookReward not find card")
} }
func (c *CardMod) RandCard(Star int) int {
return randCard(c.Round, Star, 0)
}

View File

@ -29,6 +29,8 @@ const (
ITEM_TYPE_DIAMOND = 3 ITEM_TYPE_DIAMOND = 3
// 物品类型 // 物品类型
ITEM_TYPE_CARD = 98 // 卡牌
ITEM_TYPE_BAG = 99 // 背包
ITEM_TYPE_CHESS = 100 // 棋子 ITEM_TYPE_CHESS = 100 // 棋子
ITEM_TYPE_CARD_PACK = 101 // 卡包 ITEM_TYPE_CARD_PACK = 101 // 卡包
ITEM_TYPE_LIMIED_TIME_EVENT = 102 //限时事件 ITEM_TYPE_LIMIED_TIME_EVENT = 102 //限时事件

View File

@ -20,6 +20,7 @@ const (
EVENT_TYPE_GOLDCARD_EX = 8 // 金卡交换 EVENT_TYPE_GOLDCARD_EX = 8 // 金卡交换
EVENT_TYPE_PET_THIEF = 9 // 宠物小偷 EVENT_TYPE_PET_THIEF = 9 // 宠物小偷
EVENT_TYPE_FAST_PRODUCE = 10 // 连击快手 EVENT_TYPE_FAST_PRODUCE = 10 // 连击快手
EVENT_TYPE_CAT_CYCLONE = 11 // 猫咪飓风
) )
const ( const (
@ -191,12 +192,11 @@ func (l *LimitedTimeEventMod) GetMeteorReward(MergeList []int) []*item.Item {
} }
// 获取宝箱雨奖励 // 获取宝箱雨奖励
func (l *LimitedTimeEventMod) GetChestReward(MergeList []int) []*item.Item { func (l *LimitedTimeEventMod) GetChestReward(MergeList []int) ([]*item.Item, int, int, int) {
Star := 0 Star := 0
for _, v := range MergeList { for _, v := range MergeList {
Star += mergeDataCfg.GetStarById(v) Star += mergeDataCfg.GetStarById(v)
} }
return limitedTimeEventCfg.GetChestReward(Star) return limitedTimeEventCfg.GetChestReward(Star)
} }

View File

@ -166,6 +166,26 @@ func getRandChessColorList(o *OrderMod, Emit []int, EnergyMul int) map[string]in
return r return r
} }
func RandChessColor(Emit []int) string {
r := make(map[string]int)
for _, v := range Emit {
Produce := mergeDataCfg.GetEmitProduceType(v)
if len(Produce) == 0 {
continue
}
if len(Produce) == 1 {
if Produce[0] == "" {
continue
}
r[Produce[0]] = 100
continue
}
r[Produce[0]] = 80
r[Produce[1]] = 20
}
return GoUtil.RandStringMap(r)
}
func checkA1High(ChessList []int, Emit int, EnergyMul int) bool { func checkA1High(ChessList []int, Emit int, EnergyMul int) bool {
ChessMinLev, ChessMaxLev := getChesslvRange(Emit, EnergyMul) ChessMinLev, ChessMaxLev := getChesslvRange(Emit, EnergyMul)
HighLv := ChessMinLev + ((ChessMaxLev-ChessMinLev)/3)*2 HighLv := ChessMinLev + ((ChessMaxLev-ChessMinLev)/3)*2

View File

@ -51,6 +51,13 @@ func init() {
} }
func Reload() {
for k := range G_AllConfigsJsonData {
InitCfg(k)
log.Debug("配置已重新加载:%s", k)
}
}
func readRfNew(st interface{}, ralativePath string) *recordfile.RecordFile { func readRfNew(st interface{}, ralativePath string) *recordfile.RecordFile {
rf, err := recordfile.New(st) rf, err := recordfile.New(st)
if err != nil { if err != nil {

View File

@ -20,17 +20,9 @@ func main() {
lconf.CenterAddr = conf.Server.CenterAddr lconf.CenterAddr = conf.Server.CenterAddr
lconf.PendingWriteNum = conf.PendingWriteNum lconf.PendingWriteNum = conf.PendingWriteNum
// c := cron.New()
// c.AddFunc("@every 1s", func() {
// fmt.Println("tick every 1 second")
// })
// c.Start()
leaf.Run( leaf.Run(
game.Module, game.Module,
gate.Module, gate.Module,
// login.Module,
) )
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
package leaf package leaf
import ( import (
"fmt"
"os" "os"
"os/signal" "os/signal"
mergeCluster "server/cluster" mergeCluster "server/cluster"
sconf "server/conf" sconf "server/conf"
"server/game" "server/game"
"server/gamedata"
"server/pkg/github.com/name5566/leaf/cluster" "server/pkg/github.com/name5566/leaf/cluster"
"server/pkg/github.com/name5566/leaf/conf" "server/pkg/github.com/name5566/leaf/conf"
"server/pkg/github.com/name5566/leaf/console" "server/pkg/github.com/name5566/leaf/console"
@ -45,11 +45,19 @@ func Run(mods ...module.Module) {
// close // close
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) signal.Notify(c, syscall.SIGTERM, syscall.SIGINT)
sig := <-c for {
fmt.Printf("Leaf closing down (signal: %v)\n", sig.String()) sig := <-c
console.Destroy() if sig == syscall.SIGINT {
cluster.Destroy() gamedata.Reload()
module.Destroy() continue
game.Destroy() }
log.Debug("Leaf closing down (signal: %v)\n", sig.String())
console.Destroy()
cluster.Destroy()
module.Destroy()
game.Destroy()
os.Exit(1)
}
} }

View File

@ -101,13 +101,10 @@ func NewDailyLog(now time.Time, strLevel string, pathname string, flag int) (*Lo
if pathname != "" { if pathname != "" {
// now := time.Now() // now := time.Now()
filename := fmt.Sprintf("%d%02d%02d_%02d_%02d_%02d.log", filename := fmt.Sprintf("%d%02d%02d.log",
now.Year(), now.Year(),
now.Month(), now.Month(),
now.Day(), now.Day())
now.Hour(),
now.Minute(),
now.Second())
file, err := os.Create(path.Join(pathname, filename)) file, err := os.Create(path.Join(pathname, filename))
if err != nil { if err != nil {