character service to /internal

This commit is contained in:
stratic-dev
2024-10-18 00:14:16 +01:00
parent 094855b984
commit d5bb0ac337
7 changed files with 98 additions and 68 deletions

View File

@@ -1,18 +1,16 @@
package channelserver package service
import ( import (
"encoding/binary" "encoding/binary"
"errors" "errors"
"erupe-ce/config" "erupe-ce/config"
"erupe-ce/server/channelserver/compression/nullcomp"
"erupe-ce/utils/bfutil" "erupe-ce/utils/bfutil"
"erupe-ce/utils/db" "erupe-ce/utils/db"
"erupe-ce/utils/logger"
"erupe-ce/utils/stringsupport" "erupe-ce/utils/stringsupport"
"fmt" "fmt"
"erupe-ce/network/mhfpacket"
"erupe-ce/server/channelserver/compression/nullcomp"
"github.com/jmoiron/sqlx"
"go.uber.org/zap" "go.uber.org/zap"
) )
@@ -121,20 +119,21 @@ func getPointers() map[SavePointer]int {
return pointers return pointers
} }
func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) { func GetCharacterSaveData(charID uint32) (*CharacterSaveData, error) {
db, err := db.GetDB() db, err := db.GetDB()
logger := logger.Get()
if err != nil { if err != nil {
s.Logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err)) logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err))
} }
result, err := db.Query("SELECT id, savedata, is_new_character, name FROM characters WHERE id = $1", charID) result, err := db.Query("SELECT id, savedata, is_new_character, name FROM characters WHERE id = $1", charID)
if err != nil { if err != nil {
s.Logger.Error("Failed to get savedata", zap.Error(err), zap.Uint32("charID", charID)) logger.Error("Failed to get savedata", zap.Error(err), zap.Uint32("charID", charID))
return nil, err return nil, err
} }
defer result.Close() defer result.Close()
if !result.Next() { if !result.Next() {
err = errors.New("no savedata found") err = errors.New("no savedata found")
s.Logger.Error("No savedata found", zap.Uint32("charID", charID)) logger.Error("No savedata found", zap.Uint32("charID", charID))
return nil, err return nil, err
} }
@@ -143,7 +142,7 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error)
} }
err = result.Scan(&saveData.CharID, &saveData.compSave, &saveData.IsNewCharacter, &saveData.Name) err = result.Scan(&saveData.CharID, &saveData.compSave, &saveData.IsNewCharacter, &saveData.Name)
if err != nil { if err != nil {
s.Logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID)) logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID))
return nil, err return nil, err
} }
@@ -153,24 +152,33 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error)
err = saveData.Decompress() err = saveData.Decompress()
if err != nil { if err != nil {
s.Logger.Error("Failed to decompress savedata", zap.Error(err)) logger.Error("Failed to decompress savedata", zap.Error(err))
return nil, err return nil, err
} }
saveData.updateStructWithSaveData() saveData.UpdateStructWithSaveData()
return saveData, nil return saveData, nil
} }
func (save *CharacterSaveData) Save(s *Session) { type SessionCharacter interface {
Setkqf(data []byte)
Getkqf() []byte
GetkqfOverride() bool
GetCharID() uint32
}
func (save *CharacterSaveData) Save(s SessionCharacter) {
db, err := db.GetDB() db, err := db.GetDB()
logger := logger.Get()
if err != nil { if err != nil {
s.Logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err)) logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err))
} }
if !s.kqfOverride { if !s.GetkqfOverride() {
s.kqf = save.KQF s.Setkqf(save.KQF)
} else { } else {
save.KQF = s.kqf save.KQF = s.Getkqf()
} }
save.updateSaveDataWithStruct() save.updateSaveDataWithStruct()
@@ -178,7 +186,7 @@ func (save *CharacterSaveData) Save(s *Session) {
if config.GetConfig().ClientID >= config.G1 { if config.GetConfig().ClientID >= config.G1 {
err := save.Compress() err := save.Compress()
if err != nil { if err != nil {
s.Logger.Error("Failed to compress savedata", zap.Error(err)) logger.Error("Failed to compress savedata", zap.Error(err))
return return
} }
} else { } else {
@@ -189,11 +197,11 @@ func (save *CharacterSaveData) Save(s *Session) {
_, err = db.Exec(`UPDATE characters SET savedata=$1, is_new_character=false, hr=$2, gr=$3, is_female=$4, weapon_type=$5, weapon_id=$6 WHERE id=$7 _, err = db.Exec(`UPDATE characters SET savedata=$1, is_new_character=false, hr=$2, gr=$3, is_female=$4, weapon_type=$5, weapon_id=$6 WHERE id=$7
`, save.compSave, save.HR, save.GR, save.Gender, save.WeaponType, save.WeaponID, save.CharID) `, save.compSave, save.HR, save.GR, save.Gender, save.WeaponType, save.WeaponID, save.CharID)
if err != nil { if err != nil {
s.Logger.Error("Failed to update savedata", zap.Error(err), zap.Uint32("charID", save.CharID)) logger.Error("Failed to update savedata", zap.Error(err), zap.Uint32("charID", save.CharID))
} }
db.Exec(`UPDATE user_binary SET house_tier=$1, house_data=$2, bookshelf=$3, gallery=$4, tore=$5, garden=$6 WHERE id=$7 db.Exec(`UPDATE user_binary SET house_tier=$1, house_data=$2, bookshelf=$3, gallery=$4, tore=$5, garden=$6 WHERE id=$7
`, save.HouseTier, save.HouseData, save.BookshelfData, save.GalleryData, save.ToreData, save.GardenData, s.CharID) `, save.HouseTier, save.HouseData, save.BookshelfData, save.GalleryData, save.ToreData, save.GardenData, s.GetCharID())
} }
func (save *CharacterSaveData) Compress() error { func (save *CharacterSaveData) Compress() error {
@@ -227,7 +235,7 @@ func (save *CharacterSaveData) updateSaveDataWithStruct() {
} }
// This will update the save struct with the values stored in the character save // This will update the save struct with the values stored in the character save
func (save *CharacterSaveData) updateStructWithSaveData() { func (save *CharacterSaveData) UpdateStructWithSaveData() {
save.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(save.decompSave[88:100])) save.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(save.decompSave[88:100]))
if save.decompSave[save.Pointers[pGender]] == 1 { if save.decompSave[save.Pointers[pGender]] == 1 {
save.Gender = true save.Gender = true
@@ -258,8 +266,45 @@ func (save *CharacterSaveData) updateStructWithSaveData() {
} }
return return
} }
func grpToGR(n int) uint16 {
var gr int
a := []int{208750, 593400, 993400, 1400900, 2315900, 3340900, 4505900, 5850900, 7415900, 9230900, 11345900, 100000000}
b := []int{7850, 8000, 8150, 9150, 10250, 11650, 13450, 15650, 18150, 21150, 23950}
c := []int{51, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900}
func handleMsgMhfSexChanger(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { for i := 0; i < len(a); i++ {
pkt := p.(*mhfpacket.MsgMhfSexChanger) if n < a[i] {
s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4)) if i == 0 {
for {
n -= 500
if n <= 500 {
if n < 0 {
i--
}
break
} else {
i++
for j := 0; j < i; j++ {
n -= 150
}
}
}
gr = i + 2
} else {
n -= a[i-1]
gr = c[i-1]
gr += n / b[i-1]
}
break
}
}
return uint16(gr)
}
func (save *CharacterSaveData) GetDecompSave() []byte {
return save.decompSave
}
func (save *CharacterSaveData) SetDecompSave(decompSave []byte) {
save.decompSave = decompSave
} }

View File

@@ -4,6 +4,7 @@ import (
"encoding/binary" "encoding/binary"
"erupe-ce/config" "erupe-ce/config"
"erupe-ce/internal/model" "erupe-ce/internal/model"
"erupe-ce/internal/service"
"erupe-ce/internal/system" "erupe-ce/internal/system"
"erupe-ce/utils/db" "erupe-ce/utils/db"
"erupe-ce/utils/gametime" "erupe-ce/utils/gametime"
@@ -221,7 +222,7 @@ func logoutPlayer(s *Session) {
removeSessionFromSemaphore(s) removeSessionFromSemaphore(s)
removeSessionFromStage(s) removeSessionFromStage(s)
saveData, err := GetCharacterSaveData(s, s.CharID) saveData, err := service.GetCharacterSaveData(s.CharID)
if err != nil || saveData == nil { if err != nil || saveData == nil {
s.Logger.Error("Failed to get savedata") s.Logger.Error("Failed to get savedata")
return return

View File

@@ -12,6 +12,7 @@ import (
"path/filepath" "path/filepath"
"time" "time"
"erupe-ce/internal/service"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
"erupe-ce/server/channelserver/compression/deltacomp" "erupe-ce/server/channelserver/compression/deltacomp"
"erupe-ce/server/channelserver/compression/nullcomp" "erupe-ce/server/channelserver/compression/nullcomp"
@@ -24,7 +25,7 @@ import (
func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfSavedata) pkt := p.(*mhfpacket.MsgMhfSavedata)
characterSaveData, err := GetCharacterSaveData(s, s.CharID) characterSaveData, err := service.GetCharacterSaveData(s.GetCharID())
if err != nil { if err != nil {
s.Logger.Error("failed to retrieve character save data from db", zap.Error(err), zap.Uint32("charID", s.CharID)) s.Logger.Error("failed to retrieve character save data from db", zap.Error(err), zap.Uint32("charID", s.CharID))
return return
@@ -41,7 +42,7 @@ func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) {
} }
// Perform diff. // Perform diff.
s.Logger.Info("Diffing...") s.Logger.Info("Diffing...")
characterSaveData.decompSave = deltacomp.ApplyDataDiff(diff, characterSaveData.decompSave) characterSaveData.SetDecompSave(deltacomp.ApplyDataDiff(diff, characterSaveData.GetDecompSave()))
} else { } else {
dumpSaveData(s, pkt.RawDataPayload, "savedata") dumpSaveData(s, pkt.RawDataPayload, "savedata")
// Regular blob update. // Regular blob update.
@@ -55,9 +56,9 @@ func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) {
dumpSaveData(s, saveData, "raw-savedata") dumpSaveData(s, saveData, "raw-savedata")
} }
s.Logger.Info("Updating save with blob") s.Logger.Info("Updating save with blob")
characterSaveData.decompSave = saveData characterSaveData.SetDecompSave(saveData)
} }
characterSaveData.updateStructWithSaveData() characterSaveData.UpdateStructWithSaveData()
// Bypass name-checker if new // Bypass name-checker if new
if characterSaveData.IsNewCharacter == true { if characterSaveData.IsNewCharacter == true {
@@ -81,40 +82,9 @@ func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) {
} }
s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4)) s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4))
} }
func handleMsgMhfSexChanger(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) {
func grpToGR(n int) uint16 { pkt := p.(*mhfpacket.MsgMhfSexChanger)
var gr int s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4))
a := []int{208750, 593400, 993400, 1400900, 2315900, 3340900, 4505900, 5850900, 7415900, 9230900, 11345900, 100000000}
b := []int{7850, 8000, 8150, 9150, 10250, 11650, 13450, 15650, 18150, 21150, 23950}
c := []int{51, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900}
for i := 0; i < len(a); i++ {
if n < a[i] {
if i == 0 {
for {
n -= 500
if n <= 500 {
if n < 0 {
i--
}
break
} else {
i++
for j := 0; j < i; j++ {
n -= 150
}
}
}
gr = i + 2
} else {
n -= a[i-1]
gr = c[i-1]
gr += n / b[i-1]
}
break
}
}
return uint16(gr)
} }
func dumpSaveData(s *Session, data []byte, suffix string) { func dumpSaveData(s *Session, data []byte, suffix string) {

View File

@@ -3,6 +3,7 @@ package channelserver
import ( import (
"erupe-ce/config" "erupe-ce/config"
"erupe-ce/internal/model" "erupe-ce/internal/model"
"erupe-ce/internal/service"
"erupe-ce/network/mhfpacket" "erupe-ce/network/mhfpacket"
"erupe-ce/utils/byteframe" "erupe-ce/utils/byteframe"
"erupe-ce/utils/db" "erupe-ce/utils/db"
@@ -161,7 +162,7 @@ func handleMsgMhfAcquireDistItem(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket)
case 21: case 21:
db.Exec("UPDATE users u SET frontier_points=frontier_points+$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", item.Quantity, s.CharID) db.Exec("UPDATE users u SET frontier_points=frontier_points+$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", item.Quantity, s.CharID)
case 23: case 23:
saveData, err := GetCharacterSaveData(s, s.CharID) saveData, err := service.GetCharacterSaveData(s.CharID)
if err == nil { if err == nil {
saveData.RP += uint16(item.Quantity) saveData.RP += uint16(item.Quantity)
saveData.Save(s) saveData.Save(s)

View File

@@ -215,7 +215,7 @@ func handleDonateRP(s *Session, amount uint16, guild *service.Guild, _type int)
} }
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
bf.WriteUint32(0) bf.WriteUint32(0)
saveData, err := GetCharacterSaveData(s, s.CharID) saveData, err := service.GetCharacterSaveData(s.CharID)
if err != nil { if err != nil {
return bf.Data() return bf.Data()
} }

View File

@@ -3,6 +3,7 @@ package channelserver
import ( import (
"erupe-ce/config" "erupe-ce/config"
"erupe-ce/internal/model" "erupe-ce/internal/model"
"erupe-ce/internal/service"
"fmt" "fmt"
"strings" "strings"
@@ -284,7 +285,7 @@ func handleMsgMhfPostTenrouirai(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket)
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
sd, err := GetCharacterSaveData(s, s.CharID) sd, err := service.GetCharacterSaveData(s.CharID)
if err == nil && sd != nil { if err == nil && sd != nil {
sd.RP -= pkt.DonatedRP sd.RP -= pkt.DonatedRP
sd.Save(s) sd.Save(s)

View File

@@ -373,8 +373,20 @@ func (s *Session) DoAckSimpleFail(ackHandle uint32, data []byte) {
}) })
} }
func (s *Session) GetCharID() uint32 { func (s *Session) GetCharID() uint32 {
return s.CharID // Assuming `Session` has a field `CharID` return s.CharID
} }
func (s *Session) GetName() string { func (s *Session) GetName() string {
return s.Name // Assuming `Session` has a field `CharID` return s.Name
}
func (s *Session) Getkqf() []byte {
return s.kqf
}
func (s *Session) GetkqfOverride() bool {
return s.kqfOverride
}
func (s *Session) Setkqf(kqf []byte) {
s.kqf = kqf
} }