

LEGACY_MAX_CLIENTS enum taken from the original 128 player pr
!image






mapbug



FillSelection() does.// layer_tiles.h
class CLayerTiles : public CLayer
{
// ...
int m_Tele;
int m_Speedup;
int m_Front;
int m_Switch;
int m_Tune;
// ...
}

<= in pLayer->m_Tele <= pBrushLayer->m_Tele is really misleading. I initially thought it was some kind of counter variable.



sv_rcon_password but auth_add with a specific editor-local-server user so it doesn't ch...
















































































math.c and math.cpp the same file?

math.c and math.cpp the same file? 




2025-02-23 10:31:45 I sql: failed connecting to db: (real_connect:mysql:3159): Connections using insecure transport are prohibited while --require_secure_transport=ON.
2025-02-23 10:31:45 I assert: /tw/sources/src/game/server/instagib/sql_stats.cpp(1005): CreateTableThread failed to write
What should I do? Does DDNet support MariaDB with SSL?





































sv_use_sql 1
add_sqlserver r "ddnet-insta" record "ddnet-insta" "<password>" "db.teefusion.net" "3306" 1
add_sqlserver w "ddnet-insta" record "ddnet-insta" "<password>" "db.teefusion.net" "3306" 1
mysql_options (edited)
MAYBE_UNUSED static const char *FONT_ICON_HEART = "\xEF\x80\x84"; that?








mysql_options (edited)



gdb
Thread 43 "DDNet" received signal SIGSEGV, Segmentation fault.
bt

-DCMAKE_BUILD_TYPE=Debug cmake flag to get better info


2025-02-23 10:31:45 I sql: failed connecting to db: (real_connect:mysql:3159): Connections using insecure transport are prohibited while --require_secure_transport=ON.
I am absolutely sure i set up MariaDB and DDNet properly.
DDNet config:
```
sv_use_sql 1
add_sqlserver r "ddnet-insta" record "ddnet-insta" "" "db.teefusion.net" "3306" 1
add_sqlserver w "ddnet-insta...


0c7b987 Add language credits in English as a placeholder - furo321
9537e96 Fix dutch translation credits - def-
72c3d0b Add spectator count to HUD - KebsCS
f76573a Add 128 player support to the client - heinrich5991
90ac3b6 Update romanian.txt - Sans3108
ef4112d Fix grammar - Sans3108
2a63bca Update dutch.txt - realurg
698b9cc Update Russian translations for 19.0 - furo321
b51729e Update Swedish translations for 19.0 - furo321
2b43ab3 Update Chinese translations for 19.0 - Pioooooo
701343c Update spanish.txt for 19.0 - n0Ketchp
67efab8 Update Turkish translations for 19.0 - GokturkTalha
7b52312 Update Azerbaijani translations for 19.0 - GokturkTalha
73a3831 Update Azerbaijani translations for 19.0 - GokturkTalha
6aee3dd Update brazilian_portuguese.txt - rffontenelle
bb241e9 slinack is Isadora nick - rffontenelle
ec22711 Fix DDNetSpectatorInfo unpack error - KebsCS
b424609 Add delay to spectator count and exclude afk players - KebsCS
e36fff3 Fix editor weapon shield preview for custom entities - KebsCS
67d4809 Address /unpractice review comments - KebsCS
6afef64 Update Korean translations by CHaBek - cwh7435
a282dc4 Fix order - def-
459c58c Fix wrong max team size - KebsCS
0e7ca0d Use NUM_DDRACE_TEAMS instead - def-



integration_test.sh. It's not fully covering, but some basic checks at least.
bool CSqliteConnection::AddDeaths(const char *pPlayer, int Deaths, char *pError, int ErrorSize)
{
char aBuf[512];
str_format(aBuf, sizeof(aBuf),
"INSERT INTO %s_stats(Name, Deaths) "
"VALUES (?, ?) "
"ON CONFLICT(Name) DO UPDATE SET Deaths=Deaths+?",
GetPrefix());
if (PrepareStatement(aBuf, pError, ErrorSize))
{
dbg_msg("system", "%s", pError);
return false;
}
BindString(1, pPlayer);
BindInt(2, Deaths);
BindInt(3, Deaths);
bool End;
return Step(&End, pError, ErrorSize);
}




bool CSqliteConnection::AddDeaths(const char *pPlayer, int Deaths, char *pError, int ErrorSize)
{
char aBuf[512];
str_format(aBuf, sizeof(aBuf),
"INSERT INTO %s_stats(Name, Deaths) "
"VALUES (?, ?) "
"ON CONFLICT(Name) DO UPDATE SET Deaths=Deaths+?",
GetPrefix());
if (PrepareStatement(aBuf, pError, ErrorSize))
{
dbg_msg("system", "%s", pError);
return false;
}
BindString(1, pPlayer);
BindInt(2, Deaths);
BindInt(3, Deaths);
bool End;
return Step(&End, pError, ErrorSize);
} 



PrepareStatement is true. The function should return true instead of false. You seem to have copied the AddPoints function, but changed that for some reason.

PrepareStatement is true. The function should return true instead of false. You seem to have copied the AddPoints function, but changed that for some reason. 





void IDbConnection::FormatCreateStats(char *aBuf, unsigned int BufferSize) const
{
str_format(aBuf, BufferSize,
"CREATE TABLE IF NOT EXISTS %s_stats ("
" Name VARCHAR(%d) COLLATE %s NOT NULL, "
" Kills INT DEFAULT 0, "
" Deaths INT DEFAULT 0, "
" PRIMARY KEY (Name)"
")",
GetPrefix(), MAX_NAME_LENGTH_SQL, BinaryCollate());
}

void IDbConnection::FormatCreateStats(char *aBuf, unsigned int BufferSize) const
{
str_format(aBuf, BufferSize,
"CREATE TABLE IF NOT EXISTS %s_stats ("
" Name VARCHAR(%d) COLLATE %s NOT NULL, "
" Kills INT DEFAULT 0, "
" Deaths INT DEFAULT 0, "
" PRIMARY KEY (Name)"
")",
GetPrefix(), MAX_NAME_LENGTH_SQL, BinaryCollate());
} 
SaveStats function, https://github.com/furo321/ddnet-bombtag/commit/8e909528a40fa2473ceecbc9192d15236c6bcfcc

SaveStats function, https://github.com/furo321/ddnet-bombtag/commit/8e909528a40fa2473ceecbc9192d15236c6bcfcc 
if (m_pPlayer && GameServer()->m_pConnection)
{
dbg_msg("system", "I ADD STATS");
if (char Error[512]; !GameServer()->m_pConnection->AddDeaths(Server()->ClientName(m_pPlayer->GetCid()), 1, Error, sizeof(Error)))
{
dbg_msg("system", "Error adding deaths: %s", Error);
}
}
else
{
dbg_msg("system", "I DON`T ADD STATS");
}

