From 52e1427b087e01e528d3f8c1a50ceff97158eb6e Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:47:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=A0=E7=89=A9=E6=80=AA?= =?UTF-8?q?=E7=9B=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/GoUtil/sliceUtil.go | 17 +++++++++ src/server/game/Player.go | 2 + src/server/game/PlayerFunc.go | 51 ++++++++++++++++++++++++++ src/server/game/RegisterNetworkFunc.go | 3 +- src/server/game/Type.go | 1 + src/server/game/mod/card/Card.go | 10 +++++ 6 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/server/GoUtil/sliceUtil.go b/src/server/GoUtil/sliceUtil.go index 2262170a..50075ba8 100644 --- a/src/server/GoUtil/sliceUtil.go +++ b/src/server/GoUtil/sliceUtil.go @@ -236,6 +236,23 @@ func SliceEqual(a, b []int) bool { return true } +// IsContainSlice checks if all elements of s2 are contained in s. +func IsContainSlice(s []int, s2 []int) bool { + if len(s2) == 0 { + return true + } + if len(s) < len(s2) { + return false + } + for _, v := range s2 { + if !InArray(v, s) { + return false + } + s = SubSlices(s, []int{v}) + } + return true +} + func InitNumSlice(start, end int) []int { result := make([]int, 0, end-start+1) for i := start; i <= end; i++ { diff --git a/src/server/game/Player.go b/src/server/game/Player.go index e03dda4e..d0a9433d 100644 --- a/src/server/game/Player.go +++ b/src/server/game/Player.go @@ -793,6 +793,7 @@ func (p *Player) GetSimpleData(Uid int, simple *PlayerSimpleData) error { func (p *Player) UpdateUserInfo() { simple := &PlayerSimpleData{} Base := p.GetPlayerBaseMod() + CardMod := p.PlayMod.getCardMod() BaseMod := p.PlayMod.getBaseMod() simple.Name = p.PlayMod.getBaseMod().NickName simple.Avatar = p.PlayMod.getAvatarMod().SetId @@ -814,6 +815,7 @@ func (p *Player) UpdateUserInfo() { simple.Friend = p.PlayMod.getFriendMod().GetSimpleFriendList() simple.Upvote = p.PlayMod.getPlayroomMod().Upvote simple.DressSet = p.PlayMod.getPlayroomMod().DressSet + simple.CardInfo = CardMod.GetCardList() value, _ := json.Marshal(simple) IdStr := strconv.Itoa(int(p.M_DwUin)) db.RedisSetKey(IdStr, string(value), 0) diff --git a/src/server/game/PlayerFunc.go b/src/server/game/PlayerFunc.go index 60269665..d856de9c 100644 --- a/src/server/game/PlayerFunc.go +++ b/src/server/game/PlayerFunc.go @@ -946,3 +946,54 @@ func (player *Player) GetPetOrderReward(Star int, Items []*item.Item) []*item.It } return player.GetPetOrderReward(Star, Items) } + +func (p *Player) GetPetThiefReward(Target int) []*item.Item { + PlayerSimpleData := G_GameLogicPtr.GetSimplePlayerByUid(Target) + if PlayerSimpleData == nil { + log.Error("GetPetThiefReward Target %d not exist", Target) + return nil + } + CardMod := p.PlayMod.getCardMod() + CardList := ExcludeCardStar(CardMod.GetCardList()) + TargetCardList := ExcludeCardStar(PlayerSimpleData.CardInfo) + if len(TargetCardList) == 0 { + return []*item.Item{ + {Id: item.ITEM_STAR_ID, Num: 50}, + } + } + if GoUtil.IsContainSlice(CardList, TargetCardList) { + CardId := GoUtil.RandSliceNum(TargetCardList, 1)[0] + ItemId := cardCfg.GetItemIdByCardId(CardId) + return []*item.Item{ + {Id: ItemId, Num: 1}, + } + } else { + CardList2 := GoUtil.SubSlices(TargetCardList, CardList) + if len(CardList2) == 0 { + return []*item.Item{ + {Id: item.ITEM_STAR_ID, Num: 50}, + } + } + CardId := GoUtil.RandSliceNum(CardList2, 1)[0] + ItemId := cardCfg.GetItemIdByCardId(CardId) + if ItemId == 0 { + log.Error("GetPetThiefReward ItemId %d not exist", ItemId) + return nil + } + return []*item.Item{ + {Id: ItemId, Num: 1}, + } + } +} + +func ExcludeCardStar(CardList []int) []int { + StarList := make([]int, 0) + for _, v := range CardList { + Star := cardCfg.GetStarById(v) + if Star < 2 || Star > 4 { + continue + } + StarList = append(StarList, v) + } + return StarList +} diff --git a/src/server/game/RegisterNetworkFunc.go b/src/server/game/RegisterNetworkFunc.go index 689a4289..53a8bfb7 100644 --- a/src/server/game/RegisterNetworkFunc.go +++ b/src/server/game/RegisterNetworkFunc.go @@ -3461,7 +3461,8 @@ func ReqPlayroomFlipReward(player *Player, buf []byte) error { Items1 := Items LimitedTimeEventMod := player.PlayMod.getLimitedTimeEventMod() if LimitedTimeEventMod.CheckExist(limitedTimeEvent.EVENT_TYPE_PET_THIEF) { - Items1 = item.Merge(Items1, Items1) + ThiefItem := player.GetPetThiefReward(Target) + Items1 = item.Merge(Items1, ThiefItem) } err = player.HandleItem(Items1, msg.ITEM_POP_LABEL_PlayroomFlip.String()) if err != nil { diff --git a/src/server/game/Type.go b/src/server/game/Type.go index 135c8e9a..e67ab718 100644 --- a/src/server/game/Type.go +++ b/src/server/game/Type.go @@ -27,6 +27,7 @@ type PlayerSimpleData struct { Friend []int Upvote int DressSet map[int]int + CardInfo []int } type VarGoldCard struct { diff --git a/src/server/game/mod/card/Card.go b/src/server/game/mod/card/Card.go index fd5a1e1e..d9c33149 100644 --- a/src/server/game/mod/card/Card.go +++ b/src/server/game/mod/card/Card.go @@ -579,3 +579,13 @@ func (c *CardMod) SeasonFirstReward() ([]*item.Item, error) { c.SeasonFirst = true return cardCfg.GetSeasonFirstReward(), nil } + +func (c *CardMod) GetCardList() []int { + cardList := make([]int, 0) + for k, v := range c.CardList { + if v > 0 { + cardList = append(cardList, k) + } + } + return cardList +}