diff --git a/config.json b/config.json index ba952620b..98ea1c0ef 100644 --- a/config.json +++ b/config.json @@ -46,6 +46,10 @@ "name": "Reload", "enabled": true, "prefix": "!reload" + }, { + "name": "KeyQuest", + "enabled": false, + "prefix": "!kqf" } ], "database": { diff --git a/server/channelserver/handlers_cast_binary.go b/server/channelserver/handlers_cast_binary.go index 6910a01ae..3791ea241 100644 --- a/server/channelserver/handlers_cast_binary.go +++ b/server/channelserver/handlers_cast_binary.go @@ -1,17 +1,17 @@ package channelserver import ( + "encoding/hex" + "erupe-ce/common/byteframe" + "erupe-ce/config" + "erupe-ce/network/binpacket" + "erupe-ce/network/mhfpacket" "fmt" "math" "math/rand" "strings" "time" - "erupe-ce/common/byteframe" - "erupe-ce/config" - "erupe-ce/network/binpacket" - "erupe-ce/network/mhfpacket" - "go.uber.org/zap" ) @@ -259,6 +259,27 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { } } + if strings.HasPrefix(chatMessage.Message, commands["KeyQuest"].Prefix) { + if commands["KeyQuest"].Enabled { + if strings.HasPrefix(chatMessage.Message, "!kqf get") { + sendServerChatMessage(s, fmt.Sprintf("KQF: %x", s.kqf)) + } else if strings.HasPrefix(chatMessage.Message, "!kqf set") { + var hexs string + n, numerr := fmt.Sscanf(chatMessage.Message, "!kqf set %s", &hexs) + if numerr != nil || n != 1 || len(hexs) != 16 { + sendServerChatMessage(s, "Error in command. Format: !kqf set xxxxxxxxxxxxxxxx") + } else { + hexd, _ := hex.DecodeString(hexs) + s.kqf = hexd + s.kqfOverride = true + sendServerChatMessage(s, "KQF set, please switch Land/World") + } + } + } else { + sendDisabledCommandMessage(s, commands["KeyQuest"]) + } + } + if strings.HasPrefix(chatMessage.Message, commands["Rights"].Prefix) { // Set account rights if commands["Rights"].Enabled { diff --git a/server/channelserver/handlers_character.go b/server/channelserver/handlers_character.go index 13459bda9..b3ad40fcd 100644 --- a/server/channelserver/handlers_character.go +++ b/server/channelserver/handlers_character.go @@ -22,6 +22,7 @@ const ( pointerWeaponID = 0x1F60A // +2 pointerHRP = 0x1FDF6 // +2 pointerGRP = 0x1FDFC // +4 + pointerKQF = 0x23D20 // +8 ) type CharacterSaveData struct { @@ -41,6 +42,7 @@ type CharacterSaveData struct { WeaponID uint16 HRP uint16 GR uint16 + KQF []byte compSave []byte decompSave []byte @@ -80,9 +82,16 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) func (save *CharacterSaveData) Save(s *Session) { // We need to update the save data byte array before we save it back to the DB - save.updateSaveDataWithStruct() save.updateStructWithSaveData() + if !s.kqfOverride { + s.kqf = save.KQF + } else { + save.KQF = s.kqf + } + + save.updateSaveDataWithStruct() + err := save.Compress() if err != nil { s.logger.Error("Failed to compress savedata", zap.Error(err)) @@ -122,6 +131,7 @@ func (save *CharacterSaveData) updateSaveDataWithStruct() { rpBytes := make([]byte, 2) binary.LittleEndian.PutUint16(rpBytes, save.RP) copy(save.decompSave[pointerRP:pointerRP+2], rpBytes) + copy(save.decompSave[pointerKQF:pointerKQF+8], save.KQF) } // This will update the save struct with the values stored in the character save @@ -142,6 +152,7 @@ func (save *CharacterSaveData) updateStructWithSaveData() { save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponID : pointerWeaponID+2]) save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRP : pointerHRP+2]) save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[pointerGRP : pointerGRP+4])) + save.KQF = save.decompSave[pointerKQF : pointerKQF+8] } func handleMsgMhfSexChanger(s *Session, p mhfpacket.MHFPacket) { diff --git a/server/channelserver/sys_session.go b/server/channelserver/sys_session.go index 20fc432f8..ec122a521 100644 --- a/server/channelserver/sys_session.go +++ b/server/channelserver/sys_session.go @@ -39,6 +39,8 @@ type Session struct { sessionStart int64 rights uint32 token string + kqf []byte + kqfOverride bool semaphore *Semaphore // Required for the stateful MsgSysUnreserveStage packet.