From 76d139538b48e0e576518853216e8435639f01f7 Mon Sep 17 00:00:00 2001 From: Houmgaor Date: Tue, 24 Feb 2026 15:34:51 +0100 Subject: [PATCH] refactor(items): extract inline data tables from handleMsgMhfEnumeratePrice Static data (GZ monster prices, LB prices, wanted list) cluttered the handler with 130 lines of table literals. Moving them to a dedicated tables file keeps the handler focused on serialization logic. --- docs/improvements.md | 2 +- server/channelserver/handlers_items.go | 142 +---------------- server/channelserver/handlers_items_tables.go | 146 ++++++++++++++++++ 3 files changed, 153 insertions(+), 137 deletions(-) create mode 100644 server/channelserver/handlers_items_tables.go diff --git a/docs/improvements.md b/docs/improvements.md index 21653346a..541fec971 100644 --- a/docs/improvements.md +++ b/docs/improvements.md @@ -135,4 +135,4 @@ Tests for those handlers either use stub handlers that skip repos or rely on int **Fix:** Extract to package-level `var` declarations or a dedicated data file (following the pattern of `handlers_data_paper_tables.go`). -**Status:** Pending. +**Status:** **Done.** Extracted 3 inline data tables (LB prices, wanted list, GZ prices) and their anonymous struct types to `handlers_items_tables.go`. Handler function reduced from 164 to 35 lines. diff --git a/server/channelserver/handlers_items.go b/server/channelserver/handlers_items.go index 63ac17eb1..a7a5e8a81 100644 --- a/server/channelserver/handlers_items.go +++ b/server/channelserver/handlers_items.go @@ -3,7 +3,6 @@ package channelserver import ( "erupe-ce/common/byteframe" "erupe-ce/common/mhfitem" - "erupe-ce/common/mhfmon" cfg "erupe-ce/config" "erupe-ce/network/mhfpacket" @@ -18,144 +17,15 @@ func handleMsgMhfTransferItem(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfEnumeratePrice(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfEnumeratePrice) bf := byteframe.NewByteFrame() - var lbPrices []struct { - Unk0 uint16 - Unk1 uint16 - Unk2 uint32 - } - var wantedList []struct { - Unk0 uint32 - Unk1 uint32 - Unk2 uint32 - Unk3 uint16 - Unk4 uint16 - Unk5 uint16 - Unk6 uint16 - Unk7 uint16 - Unk8 uint16 - Unk9 uint16 - } - gzPrices := []struct { - Unk0 uint16 - Gz uint16 - Unk1 uint16 - Unk2 uint16 - MonID uint16 - Unk3 uint16 - Unk4 uint8 - }{ - {0, 1000, 0, 0, mhfmon.Pokaradon, 100, 1}, - {0, 800, 0, 0, mhfmon.YianKutKu, 100, 1}, - {0, 800, 0, 0, mhfmon.DaimyoHermitaur, 100, 1}, - {0, 1100, 0, 0, mhfmon.Farunokku, 100, 1}, - {0, 900, 0, 0, mhfmon.Congalala, 100, 1}, - {0, 900, 0, 0, mhfmon.Gypceros, 100, 1}, - {0, 1300, 0, 0, mhfmon.Hyujikiki, 100, 1}, - {0, 1000, 0, 0, mhfmon.Basarios, 100, 1}, - {0, 1000, 0, 0, mhfmon.Rathian, 100, 1}, - {0, 800, 0, 0, mhfmon.ShogunCeanataur, 100, 1}, - {0, 1400, 0, 0, mhfmon.Midogaron, 100, 1}, - {0, 900, 0, 0, mhfmon.Blangonga, 100, 1}, - {0, 1100, 0, 0, mhfmon.Rathalos, 100, 1}, - {0, 1000, 0, 0, mhfmon.Khezu, 100, 1}, - {0, 1600, 0, 0, mhfmon.Giaorugu, 100, 1}, - {0, 1100, 0, 0, mhfmon.Gravios, 100, 1}, - {0, 1400, 0, 0, mhfmon.Tigrex, 100, 1}, - {0, 1000, 0, 0, mhfmon.Pariapuria, 100, 1}, - {0, 1700, 0, 0, mhfmon.Anorupatisu, 100, 1}, - {0, 1500, 0, 0, mhfmon.Lavasioth, 100, 1}, - {0, 1500, 0, 0, mhfmon.Espinas, 100, 1}, - {0, 1600, 0, 0, mhfmon.Rajang, 100, 1}, - {0, 1800, 0, 0, mhfmon.Rebidiora, 100, 1}, - {0, 1100, 0, 0, mhfmon.YianGaruga, 100, 1}, - {0, 1500, 0, 0, mhfmon.AqraVashimu, 100, 1}, - {0, 1600, 0, 0, mhfmon.Gurenzeburu, 100, 1}, - {0, 1500, 0, 0, mhfmon.Dyuragaua, 100, 1}, - {0, 1300, 0, 0, mhfmon.Gougarf, 100, 1}, - {0, 1000, 0, 0, mhfmon.Shantien, 100, 1}, - {0, 1800, 0, 0, mhfmon.Disufiroa, 100, 1}, - {0, 600, 0, 0, mhfmon.Velocidrome, 100, 1}, - {0, 600, 0, 0, mhfmon.Gendrome, 100, 1}, - {0, 700, 0, 0, mhfmon.Iodrome, 100, 1}, - {0, 1700, 0, 0, mhfmon.Baruragaru, 100, 1}, - {0, 800, 0, 0, mhfmon.Cephadrome, 100, 1}, - {0, 1000, 0, 0, mhfmon.Plesioth, 100, 1}, - {0, 1800, 0, 0, mhfmon.Zerureusu, 100, 1}, - {0, 1100, 0, 0, mhfmon.Diablos, 100, 1}, - {0, 1600, 0, 0, mhfmon.Berukyurosu, 100, 1}, - {0, 2000, 0, 0, mhfmon.Fatalis, 100, 1}, - {0, 1500, 0, 0, mhfmon.BlackGravios, 100, 1}, - {0, 1600, 0, 0, mhfmon.GoldRathian, 100, 1}, - {0, 1900, 0, 0, mhfmon.Meraginasu, 100, 1}, - {0, 700, 0, 0, mhfmon.Bulldrome, 100, 1}, - {0, 900, 0, 0, mhfmon.NonoOrugaron, 100, 1}, - {0, 1600, 0, 0, mhfmon.KamuOrugaron, 100, 1}, - {0, 1700, 0, 0, mhfmon.Forokururu, 100, 1}, - {0, 1900, 0, 0, mhfmon.Diorex, 100, 1}, - {0, 1500, 0, 0, mhfmon.AqraJebia, 100, 1}, - {0, 1600, 0, 0, mhfmon.SilverRathalos, 100, 1}, - {0, 2400, 0, 0, mhfmon.CrimsonFatalis, 100, 1}, - {0, 2000, 0, 0, mhfmon.Inagami, 100, 1}, - {0, 2100, 0, 0, mhfmon.GarubaDaora, 100, 1}, - {0, 900, 0, 0, mhfmon.Monoblos, 100, 1}, - {0, 1000, 0, 0, mhfmon.RedKhezu, 100, 1}, - {0, 900, 0, 0, mhfmon.Hypnocatrice, 100, 1}, - {0, 1700, 0, 0, mhfmon.PearlEspinas, 100, 1}, - {0, 900, 0, 0, mhfmon.PurpleGypceros, 100, 1}, - {0, 1800, 0, 0, mhfmon.Poborubarumu, 100, 1}, - {0, 1900, 0, 0, mhfmon.Lunastra, 100, 1}, - {0, 1600, 0, 0, mhfmon.Kuarusepusu, 100, 1}, - {0, 1100, 0, 0, mhfmon.PinkRathian, 100, 1}, - {0, 1200, 0, 0, mhfmon.AzureRathalos, 100, 1}, - {0, 1800, 0, 0, mhfmon.Varusaburosu, 100, 1}, - {0, 1000, 0, 0, mhfmon.Gogomoa, 100, 1}, - {0, 1600, 0, 0, mhfmon.BurningEspinas, 100, 1}, - {0, 2000, 0, 0, mhfmon.Harudomerugu, 100, 1}, - {0, 1800, 0, 0, mhfmon.Akantor, 100, 1}, - {0, 900, 0, 0, mhfmon.BrightHypnoc, 100, 1}, - {0, 2200, 0, 0, mhfmon.Gureadomosu, 100, 1}, - {0, 1200, 0, 0, mhfmon.GreenPlesioth, 100, 1}, - {0, 2400, 0, 0, mhfmon.Zinogre, 100, 1}, - {0, 1900, 0, 0, mhfmon.Gasurabazura, 100, 1}, - {0, 1300, 0, 0, mhfmon.Abiorugu, 100, 1}, - {0, 1200, 0, 0, mhfmon.BlackDiablos, 100, 1}, - {0, 1000, 0, 0, mhfmon.WhiteMonoblos, 100, 1}, - {0, 3000, 0, 0, mhfmon.Deviljho, 100, 1}, - {0, 2300, 0, 0, mhfmon.YamaKurai, 100, 1}, - {0, 2800, 0, 0, mhfmon.Brachydios, 100, 1}, - {0, 1700, 0, 0, mhfmon.Toridcless, 100, 1}, - {0, 1100, 0, 0, mhfmon.WhiteHypnoc, 100, 1}, - {0, 1500, 0, 0, mhfmon.RedLavasioth, 100, 1}, - {0, 2200, 0, 0, mhfmon.Barioth, 100, 1}, - {0, 1800, 0, 0, mhfmon.Odibatorasu, 100, 1}, - {0, 1600, 0, 0, mhfmon.Doragyurosu, 100, 1}, - {0, 900, 0, 0, mhfmon.BlueYianKutKu, 100, 1}, - {0, 2300, 0, 0, mhfmon.ToaTesukatora, 100, 1}, - {0, 2000, 0, 0, mhfmon.Uragaan, 100, 1}, - {0, 1900, 0, 0, mhfmon.Teostra, 100, 1}, - {0, 1700, 0, 0, mhfmon.Chameleos, 100, 1}, - {0, 1800, 0, 0, mhfmon.KushalaDaora, 100, 1}, - {0, 2100, 0, 0, mhfmon.Nargacuga, 100, 1}, - {0, 2600, 0, 0, mhfmon.Guanzorumu, 100, 1}, - {0, 1900, 0, 0, mhfmon.Kirin, 100, 1}, - {0, 2000, 0, 0, mhfmon.Rukodiora, 100, 1}, - {0, 2700, 0, 0, mhfmon.StygianZinogre, 100, 1}, - {0, 2200, 0, 0, mhfmon.Voljang, 100, 1}, - {0, 1800, 0, 0, mhfmon.Zenaserisu, 100, 1}, - {0, 3100, 0, 0, mhfmon.GoreMagala, 100, 1}, - {0, 3200, 0, 0, mhfmon.ShagaruMagala, 100, 1}, - {0, 3500, 0, 0, mhfmon.Eruzerion, 100, 1}, - {0, 3200, 0, 0, mhfmon.Amatsu, 100, 1}, - } - bf.WriteUint16(uint16(len(lbPrices))) - for _, lb := range lbPrices { + bf.WriteUint16(uint16(len(enumeratePriceLB))) + for _, lb := range enumeratePriceLB { bf.WriteUint16(lb.Unk0) bf.WriteUint16(lb.Unk1) bf.WriteUint32(lb.Unk2) } - bf.WriteUint16(uint16(len(wantedList))) - for _, wanted := range wantedList { + bf.WriteUint16(uint16(len(enumeratePriceWanted))) + for _, wanted := range enumeratePriceWanted { bf.WriteUint32(wanted.Unk0) bf.WriteUint32(wanted.Unk1) bf.WriteUint32(wanted.Unk2) @@ -167,8 +37,8 @@ func handleMsgMhfEnumeratePrice(s *Session, p mhfpacket.MHFPacket) { bf.WriteUint16(wanted.Unk8) bf.WriteUint16(wanted.Unk9) } - bf.WriteUint8(uint8(len(gzPrices))) - for _, gz := range gzPrices { + bf.WriteUint8(uint8(len(enumeratePriceGZ))) + for _, gz := range enumeratePriceGZ { bf.WriteUint16(gz.Unk0) bf.WriteUint16(gz.Gz) bf.WriteUint16(gz.Unk1) diff --git a/server/channelserver/handlers_items_tables.go b/server/channelserver/handlers_items_tables.go new file mode 100644 index 000000000..0b96c5454 --- /dev/null +++ b/server/channelserver/handlers_items_tables.go @@ -0,0 +1,146 @@ +package channelserver + +import "erupe-ce/common/mhfmon" + +// Static data tables for handleMsgMhfEnumeratePrice. + +type enumeratePriceLBEntry struct { + Unk0 uint16 + Unk1 uint16 + Unk2 uint32 +} + +type enumeratePriceWantedEntry struct { + Unk0 uint32 + Unk1 uint32 + Unk2 uint32 + Unk3 uint16 + Unk4 uint16 + Unk5 uint16 + Unk6 uint16 + Unk7 uint16 + Unk8 uint16 + Unk9 uint16 +} + +type enumeratePriceGZEntry struct { + Unk0 uint16 + Gz uint16 + Unk1 uint16 + Unk2 uint16 + MonID uint16 + Unk3 uint16 + Unk4 uint8 +} + +// enumeratePriceLB is the LB price list (currently empty/unused). +var enumeratePriceLB []enumeratePriceLBEntry + +// enumeratePriceWanted is the wanted monster list (currently empty/unused). +var enumeratePriceWanted []enumeratePriceWantedEntry + +// enumeratePriceGZ is the GZ price table mapping monsters to their GZ costs. +var enumeratePriceGZ = []enumeratePriceGZEntry{ + {0, 1000, 0, 0, mhfmon.Pokaradon, 100, 1}, + {0, 800, 0, 0, mhfmon.YianKutKu, 100, 1}, + {0, 800, 0, 0, mhfmon.DaimyoHermitaur, 100, 1}, + {0, 1100, 0, 0, mhfmon.Farunokku, 100, 1}, + {0, 900, 0, 0, mhfmon.Congalala, 100, 1}, + {0, 900, 0, 0, mhfmon.Gypceros, 100, 1}, + {0, 1300, 0, 0, mhfmon.Hyujikiki, 100, 1}, + {0, 1000, 0, 0, mhfmon.Basarios, 100, 1}, + {0, 1000, 0, 0, mhfmon.Rathian, 100, 1}, + {0, 800, 0, 0, mhfmon.ShogunCeanataur, 100, 1}, + {0, 1400, 0, 0, mhfmon.Midogaron, 100, 1}, + {0, 900, 0, 0, mhfmon.Blangonga, 100, 1}, + {0, 1100, 0, 0, mhfmon.Rathalos, 100, 1}, + {0, 1000, 0, 0, mhfmon.Khezu, 100, 1}, + {0, 1600, 0, 0, mhfmon.Giaorugu, 100, 1}, + {0, 1100, 0, 0, mhfmon.Gravios, 100, 1}, + {0, 1400, 0, 0, mhfmon.Tigrex, 100, 1}, + {0, 1000, 0, 0, mhfmon.Pariapuria, 100, 1}, + {0, 1700, 0, 0, mhfmon.Anorupatisu, 100, 1}, + {0, 1500, 0, 0, mhfmon.Lavasioth, 100, 1}, + {0, 1500, 0, 0, mhfmon.Espinas, 100, 1}, + {0, 1600, 0, 0, mhfmon.Rajang, 100, 1}, + {0, 1800, 0, 0, mhfmon.Rebidiora, 100, 1}, + {0, 1100, 0, 0, mhfmon.YianGaruga, 100, 1}, + {0, 1500, 0, 0, mhfmon.AqraVashimu, 100, 1}, + {0, 1600, 0, 0, mhfmon.Gurenzeburu, 100, 1}, + {0, 1500, 0, 0, mhfmon.Dyuragaua, 100, 1}, + {0, 1300, 0, 0, mhfmon.Gougarf, 100, 1}, + {0, 1000, 0, 0, mhfmon.Shantien, 100, 1}, + {0, 1800, 0, 0, mhfmon.Disufiroa, 100, 1}, + {0, 600, 0, 0, mhfmon.Velocidrome, 100, 1}, + {0, 600, 0, 0, mhfmon.Gendrome, 100, 1}, + {0, 700, 0, 0, mhfmon.Iodrome, 100, 1}, + {0, 1700, 0, 0, mhfmon.Baruragaru, 100, 1}, + {0, 800, 0, 0, mhfmon.Cephadrome, 100, 1}, + {0, 1000, 0, 0, mhfmon.Plesioth, 100, 1}, + {0, 1800, 0, 0, mhfmon.Zerureusu, 100, 1}, + {0, 1100, 0, 0, mhfmon.Diablos, 100, 1}, + {0, 1600, 0, 0, mhfmon.Berukyurosu, 100, 1}, + {0, 2000, 0, 0, mhfmon.Fatalis, 100, 1}, + {0, 1500, 0, 0, mhfmon.BlackGravios, 100, 1}, + {0, 1600, 0, 0, mhfmon.GoldRathian, 100, 1}, + {0, 1900, 0, 0, mhfmon.Meraginasu, 100, 1}, + {0, 700, 0, 0, mhfmon.Bulldrome, 100, 1}, + {0, 900, 0, 0, mhfmon.NonoOrugaron, 100, 1}, + {0, 1600, 0, 0, mhfmon.KamuOrugaron, 100, 1}, + {0, 1700, 0, 0, mhfmon.Forokururu, 100, 1}, + {0, 1900, 0, 0, mhfmon.Diorex, 100, 1}, + {0, 1500, 0, 0, mhfmon.AqraJebia, 100, 1}, + {0, 1600, 0, 0, mhfmon.SilverRathalos, 100, 1}, + {0, 2400, 0, 0, mhfmon.CrimsonFatalis, 100, 1}, + {0, 2000, 0, 0, mhfmon.Inagami, 100, 1}, + {0, 2100, 0, 0, mhfmon.GarubaDaora, 100, 1}, + {0, 900, 0, 0, mhfmon.Monoblos, 100, 1}, + {0, 1000, 0, 0, mhfmon.RedKhezu, 100, 1}, + {0, 900, 0, 0, mhfmon.Hypnocatrice, 100, 1}, + {0, 1700, 0, 0, mhfmon.PearlEspinas, 100, 1}, + {0, 900, 0, 0, mhfmon.PurpleGypceros, 100, 1}, + {0, 1800, 0, 0, mhfmon.Poborubarumu, 100, 1}, + {0, 1900, 0, 0, mhfmon.Lunastra, 100, 1}, + {0, 1600, 0, 0, mhfmon.Kuarusepusu, 100, 1}, + {0, 1100, 0, 0, mhfmon.PinkRathian, 100, 1}, + {0, 1200, 0, 0, mhfmon.AzureRathalos, 100, 1}, + {0, 1800, 0, 0, mhfmon.Varusaburosu, 100, 1}, + {0, 1000, 0, 0, mhfmon.Gogomoa, 100, 1}, + {0, 1600, 0, 0, mhfmon.BurningEspinas, 100, 1}, + {0, 2000, 0, 0, mhfmon.Harudomerugu, 100, 1}, + {0, 1800, 0, 0, mhfmon.Akantor, 100, 1}, + {0, 900, 0, 0, mhfmon.BrightHypnoc, 100, 1}, + {0, 2200, 0, 0, mhfmon.Gureadomosu, 100, 1}, + {0, 1200, 0, 0, mhfmon.GreenPlesioth, 100, 1}, + {0, 2400, 0, 0, mhfmon.Zinogre, 100, 1}, + {0, 1900, 0, 0, mhfmon.Gasurabazura, 100, 1}, + {0, 1300, 0, 0, mhfmon.Abiorugu, 100, 1}, + {0, 1200, 0, 0, mhfmon.BlackDiablos, 100, 1}, + {0, 1000, 0, 0, mhfmon.WhiteMonoblos, 100, 1}, + {0, 3000, 0, 0, mhfmon.Deviljho, 100, 1}, + {0, 2300, 0, 0, mhfmon.YamaKurai, 100, 1}, + {0, 2800, 0, 0, mhfmon.Brachydios, 100, 1}, + {0, 1700, 0, 0, mhfmon.Toridcless, 100, 1}, + {0, 1100, 0, 0, mhfmon.WhiteHypnoc, 100, 1}, + {0, 1500, 0, 0, mhfmon.RedLavasioth, 100, 1}, + {0, 2200, 0, 0, mhfmon.Barioth, 100, 1}, + {0, 1800, 0, 0, mhfmon.Odibatorasu, 100, 1}, + {0, 1600, 0, 0, mhfmon.Doragyurosu, 100, 1}, + {0, 900, 0, 0, mhfmon.BlueYianKutKu, 100, 1}, + {0, 2300, 0, 0, mhfmon.ToaTesukatora, 100, 1}, + {0, 2000, 0, 0, mhfmon.Uragaan, 100, 1}, + {0, 1900, 0, 0, mhfmon.Teostra, 100, 1}, + {0, 1700, 0, 0, mhfmon.Chameleos, 100, 1}, + {0, 1800, 0, 0, mhfmon.KushalaDaora, 100, 1}, + {0, 2100, 0, 0, mhfmon.Nargacuga, 100, 1}, + {0, 2600, 0, 0, mhfmon.Guanzorumu, 100, 1}, + {0, 1900, 0, 0, mhfmon.Kirin, 100, 1}, + {0, 2000, 0, 0, mhfmon.Rukodiora, 100, 1}, + {0, 2700, 0, 0, mhfmon.StygianZinogre, 100, 1}, + {0, 2200, 0, 0, mhfmon.Voljang, 100, 1}, + {0, 1800, 0, 0, mhfmon.Zenaserisu, 100, 1}, + {0, 3100, 0, 0, mhfmon.GoreMagala, 100, 1}, + {0, 3200, 0, 0, mhfmon.ShagaruMagala, 100, 1}, + {0, 3500, 0, 0, mhfmon.Eruzerion, 100, 1}, + {0, 3200, 0, 0, mhfmon.Amatsu, 100, 1}, +}