diff --git a/common/sstransmit.go b/common/sstransmit.go index 2aa5cf8..bd3e265 100644 --- a/common/sstransmit.go +++ b/common/sstransmit.go @@ -56,22 +56,22 @@ func (this *SSTransmitHandler) Process(s *netlib.Session, packetid int, data int if transmitPack, ok := data.(*server.SSTransmit); ok { pd := transmitPack.GetPacketData() sid := transmitPack.GetSessionId() - packetid, packet, err := netlib.UnmarshalPacket(pd) + packetId, packet, err := netlib.UnmarshalPacket(pd) if err == nil { - h := GetHandler(packetid) + h := GetHandler(packetId) if h != nil { - utils.DumpStackIfPanic(fmt.Sprintf("SSTransmitHandler.Process error, packetid:%v", packetid)) - watch := profile.TimeStatisticMgr.WatchStart(fmt.Sprintf("/action/packet:%v", packetid), profile.TIME_ELEMENT_ACTION) - err := h.Process(s, packetid, packet, sid) + utils.DumpStackIfPanic(fmt.Sprintf("SSTransmitHandler.Process error, packetId:%v", packetId)) + watch := profile.TimeStatisticMgr.WatchStart(fmt.Sprintf("/action/packet:%v", packetId), profile.TIME_ELEMENT_ACTION) + err := h.Process(s, packetId, packet, sid) if watch != nil { watch.Stop() } if err != nil { - logger.Logger.Tracef("Packet [%d] error:", packetid, err) + logger.Logger.Tracef("Packet [%d] error: %v", packetId, err) } return err } else { - logger.Logger.Tracef("Packet %v not find handler.", packetid) + logger.Logger.Tracef("Packet %v not find handler.", packetId) } } else { logger.Logger.Trace("SSTransmitHandler process err:", err) diff --git a/gamerule/tienlen/poker.go b/gamerule/tienlen/poker.go index 2c11101..48d0c3b 100644 --- a/gamerule/tienlen/poker.go +++ b/gamerule/tienlen/poker.go @@ -6,7 +6,7 @@ import ( "time" ) -//牌序- 2, A, K, Q, J, 10, 9, 8, 7, 6, 5, 4, 3 +//牌序- 2, A, K, Q, J,10, 9, 8, 7, 6, 5, 4, 3 //红桃- 51,50,49,48,47,46,45,44,43,42,41,40,39 //方片- 38,37,36,35,34,33,32,31,30,29,28,27,26 //梅花- 25,24,23,22,21,20,19,18,17,16,15,14,13 diff --git a/gamesrv/fishing/action_fish.go b/gamesrv/fishing/action_fish.go index c59f6b1..ba6210a 100644 --- a/gamesrv/fishing/action_fish.go +++ b/gamesrv/fishing/action_fish.go @@ -149,7 +149,7 @@ func (this *CSFishTargetPacketFactory) CreatePacket() interface{} { if player == nil { logger.Logger.Warn("CSFishViewHandler robot == nil") return nil - //player = base.PlayerMgrSington.GetPlayer(sid) + //player = base.PlayerMgrSington.GetOnlinePlayer(sid) } if player == nil { logger.Logger.Warn("CSFishViewHandler p == nil") @@ -260,7 +260,7 @@ func (this *CSFishFirePranaPacketFactory) CreatePacket() interface{} { /*func (this *CSFishFirePranaHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSFishFirePranaHandler Process recv ", data) if msg, ok := data.(*fishing_proto.CSFirePrana); ok { - player := base.PlayerMgrSington.GetPlayer(sid) + player := base.PlayerMgrSington.GetOnlinePlayer(sid) if player == nil { logger.Logger.Warn("CSFishFirePranaHandler p == nil") return nil diff --git a/gamesrv/slotspkg/assemble/datatocli.go b/gamesrv/slotspkg/assemble/datatocli.go index cd915f4..6c08020 100644 --- a/gamesrv/slotspkg/assemble/datatocli.go +++ b/gamesrv/slotspkg/assemble/datatocli.go @@ -18,16 +18,19 @@ func DataToCli(response any) interface{} { } sort.Slice(Response.BetChangeList, func(i, j int) bool { return Response.BetChangeList[i] < Response.BetChangeList[j] }) sort.Slice(Response.BetLevels, func(i, j int) bool { return Response.BetLevels[i] < Response.BetLevels[j] }) + sort.Slice(Response.BaseBets, func(i, j int) bool { return Response.BaseBets[i] < Response.BaseBets[j] }) sort.Slice(BetSizes, func(i, j int) bool { return BetSizes[i] < BetSizes[j] }) tableInfo.BetConfig = BetConfig{ BetChangeList: Response.BetChangeList, BetSize: BetSizes, + BaseBet: Response.BaseBets, BetLevel: Response.BetLevels, BetLines: Response.BetLines, BetType: 1, BetSizeIndex: Response.BetSizeIndex, BetLevelIndex: Response.BetLevelIndex, BetLineIndex: Response.BetLineIndex, + BaseBetIndex: Response.BaseBetIndex, } tableInfo.Coin = float64(Response.Coin) / CoinRate ////////////////////////////////////////////////////////////// diff --git a/gamesrv/slotspkg/assemble/struct_.go b/gamesrv/slotspkg/assemble/struct_.go index b0fa434..eab6537 100644 --- a/gamesrv/slotspkg/assemble/struct_.go +++ b/gamesrv/slotspkg/assemble/struct_.go @@ -47,10 +47,12 @@ type BetConfig struct { BetSize []float64 `json:"bet_size"` //单注 BetLevel []int64 `json:"bet_level"` //下注线数 BetLines []int64 `json:"bet_lines"` //可选线数 + BaseBet []int64 `json:"base_bet"` //下注基数 BetType int `json:"bet_type"` //total计算方式 1.显示成Lines betSize*betLevel*lines (lines) BetSizeIndex int64 `json:"bet_size_index"` //选中的单注下标 BetLevelIndex int64 `json:"bet_level_index"` //选中的等级下标 BetLineIndex int64 `json:"bet_line_index"` //选中的线数下标 + BaseBetIndex int64 `json:"base_bet_index"` //选中的下注基数下标 } type TableInfo struct { SpinResult GameEnd `json:"spin_result"` diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx index 96f997a..881c357 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_ItemInfo.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_ItemInfo.xlsx new file mode 100644 index 0000000..0700658 Binary files /dev/null and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_ItemInfo.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx index 5b4fc4f..6f57030 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Feature/S_Others.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx index 67990f3..2a55315 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/CashMania/Generic/Symbol.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx index 4ab443d..229e2df 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx index aa448e0..086e3e6 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneDragon/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx index f5c9db6..4d00e3f 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneMouse/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx index 96f997a..067894e 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneOx/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx index 5ac9f53..8ccbf99 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneRabbit/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx index f5c9db6..217f5a4 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Bet.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx index 26d4221..55d4724 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx and b/gamesrv/slotspkg/external/excel/Base/Slots/FortuneTiger/Generic/ReelBaseSpin.xlsx differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Bet.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Bet.xlsx deleted file mode 100644 index 8af9ed4..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Bet.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Multiplier.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Multiplier.xlsx deleted file mode 100644 index 31bd28b..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Multiplier.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/S_ReelChoose.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/S_ReelChoose.xlsx deleted file mode 100644 index 59e9819..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/S_ReelChoose.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Scatter.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Scatter.xlsx deleted file mode 100644 index b67124f..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Feature/Scatter.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Formation.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Formation.xlsx deleted file mode 100644 index e674d7b..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Formation.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin.xlsx deleted file mode 100644 index 35ec79a..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin1.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin1.xlsx deleted file mode 100644 index c54dbc2..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin1.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin2.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin2.xlsx deleted file mode 100644 index aa0b3e2..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin2.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin3.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin3.xlsx deleted file mode 100644 index 59930bd..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin3.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin7.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin7.xlsx deleted file mode 100644 index fb87571..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin7.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin8.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin8.xlsx deleted file mode 100644 index db126a2..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelBaseSpin8.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin.xlsx deleted file mode 100644 index ccb274e..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin4.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin4.xlsx deleted file mode 100644 index add7877..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin4.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin5.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin5.xlsx deleted file mode 100644 index f20b84a..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/ReelFreeSpin5.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/S_Map.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/S_Map.xlsx deleted file mode 100644 index 49abd74..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/S_Map.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Symbol.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Symbol.xlsx deleted file mode 100644 index f12c84e..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Generic/Symbol.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Settings.xlsx b/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Settings.xlsx deleted file mode 100644 index a31818e..0000000 Binary files a/gamesrv/slotspkg/external/excel/Base/Slots/GateofOlympus/Settings.xlsx and /dev/null differ diff --git a/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx b/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx index 1e44ec7..192e887 100644 Binary files a/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx and b/gamesrv/slotspkg/external/excel/Base/Template/1003_BetLine.xlsx differ diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go b/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go index 6215492..868f814 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/cash_mania.go @@ -134,7 +134,8 @@ func init() { CashManiaBetBetLine = map[int64]*structs.CashManiaBetBetLine{ 0: { Index: 0, - BetLine: 10, + BetLine: 1, + BaseBet: 10, }, } @@ -194,6 +195,129 @@ func init() { }, } + CashManiaItemInfo = map[int64]*structs.CashManiaItemInfo{ + 1: { + Index: 1, + ItemID: 1, + Value: 10, + IsMid: false, + }, + 2: { + Index: 2, + ItemID: 2, + Value: 5, + IsMid: false, + }, + 3: { + Index: 3, + ItemID: 3, + Value: 1, + IsMid: false, + }, + 4: { + Index: 4, + ItemID: 4, + Value: 0.5, + IsMid: false, + }, + 5: { + Index: 5, + ItemID: 5, + Value: 0.1, + IsMid: false, + }, + 6: { + Index: 6, + ItemID: 6, + Value: 1, + IsMid: true, + }, + 7: { + Index: 7, + ItemID: 7, + Value: 1, + IsMid: true, + }, + 8: { + Index: 8, + ItemID: 8, + Value: 1, + IsMid: true, + }, + 9: { + Index: 9, + ItemID: 9, + Value: 1, + IsMid: true, + }, + 10: { + Index: 10, + ItemID: 10, + Value: 2, + IsMid: true, + }, + 11: { + Index: 11, + ItemID: 11, + Value: 3, + IsMid: true, + }, + 12: { + Index: 12, + ItemID: 12, + Value: 5, + IsMid: true, + }, + 13: { + Index: 13, + ItemID: 13, + Value: 10, + IsMid: true, + }, + 14: { + Index: 14, + ItemID: 14, + Value: 15, + IsMid: true, + }, + 15: { + Index: 15, + ItemID: 15, + Value: 20, + IsMid: true, + }, + 16: { + Index: 16, + ItemID: 16, + Value: 30, + IsMid: true, + }, + 17: { + Index: 17, + ItemID: 17, + Value: 40, + IsMid: true, + }, + 18: { + Index: 18, + ItemID: 18, + Value: 50, + IsMid: true, + }, + 19: { + Index: 19, + ItemID: 19, + Value: 100, + IsMid: true, + }, + 200: { + Index: 200, + ItemID: 200, + Value: 0, + IsMid: true, + }, + } + CashManiaMapRTPMode = map[int64]*structs.CashManiaMapRTPMode{ 1: { ID: 1, @@ -468,7 +592,7 @@ func init() { CashManiaSymbol = map[int64]*structs.CashManiaSymbol{ 1: { ID: 1, - Name: "100倍", + Name: "10倍", IsWild: false, Group: []int64{1}, PayRate: []int64{0, 0, 100}, diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go index d60924c..7621a16 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_dragon.go @@ -174,6 +174,7 @@ func init() { 0: { Index: 0, BetLine: 5, + BaseBet: 1, }, } diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go index e8930b9..5a0e884 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_mouse.go @@ -135,6 +135,7 @@ func init() { 0: { Index: 0, BetLine: 5, + BaseBet: 1, }, } diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go index a50d12f..bb79efd 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_ox.go @@ -10,79 +10,79 @@ func init() { FortuneOxBetBetChangeList = map[int64]*structs.FortuneOxBetBetChangeList{ 0: { Index: 0, - BetChangeList: 0.3, + BetChangeList: 300000, BetSizeIndex: 0, BetLevelIndex: 0, }, 1: { Index: 1, - BetChangeList: 0.6, + BetChangeList: 600000, BetSizeIndex: 0, BetLevelIndex: 1, }, 2: { Index: 2, - BetChangeList: 0.9, + BetChangeList: 900000, BetSizeIndex: 0, BetLevelIndex: 2, }, 3: { Index: 3, - BetChangeList: 1, + BetChangeList: 1000000, BetSizeIndex: 1, BetLevelIndex: 0, }, 4: { Index: 4, - BetChangeList: 1.5, + BetChangeList: 1500000, BetSizeIndex: 0, BetLevelIndex: 4, }, 5: { Index: 5, - BetChangeList: 3, + BetChangeList: 3000000, BetSizeIndex: 0, BetLevelIndex: 9, }, 6: { Index: 6, - BetChangeList: 5, + BetChangeList: 5000000, BetSizeIndex: 1, BetLevelIndex: 4, }, 7: { Index: 7, - BetChangeList: 9, + BetChangeList: 9000000, BetSizeIndex: 3, BetLevelIndex: 0, }, 8: { Index: 8, - BetChangeList: 10, + BetChangeList: 10000000, BetSizeIndex: 1, BetLevelIndex: 9, }, 9: { Index: 9, - BetChangeList: 15, + BetChangeList: 15000000, BetSizeIndex: 2, BetLevelIndex: 4, }, 10: { Index: 10, - BetChangeList: 30, + BetChangeList: 30000000, BetSizeIndex: 2, BetLevelIndex: 9, }, 11: { Index: 11, - BetChangeList: 45, + BetChangeList: 45000000, BetSizeIndex: 3, BetLevelIndex: 4, }, 12: { Index: 12, - BetChangeList: 90, + BetChangeList: 90000000, BetSizeIndex: 3, BetLevelIndex: 9, }, @@ -135,25 +135,26 @@ func init() { 0: { Index: 0, BetLine: 10, + BaseBet: 1, }, } FortuneOxBetBetSize = map[int64]*structs.FortuneOxBetBetSize{ 0: { Index: 0, - BetSize: 300, + BetSize: 300000000, }, 1: { Index: 1, - BetSize: 1000, + BetSize: 1000000000, }, 2: { Index: 2, - BetSize: 3000, + BetSize: 3000000000, }, 3: { Index: 3, - BetSize: 9000, + BetSize: 9000000000, }, } diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go index 1a01d23..b71c394 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_rabbit.go @@ -135,6 +135,7 @@ func init() { 0: { Index: 0, BetLine: 10, + BaseBet: 1, }, } diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go index 2b54df8..3b78a64 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/fortune_tiger.go @@ -135,6 +135,7 @@ func init() { 0: { Index: 0, BetLine: 5, + BaseBet: 1, }, } diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/gateof_olympus.go b/gamesrv/slotspkg/internal/exported/excel2go/base/gateof_olympus.go deleted file mode 100644 index dc15bf8..0000000 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/gateof_olympus.go +++ /dev/null @@ -1,1098 +0,0 @@ -//go:build !debug -// +build !debug - -// -package base - -import "mongo.games.com/game/gamesrv/slotspkg/internal/exported/excel2go/structs" - -func init() { - GateofOlympusBetBetChangeList = map[int64]*structs.GateofOlympusBetBetChangeList{ - 0: { - Index: 0, - BetChangeList: 0.6, - BetSizeIndex: 0, - BetLevelIndex: 0, - }, - 1: { - Index: 1, - BetChangeList: 1.2, - BetSizeIndex: 0, - BetLevelIndex: 1, - }, - 2: { - Index: 2, - BetChangeList: 1.8, - BetSizeIndex: 0, - BetLevelIndex: 2, - }, - 3: { - Index: 3, - BetChangeList: 2, - BetSizeIndex: 1, - BetLevelIndex: 0, - }, - 4: { - Index: 4, - BetChangeList: 3, - BetSizeIndex: 0, - BetLevelIndex: 4, - }, - 5: { - Index: 5, - BetChangeList: 6, - BetSizeIndex: 0, - BetLevelIndex: 9, - }, - 6: { - Index: 6, - BetChangeList: 10, - BetSizeIndex: 1, - BetLevelIndex: 4, - }, - 7: { - Index: 7, - BetChangeList: 18, - BetSizeIndex: 3, - BetLevelIndex: 0, - }, - 8: { - Index: 8, - BetChangeList: 20, - BetSizeIndex: 1, - BetLevelIndex: 9, - }, - 9: { - Index: 9, - BetChangeList: 30, - BetSizeIndex: 2, - BetLevelIndex: 4, - }, - 10: { - Index: 10, - BetChangeList: 60, - BetSizeIndex: 2, - BetLevelIndex: 9, - }, - 11: { - Index: 11, - BetChangeList: 90, - BetSizeIndex: 3, - BetLevelIndex: 4, - }, - 12: { - Index: 12, - BetChangeList: 180, - BetSizeIndex: 3, - BetLevelIndex: 9, - }, - } - - GateofOlympusBetBetLevel = map[int64]*structs.GateofOlympusBetBetLevel{ - 0: { - Index: 0, - BetLevel: 1, - }, - 1: { - Index: 1, - BetLevel: 2, - }, - 2: { - Index: 2, - BetLevel: 3, - }, - 3: { - Index: 3, - BetLevel: 4, - }, - 4: { - Index: 4, - BetLevel: 5, - }, - 5: { - Index: 5, - BetLevel: 6, - }, - 6: { - Index: 6, - BetLevel: 7, - }, - 7: { - Index: 7, - BetLevel: 8, - }, - 8: { - Index: 8, - BetLevel: 9, - }, - 9: { - Index: 9, - BetLevel: 10, - }, - } - - GateofOlympusBetBetLine = map[int64]*structs.GateofOlympusBetBetLine{ - 0: { - Index: 0, - BetLine: 20, - }, - } - - GateofOlympusBetBetSize = map[int64]*structs.GateofOlympusBetBetSize{ - 0: { - Index: 0, - BetSize: 300, - }, - 1: { - Index: 1, - BetSize: 1000, - }, - 2: { - Index: 2, - BetSize: 3000, - }, - 3: { - Index: 3, - BetSize: 9000, - }, - } - - GateofOlympusBetFirstBet = map[int64]*structs.GateofOlympusBetFirstBet{ - 1: { - Index: 1, - BetSizeIndex: 1, - BetLevelIndex: 1, - }, - } - - GateofOlympusFormation = []*structs.GateofOlympusFormation{ - { - SpinType: 1, - NodeType: "BaseSpin", - ID: 1, - SeqID: 1, - Reel: "BaseSpin", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "BaseSpin1", - ID: 1, - SeqID: 1, - Reel: "BaseSpin1", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "BaseSpin2", - ID: 1, - SeqID: 1, - Reel: "BaseSpin2", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "BaseSpin3", - ID: 1, - SeqID: 1, - Reel: "BaseSpin3", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "BaseSpin7", - ID: 1, - SeqID: 1, - Reel: "BaseSpin7", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "BaseSpin8", - ID: 1, - SeqID: 1, - Reel: "BaseSpin8", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 2, - NodeType: "FreeSpin", - ID: 2, - SeqID: 1, - Reel: "FreeSpin", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 3, - OtherInitMethod: 3, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 2, - NodeType: "FreeSpin4", - ID: 2, - SeqID: 1, - Reel: "FreeSpin4", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 3, - OtherInitMethod: 3, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 2, - NodeType: "FreeSpin5", - ID: 2, - SeqID: 1, - Reel: "FreeSpin5", - Matrix: "SameForm5X6TypeA", - Symbol: "Default", - FirstInitMethod: 3, - OtherInitMethod: 3, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "MoreScatterBaseSpin", - ID: 1, - SeqID: 1, - Reel: "BaseSpin", - Matrix: "SameForm5X6TypeB", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "MoreScatterBaseSpin1", - ID: 1, - SeqID: 1, - Reel: "BaseSpin1", - Matrix: "SameForm5X6TypeB", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "MoreScatterBaseSpin2", - ID: 1, - SeqID: 1, - Reel: "BaseSpin2", - Matrix: "SameForm5X6TypeB", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "MoreScatterBaseSpin3", - ID: 1, - SeqID: 1, - Reel: "BaseSpin3", - Matrix: "SameForm5X6TypeB", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "MoreScatterBaseSpin7", - ID: 1, - SeqID: 1, - Reel: "BaseSpin7", - Matrix: "SameForm5X6TypeB", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - { - SpinType: 1, - NodeType: "MoreScatterBaseSpin8", - ID: 1, - SeqID: 1, - Reel: "BaseSpin8", - Matrix: "SameForm5X6TypeB", - Symbol: "Default", - FirstInitMethod: 2, - OtherInitMethod: 4, - FirstInitSymbols: []int64{}, - OtherInitSymbols: []int64{}, - }, - } - - GateofOlympusMapRTPMode = map[int64]*structs.GateofOlympusMapRTPMode{ - 1: { - ID: 1, - TypeWeight: map[int64]*structs.GateofOlympusMapRTPModeTypeWeight{ - 1: { - ID: 1, - Weight: 1, - }, - }, - Desc: "96", - Rtp: 0.96, - }, - 2: { - ID: 2, - TypeWeight: map[int64]*structs.GateofOlympusMapRTPModeTypeWeight{ - 1: { - ID: 1, - Weight: 1, - }, - }, - Desc: "80", - Rtp: 0.8, - }, - 3: { - ID: 3, - TypeWeight: map[int64]*structs.GateofOlympusMapRTPModeTypeWeight{ - 1: { - ID: 1, - Weight: 1, - }, - }, - Desc: "120", - Rtp: 1.2, - }, - } - - GateofOlympusMultiplier = []*structs.GateofOlympusMultiplier{ - { - Multiple: 2, - ID: 13, - Weights: []int64{3150, 3150, 3150}, - }, - { - Multiple: 3, - ID: 14, - Weights: []int64{2250, 2250, 2000}, - }, - { - Multiple: 4, - ID: 15, - Weights: []int64{1500, 1500, 1500}, - }, - { - Multiple: 5, - ID: 16, - Weights: []int64{1100, 1100, 1000}, - }, - { - Multiple: 6, - ID: 17, - Weights: []int64{300, 300, 600}, - }, - { - Multiple: 8, - ID: 18, - Weights: []int64{150, 150, 400}, - }, - { - Multiple: 10, - ID: 19, - Weights: []int64{80, 80, 200}, - }, - { - Multiple: 12, - ID: 20, - Weights: []int64{30, 30, 100}, - }, - { - Multiple: 15, - ID: 21, - Weights: []int64{10, 10, 50}, - }, - { - Multiple: 20, - ID: 22, - Weights: []int64{20, 20, 50}, - }, - { - Multiple: 25, - ID: 23, - Weights: []int64{10, 10, 50}, - }, - { - Multiple: 50, - ID: 24, - Weights: []int64{1, 1, 25}, - }, - { - Multiple: 100, - ID: 25, - Weights: []int64{1, 1, 25}, - }, - { - Multiple: 250, - ID: 26, - Weights: []int64{0, 0, 10}, - }, - { - Multiple: 500, - ID: 27, - Weights: []int64{0, 0, 10}, - }, - } - - GateofOlympusMultiplierKeyID = map[int64]*structs.GateofOlympusMultiplierKeyID{ - 13: { - Multiple: 2, - ID: 13, - Weights: []int64{3150, 3150, 3150}, - }, - 14: { - Multiple: 3, - ID: 14, - Weights: []int64{2250, 2250, 2000}, - }, - 15: { - Multiple: 4, - ID: 15, - Weights: []int64{1500, 1500, 1500}, - }, - 16: { - Multiple: 5, - ID: 16, - Weights: []int64{1100, 1100, 1000}, - }, - 17: { - Multiple: 6, - ID: 17, - Weights: []int64{300, 300, 600}, - }, - 18: { - Multiple: 8, - ID: 18, - Weights: []int64{150, 150, 400}, - }, - 19: { - Multiple: 10, - ID: 19, - Weights: []int64{80, 80, 200}, - }, - 20: { - Multiple: 12, - ID: 20, - Weights: []int64{30, 30, 100}, - }, - 21: { - Multiple: 15, - ID: 21, - Weights: []int64{10, 10, 50}, - }, - 22: { - Multiple: 20, - ID: 22, - Weights: []int64{20, 20, 50}, - }, - 23: { - Multiple: 25, - ID: 23, - Weights: []int64{10, 10, 50}, - }, - 24: { - Multiple: 50, - ID: 24, - Weights: []int64{1, 1, 25}, - }, - 25: { - Multiple: 100, - ID: 25, - Weights: []int64{1, 1, 25}, - }, - 26: { - Multiple: 250, - ID: 26, - Weights: []int64{0, 0, 10}, - }, - 27: { - Multiple: 500, - ID: 27, - Weights: []int64{0, 0, 10}, - }, - } - - GateofOlympusReelBaseSpinRange = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelBaseSpinReel = [][]int64{ - {1, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, - {1, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 1, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, - {1, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, - {1, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, - {1, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, - {1, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, - } - - GateofOlympusReelBaseSpinWeight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelBaseSpin1Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelBaseSpin1Reel = [][]int64{ - {1, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, - {1, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 1, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, - {1, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, - {1, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, - {1, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, - {1, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, - } - - GateofOlympusReelBaseSpin1Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelBaseSpin2Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelBaseSpin2Reel = [][]int64{ - {1, 6, 6, 11, 8, 10, 11, 9, 7, 6, 6, 11, 8, 8, 9, 10, 7, 11, 11, 8, 6, 10, 9, 10, 8, 8, 3, 11, 11, 4, 4, 9, 11, 8, 7, 11, 11, 9, 10, 5, 5, 8, 10, 11, 6, 11, 10, 7, 11, 9, 10, 10, 4, 4, 3, 3, 7, 6, 11, 5, 5, 7, 10, 9}, - {1, 9, 9, 6, 6, 8, 8, 10, 4, 11, 9, 9, 10, 10, 11, 4, 10, 8, 9, 9, 7, 11, 8, 8, 10, 10, 5, 5, 7, 9, 10, 3, 6, 7, 8, 6, 11, 9, 7, 4, 4, 1, 3, 11, 11, 9, 5, 5, 10, 6, 7, 7, 10, 9, 6, 6, 11, 10, 8, 8, 11, 7, 11}, - {1, 5, 11, 5, 8, 8, 11, 7, 5, 10, 9, 7, 10, 6, 7, 1, 10, 3, 5, 10, 5, 7, 7, 8, 7, 9, 11, 11, 4, 4, 7, 10, 9, 11, 11, 10, 4, 4, 9, 3, 7, 10, 7, 4, 11, 9, 9, 10, 7, 8, 8, 11, 7, 8, 9, 8, 10, 7, 11, 11, 6, 6, 8, 7}, - {1, 4, 4, 11, 10, 5, 5, 11, 11, 9, 9, 6, 11, 10, 9, 4, 4, 9, 9, 4, 11, 10, 5, 8, 8, 8, 10, 10, 11, 11, 5, 5, 3, 11, 9, 9, 6, 8, 6, 10, 4, 4, 7, 9, 7, 11, 11, 6, 7, 6, 10, 9, 8, 7, 10, 3, 11, 3, 11, 3, 7, 7, 10, 10}, - {1, 9, 10, 10, 11, 7, 4, 6, 8, 8, 1, 5, 9, 11, 6, 6, 8, 8, 10, 10, 11, 6, 11, 6, 11, 10, 7, 4, 4, 11, 9, 7, 6, 8, 9, 4, 5, 5, 7, 9, 7, 8, 8, 9, 10, 7, 7, 11, 11, 9, 3, 3, 11, 11, 8, 10, 10, 9, 9, 5, 5, 10, 11, 7}, - {1, 6, 7, 6, 4, 11, 9, 9, 10, 8, 3, 7, 11, 6, 9, 9, 8, 7, 10, 8, 5, 6, 11, 10, 11, 9, 9, 8, 8, 7, 10, 5, 5, 7, 7, 11, 9, 10, 11, 3, 7, 6, 10, 6, 11, 11, 9, 9, 9, 10, 8, 10, 4, 11, 4, 3, 3, 9, 9, 5, 5, 9, 8}, - } - - GateofOlympusReelBaseSpin2Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelBaseSpin3Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelBaseSpin3Reel = [][]int64{ - {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, - {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, - {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, - {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, - {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, - {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, - } - - GateofOlympusReelBaseSpin3Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelBaseSpin7Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelBaseSpin7Reel = [][]int64{ - {11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6}, - {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, - {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, - {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, - {1, 9, 3, 8, 5, 1, 10, 7, 6, 11, 1, 3, 8, 5, 4, 1, 7, 6, 11, 9, 1, 8, 5, 4, 10, 1, 6, 11, 9, 3, 1, 5, 4, 10, 7, 1, 11, 9, 3, 8, 1, 4, 10, 7, 6}, - {11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6, 11, 9, 3, 8, 5, 4, 10, 7, 6}, - } - - GateofOlympusReelBaseSpin7Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelBaseSpin8Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelBaseSpin8Reel = [][]int64{ - {1, 6, 6, 11, 8, 10, 11, 9, 7, 6, 6, 11, 8, 8, 9, 10, 7, 11, 11, 8, 6, 10, 9, 4, 11, 11, 4, 4, 9, 11, 8, 7, 11, 1, 9, 10, 5, 5, 8, 10, 11, 6, 11, 10, 7, 11, 9, 10, 10, 4, 4, 3, 3, 7, 6, 11, 5, 5, 7, 10, 9}, - {1, 9, 9, 6, 6, 8, 8, 10, 4, 11, 9, 9, 10, 10, 11, 4, 10, 8, 9, 9, 7, 11, 8, 7, 5, 5, 7, 9, 10, 3, 6, 7, 8, 6, 11, 9, 7, 4, 4, 1, 3, 11, 11, 9, 5, 5, 10, 6, 7, 7, 10, 9, 6, 6, 11, 10, 8, 8, 11, 7, 11}, - {1, 5, 11, 5, 8, 8, 11, 7, 5, 10, 9, 7, 10, 6, 7, 1, 10, 3, 5, 10, 5, 7, 11, 11, 11, 4, 4, 7, 10, 9, 11, 11, 10, 4, 4, 9, 3, 7, 10, 7, 4, 11, 9, 9, 10, 7, 8, 8, 11, 7, 8, 9, 8, 10, 7, 11, 11, 6, 6, 8, 7}, - {1, 4, 4, 11, 10, 5, 5, 11, 11, 9, 9, 6, 11, 10, 9, 4, 4, 9, 9, 4, 8, 8, 10, 10, 11, 11, 5, 5, 3, 11, 9, 9, 1, 8, 6, 10, 4, 4, 7, 9, 7, 11, 11, 6, 7, 6, 10, 9, 8, 7, 10, 3, 11, 3, 11, 3, 7, 7, 10, 10}, - {1, 9, 10, 10, 11, 7, 4, 6, 8, 8, 1, 5, 9, 11, 6, 6, 8, 8, 10, 10, 11, 10, 7, 4, 4, 11, 9, 7, 6, 8, 9, 4, 5, 5, 7, 9, 7, 8, 8, 9, 10, 7, 7, 11, 11, 9, 3, 3, 11, 11, 8, 10, 10, 9, 9, 5, 5, 10, 11, 7}, - {1, 6, 7, 6, 4, 11, 9, 9, 10, 8, 3, 7, 11, 6, 9, 9, 8, 7, 10, 8, 5, 6, 9, 9, 8, 8, 7, 10, 5, 5, 7, 7, 11, 9, 10, 11, 3, 7, 4, 10, 6, 11, 11, 9, 9, 9, 10, 8, 10, 4, 11, 4, 3, 3, 9, 9, 5, 5, 9, 8}, - } - - GateofOlympusReelBaseSpin8Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelChoose = []*structs.GateofOlympusReelChoose{ - { - ID: 1, - IsFreeSpin: false, - NodeType: "BaseSpin1", - Weights: []int64{40, 162, 0}, - }, - { - ID: 2, - IsFreeSpin: false, - NodeType: "BaseSpin2", - Weights: []int64{66, 0, 0}, - }, - { - ID: 3, - IsFreeSpin: false, - NodeType: "BaseSpin3", - Weights: []int64{20, 68, 0}, - }, - { - ID: 4, - IsFreeSpin: false, - NodeType: "BaseSpin7", - Weights: []int64{0, 0, 1}, - }, - { - ID: 5, - IsFreeSpin: false, - NodeType: "BaseSpin8", - Weights: []int64{1, 180, 0}, - }, - { - ID: 6, - IsFreeSpin: true, - NodeType: "FreeSpin4", - Weights: []int64{1, 1, 1}, - }, - { - ID: 7, - IsFreeSpin: true, - NodeType: "FreeSpin5", - Weights: []int64{2, 2, 2}, - }, - } - - GateofOlympusReelFreeSpinRange = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelFreeSpinReel = [][]int64{ - {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 1, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, - {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 1, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, - {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 1, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, - {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 1, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, - {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 1, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, - {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 1, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, - } - - GateofOlympusReelFreeSpinWeight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelFreeSpin4Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelFreeSpin4Reel = [][]int64{ - {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 1, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, - {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 1, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, - {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 1, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, - {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 1, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, - {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 1, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, - {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 1, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, - } - - GateofOlympusReelFreeSpin4Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusReelFreeSpin5Range = [][]int64{ - {5, 5, 5, 5, 5, 5}, - } - - GateofOlympusReelFreeSpin5Reel = [][]int64{ - {12, 6, 6, 11, 11, 10, 10, 9, 9, 6, 6, 8, 8, 8, 10, 10, 10, 11, 11, 6, 6, 10, 10, 10, 8, 8, 11, 11, 4, 4, 9, 9, 8, 8, 11, 11, 10, 10, 5, 5, 8, 8, 11, 11, 11, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 11, 11, 11, 5, 5, 7, 7, 9}, - {12, 9, 9, 6, 6, 8, 8, 10, 11, 11, 9, 9, 10, 10, 10, 4, 4, 9, 9, 9, 11, 11, 8, 8, 10, 10, 5, 5, 8, 8, 3, 3, 6, 6, 10, 10, 10, 9, 9, 4, 4, 12, 3, 3, 11, 11, 5, 5, 10, 10, 7, 7, 9, 9, 6, 6, 10, 10, 8, 8, 11, 11, 11}, - {12, 5, 5, 5, 8, 8, 11, 11, 5, 5, 9, 9, 6, 6, 7, 7, 3, 3, 5, 5, 5, 7, 7, 8, 8, 11, 11, 4, 4, 7, 7, 9, 9, 10, 10, 4, 4, 3, 3, 7, 7, 7, 4, 4, 9, 9, 10, 10, 8, 8, 11, 11, 8, 8, 8, 10, 10, 11, 11, 6, 6, 7, 7}, - {12, 4, 4, 11, 11, 5, 5, 7, 7, 9, 9, 11, 11, 10, 10, 4, 4, 9, 9, 11, 11, 5, 5, 8, 8, 10, 10, 11, 11, 5, 5, 3, 3, 9, 9, 6, 6, 10, 10, 4, 4, 7, 7, 7, 11, 11, 6, 6, 6, 9, 9, 10, 10, 10, 11, 11, 3, 3, 3, 7, 7, 10, 10}, - {12, 9, 10, 10, 11, 11, 6, 6, 8, 8, 5, 5, 11, 11, 6, 6, 8, 8, 10, 10, 11, 11, 6, 6, 10, 10, 4, 4, 9, 9, 7, 7, 4, 4, 4, 5, 5, 9, 9, 8, 8, 8, 11, 11, 7, 7, 9, 9, 9, 3, 3, 11, 11, 11, 10, 10, 9, 9, 5, 5, 7, 7, 7}, - {12, 6, 6, 6, 4, 4, 9, 9, 8, 8, 7, 7, 11, 11, 9, 9, 7, 7, 8, 8, 5, 5, 11, 11, 11, 9, 9, 8, 8, 10, 10, 5, 5, 7, 7, 11, 11, 10, 10, 3, 3, 6, 6, 6, 11, 11, 9, 9, 9, 10, 10, 10, 4, 4, 4, 3, 3, 9, 9, 5, 5, 8, 8}, - } - - GateofOlympusReelFreeSpin5Weight = [][]float64{ - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - } - - GateofOlympusScatter = map[int64]*structs.GateofOlympusScatter{ - 1: { - ScatterCount: 1, - FreeSpinBouts: 0, - FreeSpinExtraBouts: 0, - BasePayrate: 0, - FreePayrate: 0, - }, - 2: { - ScatterCount: 2, - FreeSpinBouts: 0, - FreeSpinExtraBouts: 0, - BasePayrate: 0, - FreePayrate: 0, - }, - 3: { - ScatterCount: 3, - FreeSpinBouts: 0, - FreeSpinExtraBouts: 5, - BasePayrate: 0, - FreePayrate: 0, - }, - 4: { - ScatterCount: 4, - FreeSpinBouts: 15, - FreeSpinExtraBouts: 5, - BasePayrate: 3, - FreePayrate: 3, - }, - 5: { - ScatterCount: 5, - FreeSpinBouts: 15, - FreeSpinExtraBouts: 5, - BasePayrate: 5, - FreePayrate: 5, - }, - 6: { - ScatterCount: 6, - FreeSpinBouts: 15, - FreeSpinExtraBouts: 5, - BasePayrate: 100, - FreePayrate: 100, - }, - } - - GateofOlympusSymbol = map[int64]*structs.GateofOlympusSymbol{ - 1: { - ID: 1, - Name: "Scatter", - IsWild: false, - Group: []int64{1}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 2: { - ID: 2, - Name: "无", - IsWild: false, - Group: []int64{2}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 3: { - ID: 3, - Name: "皇冠", - IsWild: false, - Group: []int64{3}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 200, 200, 500, 500, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, - ClientOrder: 1, - ClientDsc: "", - }, - 4: { - ID: 4, - Name: "沙漏", - IsWild: false, - Group: []int64{4}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 50, 50, 200, 200, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}, - ClientOrder: 2, - ClientDsc: "", - }, - 5: { - ID: 5, - Name: "戒指", - IsWild: false, - Group: []int64{5}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 40, 40, 100, 100, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300}, - ClientOrder: 3, - ClientDsc: "", - }, - 6: { - ID: 6, - Name: "酒杯", - IsWild: false, - Group: []int64{6}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 30, 30, 40, 40, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240}, - ClientOrder: 4, - ClientDsc: "", - }, - 7: { - ID: 7, - Name: "红宝石", - IsWild: false, - Group: []int64{7}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 20, 20, 30, 30, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200}, - ClientOrder: 5, - ClientDsc: "", - }, - 8: { - ID: 8, - Name: "紫宝石", - IsWild: false, - Group: []int64{8}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 16, 16, 24, 24, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160}, - ClientOrder: 6, - ClientDsc: "", - }, - 9: { - ID: 9, - Name: "黄宝石", - IsWild: false, - Group: []int64{9}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 10, 10, 20, 20, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, - ClientOrder: 7, - ClientDsc: "", - }, - 10: { - ID: 10, - Name: "绿宝石", - IsWild: false, - Group: []int64{10}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 8, 8, 18, 18, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80}, - ClientOrder: 8, - ClientDsc: "", - }, - 11: { - ID: 11, - Name: "蓝宝石", - IsWild: false, - Group: []int64{11}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 5, 5, 15, 15, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - ClientOrder: 9, - ClientDsc: "", - }, - 12: { - ID: 12, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 13: { - ID: 13, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 14: { - ID: 14, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 15: { - ID: 15, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 16: { - ID: 16, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 17: { - ID: 17, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 18: { - ID: 18, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 19: { - ID: 19, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 20: { - ID: 20, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 21: { - ID: 21, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 22: { - ID: 22, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 23: { - ID: 23, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 24: { - ID: 24, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 25: { - ID: 25, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 26: { - ID: 26, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - 27: { - ID: 27, - Name: "倍乘", - IsWild: false, - Group: []int64{12}, - PayRate: []int64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - ClientOrder: 0, - ClientDsc: "", - }, - } - - GateofOlympusSymbolBetRatio = []*structs.GateofOlympusSymbolBetRatio{ - { - BetRatio: 1, - }, - } - -} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/base/var.go b/gamesrv/slotspkg/internal/exported/excel2go/base/var.go index b4d8915..a846c37 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/base/var.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/base/var.go @@ -10,6 +10,7 @@ var ( CashManiaBetBetSize = map[int64]*structs.CashManiaBetBetSize{} CashManiaBetFirstBet = map[int64]*structs.CashManiaBetFirstBet{} CashManiaFormation = []*structs.CashManiaFormation{} + CashManiaItemInfo = map[int64]*structs.CashManiaItemInfo{} CashManiaMapRTPMode = map[int64]*structs.CashManiaMapRTPMode{} CashManiaMidItemInfo = map[int64]*structs.CashManiaMidItemInfo{} CashManiaOthers = []*structs.CashManiaOthers{} @@ -119,46 +120,6 @@ var ( FortuneTigerSuperStackWeight = []*structs.FortuneTigerSuperStackWeight{} FortuneTigerSymbolBetRatio = []*structs.FortuneTigerSymbolBetRatio{} FortuneTigerSymbol = map[int64]*structs.FortuneTigerSymbol{} - GateofOlympusBetBetChangeList = map[int64]*structs.GateofOlympusBetBetChangeList{} - GateofOlympusBetBetLevel = map[int64]*structs.GateofOlympusBetBetLevel{} - GateofOlympusBetBetLine = map[int64]*structs.GateofOlympusBetBetLine{} - GateofOlympusBetBetSize = map[int64]*structs.GateofOlympusBetBetSize{} - GateofOlympusBetFirstBet = map[int64]*structs.GateofOlympusBetFirstBet{} - GateofOlympusFormation = []*structs.GateofOlympusFormation{} - GateofOlympusMapRTPMode = map[int64]*structs.GateofOlympusMapRTPMode{} - GateofOlympusMultiplier = []*structs.GateofOlympusMultiplier{} - GateofOlympusMultiplierKeyID = map[int64]*structs.GateofOlympusMultiplierKeyID{} - GateofOlympusReelBaseSpin1Range = [][]int64{} - GateofOlympusReelBaseSpin1Reel = [][]int64{} - GateofOlympusReelBaseSpin1Weight = [][]float64{} - GateofOlympusReelBaseSpin2Range = [][]int64{} - GateofOlympusReelBaseSpin2Reel = [][]int64{} - GateofOlympusReelBaseSpin2Weight = [][]float64{} - GateofOlympusReelBaseSpin3Range = [][]int64{} - GateofOlympusReelBaseSpin3Reel = [][]int64{} - GateofOlympusReelBaseSpin3Weight = [][]float64{} - GateofOlympusReelBaseSpin7Range = [][]int64{} - GateofOlympusReelBaseSpin7Reel = [][]int64{} - GateofOlympusReelBaseSpin7Weight = [][]float64{} - GateofOlympusReelBaseSpin8Range = [][]int64{} - GateofOlympusReelBaseSpin8Reel = [][]int64{} - GateofOlympusReelBaseSpin8Weight = [][]float64{} - GateofOlympusReelBaseSpinRange = [][]int64{} - GateofOlympusReelBaseSpinReel = [][]int64{} - GateofOlympusReelBaseSpinWeight = [][]float64{} - GateofOlympusReelChoose = []*structs.GateofOlympusReelChoose{} - GateofOlympusReelFreeSpin4Range = [][]int64{} - GateofOlympusReelFreeSpin4Reel = [][]int64{} - GateofOlympusReelFreeSpin4Weight = [][]float64{} - GateofOlympusReelFreeSpin5Range = [][]int64{} - GateofOlympusReelFreeSpin5Reel = [][]int64{} - GateofOlympusReelFreeSpin5Weight = [][]float64{} - GateofOlympusReelFreeSpinRange = [][]int64{} - GateofOlympusReelFreeSpinReel = [][]int64{} - GateofOlympusReelFreeSpinWeight = [][]float64{} - GateofOlympusScatter = map[int64]*structs.GateofOlympusScatter{} - GateofOlympusSymbolBetRatio = []*structs.GateofOlympusSymbolBetRatio{} - GateofOlympusSymbol = map[int64]*structs.GateofOlympusSymbol{} MatrixFeaturesForm15X1TypeA = []*structs.MatrixFeaturesForm15X1TypeA{} MatrixFeaturesForm19X1TypeA = []*structs.MatrixFeaturesForm19X1TypeA{} MatrixFeaturesForm20X1TypeA = []*structs.MatrixFeaturesForm20X1TypeA{} diff --git a/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go b/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go index 724d11b..4862c11 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/storage/storage.go @@ -69,6 +69,7 @@ func StoragesLoading(data map[string]string) { Load(data, "Base.CashMania/Bet.BetSize", &base.CashManiaBetBetSize) Load(data, "Base.CashMania/Bet.FirstBet", &base.CashManiaBetFirstBet) Load(data, "Base.CashMania/Formation.Default", &base.CashManiaFormation) + Load(data, "Base.CashMania/ItemInfo.Default", &base.CashManiaItemInfo) Load(data, "Base.CashMania/Map.RTPMode", &base.CashManiaMapRTPMode) Load(data, "Base.CashMania/MidItemInfo.Default", &base.CashManiaMidItemInfo) Load(data, "Base.CashMania/Others.Default", &base.CashManiaOthers) @@ -178,46 +179,6 @@ func StoragesLoading(data map[string]string) { Load(data, "Base.FortuneTiger/SuperStack.Weight", &base.FortuneTigerSuperStackWeight) Load(data, "Base.FortuneTiger/Symbol.BetRatio", &base.FortuneTigerSymbolBetRatio) Load(data, "Base.FortuneTiger/Symbol.Default", &base.FortuneTigerSymbol) - Load(data, "Base.GateofOlympus/Bet.BetChangeList", &base.GateofOlympusBetBetChangeList) - Load(data, "Base.GateofOlympus/Bet.BetLevel", &base.GateofOlympusBetBetLevel) - Load(data, "Base.GateofOlympus/Bet.BetLine", &base.GateofOlympusBetBetLine) - Load(data, "Base.GateofOlympus/Bet.BetSize", &base.GateofOlympusBetBetSize) - Load(data, "Base.GateofOlympus/Bet.FirstBet", &base.GateofOlympusBetFirstBet) - Load(data, "Base.GateofOlympus/Formation.Default", &base.GateofOlympusFormation) - Load(data, "Base.GateofOlympus/Map.RTPMode", &base.GateofOlympusMapRTPMode) - Load(data, "Base.GateofOlympus/Multiplier.Default", &base.GateofOlympusMultiplier) - Load(data, "Base.GateofOlympus/Multiplier.Default/ID", &base.GateofOlympusMultiplierKeyID) - Load(data, "Base.GateofOlympus/ReelBaseSpin1.Range", &base.GateofOlympusReelBaseSpin1Range) - Load(data, "Base.GateofOlympus/ReelBaseSpin1.Reel", &base.GateofOlympusReelBaseSpin1Reel) - Load(data, "Base.GateofOlympus/ReelBaseSpin1.Weight", &base.GateofOlympusReelBaseSpin1Weight) - Load(data, "Base.GateofOlympus/ReelBaseSpin2.Range", &base.GateofOlympusReelBaseSpin2Range) - Load(data, "Base.GateofOlympus/ReelBaseSpin2.Reel", &base.GateofOlympusReelBaseSpin2Reel) - Load(data, "Base.GateofOlympus/ReelBaseSpin2.Weight", &base.GateofOlympusReelBaseSpin2Weight) - Load(data, "Base.GateofOlympus/ReelBaseSpin3.Range", &base.GateofOlympusReelBaseSpin3Range) - Load(data, "Base.GateofOlympus/ReelBaseSpin3.Reel", &base.GateofOlympusReelBaseSpin3Reel) - Load(data, "Base.GateofOlympus/ReelBaseSpin3.Weight", &base.GateofOlympusReelBaseSpin3Weight) - Load(data, "Base.GateofOlympus/ReelBaseSpin7.Range", &base.GateofOlympusReelBaseSpin7Range) - Load(data, "Base.GateofOlympus/ReelBaseSpin7.Reel", &base.GateofOlympusReelBaseSpin7Reel) - Load(data, "Base.GateofOlympus/ReelBaseSpin7.Weight", &base.GateofOlympusReelBaseSpin7Weight) - Load(data, "Base.GateofOlympus/ReelBaseSpin8.Range", &base.GateofOlympusReelBaseSpin8Range) - Load(data, "Base.GateofOlympus/ReelBaseSpin8.Reel", &base.GateofOlympusReelBaseSpin8Reel) - Load(data, "Base.GateofOlympus/ReelBaseSpin8.Weight", &base.GateofOlympusReelBaseSpin8Weight) - Load(data, "Base.GateofOlympus/ReelBaseSpin.Range", &base.GateofOlympusReelBaseSpinRange) - Load(data, "Base.GateofOlympus/ReelBaseSpin.Reel", &base.GateofOlympusReelBaseSpinReel) - Load(data, "Base.GateofOlympus/ReelBaseSpin.Weight", &base.GateofOlympusReelBaseSpinWeight) - Load(data, "Base.GateofOlympus/ReelChoose.Default", &base.GateofOlympusReelChoose) - Load(data, "Base.GateofOlympus/ReelFreeSpin4.Range", &base.GateofOlympusReelFreeSpin4Range) - Load(data, "Base.GateofOlympus/ReelFreeSpin4.Reel", &base.GateofOlympusReelFreeSpin4Reel) - Load(data, "Base.GateofOlympus/ReelFreeSpin4.Weight", &base.GateofOlympusReelFreeSpin4Weight) - Load(data, "Base.GateofOlympus/ReelFreeSpin5.Range", &base.GateofOlympusReelFreeSpin5Range) - Load(data, "Base.GateofOlympus/ReelFreeSpin5.Reel", &base.GateofOlympusReelFreeSpin5Reel) - Load(data, "Base.GateofOlympus/ReelFreeSpin5.Weight", &base.GateofOlympusReelFreeSpin5Weight) - Load(data, "Base.GateofOlympus/ReelFreeSpin.Range", &base.GateofOlympusReelFreeSpinRange) - Load(data, "Base.GateofOlympus/ReelFreeSpin.Reel", &base.GateofOlympusReelFreeSpinReel) - Load(data, "Base.GateofOlympus/ReelFreeSpin.Weight", &base.GateofOlympusReelFreeSpinWeight) - Load(data, "Base.GateofOlympus/Scatter.Default", &base.GateofOlympusScatter) - Load(data, "Base.GateofOlympus/Symbol.BetRatio", &base.GateofOlympusSymbolBetRatio) - Load(data, "Base.GateofOlympus/Symbol.Default", &base.GateofOlympusSymbol) Load(data, "Base.Matrix/FeaturesForm15X1TypeA.Default", &base.MatrixFeaturesForm15X1TypeA) Load(data, "Base.Matrix/FeaturesForm19X1TypeA.Default", &base.MatrixFeaturesForm19X1TypeA) Load(data, "Base.Matrix/FeaturesForm20X1TypeA.Default", &base.MatrixFeaturesForm20X1TypeA) @@ -330,6 +291,7 @@ func StoragesMapping() { Set("Base", "CashMania/Bet", "BetSize", base.CashManiaBetBetSize) Set("Base", "CashMania/Bet", "FirstBet", base.CashManiaBetFirstBet) Set("Base", "CashMania/Formation", "Default", base.CashManiaFormation) + Set("Base", "CashMania/ItemInfo", "Default", base.CashManiaItemInfo) Set("Base", "CashMania/Map", "RTPMode", base.CashManiaMapRTPMode) Set("Base", "CashMania/MidItemInfo", "Default", base.CashManiaMidItemInfo) Set("Base", "CashMania/Others", "Default", base.CashManiaOthers) @@ -439,46 +401,6 @@ func StoragesMapping() { Set("Base", "FortuneTiger/SuperStack", "Weight", base.FortuneTigerSuperStackWeight) Set("Base", "FortuneTiger/Symbol", "BetRatio", base.FortuneTigerSymbolBetRatio) Set("Base", "FortuneTiger/Symbol", "Default", base.FortuneTigerSymbol) - Set("Base", "GateofOlympus/Bet", "BetChangeList", base.GateofOlympusBetBetChangeList) - Set("Base", "GateofOlympus/Bet", "BetLevel", base.GateofOlympusBetBetLevel) - Set("Base", "GateofOlympus/Bet", "BetLine", base.GateofOlympusBetBetLine) - Set("Base", "GateofOlympus/Bet", "BetSize", base.GateofOlympusBetBetSize) - Set("Base", "GateofOlympus/Bet", "FirstBet", base.GateofOlympusBetFirstBet) - Set("Base", "GateofOlympus/Formation", "Default", base.GateofOlympusFormation) - Set("Base", "GateofOlympus/Map", "RTPMode", base.GateofOlympusMapRTPMode) - Set("Base", "GateofOlympus/Multiplier", "Default", base.GateofOlympusMultiplier) - Set("Base", "GateofOlympus/Multiplier", "Default/ID", base.GateofOlympusMultiplierKeyID) - Set("Base", "GateofOlympus/ReelBaseSpin1", "Range", base.GateofOlympusReelBaseSpin1Range) - Set("Base", "GateofOlympus/ReelBaseSpin1", "Reel", base.GateofOlympusReelBaseSpin1Reel) - Set("Base", "GateofOlympus/ReelBaseSpin1", "Weight", base.GateofOlympusReelBaseSpin1Weight) - Set("Base", "GateofOlympus/ReelBaseSpin2", "Range", base.GateofOlympusReelBaseSpin2Range) - Set("Base", "GateofOlympus/ReelBaseSpin2", "Reel", base.GateofOlympusReelBaseSpin2Reel) - Set("Base", "GateofOlympus/ReelBaseSpin2", "Weight", base.GateofOlympusReelBaseSpin2Weight) - Set("Base", "GateofOlympus/ReelBaseSpin3", "Range", base.GateofOlympusReelBaseSpin3Range) - Set("Base", "GateofOlympus/ReelBaseSpin3", "Reel", base.GateofOlympusReelBaseSpin3Reel) - Set("Base", "GateofOlympus/ReelBaseSpin3", "Weight", base.GateofOlympusReelBaseSpin3Weight) - Set("Base", "GateofOlympus/ReelBaseSpin7", "Range", base.GateofOlympusReelBaseSpin7Range) - Set("Base", "GateofOlympus/ReelBaseSpin7", "Reel", base.GateofOlympusReelBaseSpin7Reel) - Set("Base", "GateofOlympus/ReelBaseSpin7", "Weight", base.GateofOlympusReelBaseSpin7Weight) - Set("Base", "GateofOlympus/ReelBaseSpin8", "Range", base.GateofOlympusReelBaseSpin8Range) - Set("Base", "GateofOlympus/ReelBaseSpin8", "Reel", base.GateofOlympusReelBaseSpin8Reel) - Set("Base", "GateofOlympus/ReelBaseSpin8", "Weight", base.GateofOlympusReelBaseSpin8Weight) - Set("Base", "GateofOlympus/ReelBaseSpin", "Range", base.GateofOlympusReelBaseSpinRange) - Set("Base", "GateofOlympus/ReelBaseSpin", "Reel", base.GateofOlympusReelBaseSpinReel) - Set("Base", "GateofOlympus/ReelBaseSpin", "Weight", base.GateofOlympusReelBaseSpinWeight) - Set("Base", "GateofOlympus/ReelChoose", "Default", base.GateofOlympusReelChoose) - Set("Base", "GateofOlympus/ReelFreeSpin4", "Range", base.GateofOlympusReelFreeSpin4Range) - Set("Base", "GateofOlympus/ReelFreeSpin4", "Reel", base.GateofOlympusReelFreeSpin4Reel) - Set("Base", "GateofOlympus/ReelFreeSpin4", "Weight", base.GateofOlympusReelFreeSpin4Weight) - Set("Base", "GateofOlympus/ReelFreeSpin5", "Range", base.GateofOlympusReelFreeSpin5Range) - Set("Base", "GateofOlympus/ReelFreeSpin5", "Reel", base.GateofOlympusReelFreeSpin5Reel) - Set("Base", "GateofOlympus/ReelFreeSpin5", "Weight", base.GateofOlympusReelFreeSpin5Weight) - Set("Base", "GateofOlympus/ReelFreeSpin", "Range", base.GateofOlympusReelFreeSpinRange) - Set("Base", "GateofOlympus/ReelFreeSpin", "Reel", base.GateofOlympusReelFreeSpinReel) - Set("Base", "GateofOlympus/ReelFreeSpin", "Weight", base.GateofOlympusReelFreeSpinWeight) - Set("Base", "GateofOlympus/Scatter", "Default", base.GateofOlympusScatter) - Set("Base", "GateofOlympus/Symbol", "BetRatio", base.GateofOlympusSymbolBetRatio) - Set("Base", "GateofOlympus/Symbol", "Default", base.GateofOlympusSymbol) Set("Base", "Matrix/FeaturesForm15X1TypeA", "Default", base.MatrixFeaturesForm15X1TypeA) Set("Base", "Matrix/FeaturesForm19X1TypeA", "Default", base.MatrixFeaturesForm19X1TypeA) Set("Base", "Matrix/FeaturesForm20X1TypeA", "Default", base.MatrixFeaturesForm20X1TypeA) @@ -618,12 +540,6 @@ func LinksMapping() { Link("FortuneTiger/ReelBaseSpin", "Weight/1", "FortuneTiger/ReelBaseSpin", "Weight") Link("FortuneTiger/ReelBaseSpin", "Weight/2", "FortuneTiger/ReelBaseSpin", "Weight") Link("FortuneTiger/ReelBaseSpin", "Weight/3", "FortuneTiger/ReelBaseSpin", "Weight") - Link("GatesOfOlympus/MatrixSameForm5X6TypeA", "Default", "Matrix/SameForm5X6TypeA", "Default") - Link("GatesOfOlympus/MatrixSameForm5X6TypeB", "Default", "Matrix/SameForm5X6TypeB", "Default") - Link("GatesOfOlympus/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") - Link("GatesOfOlympus/ReelBaseSpin1", "Weight/1", "GatesOfOlympus/ReelBaseSpin1", "Weight") - Link("GatesOfOlympus/ReelBaseSpin1", "Weight/2", "GatesOfOlympus/ReelBaseSpin1", "Weight") - Link("GatesOfOlympus/ReelBaseSpin1", "Weight/3", "GatesOfOlympus/ReelBaseSpin1", "Weight") Link("Test/MatrixLine1Form3X3TypeA", "Default", "Matrix/Line1Form3X3TypeA", "Default") Link("Test/PrizeModel", "Default", "PrizeModel/PrizeModelTypeB", "Default") Link("Test/ReelBaseSpin", "Weight/1", "Test/ReelBaseSpin", "Weight") diff --git a/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go b/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go index 11ce095..a2d3e57 100644 --- a/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go +++ b/gamesrv/slotspkg/internal/exported/excel2go/structs/structs.go @@ -44,75 +44,83 @@ func NewBigRat(s string) *big.Rat { type ( // BetChangeList comment BetChangeList struct { - Index int64 + Index int64 BetChangeList float64 - BetSizeIndex int64 + BetSizeIndex int64 BetLevelIndex int64 } // BetLevel comment BetLevel struct { - Index int64 + Index int64 BetLevel int64 } // BetLine comment BetLine struct { - Index int64 + Index int64 BetLine int64 + BaseBet int64 } // BetSize comment BetSize struct { - Index int64 + Index int64 BetSize int64 } + // CashManiaItemInfo comment + CashManiaItemInfo struct { + Index int64 + ItemID int64 + Value float64 + IsMid bool + } // CashManiaMidItemInfo comment CashManiaMidItemInfo struct { - Index int64 - ItemID int64 - Multi int64 + Index int64 + ItemID int64 + Multi int64 FreeSpinCount int64 } // CashManiaOthers comment CashManiaOthers struct { - BaseWinPro float64 - FreeWinPro float64 - MaxWin int64 - WinNudgePro float64 - WinRespinPro float64 - NoWinNudgePro float64 + BaseWinPro float64 + FreeWinPro float64 + MaxWin int64 + WinNudgePro float64 + WinRespinPro float64 + NoWinNudgePro float64 NoWinRespinPro float64 } // CashManiaRandomItemWeight comment CashManiaRandomItemWeight struct { - ID int64 - ItemID int64 + ID int64 + ItemID int64 BaseWeight float64 FreeWeight float64 } // FirstBet comment FirstBet struct { - Index int64 - BetSizeIndex int64 + Index int64 + BetSizeIndex int64 BetLevelIndex int64 } // Formation comment Formation struct { - SpinType int64 - NodeType string - ID int64 - SeqID int64 - Reel string - Matrix string - Symbol string - FirstInitMethod int64 - OtherInitMethod int64 + SpinType int64 + NodeType string + ID int64 + SeqID int64 + Reel string + Matrix string + Symbol string + FirstInitMethod int64 + OtherInitMethod int64 FirstInitSymbols []int64 OtherInitSymbols []int64 } // FortuneDragonBaseMultiplier comment FortuneDragonBaseMultiplier struct { - WinRateMin float64 - WinRateMax float64 - ItemIds []int64 + WinRateMin float64 + WinRateMax float64 + ItemIds []int64 MultiplierWeights []int64 } // FortuneDragonFreeMultiplier comment @@ -123,126 +131,113 @@ type ( // FortuneDragonFreeMultiplierCount comment FortuneDragonFreeMultiplierCount struct { MultiplierCount int64 - Weight int64 + Weight int64 } // FortuneDragonOthers comment FortuneDragonOthers struct { - FreespinTriggerPro float64 - FreeSpinCount int64 - MaxWin int64 + FreespinTriggerPro float64 + FreeSpinCount int64 + MaxWin int64 SureWinFreespinTriggerPro float64 - SureWinBetMultiplier int64 + SureWinBetMultiplier int64 } // FortuneMouseOthers comment FortuneMouseOthers struct { RespinTriggerPro float64 - MaxWin int64 - ExtraWin int64 + MaxWin int64 + ExtraWin int64 } // FortuneOxOthers comment FortuneOxOthers struct { RespinTriggerPro float64 - Multiplier int64 - MaxWin int64 + Multiplier int64 + MaxWin int64 } // FortuneRabbitCashPrizeWeight comment FortuneRabbitCashPrizeWeight struct { - ID int64 - PrizeValue float64 - Weight float64 + ID int64 + PrizeValue float64 + Weight float64 NoWinWeight float64 } // FortuneRabbitForceCashCountWeight comment FortuneRabbitForceCashCountWeight struct { - ID int64 - Count int64 + ID int64 + Count int64 Weight float64 } // FortuneRabbitOthers comment FortuneRabbitOthers struct { FreespinTriggerPro float64 - FreeSpinCount int64 - MaxWin int64 - } - // GateofOlympusMultiplier comment - GateofOlympusMultiplier struct { - Multiple int64 - ID int64 - Weights []int64 - } - // GateofOlympusReelChoose comment - GateofOlympusReelChoose struct { - ID int64 - IsFreeSpin bool - NodeType string - Weights []int64 + FreeSpinCount int64 + MaxWin int64 } // JackpotPrize comment JackpotPrize struct { - PrizeType int64 - PipeIn int64 - StartPoint int64 - IsRolling bool - RollingTime int64 - ReducePercent int64 + PrizeType int64 + PipeIn int64 + StartPoint int64 + IsRolling bool + RollingTime int64 + ReducePercent int64 JackpotLimitByTotalBet int64 } // MapRTPMode comment MapRTPMode struct { - ID int64 + ID int64 TypeWeight map[int64]*MapRTPModeTypeWeight - Desc string - Rtp float64 + Desc string + Rtp float64 } // MapRTPModeTypeWeight comment MapRTPModeTypeWeight struct { - ID int64 + ID int64 Weight int64 } // Matrix comment Matrix struct { - Type string - LinkType int64 + Type string + LinkType int64 Direction int64 LineCount int64 - Lines [][]int64 - Form []int64 + Lines [][]int64 + Form []int64 } // OptAuthenticate comment OptAuthenticate struct { - Flag string - Order int64 - ValidValues []string + Flag string + Order int64 + ValidValues []string InvalidValues []string } // OptGroup comment OptGroup struct { - ID int64 - Batch int64 + ID int64 + Batch int64 IsNewPlayer bool - StartTime string - EndTime string - Affect []int64 - Weight []int64 + StartTime string + EndTime string + Affect []int64 + Weight []int64 } // PrizeModel comment PrizeModel struct { - ID int64 - AniType string + ID int64 + AniType string MinMultiple int64 MaxMultiple int64 } // Scatter comment Scatter struct { - ScatterCount int64 - FreeSpinBouts int64 + ScatterCount int64 + FreeSpinBouts int64 FreeSpinExtraBouts int64 - BasePayrate int64 - FreePayrate int64 + BasePayrate int64 + FreePayrate int64 } // ScatterFreeChoose comment ScatterFreeChoose struct { - ID int64 + ID int64 FreeSpinTimes int64 TouchTimesMin int64 TouchTimesMax int64 @@ -250,38 +245,43 @@ type ( // SimulatorFSMultiLevel comment SimulatorFSMultiLevel struct { Level int64 - Min int64 - Max int64 + Min int64 + Max int64 } // SuperStackWeight comment SuperStackWeight struct { - ID int64 + ID int64 ItemID int64 Weight float64 } // Symbol comment Symbol struct { - ID int64 - Name string - IsWild bool - Group []int64 - PayRate []int64 + ID int64 + Name string + IsWild bool + Group []int64 + PayRate []int64 ClientOrder int64 - ClientDsc string + ClientDsc string } // SymbolBetRatio comment SymbolBetRatio struct { BetRatio float64 } + // TestBetBetLine comment + TestBetBetLine struct { + Index int64 + BetLine int64 + } // TestRandomWeight comment TestRandomWeight struct { - ID int64 - Time float64 + ID int64 + Time float64 Weight float64 } // Text comment Text struct { - Type string + Type string Texts []*TextTexts } // TextTexts comment @@ -291,25 +291,25 @@ type ( } // Vector comment Vector struct { - Choice int64 - Ratio float64 - Vector []int64 + Choice int64 + Ratio float64 + Vector []int64 Procedure string } // VectorDemand comment VectorDemand struct { - Choice int64 - MinRatio float64 - MaxRatio float64 + Choice int64 + MinRatio float64 + MaxRatio float64 Procedure string - Count int64 + Count int64 } // VectorForceWin comment VectorForceWin struct { - Choice int64 + Choice int64 MinRatio float64 MaxRatio float64 - Weight float64 + Weight float64 } // CashManiaBetBetChangeList comment CashManiaBetBetChangeList = BetChangeList @@ -521,42 +521,6 @@ type ( // FortuneTigerSymbolBetRatio comment FortuneTigerSymbolBetRatio = SymbolBetRatio - // GateofOlympusBetBetChangeList comment - GateofOlympusBetBetChangeList = BetChangeList - - // GateofOlympusBetBetLevel comment - GateofOlympusBetBetLevel = BetLevel - - // GateofOlympusBetBetLine comment - GateofOlympusBetBetLine = BetLine - - // GateofOlympusBetBetSize comment - GateofOlympusBetBetSize = BetSize - - // GateofOlympusBetFirstBet comment - GateofOlympusBetFirstBet = FirstBet - - // GateofOlympusFormation comment - GateofOlympusFormation = Formation - - // GateofOlympusMapRTPMode comment - GateofOlympusMapRTPMode = MapRTPMode - - // GateofOlympusMapRTPModeTypeWeight comment - GateofOlympusMapRTPModeTypeWeight = MapRTPModeTypeWeight - - // GateofOlympusMultiplierKeyID comment - GateofOlympusMultiplierKeyID = GateofOlympusMultiplier - - // GateofOlympusScatter comment - GateofOlympusScatter = Scatter - - // GateofOlympusSymbol comment - GateofOlympusSymbol = Symbol - - // GateofOlympusSymbolBetRatio comment - GateofOlympusSymbolBetRatio = SymbolBetRatio - // MatrixFeaturesForm15X1TypeA comment MatrixFeaturesForm15X1TypeA = Matrix @@ -827,9 +791,6 @@ type ( // TestBetBetLevel comment TestBetBetLevel = BetLevel - // TestBetBetLine comment - TestBetBetLine = BetLine - // TestBetBetSize comment TestBetBetSize = BetSize @@ -850,4 +811,5 @@ type ( // TestSymbolBetRatio comment TestSymbolBetRatio = SymbolBetRatio -) + +) \ No newline at end of file diff --git a/gamesrv/slotspkg/internal/module/shared/types.go b/gamesrv/slotspkg/internal/module/shared/types.go index 134e6fc..c275ce3 100644 --- a/gamesrv/slotspkg/internal/module/shared/types.go +++ b/gamesrv/slotspkg/internal/module/shared/types.go @@ -73,4 +73,12 @@ type SpinLock struct { Prize [][]float64 `json:"pe,omitempty"` //OXSpecial NewSuperStack []int64 `json:"nss,omitempty"` + + //CashMania + FeatureType int `json:"feature_type,omitempty"` //0.无特性 1.nudge 2.respin + NudgeDirection int `json:"nudge_direction,omitempty"` //1.上 2.下 + FreeSpinItemId int64 `json:"free_item_id,omitempty"` + Multiple int64 `json:"multiple,omitempty"` //倍乘倍数 + Irv [][]float64 `json:"irv,omitempty"` + Frv [][]float64 `json:"frv,omitempty"` } diff --git a/gamesrv/slotspkg/slots/desc/machine_desc.go b/gamesrv/slotspkg/slots/desc/machine_desc.go index 5dc4e00..1ab0b43 100644 --- a/gamesrv/slotspkg/slots/desc/machine_desc.go +++ b/gamesrv/slotspkg/slots/desc/machine_desc.go @@ -34,7 +34,7 @@ func (n *MachineDesc) Sheet(excel string, sheet string) interface{} { return n.DataSet.GetMachineSheet(n.Theme, excel, sheet, 0) } -func (n *MachineDesc) GetLineBet(betSizeIndex int64, betLevelIndex int64) int64 { +func (n *MachineDesc) GetLineBet(betSizeIndex, betLevelIndex, betLineIndex int64) int64 { betSizeRows, ok := n.Sheet("Bet", "BetSize").(map[int64]*structs.BetSize) if !ok { panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetSize")) @@ -55,7 +55,17 @@ func (n *MachineDesc) GetLineBet(betSizeIndex int64, betLevelIndex int64) int64 panic(errors.ConfigRowNoMatch.ErrorWith(n.Theme, "BetLevel", betLevelIndex)) } - return betSizeRow.BetSize * betLevelRow.BetLevel + betLineRows, ok := n.Sheet("Bet", "BetLine").(map[int64]*structs.BetLine) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BetLine")) + } + + betLineRow, ok := betLineRows[betLineIndex] + if !ok { + panic(errors.ConfigRowNoMatch.ErrorWith(n.Theme, "BetLine", betLineIndex)) + } + + return betSizeRow.BetSize * betLevelRow.BetLevel * betLineRow.BaseBet } func (n *MachineDesc) BetSizes() []int64 { betSizeRows, ok := n.Sheet("Bet", "BetSize").(map[int64]*structs.BetSize) @@ -90,6 +100,17 @@ func (n *MachineDesc) BetLines() []int64 { } return lists } +func (n *MachineDesc) BaseBets() []int64 { + baseBetRows, ok := n.Sheet("Bet", "BetLine").(map[int64]*structs.BetLine) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "BaseBet")) + } + var lists []int64 + for _, list := range baseBetRows { + lists = append(lists, list.BaseBet) + } + return lists +} func (n *MachineDesc) BetChangeList() []float64 { betChangeListRows, ok := n.Sheet("Bet", "BetChangeList").(map[int64]*structs.BetChangeList) if !ok { diff --git a/gamesrv/slotspkg/slots/entity/win.go b/gamesrv/slotspkg/slots/entity/win.go index 5254acc..e8b994e 100644 --- a/gamesrv/slotspkg/slots/entity/win.go +++ b/gamesrv/slotspkg/slots/entity/win.go @@ -281,11 +281,11 @@ func (e *Entity) CalcWinType(multi float64) int64 { } func (e *Entity) GetLineBetByType(nodeType string) int64 { - return e.MachineDesc.GetLineBet(e.NodeTree.Act.BetSizeIndex, e.NodeTree.Act.BetLevelIndex) + return e.MachineDesc.GetLineBet(e.NodeTree.Act.BetSizeIndex, e.NodeTree.Act.BetLevelIndex, e.NodeTree.Act.BetLineIndex) } func (e *Entity) GetMinLineBet(nodeType string) int64 { - return e.MachineDesc.GetLineBet(1, 1) + return e.MachineDesc.GetLineBet(1, 1, 1) } func (e *Entity) SetBetCoin(betCoin player.DecCoin) { diff --git a/gamesrv/slotspkg/slots/handler.go b/gamesrv/slotspkg/slots/handler.go index fdd8083..1615253 100644 --- a/gamesrv/slotspkg/slots/handler.go +++ b/gamesrv/slotspkg/slots/handler.go @@ -46,6 +46,7 @@ func (sm *SlotsMgr) Enter(s *base.SlotsSession, gameId int64) (*cli.SlotsEnterRe BetSizes: m.BetSizes(), BetLevels: m.BetLevels(), BetLines: m.BetLines(), + BaseBets: m.BaseBets(), BetChangeList: m.BetChangeList(), } diff --git a/gamesrv/slotspkg/slots/intf/spinner.go b/gamesrv/slotspkg/slots/intf/spinner.go index f3da082..649d598 100644 --- a/gamesrv/slotspkg/slots/intf/spinner.go +++ b/gamesrv/slotspkg/slots/intf/spinner.go @@ -42,6 +42,7 @@ type Spinner interface { BetSizes() []int64 BetLevels() []int64 BetLines() []int64 + BaseBets() []int64 BetChangeList() []float64 Choice() int64 diff --git a/gamesrv/slotspkg/slots/machine/machine_master_misc.go b/gamesrv/slotspkg/slots/machine/machine_master_misc.go index 49be731..2580bb4 100644 --- a/gamesrv/slotspkg/slots/machine/machine_master_misc.go +++ b/gamesrv/slotspkg/slots/machine/machine_master_misc.go @@ -39,6 +39,9 @@ func (m *Machine) BetLevels() []int64 { func (m *Machine) BetLines() []int64 { return m.MachineDesc.BetLines() } +func (m *Machine) BaseBets() []int64 { + return m.MachineDesc.BaseBets() +} func (m *Machine) BetChangeList() []float64 { return m.MachineDesc.BetChangeList() } diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/base.go b/gamesrv/slotspkg/slots/plugin/cashmania/base.go index ee73b7e..c48ba52 100644 --- a/gamesrv/slotspkg/slots/plugin/cashmania/base.go +++ b/gamesrv/slotspkg/slots/plugin/cashmania/base.go @@ -29,8 +29,21 @@ type CustomRespin struct { // 本次的symbol ItemId int64 } + type CustomFortune struct { ForceRound int64 `json:"fr"` //第n次 + + FeatureType int `json:"feature_type"` //0.无特性 1.nudge 2.respin + NudgeDirection int `json:"nudge_direction"` //1.上 2.下 + + FreeSpinItemId int64 `json:"free_item_id"` + + Multiple int64 `json:"multiple"` //倍乘倍数 + + FreeStatus int `json:"fs"` + FreeSpinNum int64 `json:"fsn"` //剩余freespin + FreeNumMax int64 `json:"fnm"` //总次数 + FreeNumTrigger int64 `json:"fnt"` //新增freespin } // Theme is called to get feature theme @@ -44,8 +57,8 @@ func (p *PluginBase) Customs() []interface{} { &CustomMidInfo{}, &CustomNudge{}, &CustomRespin{}, - &Special{}, - &CustomFortune{}) + &CustomFortune{}, + &Special{}) } // OnStepBegin is called on initializing a step @@ -58,6 +71,9 @@ func (p *PluginBase) BeforeDisplay(m intf.Master) { case key.BaseSpin: p.changeItem(m, false) case key.FreeSpin: + Fortune := getCustomFortune(m) + Fortune.FreeStatus = 0 + Fortune.FreeNumTrigger = 0 p.changeItem(m, true) } @@ -67,9 +83,15 @@ func (p *PluginBase) AfterDisplay(m intf.Master) { isFreeSpin := m.Cursor().GetType() == key.FreeSpin cursorFormation := m.CursorFormation() symbols := cursorFormation.GetSymbols() + + Fortune := getCustomFortune(m) + + Fortune.FeatureType = WU if m.Bool("Nudge") { + Fortune.FeatureType = Nudge //todo 如果当前是nudge if m.Bool("NudgeDown") { + Fortune.NudgeDirection = Nudge_Down symbols[9] = symbols[8] symbols[8] = symbols[7] symbols[7] = symbols[6] @@ -77,6 +99,7 @@ func (p *PluginBase) AfterDisplay(m intf.Master) { symbols[5] = Descx(m).RandomMidItems(isFreeSpin, 1)[0] m.Remove("NudgeDown") } else if m.Bool("NudgeUp") { + Fortune.NudgeDirection = Nudge_Up symbols[5] = symbols[6] symbols[6] = symbols[7] symbols[7] = symbols[8] @@ -86,6 +109,7 @@ func (p *PluginBase) AfterDisplay(m intf.Master) { } m.Remove("Nudge") } else if m.Bool("Respin") { + Fortune.FeatureType = Respin //todo 如果当前是respin if m.Int64("respinsymbols") > 0 { symbols[2] = m.Int64("respinsymbols") @@ -109,6 +133,14 @@ func (p *PluginBase) AfterSpin(m intf.Master) { p.checkMid(m, false) case key.FreeSpin: p.checkMid(m, true) + Fortune := getCustomFortune(m) + if Fortune.FreeSpinNum > 0 { + if Fortune.FreeSpinNum == 1 { + Fortune.FreeStatus = 3 + } + Fortune.FreeSpinNum-- + //logx.Errorf("这里是哇哇哇 Trigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", Fortune.FreeNumTrigger, Fortune.FreeNumMax, Fortune.FreeSpinNum) + } } } @@ -133,26 +165,24 @@ func (p *PluginBase) Nudge(m intf.Master, symbols []int64) { } } -// 获取特性数据 -func (p *PluginBase) getCustomFortune(m intf.Master) *CustomFortune { - customFortune := new(CustomFortune) - if len(m.CursorCustoms(customFortune)) == 0 { - m.AddCursorFeature(customFortune) - } - return m.CursorCustom(customFortune).(*CustomFortune) -} func (p *PluginBase) changeItem(m intf.Master, isFreeSpin bool) { curFormation := m.CursorFormation() symbols := curFormation.GetSymbols() isWin := Descx(m).CheckWin(isFreeSpin) + //todo ceshi + //isWin = true if isFreeSpin { - Fortune := p.getCustomFortune(m) + Fortune := getCustomFortune(m) if Fortune.ForceRound == m.GetProgressValue() { isWin = true } } isNudge, isReSpin := Descx(m).GetNudgeAndReSpin(isWin) + + //todo ceshi + //isNudge = true + //isReSpin = true if isWin { itemId := Descx(m).GetWinItem(isFreeSpin) symbols[2] = itemId @@ -267,13 +297,35 @@ func (p *PluginBase) checkMid(m intf.Master, isFreeSpin bool) { FreeSpinCount: freeSpinCount, }).SetWin(win * (multi - 1)) + Fortune := getCustomFortune(m) + + Fortune.Multiple = multi + //Fortune.MultipleWin = win * (multi - 1) + Fortune.FreeSpinItemId = symbols[7] if freeSpinCount > 0 { + customFortune := getCustomFortune(m) if isFreeSpin { + //logx.Errorf("----ReTrigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum) + customFortune.FreeStatus = 2 + customFortune.FreeNumTrigger = freeSpinCount + customFortune.FreeNumMax += freeSpinCount + customFortune.FreeSpinNum += freeSpinCount + + //logx.Errorf("----2ReTrigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum) + m.AddProgress(freeSpinCount) - m.AddCursorFeature(&generic.CustomExtraFreeSpin{ExtraTimes: freeSpinCount}).SetLifetime(1) + //m.AddCursorFeature(customFortune).SetLifetime(customFortune.FreeSpinNum) + m.CursorFeature(customFortune).SetLifetime(customFortune.FreeSpinNum) } else { + //logx.Errorf("11Trigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum) + customFortune.FreeStatus = 1 + customFortune.FreeNumTrigger = freeSpinCount + customFortune.FreeNumMax += freeSpinCount + customFortune.FreeSpinNum = freeSpinCount ForceRound := m.Randx().Int63n(freeSpinCount) - m.AddNodeFeature(m.AddNodeOnCursor(key.FreeSpin, freeSpinCount).GetID(), &CustomFortune{ForceRound: ForceRound}) + customFortune.ForceRound = ForceRound + //logx.Errorf("1111111Trigger[%v] FreeNumMax[%v] FreeSpinNum[%v]", customFortune.FreeNumTrigger, customFortune.FreeNumMax, customFortune.FreeSpinNum) + m.AddNodeFeature(m.AddNodeOnCursor(key.FreeSpin, freeSpinCount).GetID(), customFortune).SetLifetime(freeSpinCount) } } } diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/common.go b/gamesrv/slotspkg/slots/plugin/cashmania/common.go index d9bbe15..7ffaa3c 100644 --- a/gamesrv/slotspkg/slots/plugin/cashmania/common.go +++ b/gamesrv/slotspkg/slots/plugin/cashmania/common.go @@ -2,6 +2,25 @@ package cashmania import "mongo.games.com/game/gamesrv/slotspkg/slots/intf" +const ( + WU int = iota + Nudge + Respin +) +const ( + Nudge_WU int = iota + Nudge_Up + Nudge_Down +) + +// 获取特性数据 +func getCustomFortune(m intf.Master) *CustomFortune { + customFortune := new(CustomFortune) + if len(m.CursorCustoms(customFortune)) == 0 { + m.AddCursorFeature(customFortune) + } + return m.CursorCustom(customFortune).(*CustomFortune) +} func (p *PluginBase) RandomItemsByMid(m intf.Master, isFreeSpin bool, symbols []int64, poss ...int) { items := Descx(m).RandomMidItems(isFreeSpin, len(poss)) for i, pos := range poss { diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/descx.go b/gamesrv/slotspkg/slots/plugin/cashmania/descx.go index bc71eac..add03bb 100644 --- a/gamesrv/slotspkg/slots/plugin/cashmania/descx.go +++ b/gamesrv/slotspkg/slots/plugin/cashmania/descx.go @@ -19,6 +19,14 @@ func Descx(m intf.Master) *descx { NodeDesc: m.Desc(), } } +func (n descx) GetItemInfo() map[int64]*structs.CashManiaItemInfo { + sheet := n.DefaultSheet("ItemInfo") + rows, ok := sheet.(map[int64]*structs.CashManiaItemInfo) + if !ok { + panic(errors.ConfigTypeError.ErrorWith(n.Theme, "CashMania", "S_ItemInfo")) + } + return rows +} // 判断是否触发respin func (n descx) CheckWin(isFreeSpin bool) bool { diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/init.go b/gamesrv/slotspkg/slots/plugin/cashmania/init.go index 6ff10cc..b5bf05d 100644 --- a/gamesrv/slotspkg/slots/plugin/cashmania/init.go +++ b/gamesrv/slotspkg/slots/plugin/cashmania/init.go @@ -2,6 +2,7 @@ package cashmania var Plugins = []interface{}{ &PluginBase{}, + &PluginSpecial{}, } var SimulatorPlugins = []interface{}{ diff --git a/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go b/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go index 6f6a33f..6bdd0fe 100644 --- a/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go +++ b/gamesrv/slotspkg/slots/plugin/cashmania/tospecial.go @@ -17,6 +17,17 @@ func (p *PluginSpecial) Theme() string { // Special type Special struct { + FreeStatus int `json:"fs"` + FreeSpinNum int64 `json:"fsn"` //剩余freespin + FreeNumMax int64 `json:"fnm"` //总次数 + FreeNumTrigger int64 `json:"fnt"` //新增freespin + + FeatureType int `json:"feature_type"` //0.无特性 1.nudge 2.respin + NudgeDirection int `json:"nudge_direction"` //1.上 2.下 + FreeSpinItemId int64 `json:"free_item_id"` + Multiple int64 `json:"multiple"` //倍乘倍数 + Irv [][]float64 `json:"irv"` + Frv [][]float64 `json:"frv"` } // 获取特性数据 @@ -28,5 +39,56 @@ func (p *PluginSpecial) getCustomSpecial(m intf.Master) *Special { return m.CursorCustom(customSpecial).(*Special) } func (p *PluginSpecial) AfterSpin(m intf.Master) { + Fortune := getCustomFortune(m) + sp := p.getCustomSpecial(m) + sp.FeatureType = Fortune.FeatureType + sp.NudgeDirection = Fortune.NudgeDirection + sp.FreeStatus = Fortune.FreeStatus + sp.FreeSpinNum = Fortune.FreeSpinNum + sp.FreeNumMax = Fortune.FreeNumMax + sp.FreeNumTrigger = Fortune.FreeNumTrigger + sp.FreeSpinItemId = Fortune.FreeSpinItemId + sp.Multiple = Fortune.Multiple + + itemInfo := Descx(m).GetItemInfo() + displaySymbols := m.CursorFormation().GetReelFormattedDisplaySymbols() + var irv = copyMatrix(displaySymbols) + for i, symbol := range displaySymbols { + for i2, i3 := range symbol { + if itemInfo[i3].IsMid { + irv[i][i2] = itemInfo[i3].Value + } else { + irv[i][i2] = itemInfo[i3].Value * float64(m.Bet()) / 10000 + } + } + } + sp.Irv = irv + + finalSymbols := m.CursorFormation().GetMatrixFormattedFinalSymbols() + var frv = copyMatrix(finalSymbols) + for i, symbol := range finalSymbols { + for i2, i3 := range symbol { + if itemInfo[i3].IsMid { + frv[i][i2] = itemInfo[i3].Value + } else { + frv[i][i2] = itemInfo[i3].Value * float64(m.Bet()) / 10000 + } + } + } + sp.Frv = frv } +func copyMatrix(mat [][]int64) [][]float64 { + if mat == nil { + return nil + } + var newMat [][]float64 + for _, row := range mat { + var r []float64 + for _, val := range row { + r = append(r, 0*float64(val)) + } + newMat = append(newMat, r) + } + return newMat +} diff --git a/gamesrv/slotspkg/slots/types/cli/cli.go b/gamesrv/slotspkg/slots/types/cli/cli.go index d33272a..e65509b 100644 --- a/gamesrv/slotspkg/slots/types/cli/cli.go +++ b/gamesrv/slotspkg/slots/types/cli/cli.go @@ -12,10 +12,12 @@ type SlotsEnterResponse struct { BetSizeIndex int64 BetLevelIndex int64 BetLineIndex int64 + BaseBetIndex int64 BetChangeList []float64 BetSizes []int64 BetLevels []int64 BetLines []int64 + BaseBets []int64 } type SlotsPlayRequest struct { Theme string diff --git a/model/gameparam.go b/model/gameparam.go index 9e74ba2..f7b297d 100644 --- a/model/gameparam.go +++ b/model/gameparam.go @@ -92,6 +92,7 @@ type GameParam struct { CloseCustomRoomCreate bool // 关闭自定义房间创建 ClientVersion int32 // 客户端版本号 ClientVersionChannel []string // 客户端版本号包渠道 + SwapShopUrl string // 交换商城地址 } var GameParamPath = "../data/gameparam.json" @@ -237,4 +238,7 @@ func InitGameParam() { if GameParamData.AdminPassword == "" { GameParamData.AdminPassword = "fjslowopcserg" } + if GameParamData.SwapShopUrl == "" { + GameParamData.SwapShopUrl = "https://user.hinasakimiu.com/login" + } } diff --git a/protocol/player/player.pb.go b/protocol/player/player.pb.go index 9b4aa6d..b00a216 100644 --- a/protocol/player/player.pb.go +++ b/protocol/player/player.pb.go @@ -421,6 +421,8 @@ const ( PlayerPacketID_PACKET_SCPopUpWindowConfig PlayerPacketID = 2849 //返回弹窗配置 PlayerPacketID_PACKET_CSUpdateGuide PlayerPacketID = 2850 //更新引导 PlayerPacketID_PACKET_SCUpdateGuide PlayerPacketID = 2851 //更新引导 + PlayerPacketID_PACKET_CSGetSwapShopInfo PlayerPacketID = 2852 // 请求兑换商城信息 + PlayerPacketID_PACKET_SCGetSwapShopInfo PlayerPacketID = 2853 // 返回兑换商城信息 ) // Enum value maps for PlayerPacketID. @@ -576,6 +578,8 @@ var ( 2849: "PACKET_SCPopUpWindowConfig", 2850: "PACKET_CSUpdateGuide", 2851: "PACKET_SCUpdateGuide", + 2852: "PACKET_CSGetSwapShopInfo", + 2853: "PACKET_SCGetSwapShopInfo", } PlayerPacketID_value = map[string]int32{ "PACKET_PLAYERPACKET_ZERO": 0, @@ -728,6 +732,8 @@ var ( "PACKET_SCPopUpWindowConfig": 2849, "PACKET_CSUpdateGuide": 2850, "PACKET_SCUpdateGuide": 2851, + "PACKET_CSGetSwapShopInfo": 2852, + "PACKET_SCGetSwapShopInfo": 2853, } ) @@ -11742,6 +11748,94 @@ func (x *PopUpWindowInfo) GetWeight() int32 { return 0 } +// 获取兑换商城网页地址 +// PACKET_CSGetSwapShopInfo +type CSGetSwapShopInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CSGetSwapShopInfo) Reset() { + *x = CSGetSwapShopInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_player_player_proto_msgTypes[168] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CSGetSwapShopInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSGetSwapShopInfo) ProtoMessage() {} + +func (x *CSGetSwapShopInfo) ProtoReflect() protoreflect.Message { + mi := &file_protocol_player_player_proto_msgTypes[168] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CSGetSwapShopInfo.ProtoReflect.Descriptor instead. +func (*CSGetSwapShopInfo) Descriptor() ([]byte, []int) { + return file_protocol_player_player_proto_rawDescGZIP(), []int{168} +} + +// PACKET_SCGetSwapShopInfo +type SCGetSwapShopInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Url string `protobuf:"bytes,1,opt,name=Url,proto3" json:"Url,omitempty"` +} + +func (x *SCGetSwapShopInfo) Reset() { + *x = SCGetSwapShopInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protocol_player_player_proto_msgTypes[169] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SCGetSwapShopInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SCGetSwapShopInfo) ProtoMessage() {} + +func (x *SCGetSwapShopInfo) ProtoReflect() protoreflect.Message { + mi := &file_protocol_player_player_proto_msgTypes[169] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SCGetSwapShopInfo.ProtoReflect.Descriptor instead. +func (*SCGetSwapShopInfo) Descriptor() ([]byte, []int) { + return file_protocol_player_player_proto_rawDescGZIP(), []int{169} +} + +func (x *SCGetSwapShopInfo) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + var File_protocol_player_player_proto protoreflect.FileDescriptor var file_protocol_player_player_proto_rawDesc = []byte{ @@ -12960,405 +13054,413 @@ var file_protocol_player_player_proto_rawDesc = []byte{ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x2a, 0x87, 0x0f, 0x0a, 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, - 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x10, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0xe8, 0x07, 0x12, 0x18, 0x0a, 0x13, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x61, 0x6d, 0x65, - 0x10, 0xef, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x5f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0xf1, - 0x07, 0x12, 0x12, 0x0a, 0x0d, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x74, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x10, 0xf5, 0x07, 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x59, 0x6f, - 0x75, 0x72, 0x52, 0x65, 0x73, 0x56, 0x65, 0x72, 0x49, 0x73, 0x4c, 0x6f, 0x77, 0x10, 0x94, 0x08, - 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x59, 0x6f, 0x75, 0x72, 0x41, 0x70, 0x70, - 0x56, 0x65, 0x72, 0x49, 0x73, 0x4c, 0x6f, 0x77, 0x10, 0x95, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, - 0x50, 0x52, 0x43, 0x5f, 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, - 0x68, 0x10, 0xa0, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, - 0x6b, 0x49, 0x73, 0x4e, 0x75, 0x6c, 0x6c, 0x10, 0xa4, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, 0x6b, 0x49, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xa5, - 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x74, 0x6c, 0x79, 0x10, 0xa6, 0x08, 0x12, 0x13, 0x0a, 0x0e, 0x4f, 0x50, 0x52, 0x43, 0x5f, - 0x49, 0x63, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xa7, 0x08, 0x12, 0x12, 0x0a, 0x0d, - 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xa8, 0x08, - 0x12, 0x12, 0x0a, 0x0d, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x65, 0x6c, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x10, 0xa9, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x55, 0x73, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xaa, 0x08, 0x12, 0x1f, 0x0a, - 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xab, 0x08, 0x12, 0x14, - 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x65, 0x6c, 0x49, 0x73, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x10, 0xac, 0x08, 0x12, 0x1e, 0x0a, 0x19, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x61, 0x66, - 0x65, 0x42, 0x6f, 0x78, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x10, 0xae, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x65, 0x6c, - 0x49, 0x73, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x10, 0xaf, 0x08, 0x12, 0x15, 0x0a, - 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x6e, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x73, - 0x74, 0x10, 0xb0, 0x08, 0x12, 0x16, 0x0a, 0x11, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, - 0x6b, 0x49, 0x73, 0x54, 0x6f, 0x6f, 0x4c, 0x65, 0x6e, 0x10, 0xb1, 0x08, 0x12, 0x17, 0x0a, 0x12, - 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x71, 0x75, - 0x61, 0x6c, 0x10, 0xb2, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, - 0x63, 0x6b, 0x49, 0x73, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xbb, 0x08, 0x12, 0x16, - 0x0a, 0x11, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x4d, 0x53, 0x43, 0x6f, 0x64, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x10, 0xbc, 0x08, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x48, - 0x61, 0x64, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x10, 0xc2, 0x08, 0x12, 0x1b, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x72, 0x49, 0x64, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xc3, - 0x08, 0x12, 0x1a, 0x0a, 0x15, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, - 0x42, 0x69, 0x6e, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0xc4, 0x08, 0x12, 0x17, 0x0a, - 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x42, - 0x69, 0x6e, 0x64, 0x10, 0xc5, 0x08, 0x12, 0x1e, 0x0a, 0x19, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, - 0x70, 0x72, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x4c, - 0x6f, 0x6f, 0x70, 0x10, 0xc6, 0x08, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x10, 0xc7, 0x08, 0x12, 0x1a, 0x0a, 0x15, 0x4f, 0x50, 0x52, 0x43, 0x5f, - 0x4e, 0x69, 0x63, 0x6b, 0x49, 0x73, 0x43, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x10, 0xd0, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x50, 0x72, - 0x6f, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x10, 0xd4, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x4e, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x10, 0xd5, 0x08, 0x12, - 0x16, 0x0a, 0x11, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x43, 0x61, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x42, 0x69, 0x6e, 0x64, 0x10, 0xd6, 0x08, 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, - 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x72, 0x48, 0x61, 0x73, 0x42, 0x69, 0x6e, 0x64, 0x10, - 0xd7, 0x08, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x4e, 0x6f, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x72, 0x10, 0xd8, 0x08, - 0x12, 0x28, 0x0a, 0x23, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xd3, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd5, 0x0f, 0x12, 0x21, 0x0a, - 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, - 0x5f, 0x41, 0x63, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd6, 0x0f, - 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x61, 0x66, 0x65, 0x62, 0x6f, 0x78, - 0x5f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, - 0x10, 0xd7, 0x0f, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, - 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd8, - 0x0f, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, - 0x6e, 0x6b, 0x5f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, - 0xd9, 0x0f, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, - 0x61, 0x6e, 0x6b, 0x5f, 0x41, 0x63, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x10, 0xda, 0x0f, 0x12, 0x1e, 0x0a, 0x19, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, - 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, - 0x10, 0xdb, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, - 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6c, 0x6c, 0x65, - 0x67, 0x61, 0x6c, 0x10, 0xdc, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, - 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x41, 0x63, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x49, - 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xdd, 0x0f, 0x12, 0x23, 0x0a, 0x1e, 0x4f, 0x50, 0x52, + 0x22, 0x13, 0x0a, 0x11, 0x43, 0x53, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x53, 0x68, 0x6f, + 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x25, 0x0a, 0x11, 0x53, 0x43, 0x47, 0x65, 0x74, 0x53, 0x77, + 0x61, 0x70, 0x53, 0x68, 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x72, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x72, 0x6c, 0x2a, 0x87, 0x0f, 0x0a, + 0x0c, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x75, 0x63, 0x65, 0x73, 0x73, 0x10, 0x00, 0x12, 0x0e, + 0x0a, 0x0a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x15, + 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x10, 0xe8, 0x07, 0x12, 0x18, 0x0a, 0x13, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4c, 0x6f, + 0x67, 0x69, 0x6e, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x61, 0x6d, 0x65, 0x10, 0xef, 0x07, 0x12, + 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0xf1, 0x07, 0x12, 0x12, 0x0a, + 0x0d, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x74, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x10, 0xf5, + 0x07, 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x59, 0x6f, 0x75, 0x72, 0x52, 0x65, + 0x73, 0x56, 0x65, 0x72, 0x49, 0x73, 0x4c, 0x6f, 0x77, 0x10, 0x94, 0x08, 0x12, 0x19, 0x0a, 0x14, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x59, 0x6f, 0x75, 0x72, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x49, + 0x73, 0x4c, 0x6f, 0x77, 0x10, 0x95, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, + 0x43, 0x6f, 0x69, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x10, 0xa0, 0x08, + 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, 0x6b, 0x49, 0x73, 0x4e, + 0x75, 0x6c, 0x6c, 0x10, 0xa4, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, + 0x69, 0x63, 0x6b, 0x49, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xa5, 0x08, 0x12, 0x14, 0x0a, + 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x10, 0xa6, 0x08, 0x12, 0x13, 0x0a, 0x0e, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x63, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xa7, 0x08, 0x12, 0x12, 0x0a, 0x0d, 0x4f, 0x50, 0x52, 0x43, + 0x5f, 0x53, 0x65, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xa8, 0x08, 0x12, 0x12, 0x0a, 0x0d, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x65, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xa9, 0x08, + 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xaa, 0x08, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, + 0x43, 0x5f, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x64, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xab, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, + 0x52, 0x43, 0x5f, 0x54, 0x65, 0x6c, 0x49, 0x73, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xac, 0x08, + 0x12, 0x1e, 0x0a, 0x19, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x61, 0x66, 0x65, 0x42, 0x6f, 0x78, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xae, 0x08, + 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x54, 0x65, 0x6c, 0x49, 0x73, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x10, 0xaf, 0x08, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, + 0x43, 0x5f, 0x49, 0x6e, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xb0, 0x08, + 0x12, 0x16, 0x0a, 0x11, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, 0x6b, 0x49, 0x73, 0x54, + 0x6f, 0x6f, 0x4c, 0x65, 0x6e, 0x10, 0xb1, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, + 0x5f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x10, 0xb2, + 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, 0x6b, 0x49, 0x73, + 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xbb, 0x08, 0x12, 0x16, 0x0a, 0x11, 0x4f, 0x50, + 0x52, 0x43, 0x5f, 0x53, 0x4d, 0x53, 0x43, 0x6f, 0x64, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, + 0xbc, 0x08, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x48, 0x61, 0x64, 0x53, 0x70, + 0x72, 0x65, 0x61, 0x64, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x49, 0x64, 0x10, 0xc2, 0x08, + 0x12, 0x1b, 0x0a, 0x16, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x4e, 0x6f, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xc3, 0x08, 0x12, 0x1a, 0x0a, + 0x15, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, 0x42, 0x69, 0x6e, 0x64, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0xc4, 0x08, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, + 0x43, 0x5f, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x42, 0x69, 0x6e, 0x64, 0x10, + 0xc5, 0x08, 0x12, 0x1e, 0x0a, 0x19, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x70, 0x72, 0x65, 0x61, + 0x64, 0x42, 0x69, 0x6e, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x4c, 0x6f, 0x6f, 0x70, 0x10, + 0xc6, 0x08, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x10, 0xc7, 0x08, 0x12, 0x1a, 0x0a, 0x15, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x69, 0x63, 0x6b, + 0x49, 0x73, 0x43, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x10, 0xd0, 0x08, 0x12, + 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, + 0x6f, 0x72, 0x10, 0xd4, 0x08, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4e, 0x6f, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x10, 0xd5, 0x08, 0x12, 0x16, 0x0a, 0x11, 0x4f, + 0x50, 0x52, 0x43, 0x5f, 0x43, 0x61, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x69, 0x6e, 0x64, + 0x10, 0xd6, 0x08, 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x72, 0x6f, 0x6d, + 0x6f, 0x74, 0x65, 0x72, 0x48, 0x61, 0x73, 0x42, 0x69, 0x6e, 0x64, 0x10, 0xd7, 0x08, 0x12, 0x1c, + 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4e, + 0x6f, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x72, 0x10, 0xd8, 0x08, 0x12, 0x28, 0x0a, 0x23, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6c, 0x6c, 0x65, + 0x67, 0x61, 0x6c, 0x10, 0xd3, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, + 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd5, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xde, 0x0f, 0x12, 0x23, - 0x0a, 0x1e, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, - 0x79, 0x5f, 0x41, 0x63, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, - 0x10, 0xdf, 0x0f, 0x12, 0x22, 0x0a, 0x1d, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, - 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x10, 0xe0, 0x0f, 0x12, 0x20, 0x0a, 0x1b, 0x4f, 0x50, 0x52, 0x43, 0x5f, - 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0xe1, 0x0f, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x49, 0x50, 0x5f, 0x54, 0x6f, 0x6f, - 0x4d, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x67, 0x10, 0xe2, 0x0f, 0x12, 0x1d, 0x0a, 0x18, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0xe3, 0x0f, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0xe4, 0x0f, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, - 0x52, 0x43, 0x5f, 0x42, 0x61, 0x6e, 0x6b, 0x41, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x5f, 0x4e, 0x6f, - 0x74, 0x53, 0x61, 0x6d, 0x65, 0x10, 0xe5, 0x0f, 0x12, 0x27, 0x0a, 0x22, 0x4f, 0x50, 0x52, 0x43, - 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, - 0x4e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0xe6, - 0x0f, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4a, 0x79, 0x62, 0x5f, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x10, 0xb4, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, - 0x5f, 0x4a, 0x79, 0x62, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xb5, - 0x10, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4a, 0x79, 0x62, 0x5f, 0x54, 0x69, - 0x6d, 0x65, 0x45, 0x72, 0x72, 0x10, 0xb6, 0x10, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, - 0x5f, 0x4a, 0x79, 0x62, 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x45, 0x72, 0x72, 0x10, 0xb7, 0x10, 0x12, - 0x26, 0x0a, 0x21, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x48, 0x75, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x5f, - 0x59, 0x6f, 0x75, 0x48, 0x61, 0x64, 0x42, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x4c, - 0x65, 0x61, 0x76, 0x65, 0x10, 0xd9, 0x36, 0x12, 0x29, 0x0a, 0x24, 0x4f, 0x50, 0x52, 0x43, 0x5f, - 0x48, 0x75, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x5f, 0x59, 0x6f, 0x75, 0x48, 0x61, 0x64, 0x42, 0x61, - 0x6e, 0x6b, 0x65, 0x72, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, - 0xda, 0x36, 0x12, 0x1a, 0x0a, 0x15, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, - 0x53, 0x74, 0x65, 0x70, 0x5f, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x10, 0xc1, 0x3e, 0x12, 0x19, - 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x53, 0x74, 0x65, 0x70, - 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x10, 0xc2, 0x3e, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x53, 0x74, 0x65, 0x70, 0x5f, 0x45, 0x6e, 0x64, 0x10, - 0xc3, 0x3e, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, - 0x5f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x10, 0xc4, 0x3e, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, - 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x5f, 0x53, 0x6b, 0x69, 0x70, 0x10, 0xc5, 0x3e, 0x12, - 0x19, 0x0a, 0x14, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x5f, 0x53, 0x6b, - 0x69, 0x70, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x10, 0xc6, 0x3e, 0x2a, 0xb1, 0x22, 0x0a, 0x0e, 0x50, - 0x6c, 0x61, 0x79, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, - 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x14, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, - 0x41, 0x54, 0x41, 0x10, 0xb4, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, 0x10, 0xb5, - 0x10, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x44, - 0x41, 0x59, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0xb6, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x50, 0x4c, - 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, 0x10, 0xb7, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x50, 0x4c, - 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, 0x10, 0xb8, 0x10, 0x12, 0x1f, 0x0a, 0x1a, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, - 0x41, 0x54, 0x41, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0xb9, 0x10, 0x12, 0x1b, 0x0a, 0x16, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, - 0x44, 0x41, 0x54, 0x41, 0x45, 0x58, 0x10, 0xba, 0x10, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4d, 0x43, 0x4d, 0x44, 0x10, 0xbb, 0x10, 0x12, - 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x52, 0x4f, 0x42, - 0x4f, 0x54, 0x43, 0x48, 0x47, 0x44, 0x41, 0x54, 0x41, 0x10, 0xbc, 0x10, 0x12, 0x21, 0x0a, 0x1c, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, - 0x57, 0x45, 0x43, 0x48, 0x41, 0x54, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0xbd, 0x10, 0x12, - 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, 0x41, - 0x4e, 0x47, 0x45, 0x57, 0x45, 0x43, 0x48, 0x41, 0x54, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, - 0xbe, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, - 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x49, 0x44, 0x10, 0xbf, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x49, - 0x44, 0x10, 0xc0, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x47, 0x41, 0x4d, 0x45, 0x10, 0xc1, 0x10, 0x12, 0x17, 0x0a, - 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x47, - 0x41, 0x4d, 0x45, 0x10, 0xc2, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x53, 0x50, 0x52, 0x45, 0x41, 0x44, 0x42, 0x49, 0x4e, 0x44, 0x10, 0xc3, - 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, - 0x50, 0x52, 0x45, 0x41, 0x44, 0x42, 0x49, 0x4e, 0x44, 0x10, 0xc4, 0x10, 0x12, 0x1d, 0x0a, 0x18, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x4e, 0x43, 0x55, 0x53, - 0x54, 0x4f, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xc7, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x45, 0x4e, 0x43, 0x55, 0x53, 0x54, - 0x4f, 0x4d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xc8, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x4e, 0x45, - 0x57, 0x4d, 0x53, 0x47, 0x10, 0xc9, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x4e, 0x45, 0x57, 0x4d, 0x53, - 0x47, 0x41, 0x43, 0x4b, 0x10, 0xca, 0x10, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x52, 0x56, 0x4d, 0x53, 0x47, 0x10, 0xcb, 0x10, 0x12, 0x1e, - 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x46, 0x49, 0x53, 0x48, - 0x4a, 0x41, 0x43, 0x4b, 0x50, 0x4f, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xcc, 0x10, 0x12, 0x1e, - 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x46, 0x49, 0x53, 0x48, - 0x4a, 0x41, 0x43, 0x4b, 0x50, 0x4f, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xcd, 0x10, 0x12, 0x1e, - 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x46, 0x49, 0x53, 0x48, - 0x4a, 0x41, 0x43, 0x4b, 0x50, 0x4f, 0x54, 0x44, 0x41, 0x54, 0x41, 0x10, 0xce, 0x10, 0x12, 0x1e, - 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x46, 0x49, 0x53, 0x48, - 0x4a, 0x41, 0x43, 0x4b, 0x50, 0x4f, 0x54, 0x44, 0x41, 0x54, 0x41, 0x10, 0xcf, 0x10, 0x12, 0x1b, - 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x4e, 0x49, 0x43, 0x45, - 0x49, 0x44, 0x52, 0x45, 0x42, 0x49, 0x4e, 0x44, 0x10, 0xd0, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x50, 0x52, 0x4f, - 0x4d, 0x4f, 0x54, 0x45, 0x52, 0x10, 0xd1, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, - 0x45, 0x52, 0x10, 0xd2, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x45, 0x52, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x10, 0xd3, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x57, - 0x49, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x10, 0xd4, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, - 0x4c, 0x57, 0x49, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x10, 0xd5, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x61, 0x79, 0x41, 0x63, 0x74, 0x5f, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x10, 0xd6, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x4e, 0x49, 0x43, 0x4b, - 0x10, 0xdc, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, - 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x4e, 0x49, 0x43, 0x4b, 0x10, 0xdd, 0x10, 0x12, 0x19, - 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x49, 0x43, 0x4f, 0x4e, 0x10, 0xde, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x49, 0x43, 0x4f, - 0x4e, 0x10, 0xdf, 0x10, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x53, 0x45, 0x58, 0x10, 0xe0, 0x10, 0x12, 0x18, - 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x53, 0x45, 0x58, 0x10, 0xe1, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x41, 0x43, 0x43, - 0x4f, 0x55, 0x4e, 0x54, 0x10, 0xe2, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x41, 0x43, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x10, 0xe3, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x41, 0x4c, 0x49, 0x50, 0x41, 0x59, 0x10, 0xe4, - 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x42, - 0x49, 0x4e, 0x44, 0x41, 0x4c, 0x49, 0x50, 0x41, 0x59, 0x10, 0xe5, 0x10, 0x12, 0x17, 0x0a, 0x12, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x42, 0x41, - 0x4e, 0x4b, 0x10, 0xe6, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x42, 0x41, 0x4e, 0x4b, 0x10, 0xe7, 0x10, 0x12, 0x1b, - 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, - 0x45, 0x52, 0x4f, 0x50, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xe8, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, - 0x50, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xe9, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x50, 0x41, 0x53, 0x53, - 0x57, 0x4f, 0x52, 0x44, 0x10, 0xea, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x50, 0x41, 0x53, 0x53, 0x57, - 0x4f, 0x52, 0x44, 0x10, 0xeb, 0x10, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x43, 0x4f, 0x44, 0x45, 0x10, 0xec, 0x10, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xed, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x47, 0x41, 0x4d, 0x45, 0x43, 0x4f, 0x49, - 0x4e, 0x4c, 0x4f, 0x47, 0x10, 0xee, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x45, 0x54, 0x47, 0x41, 0x4d, 0x45, 0x43, 0x4f, 0x49, 0x4e, - 0x4c, 0x4f, 0x47, 0x10, 0xef, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x41, 0x46, 0x45, 0x42, 0x4f, 0x58, 0x43, 0x4f, - 0x49, 0x4e, 0x4c, 0x4f, 0x47, 0x10, 0xf0, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x41, 0x46, 0x45, 0x42, 0x4f, 0x58, - 0x43, 0x4f, 0x49, 0x4e, 0x4c, 0x4f, 0x47, 0x10, 0xf1, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, - 0x10, 0xf2, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, - 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x10, 0xf3, 0x10, 0x12, 0x1a, 0x0a, 0x15, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x4f, 0x55, - 0x54, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0xf4, 0x10, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x4f, 0x55, 0x54, 0x4c, 0x49, 0x4e, - 0x45, 0x10, 0xf5, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x5f, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xf6, 0x10, 0x12, - 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x49, 0x4e, 0x56, - 0x49, 0x54, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xf7, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x45, 0x42, 0x41, 0x50, 0x49, 0x5f, 0x50, - 0x4c, 0x41, 0x59, 0x45, 0x52, 0x50, 0x41, 0x53, 0x53, 0x10, 0xf8, 0x10, 0x12, 0x20, 0x0a, 0x1b, + 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd6, 0x0f, 0x12, 0x21, 0x0a, 0x1c, + 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x53, 0x61, 0x66, 0x65, 0x62, 0x6f, 0x78, 0x5f, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xd7, 0x0f, 0x12, + 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, + 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd8, 0x0f, 0x12, 0x1f, 0x0a, + 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xd9, 0x0f, 0x12, 0x1f, + 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x5f, + 0x41, 0x63, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x10, 0xda, 0x0f, 0x12, + 0x1e, 0x0a, 0x19, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, + 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xdb, 0x0f, 0x12, + 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, + 0x5f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, + 0xdc, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x42, + 0x61, 0x6e, 0x6b, 0x5f, 0x41, 0x63, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6c, 0x6c, 0x65, 0x67, + 0x61, 0x6c, 0x10, 0xdd, 0x0f, 0x12, 0x23, 0x0a, 0x1e, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, + 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xde, 0x0f, 0x12, 0x23, 0x0a, 0x1e, 0x4f, 0x50, + 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x41, 0x63, + 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x10, 0xdf, 0x0f, 0x12, + 0x22, 0x0a, 0x1d, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, + 0x61, 0x79, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x10, 0xe0, 0x0f, 0x12, 0x20, 0x0a, 0x1b, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, 0x64, + 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x10, 0xe1, 0x0f, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x49, 0x50, 0x5f, 0x54, 0x6f, 0x6f, 0x4d, 0x61, 0x6e, 0x79, + 0x52, 0x65, 0x67, 0x10, 0xe2, 0x0f, 0x12, 0x1d, 0x0a, 0x18, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, + 0x69, 0x6e, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x5f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x10, 0xe3, 0x0f, 0x12, 0x1f, 0x0a, 0x1a, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, + 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x10, 0xe4, 0x0f, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, + 0x61, 0x6e, 0x6b, 0x41, 0x6e, 0x64, 0x41, 0x6c, 0x69, 0x5f, 0x4e, 0x6f, 0x74, 0x53, 0x61, 0x6d, + 0x65, 0x10, 0xe5, 0x0f, 0x12, 0x27, 0x0a, 0x22, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x42, 0x69, 0x6e, + 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x41, 0x6c, 0x69, 0x70, 0x61, 0x79, 0x5f, 0x4e, 0x61, 0x6d, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0xe6, 0x0f, 0x12, 0x15, 0x0a, + 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4a, 0x79, 0x62, 0x5f, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x10, 0xb4, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4a, 0x79, 0x62, + 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x10, 0xb5, 0x10, 0x12, 0x15, 0x0a, + 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4a, 0x79, 0x62, 0x5f, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x72, + 0x72, 0x10, 0xb6, 0x10, 0x12, 0x15, 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x4a, 0x79, 0x62, + 0x5f, 0x43, 0x6f, 0x64, 0x65, 0x45, 0x72, 0x72, 0x10, 0xb7, 0x10, 0x12, 0x26, 0x0a, 0x21, 0x4f, + 0x50, 0x52, 0x43, 0x5f, 0x48, 0x75, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x5f, 0x59, 0x6f, 0x75, 0x48, + 0x61, 0x64, 0x42, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, + 0x10, 0xd9, 0x36, 0x12, 0x29, 0x0a, 0x24, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x48, 0x75, 0x6e, 0x64, + 0x72, 0x65, 0x64, 0x5f, 0x59, 0x6f, 0x75, 0x48, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x6b, 0x65, 0x72, + 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x10, 0xda, 0x36, 0x12, 0x1a, + 0x0a, 0x15, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x53, 0x74, 0x65, 0x70, + 0x5f, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x10, 0xc1, 0x3e, 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x50, + 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x53, 0x74, 0x65, 0x70, 0x5f, 0x46, 0x72, 0x6f, + 0x6e, 0x74, 0x10, 0xc2, 0x3e, 0x12, 0x17, 0x0a, 0x12, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, + 0x69, 0x64, 0x65, 0x53, 0x74, 0x65, 0x70, 0x5f, 0x45, 0x6e, 0x64, 0x10, 0xc3, 0x3e, 0x12, 0x15, + 0x0a, 0x10, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x5f, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x10, 0xc4, 0x3e, 0x12, 0x14, 0x0a, 0x0f, 0x4f, 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, + 0x69, 0x64, 0x65, 0x5f, 0x53, 0x6b, 0x69, 0x70, 0x10, 0xc5, 0x3e, 0x12, 0x19, 0x0a, 0x14, 0x4f, + 0x50, 0x52, 0x43, 0x5f, 0x47, 0x75, 0x69, 0x64, 0x65, 0x5f, 0x53, 0x6b, 0x69, 0x70, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x10, 0xc6, 0x3e, 0x2a, 0xef, 0x22, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, 0x10, + 0xb4, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, + 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, 0x10, 0xb5, 0x10, 0x12, 0x18, 0x0a, + 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x44, 0x41, 0x59, 0x43, 0x48, + 0x41, 0x4e, 0x47, 0x45, 0x10, 0xb6, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, + 0x44, 0x41, 0x54, 0x41, 0x10, 0xb7, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x54, 0x48, 0x49, 0x52, 0x44, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, + 0x44, 0x41, 0x54, 0x41, 0x10, 0xb8, 0x10, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, 0x55, + 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0xb9, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x44, 0x41, 0x54, 0x41, + 0x45, 0x58, 0x10, 0xba, 0x10, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x43, 0x53, 0x5f, 0x50, 0x4d, 0x43, 0x4d, 0x44, 0x10, 0xbb, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x52, 0x4f, 0x42, 0x4f, 0x54, 0x43, 0x48, + 0x47, 0x44, 0x41, 0x54, 0x41, 0x10, 0xbc, 0x10, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x57, 0x45, 0x43, 0x48, + 0x41, 0x54, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0xbd, 0x10, 0x12, 0x21, 0x0a, 0x1c, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x57, + 0x45, 0x43, 0x48, 0x41, 0x54, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0xbe, 0x10, 0x12, 0x17, + 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x41, 0x55, 0x54, 0x48, + 0x45, 0x4e, 0x49, 0x44, 0x10, 0xbf, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x49, 0x44, 0x10, 0xc0, 0x10, + 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x4a, 0x4f, + 0x49, 0x4e, 0x47, 0x41, 0x4d, 0x45, 0x10, 0xc1, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x4a, 0x4f, 0x49, 0x4e, 0x47, 0x41, 0x4d, 0x45, 0x10, + 0xc2, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x53, 0x50, 0x52, 0x45, 0x41, 0x44, 0x42, 0x49, 0x4e, 0x44, 0x10, 0xc3, 0x10, 0x12, 0x19, 0x0a, + 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x50, 0x52, 0x45, 0x41, + 0x44, 0x42, 0x49, 0x4e, 0x44, 0x10, 0xc4, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x4e, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x54, + 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0xc7, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x45, 0x4e, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x54, 0x4f, + 0x4b, 0x45, 0x4e, 0x10, 0xc8, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x4e, 0x45, 0x57, 0x4d, 0x53, 0x47, + 0x10, 0xc9, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, + 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x4e, 0x45, 0x57, 0x4d, 0x53, 0x47, 0x41, 0x43, 0x4b, + 0x10, 0xca, 0x10, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x53, 0x52, 0x56, 0x4d, 0x53, 0x47, 0x10, 0xcb, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x46, 0x49, 0x53, 0x48, 0x4a, 0x41, 0x43, 0x4b, + 0x50, 0x4f, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xcc, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x46, 0x49, 0x53, 0x48, 0x4a, 0x41, 0x43, 0x4b, + 0x50, 0x4f, 0x54, 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xcd, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x46, 0x49, 0x53, 0x48, 0x4a, 0x41, 0x43, 0x4b, + 0x50, 0x4f, 0x54, 0x44, 0x41, 0x54, 0x41, 0x10, 0xce, 0x10, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x46, 0x49, 0x53, 0x48, 0x4a, 0x41, 0x43, 0x4b, + 0x50, 0x4f, 0x54, 0x44, 0x41, 0x54, 0x41, 0x10, 0xcf, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x4e, 0x49, 0x43, 0x45, 0x49, 0x44, 0x52, 0x45, + 0x42, 0x49, 0x4e, 0x44, 0x10, 0xd0, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x45, + 0x52, 0x10, 0xd1, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x45, 0x52, 0x10, 0xd2, + 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x42, + 0x49, 0x4e, 0x44, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x45, 0x52, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x10, 0xd3, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, + 0x5f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x57, 0x49, 0x73, 0x4f, 0x70, + 0x65, 0x6e, 0x10, 0xd4, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x5f, 0x47, 0x65, 0x74, 0x53, 0x70, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x57, 0x49, 0x73, + 0x4f, 0x70, 0x65, 0x6e, 0x10, 0xd5, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x61, 0x79, 0x41, 0x63, 0x74, 0x5f, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x10, 0xd6, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x4e, 0x49, 0x43, 0x4b, 0x10, 0xdc, 0x10, 0x12, + 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, + 0x4e, 0x47, 0x45, 0x4e, 0x49, 0x43, 0x4b, 0x10, 0xdd, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x49, 0x43, + 0x4f, 0x4e, 0x10, 0xde, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x49, 0x43, 0x4f, 0x4e, 0x10, 0xdf, 0x10, + 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x48, + 0x41, 0x4e, 0x47, 0x45, 0x53, 0x45, 0x58, 0x10, 0xe0, 0x10, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x53, 0x45, + 0x58, 0x10, 0xe1, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x10, 0xe2, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, + 0xe3, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x42, 0x49, 0x4e, 0x44, 0x41, 0x4c, 0x49, 0x50, 0x41, 0x59, 0x10, 0xe4, 0x10, 0x12, 0x19, 0x0a, + 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x41, + 0x4c, 0x49, 0x50, 0x41, 0x59, 0x10, 0xe5, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x42, 0x49, 0x4e, 0x44, 0x42, 0x41, 0x4e, 0x4b, 0x10, 0xe6, + 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x42, + 0x49, 0x4e, 0x44, 0x42, 0x41, 0x4e, 0x4b, 0x10, 0xe7, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, + 0x43, 0x4f, 0x49, 0x4e, 0x10, 0xe8, 0x10, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x4f, 0x50, 0x43, 0x4f, 0x49, + 0x4e, 0x10, 0xe9, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, + 0x10, 0xea, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x10, + 0xeb, 0x10, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x43, 0x4f, 0x44, 0x45, + 0x10, 0xec, 0x10, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x43, 0x4f, 0x44, + 0x45, 0x10, 0xed, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x5f, 0x47, 0x45, 0x54, 0x47, 0x41, 0x4d, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x4c, 0x4f, 0x47, + 0x10, 0xee, 0x10, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x47, 0x45, 0x54, 0x47, 0x41, 0x4d, 0x45, 0x43, 0x4f, 0x49, 0x4e, 0x4c, 0x4f, 0x47, 0x10, + 0xef, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x47, 0x45, 0x54, 0x53, 0x41, 0x46, 0x45, 0x42, 0x4f, 0x58, 0x43, 0x4f, 0x49, 0x4e, 0x4c, 0x4f, + 0x47, 0x10, 0xf0, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x41, 0x46, 0x45, 0x42, 0x4f, 0x58, 0x43, 0x4f, 0x49, 0x4e, + 0x4c, 0x4f, 0x47, 0x10, 0xf1, 0x10, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x10, 0xf2, 0x10, 0x12, + 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x47, + 0x49, 0x53, 0x54, 0x45, 0x52, 0x10, 0xf3, 0x10, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x4f, 0x55, 0x54, 0x4c, 0x49, 0x4e, + 0x45, 0x10, 0xf4, 0x10, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x4f, 0x55, 0x54, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0xf5, 0x10, + 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x49, 0x4e, + 0x56, 0x49, 0x54, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xf6, 0x10, 0x12, 0x19, 0x0a, 0x14, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x45, 0x43, + 0x4f, 0x44, 0x45, 0x10, 0xf7, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x45, 0x42, 0x41, 0x50, 0x49, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, + 0x52, 0x50, 0x41, 0x53, 0x53, 0x10, 0xf8, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x57, 0x45, 0x42, 0x41, 0x50, 0x49, 0x5f, 0x50, 0x4c, 0x41, + 0x59, 0x45, 0x52, 0x50, 0x41, 0x53, 0x53, 0x10, 0xf9, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x45, 0x42, 0x41, 0x50, 0x49, 0x5f, 0x53, + 0x59, 0x53, 0x54, 0x45, 0x4d, 0x50, 0x41, 0x53, 0x53, 0x10, 0xfa, 0x10, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x57, 0x45, 0x42, 0x41, 0x50, 0x49, - 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x50, 0x41, 0x53, 0x53, 0x10, 0xf9, 0x10, 0x12, 0x20, - 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x57, 0x45, 0x42, 0x41, - 0x50, 0x49, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x50, 0x41, 0x53, 0x53, 0x10, 0xfa, 0x10, - 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x57, 0x45, - 0x42, 0x41, 0x50, 0x49, 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x50, 0x41, 0x53, 0x53, 0x10, - 0xfb, 0x10, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, - 0x47, 0x45, 0x54, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, - 0x44, 0x45, 0x10, 0xfc, 0x10, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x47, 0x45, 0x54, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x56, 0x45, 0x52, 0x49, 0x46, - 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xfd, 0x10, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, 0x56, - 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xfe, 0x10, 0x12, 0x22, 0x0a, 0x1d, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x4c, 0x49, - 0x44, 0x45, 0x52, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xff, 0x10, - 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x49, 0x4f, - 0x53, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x80, - 0x11, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x49, - 0x4f, 0x53, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x81, 0x11, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, - 0x51, 0x55, 0x45, 0x52, 0x59, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x10, 0x82, 0x11, 0x12, 0x1a, - 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x51, 0x55, 0x45, 0x52, - 0x59, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x10, 0x83, 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x44, 0x41, 0x54, 0x41, 0x4c, - 0x4f, 0x47, 0x10, 0x84, 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x47, 0x45, 0x54, 0x44, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x10, 0x85, 0x11, - 0x12, 0x23, 0x0a, 0x1e, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, - 0x41, 0x59, 0x45, 0x52, 0x52, 0x45, 0x43, 0x48, 0x41, 0x52, 0x47, 0x45, 0x41, 0x4e, 0x53, 0x57, - 0x45, 0x52, 0x10, 0x86, 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x87, 0x11, - 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, - 0x41, 0x59, 0x45, 0x52, 0x43, 0x4f, 0x49, 0x4e, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x88, - 0x11, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x54, - 0x52, 0x55, 0x53, 0x54, 0x45, 0x45, 0x53, 0x48, 0x49, 0x50, 0x54, 0x49, 0x50, 0x53, 0x10, 0x89, - 0x11, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, - 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x8a, 0x11, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x47, 0x41, 0x4d, 0x45, 0x45, 0x58, 0x44, 0x52, 0x4f, - 0x50, 0x49, 0x54, 0x45, 0x4d, 0x53, 0x10, 0x8b, 0x11, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x50, 0x42, 0x55, 0x59, 0x10, 0x8c, 0x11, - 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x56, 0x49, - 0x50, 0x42, 0x55, 0x59, 0x10, 0x8d, 0x11, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x44, 0x52, 0x41, 0x57, 0x56, 0x49, 0x50, 0x47, 0x49, 0x46, 0x54, - 0x10, 0x8e, 0x11, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, - 0x5f, 0x44, 0x52, 0x41, 0x57, 0x56, 0x49, 0x50, 0x47, 0x49, 0x46, 0x54, 0x10, 0x8f, 0x11, 0x12, - 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x50, - 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x90, 0x11, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x56, 0x49, 0x50, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x91, 0x11, 0x12, - 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x57, 0x45, - 0x4c, 0x46, 0x41, 0x52, 0x45, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x92, 0x11, 0x12, 0x1f, 0x0a, 0x1a, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x50, 0x50, 0x72, 0x69, - 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x93, 0x11, 0x12, 0x1f, 0x0a, - 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x56, 0x49, 0x50, 0x50, 0x72, - 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x94, 0x11, 0x12, 0x1b, - 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x41, 0x59, 0x47, - 0x4f, 0x4f, 0x44, 0x53, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x95, 0x11, 0x12, 0x17, 0x0a, 0x12, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x10, 0x96, 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x97, 0x11, 0x12, - 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x49, - 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x98, 0x11, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x50, 0x41, 0x53, - 0x53, 0x10, 0x99, 0x11, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x43, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x10, 0x9a, 0x11, 0x12, 0x1e, - 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x10, 0x9b, 0x11, 0x12, 0x1e, - 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x10, 0x9c, 0x11, 0x12, 0x16, - 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x48, 0x65, 0x61, 0x64, - 0x55, 0x72, 0x6c, 0x10, 0xf1, 0x15, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x53, 0x43, 0x5f, 0x48, 0x65, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x10, 0xf2, 0x15, 0x12, 0x1c, - 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x55, 0x6e, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x10, 0xf3, 0x15, 0x12, 0x20, 0x0a, 0x1b, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x55, 0x6e, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xf4, 0x15, 0x12, 0x1c, - 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x55, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x10, 0xf5, 0x15, 0x12, 0x1b, 0x0a, 0x16, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, - 0x4d, 0x53, 0x43, 0x6f, 0x64, 0x65, 0x10, 0xf6, 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x4d, 0x53, 0x43, - 0x6f, 0x64, 0x65, 0x10, 0xf7, 0x15, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x42, 0x69, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x10, 0xf8, 0x15, 0x12, 0x15, 0x0a, - 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x42, 0x69, 0x6e, 0x64, 0x54, 0x65, - 0x6c, 0x10, 0xf9, 0x15, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x42, 0x69, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xfa, 0x15, 0x12, - 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x42, 0x69, 0x6e, 0x64, - 0x54, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xfb, 0x15, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x42, 0x69, 0x6c, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x10, - 0xfc, 0x15, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x42, - 0x69, 0x6c, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xfd, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x53, 0x61, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xfe, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x53, 0x61, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x10, 0xff, 0x15, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x80, 0x16, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, - 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x81, 0x16, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, - 0x72, 0x79, 0x10, 0x82, 0x16, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x5f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x10, - 0x83, 0x16, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, - 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x10, 0x84, 0x16, 0x12, 0x11, 0x0a, 0x0c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x41, 0x44, 0x56, 0x10, 0x85, 0x16, 0x12, 0x11, 0x0a, 0x0c, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x41, 0x44, 0x56, 0x10, 0x86, 0x16, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x47, 0x65, 0x74, 0x57, 0x65, 0x65, 0x6b, 0x43, 0x61, - 0x72, 0x64, 0x41, 0x77, 0x61, 0x72, 0x79, 0x10, 0x87, 0x16, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x50, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x6b, 0x43, 0x6f, - 0x69, 0x6e, 0x10, 0x88, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x43, 0x53, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x10, 0x89, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, - 0x43, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x10, 0x8a, 0x16, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, - 0x53, 0x4d, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x8b, 0x16, 0x12, 0x17, 0x0a, 0x12, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x53, 0x4d, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x10, 0x8c, 0x16, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x43, 0x53, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, - 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x8d, 0x16, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, - 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x8e, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, - 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x10, 0x8f, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, - 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x10, 0x90, 0x16, 0x12, 0x26, 0x0a, 0x21, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, - 0x74, 0x65, 0x72, 0x79, 0x4c, 0x75, 0x63, 0x6b, 0x79, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x91, - 0x16, 0x12, 0x26, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x44, 0x69, - 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c, 0x75, 0x63, 0x6b, - 0x79, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x92, 0x16, 0x12, 0x12, 0x0a, 0x0d, 0x50, 0x41, 0x43, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x49, 0x74, 0x65, 0x6d, 0x10, 0x93, 0x16, 0x12, 0x16, 0x0a, - 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x41, 0x77, 0x61, 0x72, 0x64, 0x4c, - 0x6f, 0x67, 0x10, 0x94, 0x16, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x43, 0x41, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x6f, 0x67, 0x10, 0x95, 0x16, 0x12, 0x20, 0x0a, - 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x50, 0x6f, 0x70, 0x55, 0x70, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x96, 0x16, 0x12, - 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x50, 0x6f, 0x70, 0x55, - 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x97, - 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x10, 0x98, 0x16, - 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x10, 0x99, 0x16, 0x12, - 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x47, 0x75, 0x69, 0x64, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x9a, 0x16, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x10, 0x9b, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, - 0x53, 0x43, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x67, - 0x10, 0x9c, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, - 0x43, 0x6c, 0x61, 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x67, 0x10, - 0x9d, 0x16, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x44, - 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x9e, 0x16, 0x12, 0x18, 0x0a, 0x13, - 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x44, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x10, 0x9f, 0x16, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x43, 0x53, 0x50, 0x6f, 0x70, 0x55, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x10, 0xa0, 0x16, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x53, 0x43, 0x50, 0x6f, 0x70, 0x55, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0xa1, 0x16, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, - 0x45, 0x54, 0x5f, 0x43, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x64, 0x65, - 0x10, 0xa2, 0x16, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x64, 0x65, 0x10, 0xa3, 0x16, 0x42, 0x26, - 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x50, 0x41, 0x53, 0x53, 0x10, 0xfb, 0x10, 0x12, 0x21, + 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x49, + 0x4d, 0x41, 0x47, 0x45, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xfc, + 0x10, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, + 0x45, 0x54, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, + 0x45, 0x10, 0xfd, 0x10, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, 0x56, 0x45, 0x52, 0x49, 0x46, + 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xfe, 0x10, 0x12, 0x22, 0x0a, 0x1d, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, 0x45, 0x54, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, 0x56, + 0x45, 0x52, 0x49, 0x46, 0x59, 0x43, 0x4f, 0x44, 0x45, 0x10, 0xff, 0x10, 0x12, 0x1f, 0x0a, 0x1a, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x49, 0x4f, 0x53, 0x49, 0x4e, 0x53, + 0x54, 0x41, 0x4c, 0x4c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x80, 0x11, 0x12, 0x1f, 0x0a, + 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x49, 0x4f, 0x53, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x81, 0x11, 0x12, 0x1a, + 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x51, 0x55, 0x45, 0x52, + 0x59, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x10, 0x82, 0x11, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x50, 0x4c, 0x41, + 0x59, 0x45, 0x52, 0x10, 0x83, 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x47, 0x45, 0x54, 0x44, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x10, 0x84, + 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x47, + 0x45, 0x54, 0x44, 0x41, 0x54, 0x41, 0x4c, 0x4f, 0x47, 0x10, 0x85, 0x11, 0x12, 0x23, 0x0a, 0x1e, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, + 0x52, 0x45, 0x43, 0x48, 0x41, 0x52, 0x47, 0x45, 0x41, 0x4e, 0x53, 0x57, 0x45, 0x52, 0x10, 0x86, + 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, + 0x4c, 0x41, 0x59, 0x45, 0x52, 0x46, 0x4c, 0x41, 0x47, 0x10, 0x87, 0x11, 0x12, 0x1f, 0x0a, 0x1a, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, + 0x43, 0x4f, 0x49, 0x4e, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x88, 0x11, 0x12, 0x1e, 0x0a, + 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, + 0x45, 0x45, 0x53, 0x48, 0x49, 0x50, 0x54, 0x49, 0x50, 0x53, 0x10, 0x89, 0x11, 0x12, 0x17, 0x0a, + 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x54, 0x54, + 0x49, 0x4e, 0x47, 0x10, 0x8a, 0x11, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x47, 0x41, 0x4d, 0x45, 0x45, 0x58, 0x44, 0x52, 0x4f, 0x50, 0x49, 0x54, 0x45, + 0x4d, 0x53, 0x10, 0x8b, 0x11, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x43, 0x53, 0x5f, 0x56, 0x49, 0x50, 0x42, 0x55, 0x59, 0x10, 0x8c, 0x11, 0x12, 0x15, 0x0a, 0x10, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x56, 0x49, 0x50, 0x42, 0x55, 0x59, + 0x10, 0x8d, 0x11, 0x12, 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, + 0x5f, 0x44, 0x52, 0x41, 0x57, 0x56, 0x49, 0x50, 0x47, 0x49, 0x46, 0x54, 0x10, 0x8e, 0x11, 0x12, + 0x1a, 0x0a, 0x15, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x44, 0x52, 0x41, + 0x57, 0x56, 0x49, 0x50, 0x47, 0x49, 0x46, 0x54, 0x10, 0x8f, 0x11, 0x12, 0x16, 0x0a, 0x11, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x50, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0x90, 0x11, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x56, 0x49, 0x50, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x91, 0x11, 0x12, 0x1b, 0x0a, 0x16, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x53, 0x57, 0x45, 0x4c, 0x46, 0x41, 0x52, + 0x45, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x92, 0x11, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x56, 0x49, 0x50, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x93, 0x11, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x56, 0x49, 0x50, 0x50, 0x72, 0x69, 0x76, 0x69, 0x6c, + 0x65, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x94, 0x11, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x41, 0x59, 0x47, 0x4f, 0x4f, 0x44, 0x53, + 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x95, 0x11, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x96, 0x11, + 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x43, 0x4c, + 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x97, 0x11, 0x12, 0x19, 0x0a, 0x14, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, + 0x4c, 0x4f, 0x47, 0x10, 0x98, 0x11, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x10, 0x99, 0x11, + 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x48, 0x54, + 0x54, 0x50, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x10, 0x9a, 0x11, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x10, 0x9b, 0x11, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x10, 0x9c, 0x11, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x48, 0x65, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x10, + 0xf1, 0x15, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, + 0x48, 0x65, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x10, 0xf2, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x55, 0x6e, + 0x50, 0x6f, 0x77, 0x65, 0x72, 0x10, 0xf3, 0x15, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x55, 0x6e, 0x50, 0x6f, + 0x77, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xf4, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x55, 0x70, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x10, 0xf5, 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x43, 0x53, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x4d, 0x53, 0x43, 0x6f, + 0x64, 0x65, 0x10, 0xf6, 0x15, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x4d, 0x53, 0x43, 0x6f, 0x64, 0x65, 0x10, + 0xf7, 0x15, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x42, + 0x69, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x10, 0xf8, 0x15, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x42, 0x69, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x10, 0xf9, 0x15, + 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x42, 0x69, 0x6e, + 0x64, 0x54, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xfa, 0x15, 0x12, 0x19, 0x0a, 0x14, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x42, 0x69, 0x6e, 0x64, 0x54, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x10, 0xfb, 0x15, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x42, 0x69, 0x6c, 0x6c, 0x4c, 0x69, 0x73, 0x74, 0x10, 0xfc, 0x15, 0x12, 0x16, + 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x42, 0x69, 0x6c, 0x6c, 0x4c, + 0x69, 0x73, 0x74, 0x10, 0xfd, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x43, 0x53, 0x53, 0x61, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, + 0x6f, 0x10, 0xfe, 0x15, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x53, 0x61, 0x76, 0x65, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x10, + 0xff, 0x15, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, + 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x10, 0x80, 0x16, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x5f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x10, 0x81, 0x16, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x5f, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x10, 0x82, + 0x16, 0x12, 0x1b, 0x0a, 0x16, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, + 0x68, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x10, 0x83, 0x16, 0x12, 0x20, + 0x0a, 0x1b, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x5f, 0x50, 0x68, 0x6f, 0x6e, + 0x65, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x10, 0x84, 0x16, + 0x12, 0x11, 0x0a, 0x0c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x41, 0x44, 0x56, + 0x10, 0x85, 0x16, 0x12, 0x11, 0x0a, 0x0c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x41, 0x44, 0x56, 0x10, 0x86, 0x16, 0x12, 0x1e, 0x0a, 0x19, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x47, 0x65, 0x74, 0x57, 0x65, 0x65, 0x6b, 0x43, 0x61, 0x72, 0x64, 0x41, 0x77, + 0x61, 0x72, 0x79, 0x10, 0x87, 0x16, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x50, 0x69, 0x67, 0x42, 0x61, 0x6e, 0x6b, 0x43, 0x6f, 0x69, 0x6e, 0x10, 0x88, + 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x45, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x10, 0x89, 0x16, + 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x45, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x10, 0x8a, 0x16, 0x12, + 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x53, 0x4d, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x8b, 0x16, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x53, 0x4d, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x8c, + 0x16, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x44, + 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x10, 0x8d, 0x16, 0x12, 0x21, 0x0a, 0x1c, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, + 0x43, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x8e, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x43, 0x53, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, + 0x65, 0x72, 0x79, 0x10, 0x8f, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x5f, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, + 0x72, 0x79, 0x10, 0x90, 0x16, 0x12, 0x26, 0x0a, 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x43, 0x53, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, + 0x4c, 0x75, 0x63, 0x6b, 0x79, 0x41, 0x77, 0x61, 0x72, 0x64, 0x10, 0x91, 0x16, 0x12, 0x26, 0x0a, + 0x21, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x44, 0x69, 0x61, 0x6d, 0x6f, 0x6e, + 0x64, 0x4c, 0x6f, 0x74, 0x74, 0x65, 0x72, 0x79, 0x4c, 0x75, 0x63, 0x6b, 0x79, 0x41, 0x77, 0x61, + 0x72, 0x64, 0x10, 0x92, 0x16, 0x12, 0x12, 0x0a, 0x0d, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, + 0x53, 0x43, 0x49, 0x74, 0x65, 0x6d, 0x10, 0x93, 0x16, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x41, 0x77, 0x61, 0x72, 0x64, 0x4c, 0x6f, 0x67, 0x10, 0x94, + 0x16, 0x12, 0x16, 0x0a, 0x11, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x41, 0x77, + 0x61, 0x72, 0x64, 0x4c, 0x6f, 0x67, 0x10, 0x95, 0x16, 0x12, 0x20, 0x0a, 0x1b, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x50, 0x6f, 0x70, 0x55, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x96, 0x16, 0x12, 0x20, 0x0a, 0x1b, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x50, 0x6f, 0x70, 0x55, 0x70, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x97, 0x16, 0x12, 0x1d, 0x0a, + 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x10, 0x98, 0x16, 0x12, 0x1d, 0x0a, 0x18, + 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x10, 0x99, 0x16, 0x12, 0x19, 0x0a, 0x14, 0x50, + 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x47, 0x75, 0x69, 0x64, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x10, 0x9a, 0x16, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x53, 0x43, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x9b, 0x16, + 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x43, 0x6c, 0x61, + 0x77, 0x64, 0x6f, 0x6c, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x67, 0x10, 0x9c, 0x16, 0x12, + 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x43, 0x6c, 0x61, 0x77, + 0x64, 0x6f, 0x6c, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x67, 0x10, 0x9d, 0x16, 0x12, 0x18, + 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x44, 0x6f, 0x6c, 0x6c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x9e, 0x16, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x41, 0x43, 0x4b, + 0x45, 0x54, 0x5f, 0x53, 0x43, 0x44, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, + 0x9f, 0x16, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x50, + 0x6f, 0x70, 0x55, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x10, 0xa0, 0x16, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, + 0x50, 0x6f, 0x70, 0x55, 0x70, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x10, 0xa1, 0x16, 0x12, 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, + 0x53, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x75, 0x69, 0x64, 0x65, 0x10, 0xa2, 0x16, 0x12, + 0x19, 0x0a, 0x14, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x47, 0x75, 0x69, 0x64, 0x65, 0x10, 0xa3, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x53, 0x68, + 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xa4, 0x16, 0x12, 0x1d, 0x0a, 0x18, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x43, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x53, 0x68, 0x6f, + 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0xa5, 0x16, 0x42, 0x26, 0x5a, 0x24, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -13374,7 +13476,7 @@ func file_protocol_player_player_proto_rawDescGZIP() []byte { } var file_protocol_player_player_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_protocol_player_player_proto_msgTypes = make([]protoimpl.MessageInfo, 178) +var file_protocol_player_player_proto_msgTypes = make([]protoimpl.MessageInfo, 180) var file_protocol_player_player_proto_goTypes = []interface{}{ (OpResultCode)(0), // 0: player.OpResultCode (PlayerPacketID)(0), // 1: player.PlayerPacketID @@ -13546,28 +13648,30 @@ var file_protocol_player_player_proto_goTypes = []interface{}{ (*CSPopUpWindowConfig)(nil), // 167: player.CSPopUpWindowConfig (*SCPopUpWindowConfig)(nil), // 168: player.SCPopUpWindowConfig (*PopUpWindowInfo)(nil), // 169: player.PopUpWindowInfo - nil, // 170: player.PlayerData.RankScoreEntry - nil, // 171: player.PlayerData.GuideDataEntry - nil, // 172: player.SCPlayerDataUpdate.RankScoreEntry - nil, // 173: player.SCGameExDropItems.ItemsEntry - nil, // 174: player.SCVIPDraw.AwardEntry - nil, // 175: player.VIPcfg.Privilege1Entry - nil, // 176: player.VIPcfg.Privilege9Entry - nil, // 177: player.SCBindTelInfo.BindTelRewardEntry - nil, // 178: player.Config.MapEntry - nil, // 179: player.Config.MapStrEntry - (*server.DB_GameItem)(nil), // 180: server.DB_GameItem + (*CSGetSwapShopInfo)(nil), // 170: player.CSGetSwapShopInfo + (*SCGetSwapShopInfo)(nil), // 171: player.SCGetSwapShopInfo + nil, // 172: player.PlayerData.RankScoreEntry + nil, // 173: player.PlayerData.GuideDataEntry + nil, // 174: player.SCPlayerDataUpdate.RankScoreEntry + nil, // 175: player.SCGameExDropItems.ItemsEntry + nil, // 176: player.SCVIPDraw.AwardEntry + nil, // 177: player.VIPcfg.Privilege1Entry + nil, // 178: player.VIPcfg.Privilege9Entry + nil, // 179: player.SCBindTelInfo.BindTelRewardEntry + nil, // 180: player.Config.MapEntry + nil, // 181: player.Config.MapStrEntry + (*server.DB_GameItem)(nil), // 182: server.DB_GameItem } var file_protocol_player_player_proto_depIdxs = []int32{ 4, // 0: player.SCBillList.Items:type_name -> player.BillItem 0, // 1: player.SCSavePlayerInfo.OpRetCode:type_name -> player.OpResultCode - 170, // 2: player.PlayerData.RankScore:type_name -> player.PlayerData.RankScoreEntry + 172, // 2: player.PlayerData.RankScore:type_name -> player.PlayerData.RankScoreEntry 9, // 3: player.PlayerData.WeekCard:type_name -> player.WeekInfo - 171, // 4: player.PlayerData.GuideData:type_name -> player.PlayerData.GuideDataEntry + 173, // 4: player.PlayerData.GuideData:type_name -> player.PlayerData.GuideDataEntry 0, // 5: player.SCPlayerData.OpRetCode:type_name -> player.OpResultCode 8, // 6: player.SCPlayerData.Data:type_name -> player.PlayerData 10, // 7: player.SCPlayerData.MiniGameArr:type_name -> player.MiniGameInfo - 172, // 8: player.SCPlayerDataUpdate.RankScore:type_name -> player.SCPlayerDataUpdate.RankScoreEntry + 174, // 8: player.SCPlayerDataUpdate.RankScore:type_name -> player.SCPlayerDataUpdate.RankScoreEntry 8, // 9: player.SCThirdPlayerData.Data:type_name -> player.PlayerData 0, // 10: player.SCChangeNick.OpRetCode:type_name -> player.OpResultCode 0, // 11: player.SCChangePassword.OpRetCode:type_name -> player.OpResultCode @@ -13604,19 +13708,19 @@ var file_protocol_player_player_proto_depIdxs = []int32{ 93, // 42: player.JybInfoAward.ItemId:type_name -> player.ItemInfo 0, // 43: player.SCPlayerSetting.OpRetCode:type_name -> player.OpResultCode 94, // 44: player.SCPlayerSetting.GainItem:type_name -> player.JybInfoAward - 173, // 45: player.SCGameExDropItems.Items:type_name -> player.SCGameExDropItems.ItemsEntry + 175, // 45: player.SCGameExDropItems.Items:type_name -> player.SCGameExDropItems.ItemsEntry 0, // 46: player.SCVIPBuy.OpRetCode:type_name -> player.OpResultCode 0, // 47: player.SCVIPDraw.OpRetCode:type_name -> player.OpResultCode - 174, // 48: player.SCVIPDraw.Award:type_name -> player.SCVIPDraw.AwardEntry + 176, // 48: player.SCVIPDraw.Award:type_name -> player.SCVIPDraw.AwardEntry 93, // 49: player.VIPcfg.Item:type_name -> player.ItemInfo - 175, // 50: player.VIPcfg.Privilege1:type_name -> player.VIPcfg.Privilege1Entry + 177, // 50: player.VIPcfg.Privilege1:type_name -> player.VIPcfg.Privilege1Entry 93, // 51: player.VIPcfg.Privilege7:type_name -> player.ItemInfo - 176, // 52: player.VIPcfg.Privilege9:type_name -> player.VIPcfg.Privilege9Entry + 178, // 52: player.VIPcfg.Privilege9:type_name -> player.VIPcfg.Privilege9Entry 0, // 53: player.SCVIPInfo.OpRetCode:type_name -> player.OpResultCode 103, // 54: player.SCVIPInfo.List:type_name -> player.VIPcfg 108, // 55: player.SCPayGoodsInfo.Item:type_name -> player.PayItem 0, // 56: player.SCClientLog.OpRetCode:type_name -> player.OpResultCode - 177, // 57: player.SCBindTelInfo.BindTelReward:type_name -> player.SCBindTelInfo.BindTelRewardEntry + 179, // 57: player.SCBindTelInfo.BindTelReward:type_name -> player.SCBindTelInfo.BindTelRewardEntry 0, // 58: player.SCPlayerSMSCode.Code:type_name -> player.OpResultCode 0, // 59: player.SCBindTel.Code:type_name -> player.OpResultCode 0, // 60: player.SCHttpPass.OpRetCode:type_name -> player.OpResultCode @@ -13629,7 +13733,7 @@ var file_protocol_player_player_proto_depIdxs = []int32{ 128, // 67: player.SCDiamondLotteryInfo.Item:type_name -> player.LotteryItem 128, // 68: player.SCDiamondLottery.Item:type_name -> player.LotteryItem 128, // 69: player.SCDiamondLotteryLuckyAward.Item:type_name -> player.LotteryItem - 180, // 70: player.SCItem.Items:type_name -> server.DB_GameItem + 182, // 70: player.SCItem.Items:type_name -> server.DB_GameItem 149, // 71: player.SCAwardLog.AwardLog:type_name -> player.AwardLogData 151, // 72: player.SCAwardLog.AnnouncerLog:type_name -> player.AnnouncerLogInfo 150, // 73: player.AwardLogData.AwardLog:type_name -> player.AwardLogInfo @@ -13637,8 +13741,8 @@ var file_protocol_player_player_proto_depIdxs = []int32{ 0, // 75: player.SCUpdateAttribute.OpRetCode:type_name -> player.OpResultCode 158, // 76: player.SCGuideConfig.Info:type_name -> player.GuideInfo 93, // 77: player.GuideInfo.Awards:type_name -> player.ItemInfo - 178, // 78: player.Config.Map:type_name -> player.Config.MapEntry - 179, // 79: player.Config.MapStr:type_name -> player.Config.MapStrEntry + 180, // 78: player.Config.Map:type_name -> player.Config.MapEntry + 181, // 79: player.Config.MapStr:type_name -> player.Config.MapStrEntry 159, // 80: player.SCDataConfig.Cfg:type_name -> player.Config 163, // 81: player.SCClawdollItemLog.ItemLogs:type_name -> player.ClawdollItemLogData 166, // 82: player.SCCLAWDOLLConfig.Info:type_name -> player.MachineInfo @@ -15672,6 +15776,30 @@ func file_protocol_player_player_proto_init() { return nil } } + file_protocol_player_player_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CSGetSwapShopInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protocol_player_player_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SCGetSwapShopInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -15679,7 +15807,7 @@ func file_protocol_player_player_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protocol_player_player_proto_rawDesc, NumEnums: 2, - NumMessages: 178, + NumMessages: 180, NumExtensions: 0, NumServices: 0, }, diff --git a/protocol/player/player.proto b/protocol/player/player.proto index 6a174c0..1501d66 100644 --- a/protocol/player/player.proto +++ b/protocol/player/player.proto @@ -240,6 +240,8 @@ enum PlayerPacketID { PACKET_SCPopUpWindowConfig = 2849; //返回弹窗配置 PACKET_CSUpdateGuide = 2850; //更新引导 PACKET_SCUpdateGuide = 2851; //更新引导 + PACKET_CSGetSwapShopInfo = 2852; // 请求兑换商城信息 + PACKET_SCGetSwapShopInfo = 2853; // 返回兑换商城信息 } // 账变记录 @@ -1439,4 +1441,13 @@ message PopUpWindowInfo{ string Key = 3; int32 OpenStatus = 4;//1-开启 0-关闭 int32 Weight = 5;//弹窗权重 +} + +// 获取兑换商城网页地址 +// PACKET_CSGetSwapShopInfo +message CSGetSwapShopInfo{ +} +// PACKET_SCGetSwapShopInfo +message SCGetSwapShopInfo{ + string Url = 1; } \ No newline at end of file diff --git a/util/balancequeue/queue.go b/util/balancequeue/queue.go new file mode 100644 index 0000000..b31465a --- /dev/null +++ b/util/balancequeue/queue.go @@ -0,0 +1,136 @@ +package balancequeue + +import ( + "fmt" + "strings" +) + +// 平衡队列 + +type Element interface { + BalanceQueueHandler() +} + +type elementWrapper struct { + F func() +} + +func (e *elementWrapper) BalanceQueueHandler() { + e.F() +} + +func ElementWrapper(f func()) Element { + return &elementWrapper{F: f} +} + +type group struct { + Array []Element + queuePos int +} + +type groupArray struct { + queue []*group +} + +type BalanceQueue struct { + index int // 循环索引 + groups []*group // 固定的分组,长度不变,每次Update触发一个分组 + tables []*groupArray + pool map[Element]*group +} + +// New 创建一个平衡队列 +// groupNumber 分组数量 +func New(groupNumber int) *BalanceQueue { + ret := &BalanceQueue{ + groups: make([]*group, groupNumber), + tables: make([]*groupArray, 10), // 本身会自动扩容,初始值不是很重要 + pool: make(map[Element]*group), + } + + for i := 0; i < len(ret.tables); i++ { + ret.tables[i] = &groupArray{} + } + // 初始化平衡数组,所有平衡队列容量为0 + for i := 0; i < len(ret.groups); i++ { + ret.groups[i] = &group{queuePos: i} + ret.tables[0].queue = append(ret.tables[0].queue, ret.groups[i]) + } + return ret +} + +func (q *BalanceQueue) String() string { + buf := strings.Builder{} + buf.WriteString("BalanceQueue:\n") + buf.WriteString(fmt.Sprintf("分组数量: %v\n", len(q.groups))) + for k, v := range q.tables { + buf.WriteString(fmt.Sprintf("元素数量%v: 组数量%v ==>", k, len(v.queue))) + for _, vv := range v.queue { + buf.WriteString(fmt.Sprintf("%v ", len(vv.Array))) + } + buf.WriteString("\n") + } + return buf.String() +} + +func (q *BalanceQueue) Update() { + if q.index == len(q.groups) { + q.index = 0 + } + for _, v := range q.groups[q.index].Array { + v.BalanceQueueHandler() + } + q.index++ +} + +func (q *BalanceQueue) Push(e Element) { + if e == nil { + return + } + + if _, ok := q.pool[e]; ok { + return + } + + for k, v := range q.tables { + size := len(v.queue) + if size == 0 { + continue + } + + arr := v.queue[size-1] + if k+1 >= len(q.tables) { + q.tables = append(q.tables, &groupArray{}) + } + q.tables[k+1].queue = append(q.tables[k+1].queue, arr) + q.tables[k].queue = v.queue[:size-1] + arr.queuePos = len(q.tables[k+1].queue) - 1 + arr.Array = append(arr.Array, e) + q.pool[e] = arr + return + } + return +} + +func (q *BalanceQueue) Pop(e Element) { + group, ok := q.pool[e] + if !ok { + return + } + delete(q.pool, e) + count := len(group.Array) + for i := 0; i < count; i++ { + if group.Array[i] == e { + group.Array[i] = group.Array[count-1] + group.Array = group.Array[:count-1] + bqPos := group.queuePos + queCount := len(q.tables[count].queue) + q.tables[count].queue[bqPos] = q.tables[count].queue[queCount-1] + q.tables[count].queue[bqPos].queuePos = bqPos + q.tables[count].queue = q.tables[count].queue[:queCount-1] + q.tables[count-1].queue = append(q.tables[count-1].queue, group) + group.queuePos = len(q.tables[count-1].queue) - 1 + return + } + } +} diff --git a/util/balancequeue/queue_test.go b/util/balancequeue/queue_test.go new file mode 100644 index 0000000..927fa16 --- /dev/null +++ b/util/balancequeue/queue_test.go @@ -0,0 +1,40 @@ +package balancequeue + +import ( + "fmt" + "math/rand" + "testing" + "time" +) + +type A struct { + Name string +} + +func (a *A) BalanceQueueHandler() { + +} + +func TestOne(t *testing.T) { + q := New(5) + + var es []Element + go func() { + for { + q.Update() + fmt.Println(q) + time.Sleep(time.Second) + e := &A{Name: fmt.Sprint(time.Now().Unix())} + es = append(es, e) + q.Push(e) + if rand.Intn(10) > 5 && len(es) >= 2 { + for _, v := range es[:2] { + q.Pop(v) + } + es = es[2:] + } + } + }() + + time.Sleep(time.Minute) +} diff --git a/worldsrv/action_bag.go b/worldsrv/action_bag.go index 61b4d8f..d88eaa8 100644 --- a/worldsrv/action_bag.go +++ b/worldsrv/action_bag.go @@ -24,7 +24,7 @@ import ( func CSBagInfo(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSBagInfoHandler Process recv ", data) if msg, ok := data.(*bag.CSBagInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSBagInfoHandler p == nil") return nil @@ -62,7 +62,7 @@ func CSUpBagInfo(s *netlib.Session, packetid int, data interface{}, sid int64) e return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSUpBagInfoHandler p == nil") return nil @@ -463,7 +463,7 @@ func CSExchangeList(s *netlib.Session, packetid int, data interface{}, sid int64 return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -508,7 +508,7 @@ func CSPropExchange(s *netlib.Session, packetid int, data interface{}, sid int64 return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -605,7 +605,7 @@ func CSDollChange(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -654,7 +654,7 @@ func CSDollChange(s *netlib.Session, packetid int, data interface{}, sid int64) // 兑换娃娃记录 func CSDollChangeLog(s *netlib.Session, packetid int, data interface{}, sid int64) error { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } diff --git a/worldsrv/action_chat.go b/worldsrv/action_chat.go index 4c5f111..9f41305 100644 --- a/worldsrv/action_chat.go +++ b/worldsrv/action_chat.go @@ -18,7 +18,7 @@ import ( func CSChatMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSChatMsgHandler Process recv ", data) if msg, ok := data.(*chat.CSChatMsg); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSChatMsgHandler p == nil") return nil @@ -107,7 +107,7 @@ func CSChatMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int func CSGetChatLogHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetChatLogHandler Process recv ", data) if msg, ok := data.(*chat.CSGetChatLog); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSGetChatLogHandler p == nil") return nil @@ -265,7 +265,7 @@ func CSGetChatLogHandler(s *netlib.Session, packetid int, data interface{}, sid func CSReadChatMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSReadChatMsgHandler Process recv ", data) if msg, ok := data.(*chat.CSReadChatMsg); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSReadChatMsgHandler p == nil") return nil @@ -288,7 +288,7 @@ func CSReadChatMsgHandler(s *netlib.Session, packetid int, data interface{}, sid func CSShieldMsgHandler(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSShieldMsgHandler Process recv ", data) if msg, ok := data.(*chat.CSShieldMsg); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSShieldMsgHandler p == nil") return nil diff --git a/worldsrv/action_coinscene.go b/worldsrv/action_coinscene.go index 02f866b..2402570 100644 --- a/worldsrv/action_coinscene.go +++ b/worldsrv/action_coinscene.go @@ -22,7 +22,7 @@ func (this *CSCoinSceneGetPlayerNumPacketFactory) CreatePacket() interface{} { func (this *CSCoinSceneGetPlayerNumHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSCoinSceneGetPlayerNumHandler Process recv ", data) if msg, ok := data.(*gamehall.CSCoinSceneGetPlayerNum); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil { nums := CoinSceneMgrSingleton.GetPlayerNums(p, msg.GetGameId(), msg.GetGameModel()) pack := &gamehall.SCCoinSceneGetPlayerNum{ @@ -48,7 +48,7 @@ func (this *CSCoinSceneGetPlayerNumHandler) Process(s *netlib.Session, packetid //func (this *CSCoinSceneOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSCoinSceneOpHandler Process recv ", data) // if msg, ok := data.(*gamehall.CSCoinSceneOp); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p != nil { // var ret gamehall.OpResultCode // pack := &gamehall.SCCoinSceneOp{ @@ -271,7 +271,7 @@ func (this *CSCoinSceneGetPlayerNumHandler) Process(s *netlib.Session, packetid //func (this *CSCoinSceneListRoomHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSCoinSceneListRoomHandler Process recv ", data) // if msg, ok := data.(*gamehall.CSCoinSceneListRoom); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p != nil { // if !CoinSceneMgrSingleton.ListRooms(p, msg.GetId()) { // 场次id // pack := &gamehall.SCCoinSceneListRoom{ diff --git a/worldsrv/action_friend.go b/worldsrv/action_friend.go index 79b9367..c6fa651 100644 --- a/worldsrv/action_friend.go +++ b/worldsrv/action_friend.go @@ -15,6 +15,7 @@ import ( "mongo.games.com/game/model" "mongo.games.com/game/proto" "mongo.games.com/game/protocol/friend" + "mongo.games.com/game/protocol/welfare" "mongo.games.com/game/srvdata" ) @@ -32,7 +33,7 @@ func (this *CSFriendListPacketFactory) CreatePacket() interface{} { func (this *CSFriendListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSFriendListHandler Process recv ", data) if msg, ok := data.(*friend.CSFriendList); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSFriendListHandler p == nil") return nil @@ -150,7 +151,7 @@ func (this *CSFriendOpPacketFactory) CreatePacket() interface{} { func (this *CSFriendOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSFriendOpHandler Process recv ", data) if msg, ok := data.(*friend.CSFriendOp); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSFriendOpHandler p == nil") return nil @@ -225,7 +226,7 @@ func (this *CSQueryPlayerGameLogPacketFactory) CreatePacket() interface{} { func (this *CSQueryPlayerGameLogHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSQueryPlayerGameLogHandler Process recv ", data) if msg, ok := data.(*friend.CSQueryPlayerGameLog); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSQueryPlayerGameLogHandler p == nil") return nil @@ -278,7 +279,7 @@ func (this *CSInviteFriendPacketFactory) CreatePacket() interface{} { func (this *CSInviteFriendHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSInviteFriendHandler Process recv ", data) if msg, ok := data.(*friend.CSInviteFriend); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSInviteFriendHandler p == nil") return nil @@ -396,7 +397,7 @@ func (this *CSInviteFriendOpPacketFactory) CreatePacket() interface{} { func (this *CSInviteFriendOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSInviteFriendOpHandler Process recv ", data) if msg, ok := data.(*friend.CSInviteFriendOp); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSInviteFriendOpHandler p == nil") return nil @@ -596,11 +597,35 @@ func (this *CSFuzzyQueryPlayerPacketFactory) CreatePacket() interface{} { func (this *CSFuzzyQueryPlayerHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSFuzzyQueryPlayerHandler Process recv ", data) if msg, ok := data.(*friend.CSFuzzyQueryPlayer); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSFuzzyQueryPlayerHandler p == nil") return nil } + + pack2 := &welfare.NotifyLotteryAward{ + Info: &welfare.LotteryInfo{ + Id: 45, + StartTs: time.Now().Unix(), + Index: int32(5), + Award: []*welfare.PropInfo{ + { + ItemId: 100001, + ItemNum: 100, + }, + }, + SnId: p.SnId, + Name: p.Name, + RoleId: p.Roles.ModId, + Price: 1000, + WinCode: "123456", + }, + } + + // 广播中奖结果 + PlayerMgrSington.BroadcastMessageToPlatform(p.Platform, int(welfare.SPacketID_PACKET_NotifyLotteryAward), pack2) + logger.Logger.Tracef("广播中奖信息: %v", pack2) + queryContent := msg.GetQueryContent() if utf8.RuneCountInString(queryContent) < 3 { return nil diff --git a/worldsrv/action_game.go b/worldsrv/action_game.go index 5903580..5efa1a1 100644 --- a/worldsrv/action_game.go +++ b/worldsrv/action_game.go @@ -37,7 +37,7 @@ func (this *CSEnterRoomHandler) Process(s *netlib.Session, packetid int, data in return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -212,7 +212,7 @@ func (this *CSReturnRoomPacketFactory) CreatePacket() interface{} { func (this *CSReturnRoomHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSReturnRoomHandler Process recv ", data) if msg, ok := data.(*gamehall.CSReturnRoom); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -297,7 +297,7 @@ func (this *CSQueryRoomInfoHandler) Process(s *netlib.Session, packetid int, dat func (this *CSQueryRoomInfoHandler) ProcessLocalGame(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSQueryRoomInfoHandler Process recv ProcessLocalGame", data) if msg, ok := data.(*gamehall.CSQueryRoomInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSQueryRoomInfoHandler p == nil") return nil @@ -370,7 +370,7 @@ func (this *CSGetGameConfigPacketFactory) CreatePacket() interface{} { func (this *CSGetGameConfigHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetGameConfigHandler Process recv ", data) if msg, ok := data.(*gamehall.CSGetGameConfig); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSGetGameConfigHandler p == nil") return nil @@ -433,7 +433,7 @@ func (this *CSEnterGameHandler) ProcessLocal(s *netlib.Session, packetid int, da if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -546,7 +546,7 @@ func (this *CSEnterGameHandler) ProcessNormal(s *netlib.Session, packetid int, d if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -685,7 +685,7 @@ func (this *CSQuitGamePacketFactory) CreatePacket() interface{} { func (this *CSQuitGameHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSQuitGameHandler Process recv ", data) if msg, ok := data.(*gamehall.CSQuitGame); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil { var ret gamehall.OpResultCode_Game pack := &gamehall.SCQuitGame{ @@ -746,7 +746,7 @@ func (this *CSCreateRoomHandler) ProcessLocalGame(s *netlib.Session, packetid in if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -939,7 +939,7 @@ func (this *CSAudienceSitPacketFactory) CreatePacket() interface{} { func (this *CSAudienceSitHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSAudienceSitHandler Process recv ", data) if msg, ok := data.(*gamehall.CSAudienceSit); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSAudienceSitHandler p == nil") return nil @@ -998,7 +998,7 @@ func (this *CSRecordAndNoticeHandler) Process(s *netlib.Session, packetid int, d return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSRecordAndNoticeHandler p == nil") return nil @@ -1085,7 +1085,7 @@ func CSAudienceEnterRoomHandler(s *netlib.Session, packetId int, data interface{ return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1171,7 +1171,7 @@ func CSRoomConfigHandler(s *netlib.Session, packetId int, data interface{}, sid return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1189,7 +1189,7 @@ func CSCreatePrivateRoomHandler(s *netlib.Session, packetId int, data interface{ return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1375,7 +1375,7 @@ func CSGetPrivateRoomListHandler(s *netlib.Session, packetId int, data interface return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1398,6 +1398,12 @@ func CSGetPrivateRoomListHandler(s *netlib.Session, packetId int, data interface Channel: []string{p.LastChannel}, }) for _, v := range scenes { + // 隐藏关闭的房间 + cfg := PlatformMgrSingleton.GetConfig(p.Platform).RoomConfig[v.CustomParam.GetRoomConfigId()] + if cfg == nil || cfg.GetOn() != common.On { + continue + } + needPassword := 0 if v.GetPassword() != "" { needPassword = 1 @@ -1458,7 +1464,7 @@ func CSTouchTypeHandler(s *netlib.Session, packetId int, data interface{}, sid i return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1475,7 +1481,7 @@ func CSRoomRecruitHandler(s *netlib.Session, packetId int, data interface{}, sid return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1505,7 +1511,7 @@ func CSInviteJoinRoomHandler(s *netlib.Session, packetId int, data interface{}, return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } diff --git a/worldsrv/action_hundredscene.go b/worldsrv/action_hundredscene.go index 611c5fb..01e8349 100644 --- a/worldsrv/action_hundredscene.go +++ b/worldsrv/action_hundredscene.go @@ -24,7 +24,7 @@ func (this *CSHundredSceneGetPlayerNumPacketFactory) CreatePacket() interface{} func (this *CSHundredSceneGetPlayerNumHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSHundredSceneGetPlayerNumHandler Process recv ", data) if msg, ok := data.(*gamehall.CSHundredSceneGetPlayerNum); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil { nums := HundredSceneMgrSingleton.GetPlayerNums(p, msg.GetGameId(), msg.GetGameModel()) pack := &gamehall.SCHundredSceneGetPlayerNum{ @@ -52,7 +52,7 @@ func (this *CSHundredSceneOpPacketFactory) CreatePacket() interface{} { func (this *CSHundredSceneOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSHundredSceneOpHandler Process recv ", data) if msg, ok := data.(*gamehall.CSHundredSceneOp); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil { var ret gamehall.OpResultCode_Hundred pack := &gamehall.SCHundredSceneOp{ diff --git a/worldsrv/action_login.go b/worldsrv/action_login.go index 9469a81..ac3a013 100644 --- a/worldsrv/action_login.go +++ b/worldsrv/action_login.go @@ -379,7 +379,7 @@ func (this *CSPlatFormPacketFactory) CreatePacket() interface{} { func (this *CSPlatFormHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlatFormHandler Process recv ", data) if _, ok := data.(*login_proto.CSPlatFormConfig); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlatFormHandler p == nil") return nil @@ -453,7 +453,7 @@ func (this *CSPlatFormHandler) Process(s *netlib.Session, packetid int, data int //func (this *CSBulletionInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSBulletionInfoHandler Process recv ", data) // if msg, ok := data.(*login_proto.CSBulletionInfo); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Trace("CSBulletionInfoHandler p == nil ") // return nil @@ -500,7 +500,7 @@ func (this *CSPlatFormHandler) Process(s *netlib.Session, packetid int, data int //func (this *CSCustomerInfoListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSCustomerInfoListHandler Process recv ", data) // if _, ok := data.(*login_proto.CSCustomerInfoList); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Trace("CSBulletionInfoHandler p == nil ") // return nil @@ -608,7 +608,7 @@ func (this *CSGetThrGameCfgPacketFactory) CreatePacket() interface{} { func (this *CSGetThrGameCfgHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetThrGameCfgHandler Process recv ", data) if msg, ok := data.(*login_proto.CSGetThrGameCfg); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSGetThrGameCfgHandler p == nil") return nil diff --git a/worldsrv/action_logout.go b/worldsrv/action_logout.go index 82b3851..829cfc2 100644 --- a/worldsrv/action_logout.go +++ b/worldsrv/action_logout.go @@ -3,6 +3,7 @@ package main import ( "mongo.games.com/game/common" login_proto "mongo.games.com/game/protocol/login" + "mongo.games.com/game/worldsrv/internal" "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/netlib" ) @@ -15,11 +16,11 @@ func SessionLogout(sid int64, drop bool) bool { } ls.state = LoginStateLogout - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil { - p.ThirdGameLogout() if drop { p.DropLine() + internal.FirePlayerDropLine[*Player, *Scene](p) } else { p.Logout() } diff --git a/worldsrv/action_lottery.go b/worldsrv/action_lottery.go index d278c13..d93237f 100644 --- a/worldsrv/action_lottery.go +++ b/worldsrv/action_lottery.go @@ -22,7 +22,7 @@ func CSLotteryInfoHandler(s *netlib.Session, packetid int, data interface{}, sid return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } diff --git a/worldsrv/action_message.go b/worldsrv/action_message.go index 8cccbad..8e48702 100644 --- a/worldsrv/action_message.go +++ b/worldsrv/action_message.go @@ -22,7 +22,7 @@ func (this *CSReadMessagePacketFactory) CreatePacket() interface{} { func (this *CSReadMessageHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSReadMessageHandler Process recv ", data) if csMessageRead, ok := data.(*message.CSMessageRead); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSReadMessageHandler p == nil") return nil @@ -47,7 +47,7 @@ func (this *CSDelMessagePacketFactory) CreatePacket() interface{} { func (this *CSDelMessageHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSDelMessageHandler Process recv ", data) if csMessageDel, ok := data.(*message.CSMessageDel); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSDelMessageHandler p == nil") return nil @@ -72,7 +72,7 @@ func (this *CSGetMessageAttachPacketFactory) CreatePacket() interface{} { func (this *CSGetMessageAttachHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetMessageAttachHandler Process recv ", data) if csGetMessageAttach, ok := data.(*message.CSGetMessageAttach); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSGetMessageAttachHandler p == nil") return nil @@ -98,7 +98,7 @@ func (this *SCMessageListPacketFactory) CreatePacket() interface{} { func (this *SCMessageListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Tracef("(this *SCMessageListHandler) Process [%v].", s.GetSessionConfig().Id) if msg, ok := data.(*message.CSMessageList); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) p.SendMessage(msg.GetShowId()) } return nil diff --git a/worldsrv/action_minigame.go b/worldsrv/action_minigame.go index 43dc094..4c4a66a 100644 --- a/worldsrv/action_minigame.go +++ b/worldsrv/action_minigame.go @@ -23,7 +23,7 @@ package main //func (this *CSMNGameEnterHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSMNGameEnterHandler Process recv ", data) // if msg, ok := data.(*mngame.CSMNGameEnter); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p != nil { // code := MiniGameMgrSington.PlayerEnter(p, msg.GetId()) // pack := &mngame.SCMNGameEnter{ @@ -52,7 +52,7 @@ package main //func (this *CSMNGameLeaveHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSMNGameLeaveHandler Process recv ", data) // if msg, ok := data.(*mngame.CSMNGameLeave); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p != nil { // code := MiniGameMgrSington.PlayerLeave(p, msg.GetId()) // pack := &mngame.SCMNGameLeave{ @@ -81,7 +81,7 @@ package main //func (this *CSMNGameDispatcherHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSMNGameDispatcherHandler Process recv ", data) // if msg, ok := data.(*mngame.CSMNGameDispatcher); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p != nil { // MiniGameMgrSington.PlayerMsgDispatcher(p, msg) // } diff --git a/worldsrv/action_pets.go b/worldsrv/action_pets.go index 09ee758..22302c8 100644 --- a/worldsrv/action_pets.go +++ b/worldsrv/action_pets.go @@ -27,7 +27,7 @@ func (this *CSRoleInfoPacketFactory) CreatePacket() interface{} { func (this *CSRoleInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSRoleInfoHandler Process recv ", data) if _, ok := data.(*pets.CSRoleInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSRoleInfoHandler p == nil") return nil @@ -61,7 +61,7 @@ func (this *CSPetInfoPacketFactory) CreatePacket() interface{} { func (this *CSPetInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPetInfoHandler Process recv ", data) if _, ok := data.(*pets.CSPetInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPetInfoHandler p == nil") return nil @@ -95,7 +95,7 @@ func (this *CSRisingStarPacketFactory) CreatePacket() interface{} { func (this *CSRisingStarHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSRisingStarHandler Process recv ", data) if msg, ok := data.(*pets.CSRisingStar); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSRisingStarHandler p == nil") return nil @@ -237,7 +237,7 @@ func (this *CSRolePetUseOpPacketFactory) CreatePacket() interface{} { func (this *CSRolePetUseOpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSRolePetUseOpHandler Process recv ", data) if msg, ok := data.(*pets.CSRolePetUseOp); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSRolePetUseOpHandler p == nil") return nil @@ -294,7 +294,7 @@ func (this *CSRolePetUnlockPacketFactory) CreatePacket() interface{} { func (this *CSRolePetUnlockHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSRolePetUnlockHandler Process recv ", data) if msg, ok := data.(*pets.CSRolePetUnlock); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSRolePetUnlockHandler p == nil") return nil @@ -409,7 +409,7 @@ func (this *CSPetSkillLevelUpPacketFactory) CreatePacket() interface{} { func (this *CSPetSkillLevelUpHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { if msg, ok := data.(*pets.CSPetSkillLevelUp); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPetSkillLevelUp p == nil") return nil @@ -487,7 +487,7 @@ func CSSkinInfo(s *netlib.Session, packetid int, data interface{}, sid int64) er if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSSkinInfo p == nil") return nil @@ -506,7 +506,7 @@ func CSSkinUse(s *netlib.Session, packetid int, data interface{}, sid int64) err if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSSkinUse p == nil") return nil @@ -550,7 +550,7 @@ func CSSkinUpgrade(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSSkinUpgrade p == nil") return nil @@ -696,7 +696,7 @@ func CSSKinUnLock(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Errorf("CSSKinUnLock p == nil") return nil diff --git a/worldsrv/action_phonelottery.go b/worldsrv/action_phonelottery.go index c78d426..c3f240c 100644 --- a/worldsrv/action_phonelottery.go +++ b/worldsrv/action_phonelottery.go @@ -29,7 +29,7 @@ func (this *CSPhoneLotteryInfoPacketFactory) CreatePacket() interface{} { // 获取抽奖信息 func (this *CSPhoneLotteryInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { if _, ok := data.(*player_proto.CSPhoneLotteryInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) logger.Logger.Trace("客户端请求抽奖信息!snid = ", p.SnId) if p == nil { logger.Logger.Warn("CSPhoneLotteryInfo p == nil") @@ -78,7 +78,7 @@ func (this *CSPhoneLotteryPacketFactory) CreatePacket() interface{} { } func (this *CSPhoneLotteryHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { if msg, ok := data.(*player_proto.CSPhoneLottery); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPhoneLottery p == nil") return nil @@ -229,7 +229,7 @@ func (this *CSDiamondLotteryInfoPacketFactory) CreatePacket() interface{} { // 获取钻石抽奖信息 func (this *CSDiamondLotteryInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { if _, ok := data.(*player_proto.CSDiamondLotteryInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) logger.Logger.Trace("客户端请求钻石抽奖信息!snid = ", p.SnId) if p == nil { logger.Logger.Warn("CSDiamondLotteryInfo p == nil") @@ -280,7 +280,7 @@ func (this *CSDiamondLotteryPacketFactory) CreatePacket() interface{} { // 玩家钻石抽奖 func (this *CSDiamondLotteryHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { if msg, ok := data.(*player_proto.CSDiamondLottery); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSDiamondLottery p == nil") return nil @@ -440,7 +440,7 @@ func (this *CSDiamondLotteryLuckyAwardPacketFactory) CreatePacket() interface{} // 玩家钻石抽奖保底奖励 func (this *CSDiamondLotteryLuckyAwardHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { if _, ok := data.(*player_proto.CSDiamondLotteryLuckyAward); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSDiamondLotteryLuckyAward p == nil") return nil diff --git a/worldsrv/action_player.go b/worldsrv/action_player.go index d085644..4c76e04 100644 --- a/worldsrv/action_player.go +++ b/worldsrv/action_player.go @@ -16,6 +16,7 @@ import ( "time" "unicode/utf8" + "github.com/golang-jwt/jwt/v4" "mongo.games.com/goserver/core/basic" "mongo.games.com/goserver/core/i18n" "mongo.games.com/goserver/core/logger" @@ -29,6 +30,7 @@ import ( player_proto "mongo.games.com/game/protocol/player" webapi_proto "mongo.games.com/game/protocol/webapi" "mongo.games.com/game/webapi" + "mongo.games.com/game/worldsrv/internal" ) var reTelRule, _ = regexp.Compile(`^(1[3|4|5|6|7|8|9][0-9]\d{4,8})$`) @@ -47,7 +49,7 @@ func (this *CSInviteCodePlayerPacketFactory) CreatePacket() interface{} { func (this *CSInviteCodePlayerHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSInviteCodePlayerHandler Process recv ", data) if msg, ok := data.(*player_proto.CSPlayerInviteCode); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSInviteCodePlayerHandler p == nil") return nil @@ -151,7 +153,7 @@ func (this *CSPlayerChangeNickHandler) Process(s *netlib.Session, packetid int, //logger.Logger.Trace("CSPlayerChangeNickHandler Process recv ", data) //if msg, ok := data.(*player_proto.CSChangeNick); ok { // //logger.Logger.Trace("修改昵称,获得IP",s.RemoteAddr()) - // p := PlayerMgrSington.GetPlayer(sid) + // p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Warn("CSPlayerChangeNickHandler p == nil") // return nil @@ -272,7 +274,7 @@ func (this *CSPlayerChangeIconPacketFactory) CreatePacket() interface{} { func (this *CSPlayerChangeIconHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlayerChangeIconHandler Process recv ", data) if msg, ok := data.(*player_proto.CSPlayerChangeIcon); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerChangeIconHandler p == nil") return nil @@ -311,7 +313,7 @@ func (this *CSPlayerChangeHeadOutLinePacketFactory) CreatePacket() interface{} { func (this *CSPlayerChangeHeadOutLineHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlayerChangeHeadOutLineHandler Process recv ", data) if msg, ok := data.(*player_proto.CSPlayerChangeHeadOutLine); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerChangeHeadOutLineHandler p == nil") return nil @@ -365,7 +367,7 @@ func (this *CSPlayerChangeSexPacketFactory) CreatePacket() interface{} { func (this *CSPlayerChangeSexHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlayerChangeSexHandler Process recv ", data) if msg, ok := data.(*player_proto.CSPlayerChangeSex); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerChangeSexHandler p == nil") return nil @@ -405,7 +407,7 @@ func (this *CSPlayerChangeSexHandler) Process(s *netlib.Session, packetid int, d //func (this *CSUpgradeAccountHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSUpgradeAccountHandler Process recv ", data) // if msg, ok := data.(*player_proto.CSUpgradeAccount); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // // sendPack := func(code player_proto.OpResultCode) { // pack := &player_proto.SCUpgradeAccount{ @@ -582,7 +584,7 @@ func (this *CSBindAlipayPacketFactory) CreatePacket() interface{} { func (this *CSBindAlipayHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSBindAlipayHandler Process recv ", data) if msg, ok := data.(*player_proto.CSBindAlipay); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSBindAlipayHandler p == nil") return nil @@ -712,7 +714,7 @@ func (this *CSBindBankPacketFactory) CreatePacket() interface{} { func (this *CSBindBankHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSBindBankHandler Process recv ", data) if msg, ok := data.(*player_proto.CSBindBank); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSBindBankHandler p == nil") return nil @@ -855,7 +857,7 @@ func (this *CSChangePasswordPacketFactory) CreatePacket() interface{} { func (this *CSChangePasswordHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSChangePasswordHandler Process recv ", data) if msg, ok := data.(*player_proto.CSChangePassword); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSChangePasswordHandler p == nil") return nil @@ -985,7 +987,7 @@ func (this *CSPlayerSafeBoxPacketFactory) CreatePacket() interface{} { func (this *CSPlayerSafeBoxHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlayerSafeBoxHandler Process recv ", data) if msg, ok := data.(*player_proto.CSPlayerOpCoin); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerSafeBoxHandler p == nil") return nil @@ -1128,7 +1130,7 @@ func (this *CSPlayerSafeBoxCoinLogPacketFactory) CreatePacket() interface{} { func (this *CSPlayerSafeBoxCoinLogHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("GetSafeBoxCoinLog Process recv ", data) if _, ok := data.(*player_proto.CSGetSafeBoxCoinLog); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("GetSafeBoxCoinLog p == nil") return nil @@ -1185,7 +1187,7 @@ func (this *CSPlayerSafeBoxCoinLogHandler) Process(s *netlib.Session, packetid i //func (this *CSPlayerGameCoinLogHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { // logger.Logger.Trace("CSPlayerGameCoinLogHandler Process recv ", data) // if _, ok := data.(*player_proto.CSGetGameCoinLog); ok { -// p := PlayerMgrSington.GetPlayer(sid) +// p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Warn("CSPlayerGameCoinLogHandler p == nil") // return nil @@ -1408,7 +1410,7 @@ func (this *CSPlayerRegisterHandler) Process(s *netlib.Session, packetid int, da Plt: acc.Platform, AccId: acc.AccountId.Hex(), NickName: "", - HeadUrl: niceIdMgr.GetRobHeadUrlIdx(), + HeadUrl: GetRobHeadUrlIdx(), }) if pi == nil || tf == false { return player_proto.OpResultCode_OPRC_Error @@ -1480,7 +1482,7 @@ func (this *CSCustomerNewMsgAckPacketFactory) CreatePacket() interface{} { func (this *CSCustomerNewMsgAckHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSCustomerNewMsgAckHandler Process recv ", data) //if msg, ok := data.(*player_proto.CSCustomerNewMsgAck); ok { - // p := PlayerMgrSington.GetPlayer(sid) + // p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Warn("CSCustomerNewMsgAckHandler p == nil") // return nil @@ -1505,7 +1507,7 @@ func (this *CSIosInstallStablePacketFactory) CreatePacket() interface{} { func (this *CSIosInstallStableHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSIosInstallStableHandler Process recv ", data) //if _, ok := data.(*player_proto.CSIosInstallStable); ok { - // p := PlayerMgrSington.GetPlayer(sid) + // p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Warn("CSIosInstallStableHandler p == nil") // return nil @@ -1540,7 +1542,7 @@ func (this *CSFishJackpotPacketFactory) CreatePacket() interface{} { func (this *CSFishJackpotHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSFishJackpotHandler Process recv ", data) if _, ok := data.(*player_proto.CSJackpotList); ok { - player := PlayerMgrSington.GetPlayer(sid) + player := PlayerMgrSington.GetOnlinePlayer(sid) if player == nil { logger.Logger.Warn("CSFishJackpotHandler p == nil") return nil @@ -1579,7 +1581,7 @@ func (this *CSFishJackpotCoinPacketFactory) CreatePacket() interface{} { func (this *CSFishJackpotCoinHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSFishJackpotCoinHandler Process recv ", data) if _, ok := data.(*player_proto.CSFishJackpotCoin); ok { - player := PlayerMgrSington.GetPlayer(sid) + player := PlayerMgrSington.GetOnlinePlayer(sid) if player == nil { logger.Logger.Warn("CSFishJackpotCoinHandler p == nil") return nil @@ -1615,7 +1617,7 @@ func (this *CSGetSpreadIsOpenPacketFactory) CreatePacket() interface{} { func (this *CSGetSpreadIsOpenHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetSpreadIsOpenHandler Process recv ", data) if _, ok := data.(*player_proto.CSGetSpreadLWIsOpen); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSGetSpreadIsOpenHandler p == nil") return nil @@ -1654,7 +1656,7 @@ func (this *CSPlayerSettingPacketFactory) CreatePacket() interface{} { func (this *CSPlayerSettingHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlayerSettingHandler Process recv ", data) if msg, ok := data.(*player_proto.CSPlayerSetting); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerSettingHandler p == nil") return nil @@ -1712,7 +1714,7 @@ func (this *CSPlayerVIPBuyPacketFactory) CreatePacket() interface{} { func (this *CSPlayerVIPBuyHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSVIPBuy Process recv ", data) //if msg, ok := data.(*player_proto.CSVIPBuy); ok { - // p := PlayerMgrSington.GetPlayer(sid) + // p := PlayerMgrSington.GetOnlinePlayer(sid) // if p == nil { // logger.Logger.Warn("CSPlayerVIPBuyHandler p == nil") // return nil @@ -1737,7 +1739,7 @@ func (this *CSPlayerVIPInfoPacketFactory) CreatePacket() interface{} { func (this *CSPlayerVIPInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSVIPInfo Process recv ", data) if _, ok := data.(*player_proto.CSVIPInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerVIPInfoHandler p == nil") return nil @@ -1761,7 +1763,7 @@ func (this *CSPlayerVIPDrawPacketFactory) CreatePacket() interface{} { func (this *CSPlayerVIPDrawHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSVIPDraw Process recv ", data) if msg, ok := data.(*player_proto.CSVIPDraw); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerVIPDrawHandler p == nil") return nil @@ -1786,7 +1788,7 @@ func (this *CSVIPPrivilegeInfoPacketFactory) CreatePacket() interface{} { func (this *CSVIPPrivilegeInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSVIPPrivilegeInfoHandler Process recv ", data) if msg, ok := data.(*player_proto.CSVIPPrivilegeInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSVIPPrivilegeInfoHandler p == nil") return nil @@ -1880,7 +1882,7 @@ func CSExchangeChannel(s *netlib.Session, packetid int, data interface{}, sid in return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSExchangeChannel p == nil") return nil @@ -2004,7 +2006,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) if player.IsOnLine() { if player.sid != 0 && player.sid != sid { //Kick the exist player disconnect - player.Kickout(common.KickReason_OtherLogin) + player.Kick(common.KickReason_OtherLogin) } } @@ -2022,7 +2024,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) proto.SetDefaults(scPlayerData) player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData) //Kick the exist player disconnect - player.Kickout(common.KickReason_Freeze) + player.Kick(common.KickReason_Freeze) return nil } @@ -2036,7 +2038,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) proto.SetDefaults(scPlayerData) player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData) //Kick the exist player disconnect - player.Kickout(common.KickReason_Freeze) + player.Kick(common.KickReason_Freeze) return nil } @@ -2056,7 +2058,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) proto.SetDefaults(scPlayerData) player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData) //Kick the exist player disconnect - player.Kickout(common.KickReason_Freeze) + player.Kick(common.KickReason_Freeze) return nil } @@ -2068,40 +2070,18 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) proto.SetDefaults(scPlayerData) player.SendRawToClientIncOffLine(sid, s, int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData) //Kick the exist player disconnect - player.Kickout(common.KickReason_Freeze) + player.Kick(common.KickReason_Freeze) return nil } } if !player.IsRob { if _, ok := BlackListMgrSington.CheckLogin(player.PlayerData); !ok { - //var msg string - //if bi != nil { - // msg = i18n.Tr("languages", "BlackListLimit2Args", player.SnId, bi.Id, player.SnId, bi.Id, player.SnId, bi.Id, player.SnId, bi.Id) - //} else { - // msg = i18n.Tr("languages", "BlackListLimit1Args", player.SnId, player.SnId, player.SnId, player.SnId) - //} - //common.SendSrvMsg(player, common.SRVMSG_CODE_DEFAULT, msg) - //scPlayerData := &player_proto.SCPlayerData{ - // OpRetCode: player_proto.OpResultCode_OPRC_InBlackList, - //} - //proto.SetDefaults(scPlayerData) - //player.SendToClient(int(player_proto.PlayerPacketID_PACKET_SC_PLAYERDATA), scPlayerData) - //Kick the exist player disconnect - player.Kickout(common.KickReason_Freeze) + player.Kick(common.KickReason_Freeze) return nil } } - // 给玩家发送三方余额状态 - //statePack := &gamehall_proto.SCThridGameBalanceUpdateState{} - //if player.thridBalanceReqIsSucces { - // statePack.OpRetCode = gamehall_proto.OpResultCode_Game_OPRC_Sucess_Game - //} else { - // statePack.OpRetCode = gamehall_proto.OpResultCode_Game_OPRC_Error_Game - //} - //player.SendRawToClientIncOffLine(sid, s, int(gamehall_proto.GameHallPacketID_PACKET_SC_THRIDGAMEBALANCEUPDATESTATE), statePack) - //抽奖次数兼容老玩家 if !player.IsRob && !player.InitLotteryStatus && WelfareMgrSington.GetPhoneLotteryStatus(player.Platform) == model.WelfareOpen { player.addLotteryCount(20) @@ -2114,6 +2094,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) playerFunc(player, cspl) PlayerMgrSington.ReholdPlayer(player, sid, s) player.OnRehold() + internal.FirePlayerRehold[*Player, *Scene](player) player.SendPlayerInfo() return nil } @@ -2141,87 +2122,27 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) return } - var promoterID string - var promoterCfg *PromoterConfig - f := func() { - PlayerMgrSington.AddPlayer(sid, pd.PlayerData, s) - player := PlayerMgrSington.GetPlayer(sid) - if player == nil { - return - } - - if !player.IsRob { - if _, ok := BlackListMgrSington.CheckLogin(pd.PlayerData); !ok { - //黑名单用户也需要调用一下onlogin,否则会导致数据无法刷新 - player.OnLogined() - player.Kickout(common.KickReason_Freeze) - return - } - } - - if promoterID != "" { - key, err := GetPromoterKey(0, promoterID, "") - if err == nil { - promoterCfg = PromoterMgrSington.GetConfig(key) - if promoterCfg != nil && promoterCfg.IsInviteRoot > 0 { - player.BeUnderAgentCode = promoterID - } - } - } - - var temp []byte - var ee error - di := cspl.GetDeviceInfo() - if di != "" { - var e common.Encryptor - e.Init(common.GetAppId(), player.PackageID, int32(cspl.GetTimeStamp())) - temp, ee = base64.StdEncoding.DecodeString(di) - if ee == nil { - e.Encrypt(temp, len(temp)) - } - } - - if isnew { //新用户赠送金币 - //首次创建账号事件 - //isBind := 0 - //if pd.Tel != "" { - // isBind = 1 - //} - //LogChannelSingleton.WriteMQData(model.GeneratePlayerEvent(model.WEBEVENT_LOGIN, pd.Platform, pd.PackageID, pd.SnId, pd.Channel, pd.BeUnderAgentCode, pd.PromoterTree, 1, 1, isBind, common.GetAppId())) - - //newbieCoin := player.GetRegisterPrize() - //if newbieCoin > 0 { - // player.AddCoin(int64(newbieCoin), common.GainWay_NewPlayer, "system", "") - // //增加泥码 - // player.AddDirtyCoin(0, int64(newbieCoin)) - // player.ReportSystemGiveEvent(newbieCoin, common.GainWay_NewPlayer, true) - // player.AddPayCoinLog(int64(newbieCoin), model.PayCoinLogType_Coin, "NewPlayer") - // LogChannelSingleton.WriteMQData(model.GenerateSystemFreeGive(pd.SnId, pd.Name, pd.Platform, model.SystemFreeGive_GiveType_NewPlayer, model.SystemFreeGive_CoinType_Coin, int64(newbieCoin))) - //} - //if player.InviterId > 0 { - // //actRandCoinMgr.OnPlayerInvite(player.Platform, player.InviterId) - //} - } - //测试代码 - - playerFunc(player, cspl) - player.OnLogined() - player.SendPlayerInfo() + PlayerMgrSington.AddPlayer(sid, pd.PlayerData, s) + player := PlayerMgrSington.GetOnlinePlayer(sid) + if player == nil { return } - if pd.InviterId != 0 { - // 获取推广人 - PlayerCacheMgrSingleton.UnCacheInvalidPlayerId(pd.InviterId) - PlayerCacheMgrSingleton.Get(pd.Platform, pd.InviterId, func(inviter *PlayerCacheItem, async, isnew bool) { - if inviter != nil { - promoterID = inviter.BeUnderAgentCode - } - f() - }, false) - } else { - f() + // 检查禁止登录 + if !player.IsRob { + if _, ok := BlackListMgrSington.CheckLogin(pd.PlayerData); !ok { + //黑名单用户也需要调用一下onlogin,否则会导致数据无法刷新 + player.OnLogined() + internal.FirePlayerLogined[*Player, *Scene](player) + player.Kick(common.KickReason_Freeze) + return + } } + + playerFunc(player, cspl) + player.OnLogined() + internal.FirePlayerLogined[*Player, *Scene](player) + player.SendPlayerInfo() }, true) return nil @@ -2230,7 +2151,7 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64) func CSQueryPlayer(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSQueryPlayerHandler Process recv ", data) if msg, ok := data.(*player_proto.CSQueryPlayer); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSQueryPlayerHandler p == nil") return nil @@ -2333,7 +2254,7 @@ func CSSavePlayerInfo(s *netlib.Session, packetid int, data interface{}, sid int if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -2391,7 +2312,7 @@ func CSHeadUrl(s *netlib.Session, packetId int, data interface{}, sid int64) err if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSHeadUrl p == nil") return nil @@ -2420,7 +2341,7 @@ func CSBindTelInfo(s *netlib.Session, packetId int, data interface{}, sid int64) return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Error("CSBindTelInfo p == nil", sid) return nil @@ -2451,7 +2372,7 @@ func CSPlayerSMSCode(s *netlib.Session, packetId int, data interface{}, sid int6 return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) sendPack := func(code player_proto.OpResultCode) { pack := &player_proto.SCPlayerSMSCode{ @@ -2576,7 +2497,7 @@ func CSBindTel(s *netlib.Session, packetId int, data interface{}, sid int64) err return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Error("CSBindTel p == nil", sid) return nil @@ -2822,7 +2743,7 @@ func CSBillList(s *netlib.Session, packetId int, data interface{}, sid int64) er if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -2887,7 +2808,7 @@ func CSADV(s *netlib.Session, packetId int, data interface{}, sid int64) error { if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -2908,7 +2829,7 @@ func CSADV(s *netlib.Session, packetId int, data interface{}, sid int64) error { // 获取运营商配置 func CSSMSConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error { logger.Logger.Tracef("CSSMSConfig Process %v", data) - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -2947,7 +2868,7 @@ func CSSMSConfig(s *netlib.Session, packetId int, data interface{}, sid int64) e // 获取获奖记录 func CSAwardLog(s *netlib.Session, packetId int, data interface{}, sid int64) error { logger.Logger.Tracef("CSAwardLog Process %v", data) - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -3044,7 +2965,7 @@ func CSAwardLog(s *netlib.Session, packetId int, data interface{}, sid int64) er return nil } func CSPopUpWindowsConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -3085,7 +3006,7 @@ func CSPopUpWindowsConfig(s *netlib.Session, packetId int, data interface{}, sid func CSUpdateAttribute(s *netlib.Session, packetId int, data interface{}, sid int64) error { logger.Logger.Tracef("CSUpdateAttribute %v", data) - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -3251,7 +3172,7 @@ func CSUpdateAttribute(s *netlib.Session, packetId int, data interface{}, sid in send() return nil } - if msg.GuideId == 1 { + if msg.GuideId == common.GuideIdNewPlayer { if p.GuideStep >= 0 && p.GuideStep < model.GameParamData.GuideStepMaxNum { p.GuideStep = -1 // 跳过引导为 -1 pack.OpRetCode = player_proto.OpResultCode_OPRC_Sucess @@ -3269,6 +3190,7 @@ func CSUpdateAttribute(s *netlib.Session, packetId int, data interface{}, sid in return nil } p.GuideStep = int32(msg.GetParam()[0]) + p.GuideData[msg.GetGuideId()] = int32(msg.GetParam()[0]) pack.OpRetCode = player_proto.OpResultCode_OPRC_Sucess send() return nil @@ -3284,7 +3206,7 @@ func CSUpdateAttribute(s *netlib.Session, packetId int, data interface{}, sid in // 获取获奖记录 func CSClawdollItemLog(s *netlib.Session, packetId int, data interface{}, sid int64) error { logger.Logger.Tracef("CSClawdollItemLog Process %v", data) - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -3327,7 +3249,7 @@ func CSClawdollItemLog(s *netlib.Session, packetId int, data interface{}, sid in func CSCLAWDOLLConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error { logger.Logger.Tracef("CSDollConfigHandler") if _, ok := data.(*player_proto.CSCLAWDOLLConfig); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSDollConfigHandler p == nil") return nil @@ -3356,7 +3278,7 @@ func CSCLAWDOLLConfig(s *netlib.Session, packetId int, data interface{}, sid int // 客户端请求弹窗配置 func CSPopUpWindowConfig(s *netlib.Session, packetId int, data interface{}, sid int64) error { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -3379,6 +3301,38 @@ func CSPopUpWindowConfig(s *netlib.Session, packetId int, data interface{}, sid return nil } +func CSGetSwapShopInfo(s *netlib.Session, packetId int, data interface{}, sid int64) error { + logger.Logger.Tracef("CSGetSwapShopInfo %v", data) + p := PlayerMgrSington.GetOnlinePlayer(sid) + if p == nil { + return nil + } + + _, ok := data.(*player_proto.CSGetSwapShopInfo) + if !ok { + return nil + } + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "snid": p.SnId, + "platform": p.Platform, + "exp": time.Now().Add(time.Hour * 24).Unix(), + }) + str, err := token.SignedString([]byte(common.Config.AppId)) + if err != nil { + logger.Logger.Errorf("CSGetSwapShopInfo err:%v", err) + return nil + } + + pack := &player_proto.SCGetSwapShopInfo{ + Url: fmt.Sprintf("%s?access_token=%s", model.GameParamData.SwapShopUrl, str), + } + + p.SendToClient(int(player_proto.PlayerPacketID_PACKET_SCGetSwapShopInfo), pack) + logger.Logger.Tracef("SCGetSwapShopInfo %v", pack) + return nil +} + func init() { // 用户信息 common.Register(int(player_proto.PlayerPacketID_PACKET_CS_PLAYERDATA), player_proto.CSPlayerData{}, CSPlayerData) @@ -3418,4 +3372,6 @@ func init() { common.Register(int(player_proto.PlayerPacketID_PACKET_CSDollConfig), player_proto.CSCLAWDOLLConfig{}, CSCLAWDOLLConfig) //客户端请求弹窗配置信息 common.Register(int(player_proto.PlayerPacketID_PACKET_CSPopUpWindowConfig), player_proto.CSPopUpWindowConfig{}, CSPopUpWindowConfig) + // 获取兑换商城网页地址 + common.Register(int(player_proto.PlayerPacketID_PACKET_CSGetSwapShopInfo), player_proto.CSGetSwapShopInfo{}, CSGetSwapShopInfo) } diff --git a/worldsrv/action_rankmatch.go b/worldsrv/action_rankmatch.go index 1105486..ea87b67 100644 --- a/worldsrv/action_rankmatch.go +++ b/worldsrv/action_rankmatch.go @@ -27,7 +27,7 @@ func init() { // CSRMSeasonInfo 赛季信息 func CSRMSeasonInfo(s *netlib.Session, packetId int, data interface{}, sid int64) error { logger.Logger.Trace("CSRMSeasonInfo") - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSRMSeasonInfo p == nil.") return nil @@ -80,7 +80,7 @@ func CSRMRankConfig(s *netlib.Session, packetId int, data interface{}, sid int64 return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSRMRankConfig p == nil.") return nil @@ -116,7 +116,7 @@ func CSRMAwardConfig(s *netlib.Session, packetId int, data interface{}, sid int6 return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSRMAwardConfig p == nil.") return nil @@ -174,7 +174,7 @@ func CSRMAward(s *netlib.Session, packetId int, data interface{}, sid int64) err return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSRMAward p == nil.") return nil diff --git a/worldsrv/action_server.go b/worldsrv/action_server.go index b169f39..dc24fd3 100644 --- a/worldsrv/action_server.go +++ b/worldsrv/action_server.go @@ -245,7 +245,7 @@ func init() { if scene.starting { if scene.currRound == 1 { scene.startTime = time.Now() - //p := PlayerMgrSington.GetPlayer(s.Sid) + //p := PlayerMgrSington.GetOnlinePlayer(s.Sid) } } if scene.starting { @@ -613,7 +613,7 @@ func (this *CSPMCmdPacketFactory) CreatePacket() interface{} { func (this *CSPMCmdHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPMCmdHandler Process recv ", data) if msg, ok := data.(*playerproto.CSPMCmd); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Trace("CSPMCmdHandler p == nil") return nil @@ -652,33 +652,6 @@ func (this *CSPMCmdHandler) Process(s *netlib.Session, packetid int, data interf return nil } -type CSRobotChgDataPacketFactory struct { -} -type CSRobotChgDataHandler struct { -} - -func (this *CSRobotChgDataPacketFactory) CreatePacket() interface{} { - pack := &playerproto.CSRobotChgData{} - return pack -} - -func (this *CSRobotChgDataHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { - logger.Logger.Trace("CSRobotChgDataHandler Process recv ", data) - if _, ok := data.(*playerproto.CSRobotChgData); ok { - p := PlayerMgrSington.GetPlayer(sid) - if p == nil { - logger.Logger.Trace("CSRobotChgDataHandler p == nil") - return nil - } - - if !p.IsRob { - logger.Logger.Trace("CSRobotChgDataHandler !p.IsRob") - return nil - } - } - return nil -} - type CSAccountInvalidPacketFactory struct { } type CSAccountInvalidHandler struct { @@ -692,7 +665,7 @@ func (this *CSAccountInvalidPacketFactory) CreatePacket() interface{} { func (this *CSAccountInvalidHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSAccountInvalidHandler Process recv ", data) if _, ok := data.(*loginproto.CSAccountInvalid); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil && p.IsRobot() { snid := p.SnId acc := p.AccountId @@ -718,12 +691,11 @@ func (this *CSAccountInvalidHandler) Process(s *netlib.Session, packetid int, da } func init() { + // 机器人命令 common.RegisterHandler(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), &CSPMCmdHandler{}) netlib.RegisterFactory(int(playerproto.PlayerPacketID_PACKET_CS_PMCMD), &CSPMCmdPacketFactory{}) - common.RegisterHandler(int(playerproto.PlayerPacketID_PACKET_CS_ROBOTCHGDATA), &CSRobotChgDataHandler{}) - netlib.RegisterFactory(int(playerproto.PlayerPacketID_PACKET_CS_ROBOTCHGDATA), &CSRobotChgDataPacketFactory{}) - + // 删除机器人账号 common.RegisterHandler(int(loginproto.LoginPacketID_PACKET_CS_ACCOUNTINVALID), &CSAccountInvalidHandler{}) netlib.RegisterFactory(int(loginproto.LoginPacketID_PACKET_CS_ACCOUNTINVALID), &CSAccountInvalidPacketFactory{}) } diff --git a/worldsrv/action_shop.go b/worldsrv/action_shop.go index b11171c..4784920 100644 --- a/worldsrv/action_shop.go +++ b/worldsrv/action_shop.go @@ -29,7 +29,7 @@ func (this *CSShopInfoPacketFactory) CreatePacket() interface{} { func (this *CSShopInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSShopInfoHandler Process recv ", data) if msg, ok := data.(*shop.CSShopInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSShopInfoHandler p == nil") return nil @@ -62,7 +62,7 @@ func (this *CSAdLookedPacketFactory) CreatePacket() interface{} { func (this *CSAdLookedHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSAdLookedHandler Process recv ", data) if msg, ok := data.(*shop.CSAdLooked); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSAdLookedHandler p == nil") return nil @@ -134,7 +134,7 @@ func (this *CSVCPayShopPacketFactory) CreatePacket() interface{} { func (this *CSVCPayShopHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSVCPayShopHandler Process recv ", data) if msg, ok := data.(*shop.CSVCPayShop); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSVCPayShopHandler p == nil") return nil @@ -246,7 +246,7 @@ func (this *CSShopExchangeRecordPacketFactory) CreatePacket() interface{} { func (this *CSShopExchangeRecordHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSShopExchangeRecordHandler Process recv ", data) if msg, ok := data.(*shop.CSShopExchangeRecord); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSShopExchangeRecordHandler p == nil") return nil @@ -279,7 +279,7 @@ func (this *CSShopExchangeHandler) Process(s *netlib.Session, packetid int, data return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSShopExchangeHandler p == nil") return nil @@ -362,7 +362,7 @@ func (this *CSShopExchangeListPacketFactory) CreatePacket() interface{} { func (this *CSShopExchangeListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSShopExchangeListHandler Process recv ", data) if _, ok := data.(*shop.CSShopExchangeList); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSShopExchangeListHandler p == nil") return nil @@ -388,7 +388,7 @@ func (this *CSPayInfoPacketFactory) CreatePacket() interface{} { func (this *CSPayInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPayInfoHandler Process recv ", data) if msg, ok := data.(*shop.CSPayInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPayInfoHandler p == nil") return nil @@ -520,7 +520,7 @@ func (this *CSGetPayInfoListPacketFactory) CreatePacket() interface{} { func (this *CSGetPayInfoListHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetPayInfoListHandler Process recv ", data) if msg, ok := data.(*shop.CSGetPayInfoList); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSGetPayInfoListHandler p == nil") return nil @@ -637,7 +637,7 @@ func (this *CSPlayerAddrPacketFactory) CreatePacket() interface{} { func (this *CSPlayerAddrHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPlayerAddr Process recv ", data) if msg, ok := data.(*shop.CSPlayerAddr); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPlayerAddr p == nil") return nil @@ -671,7 +671,7 @@ func (this *CSUpdateVipShopPacketFactory) CreatePacket() interface{} { } func (this *CSUpdateVipShopHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warn("CSPayInfoHandler p == nil") return nil diff --git a/worldsrv/action_task.go b/worldsrv/action_task.go index b399dd6..a88863d 100644 --- a/worldsrv/action_task.go +++ b/worldsrv/action_task.go @@ -152,7 +152,7 @@ func CSTaskList(s *netlib.Session, packetId int, data interface{}, sid int64) er if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -199,7 +199,7 @@ func CSTaskReward(s *netlib.Session, packetId int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -278,7 +278,7 @@ func CSTaskDebugInc(s *netlib.Session, packetId int, data interface{}, sid int64 if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } diff --git a/worldsrv/action_tournament.go b/worldsrv/action_tournament.go index eb5286f..93a5de2 100644 --- a/worldsrv/action_tournament.go +++ b/worldsrv/action_tournament.go @@ -15,7 +15,7 @@ func CSTMInfo(s *netlib.Session, packetid int, data interface{}, sid int64) erro return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSTMInfo p == nil.") return nil @@ -33,7 +33,7 @@ func CSSignRace(s *netlib.Session, packetid int, data interface{}, sid int64) er if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSSignRace p == nil.") return nil @@ -100,7 +100,7 @@ func CSMatchList(s *netlib.Session, packetId int, data interface{}, sid int64) e if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSMatchList p == nil.") return nil @@ -171,7 +171,7 @@ func CSRoomList(s *netlib.Session, packetId int, data interface{}, sid int64) er if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSRoomList p == nil.") return nil diff --git a/worldsrv/action_welfare.go b/worldsrv/action_welfare.go index 5a7e2a5..57353e1 100644 --- a/worldsrv/action_welfare.go +++ b/worldsrv/action_welfare.go @@ -36,7 +36,7 @@ func (this *CSGetReliefFundPacketFactory) CreatePacket() interface{} { func (this *CSGetReliefFundHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetReliefFund Process recv ", data) if msg, ok := data.(*welfare.CSGetReliefFund); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSGetReliefFundHandler p == nil") return nil @@ -61,7 +61,7 @@ func (this *CSGetTurnplatePacketFactory) CreatePacket() interface{} { func (this *CSGetTurnplateHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetTurnplate Process recv ", data) if msg, ok := data.(*welfare.CSGetTurnplate); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSGetTurnplateHandler p == nil") return nil @@ -91,7 +91,7 @@ func (this *CSGetAddupSignPacketFactory) CreatePacket() interface{} { func (this *CSGetAddupSignHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetAddupSign Process recv ", data) if msg, ok := data.(*welfare.CSGetAddupSign); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSGetAddupSignHandler p == nil") return nil @@ -118,7 +118,7 @@ func (this *CSWelfaredInfoPacketFactory) CreatePacket() interface{} { func (this *CSWelfaredInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSWelfaredInfo Process recv ", data) if _, ok := data.(*welfare.CSWelfaredInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSWelfaredInfoHandler p == nil") return nil @@ -143,7 +143,7 @@ func (this *CSBlindBoxInfoPacketFactory) CreatePacket() interface{} { func (this *CSBlindBoxInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSBlindBoxInfo Process recv ", data) if msg, ok := data.(*welfare.CSBlindBoxInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSBlindBoxInfoHandler p == nil") return nil @@ -168,7 +168,7 @@ func (this *CSBuyBlindBoxPacketFactory) CreatePacket() interface{} { func (this *CSBuyBlindBoxHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSGetBlindBox Process recv ", data) if _, ok := data.(*welfare.CSGetBlindBox); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSBuyBlindBoxHandler p == nil") return nil @@ -193,7 +193,7 @@ func (this *CSFirstPayInfoPacketFactory) CreatePacket() interface{} { func (this *CSFirstPayInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSWelfareFirstPayData Process recv ", data) if _, ok := data.(*welfare.CSWelfareFirstPayData); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSFirstPayInfoHandler p == nil") return nil @@ -218,7 +218,7 @@ func (this *CSBuyFirstPayPacketFactory) CreatePacket() interface{} { func (this *CSBuyFirstPayHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSWelfareFirstPay Process recv ", data) if _, ok := data.(*welfare.CSWelfareFirstPay); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSBuyFirstPayHandler p == nil") return nil @@ -243,7 +243,7 @@ func (this *CSContinuousPayInfoPacketFactory) CreatePacket() interface{} { func (this *CSContinuousPayInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSWelfareContinuousPayData Process recv ", data) if _, ok := data.(*welfare.CSWelfareContinuousPayData); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSContinuousPayInfoHandler p == nil") return nil @@ -268,7 +268,7 @@ func (this *CSBuyContinuousPayPacketFactory) CreatePacket() interface{} { func (this *CSBuyContinuousPayHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSWelfareContinuousPay Process recv ", data) if _, ok := data.(*welfare.CSWelfareContinuousPay); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSBuyContinuousPayHandler p == nil") return nil @@ -285,7 +285,7 @@ func CSWelfRelief(s *netlib.Session, packetid int, data interface{}, sid int64) return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -305,7 +305,7 @@ func CSWelfRelief(s *netlib.Session, packetid int, data interface{}, sid int64) func CSInviteInfo(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Tracef("CSInviteInfo Process recv %v", data) - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -383,7 +383,7 @@ func CSBindInvite(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -591,7 +591,7 @@ func CSPermitInfo(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -710,7 +710,7 @@ func CSPermitAward(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -935,7 +935,7 @@ func CSPermitExchangeList(s *netlib.Session, packetid int, data interface{}, sid if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1004,7 +1004,7 @@ func CSPermitExchange(s *netlib.Session, packetid int, data interface{}, sid int if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1146,7 +1146,7 @@ func CSPermitShop(s *netlib.Session, packetid int, data interface{}, sid int64) if !ok { return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } @@ -1202,7 +1202,7 @@ func (this *CSPigBankGetInfoPacketFactory) CreatePacket() interface{} { func (this *CSPigBankGetInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPigbankGetInfo Process recv ", data) if _, ok := data.(*welfare.CSPigbankGetInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSPigBankGetInfoHandler p == nil") return nil @@ -1227,7 +1227,7 @@ func (this *CSPigBankTakeCoinPacketFactory) CreatePacket() interface{} { func (this *CSPigBankTakeCoinHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSPigbankTakeCoin Process recv ", data) if _, ok := data.(*welfare.CSPigbankTakeCoin); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil") return nil @@ -1252,7 +1252,7 @@ func (this *CSSignDayAddup2AwardPacketFactory) CreatePacket() interface{} { func (this *CSSignDayAddup2AwardHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSSignDayAddup2Award Process recv ", data) if msg, ok := data.(*welfare.CSSignDayAddup2Award); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil") return nil @@ -1276,7 +1276,7 @@ func (this *CSDiamondBankGetInfoPacketFactory) CreatePacket() interface{} { func (this *CSDiamondBankGetInfoHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSDiamondBankGetInfo Process recv ", data) if _, ok := data.(*welfare.CSDiamondBankGetInfo); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil") return nil @@ -1301,7 +1301,7 @@ func (this *CSDiamondBankTakeDiamondPacketFactory) CreatePacket() interface{} { func (this *CSDiamondBankTakeDiamondHandler) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error { logger.Logger.Trace("CSDiamondBankGetInfo Process recv ", data) if _, ok := data.(*welfare.CSDiamondBankTakeDiamond); ok { - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { logger.Logger.Warnf("CSPigBankTakeCoinHandler p == nil") return nil @@ -1318,7 +1318,7 @@ func CSClientUpgrades(s *netlib.Session, packetid int, data interface{}, sid int return nil } - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p == nil { return nil } diff --git a/worldsrv/customroommgr.go b/worldsrv/customroommgr.go index 543e46d..56fd77c 100644 --- a/worldsrv/customroommgr.go +++ b/worldsrv/customroommgr.go @@ -125,9 +125,14 @@ func (c *CustomRoomMgr) GetRoomList(plt string) []*gamehall.PrivateRoomInfo { } var ret []*gamehall.PrivateRoomInfo for _, v := range d.List { - if v != nil && v.PrivateRoomInfo != nil { - ret = append(ret, v.PrivateRoomInfo) + if v == nil || v.PrivateRoomInfo == nil { + continue } + cfg := PlatformMgrSingleton.GetConfig(plt).RoomConfig[v.RoomConfigId] + if cfg == nil || cfg.GetOn() != common.On { + continue + } + ret = append(ret, v.PrivateRoomInfo) } return ret } diff --git a/worldsrv/dbsaver.go b/worldsrv/dbsaver.go index 2bf2ff7..d79f3ee 100644 --- a/worldsrv/dbsaver.go +++ b/worldsrv/dbsaver.go @@ -1,151 +1,52 @@ package main import ( - "fmt" - "strings" "time" - "mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/module" + + "mongo.games.com/game/util/balancequeue" ) -type SaveTaskHandler interface { - Time2Save() -} - -var SaverSliceNumber = 600 - var DbSaveInst = &DbSaver{ - Tick: int32(SaverSliceNumber), - index: 0, - init: false, - list: make([]*SaverArray, SaverSliceNumber), - queue: make([]*BalanceQueue, 10), - pool: make(map[SaveTaskHandler]*SaverArray), + GroupNumber: 600, } type DbSaver struct { - Tick int32 // 最大索引 - index int32 // 循环索引 - list []*SaverArray - queue []*BalanceQueue - init bool - pool map[SaveTaskHandler]*SaverArray -} - -func (this *DbSaver) String() string { - buf := strings.Builder{} - buf.WriteString("DbSaver:\n") - buf.WriteString(fmt.Sprintf("Tick: %v\n", this.Tick)) - buf.WriteString(fmt.Sprintf("List: %v\n", len(this.list))) - buf.WriteString(fmt.Sprintf("Queue: %v\n", len(this.queue))) - for k, v := range this.queue { - buf.WriteString(fmt.Sprintf("q%v: %v\n", k, len(v.queue))) - } - return buf.String() -} - -// pushBalanceSaverArray 向队列中添加SaveTaskHandler -func (this *DbSaver) pushBalanceSaverArray(sth SaveTaskHandler) { - if sth == nil { - return - } - if _, exist := this.pool[sth]; exist { - return - } - for pos, bq := range this.queue { - size := len(bq.queue) - if size > 0 { - arr := bq.queue[size-1] - if pos+1 >= len(this.queue) { - this.queue = append(this.queue, &BalanceQueue{}) - } - this.queue[pos+1].queue = append(this.queue[pos+1].queue, arr) - this.queue[pos].queue = bq.queue[:size-1] - arr.bqPos = len(this.queue[pos+1].queue) - 1 - arr.Array = append(arr.Array, sth) - this.pool[sth] = arr - return - } - } - return + GroupNumber int + *balancequeue.BalanceQueue + m map[int32]balancequeue.Element } // RegisterDbSaverTask 向队列中添加SaveTaskHandler -func (this *DbSaver) RegisterDbSaverTask(i interface{}) { - if st, ok := i.(SaveTaskHandler); ok { - this.pushBalanceSaverArray(st) +func (this *DbSaver) RegisterDbSaverTask(i *Player) { + if i == nil { + return } + e := balancequeue.ElementWrapper(i.Time2Save) + this.m[i.GetSnId()] = e + this.Push(e) } // UnregisterDbSaveTask 从队列中移除SaveTaskHandler -func (this *DbSaver) UnregisterDbSaveTask(i interface{}) { - if sth, ok := i.(SaveTaskHandler); ok { - if arr, exist := this.pool[sth]; exist { - delete(this.pool, sth) - count := len(arr.Array) - for i := 0; i < count; i++ { - if arr.Array[i] == sth { - arr.Array[i] = arr.Array[count-1] - arr.Array = arr.Array[:count-1] - - bqPos := arr.bqPos - queCount := len(this.queue[count].queue) - this.queue[count].queue[bqPos] = this.queue[count].queue[queCount-1] - this.queue[count].queue[bqPos].bqPos = bqPos - this.queue[count].queue = this.queue[count].queue[:queCount-1] - this.queue[count-1].queue = append(this.queue[count-1].queue, arr) - arr.bqPos = len(this.queue[count-1].queue) - 1 - return - } - } - } else { - logger.Logger.Info("Player not in dbsaver") - } +func (this *DbSaver) UnregisterDbSaveTask(i *Player) { + if i == nil { + return } + e, ok := this.m[i.GetSnId()] + if !ok { + return + } + this.Pop(e) } -// SaverArray 保存SaveTaskHandler的数组 -type SaverArray struct { - Array []SaveTaskHandler - bqPos int -} - -// BalanceQueue 保存SaveTaskHandler的队列 -type BalanceQueue struct { - queue []*SaverArray -} - -// ////////////////////////////////////////////////////////////////// -// / Module Implement [beg] -// ////////////////////////////////////////////////////////////////// func (this *DbSaver) ModuleName() string { return "dbsaver" } func (this *DbSaver) Init() { - if this.init == false { - for i := 0; i < len(this.queue); i++ { - this.queue[i] = &BalanceQueue{} - } - //初始化平衡数组,所有平衡队列容量为0 - for i := 0; i < int(this.Tick); i++ { - this.list[i] = &SaverArray{bqPos: i} - this.queue[0].queue = append(this.queue[0].queue, this.list[i]) - } - this.init = true - } -} - -func (this *DbSaver) Update() { - if this.index == this.Tick { - this.index = 0 - } - sa := this.list[this.index] - for _, sth := range sa.Array { - sth.Time2Save() - } - this.index = this.index + 1 + this.BalanceQueue = balancequeue.New(this.GroupNumber) + this.m = make(map[int32]balancequeue.Element) } func (this *DbSaver) Shutdown() { diff --git a/worldsrv/etcd.go b/worldsrv/etcd.go index 12c81b6..17767f4 100644 --- a/worldsrv/etcd.go +++ b/worldsrv/etcd.go @@ -420,7 +420,7 @@ func handlerEvent(ctx context.Context, completeKey string, isInit bool, event *c } for _, p := range targetPlayer { if p.sid != 0 { - p.Kickout(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList)) + p.Kick(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList)) } else { LoginStateMgrSington.LogoutByAccount(p.AccountId) } diff --git a/worldsrv/headurl.go b/worldsrv/headurl.go new file mode 100644 index 0000000..a6530a8 --- /dev/null +++ b/worldsrv/headurl.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" +) + +var robotHeadUrlIdx int + +func GetRobHeadUrlIdx() string { + robotHeadUrlIdx++ + if robotHeadUrlIdx > 1448 { + robotHeadUrlIdx = 1 + } + return fmt.Sprintf("https://avatar-icon.oss-cn-guangzhou.aliyuncs.com/user_head/head_%v.jpg", robotHeadUrlIdx) +} +func GetRobHeadUrl(idx int32) string { + return fmt.Sprintf("https://avatar-icon.oss-cn-guangzhou.aliyuncs.com/user_head/head_%v.jpg", idx) +} diff --git a/worldsrv/internal/playerlistener.go b/worldsrv/internal/playerlistener.go index 12b128d..b7d71af 100644 --- a/worldsrv/internal/playerlistener.go +++ b/worldsrv/internal/playerlistener.go @@ -1,12 +1,10 @@ package internal -type Player any +import "mongo.games.com/game/common" -type Scene any +var _playerListeners []interface{} -var _playerListeners []PlayerListener - -func RegisterPlayerListener(l PlayerListener) { +func RegisterPlayerListener[Player, Scene any](l PlayerListener[Player, Scene]) { for _, ll := range _playerListeners { if ll == l { return @@ -15,144 +13,192 @@ func RegisterPlayerListener(l PlayerListener) { _playerListeners = append(_playerListeners, l) } -type PlayerListener interface { +type PlayerListener[Player, Scene any] interface { + common.ClockSinker // 登出相关 OnPlayerLogined(p Player) // 玩家登录时触发 OnPlayerLogouted(p Player) // 玩家登出时触发 OnPlayerDropLine(p Player) // 玩家掉线时触发 OnPlayerRehold(p Player) // 玩家重新连接时触发 - - // 时间相关 - OnPlayerSecTimer(p Player) // 每秒触发 - OnPlayerMiniTimer(p Player) // 每分钟触发 - OnPlayerHourTimer(p Player) // 每小时触发 - OnPlayerDayTimer(p Player, login, continuous bool) // 每天触发,login表示是否登录,continuous表示是否连续登录 - OnPlayerWeekTimer(p Player) // 每周触发 - OnPlayerMonthTimer(p Player) // 每月触发 - // 业务相关 - OnPlayerEnterScene(p Player, s Scene) // 玩家进入场景时触发 - OnPlayerLeaveScene(p Player, s Scene) // 玩家离开场景时触发 - OnPlayerReturnScene(p Player, s Scene) // 玩家返回房间时触发 + OnPlayerEnterSceneBefore(p Player, s Scene) // 玩家进入场景前触发 + OnPlayerEnterSceneAfter(p Player, s Scene) // 玩家进入场景后触发 + OnPlayerLeaveSceneBefore(p Player, s Scene) // 玩家离开场景前触发 + OnPlayerLeaveSceneAfter(p Player, s Scene) // 玩家离开场景后触发 + OnPlayerReturnSceneBefore(p Player, s Scene) // 玩家返回房间前触发 + OnPlayerReturnSceneAfter(p Player, s Scene) // 玩家返回房间后触发 } -func FirePlayerLogined(p Player) { +func FirePlayerLogined[Player, Scene any](p Player) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerLogined(p) + l.(PlayerListener[Player, Scene]).OnPlayerLogined(p) } } } -func FirePlayerLogouted(p Player) { +func FirePlayerLogouted[Player, Scene any](p Player) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerLogouted(p) + l.(PlayerListener[Player, Scene]).OnPlayerLogouted(p) } } } -func FirePlayerDropLine(p Player) { +func FirePlayerDropLine[Player, Scene any](p Player) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerDropLine(p) + l.(PlayerListener[Player, Scene]).OnPlayerDropLine(p) } } } -func FirePlayerRehold(p Player) { +func FirePlayerRehold[Player, Scene any](p Player) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerRehold(p) + l.(PlayerListener[Player, Scene]).OnPlayerRehold(p) } } } -func FirePlayerSecTimer(p Player) { +func FirePlayerEnterSceneBefore[Player, Scene any](p Player, s Scene) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerSecTimer(p) + l.(PlayerListener[Player, Scene]).OnPlayerEnterSceneBefore(p, s) } } } -func FirePlayerMiniTimer(p Player) { +func FirePlayerEnterSceneAfter[Player, Scene any](p Player, s Scene) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerMiniTimer(p) + l.(PlayerListener[Player, Scene]).OnPlayerEnterSceneAfter(p, s) } } } -func FirePlayerHourTimer(p Player) { +func FirePlayerLeaveSceneBefore[Player, Scene any](p Player, s Scene) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerHourTimer(p) + l.(PlayerListener[Player, Scene]).OnPlayerLeaveSceneBefore(p, s) } } } -func FirePlayerDayTimer(p Player, login, continuous bool) { +func FirePlayerLeaveSceneAfter[Player, Scene any](p Player, s Scene) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerDayTimer(p, login, continuous) + l.(PlayerListener[Player, Scene]).OnPlayerLeaveSceneAfter(p, s) } } } -func FirePlayerWeekTimer(p Player) { +func FirePlayerReturnSceneBefore[Player, Scene any](p Player, s Scene) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerWeekTimer(p) + l.(PlayerListener[Player, Scene]).OnPlayerReturnSceneBefore(p, s) } } } -func FirePlayerMonthTimer(p Player) { +func FirePlayerReturnSceneAfter[Player, Scene any](p Player, s Scene) { for _, l := range _playerListeners { if l != nil { - l.OnPlayerMonthTimer(p) + l.(PlayerListener[Player, Scene]).OnPlayerReturnSceneAfter(p, s) } } } -func FirePlayerEnterScene(p Player, s Scene) { - for _, l := range _playerListeners { - if l != nil { - l.OnPlayerEnterScene(p, s) - } +type BasePlayerListener[Player, Scene any] struct { + common.ClockFunc +} + +func (l *BasePlayerListener[Player, Scene]) OnPlayerLogined(p Player) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerLogouted(p Player) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerDropLine(p Player) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerRehold(p Player) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerEnterSceneBefore(p Player, s Scene) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerEnterSceneAfter(p Player, s Scene) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerLeaveSceneBefore(p Player, s Scene) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerLeaveSceneAfter(p Player, s Scene) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerReturnSceneBefore(p Player, s Scene) {} +func (l *BasePlayerListener[Player, Scene]) OnPlayerReturnSceneAfter(p Player, s Scene) {} + +type PlayerListenerFunc[Player, Scene any] struct { + common.ClockFunc + OnPlayerLoginedFunc func(p Player) + OnPlayerLogoutedFunc func(p Player) + OnPlayerDropLineFunc func(p Player) + OnPlayerReholdFunc func(p Player) + OnPlayerEnterSceneBeforeFunc func(p Player, s Scene) + OnPlayerEnterSceneAfterFunc func(p Player, s Scene) + OnPlayerLeaveSceneBeforeFunc func(p Player, s Scene) + OnPlayerLeaveSceneAfterFunc func(p Player, s Scene) + OnPlayerReturnSceneBeforeFunc func(p Player, s Scene) + OnPlayerReturnSceneAfterFunc func(p Player, s Scene) +} + +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLogined(p Player) { + if l.OnPlayerLoginedFunc != nil { + l.OnPlayerLoginedFunc(p) } } -func FirePlayerLeaveScene(p Player, s Scene) { - for _, l := range _playerListeners { - if l != nil { - l.OnPlayerLeaveScene(p, s) - } +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLogouted(p Player) { + if l.OnPlayerLogoutedFunc != nil { + l.OnPlayerLogoutedFunc(p) } } -func FirePlayerReturnScene(p Player, s Scene) { - for _, l := range _playerListeners { - if l != nil { - l.OnPlayerReturnScene(p, s) - } +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerDropLine(p Player) { + if l.OnPlayerDropLineFunc != nil { + l.OnPlayerDropLineFunc(p) } } -type BasePlayerListener struct { +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerRehold(p Player) { + if l.OnPlayerReholdFunc != nil { + l.OnPlayerReholdFunc(p) + } } -func (l *BasePlayerListener) OnPlayerLogined(p Player) {} -func (l *BasePlayerListener) OnPlayerLogouted(p Player) {} -func (l *BasePlayerListener) OnPlayerDropLine(p Player) {} -func (l *BasePlayerListener) OnPlayerRehold(p Player) {} -func (l *BasePlayerListener) OnPlayerSecTimer(p Player) {} -func (l *BasePlayerListener) OnPlayerMiniTimer(p Player) {} -func (l *BasePlayerListener) OnPlayerHourTimer(p Player) {} -func (l *BasePlayerListener) OnPlayerDayTimer(p Player, login, continuous bool) {} -func (l *BasePlayerListener) OnPlayerWeekTimer(p Player) {} -func (l *BasePlayerListener) OnPlayerMonthTimer(p Player) {} -func (l *BasePlayerListener) OnPlayerEnterScene(p Player, s Scene) {} -func (l *BasePlayerListener) OnPlayerLeaveScene(p Player, s Scene) {} -func (l *BasePlayerListener) OnPlayerReturnScene(p Player, s Scene) {} +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerEnterSceneBefore(p Player, s Scene) { + if l.OnPlayerEnterSceneBeforeFunc != nil { + l.OnPlayerEnterSceneBeforeFunc(p, s) + } +} + +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerEnterSceneAfter(p Player, s Scene) { + if l.OnPlayerEnterSceneAfterFunc != nil { + l.OnPlayerEnterSceneAfterFunc(p, s) + } +} + +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLeaveSceneBefore(p Player, s Scene) { + if l.OnPlayerLeaveSceneBeforeFunc != nil { + l.OnPlayerLeaveSceneBeforeFunc(p, s) + } +} + +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerLeaveSceneAfter(p Player, s Scene) { + if l.OnPlayerLeaveSceneAfterFunc != nil { + l.OnPlayerLeaveSceneAfterFunc(p, s) + } +} + +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerReturnSceneBefore(p Player, s Scene) { + if l.OnPlayerReturnSceneBeforeFunc != nil { + l.OnPlayerReturnSceneBeforeFunc(p, s) + } +} + +func (l *PlayerListenerFunc[Player, Scene]) OnPlayerReturnSceneAfter(p Player, s Scene) { + if l.OnPlayerReturnSceneAfterFunc != nil { + l.OnPlayerReturnSceneAfterFunc(p, s) + } +} + +func RegisterPlayerListenerFunc[P, S any](l *PlayerListenerFunc[P, S]) { + common.RegisterClockFunc(&l.ClockFunc) + RegisterPlayerListener(l) +} diff --git a/worldsrv/loginstatemgr.go b/worldsrv/loginstatemgr.go index 4fb7610..4c52f6e 100644 --- a/worldsrv/loginstatemgr.go +++ b/worldsrv/loginstatemgr.go @@ -233,7 +233,7 @@ func (this *LoginStateMgr) LogoutAllBySession(session *netlib.Session) { for sid, s := range this.statesBySid { if s.gateSess == session { this.Logout(s) - p := PlayerMgrSington.GetPlayer(sid) + p := PlayerMgrSington.GetOnlinePlayer(sid) if p != nil { p.DropLine() } diff --git a/worldsrv/lotterymgr.go b/worldsrv/lotterymgr.go index 77b7165..3833728 100644 --- a/worldsrv/lotterymgr.go +++ b/worldsrv/lotterymgr.go @@ -759,6 +759,7 @@ func (l *LotteryMgr) AddCostRoomCard(plt string, snid int32, n int64) { logger.Logger.Errorf("AddCostRoomCard snid:%v not found", snid) return } + PlayerMgrSington.AddPlayer(0, item.PlayerData, nil) f() }, false) return diff --git a/worldsrv/niceid.go b/worldsrv/niceid.go deleted file mode 100644 index 93689b9..0000000 --- a/worldsrv/niceid.go +++ /dev/null @@ -1,113 +0,0 @@ -package main - -import ( - "fmt" - "math/rand" - - "mongo.games.com/game/proto" - player_proto "mongo.games.com/game/protocol/player" - server_proto "mongo.games.com/game/protocol/server" - "mongo.games.com/goserver/core" - "mongo.games.com/goserver/core/logger" -) - -var niceIdMgr = &NiceIdManager{ - SnIds: []int32{}, - UsedIds: make(map[int32]int32), -} - -type NiceIdManager struct { - SnIds []int32 - UsedIds map[int32]int32 - RobHeadUrlIdx int32 -} - -func (this *NiceIdManager) init() { - //this.SnIds = model.GetInvalidSnid() - //this.SnIds = make([]int32, 0, len(srvdata.PBDB_PlayerInfoMgr.Datas.Arr)) - //for _, value := range srvdata.PBDB_PlayerInfoMgr.Datas.Arr { - // this.SnIds = append(this.SnIds, value.GetId()) - //} - snidLen := len(this.SnIds) - logger.Logger.Info("NiceIdManager snid lens:", snidLen) - for i := 0; i < snidLen; i++ { - index := rand.Intn(snidLen) - this.SnIds[i], this.SnIds[index] = this.SnIds[index], this.SnIds[i] - } - for _, value := range niceIdMgr.SnIds { - this.UsedIds[value] = 0 - } -} -func (this *NiceIdManager) PopNiceId(user int32) int32 { - if len(this.SnIds) <= 0 { - return 0 - } - selId := this.SnIds[len(this.SnIds)-1] - this.SnIds = this.SnIds[:len(this.SnIds)-1] - this.UsedIds[selId] = user - logger.Logger.Infof("NiceIdManager pop niceid %v to %v", selId, user) - return selId -} -func (this *NiceIdManager) PushNiceId(snid int32) { - if _, ok := this.UsedIds[snid]; ok { - this.SnIds = append(this.SnIds, snid) - snidLen := len(this.SnIds) - index := rand.Intn(snidLen) - this.SnIds[snidLen-1], this.SnIds[index] = this.SnIds[index], this.SnIds[snidLen-1] - this.UsedIds[snid] = 0 - logger.Logger.Infof("NiceIdManager push niceid %v to cache", snid) - } -} -func (this *NiceIdManager) NiceIdCheck(playerid int32) { - logger.Logger.Infof("%v be used in NiceIdManager.", playerid) - if userid, ok := this.UsedIds[playerid]; ok { - delete(this.UsedIds, playerid) - if userid != 0 { - user := PlayerMgrSington.GetPlayerBySnId(userid) - if user != nil { - user.NiceId = this.PopNiceId(userid) - if user.scene != nil { - pack := &server_proto.WGNiceIdRebind{ - User: proto.Int32(userid), - NewId: proto.Int32(user.NiceId), - } - user.SendToGame(int(server_proto.SSPacketID_PACKET_GW_NICEIDREBIND), pack) - packNr := &player_proto.SCNiceIdRebind{ - SnidId: proto.Int32(userid), - NiceId: proto.Int32(user.NiceId), - } - user.scene.Broadcast(int(player_proto.PlayerPacketID_PACKET_SC_NICEIDREBIND), packNr, 0) - } - } - } else { - niceIndex := -1 - for key, value := range this.SnIds { - if value == playerid { - niceIndex = key - break - } - } - if niceIndex != -1 { - curCount := len(this.SnIds) - this.SnIds[niceIndex], this.SnIds[curCount-1] = this.SnIds[curCount-1], this.SnIds[niceIndex] - this.SnIds = this.SnIds[:curCount-1] - } - } - } -} -func (this *NiceIdManager) GetRobHeadUrlIdx() string { - this.RobHeadUrlIdx++ - if this.RobHeadUrlIdx > 1448 { - this.RobHeadUrlIdx = 1 - } - return fmt.Sprintf("https://avatar-icon.oss-cn-guangzhou.aliyuncs.com/user_head/head_%v.jpg", this.RobHeadUrlIdx) -} -func (this *NiceIdManager) GetRobHeadUrl(idx int32) string { - return fmt.Sprintf("https://avatar-icon.oss-cn-guangzhou.aliyuncs.com/user_head/head_%v.jpg", idx) -} -func init() { - core.RegisteHook(core.HOOK_BEFORE_START, func() error { - niceIdMgr.init() - return nil - }) -} diff --git a/worldsrv/platform.go b/worldsrv/platform.go index 358e01a..a6d9c1b 100644 --- a/worldsrv/platform.go +++ b/worldsrv/platform.go @@ -221,7 +221,7 @@ func (p *Platform) ChangeDisabled(disable bool) bool { } p.Disable = disable if disable { //关闭平台,踢掉平台上所有的人 - PlayerMgrSington.KickoutByPlatform(p.IdStr) + PlayerMgrSington.KickByPlatform(p.IdStr) } return true } diff --git a/worldsrv/player.go b/worldsrv/player.go index d930f16..eb8db7c 100644 --- a/worldsrv/player.go +++ b/worldsrv/player.go @@ -9,7 +9,6 @@ import ( "io" "math" "math/rand" - "os" "slices" "strconv" "time" @@ -41,8 +40,9 @@ import ( // 对应到客户端的一个玩家对象. const ( - PlayerStateOnline int = iota - PlayerStateOffline + PlayerStateCache = iota // 缓存(没有登录过,只查询过玩家数据) + PlayerStateOnline // 在线 + PlayerStateOffline // 离线(登录后掉线) ) const ( @@ -61,14 +61,6 @@ const ( UpdateField_InviteScore ) -type ErrorString struct { - code string -} - -func (this *ErrorString) Error() string { - return this.code -} - type Player struct { *model.PlayerData //po 持久化对象 diffData model.PlayerDiffData //差异数据 @@ -156,6 +148,7 @@ func NewPlayer(sid int64, pd *model.PlayerData, s *netlib.Session) *Player { layered: make(map[int]bool), miniScene: make(map[int32]*Scene), TaskInviteList: make(map[int32]int), + state: PlayerStateCache, } if p.IsRob { p.RobotRandName() @@ -183,18 +176,6 @@ func (this *Player) init() bool { return true } -func (this *Player) GenCustomerToken() string { - if this.customerToken != "" { - return this.customerToken - } - - raw := fmt.Sprintf("%v%v%v%v%v", this.SnId, this.AccountId, this.sid, common.GetAppId(), time.Now().UnixNano()) - h := md5.New() - io.WriteString(h, raw) - token := hex.EncodeToString(h.Sum(nil)) - return token -} - func (this *Player) SyncBagData(itemInfo []*bag.ItemInfo) { pack := &bag.SCSyncBagData{ Infos: itemInfo, @@ -240,6 +221,7 @@ func (this *Player) SendToGame(packetid int, rawpack interface{}) bool { return this.scene.SendToGame(packetid, rawpack) } +// LoadAfter 玩家基础信息加载后加载其他数据 func (this *Player) LoadAfter() { var replays []*internal.PlayerLoadReplay task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { @@ -275,7 +257,6 @@ func (this *Player) OnLogined() { tNow := time.Now() tLastLogout := this.PlayerData.LastLogoutTime this.PlayerData.LastLoginTime = tNow - this.PlayerData.LastLogoutTime = tNow this.dirty = true if !common.InSameDay(tNow, tLastLogout) { //跨天 logger.Logger.Infof("(this *Player) OnLogined(%v) inSameDay LastLogoutTime(%v)", this.SnId, tLastLogout) @@ -338,7 +319,7 @@ func (this *Player) OnLogined() { this.SendJackPotInit() - this.GetShopInfo() + this.DealShopLog() PlayerOnlineSington.Check = true @@ -370,7 +351,6 @@ func (this *Player) OnLogined() { this.OnlineLogLogin() - this.SendToRepSrv(this.PlayerData) //红点检测 this.CheckShowRed() @@ -386,11 +366,6 @@ func (this *Player) OnRehold() { var gameid int if this.scene != nil && this.scene.gameSess != nil { - //if this.scene.sceneId == SceneMgrSingleton.GetDgSceneId() { - // // DG特殊处理 - // //如果是之前进入的是DG游戏,就退出DG游戏 - // this.DgGameLogout() - //} else { // 告诉游戏服务玩家重连 var gateSid int64 if this.gateSess != nil { @@ -425,7 +400,7 @@ func (this *Player) OnRehold() { this.SendJackPotInit() PlayerOnlineSington.Check = true - this.GetShopInfo() + this.DealShopLog() this.CheckShowRed() @@ -772,6 +747,7 @@ func (this *Player) DelMessage(id string, del int32) bool { } return false } + func (this *Player) MessageShowRed() { msgMap := make(map[int64]int) for _, msg := range this.msgs { @@ -795,60 +771,6 @@ func (this *Player) MessageShowRed() { } } -/* -func (this *Player) DelAllMessage() bool { - - var keys []string - args := &model.DelAllMsgArgs{} - pack := &msg_proto.SCMessageDel{} - for key, _ := range this.msgs { - if msg, exist := this.msgs[key]; exist { - if msg.State == model.MSGSTATE_REMOVEED { - break - } - msg.State = model.MSGSTATE_REMOVEED - // model.DelMessage(msg.Id, msg.Platform) - keys = append(keys, key) - pack.Ids = append(pack.Ids, msg.Id.Hex()) - args.Ids = append(args.Ids, msg.Id) - } - } - for _, key := range keys { - delete(this.msgs, key) - } - - task.New(nil, - task.CallableWrapper(func(o *basic.Object) interface{} { - return model.DelAllMessage(args) - }), - task.CompleteNotifyWrapper(func(data interface{}, tt task.Task) { - if data == nil { - pack := &msg_proto.SCMessageDel{} - for _, id := range keys { - pack.Ids = append(pack.Ids, id) - delete(this.msgs, id) - } - proto.SetDefaults(pack) - this.SendToClient(int(msg_proto.MSGPacketID_PACKET_SC_MESSAGEDEL), pack) - for _, msg := range this.msgs { - if msg.State == model.MSGSTATE_REMOVEED { - break - } - msg.State = model.MSGSTATE_REMOVEED - } - - //删除此邮件 - - } - }), "DelMessage").StartByFixExecutor("logic_message") - - proto.SetDefaults(pack) - this.SendToClient(int(msg_proto.MSGPacketID_PACKET_SC_MESSAGEDEL), pack) - - return true - -}*/ - func (this *Player) AddMessage(msg *model.Message) { if msg == nil { return @@ -969,16 +891,6 @@ func (this *Player) verifyMessage(maxCreatTs int64) { } } -func (this *Player) EditMessage(msg *model.Message) { - if msg == nil { - return - } - - if _, exist := this.msgs[msg.Id.Hex()]; exist { - this.msgs[msg.Id.Hex()] = msg - } -} - func (this *Player) TestMail() { var newMsg *model.Message @@ -1018,9 +930,6 @@ func (this *Player) TestSubMail() { }), "TestSubSendMessage").Start() } -func (this *Player) ClubChangeCoin(gainWay int32, coin int64, remark string) { - this.AddCoin(coin, 0, gainWay, "", remark) -} func (this *Player) GetMessageAttach(id string) { if msg, exist := this.msgs[id]; exist { if msg.AttachState == model.MSGATTACHSTATE_DEFAULT && (msg.Coin > 0 || msg.Ticket > 0 || @@ -1209,20 +1118,44 @@ func (this *Player) GetMessageByGiftId(id string) *model.Message { return nil } -// 踢掉线 -func (this *Player) Kickout(reason int32) { +func (this *Player) IsOnLine() bool { + return this.state != PlayerStateOffline +} + +func (this *Player) SetOnline() { + this.state = PlayerStateOnline + this.UpdateLastLogoutTime() +} + +func (this *Player) IsOffline() bool { + return this.state == PlayerStateOffline +} + +func (this *Player) SetOffline() { + this.state = PlayerStateOffline + this.UpdateLastLogoutTime() +} + +func (this *Player) IsCacheState() bool { + return this.state == PlayerStateCache +} + +func (this *Player) UpdateLastLogoutTime() { + this.PlayerData.LastLogoutTime = time.Now() +} + +// Kick 踢掉线 +func (this *Player) Kick(reason int32) { if this.IsOnLine() { - logger.Logger.Trace("(this *Player) Kickout()", this.SnId) + logger.Logger.Trace("(this *Player) Kick()", this.SnId) scDisconnect := &loginproto.SSDisconnect{ SessionId: proto.Int64(this.sid), Type: proto.Int32(reason), } - proto.SetDefaults(scDisconnect) this.SendToClient(int(loginproto.GatePacketID_PACKET_SS_DICONNECT), scDisconnect) LoginStateMgrSington.LogoutBySid(this.sid) this.DropLine() - this.DgGameLogout() } TournamentMgr.ForceQuit(this.Platform, this.SnId) } @@ -1252,13 +1185,9 @@ func (this *Player) DropLine() { this.SendPlayerCoin() this.OnlineLogDrop() - PlayerOnlineSington.Check = true } - this.SetOffline() - this.PlayerData.LastLogoutTime = time.Now().Local() - FriendMgrSington.UpdateLogoutTime(this.Platform, this.SnId) if this.scene != nil && this.scene.gameSess != nil { pack := &serverproto.WGPlayerDropLine{ Id: proto.Int32(this.SnId), @@ -1267,120 +1196,43 @@ func (this *Player) DropLine() { proto.SetDefaults(pack) this.SendToGame(int(serverproto.SSPacketID_PACKET_WG_PLAYERDROPLINE), pack) } - PlayerMgrSington.DroplinePlayer(this) - this.sid = 0 - this.gateSess = nil - //统计在线时长日志 - //this.StatisticsOllen(this.PlayerData.LastLogoutTime) + + FriendMgrSington.UpdateLogoutTime(this.Platform, this.SnId) + PlayerMgrSington.DropPlayer(this) } -// 退出 +// Logout 主动登出 func (this *Player) Logout() { logger.Logger.Tracef("(this *Player) Logout() %v", this.SnId) - //退出比赛 - //this.QuitMatch(false) - // 在线奖励:累计在线时长 - //this.OnlineRewardAddUpOnlineDuration() - scLogout := &loginproto.SCLogout{ OpRetCode: loginproto.OpResultCode_OPRC_Sucess, } - proto.SetDefaults(scLogout) this.SendToClient(int(loginproto.LoginPacketID_PACKET_SC_LOGOUT), scLogout) - this.SetOffline() - this.LastLogoutTime = time.Now().Local() + FriendMgrSington.UpdateLogoutTime(this.Platform, this.SnId) - //clubManager.DropLinePlayer(this.SnId) - PlayerMgrSington.DroplinePlayer(this) + PlayerMgrSington.DropPlayer(this) +} + +// OnLogoutFinish 玩家登出完成 +func (this *Player) OnLogoutFinish() { + logger.Logger.Tracef("(this *Player) OnLogoutFinish() %v", this.SnId) + if !this.IsRobot() { - PlayerOnlineSington.Check = true - } - this.sid = 0 - this.gateSess = nil - this.DgGameLogout() - this.OnlineLogLogout() -} - -func (this *Player) DgGameLogout() { - //if this.scene != nil { - // if this.scene.sceneId == SceneMgrSingleton.GetDgSceneId() { - // var agentName, agentKey, thirdPlf string - // if len(this.BakDgHboName) > 0 { - // if strings.Contains(this.BakDgHboName, "dg") { - // agentName, agentKey, thirdPlf = model.OnlyGetDgConfigByPlatform(this.Platform) - // } else { - // agentName, agentKey, thirdPlf = model.OnlyGetHboConfigByPlatform(this.Platform) - // } - // - // task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { - // webapi.API_DgLogout(thirdPlf, common.GetAppId(), this.DgGame, this.DgPass, agentName, agentKey) - // return nil - // }), task.CompleteNotifyWrapper(func(data interface{}, t *task.Task) { - // this.scene = nil - // }), "DgGameLogout").Start() - // } - // - // } - //} -} - -func (this *Player) ThirdGameLogout() { - -} - -func (this *Player) IsOnLine() bool { - return this.state != PlayerStateOffline -} - -func (this *Player) SetOnline() { - this.state = PlayerStateOnline -} - -func (this *Player) IsOffline() bool { - return this.state == PlayerStateOffline -} - -func (this *Player) SetOffline() { - this.state = PlayerStateOffline -} - -// OnLogouted 玩家登出 -func (this *Player) OnLogouted() { - logger.Logger.Tracef("(this *Player) OnLogouted() %v", this.SnId) - - //在线时长日志 - //this.WriteOllenLog() - - if !this.IsRob { FriendUnreadMgrSington.SaveFriendUnreadData(this.Platform, this.SnId) - } - //平台数据 - //PlayerSingleAdjustMgr.DelPlayerData(this.Platform, this.SnId) + PlayerOnlineSington.Check = true - //离线玩家清空俱乐部信息 - //delete(clubManager.theInClubId, this.SnId) - - //登录日志 - logState := LoginStateMgrSington.GetLoginStateBySid(this.sid) - var clog *model.ClientLoginInfo - if logState != nil { - clog = logState.clog - } - //排除掉机器人 - if !this.IsRob { + //登录日志 + logState := LoginStateMgrSington.GetLoginStateBySid(this.sid) + var clog *model.ClientLoginInfo + if logState != nil { + clog = logState.clog + } mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeLogout, this.Tel, this.Ip, this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(), 0, 0, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId, this.ClientVer)) + this.OnlineLogLogout() } - - //退出通知 - //ActMonitorMgrSington.SendActMonitorEvent(ActState_Login, this.SnId, this.Name, this.Platform, 0, 0, "", 1) - - // 更新数据库 - logger.Logger.Tracef("###%v unmount from DBSaver[DelPlayer]", this.Name) - DbSaveInst.UnregisterDbSaveTask(this) - this.Save(true) } func (this *Player) MarshalData() (d []byte, e error) { @@ -1509,125 +1361,27 @@ func (this *Player) MarshalCParam() []*serverproto.PlayerCParam { return params } -func (this *Player) SendToRepSrv(pd *model.PlayerData) { - //replaySess := srvlib.ServerSessionMgrSington.GetSession(common.GetSelfAreaId(), ReplayServerType, ReplayServerId) - //if replaySess != nil { - // var buf bytes.Buffer - // enc := gob.NewEncoder(&buf) - // err := enc.Encode(pd) - // if err != nil { - // logger.Logger.Info("(this *Player) SendToRepSrv json.Marshal error", err) - // } else { - // pack := &server_proto.WRPlayerData{ - // PlayerData: buf.Bytes(), - // } - // proto.SetDefaults(pack) - // replaySess.Send(int(server_proto.SSPacketID_PACKET_WR_PlayerData), pack) - // } - //} -} - -func (this *Player) CanDelete() bool { - if this.isDelete { - return true - } - return !this.IsOnLine() && - !this.dirty && - time.Now().Sub(this.lastSaved) > time.Minute*5 && - this.scene == nil -} - func (this *Player) Time2Save() { - logger.Logger.Tracef("player save %v", this.SnId) + if this == nil { + return + } + + isForce := false if common.Config.IsDevMode { - this.Save(true) - } else { - this.Save(false) + isForce = true // 开发模式下强制保存 } - if this != nil && this.CanDelete() { + + PlayerMgrSington.SavePlayer(this, true, isForce) + + if this.isDelete || (!this.IsOnLine() && !this.dirty && time.Now().Sub(this.lastSaved) > time.Minute*5 && this.scene == nil) { PlayerMgrSington.DelPlayer(this.SnId) } } -func (this *Player) Save(force bool) { - if this.isDelete { - return - } - - if this.IsRob { - return - } - - pd := model.ClonePlayerData(this.PlayerData) - this.SendPlayerCoin() - - if !this.dirty && !force { - return - } - - if pd == nil { - logger.Logger.Errorf("Player Time2Save() %v pd is nil", this.SnId) - return - } - logger.Logger.Infof("Player Time2Save() %v", this.SnId) - - this.dirty = true - // 跨天任务依赖LastLogoutTime的准确性,跨天任务是定时器common.ClockMgrSington触发的,所以这里要用定时器的触发时间 - pd.LastLogoutTime = common.ClockMgrSingleton.LastTickTime - - t := task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { - if !model.SavePlayerData(pd) { - //save 失败先写到json里面 - model.BackupPlayerData(pd) - return false - } - for _, v := range internal.GetPlayerLoads() { - v.Save(pd.Platform, pd.SnId, true, force) - } - return true - }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { - if saved, ok := i.(bool); ok && saved { - bak := fmt.Sprintf("%v.json", pd.AccountId) - if exist, _ := common.PathExists(bak); exist { - os.Remove(bak) - } - this.dirty = false - } - }), "SavePlayerTask") - if b := t.StartByExecutor(fmt.Sprintf("Player%v", this.SnId)); b { - this.lastSaved = time.Now() - } -} - func (this *Player) GetCoin() int64 { return this.Coin } -//func (this *Player) TotalData(num int64, gainWay int32) { -// if this.IsRob { -// return -// } -// //num = int64(math.Abs(float64(num))) -// //sort := common.GetSortByGainWay(gainWay) -// //switch sort { -// //case common.GainWaySort_Act: -// // //活动金额累加 -// // this.ActivityCoin += int32(num) -// //case common.GainWaySort_Club: -// // switch gainWay { -// // case common.GainWay_ClubGiveCoin: //出账 -// // //俱乐部出账 -// // this.ClubOutCoin += num -// // case common.GainWay_ClubGetCoin: -// // //俱乐部入账 -// // this.ClubInCoin += num -// // } -// //case common.GainWaySort_Rebate: -// // //返利获取 也叫 手动洗码 -// // this.TotalRebateCoin += num -// //} -//} - // AddDiamond 添加钻石 // num 总数 // add num总数中有多少是加成获得 @@ -1793,25 +1547,6 @@ func (this *Player) AddCoinAsync(num, add int64, gainWay int32, oper, remark str return async } -//func (this *Player) AddClubCoin(num int64, gainWay int32, oper, remark string) { -// if num == 0 { -// return -// } -// this.TotalData(num, gainWay) -// this.ClubCoin += num -// -// if num != 0 { -// this.dirty = true -// this.SendDiffData() -// restCnt := this.ClubCoin -// log := model.NewCoinLogEx(this.SnId, num, restCnt, this.SafeBoxCoin, this.Ver, gainWay, 0, -// oper, remark, this.Platform, this.Channel, this.BeUnderAgentCode, 0, this.PackageID, 0) -// if log != nil { -// CoinLogChannelSington.Write(log) -// } -// } -//} - func (this *Player) AddTicket(num int64, gainWay int32, oper, remark string) { if num == 0 { return @@ -2438,217 +2173,6 @@ func (this *Player) GetPromoterKey() (string, error) { return GetPromoterKey(this.PromoterTree, this.BeUnderAgentCode, this.Channel) } -//计算流水可以兑换的值 返回 还需要多少流水 赠送扣除 强制费用 合计流水 -//func GetExchangeFlowTotal(pd *model.PlayerData, playerTotalFlow int64, givesInfo []*model.CoinGiveLog) (int64, -// int64, int64, int64) { -// //可兑换的流水 -// var flow int64 -// -// var giveLostCoin int64 //赠送扣除 -// var forceTax int64 //强制费用 -// var needTotalFlow int64 //需要的流水 -// var lockCoin int64 //多少金额无法兑换,如果兑换需要强制扣除行政费用 -// -// retIds := []string{} -// retAllIds := []string{} -// -// exchangeFlow := GetExchangeFlow(pd) -// exchangeGiveFlow := GetExchangeGiveFlow(pd) -// exchangeForceTax := GetExchangeForceTax(pd) -// -// if GetExchangeFlag(pd) > 0 { -// -// //逐笔计算兑换流水金额,从上到下 -// curTotalFlow := playerTotalFlow -// -// //按照时间排序 -// sort.Slice(givesInfo, func(i, j int) bool { return givesInfo[i].Ts > givesInfo[j].Ts }) -// -// for i := 0; i < len(givesInfo); i++ { -// info := givesInfo[i] -// if info.Ts > pd.LastExchangeTime { -// retAllIds = append(retAllIds, info.LogId.Hex()) -// //计算是否通过稽核 -// needFlow := int64(0) -// curTotalFlow += info.FLow -// //如果是系统赠送的,需要全部扣除 -// if info.RecType == model.COINGIVETYPE_SYSTEM { -// exchangeGiveFlowS := exchangeGiveFlow -// t := ActMgrSington.GetExchangeFlow(pd.Platform, info.LogType) -// if t != 0 { -// exchangeGiveFlowS = t -// } -// -// if info.NeedGiveFlowRate > 0 { -// exchangeGiveFlowS = info.NeedGiveFlowRate -// } -// -// needFlow = int64(math.Floor(float64(info.GiveCoin)*float64(exchangeGiveFlowS)/100)) * 100 -// -// if curTotalFlow < needFlow { -// //需要扣除 -// giveLostCoin += info.GiveCoin -// lockCoin += info.GiveCoin -// flow += needFlow - curTotalFlow -// curTotalFlow = 0 -// } else { -// curTotalFlow -= needFlow -// retIds = append(retIds, info.LogId.Hex()) -// } -// } else { -// exchangeGiveFlowS := exchangeGiveFlow -// t := ActMgrSington.GetExchangeFlow(pd.Platform, info.LogType) -// if t != 0 { -// exchangeGiveFlowS = t -// } -// if info.NeedGiveFlowRate > 0 { -// exchangeGiveFlowS = info.NeedGiveFlowRate -// } -// -// exchangePayFlowS := exchangeFlow -// if info.NeedFlowRate > 0 { -// exchangePayFlowS = info.NeedFlowRate -// } -// -// //分两部分扣除 -// needFlow = int64(math.Floor(float64(info.GiveCoin)*float64(exchangeGiveFlowS)/100)) * 100 -// needFlow += int64(math.Floor(float64(info.PayCoin)*float64(exchangePayFlowS)/100)) * 100 -// if curTotalFlow < needFlow { -// //需要扣除 -// giveLostCoin += info.GiveCoin -// //强制费用 -// forceTax += info.PayCoin * int64(exchangeForceTax) / 10000 -// lockCoin += info.GiveCoin -// lockCoin += info.PayCoin -// flow += needFlow - curTotalFlow -// curTotalFlow = 0 -// } else { -// curTotalFlow -= needFlow -// retIds = append(retIds, info.LogId.Hex()) -// } -// } -// needTotalFlow += needFlow -// } -// } -// } -// -// return flow, giveLostCoin, forceTax, needTotalFlow -//} -// -////pageNo 1开始 -//func GetExchangeFlowTotalPacket(playerTotalFlow int64, givesInfo []*model.CoinGiveLog, pd *model.PlayerData, -// pageNo, pageNum int32, isCheck bool) *shop_proto.SCGetPlayerPayFlowList { -// pack := &shop_proto.SCGetPlayerPayFlowList{} -// var giveLostCoin int64 //赠送扣除 -// var forceTax int64 //强制费用 -// var needTotalFlow int64 //需要的流水 -// startIndex := (pageNo - 1) * pageNum -// endIndex := pageNo * pageNum -// //platform := this.GetPlatform() -// exchangeFlow := GetExchangeFlow(pd) -// exchangeGiveFlow := GetExchangeGiveFlow(pd) -// exchangeForceTax := GetExchangeForceTax(pd) -// -// //按照时间排序 -// sort.Slice(givesInfo, func(i, j int) bool { return givesInfo[i].Ts > givesInfo[j].Ts }) -// //逐笔计算兑换流水金额,从上到下p -// curTotalFlow := playerTotalFlow -// -// index := int32(0) -// -// if GetExchangeFlag(pd) > 0 { -// for i := 0; i < len(givesInfo); i++ { -// info := givesInfo[i] -// if isCheck || info.Ts > pd.LastExchangeTime { -// tInfo := &shop_proto.PlayerPayFlowLog{} -// tInfo.Ts = proto.Int64(info.Ts) -// tInfo.PayType = proto.Int32(info.RecType) -// tInfo.PayCoin = proto.Int64(info.PayCoin) -// tInfo.GiveCoin = proto.Int64(info.GiveCoin) -// tInfo.FinishFlow = proto.Int64(info.FLow) -// tInfo.OrderID = proto.String(info.LogId.Hex()) -// //计算是否通过稽核 -// needFlow := int64(0) -// isPass := int32(0) -// curTotalFlow += info.FLow -// //如果是系统赠送的,需要全部扣除 -// if info.RecType == model.COINGIVETYPE_SYSTEM { -// exchangeGiveFlowS := exchangeGiveFlow -// t := ActMgrSington.GetExchangeFlow(pd.Platform, info.LogType) -// if t != 0 { -// exchangeGiveFlowS = t -// } -// if info.NeedGiveFlowRate > 0 { -// exchangeGiveFlowS = info.NeedGiveFlowRate -// } -// needFlow = int64(math.Floor(float64(info.GiveCoin)*float64(exchangeGiveFlowS)/100)) * 100 -// tInfo.GiveNeedFlow = proto.Int64(needFlow) -// if curTotalFlow < needFlow { -// //需要扣除 -// giveLostCoin += info.GiveCoin -// tInfo.ForceGiveCoin = proto.Int64(info.GiveCoin) -// -// curTotalFlow = 0 -// } else { -// curTotalFlow -= needFlow -// isPass = 1 -// } -// } else { -// exchangeGiveFlowS := exchangeGiveFlow -// t := ActMgrSington.GetExchangeFlow(pd.Platform, info.LogType) -// if t != 0 { -// exchangeGiveFlowS = t -// } -// -// if info.NeedGiveFlowRate > 0 { -// exchangeGiveFlowS = info.NeedGiveFlowRate -// } -// exchangePayFlowS := exchangeFlow -// if info.NeedFlowRate > 0 { -// exchangePayFlowS = info.NeedFlowRate -// } -// //分两部分扣除 -// needFlow = int64(math.Floor(float64(info.GiveCoin)*float64(exchangeGiveFlowS)/100)) * 100 -// tInfo.GiveNeedFlow = proto.Int64(needFlow) -// -// payNeedFlow := int64(math.Floor(float64(info.PayCoin)*float64(exchangePayFlowS)/100)) * 100 -// tInfo.PayNeedFlow = proto.Int64(payNeedFlow) -// needFlow += payNeedFlow -// -// if curTotalFlow < needFlow { -// //需要扣除 -// giveLostCoin += info.GiveCoin -// tInfo.ForceGiveCoin = proto.Int64(info.GiveCoin) -// -// //强制费用 -// forceTax += info.PayCoin * int64(exchangeForceTax) / 10000 -// tInfo.ForceTax = proto.Int64(info.PayCoin * int64(exchangeForceTax) / 10000) -// curTotalFlow = 0 -// } else { -// curTotalFlow -= needFlow -// isPass = 1 -// } -// } -// -// tInfo.IsPass = proto.Int32(isPass) -// needTotalFlow += needFlow -// -// if index >= startIndex && index < endIndex { -// pack.Data = append(pack.Data, tInfo) -// } -// -// index += 1 -// } -// } -// } -// pack.PageNo = proto.Int32(int32(pageNo)) -// pack.PageSum = proto.Int32(int32(math.Ceil(float64(index) / float64(pageNum)))) -// pack.PageSize = proto.Int32(pageNum) -// pack.TotalNum = proto.Int32(index) -// proto.SetDefaults(pack) -// return pack -//} - func (this *Player) SendPlayerInfo() { scPlayerData := &playerproto.SCPlayerData{ OpRetCode: playerproto.OpResultCode_OPRC_Sucess, @@ -2772,48 +2296,6 @@ func (this *Player) SendPlayerInfo() { this.SCDataConfig(common.DataConfigAll) } -//func (this *Player) SendJackpotInfo() { -// //通知所有的gamesrv向玩家发送奖池信息 -// if this.gateSess != nil { -// var gateSid int64 -// if srvInfo, ok := this.gateSess.GetAttribute(srvlib.SessionAttributeServerInfo).(*srvlibproto.SSSrvRegiste); ok && srvInfo != nil { -// sessionId := srvlib.NewSessionIdEx(srvInfo.GetAreaId(), srvInfo.GetType(), srvInfo.GetId(), 0) -// gateSid = sessionId.Get() -// } -// -// //查找当前平台下所以开放的游戏id -// info := make([]*server_proto.GameInfo, 0) -// gps := PlatformMgrSingleton.GetGameFrees(this.Platform) -// for _, v := range gps { -// if v.Status { -// if v.DbGameFree.GetGameRule() != 0 { -// //lgi := &server_proto.GameInfo{ -// // GameId: proto.Int32(v.DbGameFree.GetGameId()), -// // GameFreeId: proto.Int32(v.DbGameFree.GetId()), -// // GameType: proto.Int32(v.DbGameFree.GetGameType()), -// //} -// info = append(info, &server_proto.GameInfo{ -// GameId: proto.Int32(v.DbGameFree.GetGameId()), -// GameFreeId: proto.Int32(v.DbGameFree.GetId()), -// GameType: proto.Int32(v.DbGameFree.GetGameType()), -// }) -// } -// } -// } -// -// servers := GameSessMgrSington.GetAllGameSess() -// for _, v := range servers { -// pack := &server_proto.WGGameJackpot{ -// Sid: this.sid, -// GateSid: gateSid, -// Platform: this.Platform, -// Info: info, -// } -// v.Send(int(server_proto.SSPacketID_PACKET_WG_GAMEJACKPOT), pack) -// } -// } -//} - func (this *Player) IsGM() bool { if this.GMLevel > 0 { return true @@ -2911,15 +2393,6 @@ func (this *Player) ReportLoginEvent() { } } -func (this *Player) ReportBindPhoneEvent() { - //升级账号事件 - if !this.IsRob { - //LogChannelSingleton.WriteMQData(model.GenerateBindEvent(model.CreatePlayerBindPhoneEvent( - // this.SnId, this.Channel, this.BeUnderAgentCode, this.Platform, this.City, this.DeviceOS, - // this.CreateTime, this.TelephonePromoter))) - } -} - func (this *Player) ReportBindAlipayEvent() { //绑定支付宝事件 //if !this.IsRob { @@ -2934,55 +2407,6 @@ func (this *Player) ReportBindAlipayEvent() { //} } -// 破产事件 -func (this *Player) ReportBankRuptcy(gameid, gamemode, gamefreeid int32) { - //if !this.IsRob { - // d, e := model.MarshalBankruptcyEvent(2, this.SnId, this.TelephonePromoter, this.Channel, this.BeUnderAgentCode, - // this.Platform, this.City, this.CreateTime, gameid, gamemode, gamefreeid) - // if e == nil { - // rmd := model.NewInfluxDBData("hj.player_bankruptcy", d) - // if rmd != nil { - // InfluxDBDataChannelSington.Write(rmd) - // } - // } - //} -} - -func (this *Player) CheckType(gameid, gamefreeId int32) *serverproto.DB_PlayerType { - types := srvdata.PlayerTypeMgrSington.GetPlayerType(gamefreeId) - cnt := len(types) - if cnt > 0 { - var pgs model.PlayerGameStatics - if this.GDatas != nil { - if d, exist := this.GDatas[strconv.Itoa(int(gameid))]; exist { - pgs = d.Statics - } - } - - //赔率 产出/投入 万分比 - odds := int64(float64(float64(pgs.TotalOut+1)/float64(pgs.TotalIn+1)) * 10000) - if odds > 10000000 { - odds = 10000000 - } - for i := 0; i < cnt; i++ { - t := types[i] - logger.Logger.Warn("Player CheckType 0 ", this.CoinPayTotal, t.GetPayLowerLimit(), t.GetPayUpperLimit(), pgs.GameTimes, - t.GetGameTimeLowerLimit(), t.GetGameTimeUpperLimit(), pgs.TotalIn, t.GetTotalInLowerLimit(), t.GetTotalInUpperLimit(), - odds, t.GetOddsLowerLimit(), t.GetOddsUpperLimit()) - if t != nil { - if this.CoinPayTotal >= int64(t.GetPayLowerLimit()) && this.CoinPayTotal <= int64(t.GetPayUpperLimit()) && - pgs.GameTimes >= int64(t.GetGameTimeLowerLimit()) && pgs.GameTimes <= int64(t.GetGameTimeUpperLimit()) && - pgs.TotalIn >= int64(t.GetTotalInLowerLimit()) && pgs.TotalIn <= int64(t.GetTotalInUpperLimit()) && - odds >= int64(t.GetOddsLowerLimit()) && odds <= int64(t.GetOddsUpperLimit()) { - return t - } - } - } - } - return nil -} - -// 线程不安全,避免异步任务调用 func (this *Player) GetPlatform() *Platform { platform := PlatformMgrSingleton.GetPlatform(this.Platform) if platform != nil && platform.Isolated { @@ -3006,10 +2430,6 @@ func (this *Player) RobotRandName() { return } -func (this *Player) PlayerMacAbnormal() bool { - return false //s.HasSameIp(p.Ip) || s.HasSameMac() || s.HasSameTel() || s.HasSamePostion() -} - // 这个冲账记录不可随便写,需要加该日志时,请找lyk确认,暂定依据是金币直接加到身上,不依赖其他数据状态的可以写该日志 // 业务准则:先更新标记,再写冲账记录 func (this *Player) AddPayCoinLog(coin int64, coinType int32, oper string) { @@ -3042,162 +2462,6 @@ func (this *Player) AddPayCoinLog(coin int64, coinType int32, oper string) { } } -// 充值回调 -func (this *Player) SendPlayerRechargeAnswer(coin int64) { - if this.Tel == "" { - pack := &playerproto.SCPlayerRechargeAnswer{ - OpParam: proto.Int64(1), - AddCoin: proto.Int64(coin), - Coin: proto.Int64(this.Coin), - SafeBoxCoin: proto.Int64(this.SafeBoxCoin), - } - proto.SetDefaults(pack) - this.SendToClient(int(playerproto.PlayerPacketID_PACKET_SC_PLAYERRECHARGEANSWER), pack) - } -} - -// -//// 在线奖励: 重置, 清零在线时长及奖励领取信息 -//func (this *Player) OnlineRewardReset() { -// this.PlayerData.OnlineRewardData.OnlineDuration = 0 -// this.PlayerData.OnlineRewardData.RewardReceived = 0 -// this.PlayerData.OnlineRewardData.Ts = time.Now().Unix() -// this.dirty = true -//} -// -//// 在线奖励: (Logout时)累计在线时长 -//func (this *Player) OnlineRewardAddUpOnlineDuration() { -// if this.state != PlayerState_Online { -// return -// } -// -// tNow := time.Now() -// inSameDay := common.InSameDay(tNow, time.Unix(this.PlayerData.OnlineRewardData.Ts, 0)) -// if inSameDay { -// this.PlayerData.OnlineRewardData.OnlineDuration += uint32(tNow.Unix() - this.PlayerData.OnlineRewardData.Ts) -// } else { -// this.PlayerData.OnlineRewardData.OnlineDuration = uint32(tNow.Unix() - now.New(tNow).BeginningOfDay().Unix()) -// } -// -// this.PlayerData.OnlineRewardData.Ts = tNow.Unix() -// this.dirty = true -//} -// -//// 在线奖励: (实时)获取在线时长 -//func (this *Player) OnlineRewardGetOnlineDuration() uint32 { -// this.OnlineRewardAddUpOnlineDuration() -// return this.PlayerData.OnlineRewardData.OnlineDuration -//} - -// 幸运转盘 -//func (this *Player) LuckyTurntableSwitchScore(continuous bool) { -// if continuous { -// this.PlayerData.LuckyTurnTableData.Score = this.PlayerData.LuckyTurnTableData.TomorrowScore + -// int64(this.PlayerData.LuckyTurnTableData.TomorrowFloatScore/100) -// } else { -// this.PlayerData.LuckyTurnTableData.Score = 0 -// } -// -// this.PlayerData.LuckyTurnTableData.TomorrowScore = 0 -// this.PlayerData.LuckyTurnTableData.TomorrowFloatScore = 0 -// this.dirty = true -//} - -func (this *Player) SyncSafeBoxCoinToGame() { - pack := &serverproto.WGSyncPlayerSafeBoxCoin{ - SnId: proto.Int32(this.SnId), - SafeBoxCoin: proto.Int64(this.SafeBoxCoin), - } - proto.SetDefaults(pack) - this.SendToGame(int(serverproto.SSPacketID_PACKET_WG_SyncPlayerSafeBoxCoin), pack) -} - -//func (this *Player) GetDgHboPlayerName(plt *Platform) (string, string) { -// if plt == nil { -// return "", "" -// } -// if plt.DgHboConfig == 0 { -// return this.DgGame, this.DgPass -// } else if plt.DgHboConfig == 1 { -// return this.StoreDgGame, this.StoreDgPass -// } else if plt.DgHboConfig == 2 { -// return this.StoreHboGame, this.StoreHboPass -// } -// return "", "" -//} -// -//func (this *Player) SetDgHboPlayerName(plt *Platform, name, pass string) { -// if plt == nil { -// return -// } -// -// if plt.DgHboConfig == 0 { -// this.DgGame = name -// this.DgPass = pass -// if strings.Contains(name, "dg") { -// this.StoreDgGame = name -// this.StoreDgPass = pass -// } else { -// this.StoreHboGame = name -// this.StoreHboPass = pass -// } -// } else if plt.DgHboConfig == 1 { -// this.StoreDgGame = name -// this.StoreDgPass = pass -// } else if plt.DgHboConfig == 2 { -// this.StoreHboGame = name -// this.StoreHboPass = pass -// } -// -//} - -func (this *Player) AddCoinPayTotal(coin int64) { - this.CoinPayTotal += coin -} - -func (this *Player) SendPlatformCanUsePromoterBind() { - state := int32(0) - plt := PlatformMgrSingleton.GetPlatform(this.Platform) - if plt != nil { - if plt.IsCanUserBindPromoter { - state = 1 - if this.BeUnderAgentCode != "" && this.BeUnderAgentCode != "0" { - state = 2 - } - } - } - - pack := &playerproto.SCBindPromoterState{ - BindState: proto.Int32(state), - } - - proto.SetDefaults(pack) - this.SendToClient(int(playerproto.PlayerPacketID_PACKET_SC_BINDPROMOTERSTATE), pack) -} - -func (this *Player) RedirectByGame(packetid int, rawpack interface{}) bool { - if this.scene == nil || this.scene.gameSess == nil || this.scene.gameSess.Session == nil { - logger.Logger.Tracef("[%v] sess == nil ", this.Name) - return false - } - if rawpack == nil { - logger.Logger.Trace(" rawpack == nil ") - return false - } - - data, err := netlib.MarshalPacket(packetid, rawpack) - if err == nil { - pack := &serverproto.SSRedirectToPlayer{ - SnId: proto.Int32(this.SnId), - PacketId: proto.Int(packetid), - Data: data, - } - proto.SetDefaults(pack) - return this.SendToGame(int(serverproto.SSPacketID_PACKET_SS_REDIRECTTOPLAYER), pack) - } - return false -} - // SyncPlayerDataToGateSrv 玩家信息同步到网关 func (this *Player) SyncPlayerDataToGateSrv(pd *model.PlayerData) { var buf bytes.Buffer @@ -3282,6 +2546,7 @@ func (this *Player) SyncGameCoin(sceneid int, enterts int64) { this.SendDiffData() }), "GetCoinWALBySnidAndInGameAndGreaterTs").Start() } + func (this *Player) SendShowRed(showType hallproto.ShowRedCode, showChild, isShow int32) { pack := &hallproto.SCShowRed{ ShowRed: &hallproto.ShowRed{ @@ -3295,18 +2560,6 @@ func (this *Player) SendShowRed(showType hallproto.ShowRedCode, showChild, isSho this.SendToClient(int(hallproto.HallPacketID_PACKET_SC_SHOWRED), pack) } -//func (this *Player) SCVIPBuy(buy int64) { -// //buy *= 10000 -// //this.AddMoneyPayTotal(buy) -// //this.GetVIPLevel(0) // 更新下vip等级 -// pack := &playerproto.SCVIPBuy{ -// OpRetCode: playerproto.OpResultCode_OPRC_Sucess, -// } -// pack.TolVipExp, pack.Money = this.GetCurrentVIPExp() // 获取经验会更新vip等级 -// pack.Vip = this.VIP -// this.SendToClient(int(playerproto.PlayerPacketID_PACKET_SC_VIPBUY), pack) -//} - func (this *Player) SCVIPInfo() { if this.IsRob { return @@ -3705,7 +2958,8 @@ func (this *Player) DoShopInfo(info *model.DbShop, isLogin bool) { } } -func (this *Player) GetShopInfo() { +// DealShopLog 处理订单 +func (this *Player) DealShopLog() { task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { info := model.GetDbShopLogsByState(this.Platform, this.SnId) if info != nil { @@ -3732,6 +2986,7 @@ func (this *Player) GetShopInfo() { })).StartByExecutor(fmt.Sprintf("Player%v", this.SnId)) } +// 奖池信息 func (this *Player) SendJackPotInit() { var pack = &hallproto.SCHundredSceneGetGameJackpot{} gameFreeIds := []int32{ @@ -3872,6 +3127,7 @@ func (this *Player) SendRankSeason() { logger.Logger.Trace("SCTMSeasonInfo:", pack) } +// 金币排行榜数据 func (this *Player) SendPlayerCoin() { mq.Write(&model.RankPlayerCoin{ Platform: this.Platform, @@ -3939,6 +3195,7 @@ func (this *Player) UnPlayerPowerListEx(powerId int32) { logger.Logger.Trace("通知客户端解锁炮台 snid = %v,解锁的炮台:%v,当前已有的炮台 = %v", this.SnId, powerId, this.PowerList) } } + func (this *Player) UpdatePlayerVipBag(shopId int32) { //判断是否是vip商品 更新数据 shopInfo := ShopMgrSington.GetShopInfo(shopId, this) @@ -4625,3 +3882,19 @@ func (this *Player) SCDataConfig(tp int) { logger.Logger.Tracef("SCDataConfig: %v", pack) } } + +func init() { + internal.RegisterPlayerListenerFunc(&internal.PlayerListenerFunc[*Player, *Scene]{ + ClockFunc: common.ClockFunc{}, + OnPlayerLoginedFunc: nil, + OnPlayerLogoutedFunc: nil, + OnPlayerDropLineFunc: nil, + OnPlayerReholdFunc: nil, + OnPlayerEnterSceneBeforeFunc: nil, + OnPlayerEnterSceneAfterFunc: nil, + OnPlayerLeaveSceneBeforeFunc: nil, + OnPlayerLeaveSceneAfterFunc: nil, + OnPlayerReturnSceneBeforeFunc: nil, + OnPlayerReturnSceneAfterFunc: nil, + }) +} diff --git a/worldsrv/playercache.go b/worldsrv/playercache.go index 030e927..4fb0c5b 100644 --- a/worldsrv/playercache.go +++ b/worldsrv/playercache.go @@ -10,15 +10,21 @@ import ( "mongo.games.com/goserver/core/task" "mongo.games.com/game/model" + "mongo.games.com/game/util/balancequeue" "mongo.games.com/game/worldsrv/internal" ) -const ( - // InvalidPlayerCacheSec 数据不存在,60秒内不再查询 - InvalidPlayerCacheSec int64 = 60 +/* + 查询不在线的玩家数据,缓存一段时间 +*/ - InvalidPlayerCacheMax int = 100000 - ListNumber int32 = 300 +const ( + // InvalidPlayerCacheSec 数据不存在,60秒内不再查询数据库 + InvalidPlayerCacheSec int64 = 60 + // InvalidPlayerCacheMax 缓存的无效玩家最大数量 + InvalidPlayerCacheMax int = 100000 + // ListNumber 平衡队列分组数量 + ListNumber = 300 ) func init() { @@ -30,41 +36,31 @@ var PlayerCacheMgrSingleton = &PlayerCacheMgr{ playerCbs: make(map[int32][]func(*PlayerCacheItem, bool, bool)), playerInvalidIds: make(map[int32]int64), playerWaitClr: make([]*PlayerCacheItem, 0, 128), - DbSaver: &DbSaver{ - Tick: ListNumber, - index: 0, - init: false, - list: make([]*SaverArray, ListNumber), - queue: make([]*BalanceQueue, 10), - pool: make(map[SaveTaskHandler]*SaverArray), - }, } type PlayerCacheItem struct { *model.PlayerData } -func (p *PlayerCacheItem) CanDel() bool { - //return !p.isOnline && time.Now().Unix()-p.lastTs > int64(ListNumber) - return true -} - -func (p *PlayerCacheItem) Time2Save() { +func (p *PlayerCacheItem) BalanceQueueHandler() { // 并没有对缓存数据做什么操作,只是释放缓存 - if p.CanDel() { - PlayerCacheMgrSingleton.playerWaitClr = append(PlayerCacheMgrSingleton.playerWaitClr, p) - } + PlayerCacheMgrSingleton.playerWaitClr = append(PlayerCacheMgrSingleton.playerWaitClr, p) } type PlayerCacheMgr struct { - *DbSaver + *balancequeue.BalanceQueue playerMap map[int32]*PlayerCacheItem // snid; 玩家信息缓存 playerCbs map[int32][]func(*PlayerCacheItem, bool, bool) // snid; 等待执行的回掉方法 playerInvalidIds map[int32]int64 // snid; 防止频繁访问数据库 playerWaitClr []*PlayerCacheItem // 根据DbSaver缓冲失效策略释放玩家数据 } -func (c *PlayerCacheMgr) Get(plt string, snid int32, cb func(*PlayerCacheItem, bool, bool), createIfNotExist bool) { +// Get 获取玩家数据 +// plt 平台 +// snid 玩家id +// cb 回掉方法; playerInfo 玩家数据; isFindDB 是否查了数据库; isNew 是否新创建的玩家 +// createIfNotExist 玩家不存在是否创建 +func (c *PlayerCacheMgr) Get(plt string, snid int32, cb func(playerInfo *PlayerCacheItem, isFindDB bool, isNew bool), createIfNotExist bool) { // 1.玩家缓冲数据存在 if p, exist := c.playerMap[snid]; exist { cb(p, false, false) @@ -91,11 +87,12 @@ func (c *PlayerCacheMgr) Get(plt string, snid int32, cb func(*PlayerCacheItem, b } c.playerCbs[snid] = []func(*PlayerCacheItem, bool, bool){cb} - var isnew bool + var isNew bool var replays []*internal.PlayerLoadReplay task.New(core.CoreObject(), task.CallableWrapper(func(o *basic.Object) interface{} { pi, flag := model.GetPlayerDataBySnId(plt, snid, true, createIfNotExist) - isnew = flag + isNew = flag + // 查询其它玩家数据 for _, v := range internal.GetPlayerLoads() { replays = append(replays, v.Load(plt, snid, pi)) } @@ -119,22 +116,26 @@ func (c *PlayerCacheMgr) Get(plt string, snid int32, cb func(*PlayerCacheItem, b } } + if su { + if len(replays) != len(internal.GetPlayerLoads()) { + su = false + } + } + if !su { c.cacheInvalidPlayerId(snid) - delete(c.playerCbs, snid) - for _, cb := range c.playerCbs[snid] { - cb(nil, true, false) + for _, v := range c.playerCbs[snid] { + v(nil, true, false) } + delete(c.playerCbs, snid) return } - if len(replays) == len(internal.GetPlayerLoads()) { - for k, v := range internal.GetPlayerLoads() { - if v == nil || replays[k] == nil { - continue - } - v.Callback(pi, replays[k]) + for k, v := range internal.GetPlayerLoads() { + if v == nil || replays[k] == nil { + continue } + v.Callback(pi, replays[k]) } // 查询成功,缓存数据,执行cb方法 @@ -142,38 +143,35 @@ func (c *PlayerCacheMgr) Get(plt string, snid int32, cb func(*PlayerCacheItem, b if !ok { item = &PlayerCacheItem{PlayerData: pi} c.playerMap[snid] = item - c.RegisterDbSaverTask(item) + c.Push(item) } - if cbs, exist := c.playerCbs[snid]; exist { - delete(c.playerCbs, snid) - for _, cb := range cbs { - cb(item, true, isnew) - } + for _, v := range c.playerCbs[snid] { + v(item, true, isNew) } - + delete(c.playerCbs, snid) })).StartByExecutor(fmt.Sprintf("Player%v", snid)) } -func (c *PlayerCacheMgr) GetMore(plt string, snid []int32, cb func([]*PlayerCacheItem, bool)) { - isAsyn := false - count := len(snid) - result := make([]*PlayerCacheItem, 0, count) - innerCb := func(item *PlayerCacheItem, asyn, isnew bool) { - if item != nil { - result = append(result, item) - } - if asyn { - isAsyn = true - } - count-- - if count == 0 { - cb(result, isAsyn) - } - } - for _, id := range snid { - c.Get(plt, id, innerCb, false) - } -} +//func (c *PlayerCacheMgr) GetMore(plt string, snid []int32, cb func([]*PlayerCacheItem, bool)) { +// isDB := false +// count := len(snid) +// result := make([]*PlayerCacheItem, 0, count) +// innerCb := func(item *PlayerCacheItem, isFindDB, isNew bool) { +// if item != nil { +// result = append(result, item) +// } +// if isFindDB { +// isDB = true +// } +// count-- +// if count == 0 { +// cb(result, isDB) +// } +// } +// for _, id := range snid { +// c.Get(plt, id, innerCb, false) +// } +//} func (c *PlayerCacheMgr) cacheInvalidPlayerId(snid int32) { if len(c.playerInvalidIds) >= InvalidPlayerCacheMax { @@ -199,29 +197,14 @@ func (c *PlayerCacheMgr) ModuleName() string { } func (c *PlayerCacheMgr) Init() { - c.DbSaver.Init() + c.BalanceQueue = balancequeue.New(ListNumber) } func (c *PlayerCacheMgr) Update() { - // 执行Time2Save之后清除缓存 - c.DbSaver.Update() + c.BalanceQueue.Update() for _, p := range c.playerWaitClr { delete(c.playerMap, p.SnId) - c.UnregisterDbSaveTask(p) - - // 释放玩家数据 - if PlayerMgrSington.GetPlayerBySnId(p.SnId) == nil { - for _, v := range internal.GetPlayerLoads() { - task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { - v.Save(p.Platform, p.SnId, true, true) - return nil - }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { - if PlayerMgrSington.GetPlayerBySnId(p.SnId) == nil { - v.Release(p.Platform, p.SnId) - } - })).StartByExecutor(fmt.Sprintf("Player%v", p.SnId)) - } - } + c.Pop(p) } c.playerWaitClr = c.playerWaitClr[0:0] } diff --git a/worldsrv/playermgr.go b/worldsrv/playermgr.go index 13defda..ca941ee 100644 --- a/worldsrv/playermgr.go +++ b/worldsrv/playermgr.go @@ -1,7 +1,9 @@ package main import ( + "fmt" "math/rand" + "os" "time" "mongo.games.com/goserver/core/basic" @@ -25,7 +27,6 @@ var PlayerMgrSington = &PlayerMgr{ sidMap: make(map[int64]*Player), snidMap: make(map[int32]*Player), accountMap: make(map[string]*Player), - tokenMap: make(map[string]*Player), players: make([]*Player, 0, 1024), playerOfPlatform: make(map[string]map[int32]*Player), loading: make(map[string]*PlayerPendingData), @@ -38,14 +39,18 @@ type PlayerPendingData struct { type PlayerMgr struct { common.BaseClockSinker - sidMap map[int64]*Player // sid - snidMap map[int32]*Player // snid - accountMap map[string]*Player // accountid - tokenMap map[string]*Player // 客服token - players []*Player // 只有真实玩家 - playerOfPlatform map[string]map[int32]*Player // platform:snid;只有真实玩家 + // 以连接标识为索引 + sidMap map[int64]*Player + // 以snid为索引 + snidMap map[int32]*Player + // 以账号为索引 + accountMap map[string]*Player + // 只有真实玩家,不包括机器人 + players []*Player + // 平台id:snid:真实玩家 + playerOfPlatform map[string]map[int32]*Player - loading map[string]*PlayerPendingData // accountid,控制访问频率 + loading map[string]*PlayerPendingData // accountid,控制访问频率;登录状态标记 } // PlayerStatics 在线统计 @@ -100,22 +105,15 @@ func (this *PlayerMgr) AddPlayer(sid int64, playerInfo *model.PlayerData, s *net return false } - if sid == 0 { - logger.Logger.Warnf("(this *PlayerMgr) AddPlayer player sid == 0:") - return false - } - logger.Logger.Trace("(this *PlayerMgr) AddPlayer Set player ip:", player.Ip) this.sidMap[sid] = player - var oldp *Player + var old *Player if p, exist := this.snidMap[player.SnId]; exist { - oldp = p + old = p } this.snidMap[player.SnId] = player this.accountMap[player.AccountId] = player - if player.customerToken != "" { - this.tokenMap[player.customerToken] = player - } + if !player.IsRob { var found bool for i, p := range this.players { @@ -129,9 +127,6 @@ func (this *PlayerMgr) AddPlayer(sid int64, playerInfo *model.PlayerData, s *net if !found { this.players = append(this.players, player) } - if player.HeadUrl == "" { - player.HeadUrl = niceIdMgr.GetRobHeadUrl(player.Head) - } //平台玩家管理器 if pp, exist := this.playerOfPlatform[player.Platform]; exist { @@ -142,21 +137,76 @@ func (this *PlayerMgr) AddPlayer(sid int64, playerInfo *model.PlayerData, s *net this.playerOfPlatform[player.Platform] = pp } - logger.Logger.Tracef("###%v mount to DBSaver[AddPlayer]", player.Name) - if oldp != nil { //删除旧的玩家 - DbSaveInst.UnregisterDbSaveTask(oldp) + logger.Logger.Tracef("###%v mount to DBSaver[AddPlayer]", player.SnId) + if old != nil { //删除旧的玩家 + DbSaveInst.UnregisterDbSaveTask(old) } DbSaveInst.RegisterDbSaverTask(player) - niceIdMgr.NiceIdCheck(player.SnId) - } else { - player.NiceId = niceIdMgr.PopNiceId(player.SnId) - player.HeadUrl = niceIdMgr.GetRobHeadUrlIdx() } + return true } +func (this *PlayerMgr) SavePlayer(p *Player, isCopy, force bool) { + if p == nil || p.isDelete { + return + } + + if p.IsRob { + return + } + + if !p.dirty && !force { + return + } + + var pd *model.PlayerData + if isCopy { + pd = model.ClonePlayerData(p.PlayerData) + } else { + pd = p.PlayerData + } + if pd == nil { + logger.Logger.Errorf("Player Time2Save() %v pd is nil", p.SnId) + return + } + + t1 := time.Now() + + p.dirty = true + // 跨天任务依赖LastLogoutTime的准确性,跨天任务是定时器common.ClockMgrSington触发的,所以这里要用定时器的触发时间 + p.LastLogoutTime = common.ClockMgrSingleton.LastTickTime + pd.LastLogoutTime = common.ClockMgrSingleton.LastTickTime + + ok := true + t := task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { + if !model.SavePlayerData(pd) { + // save 失败先写到json里面 + model.BackupPlayerData(pd) + ok = false + } + for _, v := range internal.GetPlayerLoads() { + v.Save(pd.Platform, pd.SnId, true, force) + } + return ok + }), task.CompleteNotifyWrapper(func(i interface{}, t task.Task) { + if saved, ok := i.(bool); ok && saved { + p.dirty = false + bak := fmt.Sprintf("%v.json", pd.AccountId) + if exist, _ := common.PathExists(bak); exist { + os.Remove(bak) + } + } + logger.Logger.Infof("Player Time2Save() %v take:%v isSuccess:%v", p.SnId, time.Now().Sub(t1), p.dirty == false) + }), "SavePlayerTask") + if b := t.StartByExecutor(fmt.Sprintf("Player%v", p.SnId)); b { + p.lastSaved = time.Now() + } +} + // DelPlayer 清除玩家缓存数据 -// 一般真人是数据持久化后删除或数据没有修改,机器人不用持久化(机器人数据没有主动删除) +// 真人数据持久化后删除,机器人不用持久化(机器人数据没有主动删除) +// needSave 是否需要保存数据; 自动删除玩家机制已经保存过数据,不需要再保存;手动删除玩家需要保存数据 func (this *PlayerMgr) DelPlayer(snid int32) bool { player, ok := this.snidMap[snid] if !ok || player == nil { @@ -168,9 +218,6 @@ func (this *PlayerMgr) DelPlayer(snid int32) bool { } delete(this.snidMap, player.SnId) delete(this.accountMap, player.AccountId) - if player.customerToken != "" { - delete(this.tokenMap, player.customerToken) - } if !player.IsRob { index := -1 for i, p := range this.players { @@ -187,24 +234,31 @@ func (this *PlayerMgr) DelPlayer(snid int32) bool { if pp, exist := this.playerOfPlatform[player.Platform]; exist { delete(pp, player.SnId) } - - niceIdMgr.PushNiceId(player.NiceId) } + if !player.IsCacheState() { + player.OnLogoutFinish() + internal.FirePlayerLogouted[*Player, *Scene](player) + } + + DbSaveInst.UnregisterDbSaveTask(player) + + // 再保存一次,防止数据丢失,可能脏标记没有设置 + this.SavePlayer(player, true, true) for _, v := range internal.GetPlayerLoads() { v.Release(player.Platform, player.SnId) } - - player.OnLogouted() - return true } -// DroplinePlayer 玩家掉线或登出 +// DropPlayer 玩家掉线或登出 // 1.玩家登出 // 2.玩家网络断开 // 3.被踢掉线 -func (this *PlayerMgr) DroplinePlayer(p *Player) { +func (this *PlayerMgr) DropPlayer(p *Player) { + p.SetOffline() + p.sid = 0 + p.gateSess = nil delete(this.sidMap, p.sid) } @@ -219,14 +273,22 @@ func (this *PlayerMgr) ReholdPlayer(p *Player, newSid int64, newSess *netlib.Ses logger.Logger.Errorf("(this *PlayerMgr) ReholdPlayer(snid=%v, new=%v)", p.SnId, newSid) } + p.SetOnline() p.sid = newSid p.gateSess = newSess - p.SetOnline() this.sidMap[newSid] = p } -// GetPlayer 获取玩家数据(玩家在线) -func (this *PlayerMgr) GetPlayer(id int64) *Player { +func (this *PlayerMgr) KickByPlatform(name string) { + for _, p := range this.players { + if name == "" || p.Platform == name { + p.Kick(common.KickReason_Disconnection) + } + } +} + +// GetOnlinePlayer 获取玩家数据(玩家在线) +func (this *PlayerMgr) GetOnlinePlayer(id int64) *Player { if pi, ok := this.sidMap[id]; ok { return pi } @@ -267,28 +329,6 @@ func (this *PlayerMgr) GetPlayerByAccount(acc string) *Player { return nil } -func (this *PlayerMgr) GetPlayerByToken(token string) *Player { - if p, ok := this.tokenMap[token]; ok { - return p - } - return nil -} - -func (this *PlayerMgr) UpdatePlayerToken(p *Player, newToken string) { - oldToken := p.customerToken - if oldToken != newToken { - if oldToken != "" { - if _, ok := this.tokenMap[oldToken]; ok { - delete(this.tokenMap, oldToken) - } - } - if newToken != "" { - this.tokenMap[newToken] = p - p.customerToken = newToken - } - } -} - // BroadcastMessage 给所有玩家发消息 func (this *PlayerMgr) BroadcastMessage(packetid int, rawpack interface{}) bool { sc := &srvproto.BCSessionUnion{} @@ -320,6 +360,7 @@ func (this *PlayerMgr) BroadcastMessageToPlatform(platform string, packetid int, } } +// BroadcastDataConfigToPlatform 广播配置数据更新 func (this *PlayerMgr) BroadcastDataConfigToPlatform(platform string, tp int) { packetId := int(playerproto.PlayerPacketID_PACKET_SCDataConfig) pack := &playerproto.SCDataConfig{} @@ -358,7 +399,8 @@ func (this *PlayerMgr) BroadcastMessageToPlatformByFunc(platform string, packeti } } -// BroadcastMessageToPlatformWithHall 给某个平台所有在大厅中的玩家发消息 +// BroadcastMessageToPlatformWithHall 发送大厅消息,不包括在游戏中的玩家 +// 如果是好友,支持消息屏蔽 func (this *PlayerMgr) BroadcastMessageToPlatformWithHall(platform string, snid int32, packetid int, rawpack interface{}) { if platform == "" { this.BroadcastMessage(packetid, rawpack) @@ -409,9 +451,9 @@ func (this *PlayerMgr) BroadcastMessageToGroup(packetid int, rawpack interface{} } // BroadcastMessageToTarget 给某些玩家发消息 -func (this *PlayerMgr) BroadcastMessageToTarget(target []int32, packetid int, rawpack interface{}) { +func (this *PlayerMgr) BroadcastMessageToTarget(snIds []int32, packetid int, rawpack interface{}) { mgs := make(map[*netlib.Session][]*srvproto.MCSessionUnion) - for _, v := range target { + for _, v := range snIds { d := this.snidMap[v] if d != nil && d.gateSess != nil && d.IsOnLine() { mgs[d.gateSess] = append(mgs[d.gateSess], &srvproto.MCSessionUnion{ @@ -429,146 +471,29 @@ func (this *PlayerMgr) BroadcastMessageToTarget(target []int32, packetid int, ra } } -// 感兴趣所有clock event -func (this *PlayerMgr) InterestClockEvent() int { - return (1 << common.ClockEventMax) - 1 -} - -func (this *PlayerMgr) OnSecTimer() { - for _, player := range this.players { - utils.CatchPanic(func() { - player.OnSecTimer() - }) - } -} - -func (this *PlayerMgr) OnMiniTimer() { - for _, player := range this.players { - utils.CatchPanic(func() { - player.OnMiniTimer() - }) - } -} - -func (this *PlayerMgr) OnHourTimer() { - for _, player := range this.players { - utils.CatchPanic(func() { - player.OnHourTimer() - }) - } -} - -func (this *PlayerMgr) OnDayTimer() { - for _, player := range this.players { - utils.CatchPanic(func() { - player.OnDayTimer(false, true, 1) - }) - } -} - -func (this *PlayerMgr) OnMonthTimer() { - for _, player := range this.players { - utils.CatchPanic(func() { - player.OnMonthTimer() - }) - } -} - -func (this *PlayerMgr) OnWeekTimer() { - for _, player := range this.players { - utils.CatchPanic(func() { - player.OnWeekTimer() - }) - } -} - -func (this *PlayerMgr) OnShutdown() { - this.SaveAll() -} - // SaveAll 保存所有数据,dirty=true func (this *PlayerMgr) SaveAll() { count := len(this.players) start := time.Now() saveCnt := 0 failCnt := 0 - nochangeCnt := 0 - logger.Logger.Info("===@PlayerMgr.SaveAll BEG@=== TotalCount:", count) + logger.Logger.Info("===@SaveAllPlayerBEGIN@=== TotalCount:", count) for i, p := range this.players { idx := i + 1 - if p.dirty { - if model.SavePlayerData(p.PlayerData) { - logger.Logger.Infof("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [ok] @=", idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs) - saveCnt++ - } else { - logger.Logger.Warnf("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [error]@=", idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs) - failCnt++ + if model.SavePlayerData(p.PlayerData) { + logger.Logger.Infof("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [ok] @=", + idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs) + for _, v := range internal.GetPlayerLoads() { + v.Save(p.Platform, p.SnId, true, true) } + saveCnt++ } else { - logger.Logger.Infof("nochange===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v nochange [ok]@=", idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs) - nochangeCnt++ - } - for _, v := range internal.GetPlayerLoads() { - v.Save(p.Platform, p.SnId, true, true) - } - } - logger.Logger.Infof("===@PlayerMgr.SaveAll END@===, total:%v saveCnt:%v failCnt:%v nochangeCnt:%v take:%v", count, saveCnt, failCnt, nochangeCnt, time.Now().Sub(start)) -} - -// 黑名单事件 -//func (this *PlayerMgr) OnAddBlackInfo(blackinfo *BlackInfo) { -// if blackinfo.Snid > 0 { -// if p := this.GetPlayerBySnId(blackinfo.Snid); p != nil { -// p.PlayerData.BlacklistType = int32(blackinfo.BlackType) -// p.dirty = true -// p.Time2Save() -// } else { -// task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { -// model.UpdatePlayerBlacklistType(blackinfo.Platform, blackinfo.Snid, int32(blackinfo.BlackType)) -// return nil -// }), nil, "PlayerMgrOnAddBlackInfo").Start() -// } -// } -//} - -//func (this *PlayerMgr) OnEditBlackInfo(blackinfo *BlackInfo) { -// //nothing -// //if blackinfo.Snid > 0 { -// // if p := this.GetPlayerBySnId(blackinfo.Snid); p != nil { -// // p.PlayerData.BlacklistType = int32(blackinfo.BlackType) -// // p.dirty = true -// // p.Time2Save() -// // } else { -// // task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { -// // model.UpdatePlayerBlacklistType(blackinfo.Platform, blackinfo.Snid, int32(blackinfo.BlackType)) -// // return nil -// // }), nil, "PlayerMgrOnEditBlackInfo").Start() -// // } -// //} -//} - -//func (this *PlayerMgr) OnRemoveBlackInfo(blackinfo *BlackInfo) { -// //nothing -// //if blackinfo.Snid > 0 { -// // if p := this.GetPlayerBySnId(blackinfo.Snid); p != nil { -// // p.PlayerData.BlacklistType = 0 -// // p.dirty = true -// // p.Time2Save() -// // } else { -// // task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { -// // model.UpdatePlayerBlacklistType(blackinfo.Platform, blackinfo.Snid, int32(0)) -// // return nil -// // }), nil, "PlayerMgrOnRemoveBlackInfo").Start() -// // } -// //} -//} - -func (this *PlayerMgr) KickoutByPlatform(name string) { - for _, p := range this.players { - if name == "" || p.Platform == name { - p.Kickout(common.KickReason_Disconnection) + logger.Logger.Warnf("===@SavePlayerData %v/%v snid:%v coin:%v safebox:%v coinpayts:%v safeboxts:%v gamets:%v save [error]@=", + idx, count, p.SnId, p.Coin, p.SafeBoxCoin, p.CoinPayTs, p.SafeBoxCoinTs, p.GameCoinTs) + failCnt++ } } + logger.Logger.Infof("===@SaveAllPlayerEND@===, total:%v saveCnt:%v failCnt:%v take:%v", count, saveCnt, failCnt, time.Now().Sub(start)) } // LoadRobots 预加载机器人数据 @@ -589,9 +514,6 @@ func (this *PlayerMgr) LoadRobots() { if player != nil { this.snidMap[player.SnId] = player this.accountMap[player.AccountId] = player - if player.customerToken != "" { - this.tokenMap[player.customerToken] = player - } } } } @@ -716,18 +638,6 @@ func (p *PlayerMgr) UpdateHeadUrl(snId int32, url string) { } } -//func (p *PlayerMgr) ModifyActSwitchToPlayer(platform string, modify bool) { -// if modify { //活动开关修改了才去更新活动开关 -// if players, ok := p.playerOfPlatform[platform]; ok { -// for _, p := range players { -// if p != nil && !p.IsRob { -// p.ModifyActSwitch() -// } -// } -// } -// } -//} - /* 推荐好友规则 1.优先判断在线玩家人数N @@ -820,7 +730,6 @@ func (this *PlayerMgr) RecommendFriendRule(platform string, snid int32) []Recomm } func init() { - //BlackListMgrSington.RegisterObserver(PlayerMgrSington) PlayerSubjectSign.AttachName(PlayerMgrSington) PlayerSubjectSign.AttachHead(PlayerMgrSington) PlayerSubjectSign.AttachHeadOutline(PlayerMgrSington) @@ -830,5 +739,51 @@ func init() { PlayerSubjectSign.AttachHead(FriendMgrSington) // 定时器 - common.ClockMgrSingleton.RegisterSinker(PlayerMgrSington) + common.RegisterClockFunc(&common.ClockFunc{ + OnSecTimerFunc: func() { + for _, player := range PlayerMgrSington.players { + utils.CatchPanic(func() { + player.OnSecTimer() + }) + } + }, + OnMiniTimerFunc: func() { + for _, player := range PlayerMgrSington.players { + utils.CatchPanic(func() { + player.OnMiniTimer() + }) + } + }, + OnHourTimerFunc: func() { + for _, player := range PlayerMgrSington.players { + utils.CatchPanic(func() { + player.OnHourTimer() + }) + } + }, + OnDayTimerFunc: func() { + for _, player := range PlayerMgrSington.players { + utils.CatchPanic(func() { + player.OnDayTimer(false, true, 1) + }) + } + }, + OnWeekTimerFunc: func() { + for _, player := range PlayerMgrSington.players { + utils.CatchPanic(func() { + player.OnWeekTimer() + }) + } + }, + OnMonthTimerFunc: func() { + for _, player := range PlayerMgrSington.players { + utils.CatchPanic(func() { + player.OnMonthTimer() + }) + } + }, + OnShutdownFunc: func() { + PlayerMgrSington.SaveAll() + }, + }) } diff --git a/worldsrv/playernotify.go b/worldsrv/playernotify.go index 3d45bf7..36f6c07 100644 --- a/worldsrv/playernotify.go +++ b/worldsrv/playernotify.go @@ -90,7 +90,7 @@ func (p *PlayerNotify) SendToClient(tp common.NotifyType, platform string, packe //} roomConfigId := d.GetDatas()[0].GetRoomConfigId() cfg := PlatformMgrSingleton.GetConfig(platform).RoomConfig[roomConfigId] - if cfg == nil { + if cfg == nil || cfg.GetOn() != common.On { return } diff --git a/worldsrv/promotermgr.go b/worldsrv/promotermgr.go index fa5f64e..dae7b63 100644 --- a/worldsrv/promotermgr.go +++ b/worldsrv/promotermgr.go @@ -14,6 +14,14 @@ const ( PROMOTER_TYPE_PROMOTE = 3 //推广员 ) +type ErrorString struct { + code string +} + +func (e *ErrorString) Error() string { + return e.code +} + var PromoterMgrSington = &PromoterMgr{ PromoterConfigMap: make(map[string]*PromoterConfig), LastTicket: 0, diff --git a/worldsrv/task_login.go b/worldsrv/task_login.go index 0c52e59..2840aa3 100644 --- a/worldsrv/task_login.go +++ b/worldsrv/task_login.go @@ -89,7 +89,7 @@ func (t *TaskLogin) Call(o *basic.Object) interface{} { Plt: acc.Platform, AccId: acc.AccountId.Hex(), NickName: "", - HeadUrl: niceIdMgr.GetRobHeadUrlIdx(), + HeadUrl: GetRobHeadUrlIdx(), }) if playerData == nil || !tf { return nil diff --git a/worldsrv/trascate_webapi.go b/worldsrv/trascate_webapi.go index 0aeab5c..9a6fb83 100644 --- a/worldsrv/trascate_webapi.go +++ b/worldsrv/trascate_webapi.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "mongo.games.com/game/protocol/shop" "reflect" "slices" "sort" @@ -30,6 +29,7 @@ import ( loginproto "mongo.games.com/game/protocol/login" playerproto "mongo.games.com/game/protocol/player" "mongo.games.com/game/protocol/server" + "mongo.games.com/game/protocol/shop" webapiproto "mongo.games.com/game/protocol/webapi" "mongo.games.com/game/srvdata" "mongo.games.com/game/webapi" @@ -1036,7 +1036,7 @@ func init() { task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { return model.FreezeAccount(msg.Platform, player.AccountId, int(msg.Minute)) }), nil, "FreezeAccount").Start() - player.Kickout(common.KickReason_Freeze) + player.Kick(common.KickReason_Freeze) pack.Tag = webapiproto.TagCode_SUCCESS pack.Msg = "success" } else { @@ -1714,7 +1714,7 @@ func init() { //在线需要踢掉玩家 if uint(msg.BlacklistType)&BlackState_Login != 0 { logger.Logger.Infof("found platform:%v player:%d snid in blacklist", msg.Platform, player.SnId) - player.Kickout(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList)) + player.Kick(int32(loginproto.SSDisconnectTypeCode_SSDTC_BlackList)) } return common.ResponseTag_Ok, pack } else { @@ -2427,7 +2427,7 @@ func init() { } } - p.Kickout(common.KickReason_Freeze) + p.Kick(common.KickReason_Freeze) PlayerMgrSington.DelPlayer(p.SnId) LoginStateMgrSington.DelAccountByAccid(p.AccountId) }