From 1e62e8bf96f65e954c9f58260ece71c495e8a6de Mon Sep 17 00:00:00 2001 From: wish Date: Thu, 28 Jul 2022 15:34:50 +1000 Subject: [PATCH] achievements concept --- Erupe/achievements.sql | 41 ++++++ .../channelserver/handlers_achievement.go | 135 ++++++++---------- 2 files changed, 104 insertions(+), 72 deletions(-) create mode 100644 Erupe/achievements.sql diff --git a/Erupe/achievements.sql b/Erupe/achievements.sql new file mode 100644 index 000000000..5c24f9e89 --- /dev/null +++ b/Erupe/achievements.sql @@ -0,0 +1,41 @@ +BEGIN; + +CREATE TABLE IF NOT EXISTS public.achievements +( + id int NOT NULL, + ach0 int DEFAULT 0, + ach1 int DEFAULT 0, + ach2 int DEFAULT 0, + ach3 int DEFAULT 0, + ach4 int DEFAULT 0, + ach5 int DEFAULT 0, + ach6 int DEFAULT 0, + ach7 int DEFAULT 0, + ach8 int DEFAULT 0, + ach9 int DEFAULT 0, + ach10 int DEFAULT 0, + ach11 int DEFAULT 0, + ach12 int DEFAULT 0, + ach13 int DEFAULT 0, + ach14 int DEFAULT 0, + ach15 int DEFAULT 0, + ach16 int DEFAULT 0, + ach17 int DEFAULT 0, + ach18 int DEFAULT 0, + ach19 int DEFAULT 0, + ach20 int DEFAULT 0, + ach21 int DEFAULT 0, + ach22 int DEFAULT 0, + ach23 int DEFAULT 0, + ach24 int DEFAULT 0, + ach25 int DEFAULT 0, + ach26 int DEFAULT 0, + ach27 int DEFAULT 0, + ach28 int DEFAULT 0, + ach29 int DEFAULT 0, + ach30 int DEFAULT 0, + ach31 int DEFAULT 0, + ach32 int DEFAULT 0 +); + +END; \ No newline at end of file diff --git a/Erupe/server/channelserver/handlers_achievement.go b/Erupe/server/channelserver/handlers_achievement.go index 7887ab71d..b9197f6ea 100644 --- a/Erupe/server/channelserver/handlers_achievement.go +++ b/Erupe/server/channelserver/handlers_achievement.go @@ -5,83 +5,74 @@ import ( "erupe-ce/network/mhfpacket" ) +var achievementCurves = [][]uint32{ + // 0: HR weapon use, Class use, Tore dailies + {5, 15, 30, 50, 100, 150, 200, 250, 300}, + // 1: Weapon collector, G wep enhances + {1, 3, 5, 15, 30, 50, 75, 100, 150}, + // 2: Festa wins + {1, 2, 3, 4, 5, 6, 7, 8, 9}, + // 3: GR weapon use + {10, 50, 100, 200, 350, 500, 750, 1000, 1500}, + // 4: Armor refinement + {0, 5, 5, 5, 5, 5, 5, 5, 5}, + // 5: Sigil crafts + {0, 50, 50, 50, 50, 50, 50, 50, 50}, +} + +var achievementCurveMap = map[uint8][]uint32{ + 0: achievementCurves[0], 1: achievementCurves[0], 2: achievementCurves[0], 3: achievementCurves[0], + 4: achievementCurves[0], 5: achievementCurves[0], 6: achievementCurves[0], 7: achievementCurves[1], + 8: achievementCurves[2], 9: achievementCurves[0], 10: achievementCurves[0], 11: achievementCurves[0], + 12: achievementCurves[0], 13: achievementCurves[0], 14: achievementCurves[0], 15: achievementCurves[0], + 16: achievementCurves[3], 17: achievementCurves[3], 18: achievementCurves[3], 19: achievementCurves[3], + 20: achievementCurves[3], 21: achievementCurves[3], 22: achievementCurves[3], 23: achievementCurves[3], + 24: achievementCurves[3], 25: achievementCurves[3], 26: achievementCurves[3], 27: achievementCurves[1], + 28: achievementCurves[4], 29: achievementCurves[5], 30: achievementCurves[3], 31: achievementCurves[3], + 32: achievementCurves[3], +} + func handleMsgMhfGetAchievement(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfGetAchievement) - achievementStruct := []struct { - ID uint8 // Main ID - Unk0 uint8 // always FF - Unk1 uint16 // 0x05 0x00 - Unk2 uint32 // 0x01 0x0A 0x05 0x00 - }{ - {ID: 0, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 1, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 2, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 3, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 4, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 5, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 6, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 7, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 8, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 9, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 10, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 11, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 12, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 13, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 14, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 15, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 16, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 17, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 18, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 19, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 20, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 21, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 22, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 23, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 24, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 25, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 26, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 27, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 28, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 29, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 30, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 31, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 32, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 33, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 34, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 35, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 36, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 37, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 38, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 39, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 40, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 41, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 42, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 43, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 44, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 45, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 46, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 47, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 48, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 49, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 50, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 51, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 52, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 53, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 54, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 55, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 56, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 57, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 58, Unk0: 0xFF, Unk1: 0, Unk2: 0}, - {ID: 59, Unk0: 0xFF, Unk1: 0, Unk2: 0}, + err := s.server.db.QueryRow("SELECT id FROM achievements WHERE id=$1", s.charID) + if err != nil { + s.server.db.Exec("INSERT INTO achievements (id) VALUES ($1)", s.charID) } + + scores := make([]int, 33) + s.server.db.QueryRow("SELECT * FROM achievements WHERE id=$1", s.charID).Scan(&scores[0], &scores[0], + &scores[1], &scores[2], &scores[3], &scores[4], &scores[5], &scores[6], &scores[7], &scores[8], &scores[9], + &scores[10], &scores[11], &scores[12], &scores[13], &scores[14], &scores[15], &scores[16], &scores[17], + &scores[18], &scores[19], &scores[20], &scores[21], &scores[22], &scores[23], &scores[24], &scores[25], + &scores[26], &scores[27], &scores[28], &scores[29], &scores[30], &scores[31], &scores[32]) + resp := byteframe.NewByteFrame() - resp.WriteUint8(uint8(len(achievementStruct))) // Entry count - for _, entry := range achievementStruct { - resp.WriteUint8(entry.ID) - resp.WriteUint8(entry.Unk0) - resp.WriteUint16(entry.Unk1) - resp.WriteUint32(entry.Unk2) + points := uint32(69) + resp.WriteUint32(points) + resp.WriteUint32(points) + resp.WriteUint32(points) + resp.WriteUint32(points) + resp.WriteBytes([]byte{0x02, 0x00, 0x00}) + + entries := 34 + resp.WriteUint8(uint8(entries)) // Entry count + for i := 0; i < entries; i++ { + resp.WriteUint8(uint8(i)) // achievement id + resp.WriteUint8(uint8(i)) // level + resp.WriteUint16(20) // point value + resp.WriteUint32(100) // required + resp.WriteUint8(0) + if i < 10 { + resp.WriteUint16(0x7FFF) + } else if i < 20 { + resp.WriteUint16(0x3FFF) + } else { + resp.WriteUint16(0x1FFF) + } + //resp.WriteUint16(0x7F7F) // unk + resp.WriteUint8(0) + resp.WriteUint32(100) // progress } doAckBufSucceed(s, pkt.AckHandle, resp.Data()) }