[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#991335: marked as done (unblock: supertuxkart (pre-approval))



Your message dated Wed, 28 Jul 2021 15:04:24 +0200
with message-id <CAM8zJQvLNGg03-25tDeYNu9aFJS+PnMhZFy1AAinANggwV9QMA@mail.gmail.com>
and subject line Re: Bug#991335: unblock: supertuxkart (pre-approval)
has caused the Debian Bug report #991335,
regarding unblock: supertuxkart (pre-approval)
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
991335: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=991335
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Dear release team,

this is a request for pre-approval of a supertuxkart upload.

The upstream tarball of supertuxkart 1.2+ds-2 currently includes data
files that are not free (#990368). Additionaly the d/copyright file is
lacking license information for a few additional resources (only data files).

To fix this bug, the two non-free karts will get removed from the upstream
tarball. But as removal of these files would cause a regression in online
multiplayer games, upstream provided two patches (+1 patch that fixes a
memory leak in one of these patches) that keep network compatibility with
other players intact.

Additionaly I'm currently in contact with an upstream contributor who is
investigating the remaining copyright/license issues.
To fix them, the plan is to amend d/copyright where possible
(investigations are currently ongoing), or to replace unknown/non-free files
with free alternatives.

I noticed that supertuxkart is marked for autoremoval on August 3rd
currently, which is probably after the bullseye release.
Does this mean supertuxkart 1.2+ds-2 will be part of bullseye and can
then still be fixed by a stable-proposed-update? Or does the upload
and migration to bullseye have to happen before July 31st?

Below is the full list of files that would get removed from the upstream
tarball:

data/karts/beastie/beastie-icon.png
data/karts/beastie/beastie.spm
data/karts/beastie/beastie_kart_colorizationMask.png
data/karts/beastie/beastie_kart_diffuse.png
data/karts/beastie/beastie_kart_gloss.png
data/karts/beastie/beastie_kart_leftDoor.png
data/karts/beastie/beastie_kart_leftDoor_colorizationMask.png
data/karts/beastie/beastie_kart_leftDoor_gloss.png
data/karts/beastie/beastie_n_kart_wheel_colorizationMask.png
data/karts/beastie/beastie_n_kart_wheel_diffuse.png
data/karts/beastie/beastie_n_kart_wheel_gloss.png
data/karts/beastie/beastie_shadow.png
data/karts/beastie/beastie_texture.png
data/karts/hexley/hexley.spm
data/karts/hexley/hexley_dashboard_diffuse.png
data/karts/hexley/hexley_dashboard_gloss.png
data/karts/hexley/hexley_diffuse.png
data/karts/hexley/hexley_gloss.png
data/karts/hexley/hexley_kart_Normal.png
data/karts/hexley/hexley_kart_colorizationMask.png
data/karts/hexley/hexley_kart_diffuse.png
data/karts/hexley/hexley_kart_frontGlass.png
data/karts/hexley/hexley_kart_gloss.png
data/karts/hexley/hexley_shadow.png
data/karts/hexley/hexley_wheel_Normal.png
data/karts/hexley/hexley_wheel_colorizationMask.png
data/karts/hexley/hexley_wheel_diffuse.png
data/karts/hexley/hexley_wheel_gloss.png
data/karts/hexley/hexley_window.png
data/karts/hexley/hexleyicon.png
data/karts/hexley/hexleyicon32.png

Attached are the mentioned upstream patches.

Kind regards,
  Reiner
From 851290d4c866130abb22ee61114016378af4cb45 Mon Sep 17 00:00:00 2001
From: Benau <Benau@users.noreply.github.com>
Date: Sun, 18 Jul 2021 00:49:49 +0800
Subject: [PATCH] Add code to generate official karts list

---
 data/official_karts.xml      |  21 ++++++
 sources.cmake                |   2 +-
 src/karts/official_karts.cpp | 128 +++++++++++++++++++++++++++++++++++
 src/karts/official_karts.hpp |  20 ++++++
 src/main.cpp                 |   9 +++
 5 files changed, 179 insertions(+), 1 deletion(-)
 create mode 100644 data/official_karts.xml
 create mode 100644 src/karts/official_karts.cpp
 create mode 100644 src/karts/official_karts.hpp

diff --git a/data/official_karts.xml b/data/official_karts.xml
new file mode 100644
index 00000000000..671aadf369e
--- /dev/null
+++ b/data/official_karts.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<karts>
+    <kart name="adiumy" type="medium" width="0.852" height="0.775" length="0.943" gravity-shift="0 0.2829 0"/>
+    <kart name="amanda" type="heavy" width="1.119" height="0.764" length="1.476" gravity-shift="0 0.382 0"/>
+    <kart name="beastie" type="heavy" width="0.837" height="0.847" length="1.49" gravity-shift="0 0.4235 0"/>
+    <kart name="emule" type="medium" width="0.625" height="0.735" length="1.146" gravity-shift="0 0.3438 0"/>
+    <kart name="gavroche" type="medium" width="0.77" height="0.614" length="1.272" gravity-shift="0 0.307 0"/>
+    <kart name="gnu" type="medium" width="0.77" height="0.949" length="1.345" gravity-shift="0 0.4035 0"/>
+    <kart name="hexley" type="light" width="0.611" height="0.858" length="1.608" gravity-shift="0 0.429 0"/>
+    <kart name="kiki" type="light" width="0.866" height="0.974" length="1.227" gravity-shift="0 0.3681 0"/>
+    <kart name="konqi" type="medium" width="0.931" height="0.857" length="1.588" gravity-shift="0 0.4285 0"/>
+    <kart name="nolok" type="medium" width="0.725" height="0.645" length="1.413" gravity-shift="0 0.3225 0"/>
+    <kart name="pidgin" type="heavy" width="0.781" height="0.627" length="1.243" gravity-shift="0 0.3135 0"/>
+    <kart name="puffy" type="heavy" width="1.109" height="0.621" length="1.573" gravity-shift="0 0.3105 0"/>
+    <kart name="sara_the_racer" type="light" width="0.459" height="0.989" length="1.152" gravity-shift="0 0.3456 0"/>
+    <kart name="sara_the_wizard" type="medium" width="0.5" height="0.959" length="1.22" gravity-shift="0 0.366 0"/>
+    <kart name="suzanne" type="medium" width="0.935" height="0.645" length="1.405" gravity-shift="0 0.3225 0"/>
+    <kart name="tux" type="medium" width="0.821" height="0.675" length="1.437" gravity-shift="0 0.3375 0"/>
+    <kart name="wilber" type="light" width="0.837" height="0.871" length="1.715" gravity-shift="0 0.4355 0"/>
+    <kart name="xue" type="medium" width="1.006" height="0.944" length="1.446" gravity-shift="0 0.4338 0"/>
+</karts>
diff --git a/sources.cmake b/sources.cmake
index d4f28ae4de4..ba4868d717e 100644
--- a/sources.cmake
+++ b/sources.cmake
@@ -1,5 +1,5 @@
 # Modify this file to change the last-modified date when you add/remove a file.
-# This will then trigger a new cmake run automatically.
+# This will then trigger a new cmake run automatically. 
 file(GLOB_RECURSE STK_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.hpp")
 file(GLOB_RECURSE STK_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp")
 file(GLOB_RECURSE STK_SHADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "data/shaders/*")
diff --git a/src/karts/official_karts.cpp b/src/karts/official_karts.cpp
new file mode 100644
index 00000000000..c8d7b9f38b7
--- /dev/null
+++ b/src/karts/official_karts.cpp
@@ -0,0 +1,128 @@
+#include "karts/official_karts.hpp"
+
+#include "karts/kart_properties_manager.hpp"
+#include "io/file_manager.hpp"
+#include "io/xml_node.hpp"
+#include "karts/kart_model.hpp"
+#include "karts/kart_properties.hpp"
+#include "utils/file_utils.hpp"
+#include "utils/log.hpp"
+#include "utils/vec3.hpp"
+
+#include <cassert>
+#include <fstream>
+#include <sstream>
+#include <vector>
+
+namespace OfficialKarts
+{
+// ============================================================================
+struct OfficialKart
+{
+std::string name;
+std::string type;
+float width;
+float height;
+float length;
+Vec3 gravity_shift;
+OfficialKart(const std::string& n, const std::string& t, float w, float h,
+             float l, const Vec3& g) : name(n), type(t), width(w), height(h),
+             length(l), gravity_shift(g) {}
+};   // OfficialKart
+std::vector<OfficialKart> g_official_karts;
+
+// ----------------------------------------------------------------------------
+void dumpOfficialKarts()
+{
+    std::stringstream ss;
+    ss << "<?xml version=\"1.0\"?>\n";
+    ss << "<karts>\n";
+    for (unsigned i = 0; i < kart_properties_manager->getNumberOfKarts(); i++)
+    {
+        const KartProperties* kp = kart_properties_manager->getKartById(i);
+        if (kp->isAddon())
+            continue;
+        auto km = kp->getKartModelCopy();
+        ss << "    <kart name=\"" << kp->getIdent() << "\" type=\"" <<
+            kp->getKartType() << "\" width=\"" << km->getWidth() <<
+            "\" height=\"" << km->getHeight() << "\" length=\"" <<
+            km->getLength() << "\" gravity-shift=\"" <<
+            kp->getGravityCenterShift().x() << " " <<
+            kp->getGravityCenterShift().y() << " " <<
+            kp->getGravityCenterShift().z() << "\"/>\n";
+    }
+    ss << "</karts>\n";
+    std::string s = ss.str();
+    std::ofstream xml("official_karts.xml", std::ofstream::out);
+    xml << ss.rdbuf();
+    xml.close();
+}   // getAllData
+
+// ----------------------------------------------------------------------------
+void load()
+{
+    const std::string file_name = file_manager->getAsset("official_karts.xml");
+    if (file_name.empty())
+        Log::fatal("OfficialKarts", "Missing official_karts.xml");
+    const XMLNode *root = file_manager->createXMLTree(file_name);
+    assert(root);
+    for (unsigned int i = 0; i < root->getNumNodes(); i++)
+    {
+        const XMLNode *node = root->getNode(i);
+        std::string name;
+        std::string type;
+        float width = 0.0f;
+        float height = 0.0f;
+        float length = 0.0f;
+        Vec3 gravity_shift;
+        node->get("name", &name);
+        node->get("type", &type);
+        node->get("width", &width);
+        node->get("height", &height);
+        node->get("length", &length);
+        node->get("gravity-shift", &gravity_shift);
+        g_official_karts.emplace_back(name, type, width, height, length,
+            gravity_shift);
+    }
+}   // load
+
+// ----------------------------------------------------------------------------
+std::set<std::string> getOfficialKarts()
+{
+    std::set<std::string> result;
+    for (OfficialKart& ok : g_official_karts)
+        result.insert(ok.name);
+    return result;
+}   // getOfficialKarts
+
+// ----------------------------------------------------------------------------
+const KartProperties* getKartByIdent(const std::string& ident,
+                                     float* width, float* height,
+                                     float* length, Vec3* gravity_shift)
+{
+    for (OfficialKart& ok : g_official_karts)
+    {
+        if (ok.name == ident)
+        {
+            for (unsigned i = 0;
+                i < kart_properties_manager->getNumberOfKarts(); i++)
+            {
+                const KartProperties* kp =
+                    kart_properties_manager->getKartById(i);
+                if (kp->isAddon())
+                    continue;
+                if (kp->getKartType() == ok.type)
+                {
+                    *width = ok.width;
+                    *height = ok.height;
+                    *length = ok.length;
+                    *gravity_shift = ok.gravity_shift;
+                    return kp;
+                }
+            }
+        }
+    }
+    return NULL;
+}   // getKartByIdent
+
+}   // OfficialKarts
diff --git a/src/karts/official_karts.hpp b/src/karts/official_karts.hpp
new file mode 100644
index 00000000000..399b82f83ae
--- /dev/null
+++ b/src/karts/official_karts.hpp
@@ -0,0 +1,20 @@
+#ifndef HEADER_OFFICIAL_KARTS_HPP
+#define HEADER_OFFICIAL_KARTS_HPP
+
+#include <string>
+#include <set>
+
+class KartProperties;
+class Vec3;
+
+namespace OfficialKarts
+{
+void dumpOfficialKarts();
+void load();
+std::set<std::string> getOfficialKarts();
+const KartProperties* getKartByIdent(const std::string& ident,
+                                     float* width, float* height,
+                                     float* length, Vec3* gravity_shift);
+}
+
+#endif
diff --git a/src/main.cpp b/src/main.cpp
index ea709d3bed0..9b8ba266099 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -220,6 +220,7 @@
 #include "karts/kart_model.hpp"
 #include "karts/kart_properties.hpp"
 #include "karts/kart_properties_manager.hpp"
+#include "karts/official_karts.hpp"
 #include "modes/cutscene_world.hpp"
 #include "modes/demo_world.hpp"
 #include "network/protocols/connect_to_server.hpp"
@@ -661,6 +662,7 @@ void cmdLineHelp()
     "                           Takes precedence over trilinear or bilinear\n"
     "                           texture filtering.\n"
     "       --shadows=n         Set resolution of shadows (0 to disable).\n"
+    "       --dump-official-karts Dump official karts for current stk-assets.\n"
     "       --apitrace          This will disable buffer storage and\n"
     "                           writing gpu query strings to opengl, which\n"
     "                           can be seen later in apitrace.\n"
@@ -1660,6 +1662,12 @@ int handleCmdLine(bool has_server_config, bool has_parent_process)
     CommandLine::has("-psn");
 #endif
 
+    if (CommandLine::has("--dump-official-karts"))
+    {
+        OfficialKarts::dumpOfficialKarts();
+        return 0;
+    }
+
     CommandLine::reportInvalidParameters();
 
     if (ProfileWorld::isProfileMode() || GUIEngine::isNoGraphics())
@@ -2093,6 +2101,7 @@ int main(int argc, char *argv[])
         GUIEngine::addLoadingIcon( irr_driver->getTexture(FileManager::GUI_ICON,
                                                           "options_video.png"));
         kart_properties_manager -> loadAllKarts    ();
+        OfficialKarts::load();
         handleXmasMode();
         handleEasterEarMode();
 
From cae38e862a1dbc1486283f551ee023e6c2255085 Mon Sep 17 00:00:00 2001
From: Benau <Benau@users.noreply.github.com>
Date: Sun, 18 Jul 2021 00:50:03 +0800
Subject: [PATCH] Avoid network incompatibility if players add or remove
 official karts

---
 src/karts/abstract_kart.cpp            | 28 +++++++++++++++++++++----
 src/karts/kart_properties.cpp          | 10 ++-------
 src/karts/kart_properties.hpp          | 24 ++++++++++++++-------
 src/network/protocols/client_lobby.cpp | 17 ++++++++++++---
 src/network/protocols/server_lobby.cpp | 29 +++++++++++++-------------
 5 files changed, 70 insertions(+), 38 deletions(-)

diff --git a/src/karts/abstract_kart.cpp b/src/karts/abstract_kart.cpp
index bee9c647435..2c7e41e966d 100644
--- a/src/karts/abstract_kart.cpp
+++ b/src/karts/abstract_kart.cpp
@@ -26,9 +26,11 @@
 #include "karts/kart_model.hpp"
 #include "karts/kart_properties.hpp"
 #include "karts/kart_properties_manager.hpp"
+#include "karts/official_karts.hpp"
 #include "network/network_config.hpp"
 #include "physics/physics.hpp"
 #include "utils/log.hpp"
+#include "utils/string_utils.hpp"
 
 /** Creates a kart.
  *  \param ident The identifier of the kart.
@@ -81,6 +83,8 @@ void AbstractKart::loadKartProperties(const std::string& new_ident,
     m_kart_properties.reset(new KartProperties());
     const KartProperties* kp = kart_properties_manager->getKart(new_ident);
     const KartProperties* kp_addon = NULL;
+    const KartProperties* official_kp = NULL;
+    Vec3 gravity_shift;
     if (NetworkConfig::get()->isNetworking() &&
         NetworkConfig::get()->useTuxHitboxAddon() && kp && kp->isAddon())
     {
@@ -92,17 +96,30 @@ void AbstractKart::loadKartProperties(const std::string& new_ident,
     }
     if (kp == NULL)
     {
+        bool official_kart = !StringUtils::startsWith(new_ident, "addon_");
         if (!NetworkConfig::get()->isNetworking() ||
-            !NetworkConfig::get()->useTuxHitboxAddon())
+            (!NetworkConfig::get()->useTuxHitboxAddon() && !official_kart))
         {
             Log::warn("Abstract_Kart", "Unknown kart %s, fallback to tux",
                 new_ident.c_str());
         }
         kp = kart_properties_manager->getKart(std::string("tux"));
+        if (NetworkConfig::get()->isNetworking() && official_kart)
+        {
+            official_kp = OfficialKarts::getKartByIdent(new_ident,
+                &m_kart_width, &m_kart_height, &m_kart_length, &gravity_shift);
+            if (official_kp)
+                kp = official_kp;
+        }
     }
     m_kart_properties->copyForPlayer(kp, handicap);
     if (kp_addon)
         m_kart_properties->adjustForOnlineAddonKart(kp_addon);
+    if (official_kp)
+    {
+        m_kart_properties->updateForOnlineKart(new_ident, gravity_shift,
+            m_kart_length);
+    }
     m_name = m_kart_properties->getName();
     m_handicap = handicap;
     m_kart_animation  = NULL;
@@ -119,9 +136,12 @@ void AbstractKart::loadKartProperties(const std::string& new_ident,
         m_kart_model.reset(kp_addon->getKartModelCopy(ri));
     else
         m_kart_model.reset(m_kart_properties->getKartModelCopy(ri));
-    m_kart_width  = kp->getMasterKartModel().getWidth();
-    m_kart_height = kp->getMasterKartModel().getHeight();
-    m_kart_length = kp->getMasterKartModel().getLength();
+    if (official_kp == NULL)
+    {
+        m_kart_width  = kp->getMasterKartModel().getWidth();
+        m_kart_height = kp->getMasterKartModel().getHeight();
+        m_kart_length = kp->getMasterKartModel().getLength();
+    }
     m_kart_highest_point = m_kart_model->getHighestPoint();
     m_wheel_graphics_position = m_kart_model->getWheelsGraphicsPosition();
 }   // loadKartProperties
diff --git a/src/karts/kart_properties.cpp b/src/karts/kart_properties.cpp
index d81330254da..933c94c789c 100644
--- a/src/karts/kart_properties.cpp
+++ b/src/karts/kart_properties.cpp
@@ -86,7 +86,7 @@ KartProperties::KartProperties(const std::string &filename)
     // if everything is defined properly.
     m_wheel_base = m_friction_slip = m_collision_terrain_impulse =
         m_collision_impulse = m_collision_impulse_time =
-        m_max_lean = m_lean_speed = m_physical_wheel_position = UNDEFINED;
+        m_physical_wheel_position = UNDEFINED;
 
     m_terrain_impulse_type       = IMPULSE_NONE;
     m_gravity_center_shift       = Vec3(UNDEFINED);
@@ -310,13 +310,7 @@ void KartProperties::load(const std::string &filename, const std::string &node)
         m_gravity_center_shift.setZ(0);
     }
 
-    // The longer the kart,the bigger its turn radius if using an identical
-    // wheel base, exactly proportionally to its length.
-    // The wheel base is used to compensate this
-    // We divide by 1.425 to have a default turn radius which conforms
-    // closely (+-0,1%) with the specifications in kart_characteristics.xml
-    m_wheel_base = fabsf(m_kart_model->getLength()/1.425f);
-
+    setWheelBase(m_kart_model->getLength());
     m_shadow_material = material_manager->getMaterialSPM(m_shadow_file, "",
         "alphablend");
 
diff --git a/src/karts/kart_properties.hpp b/src/karts/kart_properties.hpp
index 92778f3ad2f..b97a6e36e61 100644
--- a/src/karts/kart_properties.hpp
+++ b/src/karts/kart_properties.hpp
@@ -159,14 +159,6 @@ class KartProperties
     /** Wheel base of the kart. */
     float       m_wheel_base;
 
-    /** The maximum roll a kart graphics should show when driving in a fast
-     *  curve. This is read in as degrees, but stored in radians. */
-     float      m_max_lean;
-
-     /** The speed with which the roll (when leaning in a curve) changes
-      *  (in radians/second). */
-     float      m_lean_speed;
-
     /** Engine sound effect. */
     std::string m_engine_sfx_type;
 
@@ -206,6 +198,15 @@ class KartProperties
                              const std::string &node);
     void combineCharacteristics(HandicapLevel h);
 
+    void setWheelBase(float kart_length)
+    {
+        // The longer the kart,the bigger its turn radius if using an identical
+        // wheel base, exactly proportionally to its length.
+        // The wheel base is used to compensate this
+        // We divide by 1.425 to have a default turn radius which conforms
+        // closely (+-0,1%) with the specifications in kart_characteristics.xml
+        m_wheel_base = fabsf(kart_length / 1.425f);
+    }
 public:
     /** Returns the string representation of a handicap level. */
     static std::string      getHandicapAsString(HandicapLevel h);
@@ -215,6 +216,13 @@ class KartProperties
     void  copyForPlayer     (const KartProperties *source,
                              HandicapLevel h = HANDICAP_NONE);
     void  adjustForOnlineAddonKart(const KartProperties* source);
+    void  updateForOnlineKart(const std::string& id, const Vec3& gravity_shift,
+                              float kart_length)
+    {
+        m_ident = id;
+        m_gravity_center_shift = gravity_shift;
+        setWheelBase(kart_length);
+    }
     void  copyFrom          (const KartProperties *source);
     void  getAllData        (const XMLNode * root);
     void  checkAllSet       (const std::string &filename);
diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp
index e686dd4f496..42ef94ec847 100644
--- a/src/network/protocols/client_lobby.cpp
+++ b/src/network/protocols/client_lobby.cpp
@@ -36,6 +36,7 @@
 #include "karts/controller/controller.hpp"
 #include "karts/kart_properties.hpp"
 #include "karts/kart_properties_manager.hpp"
+#include "karts/official_karts.hpp"
 #include "modes/linear_world.hpp"
 #include "network/crypto.hpp"
 #include "network/event.hpp"
@@ -1737,10 +1738,20 @@ void ClientLobby::handleClientCommand(const std::string& cmd)
 // ----------------------------------------------------------------------------
 void ClientLobby::getKartsTracksNetworkString(BareNetworkString* ns)
 {
-    auto all_k = kart_properties_manager->getAllAvailableKarts();
+    std::vector<std::string> all_k;
+    for (unsigned i = 0; i < kart_properties_manager->getNumberOfKarts(); i++)
+    {
+        const KartProperties* kp = kart_properties_manager->getKartById(i);
+        if (kp->isAddon())
+            all_k.push_back(kp->getIdent());
+    }
+    std::set<std::string> oks = OfficialKarts::getOfficialKarts();
+    if (all_k.size() >= 65536 - (unsigned)oks.size())
+        all_k.resize(65535 - (unsigned)oks.size());
+    for (const std::string& k : oks)
+        all_k.push_back(k);
+
     auto all_t = track_manager->getAllTrackIdentifiers();
-    if (all_k.size() >= 65536)
-        all_k.resize(65535);
     if (all_t.size() >= 65536)
         all_t.resize(65535);
     ns->addUInt16((uint16_t)all_k.size()).addUInt16((uint16_t)all_t.size());
diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp
index 2d55ce81f25..b81ade8d0a4 100644
--- a/src/network/protocols/server_lobby.cpp
+++ b/src/network/protocols/server_lobby.cpp
@@ -26,6 +26,7 @@
 #include "karts/controller/player_controller.hpp"
 #include "karts/kart_properties.hpp"
 #include "karts/kart_properties_manager.hpp"
+#include "karts/official_karts.hpp"
 #include "modes/capture_the_flag.hpp"
 #include "modes/linear_world.hpp"
 #include "network/crypto.hpp"
@@ -172,8 +173,6 @@ ServerLobby::ServerLobby() : LobbyProtocol()
 {
     m_client_server_host_id.store(0);
     m_lobby_players.store(0);
-    std::vector<int> all_k =
-        kart_properties_manager->getKartsInGroup("standard");
     std::vector<int> all_t =
         track_manager->getTracksInGroup("standard");
     std::vector<int> all_arenas =
@@ -183,16 +182,7 @@ ServerLobby::ServerLobby() : LobbyProtocol()
     all_t.insert(all_t.end(), all_arenas.begin(), all_arenas.end());
     all_t.insert(all_t.end(), all_soccers.begin(), all_soccers.end());
 
-    for (int kart : all_k)
-    {
-        const KartProperties* kp = kart_properties_manager->getKartById(kart);
-        // Some distro put kart itself, ignore it online for the rest of stk
-        // user
-        if (kp->getIdent() == "geeko")
-            continue;
-        if (!kp->isAddon())
-            m_official_kts.first.insert(kp->getIdent());
-    }
+    m_official_kts.first = OfficialKarts::getOfficialKarts();
     for (int track : all_t)
     {
         Track* t = track_manager->getTrack(track);
@@ -579,9 +569,18 @@ void ServerLobby::updateAddons()
             m_addon_kts.second.insert(t->getIdent());
     }
 
-    auto all_k = kart_properties_manager->getAllAvailableKarts();
-    if (all_k.size() >= 65536)
-        all_k.resize(65535);
+    std::vector<std::string> all_k;
+    for (unsigned i = 0; i < kart_properties_manager->getNumberOfKarts(); i++)
+    {
+        const KartProperties* kp = kart_properties_manager->getKartById(i);
+        if (kp->isAddon())
+            all_k.push_back(kp->getIdent());
+    }
+    std::set<std::string> oks = OfficialKarts::getOfficialKarts();
+    if (all_k.size() >= 65536 - (unsigned)oks.size())
+        all_k.resize(65535 - (unsigned)oks.size());
+    for (const std::string& k : oks)
+        all_k.push_back(k);
     if (ServerConfig::m_live_players)
         m_available_kts.first = m_official_kts.first;
     else
From 339e07bb836d48c932b8516362a764480f57c8e8 Mon Sep 17 00:00:00 2001
From: Benau <Benau@users.noreply.github.com>
Date: Mon, 19 Jul 2021 12:29:54 +0800
Subject: [PATCH] Fix memory leak

---
 src/karts/official_karts.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/karts/official_karts.cpp b/src/karts/official_karts.cpp
index c8d7b9f38b..c9f7a4e75f 100644
--- a/src/karts/official_karts.cpp
+++ b/src/karts/official_karts.cpp
@@ -84,6 +84,7 @@ void load()
         g_official_karts.emplace_back(name, type, width, height, length,
             gravity_shift);
     }
+    delete root;
 }   // load
 
 // ----------------------------------------------------------------------------

Attachment: signature.asc
Description: PGP signature


--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: