diff --git a/server/channelserver/handlers_shop_gacha.go b/server/channelserver/handlers_shop_gacha.go index 3058fb632..acba56636 100644 --- a/server/channelserver/handlers_shop_gacha.go +++ b/server/channelserver/handlers_shop_gacha.go @@ -122,7 +122,7 @@ func handleMsgMhfEnumerateShop(s *Session, p mhfpacket.MHFPacket) { switch pkt.ShopType { case 1: // Running gachas // Fundamentally, gacha works completely differently, just hide it for now. - if _config.ErupeConfig.RealClientMode <= _config.G7 { + if _config.ErupeConfig.RealClientMode < _config.G1 { doAckBufSucceed(s, pkt.AckHandle, make([]byte, 4)) return } @@ -144,15 +144,20 @@ func handleMsgMhfEnumerateShop(s *Session, p mhfpacket.MHFPacket) { bf.WriteUint16(uint16(len(gachas))) bf.WriteUint16(uint16(len(gachas))) for _, g := range gachas { - bf.WriteUint32(g.ID) - bf.WriteUint32(0) // Unknown rank restrictions - bf.WriteUint32(0) - bf.WriteUint32(0) - bf.WriteUint32(0) - bf.WriteUint32(g.MinGR) - bf.WriteUint32(g.MinHR) - bf.WriteUint32(0) // only 0 in known packet + if _config.ErupeConfig.RealClientMode >= _config.GG { //GG之前这段数据都没有 G1就没有如下数据 G1只有ID和名字 Before GG, there was no data for G1, so there was no data for G1 except for ID and name + //TODO 但是G2 和G3 的差异还需要测试,G1和GG的数据已经清晰 But the difference between G2 and G3 still needs to be tested, and the data for G1 and GG are already clear + bf.WriteUint32(0) // Unknown rank restrictions + bf.WriteUint32(0) + bf.WriteUint32(0) + bf.WriteUint32(0) + bf.WriteUint32(g.MinGR) + bf.WriteUint32(g.MinHR) + bf.WriteUint32(0) // only 0 in known packet + } ps.Uint8(bf, g.Name, true) + if _config.ErupeConfig.RealClientMode <= _config.GG { //小于等于GG的版本,每一条发送到名字就结束了 For versions less than or equal to GG, each message sent to the name ends + continue + } ps.Uint8(bf, g.URLBanner, false) ps.Uint8(bf, g.URLFeature, false) if _config.ErupeConfig.RealClientMode >= _config.G10 { @@ -195,6 +200,61 @@ func handleMsgMhfEnumerateShop(s *Session, p mhfpacket.MHFPacket) { bf.WriteUint16(uint16(len(entries))) for _, ge := range entries { var items []GachaItem + if _config.ErupeConfig.RealClientMode <= _config.GG { + /* + 如果需要在三个选项中配置可选素材列表里, + 直接在gacha_entries中配置 + 同样的EntryType即可在GG中合并显示 + 此外奖品也直接在gacha_entries表中配置, + MHFG1~GG全程不使用gacha_items表,已满足MHFG功能更单一的抽奖功能 + 此外,本身MHFG功能就比较单一 + G1 ~ GG的抽奖配置 示例: + + If you need to configure the optional material list among the three options, + Configure directly in gacha_detries + The same Entry Type can be merged and displayed in GG + In addition, the prizes are also directly configured in the gacha-entries table, + MHFG1~GG does not use the gacha_items table throughout the entire process, which meets the lottery function of MHFG with a more single function + In addition, the MHFG function itself is relatively simple + Example of lottery configuration for G1~GG: + eg: + gachaname:test + entry: + itemgroup: + group1:(choose one of the two) ITEM_1_ID:7 COUNT:1 ITEM_1_ID:8 COUNT:2 + group2:ITEM_1_ID:9 COUNT:3 + reward: + reward1: ITEM_ID:1 COUNT:4 weight:10% + reward1: ITEM_ID:2 COUNT:5 weight:90% + + table:gacha_shop + |id|min_gr|min_hr|name|url_bannel|url_feature|url_thmubnail|wide|recommendded|gacha_type|hidden| + |1|0|0|test|null|null|null|f|f|3|t| + + table:gacha_entries + |id|gacha_id|entry_type|item_type|item_number|item_quantity|weight|rarity|rolls|frontier_points|daily_limit|name| + |1|1|0|7|7|1|0|0|0|0|0|null| + |4|1|0|7|8|2|0|0|0|0|0|null| + |5|1|1|7|9|3|0|0|0|0|0|null| + |8|1|100|7|1|4|1000|0|0|0|0|null| + |9|1|100|7|2|5|9000|0|0|0|0|null| + + */ + bf.WriteUint8(ge.EntryType) //0 + bf.WriteUint32(ge.ID) //1 + bf.WriteUint8(ge.ItemType) //5 + bf.WriteUint32(ge.ItemNumber) //6 + bf.WriteUint16(ge.ItemQuantity) //10 + var weightPr uint16 + if gachaType >= 4 { // If box //12 概率 + weightPr = 1 + } else { + weightPr = uint16(ge.Weight / divisor) + } + bf.WriteUint16(weightPr) //12 概率 + bf.WriteUint8(0) //14 结束符(maybe) + continue + } bf.WriteUint8(ge.EntryType) bf.WriteUint32(ge.ID) bf.WriteUint8(ge.ItemType)