IGameServer doesn't have a m_pConnection variable. If you do it like this, you will be calling the SQL in the same thread as the server. Which means you will be effectively halting your entire server waiting for the SQL response.

IGameServer doesn't have a m_pConnection variable. If you do it like this, you will be calling the SQL in the same thread as the server. Which means you will be effectively halting your entire server waiting for the SQL response. 


IGameServer doesn't have a m_pConnection variable. If you do it like this, you will be calling the SQL in the same thread as the server. Which means you will be effectively halting your entire server waiting for the SQL response. 





























int victiim = m_pPlayer->GetCID();
GameServer()->m_apPlayers[victiim]->SetTeam(TEAM_SPECTATORS);
at
void CCharacter::DieSpikes(int pPlayerID, int spikes_flag) { (edited)











implicit_pid starts at None, and must be set to Some(pid) if you hit one of those chunks. If there was already a value an it is equal or higher, advance one tick.
However, set implicit_pid to None, whenever you hit a TickSkip. (edited)

implicit_pid starts at None, and must be set to Some(pid) if you hit one of those chunks. If there was already a value an it is equal or higher, advance one tick.
However, set implicit_pid to None, whenever you hit a TickSkip. (edited)














int victiim = m_pPlayer->GetCID();
GameServer()->m_apPlayers[victiim]->SetTeam(TEAM_SPECTATORS);
at
void CCharacter::DieSpikes(int pPlayerID, int spikes_flag) { (edited)









2

































static bool UnknownArgumentCallback(const char *pCommand, void *pUser)


/showall




gplay command I think. Or modify the code slightly to make it possible (edited)



gplay command I think. Or modify the code slightly to make it possible (edited)













demos folder



%appdata%\Teeworlds
New: %appdata%\DDNet
On Linux:
Old: ~/.teeworlds
New: ~/.local/share/ddnet
On macOS:
Old: ~/Library/Application Support/Teeworlds
New: ~/Library/Application Support/DDNet

demo_extract_chat tool which doesn't use the map, or write a fuzzing test driver based on that









%appdata%\Teeworlds
New: %appdata%\DDNet
On Linux:
Old: ~/.teeworlds
New: ~/.local/share/ddnet
On macOS:
Old: ~/Library/Application Support/Teeworlds
New: ~/Library/Application Support/DDNet


