From 3788819b5cbd91d0942cce31a26f671d458a01a4 Mon Sep 17 00:00:00 2001 From: wishu Date: Wed, 8 Jun 2022 10:00:12 +1000 Subject: [PATCH] stage and semaphore overhaul partial --- .../mhfpacket/msg_mhf_transit_message.go | 21 +- Erupe/server/channelserver/handlers.go | 38 +- .../server/channelserver/handlers_register.go | 1929 ++--------------- .../channelserver/handlers_semaphore.go | 98 +- Erupe/server/channelserver/handlers_stage.go | 144 +- .../channelserver/sys_channel_server.go | 57 + 6 files changed, 461 insertions(+), 1826 deletions(-) diff --git a/Erupe/network/mhfpacket/msg_mhf_transit_message.go b/Erupe/network/mhfpacket/msg_mhf_transit_message.go index da8f0dcaf..ec2724f64 100644 --- a/Erupe/network/mhfpacket/msg_mhf_transit_message.go +++ b/Erupe/network/mhfpacket/msg_mhf_transit_message.go @@ -1,7 +1,7 @@ package mhfpacket -import ( - "errors" +import ( + "errors" "github.com/Solenataris/Erupe/network/clientctx" "github.com/Solenataris/Erupe/network" @@ -9,7 +9,14 @@ import ( ) // MsgMhfTransitMessage represents the MSG_MHF_TRANSIT_MESSAGE -type MsgMhfTransitMessage struct{} +type MsgMhfTransitMessage struct { + AckHandle uint32 + Unk0 uint8 + Unk1 uint8 + Unk2 uint16 + Unk3 uint16 + TargetID uint32 +} // Opcode returns the ID associated with this packet type. func (m *MsgMhfTransitMessage) Opcode() network.PacketID { @@ -18,7 +25,13 @@ func (m *MsgMhfTransitMessage) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfTransitMessage) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { - return errors.New("NOT IMPLEMENTED") + m.AckHandle = bf.ReadUint32() + m.Unk0 = bf.ReadUint8() + m.Unk1 = bf.ReadUint8() + m.Unk2 = bf.ReadUint16() + m.Unk3 = bf.ReadUint16() + m.TargetID = bf.ReadUint32() + return nil } // Build builds a binary packet from the current data. diff --git a/Erupe/server/channelserver/handlers.go b/Erupe/server/channelserver/handlers.go index 4005a2e9b..ed9b789ac 100644 --- a/Erupe/server/channelserver/handlers.go +++ b/Erupe/server/channelserver/handlers.go @@ -183,13 +183,12 @@ func logoutPlayer(s *Session) { return } - s.stage.RLock() - for client := range s.stage.clients { - client.QueueSendMHF(&mhfpacket.MsgSysDeleteUser{ - CharID: s.charID, - }) - } - s.stage.RUnlock() + s.server.BroadcastMHF(&mhfpacket.MsgSysDeleteUser { + CharID: s.charID, + }, s) + + delete(s.server.sessions, s.rawConn) + s.rawConn.Close() if s.server.erupeConfig.DevModeOptions.ServerName != "" { _, err := s.server.db.Exec("UPDATE servers SET current_players=$1 WHERE server_name=$2", uint32(len(s.server.sessions)), s.server.erupeConfig.DevModeOptions.ServerName) @@ -198,13 +197,16 @@ func logoutPlayer(s *Session) { } } - removeSessionFromStage(s) - - if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { - if _, ok := s.server.semaphore["hs_l0u3B51J9k3"].reservedClientSlots[s.charID]; ok { - removeSessionFromSemaphore(s) - } + s.server.Lock() + for _, stage := range s.server.stages { + if _, exists := stage.reservedClientSlots[s.charID]; exists { + delete(stage.reservedClientSlots, s.charID) + } } + s.server.Unlock() + + removeSessionFromSemaphore(s) + removeSessionFromStage(s) var timePlayed int err := s.server.db.QueryRow("SELECT time_played FROM characters WHERE id = $1", s.charID).Scan(&timePlayed) @@ -213,7 +215,7 @@ func logoutPlayer(s *Session) { var rpGained int - if s.rights == 0x08091e4e || s.rights == 0x08091e0e { // N Course + if s.rights > 0x40000000 { // N Course rpGained = timePlayed / 900 timePlayed = timePlayed % 900 } else { @@ -326,7 +328,13 @@ func handleMsgSysRightsReload(s *Session, p mhfpacket.MHFPacket) { doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) } -func handleMsgMhfTransitMessage(s *Session, p mhfpacket.MHFPacket) {} +func handleMsgMhfTransitMessage(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfTransitMessage) + // TODO: figure out what this is supposed to return + // probably what world+land the targeted character is on? + // stubbed response will just say user not found + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 4)) +} func handleMsgCaExchangeItem(s *Session, p mhfpacket.MHFPacket) {} diff --git a/Erupe/server/channelserver/handlers_register.go b/Erupe/server/channelserver/handlers_register.go index 6b19d55cc..c8400a1ea 100644 --- a/Erupe/server/channelserver/handlers_register.go +++ b/Erupe/server/channelserver/handlers_register.go @@ -1,237 +1,128 @@ package channelserver import ( - "encoding/hex" - "encoding/binary" "github.com/Andoryuuta/byteframe" "github.com/Solenataris/Erupe/network/mhfpacket" ) -func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { // RAVIENTE USE THIS - // RAVI EVENT +func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysOperateRegister) - var RefID uint8 - var Phase1HP, Phase2HP, Phase3HP, Phase4HP, Phase5HP, Phase6HP, Phase7HP, Phase8HP, Phase9HP, Unknown1, Unknown2, Unknown3, Unknown4, Unknown5, Unknown6, Unknown7, Unknown8, Unknown9, Unknown10, Unknown11, Unknown12, Unknown13, Unknown14, Unknown15, Unknown16, Unknown17, Unknown18, Unknown19, Unknown20 uint32 - var DamageMultiplier uint32 - - var NextRavi, RaviStarted, RaviPostTime, RaviType, MaxPlayers, RaviKilled, CarveQuest, Register1, Register2, Register3, Register4, Register5 uint32 - - var Support1, Support2, Support3, Support4, Support5, Support6, Support7, Support8, Support9, Support10, Support11, Support12, Support13, Support14, Support15, Support16, Support17, Support18, Support19, Support20, Support21, Support22, Support23, Support24, Support25 uint32 - raviState, err := s.server.db.Query("SELECT refid, phase1hp, phase2hp, phase3hp, phase4hp, phase5hp, phase6hp, phase7hp, phase8hp, phase9hp, unknown1, unknown2, unknown3, unknown4, unknown5, unknown6, unknown7, unknown8, unknown9, unknown10, unknown11, unknown12, unknown13, unknown14, unknown15, unknown16, unknown17, unknown18, unknown19, unknown20, damagemultiplier FROM ravistate WHERE RefID=$1", 29) - if err != nil { - panic(err) - } - for raviState.Next() { - err = raviState.Scan(&RefID, &Phase1HP, &Phase2HP, &Phase3HP, &Phase4HP, &Phase5HP, &Phase6HP, &Phase7HP, &Phase8HP, &Phase9HP, &Unknown1, &Unknown2, &Unknown3, &Unknown4, &Unknown5, &Unknown6, &Unknown7, &Unknown8, &Unknown9, &Unknown10, &Unknown11, &Unknown12, &Unknown13, &Unknown14, &Unknown15, &Unknown16, &Unknown17, &Unknown18, &Unknown19, &Unknown20, &DamageMultiplier) - if err != nil { - panic("Error in ravistate") - } - } - raviRegister, err := s.server.db.Query("SELECT refid, nextravi, ravistarted, raviposttime, ravitype, maxplayers, ravikilled, carvequest, register1, register2, register3, register4, register5 FROM raviregister WHERE RefID=$1", 12) - if err != nil { - panic(err) - } - for raviRegister.Next() { - err = raviRegister.Scan(&RefID, &NextRavi, &RaviStarted, &RaviPostTime, &RaviType, &MaxPlayers, &RaviKilled, &CarveQuest, &Register1, &Register2, &Register3, &Register4, &Register5) - if err != nil { - panic("Error in raviregister") - } - } - raviSupport, err := s.server.db.Query("SELECT refid, support1, support2, support3, support4, support5, support6, support7, support8, support9, support10, support11, support12, support13, support14, support15, support16, support17, support18, support19, support20, support21, support22, support23, support24, support25 FROM ravisupport WHERE RefID=$1", 25) - if err != nil { - panic(err) - } - for raviSupport.Next() { - err = raviSupport.Scan(&RefID, &Support1, &Support2, &Support3, &Support4, &Support5, &Support6, &Support7, &Support8, &Support9, &Support10, &Support11, &Support12, &Support13, &Support14, &Support15, &Support16, &Support17, &Support18, &Support19, &Support20, &Support21, &Support22, &Support23, &Support24, &Support25) - if err != nil { - panic("Error in ravisupport") - } - } - + bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload) + s.server.raviente.Lock() switch pkt.RegisterID { - case 786461: resp := byteframe.NewByteFrame() size := 6 - var j int - for i := 0; i < len(pkt.RawDataPayload)-1; i += size { - j += size - if j > len(pkt.RawDataPayload) { - j = len(pkt.RawDataPayload) - } - AddData := binary.BigEndian.Uint32(pkt.RawDataPayload[i+2:j]) + for i := 0; i < len(bf.Data())-1; i += size { + op := bf.ReadUint8() + dest := bf.ReadUint8() + data := bf.ReadUint32() resp.WriteUint8(1) - resp.WriteUint8(pkt.RawDataPayload[i+1]) - switch pkt.RawDataPayload[i+1] { + resp.WriteUint8(dest) + switch dest { case 0: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET nextravi = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.nextTime = data case 1: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET ravistarted = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.startTime = data case 2: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET ravikilled = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.killedTime = data case 3: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET raviposttime = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.postTime = data case 4: - switch pkt.RawDataPayload[i] { + ref := &s.server.raviente.register.register[0] + switch op { case 2: - resp.WriteUint32(Register1) - resp.WriteUint32(Register1 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE raviregister SET register1 = $1 WHERE refid = $2", Register1 + uint32(AddData), 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(*ref) + resp.WriteUint32(*ref + uint32(data)) + *ref += data case 13: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register1 = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + *ref = data case 14: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register1 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) } case 5: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET carvequest = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.carveQuest = data case 6: - switch pkt.RawDataPayload[i] { + ref := &s.server.raviente.register.register[1] + switch op { case 2: - resp.WriteUint32(Register2) - resp.WriteUint32(Register2 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE raviregister SET register2 = $1 WHERE refid = $2", Register2 + uint32(AddData), 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(*ref) + resp.WriteUint32(*ref + uint32(data)) + *ref += data case 13: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register2 = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + *ref = data case 14: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register2 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) } case 7: - switch pkt.RawDataPayload[i] { + ref := &s.server.raviente.register.register[2] + switch op { case 2: - resp.WriteUint32(Register3) - resp.WriteUint32(Register3 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE raviregister SET register3 = $1 WHERE refid = $2", Register3 + uint32(AddData), 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(*ref) + resp.WriteUint32(*ref + uint32(data)) + *ref += data case 13: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register3 = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + *ref = data case 14: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register3 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) } case 8: - switch pkt.RawDataPayload[i] { + ref := &s.server.raviente.register.register[3] + switch op { case 2: - resp.WriteUint32(Register4) - resp.WriteUint32(Register4 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE raviregister SET register4 = $1 WHERE refid = $2", Register4 + uint32(AddData), 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(*ref) + resp.WriteUint32(*ref + uint32(data)) + *ref += data case 13: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register4 = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + *ref = data case 14: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register4 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) } case 9: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET maxplayers = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.maxPlayers = data case 10: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET ravitype = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + s.server.raviente.register.ravienteType = data case 11: - switch pkt.RawDataPayload[i] { + ref := &s.server.raviente.register.register[4] + switch op { case 2: - resp.WriteUint32(Register5) - resp.WriteUint32(Register5 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE raviregister SET register5 = $1 WHERE refid = $2", Register5 + uint32(AddData), 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(*ref) + resp.WriteUint32(*ref + uint32(data)) + *ref += data case 13: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register5 = $1 WHERE refid = $2", AddData, 12) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) + *ref = data case 14: resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE raviregister SET register5 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update raviregister in db") - } + resp.WriteUint32(data) } default: resp.WriteUint32(0) @@ -240,1594 +131,204 @@ func handleMsgSysOperateRegister(s *Session, p mhfpacket.MHFPacket) { // RAVIENT } resp.WriteUint8(0) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - s.notifyplayer() - - case 917533: resp := byteframe.NewByteFrame() size := 6 - var j int - for i := 0; i < len(pkt.RawDataPayload)-1; i += size { - j += size - if j > len(pkt.RawDataPayload) { - j = len(pkt.RawDataPayload) - } - AddData := binary.BigEndian.Uint32(pkt.RawDataPayload[i+2:j]) + for i := 0; i < len(bf.Data())-1; i += size { + op := bf.ReadUint8() + dest := bf.ReadUint8() + data := bf.ReadUint32() resp.WriteUint8(1) - resp.WriteUint8(pkt.RawDataPayload[i+1]) - switch pkt.RawDataPayload[i+1] { - case 0: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase1HP) - resp.WriteUint32(Phase1HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase1HP = $1 WHERE refid = $2", Phase1HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase1HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase1HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } + resp.WriteUint8(dest) + ref := &s.server.raviente.state.stateData[dest] + damageMultiplier := s.server.raviente.state.damageMultiplier + switch op { + case 2: + resp.WriteUint32(*ref) + if dest == 28 { // Berserk resurrection tracker + resp.WriteUint32(*ref + data) + *ref += data + } else if dest == 17 { // Berserk poison tracker + if damageMultiplier == 1 { + resp.WriteUint32(*ref + data) + } else { + resp.WriteUint32(*ref + data) + *ref += data } - - case 1: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase2HP) - resp.WriteUint32(Phase2HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase2HP = $1 WHERE refid = $2", Phase2HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase2HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase2HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 2: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase3HP) - resp.WriteUint32(Phase3HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase3HP = $1 WHERE refid = $2", Phase3HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase3HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase3HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 3: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase4HP) - resp.WriteUint32(Phase4HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase4HP = $1 WHERE refid = $2", Phase4HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase4HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase4HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 4: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase5HP) - resp.WriteUint32(Phase5HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase5HP = $1 WHERE refid = $2", Phase5HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase5HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase5HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 5: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase6HP) - resp.WriteUint32(Phase6HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase6HP = $1 WHERE refid = $2", Phase6HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase6HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase6HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 6: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase7HP) - resp.WriteUint32(Phase7HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase7HP = $1 WHERE refid = $2", Phase7HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase7HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase7HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 7: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase8HP) - resp.WriteUint32(Phase8HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase8HP = $1 WHERE refid = $2", Phase8HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase8HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase8HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 8: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Phase9HP) - resp.WriteUint32(Phase9HP + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase9HP = $1 WHERE refid = $2", Phase9HP + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase9HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Phase9HP = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 9: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown1) - resp.WriteUint32(Unknown1 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown1 = $1 WHERE refid = $2", Unknown1 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown1 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown1 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 10: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown2) - resp.WriteUint32(Unknown2 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown2 = $1 WHERE refid = $2", Unknown2 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown2 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown2 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 11: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown3) - resp.WriteUint32(Unknown3 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown3 = $1 WHERE refid = $2", Unknown3 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown3 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown3 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 12: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown4) - resp.WriteUint32(Unknown4 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown4 = $1 WHERE refid = $2", Unknown4 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown4 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown4 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 13: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown5) - resp.WriteUint32(Unknown5 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown5 = $1 WHERE refid = $2", Unknown5 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown5 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown5 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 14: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown6) - resp.WriteUint32(Unknown6 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown6 = $1 WHERE refid = $2", Unknown6 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown6 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown6 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 15: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown7) - resp.WriteUint32(Unknown7 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown7 = $1 WHERE refid = $2", Unknown7 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown7 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown7 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 16: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown8) - resp.WriteUint32(Unknown8 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown8 = $1 WHERE refid = $2", Unknown8 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown8 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown8 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 17: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown9) - resp.WriteUint32(Unknown9 + (uint32(AddData) * DamageMultiplier)) - if DamageMultiplier == 1 { - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown9 = $1 WHERE refid = $2", Unknown9 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown9 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown9 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 18: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown10) - resp.WriteUint32(Unknown10 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown10 = $1 WHERE refid = $2", Unknown10 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown10 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown10 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 19: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown11) - resp.WriteUint32(Unknown11 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown11 = $1 WHERE refid = $2", Unknown11 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown11 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown11 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 20: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown12) - resp.WriteUint32(Unknown12 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown12 = $1 WHERE refid = $2", Unknown12 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown12 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown12 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 21: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown13) - resp.WriteUint32(Unknown13 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown13 = $1 WHERE refid = $2", Unknown13 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown13 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown13 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 22: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown14) - resp.WriteUint32(Unknown14 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown14 = $1 WHERE refid = $2", Unknown14 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown14 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown14 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 23: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown15) - resp.WriteUint32(Unknown15 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown15 = $1 WHERE refid = $2", Unknown15 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown15 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown15 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 24: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown16) - resp.WriteUint32(Unknown16 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown16 = $1 WHERE refid = $2", Unknown16 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown16 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown16 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 25: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown17) - resp.WriteUint32(Unknown17 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown17 = $1 WHERE refid = $2", Unknown17 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown17 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown17 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 26: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown18) - resp.WriteUint32(Unknown18 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown18 = $1 WHERE refid = $2", Unknown18 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown18 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown18 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 27: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown19) - resp.WriteUint32(Unknown19 + (uint32(AddData) * DamageMultiplier)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown19 = $1 WHERE refid = $2", Unknown19 + (uint32(AddData) * DamageMultiplier), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown19 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown19 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - case 28: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Unknown20) - resp.WriteUint32(Unknown20 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown20 = $1 WHERE refid = $2", Unknown20 + uint32(AddData), 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown20 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravistate SET Unknown20 = $1 WHERE refid = $2", AddData, 29) - if err != nil { - s.logger.Fatal("Failed to update ravistate in db") - } - } - - default: - resp.WriteUint32(0) - resp.WriteUint32(0) + } else { + resp.WriteUint32(*ref + data * damageMultiplier) + *ref += data * damageMultiplier } + case 13: + fallthrough + case 14: + resp.WriteUint32(0) + resp.WriteUint32(data) + *ref = data } - + } resp.WriteUint8(0) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - s.notifyplayer() - - case 851997: resp := byteframe.NewByteFrame() size := 6 - var j int - for i := 0; i < len(pkt.RawDataPayload)-1; i += size { - j += size - if j > len(pkt.RawDataPayload) { - j = len(pkt.RawDataPayload) - } - AddData := binary.BigEndian.Uint32(pkt.RawDataPayload[i+2:j]) + for i := 0; i < len(bf.Data())-1; i += size { + op := bf.ReadUint8() + dest := bf.ReadUint8() + data := bf.ReadUint32() resp.WriteUint8(1) - resp.WriteUint8(pkt.RawDataPayload[i+1]) - switch pkt.RawDataPayload[i+1] { - case 0: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support1) - resp.WriteUint32(Support1 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support1 = $1 WHERE refid = $2", Support1 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support1 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support1 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 1: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support2) - resp.WriteUint32(Support2 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support2 = $1 WHERE refid = $2", Support2 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support2 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support2 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 2: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support3) - resp.WriteUint32(Support3 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support3 = $1 WHERE refid = $2", Support3 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support3 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support3 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 3: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support4) - resp.WriteUint32(Support4 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support4 = $1 WHERE refid = $2", Support4 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support4 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support4 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 4: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support5) - resp.WriteUint32(Support5 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support5 = $1 WHERE refid = $2", Support5 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support5 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support5 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 5: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support6) - resp.WriteUint32(Support6 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support6 = $1 WHERE refid = $2", Support6 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support6 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support6 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 6: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support7) - resp.WriteUint32(Support7 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support7 = $1 WHERE refid = $2", Support7 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support7 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support7 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 7: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support8) - resp.WriteUint32(Support8 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support8 = $1 WHERE refid = $2", Support8 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support8 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support8 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 8: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support9) - resp.WriteUint32(Support9 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support9 = $1 WHERE refid = $2", Support9 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support9 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support9 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 9: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support10) - resp.WriteUint32(Support10 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support10 = $1 WHERE refid = $2", Support10 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support10 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support10 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 10: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support11) - resp.WriteUint32(Support11 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support11 = $1 WHERE refid = $2", Support11 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support11 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support11 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 11: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support12) - resp.WriteUint32(Support12 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support12 = $1 WHERE refid = $2", Support12 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support12 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support12 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 12: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support13) - resp.WriteUint32(Support13 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support13 = $1 WHERE refid = $2", Support13 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support13 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support13 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 13: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support14) - resp.WriteUint32(Support14 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support14 = $1 WHERE refid = $2", Support14 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support14 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support14 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 14: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support15) - resp.WriteUint32(Support15 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support15 = $1 WHERE refid = $2", Support15 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support15 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support15 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 15: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support16) - resp.WriteUint32(Support16 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support16 = $1 WHERE refid = $2", Support16 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support16 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support16 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 16: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support17) - resp.WriteUint32(Support17 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support17 = $1 WHERE refid = $2", Support17 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support17 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support17 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 17: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support18) - resp.WriteUint32(Support18 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support18 = $1 WHERE refid = $2", Support18 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support18 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support18 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 18: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support19) - resp.WriteUint32(Support19 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support19 = $1 WHERE refid = $2", Support19 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support19 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support19 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 19: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support20) - resp.WriteUint32(Support20 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support20 = $1 WHERE refid = $2", Support20 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support20 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support20 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 20: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support21) - resp.WriteUint32(Support21 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support21 = $1 WHERE refid = $2", Support21 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support21 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support21 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 21: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support22) - resp.WriteUint32(Support22 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support22 = $1 WHERE refid = $2", Support22 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support22 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support22 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 22: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support23) - resp.WriteUint32(Support23 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support23 = $1 WHERE refid = $2", Support23 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support23 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support23 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 23: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support24) - resp.WriteUint32(Support24 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support24 = $1 WHERE refid = $2", Support24 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support24 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support24 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - case 24: - switch pkt.RawDataPayload[i] { - case 2: - resp.WriteUint32(Support25) - resp.WriteUint32(Support25 + uint32(AddData)) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support25 = $1 WHERE refid = $2", Support25 + uint32(AddData), 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 13: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support25 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - case 14: - resp.WriteUint32(0) - resp.WriteUint32(AddData) - _, err = s.server.db.Exec("UPDATE ravisupport SET Support25 = $1 WHERE refid = $2", AddData, 25) - if err != nil { - s.logger.Fatal("Failed to update ravisupport in db") - } - } - - default: - resp.WriteUint32(0) - resp.WriteUint32(0) - - + resp.WriteUint8(dest) + ref := &s.server.raviente.support.supportData[dest] + switch op { + case 2: + resp.WriteUint32(*ref) + resp.WriteUint32(*ref + data) + *ref += data + case 13: + fallthrough + case 14: + resp.WriteUint32(0) + resp.WriteUint32(data) + *ref = data } } resp.WriteUint8(0) doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - s.notifyplayer() - - } + s.notifyall() + s.server.raviente.Unlock() } func handleMsgSysLoadRegister(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysLoadRegister) - - // ORION TEMPORARY DISABLE (IN WORK) - // ravi response r := pkt.Unk1 switch r { - case 12: - var count int - - err := s.server.db.QueryRow("SELECT COUNT(*) FROM raviregister").Scan(&count) - switch { - case err != nil: - panic(err) - default: - if count == 0 { - s.server.db.Exec("CALL raviinit()") + case 12: + if pkt.RegisterID == 983077 { + data, _ := hex.DecodeString("000C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + doAckBufFail(s, pkt.AckHandle, data) + } else if pkt.RegisterID == 983069 { + data, _ := hex.DecodeString("000C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + doAckBufFail(s, pkt.AckHandle, data) } - } - if pkt.RegisterID == 983077 { - data, _ := hex.DecodeString("000C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - doAckBufFail(s, pkt.AckHandle, data) - } else if pkt.RegisterID == 983069 { - data, _ := hex.DecodeString("000C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - doAckBufFail(s, pkt.AckHandle, data) - } - raviRegister, err := s.server.db.Query("SELECT refid, nextravi, ravistarted, raviposttime, ravitype, maxplayers, ravikilled, carvequest, register1, register2, register3, register4, register5 FROM raviregister WHERE RefID=$1", pkt.Unk1) - if err != nil { - panic(err) - } - var RefID uint8 - var NextRavi, RaviStarted, RaviPostTime, RaviType, MaxPlayers, RaviKilled, CarveQuest, Register1, Register2, Register3, Register4, Register5 uint32 - resp := byteframe.NewByteFrame() - for raviRegister.Next() { - err = raviRegister.Scan(&RefID, &NextRavi, &RaviStarted, &RaviPostTime, &RaviType, &MaxPlayers, &RaviKilled, &CarveQuest, &Register1, &Register2, &Register3, &Register4, &Register5) - if err != nil { - panic("Error in raviregister") + resp := byteframe.NewByteFrame() + resp.WriteUint8(0) + resp.WriteUint8(12) + resp.WriteUint32(s.server.raviente.register.nextTime) + resp.WriteUint32(s.server.raviente.register.startTime) + resp.WriteUint32(s.server.raviente.register.killedTime) + resp.WriteUint32(s.server.raviente.register.postTime) + resp.WriteUint32(s.server.raviente.register.register[0]) + resp.WriteUint32(s.server.raviente.register.carveQuest) + resp.WriteUint32(s.server.raviente.register.register[1]) + resp.WriteUint32(s.server.raviente.register.register[2]) + resp.WriteUint32(s.server.raviente.register.register[3]) + resp.WriteUint32(s.server.raviente.register.maxPlayers) + resp.WriteUint32(s.server.raviente.register.ravienteType) + resp.WriteUint32(s.server.raviente.register.register[4]) + doAckBufSucceed(s, pkt.AckHandle, resp.Data()) + case 29: + resp := byteframe.NewByteFrame() + resp.WriteUint8(0) + resp.WriteUint8(29) + for _, v := range s.server.raviente.state.stateData { + resp.WriteUint32(v) } - resp.WriteUint8(0) - resp.WriteUint8(RefID) - resp.WriteUint32(NextRavi) - resp.WriteUint32(RaviStarted) - resp.WriteUint32(RaviKilled) - resp.WriteUint32(RaviPostTime) - resp.WriteUint32(Register1) - resp.WriteUint32(CarveQuest) - resp.WriteUint32(Register2) - resp.WriteUint32(Register3) - resp.WriteUint32(Register4) - resp.WriteUint32(MaxPlayers) - resp.WriteUint32(RaviType) - resp.WriteUint32(Register5) - } - doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - case 29: - raviState, err := s.server.db.Query("SELECT refid, phase1hp, phase2hp, phase3hp, phase4hp, phase5hp, phase6hp, phase7hp, phase8hp, phase9hp, unknown1, unknown2, unknown3, unknown4, unknown5, unknown6, unknown7, unknown8, unknown9, unknown10, unknown11, unknown12, unknown13, unknown14, unknown15, unknown16, unknown17, unknown18, unknown19, unknown20 FROM ravistate WHERE RefID=$1", pkt.Unk1) - if err != nil { - panic(err) - } - var RefID uint8 - var Phase1HP, Phase2HP, Phase3HP, Phase4HP, Phase5HP, Phase6HP, Phase7HP, Phase8HP, Phase9HP, Unknown1, Unknown2, Unknown3, Unknown4, Unknown5, Unknown6, Unknown7, Unknown8, Unknown9, Unknown10, Unknown11, Unknown12, Unknown13, Unknown14, Unknown15, Unknown16, Unknown17, Unknown18, Unknown19, Unknown20 uint32 - resp := byteframe.NewByteFrame() - for raviState.Next() { - err = raviState.Scan(&RefID, &Phase1HP, &Phase2HP, &Phase3HP, &Phase4HP, &Phase5HP, &Phase6HP, &Phase7HP, &Phase8HP, &Phase9HP, &Unknown1, &Unknown2, &Unknown3, &Unknown4, &Unknown5, &Unknown6, &Unknown7, &Unknown8, &Unknown9, &Unknown10, &Unknown11, &Unknown12, &Unknown13, &Unknown14, &Unknown15, &Unknown16, &Unknown17, &Unknown18, &Unknown19, &Unknown20) - if err != nil { - panic("Error in ravistate") + doAckBufSucceed(s, pkt.AckHandle, resp.Data()) + case 25: + resp := byteframe.NewByteFrame() + resp.WriteUint8(0) + resp.WriteUint8(25) + for _, v := range s.server.raviente.support.supportData { + resp.WriteUint32(v) } - resp.WriteUint8(0) - resp.WriteUint8(RefID) - resp.WriteUint32(Phase1HP) - resp.WriteUint32(Phase2HP) - resp.WriteUint32(Phase3HP) - resp.WriteUint32(Phase4HP) - resp.WriteUint32(Phase5HP) - resp.WriteUint32(Phase6HP) - resp.WriteUint32(Phase7HP) - resp.WriteUint32(Phase8HP) - resp.WriteUint32(Phase9HP) - resp.WriteUint32(Unknown1) - resp.WriteUint32(Unknown2) - resp.WriteUint32(Unknown3) - resp.WriteUint32(Unknown4) - resp.WriteUint32(Unknown5) - resp.WriteUint32(Unknown6) - resp.WriteUint32(Unknown7) - resp.WriteUint32(Unknown8) - resp.WriteUint32(Unknown9) - resp.WriteUint32(Unknown10) - resp.WriteUint32(Unknown11) - resp.WriteUint32(Unknown12) - resp.WriteUint32(Unknown13) - resp.WriteUint32(Unknown14) - resp.WriteUint32(Unknown15) - resp.WriteUint32(Unknown16) - resp.WriteUint32(Unknown17) - resp.WriteUint32(Unknown18) - resp.WriteUint32(Unknown19) - resp.WriteUint32(Unknown20) - } - doAckBufSucceed(s, pkt.AckHandle, resp.Data()) - case 25: - raviSupport, err := s.server.db.Query("SELECT refid, support1, support2, support3, support4, support5, support6, support7, support8, support9, support10, support11, support12, support13, support14, support15, support16, support17, support18, support19, support20, support21, support22, support23, support24, support25 FROM ravisupport WHERE RefID=$1", pkt.Unk1) - if err != nil { - panic(err) - } - var RefID uint8 - var Support1, Support2, Support3, Support4, Support5, Support6, Support7, Support8, Support9, Support10, Support11, Support12, Support13, Support14, Support15, Support16, Support17, Support18, Support19, Support20, Support21, Support22, Support23, Support24, Support25 uint32 - resp := byteframe.NewByteFrame() - for raviSupport.Next() { - err = raviSupport.Scan(&RefID, &Support1, &Support2, &Support3, &Support4, &Support5, &Support6, &Support7, &Support8, &Support9, &Support10, &Support11, &Support12, &Support13, &Support14, &Support15, &Support16, &Support17, &Support18, &Support19, &Support20, &Support21, &Support22, &Support23, &Support24, &Support25) - if err != nil { - panic("Error in ravisupport") - } - resp.WriteUint8(0) - resp.WriteUint8(RefID) - resp.WriteUint32(Support1) - resp.WriteUint32(Support2) - resp.WriteUint32(Support3) - resp.WriteUint32(Support4) - resp.WriteUint32(Support5) - resp.WriteUint32(Support6) - resp.WriteUint32(Support7) - resp.WriteUint32(Support8) - resp.WriteUint32(Support9) - resp.WriteUint32(Support10) - resp.WriteUint32(Support11) - resp.WriteUint32(Support12) - resp.WriteUint32(Support13) - resp.WriteUint32(Support14) - resp.WriteUint32(Support15) - resp.WriteUint32(Support16) - resp.WriteUint32(Support17) - resp.WriteUint32(Support18) - resp.WriteUint32(Support19) - resp.WriteUint32(Support20) - resp.WriteUint32(Support21) - resp.WriteUint32(Support22) - resp.WriteUint32(Support23) - resp.WriteUint32(Support24) - resp.WriteUint32(Support25) - } - doAckBufSucceed(s, pkt.AckHandle, resp.Data()) + doAckBufSucceed(s, pkt.AckHandle, resp.Data()) } } +// Unused func (s *Session) notifyplayer() { - - s.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0E, 0x00, 0x1D}) - - s.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0D, 0x00, 0x1D}) - - s.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0C, 0x00, 0x1D}) - + s.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0E, 0x00, 0x1D}) + s.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0D, 0x00, 0x1D}) + s.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0C, 0x00, 0x1D}) } func (s *Session) notifyall() { - - for session := range s.server.semaphore["hs_l0u3B51J9k3"].clients { - session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0E, 0x00, 0x1D}) + if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { + for session := range s.server.semaphore["hs_l0u3B51J9k3"].clients { + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0C, 0x00, 0x1D}) + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0D, 0x00, 0x1D}) + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0E, 0x00, 0x1D}) } - - for session := range s.server.semaphore["hs_l0u3B51J9k3"].clients { - session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0D, 0x00, 0x1D}) + } else if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { + for session := range s.server.semaphore["hs_l0u3B5129k3"].clients { + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0C, 0x00, 0x1D}) + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0D, 0x00, 0x1D}) + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0E, 0x00, 0x1D}) } - - for session := range s.server.semaphore["hs_l0u3B51J9k3"].clients { - session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0C, 0x00, 0x1D}) + } else if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists { + for session := range s.server.semaphore["hs_l0u3B512Ak3"].clients { + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0C, 0x00, 0x1D}) + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0D, 0x00, 0x1D}) + session.QueueSendNonBlocking([]byte{0x00, 0x3F, 0x00, 0x0E, 0x00, 0x1D}) } - - + } } -func (s *Session) notifyticker() { +func checkRaviSemaphore(s *Session) bool { + if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { + return true + } else if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { + return true + } else if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists { + return true + } + return false +} +func releaseRaviSemaphore(s *Session) { + s.server.raviente.Lock() + if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { + if len(s.server.semaphore["hs_l0u3B51J9k3"].reservedClientSlots) == 0 { + resetRavi(s) + } + } + if _, exists := s.server.semaphore["hs_l0u3B5129k3"]; exists { + if len(s.server.semaphore["hs_l0u3B5129k3"].reservedClientSlots) == 0 { + resetRavi(s) + } + } + if _, exists := s.server.semaphore["hs_l0u3B512Ak3"]; exists { + if len(s.server.semaphore["hs_l0u3B512Ak3"].reservedClientSlots) == 0 { + resetRavi(s) + } + } + s.server.raviente.Unlock() +} + +func resetRavi(s *Session) { + s.server.raviente.register.nextTime = 0 + s.server.raviente.register.startTime = 0 + s.server.raviente.register.killedTime = 0 + s.server.raviente.register.postTime = 0 + s.server.raviente.register.ravienteType = 0 + s.server.raviente.register.maxPlayers = 0 + s.server.raviente.register.carveQuest = 0 + s.server.raviente.state.damageMultiplier = 1 + s.server.raviente.register.register = []uint32{0, 0, 0, 0, 0} + s.server.raviente.state.stateData = []uint32{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.raviente.support.supportData = []uint32{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} +} + +// Unused +func (s *Session) notifyticker() { if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { s.server.semaphoreLock.Lock() getSemaphore := s.server.semaphore["hs_l0u3B51J9k3"] s.server.semaphoreLock.Unlock() - if _, exists := getSemaphore.reservedClientSlots[s.charID]; exists { + if _, exists := getSemaphore.reservedClientSlots[s.charID]; exists { s.notifyall() } } diff --git a/Erupe/server/channelserver/handlers_semaphore.go b/Erupe/server/channelserver/handlers_semaphore.go index 208491369..348206421 100644 --- a/Erupe/server/channelserver/handlers_semaphore.go +++ b/Erupe/server/channelserver/handlers_semaphore.go @@ -2,10 +2,22 @@ package channelserver import ( "fmt" + "strings" "github.com/Solenataris/Erupe/network/mhfpacket" ) +func removeSessionFromSemaphore(s *Session) { + s.server.semaphoreLock.Lock() + for _, semaphore := range s.server.semaphore { + if _, exists := semaphore.clients[s]; exists { + delete(semaphore.clients, s) + } + } + releaseRaviSemaphore(s) + s.server.semaphoreLock.Unlock() +} + func handleMsgSysCreateSemaphore(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysCreateSemaphore) doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x03, 0x00, 0x0d}) @@ -15,31 +27,53 @@ func handleMsgSysDeleteSemaphore(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysDeleteSemaphore) sem := pkt.AckHandle if s.server.semaphore != nil { - s.server.semaphoreLock.Lock() - for id := range s.server.semaphore { - switch sem { + s.server.semaphoreLock.Lock() + for id := range s.server.semaphore { + switch sem { case 917533: if s.server.semaphore[id].id_semaphore == "hs_l0u3B51J9k3" { - delete(s.server.semaphore["hs_l0u3B51J9k3"].reservedClientSlots, s.charID) - delete(s.server.semaphore["hs_l0u3B51J9k3"].clients, s) + delete(s.server.semaphore["hs_l0u3B51J9k3"].reservedClientSlots, s.charID) + delete(s.server.semaphore["hs_l0u3B51J9k3"].clients, s) + } else if s.server.semaphore[id].id_semaphore == "hs_l0u3B5129k3" { + delete(s.server.semaphore["hs_l0u3B5129k3"].reservedClientSlots, s.charID) + delete(s.server.semaphore["hs_l0u3B5129k3"].clients, s) + } else if s.server.semaphore[id].id_semaphore == "hs_l0u3B512Ak3" { + delete(s.server.semaphore["hs_l0u3B512Ak3"].reservedClientSlots, s.charID) + delete(s.server.semaphore["hs_l0u3B512Ak3"].clients, s) } case 851997: if s.server.semaphore[id].id_semaphore == "hs_l0u3B51J9k4" { - delete(s.server.semaphore["hs_l0u3B51J9k4"].reservedClientSlots, s.charID) + delete(s.server.semaphore["hs_l0u3B51J9k4"].reservedClientSlots, s.charID) + } else if s.server.semaphore[id].id_semaphore == "hs_l0u3B5129k4" { + delete(s.server.semaphore["hs_l0u3B5129k4"].reservedClientSlots, s.charID) + } else if s.server.semaphore[id].id_semaphore == "hs_l0u3B512Ak4" { + delete(s.server.semaphore["hs_l0u3B512Ak4"].reservedClientSlots, s.charID) } case 786461: if s.server.semaphore[id].id_semaphore == "hs_l0u3B51J9k5" { - delete(s.server.semaphore["hs_l0u3B51J9k5"].reservedClientSlots, s.charID) + delete(s.server.semaphore["hs_l0u3B51J9k5"].reservedClientSlots, s.charID) + } else if s.server.semaphore[id].id_semaphore == "hs_l0u3B5129k5" { + delete(s.server.semaphore["hs_l0u3B5129k5"].reservedClientSlots, s.charID) + } else if s.server.semaphore[id].id_semaphore == "hs_l0u3B512Ak5" { + delete(s.server.semaphore["hs_l0u3B512Ak5"].reservedClientSlots, s.charID) } default: if len(s.server.semaphore[id].reservedClientSlots) != 0 { - if s.server.semaphore[id].id_semaphore != "hs_l0u3B51J9k3" && s.server.semaphore[id].id_semaphore != "hs_l0u3B51J9k4" && s.server.semaphore[id].id_semaphore != "hs_l0u3B51J9k5" { - delete(s.server.semaphore[id].reservedClientSlots, s.charID) + if s.server.semaphore[id].id_semaphore != "hs_l0u3B51J9k3" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B51J9k4" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B51J9k5" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B5129k3" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B5129k4" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B5129k5" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B512Ak3" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B512Ak4" && + s.server.semaphore[id].id_semaphore != "hs_l0u3B512Ak5" { + delete(s.server.semaphore[id].reservedClientSlots, s.charID) } } } } - s.server.semaphoreLock.Unlock() + s.server.semaphoreLock.Unlock() } } @@ -52,11 +86,7 @@ func handleMsgSysCreateAcquireSemaphore(s *Session, p mhfpacket.MHFPacket) { fmt.Printf("Got reserve stage req, StageID: %v\n\n", SemaphoreID) if !gotNewStage { s.server.semaphoreLock.Lock() - if SemaphoreID == "hs_l0u3B51J9k1" || - SemaphoreID == "hs_l0u3B51J9k2" || - SemaphoreID == "hs_l0u3B51J9k3" || - SemaphoreID == "hs_l0u3B51J9k4" || - SemaphoreID == "hs_l0u3B51J9k5" { + if strings.HasPrefix(SemaphoreID, "hs_l0u3B51") { s.server.semaphore[SemaphoreID] = NewSemaphore(SemaphoreID, 32) } else { s.server.semaphore[SemaphoreID] = NewSemaphore(SemaphoreID, 1) @@ -68,24 +98,23 @@ func handleMsgSysCreateAcquireSemaphore(s *Session, p mhfpacket.MHFPacket) { newSemaphore.Lock() defer newSemaphore.Unlock() if _, exists := newSemaphore.reservedClientSlots[s.charID]; exists { - s.logger.Info("IS ALREADY EXIST !") doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x0F, 0x00, 0x1D}) } else if uint16(len(newSemaphore.reservedClientSlots)) < newSemaphore.maxPlayers { - switch SemaphoreID { - case "hs_l0u3B51J9k3": + switch SemaphoreID { + case "hs_l0u3B51J9k3", "hs_l0u3B5129k3", "hs_l0u3B512Ak3": newSemaphore.reservedClientSlots[s.charID] = nil newSemaphore.clients[s] = s.charID s.Lock() s.semaphore = newSemaphore s.Unlock() doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x0E, 0x00, 0x1D}) - case "hs_l0u3B51J9k4": + case "hs_l0u3B51J9k4", "hs_l0u3B5129k4", "hs_l0u3B512Ak4": newSemaphore.reservedClientSlots[s.charID] = nil s.Lock() s.semaphore = newSemaphore s.Unlock() doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x0D, 0x00, 0x1D}) - case "hs_l0u3B51J9k5": + case "hs_l0u3B51J9k5", "hs_l0u3B5129k5", "hs_l0u3B512Ak5": newSemaphore.reservedClientSlots[s.charID] = nil s.Lock() s.semaphore = newSemaphore @@ -109,29 +138,16 @@ func handleMsgSysAcquireSemaphore(s *Session, p mhfpacket.MHFPacket) { func handleMsgSysReleaseSemaphore(s *Session, p mhfpacket.MHFPacket) { //pkt := p.(*mhfpacket.MsgSysReleaseSemaphore) - if _, exists := s.server.semaphore["hs_l0u3B51J9k3"]; exists { - reset := len(s.server.semaphore["hs_l0u3B51J9k3"].reservedClientSlots) - if reset == 0 { - s.server.db.Exec("CALL ravireset($1)", 0) - } - } -} - -func removeSessionFromSemaphore(s *Session) { - - s.server.semaphoreLock.Lock() - for id := range s.server.semaphore { - delete(s.server.semaphore[id].reservedClientSlots, s.charID) - if id == "hs_l0u3B51J9k3" { - delete(s.server.semaphore[id].clients, s) - } else { - continue - } - } - s.server.semaphoreLock.Unlock() + releaseRaviSemaphore(s) } func handleMsgSysCheckSemaphore(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysCheckSemaphore) - doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + resp := []byte{0x00, 0x00, 0x00, 0x00} + s.server.semaphoreLock.Lock() + if _, exists := s.server.semaphore[pkt.StageID]; exists { + resp = []byte{0x00, 0x00, 0x00, 0x01} + } + s.server.semaphoreLock.Unlock() + doAckSimpleSucceed(s, pkt.AckHandle, resp) } diff --git a/Erupe/server/channelserver/handlers_stage.go b/Erupe/server/channelserver/handlers_stage.go index 3e00f9973..493f526f8 100644 --- a/Erupe/server/channelserver/handlers_stage.go +++ b/Erupe/server/channelserver/handlers_stage.go @@ -3,6 +3,7 @@ package channelserver import ( "fmt" "time" + "strings" "github.com/Solenataris/Erupe/network/mhfpacket" "github.com/Andoryuuta/byteframe" @@ -11,13 +12,16 @@ import ( func handleMsgSysCreateStage(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysCreateStage) - - s.server.stagesLock.Lock() + s.server.Lock() + defer s.server.Unlock() + if _, exists := s.server.stages[pkt.StageID]; exists { + doAckSimpleFail(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + } else { stage := NewStage(pkt.StageID) stage.maxPlayers = uint16(pkt.PlayerCount) s.server.stages[stage.id] = stage - s.server.stagesLock.Unlock() - doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + } } func handleMsgSysStageDestruct(s *Session, p mhfpacket.MHFPacket) {} @@ -64,58 +68,65 @@ func doStageTransfer(s *Session, ackHandle uint32, stageID string) { // Notify existing stage clients that this new client has entered. s.logger.Info("Sending MsgSysInsertUser") if s.stage != nil { // avoids lock up when using bed for dream quests - s.stage.BroadcastMHF(&mhfpacket.MsgSysInsertUser{ + // Add character to everyone elses stage + s.stage.BroadcastMHF(&mhfpacket.MsgSysInsertUser { CharID: s.charID, }, s) - // It seems to be acceptable to recast all MSG_SYS_SET_USER_BINARY messages so far, - // players are still notified when a new player has joined the stage. - // These extra messages may not be needed - //s.stage.BroadcastMHF(&mhfpacket.MsgSysNotifyUserBinary{ - // CharID: s.charID, - // BinaryType: 1, - //}, s) - //s.stage.BroadcastMHF(&mhfpacket.MsgSysNotifyUserBinary{ - // CharID: s.charID, - // BinaryType: 2, - //}, s) - //s.stage.BroadcastMHF(&mhfpacket.MsgSysNotifyUserBinary{ - // CharID: s.charID, - // BinaryType: 3, - //}, s) + // Update others binary of your session + s.server.BroadcastMHF(&mhfpacket.MsgSysNotifyUserBinary { + CharID: s.charID, + BinaryType: 1, + }, s) + s.server.BroadcastMHF(&mhfpacket.MsgSysNotifyUserBinary { + CharID: s.charID, + BinaryType: 2, + }, s) + s.server.BroadcastMHF(&mhfpacket.MsgSysNotifyUserBinary { + CharID: s.charID, + BinaryType: 3, + }, s) - //Notify the entree client about all of the existing clients in the stage. + // Notify the entree client about all of the existing clients in the stage. s.logger.Info("Notifying entree about existing stage clients") s.stage.RLock() clientNotif := byteframe.NewByteFrame() + + // Get other players in the stage for session := range s.stage.clients { var cur mhfpacket.MHFPacket - cur = &mhfpacket.MsgSysInsertUser{ - CharID: session.charID, - } - clientNotif.WriteUint16(uint16(cur.Opcode())) - cur.Build(clientNotif, session.clientContext) + cur = &mhfpacket.MsgSysInsertUser{ + CharID: session.charID, + } + clientNotif.WriteUint16(uint16(cur.Opcode())) + cur.Build(clientNotif, session.clientContext) + } - cur = &mhfpacket.MsgSysNotifyUserBinary{ - CharID: session.charID, - BinaryType: 1, - } - clientNotif.WriteUint16(uint16(cur.Opcode())) - cur.Build(clientNotif, session.clientContext) + // Get every players binary + for session := range s.server.sessions { + var cur mhfpacket.MHFPacket + session := s.server.sessions[session] - cur = &mhfpacket.MsgSysNotifyUserBinary{ - CharID: session.charID, - BinaryType: 2, - } - clientNotif.WriteUint16(uint16(cur.Opcode())) - cur.Build(clientNotif, session.clientContext) + cur = &mhfpacket.MsgSysNotifyUserBinary{ + CharID: session.charID, + BinaryType: 1, + } + clientNotif.WriteUint16(uint16(cur.Opcode())) + cur.Build(clientNotif, session.clientContext) - cur = &mhfpacket.MsgSysNotifyUserBinary{ - CharID: session.charID, - BinaryType: 3, - } - clientNotif.WriteUint16(uint16(cur.Opcode())) - cur.Build(clientNotif, session.clientContext) + cur = &mhfpacket.MsgSysNotifyUserBinary{ + CharID: session.charID, + BinaryType: 2, + } + clientNotif.WriteUint16(uint16(cur.Opcode())) + cur.Build(clientNotif, session.clientContext) + + cur = &mhfpacket.MsgSysNotifyUserBinary{ + CharID: session.charID, + BinaryType: 3, + } + clientNotif.WriteUint16(uint16(cur.Opcode())) + cur.Build(clientNotif, session.clientContext) } s.stage.RUnlock() clientNotif.WriteUint16(0x0010) // End it. @@ -143,6 +154,18 @@ func doStageTransfer(s *Session, ackHandle uint32, stageID string) { } } +func removeEmptyStages(s *Session) { + s.server.Lock() + for sid, stage := range s.server.stages { + if len(stage.reservedClientSlots) == 0 && len(stage.clients) == 0 { + if strings.HasPrefix(sid, "sl1Qs") || strings.HasPrefix(sid, "sl2Qs") || strings.HasPrefix(sid, "sl3Qs") { + delete(s.server.stages, sid) + } + } + } + s.server.Unlock() +} + func removeSessionFromStage(s *Session) { s.stage.Lock() defer s.stage.Unlock() @@ -151,6 +174,15 @@ func removeSessionFromStage(s *Session) { delete(s.stage.clients, s) delete(s.stage.reservedClientSlots, s.charID) + // Remove client from all reservations + s.server.Lock() + for _, stage := range s.server.stages { + if _, exists := stage.reservedClientSlots[s.charID]; exists { + delete(stage.reservedClientSlots, s.charID) + } + } + s.server.Unlock() + // Delete old stage objects owned by the client. s.logger.Info("Sending MsgSysDeleteObject to old stage clients") for objID, stageObject := range s.stage.objects { @@ -163,14 +195,16 @@ func removeSessionFromStage(s *Session) { // Actually delete it form the objects map. delete(s.stage.objects, objID) } -} + } for objListID, stageObjectList := range s.stage.objectList { if stageObjectList.charid == s.charID { //Added to prevent duplicates from flooding ObjectMap and causing server hangs s.stage.objectList[objListID].status=false s.stage.objectList[objListID].charid=0 - } } + } + + removeEmptyStages(s) } @@ -252,7 +286,9 @@ func handleMsgSysReserveStage(s *Session, p mhfpacket.MHFPacket) { s.server.stagesLock.Unlock() if !gotStage { - s.logger.Fatal("Failed to get stage", zap.String("StageID", stageID)) + s.logger.Error("Failed to get stage", zap.String("StageID", stageID)) + doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4)) + return } // Try to reserve a slot, fail if full. @@ -427,16 +463,18 @@ func handleMsgSysEnumerateStage(s *Session, p mhfpacket.MHFPacket) { // Build the response resp := byteframe.NewByteFrame() - resp.WriteUint16(uint16(len(s.server.stages))) + bf := byteframe.NewByteFrame() + var joinable int for sid, stage := range s.server.stages { stage.RLock() defer stage.RUnlock() - if len(stage.reservedClientSlots)+len(stage.clients) == 0 { + if len(stage.reservedClientSlots) == 0 && len(stage.clients) == 0 { continue } + joinable++ - resp.WriteUint16(uint16(len(stage.reservedClientSlots))) // Current players. - resp.WriteUint16(0) // Unknown value + resp.WriteUint16(uint16(len(stage.reservedClientSlots))) // Reserved players. + resp.WriteUint16(0) // Unknown value var hasDeparted uint16 if stage.hasDeparted { @@ -448,6 +486,8 @@ func handleMsgSysEnumerateStage(s *Session, p mhfpacket.MHFPacket) { resp.WriteUint8(uint8(len(sid))) resp.WriteBytes([]byte(sid)) } + bf.WriteUint16(uint16(joinable)) + bf.WriteBytes(resp.Data()) - doAckBufSucceed(s, pkt.AckHandle, resp.Data()) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } diff --git a/Erupe/server/channelserver/sys_channel_server.go b/Erupe/server/channelserver/sys_channel_server.go index ea179e1ee..320ba0bfa 100644 --- a/Erupe/server/channelserver/sys_channel_server.go +++ b/Erupe/server/channelserver/sys_channel_server.go @@ -53,6 +53,63 @@ type Server struct { // Discord chat integration discordSession *discordgo.Session + + raviente *Raviente +} + +type Raviente struct { + sync.Mutex + + register *RavienteRegister + state *RavienteState + support *RavienteSupport +} + +type RavienteRegister struct { + nextTime uint32 + startTime uint32 + postTime uint32 + killedTime uint32 + ravienteType uint32 + maxPlayers uint32 + carveQuest uint32 + register []uint32 +} + +type RavienteState struct { + damageMultiplier uint32 + stateData []uint32 +} + +type RavienteSupport struct { + supportData []uint32 +} + +// Set up the Raviente variables for the server +func NewRaviente() *Raviente { + ravienteRegister := &RavienteRegister { + nextTime: 0, + startTime: 0, + killedTime: 0, + postTime: 0, + ravienteType: 0, + maxPlayers: 0, + carveQuest: 0, + } + ravienteState := &RavienteState { + damageMultiplier: 1, + } + ravienteSupport := &RavienteSupport { } + ravienteRegister.register = []uint32{0, 0, 0, 0, 0} + ravienteState.stateData = []uint32{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} + ravienteSupport.supportData = []uint32{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} + + raviente := &Raviente { + register: ravienteRegister, + state: ravienteState, + support: ravienteSupport, + } + return raviente } // NewServer creates a new Server type.