improve house entry handling

This commit is contained in:
wish
2022-07-25 12:59:45 +10:00
parent d073a72826
commit 23e2e25c72
2 changed files with 37 additions and 17 deletions

View File

@@ -14,9 +14,10 @@ type MsgMhfLoadHouse struct {
AckHandle uint32 AckHandle uint32
CharID uint32 CharID uint32
Destination uint8 Destination uint8
InMezeporta bool // False if already in hosts My Series, in case host updates PW
Unk3 uint16 // Hardcoded 0 in binary CheckPass bool
Password string Unk3 uint16 // Hardcoded 0 in binary
Password string
} }
// Opcode returns the ID associated with this packet type. // Opcode returns the ID associated with this packet type.
@@ -29,7 +30,7 @@ func (m *MsgMhfLoadHouse) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientCo
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.CharID = bf.ReadUint32() m.CharID = bf.ReadUint32()
m.Destination = bf.ReadUint8() m.Destination = bf.ReadUint8()
m.InMezeporta = bf.ReadBool() m.CheckPass = bf.ReadBool()
_ = bf.ReadUint16() _ = bf.ReadUint16()
_ = bf.ReadUint8() // Password length _ = bf.ReadUint8() // Password length
m.Password = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) m.Password = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())

View File

@@ -123,35 +123,54 @@ func handleMsgMhfUpdateHouse(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfLoadHouse(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfLoadHouse(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfLoadHouse) pkt := p.(*mhfpacket.MsgMhfLoadHouse)
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
var data []byte if pkt.Destination != 9 && len(pkt.Password) > 0 && pkt.CheckPass {
err := s.server.db.QueryRow("SELECT house FROM characters WHERE id=$1", pkt.CharID).Scan(&data) for _, session := range s.server.sessions {
if session.charID == pkt.CharID && pkt.Password != session.house.password {
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
return
}
}
}
var furniture []byte
err := s.server.db.QueryRow("SELECT house FROM characters WHERE id=$1", pkt.CharID).Scan(&furniture)
if err != nil { if err != nil {
panic(err) panic(err)
} }
if data == nil { if furniture == nil {
data = make([]byte, 20) furniture = make([]byte, 20)
} }
// TODO: Find where the missing data comes from, savefile offset? // TODO: Find where the missing data comes from, savefile offset?
switch pkt.Destination { switch pkt.Destination {
case 3: // Others house case 3: // Others house
houseTier := uint8(2) // Fallback if can't find houseTier := uint8(2) // Fallback if can't find
for _, session := range s.server.sessions { for _, session := range s.server.sessions {
if session.charID == pkt.CharID { if session.charID == pkt.CharID {
if pkt.Password != session.house.password {
// Not the correct error code but works
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
return
}
houseTier = session.house.tier houseTier = session.house.tier
} }
} }
bf.WriteBytes(make([]byte, 4)) bf.WriteBytes(make([]byte, 4))
bf.WriteUint8(houseTier) // House tier 0x1FB70 bf.WriteUint8(houseTier) // House tier 0x1FB70
// Item box style bf.WriteBytes(make([]byte, 80))
// Item box style bitfield
// tier 1 = 0x09FE
// tier 2 = 0x69FF
// tier 3 = 0xE9FF
// unused = 0x0001
// unused = 0x6000
switch houseTier {
case 0:
bf.WriteUint16(0x0000)
case 1:
bf.WriteUint16(0x69FF)
case 2:
bf.WriteUint16(0xE9FF)
}
// Rastae // Rastae
// Partner // Partner
bf.WriteBytes(make([]byte, 214)) bf.WriteBytes(make([]byte, 132))
bf.WriteBytes(data) bf.WriteBytes(furniture)
case 4: // Bookshelf case 4: // Bookshelf
// Hunting log // Hunting log
bf.WriteBytes(make([]byte, 5576)) bf.WriteBytes(make([]byte, 5576))
@@ -164,7 +183,7 @@ func handleMsgMhfLoadHouse(s *Session, p mhfpacket.MHFPacket) {
// Pugis // Pugis
bf.WriteBytes(make([]byte, 240)) bf.WriteBytes(make([]byte, 240))
case 9: // Own house case 9: // Own house
bf.WriteBytes(data) bf.WriteBytes(furniture)
case 10: // Garden case 10: // Garden
// Gardening upgrades // Gardening upgrades
// Gooks // Gooks