mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 07:32:32 +01:00
Resolve the issue of G1 and GG, gacha cat not being usable. Already compatible
Mainly, there are differences in the MHFG low version network protocol when pkt.ShopType=1 or 2 in handleMgMhfEnumerationShop. Conducted code judgment and differentiation processing. 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|
This commit is contained in:
@@ -122,7 +122,7 @@ func handleMsgMhfEnumerateShop(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
switch pkt.ShopType {
|
switch pkt.ShopType {
|
||||||
case 1: // Running gachas
|
case 1: // Running gachas
|
||||||
// Fundamentally, gacha works completely differently, just hide it for now.
|
// 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))
|
doAckBufSucceed(s, pkt.AckHandle, make([]byte, 4))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -144,15 +144,20 @@ func handleMsgMhfEnumerateShop(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
bf.WriteUint16(uint16(len(gachas)))
|
bf.WriteUint16(uint16(len(gachas)))
|
||||||
bf.WriteUint16(uint16(len(gachas)))
|
bf.WriteUint16(uint16(len(gachas)))
|
||||||
for _, g := range gachas {
|
for _, g := range gachas {
|
||||||
bf.WriteUint32(g.ID)
|
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
|
||||||
bf.WriteUint32(0) // Unknown rank restrictions
|
//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)
|
bf.WriteUint32(0) // Unknown rank restrictions
|
||||||
bf.WriteUint32(0)
|
bf.WriteUint32(0)
|
||||||
bf.WriteUint32(0)
|
bf.WriteUint32(0)
|
||||||
bf.WriteUint32(g.MinGR)
|
bf.WriteUint32(0)
|
||||||
bf.WriteUint32(g.MinHR)
|
bf.WriteUint32(g.MinGR)
|
||||||
bf.WriteUint32(0) // only 0 in known packet
|
bf.WriteUint32(g.MinHR)
|
||||||
|
bf.WriteUint32(0) // only 0 in known packet
|
||||||
|
}
|
||||||
ps.Uint8(bf, g.Name, true)
|
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.URLBanner, false)
|
||||||
ps.Uint8(bf, g.URLFeature, false)
|
ps.Uint8(bf, g.URLFeature, false)
|
||||||
if _config.ErupeConfig.RealClientMode >= _config.G10 {
|
if _config.ErupeConfig.RealClientMode >= _config.G10 {
|
||||||
@@ -195,6 +200,61 @@ func handleMsgMhfEnumerateShop(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
bf.WriteUint16(uint16(len(entries)))
|
bf.WriteUint16(uint16(len(entries)))
|
||||||
for _, ge := range entries {
|
for _, ge := range entries {
|
||||||
var items []GachaItem
|
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.WriteUint8(ge.EntryType)
|
||||||
bf.WriteUint32(ge.ID)
|
bf.WriteUint32(ge.ID)
|
||||||
bf.WriteUint8(ge.ItemType)
|
bf.WriteUint8(ge.ItemType)
|
||||||
|
|||||||
Reference in New Issue
Block a user