Преглед на файлове

Display friend names in red

Clément Wolf преди 3 седмици
родител
ревизия
864fa30454

+ 4 - 2
src/App/Osu/Bancho.cpp

@@ -385,10 +385,12 @@ void handle_packet(Packet *packet) {
         read_int32(packet);
         // (nothing to do)
     } else if(packet->id == FRIENDS_LIST) {
+        friends.clear();
+
         uint16_t nb_friends = read_short(packet);
         for(int i = 0; i < nb_friends; i++) {
-            auto user = get_user_info(read_int32(packet));
-            user->is_friend = true;
+            uint32_t friend_id = read_int32(packet);
+            friends.push_back(friend_id);
         }
     } else if(packet->id == PROTOCOL_VERSION) {
         int protocol_version = read_int32(packet);

+ 7 - 0
src/App/Osu/BanchoNetworking.cpp

@@ -7,6 +7,7 @@
 #include "Bancho.h"
 #include "BanchoLeaderboard.h"
 #include "BanchoProtocol.h"
+#include "BanchoUsers.h"
 #include "CBaseUICheckbox.h"
 #include "ConVar.h"
 #include "Downloader.h"
@@ -96,6 +97,12 @@ void disconnect() {
     bancho.osu->m_optionsMenu->logInButton->is_loading = false;
     ConVars::sv_cheats.setValue(true);
 
+    for(auto pair : online_users) {
+        delete pair.second;
+    }
+    online_users.clear();
+    friends.clear();
+
     bancho.osu->m_chat->onDisconnect();
 
     // XXX: We should toggle between "offline" sorting options and "online" ones

+ 6 - 0
src/App/Osu/BanchoUsers.cpp

@@ -1,6 +1,7 @@
 #include "BanchoUsers.h"
 
 std::unordered_map<uint32_t, UserInfo*> online_users;
+std::vector<uint32_t> friends;
 
 UserInfo* get_user_info(uint32_t user_id, bool fetch) {
     auto it = online_users.find(user_id);
@@ -24,3 +25,8 @@ UserInfo* get_user_info(uint32_t user_id, bool fetch) {
 
     return info;
 }
+
+bool UserInfo::is_friend() {
+    auto it = std::find(friends.begin(), friends.end(), user_id);
+    return it != friends.end();
+}

+ 4 - 1
src/App/Osu/BanchoUsers.h

@@ -6,7 +6,6 @@
 
 struct UserInfo {
     uint32_t user_id = 0;
-    bool is_friend = false;
 
     // Presence (via USER_PRESENCE_REQUEST or USER_PRESENCE_REQUEST_ALL)
     UString name;
@@ -29,7 +28,11 @@ struct UserInfo {
     int32_t plays = 0;
     uint16_t pp = 0.f;
     float accuracy = 0.f;
+
+    bool is_friend();
 };
 
 extern std::unordered_map<uint32_t, UserInfo*> online_users;
+extern std::vector<uint32_t> friends;
+
 UserInfo* get_user_info(uint32_t user_id, bool fetch = false);

+ 5 - 4
src/App/Osu/OsuChangelog.cpp

@@ -41,7 +41,12 @@ OsuChangelog::OsuChangelog(Osu *osu) : OsuScreenBackable(osu) {
     latest.changes.push_back("- Added server logo to main menu button");
     latest.changes.push_back("- Added instant_replay_duration convar");
     latest.changes.push_back("- Allowed singleplayer cheats when the server doesn't accept score submissions");
+    latest.changes.push_back("- Changed scoreboard name color to red for friends");
     latest.changes.push_back("- Changed default instant replay key to F2 to avoid conflicts with mod selector");
+    latest.changes.push_back("- Forced exclusive mode when using WASAPI output");
+    latest.changes.push_back("- Disabled score submission when mods are toggled mid-game");
+    latest.changes.push_back("- Removed support for the Nintendo Switch");
+    latest.changes.push_back("- Updated protocol version");
     latest.changes.push_back("- Fixed chat layout updating while chat was hidden");
     latest.changes.push_back("- Fixed pause button not working after cancelling database load");
     latest.changes.push_back("- Fixed level bar always being at 0%");
@@ -51,10 +56,6 @@ OsuChangelog::OsuChangelog(Osu *osu) : OsuScreenBackable(osu) {
     latest.changes.push_back("- Fixed replay playback starting too fast");
     latest.changes.push_back("- Fixed restarting SoundEngine not kicking the player out of play mode");
     latest.changes.push_back("- Fixed ALT key not working on linux");
-    latest.changes.push_back("- Forced exclusive mode when using WASAPI output");
-    latest.changes.push_back("- Disabled score submission when mods are toggled mid-game");
-    latest.changes.push_back("- Removed support for the Nintendo Switch");
-    latest.changes.push_back("- Updated protocol version");
     changelogs.push_back(latest);
 
     CHANGELOG v34_10;

+ 5 - 1
src/App/Osu/OsuScoreboardSlot.cpp

@@ -2,6 +2,7 @@
 
 #include "AnimationHandler.h"
 #include "Bancho.h"
+#include "BanchoUsers.h"
 #include "Engine.h"
 #include "Font.h"
 #include "Osu.h"
@@ -12,6 +13,9 @@ OsuScoreboardSlot::OsuScoreboardSlot(SCORE_ENTRY score, int index) {
     m_avatar = new OsuUIAvatar(score.player_id, 0, 0, 0, 0);
     m_score = score;
     m_index = index;
+
+    auto user = get_user_info(score.player_id);
+    is_friend = user->is_friend();
 }
 
 OsuScoreboardSlot::~OsuScoreboardSlot() {
@@ -55,7 +59,7 @@ void OsuScoreboardSlot::draw(Graphics *g) {
     } else if(m_index == 0) {
         g->setColor(0xff1b6a8c);
     } else {
-        g->setColor(0xff114459);
+        g->setColor(is_friend ? 0xff9C205C : 0xff114459);
     }
     g->setAlpha(0.3f * m_fAlpha);
 

+ 1 - 0
src/App/Osu/OsuScoreboardSlot.h

@@ -16,5 +16,6 @@ struct OsuScoreboardSlot {
     float m_y = 0.f;
     float m_fAlpha = 0.f;
     float m_fFlash = 0.f;
+    bool is_friend = false;
     bool was_visible = false;
 };

+ 5 - 1
src/App/Osu/OsuUISongBrowserScoreButton.cpp

@@ -12,6 +12,7 @@
 #include "AnimationHandler.h"
 #include "Bancho.h"
 #include "BanchoNetworking.h"
+#include "BanchoUsers.h"
 #include "ConVar.h"
 #include "Console.h"
 #include "Engine.h"
@@ -172,7 +173,7 @@ void OsuUISongBrowserScoreButton::draw(Graphics *g) {
         g->setAlpha(0.75f);
         g->drawString(usernameFont, string);
         g->translate(-0.75f, -0.75f);
-        g->setColor(0xffffffff);
+        g->setColor(is_friend ? 0xffD424B0 : 0xffffffff);
         g->drawString(usernameFont, string);
     }
     g->popTransform();
@@ -628,6 +629,9 @@ void OsuUISongBrowserScoreButton::setScore(const Score &score, const OsuDatabase
     }
     if(score.player_id != 0) {
         m_avatar = new OsuUIAvatar(score.player_id, m_vPos.x, m_vPos.y, m_vSize.y, m_vSize.y);
+
+        auto user = get_user_info(score.player_id);
+        is_friend = user->is_friend();
     }
 
     // display

+ 1 - 0
src/App/Osu/OsuUISongBrowserScoreButton.h

@@ -47,6 +47,7 @@ class OsuUISongBrowserScoreButton : public CBaseUIButton {
     inline UString getDateTime() const { return m_sScoreDateTime; }
     inline int getIndex() const { return m_iScoreIndexNumber; }
 
+    bool is_friend = false;
     OsuUIAvatar *m_avatar = nullptr;
     MD5Hash map_hash;
 

+ 6 - 4
src/App/Osu/OsuUIUserContextMenu.cpp

@@ -63,7 +63,7 @@ void OsuUIUserContextMenuScreen::open(uint32_t user_id) {
             // menu->addButton("Invite to game", INVITE_TO_GAME);
         }
 
-        if(user_info->is_friend) {
+        if(user_info->is_friend()) {
             menu->addButton("Revoke friendship", UA_REMOVE_FRIEND);
         } else {
             menu->addButton("Add as friend", UA_ADD_FRIEND);
@@ -115,15 +115,17 @@ void OsuUIUserContextMenuScreen::on_action(UString text, int user_action) {
         packet.id = FRIEND_ADD;
         write_int32(&packet, m_user_id);
         send_packet(packet);
-
-        user_info->is_friend = true;
+        friends.push_back(m_user_id);
     } else if(user_action == UA_REMOVE_FRIEND) {
         Packet packet;
         packet.id = FRIEND_REMOVE;
         write_int32(&packet, m_user_id);
         send_packet(packet);
 
-        user_info->is_friend = false;
+        auto it = std::find(friends.begin(), friends.end(), m_user_id);
+        if(it != friends.end()) {
+            friends.erase(it);
+        }
     }
 
     menu->setVisible(false);