diff --git a/network/mhfpacket/msg_mhf_post_gem_info.go b/network/mhfpacket/msg_mhf_post_gem_info.go index 2e89b89b7..d487670fc 100644 --- a/network/mhfpacket/msg_mhf_post_gem_info.go +++ b/network/mhfpacket/msg_mhf_post_gem_info.go @@ -11,12 +11,12 @@ import ( // MsgMhfPostGemInfo represents the MSG_MHF_POST_GEM_INFO type MsgMhfPostGemInfo struct { AckHandle uint32 - Unk0 uint32 + Op uint32 Unk1 uint32 - Unk2 int32 - Unk3 int32 - Unk4 int32 - Unk5 int32 + Gem int32 + Quantity int32 + CID int32 + Message int32 Unk6 int32 } @@ -28,12 +28,12 @@ func (m *MsgMhfPostGemInfo) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfPostGemInfo) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() - m.Unk0 = bf.ReadUint32() + m.Op = bf.ReadUint32() m.Unk1 = bf.ReadUint32() - m.Unk2 = bf.ReadInt32() - m.Unk3 = bf.ReadInt32() - m.Unk4 = bf.ReadInt32() - m.Unk5 = bf.ReadInt32() + m.Gem = bf.ReadInt32() + m.Quantity = bf.ReadInt32() + m.CID = bf.ReadInt32() + m.Message = bf.ReadInt32() m.Unk6 = bf.ReadInt32() return nil } diff --git a/network/mhfpacket/msg_mhf_post_tenrouirai.go b/network/mhfpacket/msg_mhf_post_tenrouirai.go index d4b4fdc71..91b8d1b6e 100644 --- a/network/mhfpacket/msg_mhf_post_tenrouirai.go +++ b/network/mhfpacket/msg_mhf_post_tenrouirai.go @@ -1,22 +1,26 @@ package mhfpacket -import ( - "errors" +import ( + "errors" - "erupe-ce/network/clientctx" - "erupe-ce/network" "erupe-ce/common/byteframe" + "erupe-ce/network" + "erupe-ce/network/clientctx" ) // MsgMhfPostTenrouirai represents the MSG_MHF_POST_TENROUIRAI -type MsgMhfPostTenrouirai struct{ - AckHandle uint32 - Unk0 uint16 - Unk1 uint32 - Unk2 uint32 - Unk3 uint32 - Unk4 uint32 - Unk5 uint8 +type MsgMhfPostTenrouirai struct { + AckHandle uint32 + Unk0 uint8 + Unk1 uint8 + GuildID uint32 + Unk3 uint8 + Unk4 uint16 + Unk5 uint16 + Unk6 uint16 + Unk7 uint16 + Unk8 uint16 + Unk9 uint16 } // Opcode returns the ID associated with this packet type. @@ -27,12 +31,16 @@ func (m *MsgMhfPostTenrouirai) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfPostTenrouirai) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() - m.Unk0 = bf.ReadUint16() - m.Unk1 = bf.ReadUint32() - m.Unk2 = bf.ReadUint32() - m.Unk3 = bf.ReadUint32() - m.Unk4 = bf.ReadUint32() - m.Unk5 = bf.ReadUint8() + m.Unk0 = bf.ReadUint8() + m.Unk1 = bf.ReadUint8() + m.GuildID = bf.ReadUint32() + m.Unk3 = bf.ReadUint8() + m.Unk4 = bf.ReadUint16() + m.Unk5 = bf.ReadUint16() + m.Unk6 = bf.ReadUint16() + m.Unk7 = bf.ReadUint16() + m.Unk8 = bf.ReadUint16() + m.Unk9 = bf.ReadUint16() return nil } diff --git a/network/mhfpacket/msg_mhf_post_tower_info.go b/network/mhfpacket/msg_mhf_post_tower_info.go index 3499d1f98..a574f6c6e 100644 --- a/network/mhfpacket/msg_mhf_post_tower_info.go +++ b/network/mhfpacket/msg_mhf_post_tower_info.go @@ -13,13 +13,13 @@ type MsgMhfPostTowerInfo struct { AckHandle uint32 InfoType uint32 Unk1 uint32 - Unk2 int32 - Unk3 int32 - Unk4 int32 - Unk5 int32 + Skill int32 + TR int32 + TRP int32 + Cost int32 Unk6 int32 Unk7 int32 - Unk8 int32 + Zone1 int32 Unk9 int64 } @@ -33,13 +33,13 @@ func (m *MsgMhfPostTowerInfo) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Clie m.AckHandle = bf.ReadUint32() m.InfoType = bf.ReadUint32() m.Unk1 = bf.ReadUint32() - m.Unk2 = bf.ReadInt32() - m.Unk3 = bf.ReadInt32() - m.Unk4 = bf.ReadInt32() - m.Unk5 = bf.ReadInt32() + m.Skill = bf.ReadInt32() + m.TR = bf.ReadInt32() + m.TRP = bf.ReadInt32() + m.Cost = bf.ReadInt32() m.Unk6 = bf.ReadInt32() m.Unk7 = bf.ReadInt32() - m.Unk8 = bf.ReadInt32() + m.Zone1 = bf.ReadInt32() m.Unk9 = bf.ReadInt64() return nil } diff --git a/patch-schema/tower.sql b/patch-schema/tower.sql index 661393c27..d1a6c1556 100644 --- a/patch-schema/tower.sql +++ b/patch-schema/tower.sql @@ -6,7 +6,8 @@ CREATE TABLE IF NOT EXISTS tower ( trp INT, tsp INT, zone1 INT, - skills TEXT DEFAULT '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,0,0,0,0,0,0,0,0,0,0' + skills TEXT DEFAULT '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,0,0,0,0,0,0,0,0,0,0', + gems TEXT DEFAULT '0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0' ); END; \ No newline at end of file diff --git a/server/channelserver/handlers_tower.go b/server/channelserver/handlers_tower.go index 3fb859b9a..13a16cc7b 100644 --- a/server/channelserver/handlers_tower.go +++ b/server/channelserver/handlers_tower.go @@ -1,6 +1,8 @@ package channelserver import ( + "go.uber.org/zap" + "erupe-ce/common/byteframe" "erupe-ce/common/stringsupport" "erupe-ce/network/mhfpacket" @@ -100,15 +102,32 @@ func handleMsgMhfGetTowerInfo(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfPostTowerInfo(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfPostTowerInfo) + + if s.server.erupeConfig.DevModeOptions.QuestDebugTools { + s.logger.Debug( + p.Opcode().String(), + zap.Uint32("InfoType", pkt.InfoType), + zap.Uint32("Unk1", pkt.Unk1), + zap.Int32("Skill", pkt.Skill), + zap.Int32("TR", pkt.TR), + zap.Int32("TRP", pkt.TRP), + zap.Int32("Cost", pkt.Cost), + zap.Int32("Unk6", pkt.Unk6), + zap.Int32("Unk7", pkt.Unk7), + zap.Int32("Zone1", pkt.Zone1), + zap.Int64("Unk9", pkt.Unk9), + ) + } + switch pkt.InfoType { case 2: skills := "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,0,0,0,0,0,0,0,0,0,0" s.server.db.QueryRow(`SELECT skills FROM tower WHERE char_id=$1`, s.charID).Scan(&skills) - s.server.db.Exec(`UPDATE tower SET skills=$1, tsp=tsp-$2 WHERE char_id=$3`, stringsupport.CSVSetIndex(skills, int(pkt.Unk2), stringsupport.CSVGetIndex(skills, int(pkt.Unk2))+1), pkt.Unk5, s.charID) + s.server.db.Exec(`UPDATE tower SET skills=$1, tsp=tsp-$2 WHERE char_id=$3`, stringsupport.CSVSetIndex(skills, int(pkt.Skill), stringsupport.CSVGetIndex(skills, int(pkt.Skill))+1), pkt.Cost, s.charID) case 7: - s.server.db.Exec(`UPDATE tower SET tr=$1, trp=$2, zone1=zone1+$3 WHERE char_id=$4`, pkt.Unk3, pkt.Unk4, pkt.Unk8, s.charID) + s.server.db.Exec(`UPDATE tower SET tr=$1, trp=trp+$2, zone1=zone1+$3 WHERE char_id=$4`, pkt.TR, pkt.TRP, pkt.Zone1, s.charID) } - doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } type TenrouiraiCharScore struct { @@ -170,7 +189,24 @@ func handleMsgMhfGetTenrouirai(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfPostTenrouirai(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfPostTenrouirai) - doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) + + if s.server.erupeConfig.DevModeOptions.QuestDebugTools { + s.logger.Debug( + p.Opcode().String(), + zap.Uint8("Unk0", pkt.Unk0), + zap.Uint8("Unk1", pkt.Unk1), + zap.Uint32("GuildID", pkt.GuildID), + zap.Uint8("Unk3", pkt.Unk3), + zap.Uint16("Unk4", pkt.Unk4), + zap.Uint16("Unk5", pkt.Unk5), + zap.Uint16("Unk6", pkt.Unk6), + zap.Uint16("Unk7", pkt.Unk7), + zap.Uint16("Unk8", pkt.Unk8), + zap.Uint16("Unk9", pkt.Unk9), + ) + } + + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } func handleMsgMhfGetBreakSeibatuLevelReward(s *Session, p mhfpacket.MHFPacket) {} @@ -223,8 +259,8 @@ func handleMsgMhfPresentBox(s *Session, p mhfpacket.MHFPacket) { } type GemInfo struct { - Unk0 uint16 - Unk1 uint16 + Gem uint16 + Quantity uint16 } type GemHistory struct { @@ -239,8 +275,22 @@ func handleMsgMhfGetGemInfo(s *Session, p mhfpacket.MHFPacket) { var data []*byteframe.ByteFrame gemInfo := []GemInfo{} gemHistory := []GemHistory{} + + tempGems := "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" + s.server.db.QueryRow(`SELECT gems FROM tower WHERE char_id=$1`, s.charID).Scan(&tempGems) + for i, v := range stringsupport.CSVElems(tempGems) { + gemInfo = append(gemInfo, GemInfo{uint16(((i / 3) * 256) + ((i % 3) + 1)), uint16(v)}) + } + switch pkt.Unk0 { case 1: + for _, info := range gemInfo { + bf := byteframe.NewByteFrame() + bf.WriteUint16(info.Gem) + bf.WriteUint16(info.Quantity) + data = append(data, bf) + } + default: for _, history := range gemHistory { bf := byteframe.NewByteFrame() bf.WriteUint16(history.Unk0) @@ -249,18 +299,34 @@ func handleMsgMhfGetGemInfo(s *Session, p mhfpacket.MHFPacket) { bf.WriteBytes(stringsupport.PaddedString(history.Unk3, 14, true)) data = append(data, bf) } - default: - for _, info := range gemInfo { - bf := byteframe.NewByteFrame() - bf.WriteUint16(info.Unk0) - bf.WriteUint16(info.Unk1) - data = append(data, bf) - } } doAckEarthSucceed(s, pkt.AckHandle, data) } func handleMsgMhfPostGemInfo(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfPostGemInfo) + + if s.server.erupeConfig.DevModeOptions.QuestDebugTools { + s.logger.Debug( + p.Opcode().String(), + zap.Uint32("Op", pkt.Op), + zap.Uint32("Unk1", pkt.Unk1), + zap.Int32("Gem", pkt.Gem), + zap.Int32("Quantity", pkt.Quantity), + zap.Int32("CID", pkt.CID), + zap.Int32("Message", pkt.Message), + zap.Int32("Unk6", pkt.Unk6), + ) + } + + gems := "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" + s.server.db.QueryRow(`SELECT gems FROM tower WHERE char_id=$1`, s.charID).Scan(&gems) + switch pkt.Op { + case 1: // Add gem + i := int(((pkt.Gem / 256) * 3) + (((pkt.Gem - ((pkt.Gem / 256) * 256)) - 1) % 3)) + s.server.db.Exec(`UPDATE tower SET gems=$1 WHERE char_id=$2`, stringsupport.CSVSetIndex(gems, i, stringsupport.CSVGetIndex(gems, i)+int(pkt.Quantity)), s.charID) + case 2: // Transfer gem + // no way im doing this for now + } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) }