various Tower changes

This commit is contained in:
wish
2023-06-12 00:01:20 +10:00
parent 2c8391b5a4
commit 75d5ceed4f
5 changed files with 127 additions and 52 deletions

View File

@@ -11,12 +11,12 @@ import (
// MsgMhfPostGemInfo represents the MSG_MHF_POST_GEM_INFO // MsgMhfPostGemInfo represents the MSG_MHF_POST_GEM_INFO
type MsgMhfPostGemInfo struct { type MsgMhfPostGemInfo struct {
AckHandle uint32 AckHandle uint32
Unk0 uint32 Op uint32
Unk1 uint32 Unk1 uint32
Unk2 int32 Gem int32
Unk3 int32 Quantity int32
Unk4 int32 CID int32
Unk5 int32 Message int32
Unk6 int32 Unk6 int32
} }
@@ -28,12 +28,12 @@ func (m *MsgMhfPostGemInfo) Opcode() network.PacketID {
// Parse parses the packet from binary // Parse parses the packet from binary
func (m *MsgMhfPostGemInfo) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { func (m *MsgMhfPostGemInfo) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint32() m.Op = bf.ReadUint32()
m.Unk1 = bf.ReadUint32() m.Unk1 = bf.ReadUint32()
m.Unk2 = bf.ReadInt32() m.Gem = bf.ReadInt32()
m.Unk3 = bf.ReadInt32() m.Quantity = bf.ReadInt32()
m.Unk4 = bf.ReadInt32() m.CID = bf.ReadInt32()
m.Unk5 = bf.ReadInt32() m.Message = bf.ReadInt32()
m.Unk6 = bf.ReadInt32() m.Unk6 = bf.ReadInt32()
return nil return nil
} }

View File

@@ -1,22 +1,26 @@
package mhfpacket package mhfpacket
import ( import (
"errors" "errors"
"erupe-ce/network/clientctx"
"erupe-ce/network"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/network"
"erupe-ce/network/clientctx"
) )
// MsgMhfPostTenrouirai represents the MSG_MHF_POST_TENROUIRAI // MsgMhfPostTenrouirai represents the MSG_MHF_POST_TENROUIRAI
type MsgMhfPostTenrouirai struct{ type MsgMhfPostTenrouirai struct {
AckHandle uint32 AckHandle uint32
Unk0 uint16 Unk0 uint8
Unk1 uint32 Unk1 uint8
Unk2 uint32 GuildID uint32
Unk3 uint32 Unk3 uint8
Unk4 uint32 Unk4 uint16
Unk5 uint8 Unk5 uint16
Unk6 uint16
Unk7 uint16
Unk8 uint16
Unk9 uint16
} }
// Opcode returns the ID associated with this packet type. // 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 // Parse parses the packet from binary
func (m *MsgMhfPostTenrouirai) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { func (m *MsgMhfPostTenrouirai) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint16() m.Unk0 = bf.ReadUint8()
m.Unk1 = bf.ReadUint32() m.Unk1 = bf.ReadUint8()
m.Unk2 = bf.ReadUint32() m.GuildID = bf.ReadUint32()
m.Unk3 = bf.ReadUint32() m.Unk3 = bf.ReadUint8()
m.Unk4 = bf.ReadUint32() m.Unk4 = bf.ReadUint16()
m.Unk5 = bf.ReadUint8() m.Unk5 = bf.ReadUint16()
m.Unk6 = bf.ReadUint16()
m.Unk7 = bf.ReadUint16()
m.Unk8 = bf.ReadUint16()
m.Unk9 = bf.ReadUint16()
return nil return nil
} }

View File

@@ -13,13 +13,13 @@ type MsgMhfPostTowerInfo struct {
AckHandle uint32 AckHandle uint32
InfoType uint32 InfoType uint32
Unk1 uint32 Unk1 uint32
Unk2 int32 Skill int32
Unk3 int32 TR int32
Unk4 int32 TRP int32
Unk5 int32 Cost int32
Unk6 int32 Unk6 int32
Unk7 int32 Unk7 int32
Unk8 int32 Zone1 int32
Unk9 int64 Unk9 int64
} }
@@ -33,13 +33,13 @@ func (m *MsgMhfPostTowerInfo) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Clie
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.InfoType = bf.ReadUint32() m.InfoType = bf.ReadUint32()
m.Unk1 = bf.ReadUint32() m.Unk1 = bf.ReadUint32()
m.Unk2 = bf.ReadInt32() m.Skill = bf.ReadInt32()
m.Unk3 = bf.ReadInt32() m.TR = bf.ReadInt32()
m.Unk4 = bf.ReadInt32() m.TRP = bf.ReadInt32()
m.Unk5 = bf.ReadInt32() m.Cost = bf.ReadInt32()
m.Unk6 = bf.ReadInt32() m.Unk6 = bf.ReadInt32()
m.Unk7 = bf.ReadInt32() m.Unk7 = bf.ReadInt32()
m.Unk8 = bf.ReadInt32() m.Zone1 = bf.ReadInt32()
m.Unk9 = bf.ReadInt64() m.Unk9 = bf.ReadInt64()
return nil return nil
} }

View File

@@ -6,7 +6,8 @@ CREATE TABLE IF NOT EXISTS tower (
trp INT, trp INT,
tsp INT, tsp INT,
zone1 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; END;

View File

@@ -1,6 +1,8 @@
package channelserver package channelserver
import ( import (
"go.uber.org/zap"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/common/stringsupport" "erupe-ce/common/stringsupport"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
@@ -100,15 +102,32 @@ func handleMsgMhfGetTowerInfo(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfPostTowerInfo(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfPostTowerInfo(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfPostTowerInfo) 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 { switch pkt.InfoType {
case 2: 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" 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.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: 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 { type TenrouiraiCharScore struct {
@@ -170,7 +189,24 @@ func handleMsgMhfGetTenrouirai(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfPostTenrouirai(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfPostTenrouirai(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfPostTenrouirai) 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) {} func handleMsgMhfGetBreakSeibatuLevelReward(s *Session, p mhfpacket.MHFPacket) {}
@@ -223,8 +259,8 @@ func handleMsgMhfPresentBox(s *Session, p mhfpacket.MHFPacket) {
} }
type GemInfo struct { type GemInfo struct {
Unk0 uint16 Gem uint16
Unk1 uint16 Quantity uint16
} }
type GemHistory struct { type GemHistory struct {
@@ -239,8 +275,22 @@ func handleMsgMhfGetGemInfo(s *Session, p mhfpacket.MHFPacket) {
var data []*byteframe.ByteFrame var data []*byteframe.ByteFrame
gemInfo := []GemInfo{} gemInfo := []GemInfo{}
gemHistory := []GemHistory{} 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 { switch pkt.Unk0 {
case 1: 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 { for _, history := range gemHistory {
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
bf.WriteUint16(history.Unk0) bf.WriteUint16(history.Unk0)
@@ -249,18 +299,34 @@ func handleMsgMhfGetGemInfo(s *Session, p mhfpacket.MHFPacket) {
bf.WriteBytes(stringsupport.PaddedString(history.Unk3, 14, true)) bf.WriteBytes(stringsupport.PaddedString(history.Unk3, 14, true))
data = append(data, bf) 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) doAckEarthSucceed(s, pkt.AckHandle, data)
} }
func handleMsgMhfPostGemInfo(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfPostGemInfo(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfPostGemInfo) 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)) doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
} }