add support for Clan Changing Room

This commit is contained in:
wish
2024-02-28 19:29:06 +11:00
parent 76425efd2e
commit e5703617bb
2 changed files with 31 additions and 10 deletions

View File

@@ -0,0 +1,6 @@
BEGIN;
ALTER TABLE guilds ADD COLUMN IF NOT EXISTS room_rp INT DEFAULT 0;
ALTER TABLE guilds ADD COLUMN IF NOT EXISTS room_expiry TIMESTAMP WITHOUT TIME ZONE;
END;

View File

@@ -51,6 +51,8 @@ type Guild struct {
MemberCount uint16 `db:"member_count"` MemberCount uint16 `db:"member_count"`
RankRP uint32 `db:"rank_rp"` RankRP uint32 `db:"rank_rp"`
EventRP uint32 `db:"event_rp"` EventRP uint32 `db:"event_rp"`
RoomRP uint16 `db:"room_rp"`
RoomExpiry time.Time `db:"room_expiry"`
Comment string `db:"comment"` Comment string `db:"comment"`
PugiName1 string `db:"pugi_name_1"` PugiName1 string `db:"pugi_name_1"`
PugiName2 string `db:"pugi_name_2"` PugiName2 string `db:"pugi_name_2"`
@@ -153,6 +155,8 @@ SELECT
g.name, g.name,
rank_rp, rank_rp,
event_rp, event_rp,
room_rp,
COALESCE(room_expiry, '1970-01-01') AS room_expiry,
main_motto, main_motto,
sub_motto, sub_motto,
created_at, created_at,
@@ -706,7 +710,7 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
} }
bf.WriteUint32(uint32(response)) bf.WriteUint32(uint32(response))
case mhfpacket.OperateGuildDonateRank: case mhfpacket.OperateGuildDonateRank:
bf.WriteBytes(handleDonateRP(s, uint16(pkt.Data1.ReadUint32()), guild, false)) bf.WriteBytes(handleDonateRP(s, uint16(pkt.Data1.ReadUint32()), guild, 0))
case mhfpacket.OperateGuildSetApplicationDeny: case mhfpacket.OperateGuildSetApplicationDeny:
s.server.db.Exec("UPDATE guilds SET recruiting=false WHERE id=$1", guild.ID) s.server.db.Exec("UPDATE guilds SET recruiting=false WHERE id=$1", guild.ID)
case mhfpacket.OperateGuildSetApplicationAllow: case mhfpacket.OperateGuildSetApplicationAllow:
@@ -747,10 +751,11 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
// TODO: This doesn't implement blocking, if someone unlocked the same outfit at the same time // TODO: This doesn't implement blocking, if someone unlocked the same outfit at the same time
s.server.db.Exec(`UPDATE guilds SET pugi_outfits=pugi_outfits+$1 WHERE id=$2`, int(math.Pow(float64(pkt.Data1.ReadUint32()), 2)), guild.ID) s.server.db.Exec(`UPDATE guilds SET pugi_outfits=pugi_outfits+$1 WHERE id=$2`, int(math.Pow(float64(pkt.Data1.ReadUint32()), 2)), guild.ID)
case mhfpacket.OperateGuildDonateRoom: case mhfpacket.OperateGuildDonateRoom:
// TODO: Where does this go? quantity := uint16(pkt.Data1.ReadUint32())
bf.WriteBytes(handleDonateRP(s, quantity, guild, 2))
case mhfpacket.OperateGuildDonateEvent: case mhfpacket.OperateGuildDonateEvent:
quantity := uint16(pkt.Data1.ReadUint32()) quantity := uint16(pkt.Data1.ReadUint32())
bf.WriteBytes(handleDonateRP(s, quantity, guild, true)) bf.WriteBytes(handleDonateRP(s, quantity, guild, 1))
// TODO: Move this value onto rp_yesterday and reset to 0... daily? // TODO: Move this value onto rp_yesterday and reset to 0... daily?
s.server.db.Exec(`UPDATE guild_characters SET rp_today=rp_today+$1 WHERE character_id=$2`, quantity, s.charID) s.server.db.Exec(`UPDATE guild_characters SET rp_today=rp_today+$1 WHERE character_id=$2`, quantity, s.charID)
case mhfpacket.OperateGuildEventExchange: case mhfpacket.OperateGuildEventExchange:
@@ -794,7 +799,7 @@ func handleChangePugi(s *Session, outfit uint8, guild *Guild, num int) {
guild.Save(s) guild.Save(s)
} }
func handleDonateRP(s *Session, amount uint16, guild *Guild, isEvent bool) []byte { func handleDonateRP(s *Session, amount uint16, guild *Guild, _type int) []byte {
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
bf.WriteUint32(0) bf.WriteUint32(0)
saveData, err := GetCharacterSaveData(s, s.charID) saveData, err := GetCharacterSaveData(s, s.charID)
@@ -803,11 +808,21 @@ func handleDonateRP(s *Session, amount uint16, guild *Guild, isEvent bool) []byt
} }
saveData.RP -= amount saveData.RP -= amount
saveData.Save(s) saveData.Save(s)
updateSQL := "UPDATE guilds SET rank_rp = rank_rp + $1 WHERE id = $2" switch _type {
if isEvent { case 0:
updateSQL = "UPDATE guilds SET event_rp = event_rp + $1 WHERE id = $2" s.server.db.Exec(`UPDATE guilds SET rank_rp = rank_rp + $1 WHERE id = $2`, amount, guild.ID)
case 1:
s.server.db.Exec(`UPDATE guilds SET event_rp = event_rp + $1 WHERE id = $2`, amount, guild.ID)
case 2:
var currentRP uint16
s.server.db.QueryRow(`SELECT room_rp FROM guilds WHERE id = $1`, guild.ID).Scan(&currentRP)
if currentRP+amount >= 30 {
s.server.db.Exec(`UPDATE guilds SET room_rp = 0 WHERE id = $1`, guild.ID)
s.server.db.Exec(`UPDATE guilds SET room_expiry = $1 WHERE id = $2`, TimeAdjusted().Add(time.Hour*24*7), guild.ID)
} else {
s.server.db.Exec(`UPDATE guilds SET room_rp = room_rp + $1 WHERE id = $2`, amount, guild.ID)
}
} }
s.server.db.Exec(updateSQL, amount, guild.ID)
bf.Seek(0, 0) bf.Seek(0, 0)
bf.WriteUint32(uint32(saveData.RP)) bf.WriteUint32(uint32(saveData.RP))
return bf.Data() return bf.Data()
@@ -1001,8 +1016,8 @@ func handleMsgMhfInfoGuild(s *Session, p mhfpacket.MHFPacket) {
bf.WriteUint8(limit) bf.WriteUint8(limit)
bf.WriteUint32(55000) bf.WriteUint32(55000)
bf.WriteUint32(0) bf.WriteUint32(uint32(guild.RoomExpiry.Unix()))
bf.WriteUint16(0) // Changing Room RP bf.WriteUint16(guild.RoomRP)
bf.WriteUint16(0) // Ignored bf.WriteUint16(0) // Ignored
if guild.AllianceID > 0 { if guild.AllianceID > 0 {