mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
rework savedata
This commit is contained in:
@@ -235,17 +235,11 @@ func logoutPlayer(s *Session) {
|
|||||||
|
|
||||||
saveData, err := GetCharacterSaveData(s, s.charID)
|
saveData, err := GetCharacterSaveData(s, s.charID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
s.logger.Error("Failed to get savedata")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
saveData.RP += uint16(rpGained)
|
saveData.RP += uint16(rpGained)
|
||||||
transaction, err := s.server.db.Begin()
|
saveData.Save(s)
|
||||||
err = saveData.Save(s, transaction)
|
|
||||||
if err != nil {
|
|
||||||
transaction.Rollback()
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
transaction.Commit()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleMsgSysSetStatus(s *Session, p mhfpacket.MHFPacket) {}
|
func handleMsgSysSetStatus(s *Session, p mhfpacket.MHFPacket) {}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package channelserver
|
package channelserver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
||||||
"erupe-ce/network/mhfpacket"
|
"erupe-ce/network/mhfpacket"
|
||||||
@@ -10,120 +9,134 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CharacterSaveRPPointer = 0x22D16
|
pointerGender = 0x81 // +1
|
||||||
|
pointerRP = 0x22D16 // +2
|
||||||
|
pointerHouseTier = 0x1FB6C // +5
|
||||||
|
pointerHouseData = 0x1FE01 // +195
|
||||||
|
pointerBookshelfData = 0x22298 // +5576
|
||||||
|
// Gallery data also exists at 0x21578, is this the contest submission?
|
||||||
|
pointerGalleryData = 0x22320 // +1748
|
||||||
|
pointerToreData = 0x1FCB4 // +240
|
||||||
|
pointerGardenData = 0x22C58 // +68
|
||||||
|
pointerWeaponID = 0x1F60A // +2
|
||||||
|
pointerHRP = 0x1FDF6 // +2
|
||||||
|
pointerGRP = 0x1FDFC // +4
|
||||||
)
|
)
|
||||||
|
|
||||||
type CharacterSaveData struct {
|
type CharacterSaveData struct {
|
||||||
CharID uint32
|
CharID uint32
|
||||||
Name string
|
Name string
|
||||||
RP uint16
|
|
||||||
IsNewCharacter bool
|
IsNewCharacter bool
|
||||||
|
|
||||||
// Use provided setter/getter
|
Gender bool
|
||||||
baseSaveData []byte
|
RP uint16
|
||||||
|
HouseTier []byte
|
||||||
|
HouseData []byte
|
||||||
|
BookshelfData []byte
|
||||||
|
GalleryData []byte
|
||||||
|
ToreData []byte
|
||||||
|
GardenData []byte
|
||||||
|
WeaponID uint16
|
||||||
|
HRP uint16
|
||||||
|
GRP uint32
|
||||||
|
GR uint16
|
||||||
|
|
||||||
|
compSave []byte
|
||||||
|
decompSave []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) {
|
func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) {
|
||||||
result, err := s.server.db.Query("SELECT id, savedata, is_new_character, name FROM characters WHERE id = $1", charID)
|
result, err := s.server.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 retrieve save data for character", zap.Error(err), zap.Uint32("charID", charID))
|
s.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() {
|
||||||
|
s.logger.Error("No savedata found", zap.Uint32("charID", charID))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
saveData := &CharacterSaveData{}
|
saveData := &CharacterSaveData{}
|
||||||
var compressedBaseSave []byte
|
err = result.Scan(&saveData.CharID, &saveData.compSave, &saveData.IsNewCharacter, &saveData.Name)
|
||||||
|
|
||||||
if !result.Next() {
|
|
||||||
s.logger.Error("no results found for character save data", zap.Uint32("charID", charID))
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = result.Scan(&saveData.CharID, &compressedBaseSave, &saveData.IsNewCharacter, &saveData.Name)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Error(
|
s.logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID))
|
||||||
"failed to retrieve save data for character",
|
|
||||||
zap.Error(err),
|
|
||||||
zap.Uint32("charID", charID),
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if compressedBaseSave == nil {
|
if saveData.compSave == nil {
|
||||||
return saveData, nil
|
return saveData, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
decompressedBaseSave, err := nullcomp.Decompress(compressedBaseSave)
|
err = saveData.Decompress()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Error("Failed to decompress savedata from db", zap.Error(err))
|
s.logger.Error("Failed to decompress savedata", zap.Error(err))
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
saveData.SetBaseSaveData(decompressedBaseSave)
|
|
||||||
|
|
||||||
return saveData, nil
|
return saveData, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (save *CharacterSaveData) Save(s *Session, transaction *sql.Tx) error {
|
func (save *CharacterSaveData) Save(s *Session) {
|
||||||
// We need to update the save data byte array before we save it back to the DB
|
// We need to update the save data byte array before we save it back to the DB
|
||||||
save.updateSaveDataWithStruct()
|
save.updateSaveDataWithStruct()
|
||||||
|
|
||||||
compressedData, err := save.CompressedBaseData(s)
|
err := save.Compress()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
s.logger.Error("Failed to compress savedata", zap.Error(err))
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSQL := "UPDATE characters SET savedata=$1, is_new_character=$3 WHERE id=$2"
|
updateSQL := `UPDATE characters SET savedata=$1, is_new_character=$3 WHERE id=$2`
|
||||||
|
|
||||||
if transaction != nil {
|
_, err = s.server.db.Exec(updateSQL, save.compSave, save.CharID, save.IsNewCharacter)
|
||||||
_, err = transaction.Exec(updateSQL, compressedData, save.CharID, save.IsNewCharacter)
|
if err != nil {
|
||||||
} else {
|
s.logger.Error("Failed to update savedata", zap.Error(err), zap.Uint32("charID", save.CharID))
|
||||||
_, err = s.server.db.Exec(updateSQL, compressedData, save.CharID, save.IsNewCharacter)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (save *CharacterSaveData) Compress() error {
|
||||||
|
var err error
|
||||||
|
save.compSave, err = nullcomp.Compress(save.decompSave)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Error("failed to save character data", zap.Error(err), zap.Uint32("charID", save.CharID))
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (save *CharacterSaveData) CompressedBaseData(s *Session) ([]byte, error) {
|
func (save *CharacterSaveData) Decompress() error {
|
||||||
compressedData, err := nullcomp.Compress(save.baseSaveData)
|
var err error
|
||||||
|
save.decompSave, err = nullcomp.Decompress(save.compSave)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Error("failed to compress saveData", zap.Error(err), zap.Uint32("charID", save.CharID))
|
return err
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return compressedData, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (save *CharacterSaveData) BaseSaveData() []byte {
|
// This will update the character save with the values stored in the save struct
|
||||||
return save.baseSaveData
|
|
||||||
}
|
|
||||||
|
|
||||||
func (save *CharacterSaveData) SetBaseSaveData(data []byte) {
|
|
||||||
save.baseSaveData = data
|
|
||||||
// After setting the new save byte array, we can extract the values to update our struct
|
|
||||||
// This will be useful when we save it back, we use the struct values to overwrite the saveData
|
|
||||||
save.updateStructWithSaveData()
|
|
||||||
}
|
|
||||||
|
|
||||||
// This will update the save struct with the values stored in the raw savedata arrays
|
|
||||||
func (save *CharacterSaveData) updateSaveDataWithStruct() {
|
func (save *CharacterSaveData) updateSaveDataWithStruct() {
|
||||||
rpBytes := make([]byte, 2)
|
rpBytes := make([]byte, 2)
|
||||||
binary.LittleEndian.PutUint16(rpBytes, save.RP)
|
binary.LittleEndian.PutUint16(rpBytes, save.RP)
|
||||||
copy(save.baseSaveData[CharacterSaveRPPointer:CharacterSaveRPPointer+2], rpBytes)
|
copy(save.decompSave[pointerRP:pointerRP+2], rpBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This will update the character save struct with the values stored in the raw savedata arrays
|
// This will update the save struct with the values stored in the character save
|
||||||
func (save *CharacterSaveData) updateStructWithSaveData() {
|
func (save *CharacterSaveData) updateStructWithSaveData() {
|
||||||
save.RP = binary.LittleEndian.Uint16(save.baseSaveData[CharacterSaveRPPointer : CharacterSaveRPPointer+2])
|
if save.decompSave[pointerGender] == 1 {
|
||||||
|
save.Gender = true
|
||||||
|
} else {
|
||||||
|
save.Gender = false
|
||||||
|
}
|
||||||
|
save.RP = binary.LittleEndian.Uint16(save.decompSave[pointerRP : pointerRP+2])
|
||||||
|
save.HouseTier = save.decompSave[pointerHouseTier : pointerHouseTier+5]
|
||||||
|
save.HouseData = save.decompSave[pointerHouseData : pointerHouseData+195]
|
||||||
|
save.BookshelfData = save.decompSave[pointerBookshelfData : pointerBookshelfData+5576]
|
||||||
|
save.GalleryData = save.decompSave[pointerGalleryData : pointerGalleryData+1748]
|
||||||
|
save.ToreData = save.decompSave[pointerToreData : pointerToreData+240]
|
||||||
|
save.GardenData = save.decompSave[pointerGardenData : pointerGardenData+68]
|
||||||
|
save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponID : pointerWeaponID+2])
|
||||||
|
save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRP : pointerHRP+2])
|
||||||
|
save.GRP = binary.LittleEndian.Uint32(save.decompSave[pointerGRP : pointerGRP+4])
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleMsgMhfSexChanger(s *Session, p mhfpacket.MHFPacket) {
|
func handleMsgMhfSexChanger(s *Session, p mhfpacket.MHFPacket) {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package channelserver
|
package channelserver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"erupe-ce/common/stringsupport"
|
"erupe-ce/common/stringsupport"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -26,7 +25,6 @@ func handleMsgMhfSavedata(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Var to hold the decompressed savedata for updating the launcher response fields.
|
// Var to hold the decompressed savedata for updating the launcher response fields.
|
||||||
var decompressedData []byte
|
|
||||||
if pkt.SaveType == 1 {
|
if pkt.SaveType == 1 {
|
||||||
// Diff-based update.
|
// Diff-based update.
|
||||||
// diffs themselves are also potentially compressed
|
// diffs themselves are also potentially compressed
|
||||||
@@ -36,43 +34,35 @@ func handleMsgMhfSavedata(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
}
|
}
|
||||||
// Perform diff.
|
// Perform diff.
|
||||||
s.logger.Info("Diffing...")
|
s.logger.Info("Diffing...")
|
||||||
characterSaveData.SetBaseSaveData(deltacomp.ApplyDataDiff(diff, characterSaveData.BaseSaveData()))
|
characterSaveData.decompSave = deltacomp.ApplyDataDiff(diff, characterSaveData.decompSave)
|
||||||
} else {
|
} else {
|
||||||
|
dumpSaveData(s, pkt.RawDataPayload, "savedata")
|
||||||
// Regular blob update.
|
// Regular blob update.
|
||||||
saveData, err := nullcomp.Decompress(pkt.RawDataPayload)
|
saveData, err := nullcomp.Decompress(pkt.RawDataPayload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to decompress savedata from packet", zap.Error(err))
|
s.logger.Fatal("Failed to decompress savedata from packet", zap.Error(err))
|
||||||
}
|
}
|
||||||
s.logger.Info("Updating save with blob")
|
s.logger.Info("Updating save with blob")
|
||||||
characterSaveData.SetBaseSaveData(saveData)
|
characterSaveData.decompSave = saveData
|
||||||
}
|
}
|
||||||
characterSaveData.IsNewCharacter = false
|
characterSaveData.IsNewCharacter = false
|
||||||
characterBaseSaveData := characterSaveData.BaseSaveData()
|
characterSaveData.Save(s)
|
||||||
// Make a copy for updating the launcher fields.
|
|
||||||
decompressedData = make([]byte, len(characterBaseSaveData))
|
|
||||||
copy(decompressedData, characterBaseSaveData)
|
|
||||||
err = characterSaveData.Save(s, nil)
|
|
||||||
if err != nil {
|
|
||||||
s.logger.Fatal("Failed to update savedata in db", zap.Error(err))
|
|
||||||
}
|
|
||||||
s.logger.Info("Wrote recompressed savedata back to DB.")
|
s.logger.Info("Wrote recompressed savedata back to DB.")
|
||||||
dumpSaveData(s, pkt.RawDataPayload, "savedata")
|
|
||||||
|
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET weapon_type=$1 WHERE id=$2", uint16(decompressedData[128789]), s.charID)
|
_, err = s.server.db.Exec("UPDATE characters SET weapon_type=$1 WHERE id=$2", uint16(characterSaveData.decompSave[128789]), s.charID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to character weapon type in db", zap.Error(err))
|
s.logger.Fatal("Failed to character weapon type in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
s.myseries.houseTier = decompressedData[129900:129905] // 0x1FB6C + 5
|
s.myseries.houseTier = characterSaveData.HouseTier
|
||||||
s.myseries.houseData = decompressedData[130561:130756] // 0x1FE01 + 195
|
s.myseries.houseData = characterSaveData.HouseData
|
||||||
s.myseries.bookshelfData = decompressedData[139928:145504] // 0x22298 + 5576
|
s.myseries.bookshelfData = characterSaveData.BookshelfData
|
||||||
// Gallery data also exists at 0x21578, is this the contest submission?
|
s.myseries.galleryData = characterSaveData.GalleryData
|
||||||
s.myseries.galleryData = decompressedData[140064:141812] // 0x22320 + 1748
|
s.myseries.toreData = characterSaveData.ToreData
|
||||||
s.myseries.toreData = decompressedData[130228:130468] // 0x1FCB4 + 240
|
s.myseries.gardenData = characterSaveData.GardenData
|
||||||
s.myseries.gardenData = decompressedData[142424:142492] // 0x22C58 + 68
|
|
||||||
|
|
||||||
isFemale := decompressedData[81] // 0x51
|
isFemale := characterSaveData.Gender
|
||||||
if isFemale == 1 {
|
if isFemale {
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET is_female=true WHERE id=$1", s.charID)
|
_, err = s.server.db.Exec("UPDATE characters SET is_female=true WHERE id=$1", s.charID)
|
||||||
} else {
|
} else {
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET is_female=false WHERE id=$1", s.charID)
|
_, err = s.server.db.Exec("UPDATE characters SET is_female=false WHERE id=$1", s.charID)
|
||||||
@@ -81,32 +71,26 @@ func handleMsgMhfSavedata(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
s.logger.Fatal("Failed to character gender in db", zap.Error(err))
|
s.logger.Fatal("Failed to character gender in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
weaponId := binary.LittleEndian.Uint16(decompressedData[128522:128524]) // 0x1F60A
|
_, err = s.server.db.Exec("UPDATE characters SET weapon_id=$1 WHERE id=$2", characterSaveData.WeaponID, s.charID)
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET weapon_id=$1 WHERE id=$2", weaponId, s.charID)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to update character weapon id in db", zap.Error(err))
|
s.logger.Fatal("Failed to update character weapon id in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
hrp := binary.LittleEndian.Uint16(decompressedData[130550:130552]) // 0x1FDF6
|
_, err = s.server.db.Exec("UPDATE characters SET hrp=$1 WHERE id=$2", characterSaveData.HRP, s.charID)
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET hrp=$1 WHERE id=$2", hrp, s.charID)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to update character hrp in db", zap.Error(err))
|
s.logger.Fatal("Failed to update character hrp in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
grp := binary.LittleEndian.Uint32(decompressedData[130556:130560]) // 0x1FDFC
|
if characterSaveData.GRP > 0 {
|
||||||
var gr uint16
|
characterSaveData.GR = grpToGR(characterSaveData.GRP)
|
||||||
if grp > 0 {
|
|
||||||
gr = grpToGR(grp)
|
|
||||||
} else {
|
|
||||||
gr = 0
|
|
||||||
}
|
}
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET gr=$1 WHERE id=$2", gr, s.charID)
|
_, err = s.server.db.Exec("UPDATE characters SET gr=$1 WHERE id=$2", characterSaveData.GR, s.charID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to update character gr in db", zap.Error(err))
|
s.logger.Fatal("Failed to update character gr in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
characterName := s.clientContext.StrConv.MustDecode(bfutil.UpToNull(decompressedData[88:100]))
|
characterSaveData.Name = s.clientContext.StrConv.MustDecode(bfutil.UpToNull(characterSaveData.decompSave[88:100]))
|
||||||
_, err = s.server.db.Exec("UPDATE characters SET name=$1 WHERE id=$2", characterName, s.charID)
|
_, err = s.server.db.Exec("UPDATE characters SET name=$1 WHERE id=$2", characterSaveData.Name, s.charID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to update character name in db", zap.Error(err))
|
s.logger.Fatal("Failed to update character name in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
@@ -320,7 +304,7 @@ func handleMsgMhfLoaddata(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
|
|
||||||
func handleMsgMhfSaveScenarioData(s *Session, p mhfpacket.MHFPacket) {
|
func handleMsgMhfSaveScenarioData(s *Session, p mhfpacket.MHFPacket) {
|
||||||
pkt := p.(*mhfpacket.MsgMhfSaveScenarioData)
|
pkt := p.(*mhfpacket.MsgMhfSaveScenarioData)
|
||||||
_, err := s.server.db.Exec("UPDATE characters SET scenariodata = $1 WHERE characters.id = $2", pkt.RawDataPayload, int(s.charID))
|
_, err := s.server.db.Exec("UPDATE characters SET scenariodata = $1 WHERE id = $2", pkt.RawDataPayload, s.charID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to update scenario data in db", zap.Error(err))
|
s.logger.Fatal("Failed to update scenario data in db", zap.Error(err))
|
||||||
}
|
}
|
||||||
@@ -337,7 +321,7 @@ func handleMsgMhfLoadScenarioData(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
pkt := p.(*mhfpacket.MsgMhfLoadScenarioData)
|
pkt := p.(*mhfpacket.MsgMhfLoadScenarioData)
|
||||||
var scenarioData []byte
|
var scenarioData []byte
|
||||||
bf := byteframe.NewByteFrame()
|
bf := byteframe.NewByteFrame()
|
||||||
err := s.server.db.QueryRow("SELECT scenariodata FROM characters WHERE characters.id = $1", int(s.charID)).Scan(&scenarioData)
|
err := s.server.db.QueryRow("SELECT scenariodata FROM characters WHERE id = $1", s.charID).Scan(&scenarioData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Fatal("Failed to get scenario data contents in db", zap.Error(err))
|
s.logger.Fatal("Failed to get scenario data contents in db", zap.Error(err))
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -725,11 +725,7 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
rp := uint16(pkt.Data1.ReadUint32())
|
rp := uint16(pkt.Data1.ReadUint32())
|
||||||
saveData, _ := GetCharacterSaveData(s, s.charID)
|
saveData, _ := GetCharacterSaveData(s, s.charID)
|
||||||
saveData.RP -= rp
|
saveData.RP -= rp
|
||||||
transaction, err := s.server.db.Begin()
|
saveData.Save(s)
|
||||||
err = saveData.Save(s, transaction)
|
|
||||||
if err != nil {
|
|
||||||
transaction.Rollback()
|
|
||||||
}
|
|
||||||
bf.WriteUint32(uint32(saveData.RP))
|
bf.WriteUint32(uint32(saveData.RP))
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("unhandled operate guild action '%d'", pkt.Action))
|
panic(fmt.Sprintf("unhandled operate guild action '%d'", pkt.Action))
|
||||||
@@ -763,14 +759,7 @@ func handleDonateRP(s *Session, amount uint16, guild *Guild, isEvent bool) []byt
|
|||||||
return bf.Data()
|
return bf.Data()
|
||||||
}
|
}
|
||||||
saveData.RP -= amount
|
saveData.RP -= amount
|
||||||
transaction, err := s.server.db.Begin()
|
saveData.Save(s)
|
||||||
err = saveData.Save(s, transaction)
|
|
||||||
if err != nil {
|
|
||||||
transaction.Rollback()
|
|
||||||
return bf.Data()
|
|
||||||
} else {
|
|
||||||
transaction.Commit()
|
|
||||||
}
|
|
||||||
updateSQL := "UPDATE guilds SET rank_rp = rank_rp + $1 WHERE id = $2"
|
updateSQL := "UPDATE guilds SET rank_rp = rank_rp + $1 WHERE id = $2"
|
||||||
if isEvent {
|
if isEvent {
|
||||||
updateSQL = "UPDATE guilds SET event_rp = event_rp + $1 WHERE id = $2"
|
updateSQL = "UPDATE guilds SET event_rp = event_rp + $1 WHERE id = $2"
|
||||||
|
|||||||
Reference in New Issue
Block a user