mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-14 07:55:33 +01:00
handle alliance enumeration
This commit is contained in:
@@ -3,13 +3,17 @@ package mhfpacket
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"erupe-ce/network/clientctx"
|
|
||||||
"erupe-ce/network"
|
|
||||||
"erupe-ce/common/byteframe"
|
"erupe-ce/common/byteframe"
|
||||||
|
"erupe-ce/network"
|
||||||
|
"erupe-ce/network/clientctx"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MsgMhfInfoJoint represents the MSG_MHF_INFO_JOINT
|
// MsgMhfInfoJoint represents the MSG_MHF_INFO_JOINT
|
||||||
type MsgMhfInfoJoint struct{}
|
type MsgMhfInfoJoint struct {
|
||||||
|
AckHandle uint32
|
||||||
|
AllianceID uint32
|
||||||
|
Unk uint32
|
||||||
|
}
|
||||||
|
|
||||||
// Opcode returns the ID associated with this packet type.
|
// Opcode returns the ID associated with this packet type.
|
||||||
func (m *MsgMhfInfoJoint) Opcode() network.PacketID {
|
func (m *MsgMhfInfoJoint) Opcode() network.PacketID {
|
||||||
@@ -18,7 +22,10 @@ func (m *MsgMhfInfoJoint) Opcode() network.PacketID {
|
|||||||
|
|
||||||
// Parse parses the packet from binary
|
// Parse parses the packet from binary
|
||||||
func (m *MsgMhfInfoJoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
func (m *MsgMhfInfoJoint) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
|
||||||
return errors.New("NOT IMPLEMENTED")
|
m.AckHandle = bf.ReadUint32()
|
||||||
|
m.AllianceID = bf.ReadUint32()
|
||||||
|
m.Unk = bf.ReadUint32()
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build builds a binary packet from the current data.
|
// Build builds a binary packet from the current data.
|
||||||
|
|||||||
@@ -1065,6 +1065,7 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
pkt := p.(*mhfpacket.MsgMhfEnumerateGuild)
|
pkt := p.(*mhfpacket.MsgMhfEnumerateGuild)
|
||||||
|
|
||||||
var guilds []*Guild
|
var guilds []*Guild
|
||||||
|
var alliances []*GuildAlliance
|
||||||
var rows *sqlx.Rows
|
var rows *sqlx.Rows
|
||||||
var err error
|
var err error
|
||||||
bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload)
|
bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload)
|
||||||
@@ -1159,30 +1160,86 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
guilds = append(guilds, guild)
|
guilds = append(guilds, guild)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME:
|
|
||||||
//
|
|
||||||
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_NAME:
|
|
||||||
//
|
|
||||||
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_ID:
|
|
||||||
//
|
|
||||||
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ORDER_MEMBERS:
|
|
||||||
//
|
|
||||||
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ORDER_REGISTRATION:
|
|
||||||
//
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("no handler for guild search type '%d'", pkt.Type))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil || guilds == nil {
|
if pkt.Type > 8 {
|
||||||
|
var tempAlliances []*GuildAlliance
|
||||||
|
rows, err = s.server.db.Queryx(allianceInfoSelectQuery)
|
||||||
|
if err == nil {
|
||||||
|
for rows.Next() {
|
||||||
|
alliance, _ := buildAllianceObjectFromDbResult(rows, err, s)
|
||||||
|
tempAlliances = append(tempAlliances, alliance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch pkt.Type {
|
||||||
|
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME:
|
||||||
|
bf.ReadBytes(10)
|
||||||
|
searchTerm := stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
||||||
|
for _, alliance := range tempAlliances {
|
||||||
|
if strings.Contains(alliance.Name, searchTerm) {
|
||||||
|
alliances = append(alliances, alliance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_NAME:
|
||||||
|
bf.ReadBytes(10)
|
||||||
|
searchTerm := stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
|
||||||
|
for _, alliance := range tempAlliances {
|
||||||
|
if strings.Contains(alliance.ParentGuild.LeaderName, searchTerm) {
|
||||||
|
alliances = append(alliances, alliance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_ID:
|
||||||
|
bf.ReadBytes(2)
|
||||||
|
ID := bf.ReadUint32()
|
||||||
|
for _, alliance := range tempAlliances {
|
||||||
|
if alliance.ParentGuild.LeaderCharID == ID {
|
||||||
|
alliances = append(alliances, alliance)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ORDER_MEMBERS:
|
||||||
|
sort.Slice(tempAlliances, func(i, j int) bool {
|
||||||
|
return tempAlliances[i].TotalMembers < tempAlliances[j].TotalMembers
|
||||||
|
})
|
||||||
|
alliances = tempAlliances
|
||||||
|
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ORDER_REGISTRATION:
|
||||||
|
sort.Slice(tempAlliances, func(i, j int) bool {
|
||||||
|
return tempAlliances[i].CreatedAt.Unix() < tempAlliances[j].CreatedAt.Unix()
|
||||||
|
})
|
||||||
|
alliances = tempAlliances
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil || (guilds == nil && alliances == nil) {
|
||||||
stubEnumerateNoResults(s, pkt.AckHandle)
|
stubEnumerateNoResults(s, pkt.AckHandle)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
bf = byteframe.NewByteFrame()
|
bf = byteframe.NewByteFrame()
|
||||||
bf.WriteUint16(uint16(len(guilds)))
|
|
||||||
|
|
||||||
|
if pkt.Type > 8 {
|
||||||
|
bf.WriteUint16(uint16(len(alliances)))
|
||||||
|
for _, alliance := range alliances {
|
||||||
|
bf.WriteUint8(0x00) // Unk
|
||||||
|
bf.WriteUint32(alliance.ID)
|
||||||
|
bf.WriteUint32(alliance.ParentGuild.LeaderCharID)
|
||||||
|
bf.WriteUint16(alliance.TotalMembers)
|
||||||
|
bf.WriteUint16(0x0000)
|
||||||
|
if alliance.SubGuild1ID == 0 && alliance.SubGuild2ID == 0 {
|
||||||
|
bf.WriteUint16(1)
|
||||||
|
} else if alliance.SubGuild1ID > 0 && alliance.SubGuild2ID == 0 || alliance.SubGuild1ID == 0 && alliance.SubGuild2ID > 0 {
|
||||||
|
bf.WriteUint16(2)
|
||||||
|
} else {
|
||||||
|
bf.WriteUint16(3)
|
||||||
|
}
|
||||||
|
bf.WriteUint32(uint32(alliance.CreatedAt.Unix()))
|
||||||
|
ps.Uint8(bf, alliance.Name, true)
|
||||||
|
ps.Uint8(bf, alliance.ParentGuild.LeaderName, true)
|
||||||
bf.WriteUint8(0x01) // Unk
|
bf.WriteUint8(0x01) // Unk
|
||||||
|
bf.WriteBool(true) // TODO: Enable GuildAlliance applications
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bf.WriteUint8(0x01) // Unk
|
||||||
|
bf.WriteUint16(uint16(len(guilds)))
|
||||||
for _, guild := range guilds {
|
for _, guild := range guilds {
|
||||||
bf.WriteUint32(guild.ID)
|
bf.WriteUint32(guild.ID)
|
||||||
bf.WriteUint32(guild.LeaderCharID)
|
bf.WriteUint32(guild.LeaderCharID)
|
||||||
@@ -1195,6 +1252,7 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
bf.WriteUint8(0x01) // Unk
|
bf.WriteUint8(0x01) // Unk
|
||||||
bf.WriteBool(!guild.Recruiting)
|
bf.WriteBool(!guild.Recruiting)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package channelserver
|
package channelserver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"erupe-ce/common/byteframe"
|
||||||
|
ps "erupe-ce/common/pascalstring"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -149,9 +151,54 @@ func handleMsgMhfOperateJoint(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
|
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("Unhandled operate joint action '%d'", pkt.Action))
|
|
||||||
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
|
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
|
||||||
|
panic(fmt.Sprintf("Unhandled operate joint action '%d'", pkt.Action))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleMsgMhfInfoJoint(s *Session, p mhfpacket.MHFPacket) {}
|
func handleMsgMhfInfoJoint(s *Session, p mhfpacket.MHFPacket) {
|
||||||
|
pkt := p.(*mhfpacket.MsgMhfInfoJoint)
|
||||||
|
bf := byteframe.NewByteFrame()
|
||||||
|
alliance, err := GetAllianceData(s, pkt.AllianceID)
|
||||||
|
if err != nil {
|
||||||
|
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
|
||||||
|
} else {
|
||||||
|
bf.WriteUint32(alliance.ID)
|
||||||
|
bf.WriteUint32(uint32(alliance.CreatedAt.Unix()))
|
||||||
|
bf.WriteUint16(alliance.TotalMembers)
|
||||||
|
bf.WriteUint16(0x0000) // Unk
|
||||||
|
ps.Uint16(bf, alliance.Name, true)
|
||||||
|
if alliance.SubGuild1ID > 0 {
|
||||||
|
if alliance.SubGuild2ID > 0 {
|
||||||
|
bf.WriteUint8(3)
|
||||||
|
} else {
|
||||||
|
bf.WriteUint8(2)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bf.WriteUint8(1)
|
||||||
|
}
|
||||||
|
bf.WriteUint32(alliance.ParentGuildID)
|
||||||
|
bf.WriteUint32(alliance.ParentGuild.LeaderCharID)
|
||||||
|
bf.WriteUint16(alliance.ParentGuild.Rank)
|
||||||
|
bf.WriteUint16(alliance.ParentGuild.MemberCount)
|
||||||
|
ps.Uint16(bf, alliance.ParentGuild.Name, true)
|
||||||
|
ps.Uint16(bf, alliance.ParentGuild.LeaderName, true)
|
||||||
|
if alliance.SubGuild1ID > 0 {
|
||||||
|
bf.WriteUint32(alliance.SubGuild1ID)
|
||||||
|
bf.WriteUint32(alliance.SubGuild1.LeaderCharID)
|
||||||
|
bf.WriteUint16(alliance.SubGuild1.Rank)
|
||||||
|
bf.WriteUint16(alliance.SubGuild1.MemberCount)
|
||||||
|
ps.Uint16(bf, alliance.SubGuild1.Name, true)
|
||||||
|
ps.Uint16(bf, alliance.SubGuild1.LeaderName, true)
|
||||||
|
}
|
||||||
|
if alliance.SubGuild2ID > 0 {
|
||||||
|
bf.WriteUint32(alliance.SubGuild2ID)
|
||||||
|
bf.WriteUint32(alliance.SubGuild2.LeaderCharID)
|
||||||
|
bf.WriteUint16(alliance.SubGuild2.Rank)
|
||||||
|
bf.WriteUint16(alliance.SubGuild2.MemberCount)
|
||||||
|
ps.Uint16(bf, alliance.SubGuild2.Name, true)
|
||||||
|
ps.Uint16(bf, alliance.SubGuild2.LeaderName, true)
|
||||||
|
}
|
||||||
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user