diff --git a/network/mhfpacket/msg_sys_update_right.go b/network/mhfpacket/msg_sys_update_right.go index cf4232573..0702a5b3e 100644 --- a/network/mhfpacket/msg_sys_update_right.go +++ b/network/mhfpacket/msg_sys_update_right.go @@ -3,6 +3,7 @@ package mhfpacket import ( "errors" ps "erupe-ce/common/pascalstring" + "golang.org/x/exp/slices" "erupe-ce/common/byteframe" "erupe-ce/network" @@ -95,7 +96,11 @@ func Courses() []Course { // GetCourseStruct returns a slice of Course(s) from a rights integer func GetCourseStruct(rights uint32) []Course { var resp []Course - for _, course := range Courses() { + s := Courses() + slices.SortStableFunc(s, func(i, j Course) bool { + return i.ID > j.ID + }) + for _, course := range s { if rights-course.Value < 0x80000000 { resp = append(resp, course) rights -= course.Value diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index 851f4c1df..edd2dc33c 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -213,7 +213,7 @@ func logoutPlayer(s *Session) { timePlayed += sessionTime var rpGained int - if s.FindCourse("Netcafe").Value != 0 { + if s.FindCourse("Netcafe").ID != 0 { rpGained = timePlayed / 900 timePlayed = timePlayed % 900 } else { diff --git a/server/channelserver/handlers_cast_binary.go b/server/channelserver/handlers_cast_binary.go index 9372d1572..64666d9af 100644 --- a/server/channelserver/handlers_cast_binary.go +++ b/server/channelserver/handlers_cast_binary.go @@ -325,22 +325,28 @@ func handleMsgSysCastBinary(s *Session, p mhfpacket.MHFPacket) { if strings.ToLower(name) == strings.ToLower(alias) { if slices.Contains(s.server.erupeConfig.Courses, config.Course{Name: course.Aliases[0], Enabled: true}) { if s.FindCourse(name).Value != 0 { - existingIndex := -1 - for i, course := range s.courses { - for _, alias := range course.Aliases { + ei := slices.IndexFunc(s.courses, func(c mhfpacket.Course) bool { + for _, alias := range c.Aliases { if strings.ToLower(name) == strings.ToLower(alias) { - existingIndex = i + return true } } - } - if existingIndex >= 0 { - s.courses = append(s.courses[:existingIndex], s.courses[existingIndex+1:]...) + return false + }) + if ei != -1 { + s.courses = append(s.courses[:ei], s.courses[ei+1:]...) sendServerChatMessage(s, fmt.Sprintf(`%s Course disabled.`, course.Aliases[0])) } } else { s.courses = append(s.courses, course) sendServerChatMessage(s, fmt.Sprintf(`%s Course enabled.`, course.Aliases[0])) } + var newInt uint32 + for _, course := range s.courses { + newInt += course.Value + } + s.server.db.Exec("UPDATE users u SET rights=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", newInt, s.charID) + updateRights(s) } else { sendServerChatMessage(s, fmt.Sprintf(`%s Course is locked.`, course.Aliases[0])) }