Compare commits

...

259 commits

Author SHA1 Message Date
Chiller Dragon 7a4a2c51cd
Merge 8fc437bea6 into fc058fa432 2024-09-07 15:29:11 +08:00
ChillerDragon 8fc437bea6 Use arrays for snap strings 2024-09-07 15:28:29 +08:00
ChillerDragon 732798444c More detailed snapshot debug dump
The method CSnapShot::DebugDump() used to print just the raw snap items.
Without item names or field names:

```
2024-04-07 09:10:01 I snapshot: data_size=356 num_items=10
2024-04-07 09:10:01 I snapshot:         type=0 id=32767
2024-04-07 09:10:01 I snapshot:                   0  -1824658838        933dea6a
2024-04-07 09:10:01 I snapshot:                   1   -629591830        da7930ea
2024-04-07 09:10:01 I snapshot:                   2  -1450210576        a98f8af0
2024-04-07 09:10:01 I snapshot:                   3    914991429        3689a945
2024-04-07 09:10:01 I snapshot:         type=0 id=32766
2024-04-07 09:10:01 I snapshot:                   0    583701389        22ca938d
2024-04-07 09:10:01 I snapshot:                   1    327171627        13803e2b
2024-04-07 09:10:01 I snapshot:                   2  -1636052395        9e7bd255
2024-04-07 09:10:01 I snapshot:                   3  -1901674991        8ea6be11
2024-04-07 09:10:01 I snapshot:         type=0 id=32765
2024-04-07 09:10:01 I snapshot:                   0   1993229659        76ce455b
2024-04-07 09:10:01 I snapshot:                   1   -102024632        f9eb3a48
2024-04-07 09:10:01 I snapshot:                   2  -1378361269        add7e04b
2024-04-07 09:10:01 I snapshot:                   3  -1810037668        941d045c
2024-04-07 09:10:01 I snapshot:         type=6 id=0
2024-04-07 09:10:01 I snapshot:                   0            0        00000000
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:                   2            0        00000000
2024-04-07 09:10:01 I snapshot:                   3            0        00000000
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:                   5            0        00000000
2024-04-07 09:10:01 I snapshot:                   6            0        00000000
2024-04-07 09:10:01 I snapshot:                   7            1        00000001
2024-04-07 09:10:01 I snapshot:         type=32767 id=0
2024-04-07 09:10:01 I snapshot:                   0    247983155        0ec7ec33
2024-04-07 09:10:01 I snapshot:                   1            9        00000009
2024-04-07 09:10:01 I snapshot:                   2           64        00000040
2024-04-07 09:10:01 I snapshot:         type=11 id=0
2024-04-07 09:10:01 I snapshot:                   0  -1008145940        c3e8e9ec
2024-04-07 09:10:01 I snapshot:                   1   -320474428        ece5f2c4
2024-04-07 09:10:01 I snapshot:                   2   -220076049        f2e1e7ef
2024-04-07 09:10:01 I snapshot:                   3   -293568512        ee808000
2024-04-07 09:10:01 I snapshot:                   4  -1330727040        b0aeb780
2024-04-07 09:10:01 I snapshot:                   5  -2139062144        80808080
2024-04-07 09:10:01 I snapshot:                   6  -2139062272        80808000
2024-04-07 09:10:01 I snapshot:                   7           64        00000040
2024-04-07 09:10:01 I snapshot:                   8   -403511835        e7f2e5e5
2024-04-07 09:10:01 I snapshot:                   9   -286001183        eef3f7e1
2024-04-07 09:10:01 I snapshot:                  10   -219905920        f2e48080
2024-04-07 09:10:01 I snapshot:                  11  -2139062144        80808080
2024-04-07 09:10:01 I snapshot:                  12  -2139062144        80808080
2024-04-07 09:10:01 I snapshot:                  13  -2139062272        80808000
2024-04-07 09:10:01 I snapshot:                  14            0        00000000
2024-04-07 09:10:01 I snapshot:                  15      7199301        006dda45
2024-04-07 09:10:01 I snapshot:                  16      2345678        0023cace
2024-04-07 09:10:01 I snapshot:         type=10 id=0
2024-04-07 09:10:01 I snapshot:                   0            1        00000001
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:                   2            0        00000000
2024-04-07 09:10:01 I snapshot:                   3        -9999        ffffd8f1
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:         type=32766 id=0
2024-04-07 09:10:01 I snapshot:                   0            1        00000001
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:         type=9 id=0
2024-04-07 09:10:01 I snapshot:                   0          438        000001b6
2024-04-07 09:10:01 I snapshot:                   1         1968        000007b0
2024-04-07 09:10:01 I snapshot:                   2          913        00000391
2024-04-07 09:10:01 I snapshot:                   3            0        00000000
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:                   5            0        00000000
2024-04-07 09:10:01 I snapshot:                   6            0        00000000
2024-04-07 09:10:01 I snapshot:                   7            0        00000000
2024-04-07 09:10:01 I snapshot:                   8           -1        ffffffff
2024-04-07 09:10:01 I snapshot:                   9            0        00000000
2024-04-07 09:10:01 I snapshot:                  10            0        00000000
2024-04-07 09:10:01 I snapshot:                  11         1968        000007b0
2024-04-07 09:10:01 I snapshot:                  12          913        00000391
2024-04-07 09:10:01 I snapshot:                  13            0        00000000
2024-04-07 09:10:01 I snapshot:                  14            0        00000000
2024-04-07 09:10:01 I snapshot:                  15            1        00000001
2024-04-07 09:10:01 I snapshot:                  16           10        0000000a
2024-04-07 09:10:01 I snapshot:                  17           10        0000000a
2024-04-07 09:10:01 I snapshot:                  18            0        00000000
2024-04-07 09:10:01 I snapshot:                  19            1        00000001
2024-04-07 09:10:01 I snapshot:                  20            5        00000005
2024-04-07 09:10:01 I snapshot:                  21            0        00000000
2024-04-07 09:10:01 I snapshot:         type=32765 id=0
2024-04-07 09:10:01 I snapshot:                   0        49152        0000c000
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:                   2            2        00000002
2024-04-07 09:10:01 I snapshot:                   3            0        00000000
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:                   5            0        00000000
2024-04-07 09:10:01 I snapshot:                   6            0        00000000
2024-04-07 09:10:01 I snapshot:                   7            0        00000000
2024-04-07 09:10:01 I snapshot:                   8            1        00000001
2024-04-07 09:10:01 I snapshot:                   9            0        00000000
```

Now there is also `CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap)`
which prints the name of the snap item and also the names of all fields:

```
2024-04-07 09:21:42 I snapshot: data_size=356 num_items=10
2024-04-07 09:21:42 I snapshot:         EX/UUID type=0 id=32767 size=16
2024-04-07 09:21:42 I snapshot:                   0  -1824658838        933dea6a
2024-04-07 09:21:42 I snapshot:                   1   -629591830        da7930ea
2024-04-07 09:21:42 I snapshot:                   2  -1450210576        a98f8af0
2024-04-07 09:21:42 I snapshot:                   3    914991429        3689a945
2024-04-07 09:21:42 I snapshot:         EX/UUID type=0 id=32766 size=16
2024-04-07 09:21:42 I snapshot:                   0    583701389        22ca938d
2024-04-07 09:21:42 I snapshot:                   1    327171627        13803e2b
2024-04-07 09:21:42 I snapshot:                   2  -1636052395        9e7bd255
2024-04-07 09:21:42 I snapshot:                   3  -1901674991        8ea6be11
2024-04-07 09:21:42 I snapshot:         EX/UUID type=0 id=32765 size=16
2024-04-07 09:21:42 I snapshot:                   0   1993229659        76ce455b
2024-04-07 09:21:42 I snapshot:                   1   -102024632        f9eb3a48
2024-04-07 09:21:42 I snapshot:                   2  -1378361269        add7e04b
2024-04-07 09:21:42 I snapshot:                   3  -1810037668        941d045c
2024-04-07 09:21:42 I snapshot:         GameInfo type=6 id=0 size=32
2024-04-07 09:21:42 I snapshot:                   0            0        00000000        m_GameFlags=0 (min=0 max=256)
2024-04-07 09:21:42 I snapshot:                   1            0        00000000        m_GameStateFlags=0 (min=0 max=256)
2024-04-07 09:21:42 I snapshot:                   2            0        00000000        m_RoundStartTick=0 (NetTick)
2024-04-07 09:21:42 I snapshot:                   3            0        00000000        m_WarmupTimer=0 (min=min_int(-2147483648) max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   4            0        00000000        m_ScoreLimit=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   5            0        00000000        m_TimeLimit=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   6            0        00000000        m_RoundNum=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   7            1        00000001        m_RoundCurrent=1 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:         (out of range) type=32767 id=0 size=12
2024-04-07 09:21:42 I snapshot:                   0    247983155        0ec7ec33
2024-04-07 09:21:42 I snapshot:                   1            9        00000009
2024-04-07 09:21:42 I snapshot:                   2           64        00000040
2024-04-07 09:21:42 I snapshot:         ClientInfo type=11 id=0 size=68
2024-04-07 09:21:42 I snapshot:                   0  -1008145940        c3e8e9ec        m_Name0=-1008145940     IntsToStr: Chil
2024-04-07 09:21:42 I snapshot:                   1   -320474428        ece5f2c4        m_Name1=-320474428      IntsToStr: lerD
2024-04-07 09:21:42 I snapshot:                   2   -220076049        f2e1e7ef        m_Name2=-220076049      IntsToStr: rago
2024-04-07 09:21:42 I snapshot:                   3   -293568512        ee808000        m_Name3=-293568512      IntsToStr: n
2024-04-07 09:21:42 I snapshot:                   4  -1330727040        b0aeb780        m_Clan0=-1330727040     IntsToStr: 0.7
2024-04-07 09:21:42 I snapshot:                   5  -2139062144        80808080        m_Clan1=-2139062144     IntsToStr:
2024-04-07 09:21:42 I snapshot:                   6  -2139062272        80808000        m_Clan2=-2139062272     IntsToStr:
2024-04-07 09:21:42 I snapshot:                   7           64        00000040        m_Country=64
2024-04-07 09:21:42 I snapshot:                   8   -403511835        e7f2e5e5        m_Skin0=-403511835      IntsToStr: gree
2024-04-07 09:21:42 I snapshot:                   9   -286001183        eef3f7e1        m_Skin1=-286001183      IntsToStr: nswa
2024-04-07 09:21:42 I snapshot:                  10   -219905920        f2e48080        m_Skin2=-219905920      IntsToStr: rd
2024-04-07 09:21:42 I snapshot:                  11  -2139062144        80808080        m_Skin3=-2139062144     IntsToStr:
2024-04-07 09:21:42 I snapshot:                  12  -2139062144        80808080        m_Skin4=-2139062144     IntsToStr:
2024-04-07 09:21:42 I snapshot:                  13  -2139062272        80808000        m_Skin5=-2139062272     IntsToStr:
2024-04-07 09:21:42 I snapshot:                  14            0        00000000        m_UseCustomColor=0 (min=0 max=1)
2024-04-07 09:21:42 I snapshot:                  15      7199301        006dda45        m_ColorBody=7199301
2024-04-07 09:21:42 I snapshot:                  16      2345678        0023cace        m_ColorFeet=2345678
2024-04-07 09:21:42 I snapshot:         PlayerInfo type=10 id=0 size=20
2024-04-07 09:21:42 I snapshot:                   0            1        00000001        m_Local=1 (min=0 max=1)
2024-04-07 09:21:42 I snapshot:                   1            0        00000000        m_ClientId=0 (min=0 max=MAX_CLIENTS-1(63))
2024-04-07 09:21:42 I snapshot:                   2            0        00000000        m_Team=0 (min=TEAM_SPECTATORS(-1) max=TEAM_BLUE(1))
2024-04-07 09:21:42 I snapshot:                   3        -9999        ffffd8f1        m_Score=-9999
2024-04-07 09:21:42 I snapshot:                   4            0        00000000        m_Latency=0
2024-04-07 09:21:42 I snapshot:         (out of range) type=32766 id=0 size=8
2024-04-07 09:21:42 I snapshot:                   0            1        00000001
2024-04-07 09:21:42 I snapshot:                   1            0        00000000
2024-04-07 09:21:42 I snapshot:         Character type=9 id=0 size=88
2024-04-07 09:21:42 I snapshot:                   0          176        000000b0        m_Tick=176
2024-04-07 09:21:42 I snapshot:                   1         1968        000007b0        m_X=1968
2024-04-07 09:21:42 I snapshot:                   2          913        00000391        m_Y=913
2024-04-07 09:21:42 I snapshot:                   3            0        00000000        m_VelX=0
2024-04-07 09:21:42 I snapshot:                   4            0        00000000        m_VelY=0
2024-04-07 09:21:42 I snapshot:                   5            0        00000000        m_Angle=0
2024-04-07 09:21:42 I snapshot:                   6            0        00000000        m_Direction=0 (min=-1 max=1)
2024-04-07 09:21:42 I snapshot:                   7            0        00000000        m_Jumped=0 (min=0 max=3)
2024-04-07 09:21:42 I snapshot:                   8           -1        ffffffff        m_HookedPlayer=-1 (min=-1 max=MAX_CLIENTS-1(63))
2024-04-07 09:21:42 I snapshot:                   9            0        00000000        m_HookState=0 (min=-1 max=5)
2024-04-07 09:21:42 I snapshot:                  10            0        00000000        m_HookTick=0 (NetTick)
2024-04-07 09:21:42 I snapshot:                  11         1968        000007b0        m_HookX=1968
2024-04-07 09:21:42 I snapshot:                  12          913        00000391        m_HookY=913
2024-04-07 09:21:42 I snapshot:                  13            0        00000000        m_HookDx=0
2024-04-07 09:21:42 I snapshot:                  14            0        00000000        m_HookDy=0
2024-04-07 09:21:42 I snapshot:                  15            1        00000001        m_PlayerFlags=1 (min=0 max=256)
2024-04-07 09:21:42 I snapshot:                  16           10        0000000a        m_Health=10 (min=0 max=10)
2024-04-07 09:21:42 I snapshot:                  17           10        0000000a        m_Armor=10 (min=0 max=10)
2024-04-07 09:21:42 I snapshot:                  18            0        00000000        m_AmmoCount=0 (min=0 max=10)
2024-04-07 09:21:42 I snapshot:                  19            1        00000001        m_Weapon=1 (min=0 max=NUM_WEAPONS-1(5))
2024-04-07 09:21:42 I snapshot:                  20            5        00000005        m_Emote=5 (min=0 max=6)
2024-04-07 09:21:42 I snapshot:                  21            0        00000000        m_AttackTick=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:         (out of range) type=32765 id=0 size=40
2024-04-07 09:21:42 I snapshot:                   0        49152        0000c000
2024-04-07 09:21:42 I snapshot:                   1            0        00000000
2024-04-07 09:21:42 I snapshot:                   2            2        00000002
2024-04-07 09:21:42 I snapshot:                   3            0        00000000
2024-04-07 09:21:42 I snapshot:                   4            0        00000000
2024-04-07 09:21:42 I snapshot:                   5            0        00000000
2024-04-07 09:21:42 I snapshot:                   6            0        00000000
2024-04-07 09:21:42 I snapshot:                   7            0        00000000
2024-04-07 09:21:42 I snapshot:                   8            1        00000001
2024-04-07 09:21:42 I snapshot:                   9            0        00000000
```
2024-09-07 15:28:25 +08:00
Dennis Felsing fc058fa432
Merge pull request #8906 from Robyt3/Client-Download-Gameserver-Fix
Fix map download fallback from game server
2024-09-06 22:11:02 +00:00
Dennis Felsing 3b22a3e02f
Merge pull request #8905 from furo321/hot-reload-super-crash
Fix crash with `hot_reload` while in `super`
2024-09-06 22:08:14 +00:00
Robert Müller ed1ef4e694 Fix map download fallback from game server
Do not reset the active map download's information before using the fallback map download.

Remove redundant calls of `ResetMapDownload` before disconnecting, as this already resets the map download.

Closes #8885. Regression from #8848.
2024-09-06 20:55:02 +02:00
furo 9103332e36 Fix crash with hot_reload while in super 2024-09-06 20:12:07 +02:00
Dennis Felsing 0948a53648
Merge pull request #8904 from furo321/fix-force-yes
Fix `random_unfinished_map` not working with `vote yes`
2024-09-06 17:34:21 +00:00
furo bbd34c9452 Fix random_unfinished_map not working with vote yes 2024-09-06 18:56:58 +02:00
Dennis Felsing e4282f100a
Merge pull request #8902 from KebsCS/pr-hotreload-lasttp
Add /lasttp to hot reload
2024-09-06 16:24:48 +00:00
KebsCS eb9e73f68b
Add /lasttp to hot reload 2024-09-06 16:31:46 +02:00
Dennis Felsing e0a95d14a6
Merge pull request #8898 from KebsCS/pr-country-filters
Change country and types filter behavior
2024-09-05 13:16:21 +00:00
KebsCS fa28ed77a6
Change country and types filter behavior 2024-09-05 14:24:11 +02:00
Dennis Felsing 5335813629
Merge pull request #8897 from KebsCS/pr-command-argument-validation
Fix /tpxy arg validation
2024-09-05 09:26:15 +00:00
KebsCS 796fa4275f
Fix tpxy arg validation 2024-09-05 11:04:03 +02:00
Dennis Felsing 5b0163d069
Merge pull request #8896 from dobrykafe/pr-auto-map-reload-setting
Add `ed_auto_map_reload` setting
2024-09-05 07:33:35 +00:00
dobrykafe c9e7e0f01b add ed_auto_map_reload setting 2024-09-05 00:23:03 +02:00
Dennis Felsing cf107a81a1
Merge pull request #8892 from ChillerDragon/pr_scoreboard_pause_game
Do not force scoreboard open when the game is paused
2024-09-04 07:15:29 +00:00
Robert Müller 4e2d7e2104
Merge pull request #8890 from dobrykafe/pr-player-name-07
Use player name function instead of config
2024-09-04 05:57:31 +00:00
ChillerDragon 74bb327799 Do not force scoreboard open when the game is paused
If the game is paused and a player joins a server (sv_tournament_mode 0)
The scoreboard will be forced open. Unless the client configured cl_scoreboard_on_death 0.

This can be quite annoying. Especially in the brand new 0.7 feature
where users can pause the game. Oy realized that this is a problem 12
year ago:

aec468a3c4 (diff-e0ff7a1d6079610adb64fc89fbfff23a381ed92f268d8fe188731a9e0c323b0aR389-R390)

For ddnet servers this would mostly affect tournaments where paused games are
used to give everyone enough time to download the map.

A open scoreboard also blocks broadcasts. So new users might miss the
admin announcements explaining why the game is paused.
2024-09-04 10:21:16 +08:00
dobrykafe 22d699fbc0 use player name function instead of config 2024-09-04 02:37:16 +02:00
Dennis Felsing 51c0b4dafc
Merge pull request #8888 from dobrykafe/pr-fix-updater
Add missing parentheses in updater code
2024-09-03 11:17:51 +00:00
dobrykafe 5f57ba9130 add missing parentheses in updater code 2024-09-03 12:44:02 +02:00
Dennis Felsing 69fa7ea18f
Merge pull request #8886 from furo321/use-str_copy
Use `str_copy` instead of `str_format` where possible
2024-09-03 07:08:54 +00:00
Dennis Felsing 41c40fb27f
Merge pull request #8883 from ChillerDragon/pr_actions_zoom
Add quick actions for zooming the view
2024-09-03 07:02:15 +00:00
furo 0664f12265 assert if str_format is used with no arguments 2024-09-03 08:49:55 +02:00
furo 8b5da71e89 Use str_copy instead of str_format where possible 2024-09-03 08:49:47 +02:00
ChillerDragon d0eebee44d Add quick actions for zooming the view 2024-09-03 09:58:36 +08:00
Dennis Felsing 1cbdb9d2f0
Merge pull request #8881 from rffontenelle/patch-8
Update brazilian_portuguese.txt
2024-09-02 21:37:22 +00:00
Dennis Felsing 8f79d4252c
Merge pull request #8882 from ewancg/master
make reconnect screen count down from 5-1 instead of 4-0
2024-09-02 21:37:07 +00:00
Ewan Green 7abad2b8a4 make reconnect screen count down from 5-1 instead of 4-0 2024-09-02 13:23:34 -06:00
Rafael Fontenelle c64b744ad3
Update brazilian_portuguese.txt 2024-09-02 16:02:39 -03:00
Dennis Felsing f599449f31
Merge pull request #8879 from furo321/conchain_browser
Add console chain for browser filters
2024-09-02 15:24:40 +00:00
Dennis Felsing 226d948acc Version 18.5 2024-09-02 17:02:21 +02:00
furo 58f14edb95 Add console chain for browser filters 2024-09-02 16:45:04 +02:00
Dennis Felsing a3fc627285
Merge pull request #8874 from ChillerDragon/pr_test_tooltip_style
Test tooltip description style
2024-09-02 06:17:10 +00:00
Dennis Felsing f79784bec7
Merge pull request #8873 from ChillerDragon/pr_actions_settings_and_history
Add quick actions Server settings and History
2024-09-02 06:16:31 +00:00
Dennis Felsing ccaddd2016
Merge pull request #8872 from ChillerDragon/pr_action_pipettte
Add quick action "Pipette"
2024-09-02 06:16:29 +00:00
Robert Müller 7a60f4a5e7
Merge pull request #8875 from ChillerDragon/pr_prompt_label_size
Grow prompt label if there is space and fix margins
2024-09-02 05:47:50 +00:00
ChillerDragon e9187cc352 Grow prompt label if there is space and fix margins
Closed #8867
2024-09-02 11:16:20 +08:00
ChillerDragon 2cf6622cd7 Test tooltip description style
See https://github.com/ddnet/ddnet/issues/8870
2024-09-02 10:32:55 +08:00
ChillerDragon 19a888734c Add quick actions Server settings and History 2024-09-02 09:23:21 +08:00
ChillerDragon 44fc871463 Add quick action "Pipette" 2024-09-02 09:13:03 +08:00
Dennis Felsing 157498799e
Merge pull request #8871 from BlaiZephyr/fix_inconsistency
fix inconsistent quickaction tooltips
2024-09-01 21:17:33 +00:00
BlaiZephyr a017190753 fix inconsistent quickaction labels 2024-09-01 20:09:06 +02:00
Dennis Felsing e17da385dd
Merge pull request #8869 from ChillerDragon/pr_fix_dead_order
Put dead players at the bottom of the scoreboard
2024-09-01 16:41:08 +00:00
Dennis Felsing bfc6a15df9
Merge pull request #8854 from Veydzher/patch-1
Update ukrainian.txt
2024-09-01 16:37:54 +00:00
ChillerDragon 2a26c1c5d6 Put dead players at the bottom of the scoreboard
Closed #8868
2024-09-01 19:17:03 +08:00
veydzh3r 624ac85e8c
Update ukrainian.txt 2024-09-01 10:29:39 +01:00
Dennis Felsing d9b031c887
Merge pull request #8864 from ChillerDragon/pr_gt_descs
Use same descriptions for game tile actions as the button
2024-09-01 09:21:09 +00:00
veydzh3r 403c4a40da
Update ukrainian.txt 2024-09-01 10:20:44 +01:00
Dennis Felsing 0e2960206a
Merge pull request #8865 from ChillerDragon/pr_action_toggle_grid
Add quick action "Toggle Grid"
2024-09-01 09:20:34 +00:00
veydzh3r a8616ef2ab
Merge branch 'ddnet:master' into patch-1 2024-09-01 11:57:42 +03:00
ChillerDragon 8b304cab23 Add quick action "Toggle Grid" 2024-09-01 16:23:04 +08:00
veydzh3r 9e88ca5846
Update ukrainian.txt 2024-09-01 09:23:03 +01:00
ChillerDragon 1b8e402a65 Use same descriptions for game tile actions as the button 2024-09-01 16:15:11 +08:00
Dennis Felsing 30acedaac5
Merge pull request #8820 from TsFreddie/resample
Resample to the device playback rate
2024-09-01 07:35:38 +00:00
Dennis Felsing bb3c76a290
Merge pull request #8834 from KebsCS/pr-command-argument-validation
Add validation for chat and console command arguments
2024-09-01 07:35:36 +00:00
Dennis Felsing 341e3f6ec7
Merge pull request #8842 from furo321/swedish-18.5
Update Swedish translations for 18.5
2024-09-01 07:33:52 +00:00
Dennis Felsing d4f72803be
Merge pull request #8860 from ChillerDragon/pr_action_gametiles
Add quick actions for game tiles
2024-09-01 07:33:46 +00:00
Dennis Felsing f2d5b83f84
Merge pull request #8863 from ChillerDragon/pr_sixup_enum
Use enum instead of magic number in skin color translation
2024-09-01 07:11:17 +00:00
Dennis Felsing fcf810cae1
Merge pull request #8862 from ChillerDragon/pr_consistent_nolint_fireweapon
Consistently apply the NOLINT comment for all sounds in FireWeapon
2024-09-01 07:11:03 +00:00
Dennis Felsing 50b0af1614
Merge pull request #8858 from ChillerDragon/pr_action_info
Add quick actions for Show Info Off/Dec/Hex
2024-09-01 07:05:57 +00:00
Dennis Felsing b5c11bc860
Merge pull request #8857 from ChillerDragon/pr_action_load_current_map
Add quick action "Load Current Map"
2024-09-01 07:05:55 +00:00
Dennis Felsing 7951136fab
Merge pull request #8861 from ChillerDragon/pr_prompt_fix_last_disabled
Fix editor prompt suggesting disabled last action
2024-09-01 07:05:30 +00:00
ChillerDragon 82ca4bc335 Use enum instead of magic number in skin color translation 2024-09-01 12:44:00 +08:00
ChillerDragon 5986ee03b9 Consistently apply the NOLINT comment for all sounds in FireWeapon
Most but not all sound creations in CCharacter::FireWeapon have this NOLINT comment.

Somehow clang does not get tripped on all of those. But sooner or later it might.
I currently got a new error in my downstream fork when tweaking
FireWeapon a bit. So I applied the NOLINT comment to ALL occurences in
FireWeapon not only the ones that clangd finds at the moment.
2024-09-01 11:39:17 +08:00
ChillerDragon e1cb617c42 Add quick actions for game tiles 2024-09-01 10:50:44 +08:00
ChillerDragon daad41fbd7 Fix editor prompt suggesting disabled last action
The editor prompt always has as a first entry the last action that ran.
But this entry should not show up if that action is currently disabled.
2024-09-01 10:42:55 +08:00
ChillerDragon ed49fef917 Add quick actions for Show Info Off/Dec/Hex 2024-09-01 08:53:04 +08:00
ChillerDragon e20250cd65 Add quick action "Load Current Map" 2024-09-01 08:15:58 +08:00
Dennis Felsing 36f0bcc509
Merge pull request #8618 from ChillerDragon/pr_editor_prompt
Add ctrl+p editor prompt (quick actions)
2024-08-31 21:42:48 +00:00
Dennis Felsing dd82cf83a2
Merge pull request #8853 from gerdoe-jr/master
Update russian.txt
2024-08-31 21:36:34 +00:00
Dennis Felsing 8ca93d451b
Merge pull request #8855 from ChillerDragon/pr_armor_progress
Only do armor progress hack in ddrace controller
2024-08-31 21:35:48 +00:00
Dennis Felsing 871f97a283
Merge pull request #8856 from ChillerDragon/pr_gun_damage
Call TakeDamage on projectile and laser hit (gun, shotgun and laser)
2024-08-31 21:35:16 +00:00
ChillerDragon 2c77aeef2b Add quick action to pick image for selected layer 2024-08-31 21:57:32 +08:00
ChillerDragon f053a29463 Add ctrl+p editor prompt (quick actions) 2024-08-31 21:57:31 +08:00
ChillerDragon f8a4e7dbab Call TakeDamage on projectile and laser hit (gun, shotgun and laser)
The grenade and hammer already triggered TakeDamage
now all weapons hitting a tee call the method again
2024-08-31 19:59:05 +08:00
ChillerDragon f44def1cdd Only do armor progress hack in ddrace controller
Only mess with the characters armor in ddrace controllers.
This allows other game modes to use the armor as actual armor.
2024-08-31 18:57:42 +08:00
veydzh3r bb45db8ad3
Update ukrainian.txt 2024-08-31 11:51:57 +01:00
Vlad 468900acfe typos in russian.txt 2024-08-31 13:44:09 +03:00
Dennis Felsing 6ab597a465
Merge pull request #8852 from JuraIBOZO/patch-8
Update russian.txt
2024-08-31 08:37:53 +00:00
Dennis Felsing a83248b9ec
Merge pull request #8851 from ChillerDragon/pr_chr_get_tuning
Simplify character tuning code
2024-08-31 08:24:42 +00:00
JuraIBOZO 383bef93b9 Update russian.txt 2024-08-31 10:19:36 +02:00
Robert Müller f0449befa5
Merge pull request #8841 from ChillerDragon/pr_unhardcode_07_gameflags
Share gameflags for 0.6/0.7 instead of hardcoding it
2024-08-31 07:38:22 +00:00
ChillerDragon c02a2ed1d6 Simplify character tuning code
entities/character.cpp now has the same api as prediction/entities/character.cpp
2024-08-31 10:41:39 +08:00
KebsCS d452bcda8f
Add validation for chat and console command arguments 2024-08-31 02:15:33 +02:00
Dennis Felsing 60688bf80e
Merge pull request #8850 from dobrykafe/pr-18.5-translations
Update Czech and Slovak translations for 18.5
2024-08-30 22:04:36 +00:00
dobrykafe 29a205a6d9 update slovak translations for 18.5 2024-08-30 22:18:45 +02:00
dobrykafe c10b466a40 update czech translations for 18.5 2024-08-30 22:18:35 +02:00
Dennis Felsing 914867d980
Merge pull request #8849 from furo321/fix-twlang-endline
Set correct end line in `twlang.py` for strings with context
2024-08-30 18:44:10 +00:00
furo d40cc86bfa Set correct end line in twlang.py for strings with context 2024-08-30 20:15:26 +02:00
Dennis Felsing f754054874
Merge pull request #8848 from Robyt3/Client-Map-Download-Reset-Cleanup
Fix map downloading overriding more recent map change messages
2024-08-30 16:20:48 +00:00
Robert Müller 05970178b2 Fix map downloading overriding more recent map change messages
Following sequence of events was possible:

1. HTTP map download for map X is started (e.g. client initially connects to server).
2. Map change message for map Y arrives while downloading (e.g. vote for another map has passed on the server).
3. Client already has map Y and loads it directly without starting or resetting the map download.
4. HTTP map download task for map X finishes.
5. Map X is loaded, overriding the map Y that should be loaded. This is one cause for #2804.

This could potentially also happen with the map download from the game-server, if the final map data chunk for a downloaded map is received directly after another map change message for a map which does not need to be downloaded, though this seems more unlikely.

This is fixed by resetting the current map download immediately after receiving a valid map change message instead of only when starting a new map download.

The relevant code to reset the map download is moved to `CClient::ResetMapDownload` to avoid duplicate code and ensure that the temporary map download file is always deleted and closed.
2024-08-30 17:54:38 +02:00
Dennis Felsing 3d5b533816
Merge pull request #8847 from EGYT5453/ua-18.5
Update Ukrainian l10n (18.5)
2024-08-30 09:16:10 +00:00
Andrii cdc5b9922a
Update Ukrainian l10n (18.5) 2024-08-30 10:41:55 +03:00
Dennis Felsing 528a38265e
Merge pull request #8846 from n0Ketchp/patch-21
Update spanish.txt
2024-08-30 06:52:17 +00:00
noKetchup 099ec44eac
Update spanish.txt 2024-08-30 00:29:21 -04:00
Dennis Felsing b641fdb8fd
Merge pull request #8845 from GokturkTalha/patch-11
Update Azerbaijanese translations for 18.5
2024-08-29 22:18:02 +00:00
Dennis Felsing e54fb30e72
Merge pull request #8844 from GokturkTalha/patch-10
Update Turkish translations for 18.5
2024-08-29 22:18:00 +00:00
Talha Aygün 325f908f09
Update Azerbaijanese translations for 18.5 2024-08-29 23:38:53 +03:00
Talha Aygün 870cff3da2
add author 2024-08-29 23:31:07 +03:00
Talha Aygün 4ea9ed9b2b
Update Turkish translations for 18.5 2024-08-29 23:29:27 +03:00
Jupeyy 98b0f50111
Merge pull request #8661 from DynamoFox/workaround-glew-on-wayland-partial-init
Workaround GLEW error code on init with Wayland
2024-08-29 18:21:08 +00:00
DynamoFox fe35322bb0 Workaround GLEW error code when calling glewInit() on Wayland
* Fixes OpenGL on Wayland when the GLX flavor of GLEW is linked
* Only if SDL2's video driver is "wayland" we also allow the
  GLEW_ERROR_NO_GLX_DISPLAY error code to be accepted as if glewInit()
  actually succeeded
* Hopefully this won't be needed anymore on future versions of GLEW when
  glewContextInit() is made part of the public API
2024-08-29 19:47:43 +02:00
Dennis Felsing 41cd82c2d3
Merge pull request #8653 from DynamoFox/force-sdl2-video-driver-selection-on-linux
Fix game launch on Wayland-only systems with SDL2.30+
2024-08-29 16:06:03 +00:00
Dennis Felsing 21375f0e1d
Merge pull request #8843 from Pioooooo/chinese-18.5
Update Chinese translations for 18.5
2024-08-29 13:42:23 +00:00
Pioooooo 55891afc50 Update Chinese translations for 18.5 2024-08-29 11:11:41 +00:00
furo 1d65fff3ff Update Swedish translations for 18.5 2024-08-29 12:46:11 +02:00
Robert Müller edcc3245f4
Merge pull request #8821 from def-/pr-transl-18.5
Update translations for 18.5, remove 0.7-only translations
2024-08-29 08:11:18 +00:00
Dennis Felsing 88739c5345 Update translations for 18.5, remove 0.7-only translations
Fix some minor stuff
2024-08-29 09:53:28 +02:00
Dennis Felsing da4bc09429
Merge pull request #8840 from Pioooooo/translation-fix
Update Chinese translations
2024-08-29 07:36:54 +00:00
ChillerDragon 43dee5d4c5 Share gameflags for 0.6/0.7 instead of hardcoding it
5cf0e5e997/datasrc/network.py (L8)
5cf0e5e997/datasrc/seven/network.py (L10)

0.6 game flags:

```python
GameFlags = ["TEAMS", "FLAGS"]
```

0.7 game flags:

```python
GameFlags = Flags("GAMEFLAG", ["TEAMS", "FLAGS", "SURVIVAL", "RACE"])
```

The 0.7 protocol extended the game flags without changing the old 0.6 flags.
So flag teams and flag flags are the same in both versions and 0.7 just
has additional flags.

The server is now sending the same m_GameFlags from the gamemode
controller to 0.6 and 0.7 connections. It clamps away the unsupported
flags for 0.6.

Before this commit the ddnet server would always send the hardcodet race
flag to 0.7 connections while ignoring what the gamemode set as a game
flag.
2024-08-29 15:15:48 +08:00
Pioooooo ba4f0368a4 Update Chinese translations 2024-08-29 04:34:17 +00:00
Dennis Felsing 5cf0e5e997
Merge pull request #8839 from dobrykafe/pr-create-07-skin-folder
Create 0.7 skin folder
2024-08-28 23:00:58 +00:00
dobrykafe 218ce1f53f create 0.7 skin folder 2024-08-29 00:36:06 +02:00
Dennis Felsing 91ae4ca120
Merge pull request #8838 from dobrykafe/pr-07-skins-directory
Add 0.7 skins directory button
2024-08-28 22:19:27 +00:00
dobrykafe 41fee0bb3f add 0.7 skins directory button 2024-08-28 23:57:12 +02:00
Dennis Felsing cc1dc405fe
Merge pull request #8837 from Robyt3/Android-Build-NDK-Version-Fix
Remove unnecessary `ndkVersion` from Gradle build
2024-08-28 17:12:22 +00:00
Robert Müller 1dd56f1a90 Remove unnecessary ndkVersion from Gradle build
Gradle can determine the NDK version automatically and this property is only required if multiple NDK versions are installed. The NDK version previously determined from the filename could not be parsed by Gradle anyway.
2024-08-28 18:12:05 +02:00
TsFreddie ecec1ff2a7 Resample to the device playback rate 2024-08-28 10:55:35 +08:00
Dennis Felsing 5a66dc05f4
Merge pull request #8828 from dobrykafe/pr-save-07-skins
Implement 0.7 skin save button
2024-08-27 21:50:23 +00:00
Dennis Felsing 7df1b24491
Merge pull request #8833 from furo321/vote-creator
Set `m_VoteCreator` when possible
2024-08-27 21:20:41 +00:00
dobrykafe 31ee6abe82 implement 0.7 skin save button 2024-08-27 23:18:43 +02:00
Dennis Felsing d78032e9a6
Merge pull request #8832 from Robyt3/Android-Shortcuts-Graphics-Backends
Add Android shortcuts for launching with Vulkan/OpenGL
2024-08-27 21:17:44 +00:00
Dennis Felsing 3d6820ab68
Merge pull request #8831 from furo321/fix-crash-hotreload
Fix `double free or corruption` crash with `hot_reload`
2024-08-27 21:16:58 +00:00
Dennis Felsing 8b7e5dee4d
Merge pull request #8830 from dobrykafe/pr-conchain-07-tee
Add console chain for 0.7 tee
2024-08-27 21:16:37 +00:00
Dennis Felsing 76c44cfb40
Merge pull request #8829 from furo321/use-getmapname
Use `GetMapName()` when getting the map name
2024-08-27 21:16:12 +00:00
furo f407adc61c Set m_VoteCreator when using force_vote 2024-08-27 21:44:00 +02:00
furo 9fbbf5cde7 Fix using random_unfinished_map from rcon 2024-08-27 21:43:22 +02:00
Robert Müller dc0d4b3b76 Add Android shortcuts for launching with Vulkan/OpenGL
Define shortcuts to launch the client with either Vulkan or OpenGL graphics backend, which can be accessed by long-pressing the app icon on the home screen. This feature is available for Android 7.1 and newer.
2024-08-27 21:04:43 +02:00
furo 9a7bc70f76 Fix double free or corruption crash with hot_reload 2024-08-27 20:44:55 +02:00
furo 0e016f9732 Use GetMapName() when getting the map name 2024-08-27 20:41:43 +02:00
dobrykafe cb57aa82bf add console chain for 0.7 tee 2024-08-27 20:01:27 +02:00
Robert Müller 14f1b36dd1
Merge pull request #8825 from KebsCS/pr-ghost-sorting
Add ghost list sorting
2024-08-27 16:55:22 +00:00
KebsCS 906f75c13a
Add ghost list sorting 2024-08-27 18:34:26 +02:00
Dennis Felsing 7c8f9b43ac
Merge pull request #8826 from bencie/announce-unfinishedmap-voter
Send result of `random_unfinished_map` to all clients
2024-08-27 15:25:12 +00:00
bencie c4ff37d9d9 Send result of random_unfinished_map to all clients 2024-08-27 16:37:15 +02:00
Dennis Felsing 3a2cecb8b4
Merge pull request #8823 from furo321/auto-reload-local-ips
Run editor auto-reload on any local address, and not just localhost
2024-08-27 11:29:14 +00:00
furo 358cd20183 Run editor auto-reload on any local address, and not just localhost 2024-08-27 13:05:52 +02:00
Dennis Felsing 9d920b3575
Merge pull request #8703 from sjrc6/pr_slider
Adjust slider handle size
2024-08-27 09:20:18 +00:00
Tater 5fb059ad92 Adjust slider handle size 2024-08-27 11:02:12 +02:00
Dennis Felsing 4b8dcc3315
Merge pull request #8811 from furo321/add-map-votes-directories
Add support for directories with `add_map_votes`
2024-08-27 08:59:25 +00:00
Dennis Felsing b30b493ab8
Merge pull request #8819 from Anime-pdf/master
speedup demo with mouse scroll only if menu is active
2024-08-27 07:15:38 +00:00
Dennis Felsing 29f3323735
Merge pull request #8813 from furo321/hot-reload-maps
Add `hot_reload` to reload map while preserving state
2024-08-27 07:03:05 +00:00
Paul 7c62b457b7 speedup demo with mouse scroll only if menu is active 2024-08-27 02:38:08 +03:00
furo 8b27a6e852 Add hot_reload to reload map while preserving state 2024-08-27 01:19:40 +02:00
Robert Müller 028bd148f3
Merge pull request #8806 from bencie/allow-reloading
Allow reloading current background entities map
2024-08-26 15:04:59 +00:00
Dennis Felsing 6e3b0910e1
Merge pull request #8800 from def-/pr-winarm
Add arm64 windows support
2024-08-26 12:08:22 +00:00
Dennis Felsing 9fd4adfb21
Merge pull request #8812 from dobrykafe/pr-popup-password
Show server info in password popup
2024-08-26 06:20:15 +00:00
dobrykafe d44c68a8a5 show server info in password popup 2024-08-26 01:32:47 +02:00
furo 8f6d5d453e Add support for directories with add_map_votes 2024-08-25 23:29:34 +02:00
Dennis Felsing 7ee1dac08b
Merge pull request #8809 from furo321/append-settings
Transfer server settings while using append
2024-08-25 21:13:50 +00:00
Dennis Felsing 2fc3f81725
Merge pull request #8808 from furo321/collapse-all-button-editor
Add button to collapse/expand all groups in editor
2024-08-25 21:13:27 +00:00
Dennis Felsing 8e16113428
Merge pull request #8807 from furo321/no-input-while-opening
Don't allow input in console while it is opening/closing
2024-08-25 20:59:00 +00:00
furo 7628783e95 Transfer server settings while using append 2024-08-25 20:20:13 +02:00
furo 59dd8735bf Add button to collapse/expand all groups in editor 2024-08-25 19:41:10 +02:00
furo 0b27a47553 Don't allow input in console while it is opening/closing 2024-08-25 19:09:09 +02:00
bencie d8e82bbb1d Allow reloading current background entities map 2024-08-25 18:23:25 +02:00
Robert Müller 77790f677e
Merge pull request #8803 from furo321/file-picker-entities
Add a popup for picking a map for background entities setting
2024-08-25 10:00:46 +00:00
Dennis Felsing cd3e85f532
Merge pull request #8804 from furo321/validate-languages-ci
Validate language files for `…` and non-matching formatters in CI
2024-08-24 23:15:05 +00:00
furo 10376fa4ff Fix language files that failed validation 2024-08-25 00:40:42 +02:00
furo 728bb9777f Validate language files for and non-matching formatters 2024-08-25 00:40:12 +02:00
Schrodinger ZHU Yifan 83c3b4ea89 Add arm64 windows support 2024-08-25 00:02:43 +02:00
furo 6c0e42987e Add a popup for picking a map for background entities setting 2024-08-24 22:32:13 +02:00
Dennis Felsing be2e49e1f6
Merge pull request #8801 from Robyt3/Client-Touch-Input-Emote-Spectate
Add touch support to emoticon selector and spectator menu, minor refactoring
2024-08-24 15:05:18 +00:00
Dennis Felsing 4786419fee
Merge pull request #8802 from Robyt3/Android-Building-Small-Fixes
Minor improvements to Android building
2024-08-24 15:05:16 +00:00
Robert Müller 24356bd029 Set debuggable flag in Gradle debug build
So the debug build of the app can be debugged.
2024-08-24 13:44:52 +02:00
Robert Müller e46d2375ba Add note to Android README about using stable rust version 2024-08-24 13:44:47 +02:00
Robert Müller 9b90588ccc Pin curl version to 8.8.0 for Android to fix library building 2024-08-24 13:44:40 +02:00
Dennis Felsing e9a9261d1e
Merge pull request #8799 from Robyt3/Client-Menu-Ingame-Margin-Fix
Fix inconsistent margin in ingame menu, minor refactoring
2024-08-24 11:26:18 +00:00
Robert Müller ed9720f1be Minor refactoring of emoticon selector rendering
- Extract variable `ScreenCenter`.
- Rename variables `i` to `Emote`.
- Move variable declarations closer to their usages.
2024-08-24 13:23:23 +02:00
Robert Müller 3bda76ff1f Add touch support to emoticon selector and spectator menu
Support using emoticon selector and spectator menu with touch inputs. Touching in the emoticon selector activates the selected (eye) emote and closes the emoticon selector. The spectator menu is kept open when using it for more convenience. The emoticon selector and spectator menu can be closed by touching anywhere outside of them.

Additionally, the emoticon selector and specator menu can now be closed by pressing the Escape key (i.e. the back button on Android). This made it necessary to change the order of the components for input handling, so the ingame menu will handle the Escape key after the emoticon selector and spectator menu. This also means that the Escape key can now be used to close the selector/menu when they are stuck open, which was previously delayed until ingame menu or console were opened and closed.
2024-08-24 13:21:58 +02:00
Robert Müller 93675799e8 Fix inconsistent margin in ingame menu, minor refactoring
The additional margin left of the Spectate and Join game buttons is unnecessary.

Avoid reusing `s_SpectateButton` variable for different buttons.

Use `TEAM_RED` instead of `0` when joining game in non-team server.
2024-08-24 12:21:23 +02:00
Dennis Felsing 3cf3e2339d
Merge pull request #8796 from ZucchiniEnjoyer/update-belarusian-18.4
Update belarusian translation for 18.4
2024-08-23 22:00:10 +00:00
Pavukoplov 7ee735a274 Update belarusian translation for 18.4 2024-08-24 00:03:29 +03:00
Dennis Felsing 5dff5e9e81
Merge pull request #8795 from furo321/cjsonwriter-master
Use `CJsonWriter` for creating server info JSON
2024-08-23 18:25:44 +00:00
furo f897af8dbb Use CJsonWriter for creating server info JSON 2024-08-23 20:07:11 +02:00
Dennis Felsing 96beaf2eca
Merge pull request #8793 from furo321/proof-borders-desc
Improve "Proof borders" description
2024-08-23 17:52:11 +00:00
Dennis Felsing b1914e972a
Merge pull request #8794 from furo321/fix-team0mode-bug
Don't keep `m_DDRaceState` and `m_StartTime` of teammate in team0mode after death
2024-08-23 17:12:09 +00:00
furo b9a794121a Don't keep m_DDRaceState and m_StartTime of teammate in team0mode after death 2024-08-23 18:40:15 +02:00
furo a01e5e7151 Improve "Proof borders" description 2024-08-23 17:06:59 +02:00
Dennis Felsing 37fd57ccb8
Merge pull request #8791 from ChillerDragon/pr_censor_save_code_fix
Fix save code not being censored in streamer mode
2024-08-23 11:39:36 +00:00
ChillerDragon 56b56ef2b9 Fix save code not being censored in streamer mode
Closed #8790
2024-08-23 19:20:15 +08:00
Dennis Felsing 0013615da1
Merge pull request #8789 from Robyt3/Client-UI-Convenience
Add `CUIRect::TopLeft` and `Size` convenience functions
2024-08-22 22:43:59 +00:00
Robert Müller 4d09332b83 Add CUIRect::TopLeft and Size convenience functions 2024-08-22 21:52:27 +02:00
Dennis Felsing e81a561702
Merge pull request #8787 from lolipodass/patch-9
Update russian.txt to match wiki
2024-08-22 18:14:06 +00:00
lolipodass a3c8949d40
Update russian.txt to match wiki
fix names like in https://wiki.ddnet.org/wiki/Dummy/ru
and https://wiki.ddnet.org/wiki/Common_Terminology/ru#Тии
2024-08-22 20:55:40 +03:00
Dennis Felsing 0ba6d998a4
Merge pull request #8786 from ChillerDragon/pr_fix_doubled_06_sounds
Fix sounds being doubled in 0.6
2024-08-22 12:00:06 +00:00
ChillerDragon 804a91ced0 Fix sounds being doubled in 0.6
Closed #8785
2024-08-22 19:41:14 +08:00
Dennis Felsing 5210d77f92
Merge pull request #8781 from def-/pr-fix
Disallow save with draggers
2024-08-22 09:38:46 +00:00
Dennis Felsing f796309cc8 Fix save/swap with draggers 2024-08-22 00:47:06 +02:00
Jupeyy fe9c2d305f
Merge pull request #8784 from Robyt3/Android-Backbutton-Handling-Revert
Revert "Quit if Android back-button is pressed 3 times within 1 second"
2024-08-21 17:54:23 +00:00
Robert Müller 499ad48ee6 Revert "Quit if Android back-button is pressed 3 times within 1 second"
This reverts commit 91848f0be6.

This was prone to accidental usage. The user interface is now usable with touch input, so this additional method to quickly and cleanly quit the game is not necessary anymore.
2024-08-21 19:30:59 +02:00
Dennis Felsing 4dc7346b4f
Merge pull request #8783 from Robyt3/Menus-Skin-ColorPicker-Cleanup
Use HSLA scrollbar color picker for 0.7 tee settings, refactor HSLA scrollbar color picker rendering
2024-08-21 17:10:27 +00:00
Robert Müller 992f235f05 Use HSLA scrollbar color picker for 0.7 tee settings
Use the same HSLA scrollbar color picker for the 0.7 tee settings as for the 0.6 tee settings. Use the correct darkest lighting value for 0.7 skin color pickers instead of not clamping the lighting value in the color picker.
2024-08-21 18:05:51 +02:00
Robert Müller ce0e52851c Refactor CSkins7::GetColor function
Use existing color constructor to conditionally unpack the alpha component instead of doing this separately.

Make `DARKEST_COLOR_LGT` a `float` constant instead of using an `enum` to simplify the usage.
2024-08-21 17:57:56 +02:00
Robert Müller abf8fac568 Refactor HSLA scrollbar color picker rendering
Rename `CMenus::RenderHSLScrollbars` function to `RenderHslaScrollbars`.

Pass darkest light value as `float` to the `RenderHslaScrollbars` function to add support for different values, instead of enabling the clamping with a `bool` parameter. Previously, this parameter was always set to `true`, as this type of color picker is only used for skins.

Remove unnecessarily complicated code for rendering unclamped lighting scrollbar. The code can be simplified by considering the darkest lighting value as a variable.

Let the `RenderHslaScrollbars` function return `true` if the color was changed to simplify the usage. The function previously returned the color but this value was unused.

Use `IGraphics::SetColor4` function instead of `IGraphics::SetColorVertex` when possible. Rename variables `Array` to `aColorVertices`. Use `std::size` instead of hard-coding array sizes.
2024-08-21 17:57:56 +02:00
Robert Müller 01d2b3e3bc Highlight hovered and active color picker scrollbar handle
Add visual feedback to color picker scrollbar handle being hovered and active.
2024-08-21 17:57:56 +02:00
Dennis Felsing db9b5f5b61
Merge pull request #8782 from ChillerDragon/pr_fix_sixup_sounds
Fix sixup sounds
2024-08-21 15:07:33 +00:00
ChillerDragon dcd1fefa7e Never send sounds to sixup that are played on the client side
Closed #2523
2024-08-21 22:02:39 +08:00
ChillerDragon 00b9eab2ce Rename CHAT_SIX/SEVEN to more generic FLAG_SIX/SEVEN 2024-08-21 21:33:34 +08:00
Dennis Felsing 1ebfe269aa
Merge pull request #8780 from ChillerDragon/pr_ed_fix_prop_clamp
Fix editor properties not being clamped on + and - button click
2024-08-21 13:10:34 +00:00
ChillerDragon 99ae72c143 Fix editor properties not being clamped on + and - button click
Closed #8778
2024-08-21 19:48:10 +08:00
Dennis Felsing 54271aef2a
Merge pull request #8776 from Robyt3/Base-Semaphore-macOS-Unique-Name
Make macOS semaphore names more unique, improve assertion
2024-08-20 18:50:17 +00:00
Robert Müller 839c511af4 Make macOS semaphore names more unique, improve assertion
On macOS, semaphore names are global and processes can open semaphores of other processes by using their name. It was possible that multiple client/server processes randomly tried to create semaphores with the same memory address, which would cause them to have the same name. In that case, `sem_open` would fail because `O_EXCL` prevents creating semaphores if the name is already used.

This is made more unlikely by also including the PID in the semaphore name. Additionally, the semaphore name is prefixed with `/` to more closely follow the construction rules for semaphore names. In particular, the behavior is implementation-defined if the name is not prefixed with a slash.

See https://pubs.opengroup.org/onlinepubs/9799919799/functions/sem_open.html

Closes #8773.

More details are added to the assertion error message in case this does not end up fixing the issue.
2024-08-20 20:25:56 +02:00
Dennis Felsing 580b2690a0
Merge pull request #8774 from heinrich5991/pr_ddnet_no_ban_vpn
Don't show "you've been banned" for VPN bans
2024-08-20 15:32:59 +00:00
heinrich5991 87aa251d73 Don't show "you've been banned" for VPN bans
Players are supposed to turn of their VPN or complain to the admins if
they get banned for using a VPN. Calling this "banned" seems to be
confusing, as players ask for an unban even after they turned off the
VPN.
2024-08-20 16:51:37 +02:00
Dennis Felsing 238e7495d2
Merge pull request #8771 from SoulyVEVO/pr_07_fix_feet_offset
fix 0.7 feet offset
2024-08-20 07:22:17 +00:00
Robert Müller 30f49201e5
Merge pull request #8764 from ChillerDragon/pr_cfgcol_07_marking
Use color type for 0.7 marking configs
2024-08-20 05:53:33 +00:00
ChillerDragon ef2db30bef Make 0.7 skin color variables unsigned to get rid of the casts 2024-08-20 11:49:04 +08:00
ChillerDragon 15713d7859 Use color type for 0.7 marking configs 2024-08-20 11:23:26 +08:00
Dennis Felsing 1dd2f3a4af
Merge pull request #8772 from Robyt3/Client-Input-Clipboard-String
Use `std::string` for `IInput::GetClipboardText`
2024-08-19 17:25:43 +00:00
Robert Müller 40fbc2140b Use std::string for IInput::GetClipboardText
Simplify clipboard handling by returning an `std::string` and freeing the string returned by SDL immediately, so the clipboard data does not stay in memory unnecessarily after the clipboard has been used until the clipboard data is requested again.

Fix possible TOCTOU when pasting from the clipboard into a lineinput, due to the clipboard data being requested twice.
2024-08-19 19:03:49 +02:00
Souly 4fb3027bd7
fix 0.7 feet offset
fix 0.7 feet offset
2024-08-19 15:34:44 +02:00
Dennis Felsing 89cc2d46a8
Merge pull request #8766 from Matodor/pr_inputs_missing_zoom_scale
Fixed missing TargetX/TargetY zoom scale apply in CControls::SnapInput
2024-08-19 06:55:54 +00:00
Robert Müller 288f999e9d
Merge pull request #8769 from ChillerDragon/pr_delete_skins7_hotkey
Add delete hotkey for 0.7 skins
2024-08-19 05:12:48 +00:00
ChillerDragon 66e3f619c7 Add delete hotkey for 0.7 skins 2024-08-19 12:00:55 +08:00
Dennis Felsing 474dae5ead check 2024-08-18 23:55:08 +02:00
Matodor ddd13ba4fc fix: fixed missing TargetX/TargetY zoom scale apply in CControls::SnapInput 2024-08-19 00:52:36 +05:00
Dennis Felsing 8dd2b6e9e6
Merge pull request #8765 from Robyt3/Client-Menus7-Interactive-Tee-Fixes
Improve interactive tee in 0.7 tee settings
2024-08-18 10:33:27 +00:00
Robert Müller b9ab23405e
Merge pull request #8759 from Bamcane/client-sixup-fix
Fix client sixup translation context
2024-08-18 10:33:07 +00:00
Bamcane 5c2ab4cb92 Fix client sixup translation context
Co-authored-by: Robyt3 <robytemueller@gmail.com>
2024-08-18 18:14:27 +08:00
Robert Müller 2eff7ecb61 Improve interactive tee in 0.7 tee settings
- Fix value `0` being used for sound volume, so the tee sound was not audible.
- Use `DoButtonLogic` to trigger sound to ensure it does not play while other UI elements are active.
- Remove unnecessay `MousePosition` variable by using `MousePos` function instead.
2024-08-18 12:08:20 +02:00
Dennis Felsing 96e946d504
Merge pull request #8751 from ChillerDragon/pr_grass_main_07_vanilla
Restore grass_main_0.7.png vanilla compability
2024-08-18 08:18:31 +00:00
Dennis Felsing ddfd4dbfb1
Merge pull request #8763 from ChillerDragon/pr_remove_ddnet_hotui
Remove ddnet_hotui hook
2024-08-18 07:22:22 +00:00
Dennis Felsing 21807c15bd
Merge pull request #8744 from ChillerDragon/pr_color_speed
Color speed in hud based on increase or decrease
2024-08-18 07:19:11 +00:00
ChillerDragon 789fee99df Remove ddnet_hotui hook 2024-08-18 15:02:33 +08:00
Dennis Felsing f569981eb5
Merge pull request #8755 from ChillerDragon/pr_delete_07_skins
Implement 0.7 delete skin button
2024-08-18 06:44:10 +00:00
Dennis Felsing 1758bfc7f9
Merge pull request #8730 from ChillerDragon/pr_07_separate_dummy_skins
Support different skin states for dummy and main in 0.7 connections
2024-08-18 06:42:24 +00:00
Dennis Felsing e008f40a19
Merge pull request #8761 from ChillerDragon/pr_race7_nullptr
Fix race 0.7 check null pointer dereference
2024-08-18 06:36:45 +00:00
Dennis Felsing 830aff899a
Merge pull request #8760 from ChillerDragon/pr_ddnet_grass
Rename grass_main_0.7 to ddnet_grass
2024-08-18 06:35:19 +00:00
Dennis Felsing b05ffeae3b
Merge pull request #8762 from ChillerDragon/pr_fix_dummy7_marking_alpha
Fix 0.7 dummy marking alpha being reset
2024-08-18 06:34:56 +00:00
Dennis Felsing 9fe2203a24
Merge pull request #8754 from ChillerDragon/pr_fix_06_demo_cutting
Fix cutting 0.6 demos
2024-08-18 06:29:33 +00:00
ChillerDragon 99fe6b09ed Fix 0.7 dummy marking alpha being reset
Closed #8757
2024-08-18 11:06:40 +08:00
ChillerDragon fa1ee98f1e Fix race 0.7 check null pointer dereference
Found by @fokkonaut in https://github.com/ddnet/ddnet/pull/8707

Co-authored-by: fokkonaut <35420825+fokkonaut@users.noreply.github.com>
2024-08-18 10:57:56 +08:00
ChillerDragon 6121be1bf1 Rename grass_main_0.7 to ddnet_grass
ddnet did extend the tileset so it is no longer matching the 0.7 grass_main
renaming the file makes that clear and allows for further extensions of
the file without breaking teeworlds 0.7 compability.

Also it frees the filename grass_main_0.7.png to be used by the ddnet
0.7 client mode so it can display the correct mapres on 0.7 connections.
2024-08-18 10:32:33 +08:00
ChillerDragon 64c7ab677d Color speed in hud based on increase or decrease 2024-08-18 10:32:00 +08:00
ChillerDragon 8d7c99fb96 Implement 0.7 delete skin button
See #8750
2024-08-18 10:17:13 +08:00
ChillerDragon e8fbb440b9 Fix cutting 0.6 demos
Closed #8748
2024-08-18 10:05:58 +08:00
Dennis Felsing b16bc401a8
Merge pull request #8716 from ChillerDragon/pr_hide_url_for_06
Hide address url for 0.6 ips (Closed #8712)
2024-08-17 17:42:30 +00:00
ChillerDragon 31cc4c24bf Restore grass_main_0.7.png vanilla compability
Reset to the current teeworlds version. Removing the ddnet specific
extension from 2015.

929919d44b (diff-d3cf443ce462f6e0cf9543319e40497f2c93505528a40cb7d923781643094f99)

Closed #8747

```
$ wget https://raw.githubusercontent.com/teeworlds/teeworlds/a1911c8f7d8458fb4076ef8e7651e8ef5e91ab3e/datasrc/mapres/grass_main.png -O grass_main_0.7.png
$ dilate grass_main_0.7.png
```
2024-08-17 00:36:14 +08:00
ChillerDragon 933a43bd0f Make render m_Sixup an array for dummy 2024-08-16 22:32:03 +08:00
ChillerDragon 7cffdf40b6 Make gameclient m_Sixup an array for dummy 2024-08-16 22:30:58 +08:00
heinrich5991 f057898ce0
Merge pull request #8745 from ChillerDragon/pr_07_hook_coll
Fix hook coll on vanilla 0.7 servers
2024-08-16 12:56:24 +00:00
ChillerDragon fac02650f1 Fix hook coll on vanilla 0.7 servers
Thanks to @fokkonaut for this F-Client commit

8ecd8c7f0a

Closed #8742
2024-08-16 19:12:42 +08:00
heinrich5991 aaf69542b6
Merge pull request #8739 from ChillerDragon/pr_log_error_crc
Use error log level for snap crc errors
2024-08-16 08:21:30 +00:00
Dennis Felsing 8d024be37c
Merge pull request #8738 from ChillerDragon/pr_increase_max_tmp_cmd_len
Increase max temp cmp length
2024-08-16 07:50:40 +00:00
Chiller Dragon 87aa664899
Lower the cmd length to 64
Co-authored-by: Dennis Felsing <dennis@felsing.org>
2024-08-16 15:32:53 +08:00
Dennis Felsing 6a4a70fddd
Merge pull request #8736 from ChillerDragon/pr_fix_06_chat_skins
Fix old 0.7 skins overwriting 0.6 skins in chat
2024-08-16 06:49:48 +00:00
Dennis Felsing de206b27d1
Merge pull request #8737 from ChillerDragon/pr_rm_setdtile
Remove unused function declaration SetDTile
2024-08-16 06:49:34 +00:00
ChillerDragon 1f0467b545 Use error log level for snap crc errors
A snapshot crc error should not happen.
If it does happen it will cause lags and it means something is really wrong.
2024-08-16 13:34:38 +08:00
ChillerDragon 04c141828f Increase max temp cmp length
Fixes long rcon commands being cut off on custom servers.
2024-08-16 13:01:35 +08:00
ChillerDragon a77895711b Remove unused function declaration SetDTile 2024-08-16 12:48:01 +08:00
ChillerDragon 81de29565d Fix old 0.7 skins overwriting 0.6 skins in chat
Closed #8731
2024-08-16 12:37:05 +08:00
Dennis Felsing 6a5a0436bf
Merge pull request #8734 from Robyt3/Client-Asset-Leak
Fix asset images not being freed if they fail ratio/format check
2024-08-15 22:24:02 +00:00
Robert Müller 595f537625 Fix asset images not being freed if they fail ratio/format check 2024-08-15 21:44:07 +02:00
ChillerDragon 7fa2306138 Hide address url for 0.6 ips (Closed #8712) 2024-08-14 18:25:10 +08:00
DynamoFox a013372be4 Fix game launch on Wayland-only systems with SDL2.30+ 2024-08-01 16:36:44 +02:00
177 changed files with 5675 additions and 2181 deletions

View file

@ -40,6 +40,8 @@ jobs:
run: scripts/fix_style.py --dry-run
- name: Check header guards
run: scripts/check_header_guards.py
- name: Validate Languages
run: scripts/languages/validate.py
- name: Check languages
run: scripts/languages/update_all.py
- name: Check dilated images

View file

@ -40,7 +40,9 @@ else()
set(TARGET_BITS "64")
endif()
if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64")
if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm"
OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64"
OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "ARM64")
if(TARGET_BITS STREQUAL "32")
set(TARGET_CPU_ARCHITECTURE "arm")
else()
@ -1391,6 +1393,7 @@ set(EXPECTED_DATA
editor/audio_source.png
editor/automap/basic_freeze.rules
editor/automap/ddmax_freeze.rules
editor/automap/ddnet_grass.rules
editor/automap/ddnet_tiles.rules
editor/automap/ddnet_walls.rules
editor/automap/desert_main.rules
@ -1399,7 +1402,6 @@ set(EXPECTED_DATA
editor/automap/generic_unhookable.rules
editor/automap/generic_unhookable_0.7.rules
editor/automap/grass_main.rules
editor/automap/grass_main_0.7.rules
editor/automap/jungle_main.rules
editor/automap/jungle_midground.rules
editor/automap/round_tiles.rules
@ -1487,6 +1489,7 @@ set(EXPECTED_DATA
mapres/bg_cloud2.png
mapres/bg_cloud3.png
mapres/ddmax_freeze.png
mapres/ddnet_grass.png
mapres/ddnet_start.png
mapres/ddnet_tiles.png
mapres/ddnet_walls.png
@ -2126,6 +2129,7 @@ set_src(ENGINE_SHARED GLOB_RECURSE src/engine/shared
teehistorian_ex.cpp
teehistorian_ex.h
teehistorian_ex_chunks.h
translation_context.cpp
translation_context.h
uuid_manager.cpp
uuid_manager.h
@ -2458,6 +2462,7 @@ if(CLIENT)
editor_trackers.cpp
editor_trackers.h
editor_ui.h
enums.h
explanations.cpp
layer_selector.cpp
layer_selector.h
@ -2496,8 +2501,13 @@ if(CLIENT)
mapitems/sound.cpp
mapitems/sound.h
popups.cpp
prompt.cpp
prompt.h
proof_mode.cpp
proof_mode.h
quick_action.h
quick_actions.cpp
quick_actions.h
smooth_value.cpp
smooth_value.h
tileart.cpp
@ -2920,6 +2930,7 @@ if(GTEST_FOUND OR DOWNLOAD_GTEST)
compression.cpp
csv.cpp
datafile.cpp
editor.cpp
fs.cpp
git_revision.cpp
hash.cpp
@ -3110,6 +3121,8 @@ set(CPACK_GENERATOR TGZ TXZ)
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
if(TARGET_OS STREQUAL "mac")
set(CPACK_STRIP_FILES FALSE)
elseif(TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(CPACK_STRIP_FILES FALSE)
else()
set(CPACK_STRIP_FILES TRUE)
endif()
@ -3123,7 +3136,11 @@ set(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME})
if(TARGET_OS AND TARGET_BITS)
if(TARGET_OS STREQUAL "windows")
set(CPACK_SYSTEM_NAME "win${TARGET_BITS}")
if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(CPACK_SYSTEM_NAME "win-arm64")
else()
set(CPACK_SYSTEM_NAME "win${TARGET_BITS}")
endif()
set(CPACK_GENERATOR ZIP)
elseif(TARGET_OS STREQUAL "linux")
# Let compiler tell its arch
@ -3384,7 +3401,7 @@ foreach(ext zip tar.gz tar.xz)
endforeach()
foreach(target ${CPACK_TARGETS})
list(APPEND COPY_TARGET_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${TMPDIR}/)
if(NOT TARGET_OS STREQUAL "mac")
if(NOT TARGET_OS STREQUAL "mac" AND NOT (TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64"))
list(APPEND STRIP_TARGET_COMMANDS COMMAND strip -s ${TMPDIR}/$<TARGET_FILE_NAME:${target}>)
endif()
endforeach()

View file

@ -26,8 +26,11 @@ if(CURL_FOUND)
is_bundled(CURL_BUNDLED "${CURL_LIBRARY}")
set(CURL_LIBRARIES ${CURL_LIBRARY})
set(CURL_INCLUDE_DIRS ${CURL_INCLUDEDIR})
if(CURL_BUNDLED AND TARGET_OS STREQUAL "windows")
if (CURL_BUNDLED AND TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(CURL_COPY_FILES
"${EXTRA_CURL_LIBDIR}/libcurl-4.dll"
)
elseif(CURL_BUNDLED AND TARGET_OS STREQUAL "windows")
set(CURL_COPY_FILES
"${EXTRA_CURL_LIBDIR}/libcurl.dll"
"${EXTRA_CURL_LIBDIR}/zlib1.dll"

View file

@ -11,11 +11,18 @@ if(TARGET_OS STREQUAL "windows")
if(NOT EXCEPTION_HANDLING_BUNDLED)
message(FATAL_ERROR "could not find exception handling paths")
endif()
set(EXCEPTION_HANDLING_COPY_FILES
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/exchndl.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbgcore.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbghelp.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/mgwhelp.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/symsrv.dll"
)
if(TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(EXCEPTION_HANDLING_COPY_FILES
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/exchndl.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/mgwhelp.dll"
)
else()
set(EXCEPTION_HANDLING_COPY_FILES
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/exchndl.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbgcore.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbghelp.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/mgwhelp.dll"
"${EXTRA_EXCEPTION_HANDLING_LIBDIR}/symsrv.dll"
)
endif()
endif()

View file

@ -31,7 +31,9 @@ if(FREETYPE_FOUND)
is_bundled(FREETYPE_BUNDLED "${FREETYPE_LIBRARY}")
set(FREETYPE_COPY_FILES)
if(FREETYPE_BUNDLED)
if(TARGET_OS STREQUAL "windows")
if(TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype-6.dll")
elseif(TARGET_OS STREQUAL "windows")
set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype.dll")
elseif(TARGET_OS STREQUAL "mac")
set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype.6.dylib")

View file

@ -29,12 +29,21 @@ set(OPUSFILE_INCLUDE_DIRS ${OPUSFILE_INCLUDEDIR})
if(OPUSFILE_FOUND)
is_bundled(OPUSFILE_BUNDLED "${OPUSFILE_LIBRARY}")
if(OPUSFILE_BUNDLED AND TARGET_OS STREQUAL "windows")
set(OPUSFILE_COPY_FILES
"${EXTRA_OPUSFILE_LIBDIR}/libogg.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libopus.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libopusfile.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll"
)
if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(OPUSFILE_COPY_FILES
"${EXTRA_OPUSFILE_LIBDIR}/libopusfile-0.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libopus-0.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libogg-0.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll"
)
else()
set(OPUSFILE_COPY_FILES
"${EXTRA_OPUSFILE_LIBDIR}/libogg.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libopus.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libopusfile.dll"
"${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll"
)
endif()
if(TARGET_BITS EQUAL 32)
list(APPEND OPUSFILE_COPY_FILES
"${EXTRA_OPUSFILE_LIBDIR}/libgcc_s_sjlj-1.dll"

View file

@ -40,6 +40,12 @@ if(SQLite3_FOUND)
is_bundled(SQLite3_BUNDLED "${SQLite3_LIBRARY}")
set(SQLite3_COPY_FILES)
if(SQLite3_BUNDLED AND TARGET_OS STREQUAL "windows")
set(SQLite3_COPY_FILES "${EXTRA_SQLite3_LIBDIR}/sqlite3.dll")
if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64")
set(SQLite3_COPY_FILES
"${EXTRA_SQLite3_LIBDIR}/libsqlite3-0.dll"
)
else()
set(SQLite3_COPY_FILES "${EXTRA_SQLite3_LIBDIR}/sqlite3.dll")
endif()
endif()
endif()

View file

@ -1,4 +1,7 @@
if(TARGET_OS STREQUAL "windows")
# only find ssp when toolchain is gcc
if(TARGET_OS STREQUAL "windows"
AND NOT CMAKE_C_COMPILER_ID STREQUAL "Clang"
AND NOT CMAKE_C_COMPILER_ID STREQUAL "MSVC")
set_extra_dirs_lib(SSP ssp)
find_file(SSP_LIBRARY
NAMES libssp-0.dll

View file

@ -0,0 +1,12 @@
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-w64-mingw32-clang)
set(CMAKE_CXX_COMPILER aarch64-w64-mingw32-clang++)
set(CMAKE_RC_COMPILER aarch64-w64-mingw32-windres)
set(CMAKE_RUST_COMPILER_TARGET aarch64-pc-windows-gnullvm)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

View file

@ -275,9 +275,6 @@ Player
Player country:
== ﺐﻋﻼﻟﺍ ﺪﻠﺑ:
Player options
== ﺐﻋﻼﻟﺍ ﺕﺍﺩﺍﺪﻋﺍ
Players
== ﻦﻴﺒﻋﻻ
@ -773,9 +770,6 @@ Skin prefix
Show HUD
== ﻞﻜﺸﻟﺍ ﺭﺎﻬﻇﺍ
Reload
== ﻞﻴﻤﺤﺘﻟﺍ ﺓﺩﺎﻋﺍ
9+ new mentions
== 9+ ﺓﺪﻳﺪﺟ ﺕﺍﺭﺎﻌﺷﺍ
@ -1026,9 +1020,6 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode.
Existing Player
== ﺩﻮﺟﻮﻣ ﺐﻋﻼﻟﺍ
Your nickname '%s' is already used (%d points). Do you still want to use it?
== ﻪﻣﺍﺪﺨﺘﺳﺍ ﺪﻳﺮﺗ ﺖﻟﺯﺎﻣ ﻞﻫ '%s' ﻞﻤﻌﺘﺴﻣ ﻚﻤﺳﺍ
Checking for existing player with your name
== ﻚﻤﺳﺎﺑ ﺐﻋﻻ ﺩﻮﺟﻭ ﻦﻣ ﻖﻘﺤﺘﻟﺍ
@ -1092,9 +1083,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1225,6 +1225,9 @@ Render complete
Are you sure that you want to restart?
==
Your nickname '%s' is already used (%d points). Do you still want to use it?
==
There's an unsaved map in the editor, you might want to save it.
==
@ -1478,6 +1481,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1645,7 +1654,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1819,6 +1828,39 @@ Unregister protocol and file extensions
DDNet %s is available:
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -4,6 +4,7 @@
#modified by:
# Gokturk 2024-06-09 12:00:50
# Gokturk 2024-07-17 02:24:00
# Gokturk 2024-08-29 23:39:00
##### /authors #####
##### translated strings #####
@ -274,9 +275,6 @@ Play background music
Player
== Oyunçu
Player options
== Oyunçu parametrlər
Players
== Oyunçular
@ -652,9 +650,6 @@ Connecting dummy
Connect Dummy
== Dummy daxil ol
Reload
== Yenilə
Deactivate
== Qeyri-aktiv etmək
@ -1450,9 +1445,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace interfeysi
Show client IDs in scoreboard
== Xal lövhəsində klient ID-lərini göstərin
Show DDRace HUD
== DDRace interfeysi göstər
@ -1870,3 +1862,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping
Could not resolve connect address '%s'. See local console for details.
== '%s' Link ünvanını həll etmək mümkün olmadı. Ətraflı məlumat üçün yerli konsola baxın
Connect address error
== Link ünvanı xətası
Could not connect dummy
== Dummy qoşula bilmədi
Dummy is not allowed on this server
== Bu serverdə dummy icazə verilmir
Please wait…
== Zəhmət olmasa gözləyin…
Show client IDs (scoreboard, chat, spectator)
== Klient ID'sini göstərin (aparıcı lövhə, söhbət, izləyici)
Normal:
== Normal:
Team:
== Komanda:
Dummy settings
== Dummy parametrlər
Toggle to edit your dummy settings
== Dummy parametrlərini redaktə etmək üçün açın
Randomize
== Təsadüfi
Are you sure that you want to delete '%s'?
== '%s' Bunu silmək istədiyinizə əminsiniz?
Delete skin
== Skini silin
Basic
== Sadə
Custom
== Xüsusi
Unable to delete skin
== Skin silinə bilməz
Customize
== Fərdiləşdirmək

View file

@ -2,10 +2,11 @@
#originally created by:
# arionwt1997
#modified by:
# Chill & PoKeMoN 2023-03-31 16:00:00
# Chill & PoKeMoN 2023-07-02 00:54:00
# Chill [TD] & PoKeMoN [TD] 2023-03-31 16:00:00
# Chill [TD] & PoKeMoN [TD] 2023-07-02 00:54:00
# Chill [TD] & PoKeMoN [TD] 2023-09-22 17:49:00
# Chill [TD] & PoKeMoN [TD] 2023-11-14 12:42:00
# Chill [TD] & PoKeMoN [TD] 2024-08-23 23:17:00
#
##### /authors #####
@ -281,9 +282,6 @@ Player
Player country:
== Краіна гульца:
Player options
== Опцыі гульца
Players
== Гульцы
@ -345,7 +343,7 @@ Shotgun
== Драбавік
Show chat
== Паказаць чат
== Паказваць чат
Show friends only
== Толькі з сябрамі
@ -381,7 +379,7 @@ Stop record
== Стоп запісу
Strict gametype filter
== Строгі фільтр рэжым.
== Строгі фільтр рэжымаў
Sudden Death
== Раптоўная смерць
@ -867,9 +865,6 @@ Loading ghost files
Time
== Час
Reload
== Перазагрузіць
Deactivate
== Выключыць
@ -1166,9 +1161,6 @@ Show votes window after voting
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Паказваць ID кліента ў табло ачкоў
Show DDRace HUD
== Паказваць DDRace HUD
@ -1621,7 +1613,7 @@ Go back the specified duration
[Demo player duration]
%d sec.
== % сек.
== %d сек.
Change the skip duration
== Змяніць працягласць пропуску
@ -1705,6 +1697,7 @@ Regular background color
Entities background color
== Колер фону энтыты
[Graphics error]
An error during command recording occurred. Try to update your GPU drivers.
== Адбылася памылка падчас выканання каманды запісу. Паспрабуйце абнавіць драйверы відэакарты.
@ -1714,162 +1707,213 @@ A render command failed. Try to update your GPU drivers.
[Graphics error]
Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
==
== Памылка падчас ініцыялізацыі. Паспрабуйце змяніць gfx_backend на OpenGL або Vulcan у settings_dnet.cfg ў тэчцы канфігурацыйных файлаў і паспрабуйце яшчэ раз.
[Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
==
== Недахоп VRAM. Паспрабуйце выдаліць карыстацкія тэкстуры (скіны, энтыты і г.д.), асабліва тыя, якія маюць высокую разрознасць.
[Graphics error]
Submitting the render commands failed. Try to update your GPU drivers.
==
== Адпраўка каманд рэндэрынгу не ўдалася. Паспрабуйце абнавіць драйверы відэакарты.
Failed saving the replay!
==
== Не атрымалася захаваць паўтор!
Saving settings to '%s' failed
==
== Захаванне налад у '%s' не атрымалася
Error saving settings
==
== Памылка захавання налад
Loading demo file from storage
==
== Загрузка файла дэма са сховішча
Searching
==
== Пошук
Enter Username
==
== Увядзіце імя карыстальніка
Enter Password
==
== Увядзіце пароль
NOT CONNECTED
==
== НЕ ПАДЛУЧАНА
Match %d of %d
==
== Адпаведна %d з %d
No results
==
== Няма вынікаў
Lines %d - %d (%s)
==
== Радкі %d - %d (%s)
Locked
==
== Зафіксаваныя
Following
==
== Бягучыя
Loading commands…
==
== Загрузка каманд…
[Spectating]
Following %s
==
== Назіранне за %s
Press a key…
==
== Націсніце клавішу…
Main menu
==
== Галоўнае меню
Are you sure that you want to restart?
==
== Вы ўпэўненыя, што хочаце пачаць нанова?
There's an unsaved map in the editor, you might want to save it.
==
== У рэдактары засталася не захаваная карта, магчыма вы хочаце яе захаваць.
Continue anyway?
==
== Працягнуць у любым выпадку?
%d/%d KiB (%.1f KiB/s)
==
== %d/%d КіБ (%.1f КіБ/с)
Example of usage
==
== Прыклад выкарыстання
No login required
==
== Уваход не патрабуецца
Communities
==
== Суполкі
Server filter
==
== Фільтр сервераў
Friends
==
== Сябры
Loading…
==
== Загрузка…
Player info change cooldown
==
== Затрымка абнаўлення інфармацыі пра гульца
Tee
==
== Tee
Info Messages
==
== Інфа. Паведамленні
Show local time always
==
== Заўсёды паказваць мясцовы час
Always show chat
==
== Заўсёды паказваць чат
Show only chat messages from team members
==
== Паказваць паведамленні чата толькі ад чальцоў каманды
Chat font size
==
== Памер шрыфта чата
Chat width
==
== Шырыня чата
Show friend mark (♥) in name plates
==
== Паказваць адзнаку сябра (♥) у таблічках з імёнамі
Show hook strength icon indicator
==
== Паказваць іконку індыкатара сілы крука
Show hook strength number indicator
==
== Паказваць нумар індыкатара сілы крука
Authed name color in scoreboard
==
== Колер аўтарызаваных гульцоў у табло ачкоў
Same clan color in scoreboard
==
== Колер твайго клана ў табло ачкоў
Show own player's hook collision line
==
== Паказваць сваю лінію сутыкнення крука
Always show own player's hook collision line
==
== Заўсёды паказваць сваю лінію сутыкнення крука
Always show other players' hook collision lines
==
== Заўсёды паказваць лініі сутыкнення крука іншых гульцоў
Show finish messages
==
== Паказваць паведамленні пра фініш
Round %d/%d
==
== Раўнд %d/%d
[Spectators]
%d others…
==
== %d іншых…
[Team and size]
%d\n(%d/%d)
==
== %d\n(%d/%d)
Team %d (%d/%d)
==
== Каманда %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Show client IDs (scoreboard, chat, spectator)
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==

View file

@ -280,9 +280,6 @@ Player
Player country:
== Država
Player options
== Postavke igrača
Players
== Igrači
@ -651,9 +648,6 @@ Connecting dummy
Connect Dummy
== Konektuj dummy-a
Reload
== Reload
Deactivate
== Deaktiviraj
@ -951,9 +945,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1385,6 +1388,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1591,7 +1600,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1777,6 +1786,39 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -34,6 +34,7 @@
# Rafael Fontenelle 2024-04-30 14:52:00
# Rafael Fontenelle 2024-06-11 22:43:00
# Rafael Fontenelle 2024-07-17 12:04:00
# Rafael Fontenelle 2024-09-02 16:02:00
##### /authors #####
##### translated strings #####
@ -311,9 +312,6 @@ Player
Player country:
== País do jogador:
Player options
== Opções do jogador
Players
== Jogadores
@ -818,9 +816,6 @@ Show DDNet map finishes in server browser
transmits your player name to info.ddnet.org
== transmite seu nome de jogador para info.ddnet.org
Reload
== Recarregar
Time
== Tempo
@ -1376,9 +1371,6 @@ Show health, shields and ammo
DDRace HUD
== HUD do DDRace
Show client IDs in scoreboard
== Mostrar IDs de cliente no placar
Show DDRace HUD
== Mostrar HUD do DDRace
@ -1901,3 +1893,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping
Could not resolve connect address '%s'. See local console for details.
== Não foi possível resolver o endereço de conexão '%s'. Veja o console local para detalhes.
Connect address error
== Erro no endereço de conexão
Could not connect dummy
== Não foi possível conectar o dummy
Dummy is not allowed on this server
== Dummy não é permitido neste servidor
Please wait…
== Por favor, aguarde…
Show client IDs (scoreboard, chat, spectator)
== Mostrar IDs de clientes (placar, chat, observador)
Normal:
== Normal:
Team:
== Time:
Dummy settings
== Configurações do dummy
Toggle to edit your dummy settings
== Alterne para editar suas configurações do dummy
Randomize
== Aleatorizar
Are you sure that you want to delete '%s'?
== Tem certeza que deseja excluir '%s'?
Delete skin
== Excluir skin
Basic
== Básico
Custom
== Personalizado
Unable to delete skin
== Não foi possível excluir skin
Customize
== Personalizar

View file

@ -277,9 +277,6 @@ Player
Player country:
== Страна на играча:
Player options
== Настройки на Играча
Players
== Играчи
@ -546,9 +543,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1094,6 +1100,12 @@ Are you sure that you want to disconnect?
Connect Dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Connecting dummy
==
@ -1441,7 +1453,7 @@ Show votes window after voting
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1693,9 +1705,6 @@ Regular background color
Entities background color
==
Reload
==
Use current map as background
==
@ -1732,6 +1741,39 @@ No updates available
Check now
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -275,9 +275,6 @@ Player
Player country:
== País del jugador
Player options
== Opcions del jugador
Players
== Jugadors
@ -782,9 +779,6 @@ Show DDNet map finishes in server browser
transmits your player name to info.ddnet.org
== retransmet el teu nom de jugar a info.ddnet.org
Reload
== Recarga
Successfully saved the replay!
== S'ha guardat la repetició correctament!
@ -1197,9 +1191,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1541,6 +1544,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1672,7 +1681,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1828,6 +1837,39 @@ Entities background color
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -277,9 +277,6 @@ Player
Player country:
== Çĕршыв:
Player options
== Опцисем
Players
== Çынсем
@ -549,9 +546,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1097,6 +1103,12 @@ Are you sure that you want to disconnect?
Connect Dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Connecting dummy
==
@ -1441,7 +1453,7 @@ Show votes window after voting
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1693,9 +1705,6 @@ Regular background color
Entities background color
==
Reload
==
Use current map as background
==
@ -1732,6 +1741,39 @@ No updates available
Check now
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -6,7 +6,7 @@
# Petr 2011-04-02 23:02:33
# Medik & Petr 2011-07-02 19:37:05
# TeeWorlds-org 2011-07-15 00:34:19
# dobrykafe 2024-06-09 00:00:00
# dobrykafe 2024-08-30 00:00:00
##### /authors #####
##### translated strings #####
@ -281,9 +281,6 @@ Player
Player country:
== Země hráčů:
Player options
== Možnosti hráčů
Players
== Hráči
@ -646,9 +643,6 @@ Connecting dummy
Connect Dummy
== Připojit dummyho
Reload
== Znovu načíst
Deactivate
== Deaktivovat
@ -1634,9 +1628,6 @@ Show local time always
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Zobrazit ID klientů ve výsledkové tabulce
Show DDRace HUD
== Zobrazit DDRace HUD
@ -1853,26 +1844,77 @@ Tee
Show only chat messages from team members
== Zobrazit pouze zprávy od členů týmu
Could not resolve connect address '%s'. See local console for details.
== Nelze získat adresu k připojení '%s'. Podrobnosti najdete v místní konzoli.
Connect address error
== Chyba v adrese k připojení
Could not connect dummy
== Nepodařilo se připojit dummyho
[Spectating]
Following %s
==
== Sledujete %s
Example of usage
==
== Příklad použití
Dummy is not allowed on this server
== Dummy není na tomto serveru povolen
Please wait…
== Čekejte prosím…
Show client IDs (scoreboard, chat, spectator)
== Zobrazit ID klientů (výsledková tabulka, chat, divák)
Normal:
== Normální:
Team:
== Tým:
Dummy settings
== Nastavení dummyho
Toggle to edit your dummy settings
== Přepnutím upravíte nastavení dummyho
Randomize
== Randomizovat
Are you sure that you want to delete '%s'?
== Jste si jisti, že chcete smazat '%s'?
Delete skin
== Odstranit skin
Basic
== Základní
Custom
== Vlastní
Unable to delete skin
== Nelze odstranit skin
Customize
== Přizpůsobit
Round %d/%d
==
== Kolo %d/%d
[Spectators]
%d others…
==
== %d dalších…
[Team and size]
%d\n(%d/%d)
==
== %d\n(%d/%d)
Team %d (%d/%d)
==
== Tým %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
==
== https://wiki.ddnet.org/wiki/Mapping

View file

@ -278,9 +278,6 @@ Player
Player country:
== Spillernes land:
Player options
== Spillermuligheder
Players
== Spillere
@ -676,9 +673,6 @@ Kill
Pause
== Pause
Reload
== Genindlæs
Deactivate
== Deaktiver
@ -1100,9 +1094,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1486,6 +1489,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1653,7 +1662,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1824,6 +1833,39 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -290,9 +290,6 @@ Player
Player country:
== Speler land:
Player options
== Speler opties
Players
== Spelers
@ -663,9 +660,6 @@ Connecting dummy
Connect Dummy
== Verbind Dummy
Reload
== Herladen
Deactivate
== Deactiveren
@ -1243,9 +1237,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1584,6 +1587,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1709,7 +1718,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1850,6 +1859,39 @@ Entities background color
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -300,9 +300,6 @@ Kill
Pause
== Paŭzi
Player options
== Ludantaj agordoj
Player
== Ludanto
@ -565,9 +562,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1053,6 +1059,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Stop record
==
@ -1481,7 +1493,7 @@ Show votes window after voting
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1724,9 +1736,6 @@ Regular background color
Entities background color
==
Reload
==
Use current map as background
==
@ -1751,6 +1760,39 @@ DDNet Client updated!
No updates available
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -281,9 +281,6 @@ Player
Player country:
== Mängija maa:
Player options
== Mängija sätted
Players
== Mängijad
@ -710,9 +707,6 @@ Kill
Pause
== Paus
Reload
== Lae uuesti
Deactivate
== Deaktiveeri
@ -1605,9 +1599,6 @@ Show local time always
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Näita kliendi ID-eid tulemustabelis
Show DDRace HUD
== Näita DDRace HUD-i
@ -1872,5 +1863,56 @@ Round %d/%d
Team %d (%d/%d)
== Tiim %d (%d/%d)
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Show client IDs (scoreboard, chat, spectator)
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
https://wiki.ddnet.org/wiki/Mapping
==

View file

@ -280,9 +280,6 @@ Player
Player country:
== Pelaajan maa:
Player options
== Pelaajavalinnat
Players
== Pelaajat
@ -709,9 +706,6 @@ Kill
Pause
== Pysäytä
Reload
== Päivitä
Deactivate
== Deaktivoi
@ -1634,9 +1628,6 @@ Show local time always
DDRace HUD
== DDrace-HUD
Show client IDs in scoreboard
== Näytä asiakas-ID:t pistetaulukossa
Show DDRace HUD
== Näytä DDRace-HUD
@ -1832,6 +1823,15 @@ Loading sound files
Moved ingame
== Liikui pelissä
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
[Spectating]
Following %s
==
@ -1842,15 +1842,57 @@ Following %s
Example of usage
==
Dummy is not allowed on this server
==
Please wait…
==
Converse
==
Tee
==
Show client IDs (scoreboard, chat, spectator)
==
Show only chat messages from team members
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -302,9 +302,6 @@ Player
Player country:
== Origine des Tees:
Player options
== Options des joueurs
Players
== Joueurs
@ -610,9 +607,6 @@ AntiPing: predict other players
Are you sure that you want to disconnect your dummy?
== Êtes vous sûrs de vouloir déconnecter votre dummy ?
Reload
== Recharger
Server best:
== Meilleur score du serveur
@ -1390,9 +1384,6 @@ Name Plate
Hook Collisions
== Collisions du grappin
Show client IDs in scoreboard
== Afficher les IDs des clients dans le tableau des scores
Hook collision line width
== Largeur de la ligne de collision du grappin
@ -1874,6 +1865,15 @@ Entities background color
Moved ingame
== Déplacé en jeu
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
[Spectating]
Following %s
==
@ -1881,6 +1881,48 @@ Following %s
Example of usage
==
Dummy is not allowed on this server
==
Please wait…
==
Show client IDs (scoreboard, chat, spectator)
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -280,9 +280,6 @@ Player
Player country:
== País do xogador
Player options
== Opcións de xogador
Players
== Xogadores
@ -652,9 +649,6 @@ Connecting dummy
Connect Dummy
== Conectar Dummy
Reload
== Recargar
Deactivate
== Desactivar
@ -1358,9 +1352,6 @@ Show health, shields and ammo
DDRace HUD
== HUD DDRace
Show client IDs in scoreboard
== Mostrar IDs de cliente na táboa de puntuación
Show DDRace HUD
== Mostrar o HUD DDRace
@ -1571,6 +1562,15 @@ Relative
Absolute
== Absoluto
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Error playing demo
==
@ -1767,6 +1767,12 @@ Delete folder
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1797,6 +1803,9 @@ Info Messages
Show local time always
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1851,6 +1860,39 @@ Regular background color
Entities background color
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -299,9 +299,6 @@ Player
Player country:
== Spielerland:
Player options
== Spieleroptionen
Players
== Spieler
@ -365,9 +362,6 @@ Shotgun
Show chat
== Chat anzeigen
Show client IDs in scoreboard
== Client-IDs in der Punktetafel anzeigen
Show DDRace HUD
== DDRace-HUD anzeigen
@ -815,9 +809,6 @@ Skin prefix
Show HUD
== HUD zeigen
Reload
== Neu laden
9+ new mentions
== 9+ Erwähnungen
@ -1887,5 +1878,56 @@ Round %d/%d
Team %d (%d/%d)
== Team %d (%d/%d)
Could not resolve connect address '%s'. See local console for details.
== Konnte Verbindungsadresse '%s' nicht auflösen, siehe lokale Konsole für Details.
Connect address error
== Fehler in Verbindungsadresse
Could not connect dummy
== Konnte Dummy nicht verbinden
Dummy is not allowed on this server
== Dummy ist auf diesem Server nicht erlaubt
Please wait…
== Bitte warten…
Show client IDs (scoreboard, chat, spectator)
== Client-IDs anzeigen (Punktetafel, Chat, Beobachter)
Normal:
== Normal:
Team:
== Team:
Dummy settings
== Dummy-Einstellungen
Toggle to edit your dummy settings
== Zu Dummy-Einstellungen wechseln
Randomize
== Randomisieren
Are you sure that you want to delete '%s'?
== Bist du sicher dass du '%s' löschen willst?
Delete skin
== Skin löschen
Basic
== Einfach
Custom
== Individuell
Unable to delete skin
== Kann Skin nicht löschen
Customize
== Anpassen
https://wiki.ddnet.org/wiki/Mapping
==

View file

@ -280,9 +280,6 @@ Player
Player country:
== Χώρα παίκτη:
Player options
== Επιλογές παίκτη
Players
== Παίκτες
@ -555,9 +552,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1100,6 +1106,12 @@ Are you sure that you want to disconnect?
Connect Dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Connecting dummy
==
@ -1444,7 +1456,7 @@ Show votes window after voting
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1693,9 +1705,6 @@ Regular background color
Entities background color
==
Reload
==
Use current map as background
==
@ -1732,6 +1741,39 @@ No updates available
Check now
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -270,9 +270,6 @@ Pistol
Player
== Játékos
Player options
== Játékosok kezelése
Players
== Játékosok
@ -789,9 +786,6 @@ Show DDNet map finishes in server browser
transmits your player name to info.ddnet.org
== továbbítja a játékosnevedet az info.ddnet.org oldalra
Reload
== Újratöltés
Hammerfly dummy
== Másolat kalapácsolás
@ -1060,9 +1054,6 @@ Auto
Replay
== Visszajátszás
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
== Ennek a Textúrának szélessége, vagy magassága (%s) nem megfelelően osztható el ezzel a számmal: (%d), ami vizuális hibákhoz vezethet. (Méretek máshogyan fognak kinézni és a teljesítményt is ronthatja.)
Getting server list from master server
== Szerverlista lekérése a fő szerverekről
@ -1338,9 +1329,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Mutassa a kliensek ID-ét a pontszámtáblán
Show DDRace HUD
== Mutassa a DDRace HUD-ot (Speciális HUD)
@ -1551,6 +1539,15 @@ Unregister protocol and file extensions
Open the directory to add custom assets
== Megnyitni az egyedi Képek helyét
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Error playing demo
==
@ -1563,6 +1560,9 @@ Saving settings to '%s' failed
Error saving settings
==
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
==
Loading demo file from storage
==
@ -1772,6 +1772,12 @@ Delete folder
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1802,6 +1808,9 @@ Info Messages
Show local time always
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1853,6 +1862,39 @@ Regular background color
Entities background color
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -284,9 +284,6 @@ Player
Player country:
== Filtra per paese:
Player options
== Opzioni giocatore
Players
== Giocatori
@ -709,9 +706,6 @@ Kill
Pause
== Pausa
Reload
== Ricarica
Deactivate
== Disattiva
@ -1180,7 +1174,7 @@ No server selected
== Nessun server selezionato
Online clanmates (%d)
== Compagni di clan online
== Compagni di clan online (%d)
Click to select server. Double click to join your friend.
== Fare click per selezionare il server. Fai doppio click per unirti al tuo amico.
@ -1273,9 +1267,6 @@ Hook Collisions
Show health, shields and ammo
== Mostra vita, scudi e munizioni
Show client IDs in scoreboard
== Mostra gli ID clienti nella scoreboard
Show DDRace HUD
== Mostra l'HUD DDRace
@ -1411,9 +1402,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1680,6 +1680,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1783,6 +1789,9 @@ Show local time always
DDRace HUD
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1873,6 +1882,39 @@ Regular background color
Entities background color
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -274,9 +274,6 @@ Player
Player country:
== 所在地:
Player options
== プレイヤー設定
Players
== プレーヤー
@ -684,9 +681,6 @@ Kill
Pause
== 観察
Reload
== 更新
Deactivate
== 無効にする
@ -1135,9 +1129,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1512,6 +1515,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1664,7 +1673,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1829,6 +1838,39 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -280,9 +280,6 @@ Pistol
Player
== 플레이어
Player options
== 플레이어 옵션
Players
== 플레이어
@ -534,9 +531,6 @@ Successfully saved the replay!
Replay feature is disabled!
== 리플레이 기능을 비활성화했습니다!
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
== 텍스처 %s 의 너비 또는 높이를 %d 으로 나눌 수 없습니다. 이는 시각적 오류를 발생시킬 수 있습니다.
Warning
== 주의
@ -702,9 +696,6 @@ Pause
Time
== 시간
Reload
== 새로고침
Deactivate
== 비활성화
@ -1359,9 +1350,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== 점수판에 클라이언트 ID 표시
Show DDRace HUD
== DDRace HUD 표시
@ -1563,6 +1551,15 @@ Copy info
Create a random skin
== 무작위 스킨 생성
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Error playing demo
==
@ -1575,6 +1572,9 @@ Saving settings to '%s' failed
Error saving settings
==
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
==
Loading demo file from storage
==
@ -1784,6 +1784,12 @@ Delete folder
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1814,6 +1820,9 @@ Info Messages
Show local time always
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1865,6 +1874,39 @@ Regular background color
Entities background color
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -309,9 +309,6 @@ Player
Player country:
== Өлкөсү:
Player options
== Оюнчу опциялары
Players
== Оюнчулар
@ -546,9 +543,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1091,6 +1097,12 @@ Are you sure that you want to disconnect?
Connect Dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Connecting dummy
==
@ -1435,7 +1447,7 @@ Show votes window after voting
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1684,9 +1696,6 @@ Regular background color
Entities background color
==
Reload
==
Use current map as background
==
@ -1723,6 +1732,39 @@ No updates available
Check now
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -279,9 +279,6 @@ Player
Player country:
== Spillerland:
Player options
== Spillerinstillinger
Players
== Spillere
@ -653,9 +650,6 @@ Connecting dummy
Connect Dummy
== Koble til dummy
Reload
== Last på nytt
Deactivate
== Deaktiver
@ -1101,9 +1095,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1487,6 +1490,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1654,7 +1663,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1825,6 +1834,39 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Extras
==

View file

@ -519,9 +519,6 @@ Kill
Pause
== ﺚﮑﻣ ﺖﻟﺎﺣ
Player options
== ﻦﮑﯾﺯﺎﺑ ﺕﺎﻤﯿﻈﻨﺗ
Player
== ﻦﮑﯾﺯﺎﺑ
@ -543,9 +540,6 @@ Vote command:
Time
== ﻥﺎﻣﺯ
Reload
== ﻩﺭﺎﺑﻭﺩ ﯼﺮﯿﮔﺭﺎﺑ
Deactivate
== ﻥﺩﺮﮐ ﻝﺎﻌﻓﺮﯿﻏ
@ -1225,9 +1219,6 @@ Show votes window after voting
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== ﺯﺎﯿﺘﻣﺍ ﯼﻮﻠﺑﺎﺗ ﺭﺩ ﺖﻨﯾﻼﮐ ID ﺶﯾﺎﻤﻧ
Show DDRace HUD
== DDRace HUD ﺶﯾﺎﻤﻧ
@ -1518,9 +1509,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1754,6 +1754,12 @@ Delete folder
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1787,6 +1793,9 @@ Info Messages
Show local time always
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1841,6 +1850,39 @@ Entities background color
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -282,9 +282,6 @@ Player
Player country:
== Narodowość:
Player options
== Opcje gracza
Players
== Gracze
@ -683,9 +680,6 @@ Enable replays
Automatically create statboard csv
== Automatycznie stwórz plik csv z tabelą wyników
Reload
== Przeładuj
Replay feature is disabled!
== Funkcja odtwarzania jest wyłączona!
@ -1639,9 +1633,6 @@ Show health, shields and ammo
Show local time always
== Pokazuj czas lokalny
Show client IDs in scoreboard
== Pokazuj ID klienta w tabeli wyników
Show DDRace HUD
== Pokazuj HUD DDRace
@ -1808,6 +1799,15 @@ Submitting the render commands failed. Try to update your GPU drivers.
Failed to swap framebuffers. Try to update your GPU drivers.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Match %d of %d
==
@ -1840,6 +1840,12 @@ Folder Link
map not included
==
Dummy is not allowed on this server
==
Please wait…
==
Aim bind
==
@ -1855,9 +1861,45 @@ Tee
DDRace HUD
==
Show client IDs (scoreboard, chat, spectator)
==
Show only chat messages from team members
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -290,9 +290,6 @@ Player
Player country:
== País do jogador
Player options
== Opções do jogador
Players
== Jogadores
@ -773,9 +770,6 @@ Connect Dummy
Time
== Tempo
Reload
== Recarregar
Deactivate
== Desativar
@ -890,9 +884,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1330,6 +1333,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Kill
==
@ -1563,7 +1572,7 @@ Show local time always
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1767,6 +1776,39 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -286,9 +286,6 @@ Player
Player country:
== Țara jucătorului:
Player options
== Opțiuni jucător
Players
== Jucători
@ -561,9 +558,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1106,6 +1112,12 @@ Are you sure that you want to disconnect?
Connect Dummy
==
Dummy is not allowed on this server
==
Please wait…
==
Connecting dummy
==
@ -1450,7 +1462,7 @@ Show votes window after voting
DDRace HUD
==
Show client IDs in scoreboard
Show client IDs (scoreboard, chat, spectator)
==
Show DDRace HUD
@ -1699,9 +1711,6 @@ Regular background color
Entities background color
==
Reload
==
Use current map as background
==
@ -1738,6 +1747,39 @@ No updates available
Check now
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Emoticons
==

View file

@ -294,9 +294,6 @@ Player
Player country:
== Страна игрока:
Player options
== Опции игрока
Players
== Игроки
@ -634,7 +631,7 @@ Loading DDNet Client
== Загрузка DDNet Client
Normal message
== Обычное с.
== Обычное
Connecting dummy
== Подключение дамми
@ -646,10 +643,10 @@ Save ghost
== Сохранять тень
DDNet Client updated!
== DDNet Client обновлён!
== DDNet клиент обновлён!
Highlighted message
== Выделенное с.
== Выделенное
Demo
== Демо
@ -727,7 +724,7 @@ Downloading %s:
== Скачивание %s:
Update failed! Check log…
== Ошибка. Проверьте логи
== Не удалось обновиться! Подробности в логах
Restart
== Рестарт
@ -750,9 +747,6 @@ Fetch Info
Connect Dummy
== Подключить дамми
Reload
== Перезагрузить
Deactivate
== Выключить
@ -805,7 +799,7 @@ Toggle dyncam
== Смена дин. камеры
Toggle dummy
== Смена Tee
== Переключение дамми
Toggle ghost
== Переключить тень
@ -850,7 +844,7 @@ DDNet
== DDNet
Friend message
== Дружеское с.
== Дружеское
Save the best demo of each race
== Сохранять лучшее демо каждой карты
@ -922,10 +916,10 @@ Ratio
== Соотношение
Net
== Сеть
== Сальдо
FPM
== FPM
== У/мин
Spree
== Серия
@ -946,7 +940,7 @@ Grabs
== 9+ упоминаний
Client message
== Клиентское с.
== Клиентское
Warning
== Предупреждение
@ -979,7 +973,7 @@ Run server
== Запустить сервер
Server executable not found, can't run server
== Файл сервера не найден, невозможно запустить
== Файл сервера не найден, не удалось запустить сервер
Editor
== Редактор
@ -1362,9 +1356,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Показывать ид. игроков
Show DDRace HUD
== Показывать DDRace HUD
@ -1835,10 +1826,10 @@ No login required
== Без логина
Player info change cooldown
== Задержка смены информации об игроке
== Кулдаун смены данных об игроке
Tee
== Ти
== Тии
Always show chat
== Всегда показывать чат
@ -1887,3 +1878,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping/ru
Could not resolve connect address '%s'. See local console for details.
== Не удалось определить адрес подключения '%s'. Подробности в локальной консоли.
Connect address error
== Ошибка адреса подключения
Could not connect dummy
== Невозможно подключить дамми
Dummy is not allowed on this server
== Дамми не разрешен на этом сервере
Please wait…
== Пожалуйста, подождите…
Show client IDs (scoreboard, chat, spectator)
== Показывать ID клиента (табло, чат, наблюдатель)
Normal:
== Обычный:
Team:
== В команде:
Dummy settings
== Настройки дамми
Toggle to edit your dummy settings
== Нажмите, чтобы изменить настройки дамми
Randomize
== Случайный
Are you sure that you want to delete '%s'?
== Вы уверены, что хотите удалить '%s'?
Delete skin
== Удалить скин
Basic
== Пресеты
Custom
== Кастомизация
Unable to delete skin
== Невозможно удалить скин
Customize
== Кастомизировать

View file

@ -281,9 +281,6 @@ Player
Player country:
== Država igrača
Player options
== Podešavanja igrača
Players
== Igrači
@ -685,9 +682,6 @@ Kill
Pause
== Pauza
Reload
== Osveži
Deactivate
== Deaktiviraj
@ -1264,9 +1258,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace Prikaz
Show client IDs in scoreboard
== Prikaži identitete na tabli rezultata
Show DDRace HUD
== Prikaži DDRace Prikaz
@ -1649,6 +1640,15 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not connect dummy
==
Error playing demo
==
@ -1785,6 +1785,12 @@ Netversion
map not included
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1809,6 +1815,9 @@ Info Messages
Show local time always
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1860,6 +1869,39 @@ Regular background color
Entities background color
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Round %d/%d
==

View file

@ -277,9 +277,6 @@ Player
Player country:
== Држава играча
Player options
== Подешавања играча
Players
== Играчи
@ -684,9 +681,6 @@ Kill
Pause
== Пауза
Reload
== Освежи
Deactivate
== Деактивирај
@ -1263,9 +1257,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace Приказ
Show client IDs in scoreboard
== Прикажи идентитете на табли резултата
Show DDRace HUD
== Прикажи DDRace Приказ
@ -1422,9 +1413,18 @@ Could not initialize the given graphics backend, reverting to the default backen
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not resolve connect address '%s'. See local console for details.
==
Connect address error
==
Could not save downloaded map. Try manually deleting this file: %s
==
Could not connect dummy
==
Error playing demo
==
@ -1703,6 +1703,12 @@ Unable to delete the demo '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
Dummy is not allowed on this server
==
Please wait…
==
Loading…
==
@ -1766,6 +1772,9 @@ Info Messages
Show local time always
==
Show client IDs (scoreboard, chat, spectator)
==
Always show chat
==
@ -1850,6 +1859,39 @@ Entities background color
Unregister protocol and file extensions
==
Normal:
==
Team:
==
Dummy settings
==
Toggle to edit your dummy settings
==
Randomize
==
Are you sure that you want to delete '%s'?
==
Delete skin
==
Basic
==
Custom
==
Unable to delete skin
==
Customize
==
Open the directory to add custom assets
==

View file

@ -41,6 +41,7 @@
# 2024-04-21 By
# 2024-06-10 By
# 2024-07-21 By
# 2024-08-29 Pioooooo
##### /authors #####
##### translated strings #####
@ -342,9 +343,6 @@ HUD
Player country:
== 玩家国家 / 地区:
Player options
== 玩家选项
Players
== 玩家
@ -831,9 +829,6 @@ Show DDNet map finishes in server browser
transmits your player name to info.ddnet.org
== 将会发送你的玩家昵称到 info.ddnet.org
Reload
== 刷新
Enable replays
== 启用短时回放
@ -1389,9 +1384,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== 显示客户端 IDs (计分板中)
Show DDRace HUD
== 显示 DDRace HUD
@ -1523,7 +1515,7 @@ Are you sure that you want to reset the controls to their defaults?
[Graphics error]
Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== 初始化失败。请尝试打开配置目录中的设置文件settings_ddnet.cfg并将“gfx_backend OpenGL”修改为“gfx_backend Vulkan”若没有前者则可直接输入后者再重试。
== 初始化失败。请尝试打开配置目录中的设置文件settings_ddnet.cfg并将 “gfx_backend” 设置为 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重试。
[Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
@ -1547,7 +1539,7 @@ Failed to swap framebuffers. Try to update your GPU drivers.
[Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== 未知错误。请尝试打开配置目录中的设置文件settings_ddnet.cfg并将“gfx_backend OpenGL”修改为“gfx_backend Vulkan”若没有前者则可直接输入后者再重试。
== 未知错误。请尝试打开配置目录中的设置文件settings_ddnet.cfg并将 “gfx_backend” 设置为 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重试。
[Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now.
@ -1575,7 +1567,7 @@ No controller found. Plug in a controller.
== 未检测到任何控制器。请尝试重新连接控制器。
Unregister protocol and file extensions
== 未注册的协议与扩充文件
== 清除协议与文件类型关联
Open the directory to add custom assets
== 打开用以添加自定义资源的文件夹路径
@ -1914,3 +1906,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/index.php?title=Mapping/zh&variant=zh-hans
Could not resolve connect address '%s'. See local console for details.
== 无法解析连接地址 '%s'。检查本地控制台以获取详情。
Connect address error
== 连接地址错误
Could not connect dummy
== 无法连接分身
Dummy is not allowed on this server
== 此服务器禁止使用分身
Please wait…
== 请稍等…
Show client IDs (scoreboard, chat, spectator)
== 显示客户端 ID计分板、聊天、观战者
Normal:
== 正常:
Team:
== 队伍:
Dummy settings
== 分身设置
Toggle to edit your dummy settings
== 切换以编辑分身设置
Randomize
== 随机
Are you sure that you want to delete '%s'?
== 你确定要删除'%s'吗?
Delete skin
== 删除皮肤
Basic
== 基本
Custom
== 自定义
Unable to delete skin
== 无法删除皮肤
Customize
== 自定义

View file

@ -3,7 +3,7 @@
# Limit and Petr
#modified by:
# LimiT 2011-07-02 20:24:44
# dobrykafe 2024-06-09 00:00:00
# dobrykafe 2024-08-30 00:00:00
##### /authors #####
##### translated strings #####
@ -278,9 +278,6 @@ Player
Player country:
== Filter krajín:
Player options
== Nastavenia hráča
Players
== Hráči
@ -1420,9 +1417,6 @@ Show votes window after voting
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Zobraziť ID klientov vo výsledkovej tabuľke
Show DDRace HUD
== Zobraziť DDRace HUD
@ -1648,9 +1642,6 @@ Regular background color
Entities background color
== Farba pozadia entít
Reload
== Znovu načítať
Use current map as background
== Použiť aktuálnu mapu ako pozadie
@ -1850,26 +1841,77 @@ Tee
Show only chat messages from team members
== Zobraziť iba správy od členov tímu
Could not resolve connect address '%s'. See local console for details.
== Nie je možné získať adresu na pripojenie '%s'. Podrobnosti nájdete v miestnej konzole.
Connect address error
== Chyba v adrese na pripojenie
Could not connect dummy
== Nepodarilo sa pripojiť dummyho
[Spectating]
Following %s
==
== Sledujete %s
Example of usage
==
== Príklad použitia
Dummy is not allowed on this server
== Dummy nie je na tomto serveri povolený
Please wait…
== Čakajte prosím…
Show client IDs (scoreboard, chat, spectator)
== Zobraziť ID klientov (výsledková tabuľka, chat, divák)
Normal:
== Normálny:
Team:
== Tím:
Dummy settings
== Nastavenie dummyho
Toggle to edit your dummy settings
== Prepnutím upravíte nastavenie dummyho
Randomize
== Randomizovať
Are you sure that you want to delete '%s'?
== Ste si istí, že chcete zmazať '%s'?
Delete skin
== Odstrániť skin
Basic
== Základné
Custom
== Vlastné
Unable to delete skin
== Nedá sa odstrániť skin
Customize
== Prispôsobiť
Round %d/%d
==
== Kolo %d/%d
[Spectators]
%d others…
==
== %d ďalších…
[Team and size]
%d\n(%d/%d)
==
== %d\n(%d/%d)
Team %d (%d/%d)
==
== Tím %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
==
== https://wiki.ddnet.org/wiki/Mapping

View file

@ -299,9 +299,6 @@ Player
Player country:
== País del jugador
Player options
== Opciones de jugador
Players
== Jugadores
@ -626,7 +623,7 @@ Types
== Tipos
DDNet %s is out!
== ¡DDNet %s ya esta disponible!
== ¡DDNet %s ya está disponible!
Downloading %s:
== Descargando %s:
@ -673,9 +670,6 @@ Connecting dummy
Connect Dummy
== Conectar Dummy
Reload
== Recargar
Deactivate
== Desactivar
@ -1390,9 +1384,6 @@ Show health, shields and ammo
DDRace HUD
== HUD DDRace
Show client IDs in scoreboard
== Mostrar IDs de cliente en la tabla de puntuación
Show DDRace HUD
== Mostrar el HUD DDRace
@ -1891,3 +1882,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping/es
Could not resolve connect address '%s'. See local console for details.
== No se pudo resolver la dirección de conexión '%s'. Ver la consola local para más detalles.
Connect address error
== Error de dirección de conexión
Could not connect dummy
== No se pudo conectar tu dummy
Dummy is not allowed on this server
== No se permiten dummys en este servidor
Please wait…
== Espera por favor…
Show client IDs (scoreboard, chat, spectator)
== Mostrar IDs de cliente (scoreboard, chat, espectador)
Normal:
== Normal:
Team:
== Equipo:
Dummy settings
== Configuración del dummy
Toggle to edit your dummy settings
== Actívalo para configurar tu dummy
Randomize
== Aleatorizar
Are you sure that you want to delete '%s'?
== ¿Estás seguro de que quieres eliminar '%s'?
Delete skin
== Eliminar skin
Basic
== Básico
Custom
== Personalizado
Unable to delete skin
== No se pudo borrar la skin
Customize
== Personalizar

View file

@ -7,7 +7,7 @@
# 3edcxzaq1 2020-06-25 00:00:00
# cur.ie 2020-09-28 00:00:00
# simpygirl 2022-02-20 00:00:00
# furo 2024-07-17 00:00:00
# furo 2024-08-29 00:00:00
##### /authors #####
##### translated strings #####
@ -282,9 +282,6 @@ Player
Player country:
== Land
Player options
== Spelaralternativ
Players
== Spelare
@ -900,9 +897,6 @@ Show HUD
Pause
== Pausa
Reload
== Ladda om
Spree
== Spree
@ -1516,9 +1510,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== Visa klient ID i poänglista
Show DDRace HUD
== Visa DDRace HUD
@ -1875,3 +1866,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping
Could not resolve connect address '%s'. See local console for details.
== Kunde inte förstå anslutnings adress '%s'. Se den lokala konsolen för detaljer.
Connect address error
== Anslutnings problem
Could not connect dummy
== Kunde inte ansluta dummy
Dummy is not allowed on this server
== Dummy är inte tillåten på denna server
Please wait…
== Vänligen vänta…
Show client IDs (scoreboard, chat, spectator)
== Visa klient IDen (poänglistan, chatt, åskadarmeny)
Normal:
== Normal:
Team:
== Lag:
Dummy settings
== Dummy inställningar
Toggle to edit your dummy settings
== Växla för att ändra dina dummy inställningar
Randomize
== Slumpa
Are you sure that you want to delete '%s'?
== Är du säker att du vill ta bort '%s'?
Delete skin
== Ta bort skin
Basic
== Enkel
Custom
== Anpassa
Unable to delete skin
== Kunde inte ta bort skin
Customize
== Ändra

View file

@ -30,6 +30,7 @@
# 2024-04-21 By
# 2024-06-10 By
# 2024-07-21 By
# 2024-08-29 Pioooooo
##### /authors #####
##### translated strings #####
@ -331,9 +332,6 @@ HUD
Player country:
== 玩家國家/地區:
Player options
== 玩家選項
Players
== 玩家
@ -820,9 +818,6 @@ Show DDNet map finishes in server browser
transmits your player name to info.ddnet.org
== 將會發送你的玩家名稱到 info.ddnet.org
Reload
== 重新整理
Enable replays
== 啟用短時回放
@ -1227,7 +1222,7 @@ Team %d
== 隊伍 %d
Position:
== 坐標
== 坐標
Speed:
== 速度
@ -1378,9 +1373,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace HUD
Show client IDs in scoreboard
== 顯示客戶端 IDs (計分板中)
Show DDRace HUD
== 顯示 DDRace HUD
@ -1512,7 +1504,7 @@ Are you sure that you want to reset the controls to their defaults?
[Graphics error]
Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== 初始化失敗。請嘗試打開配置目錄中的設定檔案 (settings_ddnet.cfg) 并將“gfx_backend OpenGL”修改為“gfx_backend Vulkan” (若沒有前者則可直接輸入後者) 再重試。
== 初始化失敗。請嘗試打開配置目錄中的設定檔案 (settings_ddnet.cfg) 并將 “gfx_backend” 設定為 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重試。
[Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
@ -1536,7 +1528,7 @@ Failed to swap framebuffers. Try to update your GPU drivers.
[Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== 未知錯誤。請嘗試打開配置目錄中的設定檔案 (settings_ddnet.cfg) 并將“gfx_backend OpenGL”修改為“gfx_backend Vulkan” (若沒有前者則可直接輸入後者) 再重試。
== 未知錯誤。請嘗試打開配置目錄中的設定檔案 (settings_ddnet.cfg) 并將 “gfx_backend” 設定為 “gfx_backend OpenGL” 或 “gfx_backend Vulkan” 再重試。
[Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now.
@ -1564,7 +1556,7 @@ No controller found. Plug in a controller.
== 未檢測到任何控制器。請嘗試重新連接控制器。
Unregister protocol and file extensions
== 未注冊的協議與擴充檔案
== 清除連結與檔案類型關聯
Open the directory to add custom assets
== 打開用以新增自定義材質的資料夾路徑
@ -1903,3 +1895,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/index.php?title=Mapping/zh&variant=zh-hant
Could not resolve connect address '%s'. See local console for details.
== 無法解析連線地址 '%s'。檢查本機控制台以取得詳情。
Connect address error
== 連線地址錯誤
Could not connect dummy
== 無法連線分身
Dummy is not allowed on this server
== 此服務器禁止使用分身
Please wait…
== 請稍等…
Show client IDs (scoreboard, chat, spectator)
== 顯示客戶端 ID計分板、聊天、旁觀者
Normal:
== 正常:
Team:
== 隊伍:
Dummy settings
== 分身設定
Toggle to edit your dummy settings
== 切換以編輯分身設定
Randomize
== 隨機
Are you sure that you want to delete '%s'?
== 你確定要刪除'%s'嗎?
Delete skin
== 刪除外觀
Basic
== 基本
Custom
== 自定義
Unable to delete skin
== 無法刪除外觀
Customize
== 自定義

View file

@ -16,6 +16,7 @@
# Gokturk 2024-04-24 03:01:50
# Gokturk 2024-06-09 12:00:50
# Gokturk 2024-07-17 02:24:00
# Gokturk 2024-08-29 23:31:00
##### /authors #####
##### translated strings #####
@ -287,9 +288,6 @@ Play background music
Player
== Oyuncu
Player options
== Oyuncu ayarları
Players
== Oyuncular
@ -665,9 +663,6 @@ Connecting dummy
Connect Dummy
== Dummy Katıl
Reload
== Yenile
Deactivate
== Devre dışı bırak
@ -1463,9 +1458,6 @@ Show health, shields and ammo
DDRace HUD
== DDRace arayüzü
Show client IDs in scoreboard
== Skor tablosunda ki istemci ID'lerini göster
Show DDRace HUD
== DDRace arayüzünü göster
@ -1883,3 +1875,54 @@ Team %d (%d/%d)
https://wiki.ddnet.org/wiki/Mapping
== https://wiki.ddnet.org/wiki/Mapping/tr
Could not resolve connect address '%s'. See local console for details.
== '%s' Bağlantı adresi çözümlenemedi. Detaylar için yerel konsola bakın
Connect address error
== Bağlantı adresi hatası
Could not connect dummy
== Dummy bağlanamadı
Dummy is not allowed on this server
== Bu sunucuda dummy izin verilmiyor
Please wait…
== Lütfen bekleyin…
Show client IDs (scoreboard, chat, spectator)
== İstemci ID'sini göster (skor tablosu, sohbet, izleyici)
Normal:
== Normal:
Team:
== Takım:
Dummy settings
== Dummy ayarları
Toggle to edit your dummy settings
== Dummy ayarlarını düzenlemek için açın
Randomize
== Rastgele
Are you sure that you want to delete '%s'?
== '%s' bunu silmek istediğine emin misin?
Delete skin
== Skini sil
Basic
== Basit
Custom
== Özel
Unable to delete skin
== Skin silinemiyor
Customize
== Özelleştir

View file

@ -4,6 +4,7 @@
#modified by:
# 404_not_found 2011-07-30 19:50:58
# EGYT5453 (15.05.2024-04.06.2024)
# veydzh3r (31.08.2024-01.09.2024)
##### /authors #####
##### translated strings #####
@ -32,10 +33,10 @@
== ще %d…
%d player
== Гравців: %d
== Гравці: %d
%d players
== Гравців: %d
== Гравці: %d
[Demo player duration]
%d sec.
@ -76,10 +77,10 @@
== Нових згадок: 9+
A demo with this name already exists
== Демо з цією назвою вже існує
== Демо з цією назвою уже існує
A folder with this name already exists
== Тека з цією назвою вже існує
== Тека з цією назвою уже існує
[Graphics error]
A render command failed. Try to update your GPU drivers.
@ -120,7 +121,7 @@ AFR
== АФР
Aim bind
== Прив'язка
== Привязка
All
== Усі
@ -165,6 +166,9 @@ AntiPing: predict weapons
Appearance
== Вигляд
Are you sure that you want to delete '%s'?
== Ви дійсно хочете видалити '%s'?
Are you sure that you want to delete the demo '%s'?
== Ви дійсно хочете видалити демо '%s'?
@ -172,13 +176,13 @@ Are you sure that you want to delete the folder '%s'?
== Ви дійсно хочете видалити теку '%s'?
Are you sure that you want to disconnect?
== Ви дійсно хочете від'єднатися?
== Ви дійсно хочете відєднатися?
Are you sure that you want to disconnect and switch to a different server?
== Ви дійсно хочете від'єднатися й приєднатися до іншого сервера?
== Ви дійсно хочете відєднатися й приєднатися до іншого сервера?
Are you sure that you want to disconnect your dummy?
== Ви дійсно хочете від'єднати свого даммі?
== Ви дійсно хочете відєднати свого даммі?
Are you sure that you want to quit?
== Ви дійсно хочете вийти?
@ -190,7 +194,7 @@ Are you sure that you want to remove the player '%s' from your friends list?
== Ви дійсно хочете прибрати гравця '%s' зі списку друзів?
Are you sure that you want to reset the controls to their defaults?
== Ви дійсно хочете скинути налаштування керування до значень за замовчуванням?
== Ви дійсно хочете скинути налаштування керувань до початкових значень?
Are you sure that you want to restart?
== Ви дійсно хочете перезапустити?
@ -208,7 +212,7 @@ AUS
== АВС
Authed name color in scoreboard
== Колір авторизованих у таблі
== Колір авторизованих у таблиці
Auto
== Авто
@ -217,7 +221,7 @@ auto
== автоматично
Automatically create statboard csv
== Автоматично зберігати статистику у CSV-файл
== Автоматично зберігати статистику у файл CSV
Automatically record demos
== Автоматично записувати демо
@ -232,11 +236,14 @@ Axis
== Осі
Background
== Фон
== Тло
Background music volume
== Гучність фонової музики
Basic
== Базовий
Best
== НКом
@ -256,7 +263,7 @@ Call vote
== Голосувати
Can't find a Tutorial server
== Не вдалося знайти сервер-посібник
== Не вдається знайти навчальний сервер
Cancel
== Скасувати
@ -289,13 +296,13 @@ Check now
== Перевірити
Checking for existing player with your name
== Перевіряємо Ваш нікнейм на доступність
== Перевірка на наявність гравця з вашим ім’ям
CHN
== КИТ
Choose default eyes when joining a server
== Очі, які відображатимуться за замовчуванням
== Типові очі під час приєднання до сервера
Clan
== Клан
@ -322,7 +329,7 @@ Close the demo player
== Закрити програвач демо
Colors of the hook collision line, in case of a possible collision with:
== Кольори лінії зіткнення гака, якщо він може зіштовхнутися з:
== Кольори лінії зіткнення гака, в разі можливого зіткнення з:
Communities
== Спільноти
@ -330,26 +337,29 @@ Communities
Config directory
== Тека налаштувань
Connect address error
== Помилка адреси з’єднання
Connect Dummy
== Приєднати даммі
== Під’єднати даммі
Connected
== Приєднано
== Під’єднано
Connecting dummy
== Приєднуємо даммі
== Під’єднання даммі
Connecting to
== Приєднуємося до
== Під’єднання до
Connection Problems…
== Проблеми зі з'єднанням…
== Проблеми зі зєднанням…
Console
== Консоль
Continue anyway?
== Все одно продовжити?
== Усе одно продовжити?
Controller
== Контролер
@ -366,19 +376,25 @@ Converse
Copy info
== Скопіювати
Could not connect dummy
== Не вдалося під’єднати даммі
[Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now.
== Не вдалося ініціалізувати заданий графічний рушій, повертаємося до рушія за замовчуванням.
== Не вдалося ініціалізувати заданий графічний рушій, повернення до тпового рушія.
[Graphics error]
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
== Не вдалося ініціалізувати заданий графічний рушій, можливо тому що ви не встановили драйвери на вбудовану відеокарту.
== Не вдалося ініціалізувати заданий графічний рушій, імовірно, ви не встановили драйвери на вбудовану відеокарту.
Could not resolve connect address '%s'. See local console for details.
== Не вдалося визначити адресу з’єднання '%s'. Див. локальну консоль для подробиць.
Could not save downloaded map. Try manually deleting this file: %s
== Не вдалося зберегти завантажену мапу. Спробуйте самостійно видалити цей файл: %s
Count players only
== Рахувати тільки гравців
== Рахувати лише гравців
Countries
== Країни
@ -395,9 +411,15 @@ Current
custom
== власний
Custom
== Власний
Custom colors
== Власні кольори
Customize
== Налаштувати
Cut interval
== Інтервал
@ -417,7 +439,7 @@ DDNet %s is out!
== Вийшов DDNet %s!
DDNet Client needs to be restarted to complete update!
== Потрібно перезапустити клієнт DDNet, щоб завершити оновлення!
== Потрібно перезапустити клієнт DDNet для завершення оновлення!
DDNet Client updated!
== Клієнт DDNet оновлено!
@ -426,22 +448,22 @@ DDRace HUD
== HUD DDRace
DDraceNetwork is a cooperative online game where the goal is for you and your group of tees to reach the finish line of the map. As a newcomer you should start on Novice servers, which host the easiest maps. Consider the ping to choose a server close to you.
== DDraceNetwork — кооперативна мережева гра, ціль якої — дістатися разом зі своєю групою тії до фінішної прямої. Новачкам варто почати із серверів "Для новачків" (Novice), на яких є найпростіші мапи. Зважайте на затримку, коли вибираєте сервер.
== DDraceNetwork — кооперативна мережева гра, ціль якої — дістатися разом зі своєю групою тії до фінішної прямої. Новачкам варто почати із серверів «Для новачків» (Novice), на яких є найпростіші мапи. Зважайте на затримку, коли вибираєте сервер.
Deactivate
== Деактивувати
Deactivate all
== Деактивувати усіх
== Деактивувати всіх
Deaths
== С
== Смерті
Debug mode enabled. Press Ctrl+Shift+D to disable debug mode.
== Увімкнено режим налагодження. Натисніть Ctrl+Shift+D, щоб його вимкнути.
default
== за замовчуванням
== типово
Default length
== Звичайна тривалість
@ -458,6 +480,9 @@ Delete demo
Delete folder
== Видалити теку
Delete skin
== Видалити скін
Demo
== Демо
@ -471,16 +496,16 @@ Demos directory
== Тека демо
Desktop fullscreen
== Стільничний повноекранний
== Робочий стіл на весь екран
Disconnect
== Від'єднатися
== Відєднатися
Disconnect Dummy
== Від'єднати даммі
== Відєднати даммі
Disconnected
== Від'єднано
== Відєднано
Discord
== Discord
@ -498,10 +523,10 @@ Download skins
== Завантажувати скіни
Downloading %s:
== Завантажуємо %s:
== Завантаження %s:
Downloading map
== Завантажуємо мапу
== Завантаження мапи
Draw!
== Нічия!
@ -512,8 +537,14 @@ Dummy
Dummy copy
== Повторювати рухи
Dummy is not allowed on this server
== Використання даммі заборонене на цьому сервері
Dummy settings
== Налаштування даммі
Dynamic Camera
== Рухома камера
== Динамічна камера
Editor
== Редактор
@ -546,7 +577,7 @@ Enable regular chat sound
== Звук звичайного повідомлення
Enable replays
== Повтори
== Увімкнути повтори
Enable server message sound
== Звук повідомлення сервера
@ -558,13 +589,13 @@ Enter Password
== Введіть пароль
Enter Username
== Введіть логін
== Введіть ім’я користувача
Entities
== Сутності
Entities background color
== Колір фону сутностей
== Колір тла сутностей
Error
== Помилка
@ -582,13 +613,13 @@ EUR
== ЄВР
Example of usage
== Наприклад
== Приклад використання
Exclude
== Виключити
Existing Player
== Гравець вже існує
== Гравець уже існує
Export cut as a separate demo
== Експортувати фрагмент як окреме демо
@ -651,7 +682,7 @@ Following
[Spectating]
Following %s
== Слідуємо за %s
== Cпостерігання за %s
Force vote
== Форсувати
@ -681,7 +712,7 @@ FSAA samples
== Вибірка FSAA
Fullscreen
== Повноекранний
== На весь екран
Game
== Гра
@ -708,13 +739,13 @@ Gameplay
== Ігролад
General
== Загальне
== Загальні
Getting game info
== Отримуємо інформацію про гру
== Отримання інформації про гру
Getting server list from master server
== Отримуємо список серверів з головного сервера
== Отримання списку серверів з головного сервера
Ghost
== Привид
@ -726,7 +757,7 @@ Go back one marker
== Перемотати до попередньої мітки
Go back one tick
== Перемотати вперед на один тік
== Перемотати вперед на один такт
Go back the specified duration
== Перемотати назад
@ -735,7 +766,7 @@ Go forward one marker
== Перемотати до наступної мітки
Go forward one tick
== Перемотати назад на один тік
== Перемотати вперед на один такт
Go forward the specified duration
== Перемотати вперед
@ -801,31 +832,31 @@ HUD
== HUD
Hue
== Тон
== Відтінок
Indicate map finish
== Позначати пройдені мапи
Info Messages
== Інфо-повідомлення
== Інфо. повідомлення
Ingame controller mode
== Режим контролера у грі
Ingame controller sens.
== Чутл. у грі
== Чутливість у грі
Ingame mouse sens.
== Чутл. у грі
== Чутливість у грі
Initializing assets
== Ініціалізуємо текстури
== Ініціалізація текстур
Initializing components
== Ініціалізуємо компоненти
== Ініціалізація компонентів
Initializing map logic
== Ініціалізуємо логіку мапи
== Ініціалізація логіки мапи
Internet
== Інтернет
@ -834,7 +865,7 @@ Invalid Demo
== Недійсне демо
It's recommended that you check the settings to adjust them to your liking before joining a server.
== Перед тим як приєднатися до сервера, рекомендуємо змінити налаштування до ваших уподобань.
== Перед тим, як приєднатися до сервера, рекомендуємо змінити налаштування до ваших уподобань.
Join blue
== До синіх
@ -846,7 +877,7 @@ Join red
== До червоних
Join Tutorial Server
== Приєднатися до сервера-посібника
== Приєднатися до навчального сервера
Jump
== Стрибок
@ -885,52 +916,52 @@ Loading…
== Завантаження…
Loading assets
== Завантажуємо текстури
== Завантаження текстур
Loading commands…
== Завантажуємо команди
== Завантаження команд
Loading DDNet Client
== Завантажуємо клієнт DDNet
== Завантаження клієнта DDNet
Loading demo file from storage
== Завантажуємо демо-файл зі сховища
== Завантаження демо-файлу зі сховища
Loading demo files
== Завантажуємо демо-файли
== Завантаження демо-файлів
Loading ghost files
== Завантажуємо файли привида
== Завантаження файлів привида
Loading map file from storage
== Завантажуємо файл мапи зі сховища
== Завантаження файлу мапи зі сховища
Loading menu images
== Завантажуємо зображення меню
== Завантаження зображень меню
Loading menu themes
== Завантажуємо теми меню
== Завантаження тем меню
Loading race demo files
== Завантажуємо демо-файли забігів
== Завантаження демо-файлів забігів
Loading skin files
== Завантажуємо файли скінів
== Завантаження файлів скінів
Loading sound files
== Завантажуємо звукові файли
== Завантаження звукових файлів
Lock team
== Замкнути команду
Locked
== Заблоковано
== Замкнено
Main menu
== Головне меню
Manual
== Вручну
== Уручну
Map
== Мапа
@ -940,7 +971,7 @@ map not included
== мапу не включено
Map sound volume
== Гучність мапи
== Гучність звуків мапи
Mark the beginning of a cut (right click to reset)
== Позначити початок фрагмента (права кнопка миші, щоб скинути)
@ -955,13 +986,13 @@ Match %d of %d
== Збіг %d з %d
Max CSVs
== Найбільше CSV-файлів
== Макс. кількість файлів CSV
Max demos
== Найбільше демо-файлів
== Макс. кількість демо-файлів
Max Screenshots
== Найбільше знімків екрана
== Макс. кількість знімків екрана
may cause delay
== може спричинити затримку
@ -985,7 +1016,7 @@ Move left
== Вліво
Move player to spectators
== Зробити гравця спостерігачем
== Зробити гравця глядачем
Move right
== Вправо
@ -1000,7 +1031,7 @@ Multi-View
== Мульти-камера
Mute when not active
== Приглушувати, якщо вікно неактивне
== Приглушувати звук поза грою
NA
== ПНА
@ -1021,7 +1052,7 @@ Netversion
== Версія
New name:
== Нова назва
== Нова назва:
New random timeout code
== Новий випадковий код тайм-ауту
@ -1033,16 +1064,16 @@ Next weapon
== Наст. зброя
Nickname
== Нікнейм
== Псевдонім
No
== Ні
No answer from server yet.
== Сервер ще не відповів.
== Поки що немає відповіді від сервера.
No controller found. Plug in a controller.
== Жодного контролера не знайдено. Підключіть контролер.
== Жодного контролера не знайдено. Під’єднайте контролер.
No demo selected
== Жодного демо не вибрано
@ -1071,6 +1102,9 @@ No updates available
None
== Немає
Normal:
== Звичайний:
Normal Color
== Колір звичайних повідомлень
@ -1078,23 +1112,23 @@ Normal message
== Звичайні повідомлення
NOT CONNECTED
== НЕ ПРИЄДНАНО
== НЕ ПІД’ЄДНАНО
Nothing hookable
== нічим, за що можна зачепитися
[friends (server browser)]
Offline (%d)
== Офлайн (%d)
== Не в мережі (%d)
Ok
== Гаразд
Online clanmates (%d)
== Онлайн клановці (%d)
== Співклановці в мережі (%d)
Online players (%d)
== Онлайн гравці (%d)
== Гравці в мережі (%d)
Only save improvements
== Зберігати лише покращення
@ -1125,7 +1159,7 @@ Open the settings file
[Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
== Недостатньо відеопам'яті. Спробуйте видалити власні текстури (скіни, сутності і т.п.), особливо ті, що мають високу роздільну здатність.
== Недостатньо відеопамяті. Спробуйте видалити власні текстури (скіни, сутності і т.д.), особливо ті, що мають високу роздільність.
Overlay entities
== Накладати сутності
@ -1134,7 +1168,7 @@ Parent Folder
== Батьківська тека
Particles
== Часточки
== Частинки
Pause
== Пауза
@ -1176,9 +1210,6 @@ Player country:
Player info change cooldown
== Затримка зміни інформації про гравця
Player options
== Налаштування гравців
Players
== Гравці
@ -1191,11 +1222,14 @@ Please enter your nickname below.
Please use a different filename
== Будь ласка, назвіть файл по-іншому
Please wait…
== Будь ласка, зачекайте…
Position:
== Позиція:
Preparing demo playback
== Підготовлюємо відтворення демо
== Підготовлення відтворення демо
Press a key…
== Натисніть клавішу…
@ -1210,7 +1244,7 @@ Quads are used for background decoration
== Квади використовуються для декорацій
Quit
== Вихід
== Вийти
Quitting. Please wait…
== Вихід. Будь ласка, зачекайте…
@ -1218,6 +1252,9 @@ Quitting. Please wait…
Race
== Забіг
Randomize
== Навмання
Ratio
== У/С
@ -1225,7 +1262,7 @@ Reason:
== Причина:
Reconnect in %d sec
== Переприєднання через %dс
== Повторне під’єднання за %dс
Record demo
== Запис демо
@ -1240,15 +1277,12 @@ Refresh Rate
== Частота кадрів
Regular background color
== Колір звичайного фону
== Колір звичайного тла
[Ingame controller mode]
Relative
== Відносний
Reload
== Оновити
Remote console
== Віддалена консоль
@ -1286,10 +1320,10 @@ Replay
== Повтор
Replay feature is disabled!
== Повтори відключено!
== Повтори вимкнено!
Requesting to join the game
== Запитуємо приєднання до гри
== Запит на приєднання до гри
Reset
== Скинути
@ -1301,7 +1335,7 @@ Reset filter
== Скинути фільтр
Reset to defaults
== Скинути
== Скинути до типових
Restart
== Перезапустити
@ -1328,7 +1362,7 @@ SA
== ПДА
Same clan color in scoreboard
== Колір співклановців у таблі
== Колір співклановців у таблиці
Sat.
== Насич.
@ -1340,7 +1374,7 @@ Save ghost
== Зберігати привида
Save power by lowering refresh rate (higher input latency)
== Зберігати енергію зниженням частоти кадрів (вища затримка вводу)
== Економити енергію шляхом зниження частоти кадрів (вища затримка введення)
Save the best demo of each race
== Зберігати найкраще демо кожного забігу
@ -1355,7 +1389,7 @@ Score limit
== Гра до
Scoreboard
== Табло
== Таблиця
Screen
== Екран
@ -1367,10 +1401,10 @@ Search
== Пошук
Searching
== Шукаємо
== Пошук
Sending initial client info
== Надсилаємо початкові дані клієнта
== Надсилання початкових даних клієнта
Server address:
== Адреса сервера:
@ -1391,7 +1425,7 @@ Server not full
== Неповний сервер
Set all to Rifle
== Встановити так, як у гвинтівки
== Установити так, як у гвинтівки
Settings
== Налаштування
@ -1417,8 +1451,8 @@ Show chat
Show clan above name plates
== Показувати клан над ніками
Show client IDs in scoreboard
== Показувати ID клієнта в таблі
Show client IDs (scoreboard, chat, spectator)
== Показувати ID клієнта (таблиця, чат, глядачі)
Show DDNet map finishes in server browser
== Показувати пройдені мапи DDNet у браузері серверів
@ -1430,7 +1464,7 @@ Show dummy actions
== Показувати дії з даммі
Show entities
== Сутності
== Показ сутностей
Show finish messages
== Показувати повідомлення про фініші
@ -1439,7 +1473,7 @@ Show freeze bars
== Показувати смугу заморозки
Show friend mark (♥) in name plates
== Показувати позначку друга (♥) біля ніків
== Показувати позначку друга (♥) біля псевдонімів
Show friends only
== Показувати лише з друзями
@ -1448,10 +1482,10 @@ Show ghost
== Показувати привида
Show health, shields and ammo
== Показувати здоров'я, щити й набої
== Показувати здоров’я, захист і набої
Show hook strength icon indicator
== Показувати графічний індикатор сили гака
== Показувати іконку індикатора сили гака
Show hook strength number indicator
== Показувати числовий індикатор сили гака
@ -1475,10 +1509,10 @@ Show local time always
== Завжди показувати місцевий час
Show name plates
== Показувати ніки
== Показувати псевдоніми
Show names in chat in team colors
== Фарбувати ніки в чаті в кольори команд
== Показувати імена в чаті в кольорах команди
Show only chat messages from friends
== Показувати лише повідомлення від друзів
@ -1517,7 +1551,7 @@ Show text entities
== Текстові сутності
Show tiles layers from BG map
== Показувати тайли з мапи фону
== Показувати плитки з мапи фону
Show quads
== Показувати квади
@ -1547,13 +1581,13 @@ Slow down the demo
== Сповільнити
Smooth Dynamic Camera
== Гладка рухома камера
== Гладка динамічна камера
Some map images could not be loaded. Check the local console for details.
== Деякі зображення мапи не завантажилися. Деталі у локальній консолі.
== Деякі зображення мапи не завантажилися. Див. локальну консоль для подробиць.
Some map sounds could not be loaded. Check the local console for details.
== Деякі звуки мапи не завантажилися. Деталі у локальній консолі.
== Деякі звуки мапи не завантажилися. Див. локальну консоль для подробиць.
Something hookable
== чимось, за що можна зачепитися
@ -1577,10 +1611,10 @@ Spectate previous
== Попер. гравець
Spectator mode
== Режим спостерігача
== Режим глядача
Spectators
== Спостерігачі
== Глядачі
Speed
== Швидкість
@ -1632,7 +1666,7 @@ Switch weapon on pickup
== Змінювати зброю при підхопленні
Switch weapon when out of ammo
== Змінювати зброю коли закінчуються набої
== Змінювати зброю при закінченні набоїв
System message
== Повідомлення системи
@ -1640,6 +1674,9 @@ System message
Team
== Команда
Team:
== Командний:
Team %d
== Команда %d
@ -1695,7 +1732,10 @@ Toggle ghost
== Привид
Toggle keyboard shortcuts
== Перемкнути скорочення
== Перемкнути сполучення
Toggle to edit your dummy settings
== Перемкніть, щоб змінити налаштування даммі
transmits your player name to info.ddnet.org
== передає ваш нікнейм до info.ddnet.org
@ -1707,7 +1747,7 @@ Try again
== Спробувати ще раз
Trying to determine UDP connectivity…
== Намагаємося визначити UDP-з'єднання…
== Спроба визначити UDP-з’єднання…
Tutorial
== Посібник
@ -1728,10 +1768,13 @@ UI Color
== Колір інтерфейсу
UI controller sens.
== Чутл. у інтерфейсі
== Чутл. в інтерфейсі
UI mouse sens.
== Чутл. у інтерфейсі
== Чутл. в інтерфейсі
Unable to delete skin
== Не вдалося видалити скін
Unable to delete the demo '%s'
== Не вдалося видалити демо '%s'
@ -1756,25 +1799,25 @@ Unregister protocol and file extensions
== Розреєструвати протокол і розширення файлів
Update failed! Check log…
== Оновлення не вдалося! Перевірте журнал…
== Помилка оновлення! Перевірте журнал…
Update now
== Оновити
Updating…
== Оновлюємо
== Оновлення
Uploading map data to GPU
== Вивантажуємо дані мапи до відеокарти
== Вивантаження даних мапи до відеокарти
Use current map as background
== Використовувати поточну мапу як фон
== Використовувати поточну мапу як тло
Use high DPI
== Високий DPI
Use k key to kill (restart), q to pause and watch other players. See settings for other key binds.
== Натисніть "k", щоб умерти (почати спочатку), "q", щоб спостерігати за іншими гравцями. Інші скорочення дивіться у налаштуваннях.
== Натисніть «k», щоб умерти (почати спочатку), «q», щоб спостерігати за іншими гравцями. Інші призначення клавіш дивіться у налаштуваннях.
Use old chat style
== Старий стиль чату
@ -1798,7 +1841,7 @@ Video name:
== Назва відео:
Video was saved to '%s'
== Відео було збережено до '%s'
== Відео збережено до '%s'
Videos directory
== Тека відео
@ -1843,13 +1886,13 @@ Why are you slowmo replaying to read this?
== Чому ви переглядаєте це у повторі?
Windowed
== Віконний
== У вікні
Windowed borderless
== Віконний без рамок
== Вікно без рамок
Windowed fullscreen
== Віконний повноекранний
== Вікно на весь екран
Yes
== Так
@ -1858,10 +1901,10 @@ Your movements are not taken into account when calculating the line colors
== Ваші рухи не враховуються при розранку кольору лінії
You must restart the game for all settings to take effect.
== Щоб налаштування набрали чинності, перезапустіть гру.
== Щоб налаштування набули чинності, перезапустіть гру.
Your nickname '%s' is already used (%d points). Do you still want to use it?
== Нікнейм '%s' вже зайнято (%d балів). Все ще хочете використовувати його?
== Ваш псевдонім «%s» вже зайнято (%d балів). Усе ще хочете використовувати його?
Your skin
== Ваш скін

BIN
data/mapres/ddnet_grass.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -115,6 +115,8 @@ public:
const char *FailedObjOn() const;
const char *GetMsgName(int Type) const;
void DebugDumpSnapshot(const class CSnapshot *pSnap) const;
int DumpObj(int Type, const void *pData, int Size) const;
void *SecureUnpackMsg(int Type, CUnpacker *pUnpacker);
bool TeeHistorianRecordMsg(int Type);
const char *FailedMsgOn() const;
@ -133,7 +135,9 @@ def gen_network_source():
#include <engine/shared/packer.h>
#include <engine/shared/protocol.h>
#include <engine/shared/uuid_manager.h>
#include <engine/shared/snapshot.h>
#include <game/gamecore.h>
#include <game/mapitems_ex.h>
CNetObjHandler::CNetObjHandler()
@ -245,8 +249,47 @@ const char *CNetObjHandler::GetMsgName(int Type) const
}
return "(out of range)";
}
void CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap) const
{
dbg_msg("snapshot", "data_size=%d num_items=%d", pSnap->DataSize(), pSnap->NumItems());
for(int i = 0; i < pSnap->NumItems(); i++)
{
const CSnapshotItem *pItem = pSnap->GetItem(i);
int Size = pSnap->GetItemSize(i);
int Type = pSnap->GetItemType(i);
const char *pName = GetObjName(pItem->Type());
if(Type > OFFSET_UUID && Type < g_UuidManager.NumUuids() + OFFSET_UUID)
pName = g_UuidManager.GetName(Type);
dbg_msg("snapshot", "\\t%s type=%d id=%d size=%d", pName, pItem->Type(), pItem->Id(), Size);
if(!DumpObj(Type, pItem->Data(), Size))
continue;
for(size_t b = 0; b < Size / sizeof(int32_t); b++)
dbg_msg("snapshot", "\\t\\t%3d %12d\\t%08x", (int)b, pItem->Data()[b], pItem->Data()[b]);
}
}
""")
lines = []
lines += ['int CNetObjHandler::DumpObj(int Type, const void *pData, int Size) const']
lines += ['{']
lines += ["\tchar aRawData[512];"]
lines += ['\tswitch(Type)']
lines += ['\t{']
for item in network.Objects:
for line in item.emit_dump(network.Objects):
lines += ["\t" + line]
lines += ['\t']
lines += ['\t}']
lines += ['\treturn -1;']
lines += ['};']
lines += ['']
for line in lines:
print(line)
lines = []
lines += ["""\
void *CNetObjHandler::SecureUnpackObj(int Type, CUnpacker *pUnpacker)
@ -275,10 +318,10 @@ void *CNetObjHandler::SecureUnpackObj(int Type, CUnpacker *pUnpacker)
m_pObjFailedOn = "(type out of range)";
break;
}
if(pUnpacker->Error())
m_pObjFailedOn = "(unpack error)";
if(m_pObjFailedOn)
return 0;
m_pObjFailedOn = "";
@ -308,10 +351,10 @@ void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)
m_pMsgFailedOn = "(type out of range)";
break;
}
if(pUnpacker->Error())
m_pMsgFailedOn = "(unpack error)";
if(m_pMsgFailedOn)
return 0;
m_pMsgFailedOn = "";

View file

@ -233,6 +233,15 @@ class NetObject:
lines += ["};"]
return lines
def members_from_this_and_parents(self, objects):
variables = self.variables
next_base_name = self.base
while next_base_name is not None:
base_item = only([i for i in objects if i.name == next_base_name])
variables = base_item.variables + variables
next_base_name = base_item.base
return variables
def emit_uncompressed_unpack_and_validate(self, objects):
lines = []
lines += [f"case {self.enum_name}:"]
@ -240,12 +249,7 @@ class NetObject:
lines += [f"\t{self.struct_name} *pData = ({self.struct_name} *)m_aUnpackedData;"]
unpack_lines = []
variables = self.variables
next_base_name = self.base
while next_base_name is not None:
base_item = only([i for i in objects if i.name == next_base_name])
variables = base_item.variables + variables
next_base_name = base_item.base
variables = self.members_from_this_and_parents(objects)
for v in variables:
if not self.validate_size and v.default is None:
raise ValueError(f"{v.name} in {self.name} has no default value. Member variables that do not have a default value cannot be used in a structure whose size is not validated.")
@ -260,6 +264,26 @@ class NetObject:
lines += ["} break;"]
return lines
def emit_dump(self, objects):
lines = []
lines += [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
unpack_lines = []
variables = self.members_from_this_and_parents(objects)
offset = 0
for v in variables:
unpack_lines += ["\t"+line for line in v.emit_dump(offset)]
offset += 1
if len(unpack_lines) > 0:
lines += unpack_lines
else:
lines += ["\t(void)pData;"]
lines += ["return 0;"]
lines += ["};"]
return lines
class NetEvent(NetObject):
def __init__(self, name, variables, ex=None):
NetObject.__init__(self, name, variables, ex=ex)
@ -340,6 +364,8 @@ class NetVariable:
return []
def emit_unpack_msg_check(self):
return []
def emit_dump(self, offset):
return [f"str_format(aRawData, sizeof(aRawData), \"\\t\\t%3d %12d\\t%08x\", {offset}, ((const int *)pData)[{offset}], ((const int *)pData)[{offset}]);"]
class NetString(NetVariable):
def emit_declaration(self):
@ -384,6 +410,16 @@ class NetIntAny(NetVariable):
return [f"pData->{self.name} = pUnpacker->GetIntOrDefault({self.default});"]
def emit_pack(self):
return [f"pPacker->AddInt({self.name});"]
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d\", aRawData, pObj->{self.name});"]
class NetTwIntString(NetIntAny):
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"aInts[0] = pObj->{self.name};"] + \
["IntsToStr(aInts, std::size(aInts), aStr, std::size(aStr));"] + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d\\tIntToStr: %s\", aRawData, pObj->{self.name}, aStr);"]
class NetIntRange(NetIntAny):
def __init__(self, name, min_val, max_val, default=None):
@ -394,6 +430,23 @@ class NetIntRange(NetIntAny):
return [f"pData->{self.name} = ClampInt(\"{self.name}\", pData->{self.name}, {self.min}, {self.max});"]
def emit_unpack_msg_check(self):
return [f"if(pData->{self.name} < {self.min} || pData->{self.name} > {self.max}) {{ m_pMsgFailedOn = \"{self.name}\"; break; }}"]
def emit_dump(self, offset):
min_fmt=f"min={self.min}"
min_arg = ''
try:
int(self.min)
except ValueError:
min_fmt = f"min={self.min}(%d)"
min_arg = f", (int){self.min}"
max_fmt=f"max={self.max}"
max_arg = ''
try:
int(self.max)
except ValueError:
max_fmt = f"max={self.max}(%d)"
max_arg = f", (int){self.max}"
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d ({min_fmt} {max_fmt})\", aRawData, pObj->{self.name}{min_arg}{max_arg});"]
class NetBool(NetIntRange):
def __init__(self, name, default=None):
@ -403,6 +456,9 @@ class NetBool(NetIntRange):
class NetTick(NetIntAny):
def __init__(self, name, default=None):
NetIntAny.__init__(self,name,default=default)
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d (NetTick)\", aRawData, pObj->{self.name});"]
class NetArray(NetVariable):
def __init__(self, var, size):

View file

@ -1,7 +1,8 @@
# pylint: skip-file
# See https://github.com/ddnet/ddnet/issues/3507
from datatypes import Enum, Flags, NetArray, NetBool, NetEvent, NetEventEx, NetIntAny, NetIntRange, NetMessage, NetMessageEx, NetObject, NetObjectEx, NetString, NetStringHalfStrict, NetStringStrict, NetTick
from datatypes import Enum, Flags, NetArray, NetBool, NetEvent, NetEventEx, NetIntAny, NetTwIntString, NetIntRange
from datatypes import NetMessage, NetMessageEx, NetObject, NetObjectEx, NetString, NetStringHalfStrict, NetStringStrict, NetTick
Emotes = ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"]
PlayerFlags = ["PLAYING", "IN_MENU", "CHATTING", "SCOREBOARD", "AIM"]
@ -215,17 +216,15 @@ Objects = [
NetObject("ClientInfo", [
# 4*4 = 16 characters
NetIntAny("m_Name0"), NetIntAny("m_Name1"), NetIntAny("m_Name2"),
NetIntAny("m_Name3"),
NetArray(NetTwIntString("m_aName"), 4),
# 4*3 = 12 characters
NetIntAny("m_Clan0"), NetIntAny("m_Clan1"), NetIntAny("m_Clan2"),
NetArray(NetTwIntString("m_aClan"), 3),
NetIntAny("m_Country"),
# 4*6 = 24 characters
NetIntAny("m_Skin0"), NetIntAny("m_Skin1"), NetIntAny("m_Skin2"),
NetIntAny("m_Skin3"), NetIntAny("m_Skin4"), NetIntAny("m_Skin5"),
NetArray(NetTwIntString("m_aSkin"), 6),
NetIntRange("m_UseCustomColor", 0, 1),
@ -552,7 +551,7 @@ Messages = [
NetIntAny("m_ServerTimeBest"),
NetIntAny("m_PlayerTimeBest"),
]),
NetMessageEx("Sv_KillMsgTeam", "killmsgteam@netmsg.ddnet.tw", [
NetIntRange("m_Team", 0, 'MAX_CLIENTS-1'),
NetIntRange("m_First", -1, 'MAX_CLIENTS-1'),

View file

@ -87,6 +87,7 @@ def main():
print("#ifndef GAME_GENERATED_PROTOCOL7_H")
print("#define GAME_GENERATED_PROTOCOL7_H")
print("class CUnpacker;")
print("class CSnapshot;")
print("#include <engine/message.h>")
print("namespace protocol7 {")
print(network.RawHeader)
@ -150,6 +151,8 @@ def main():
CNetObjHandler();
int ValidateObj(int Type, const void *pData, int Size);
void DebugDumpSnapshot(const CSnapshot *pSnap) const;
int DumpObj(int Type, const void *pData, int Size) const;
const char *GetObjName(int Type) const;
int GetObjSize(int Type) const;
const char *FailedObjOn() const;
@ -174,6 +177,7 @@ def main():
lines += ['#include <base/system.h>']
lines += ['#include <engine/shared/packer.h>']
lines += ['#include <engine/shared/protocol.h>']
lines += ['#include <engine/shared/snapshot.h>']
lines += ['namespace protocol7 {']
@ -269,6 +273,46 @@ def main():
lines += ['};']
lines += ['']
for l in lines:
print(l)
print("""\
void CNetObjHandler::DebugDumpSnapshot(const ::CSnapshot *pSnap) const
{
dbg_msg("snapshot", "data_size=%d num_items=%d", pSnap->DataSize(), pSnap->NumItems());
for(int i = 0; i < pSnap->NumItems(); i++)
{
const CSnapshotItem *pItem = pSnap->GetItem(i);
int Size = pSnap->GetItemSize(i);
int Type = pSnap->GetItemType(i);
const char *pName = GetObjName(pItem->Type());
if(Type > OFFSET_UUID && Type < g_UuidManager.NumUuids() + OFFSET_UUID)
pName = g_UuidManager.GetName(Type);
dbg_msg("snapshot", "\\t%s type=%d id=%d size=%d", pName, pItem->Type(), pItem->Id(), Size);
if(!DumpObj(Type, pItem->Data(), Size))
continue;
for(size_t b = 0; b < Size / sizeof(int32_t); b++)
dbg_msg("snapshot", "\\t\\t%3d %12d\\t%08x", (int)b, pItem->Data()[b], pItem->Data()[b]);
}
}\n""")
lines = []
lines += ['int CNetObjHandler::DumpObj(int Type, const void *pData, int Size) const']
lines += ['{']
lines += ["\tchar aRawData[512];"]
lines += ['\tswitch(Type)']
lines += ['\t{']
for item in network.Objects:
for line in item.emit_dump(network.Objects):
lines += ["\t" + line]
lines += ['\t']
lines += ['\t}']
lines += ['\treturn -1;']
lines += ['};']
lines += ['']
lines += ['void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)']
lines += ['{']
lines += ['\tm_pMsgFailedOn = 0;']

View file

@ -234,24 +234,38 @@ class NetObject:
lines += ["\t"+line for line in v.emit_declaration()]
lines += ["};"]
return lines
def emit_validate(self, objects):
lines = [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
lines += ["\tif(sizeof(*pObj) != Size) return -1;"]
def members_from_this_and_parents(self, objects):
variables = self.variables
next_base_name = self.base
while next_base_name is not None:
base_item = only([i for i in objects if i.name == next_base_name])
variables = base_item.variables + variables
next_base_name = base_item.base
return variables
def emit_validate(self, objects):
lines = [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
lines += ["\tif(sizeof(*pObj) != Size) return -1;"]
variables = self.members_from_this_and_parents(objects)
for v in variables:
lines += ["\t"+line for line in v.emit_validate()]
lines += ["\treturn 0;"]
lines += ["}"]
return lines
def emit_dump(self, objects):
lines = [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
lines += ["\tif(sizeof(*pObj) != Size) return -1;"]
variables = self.members_from_this_and_parents(objects)
offset = 0
for v in variables:
lines += ["\t"+line for line in v.emit_dump(offset)]
offset += 1
lines += ["\treturn 0;"]
lines += ["}"]
return lines
class NetEvent(NetObject):
@ -312,6 +326,8 @@ class NetVariable:
return []
def emit_unpack_check(self):
return []
def emit_dump(self, offset):
return [f"str_format(aRawData, sizeof(aRawData), \"\\t\\t%3d %12d\\t%08x\", {offset}, ((const int *)pData)[{offset}], ((const int *)pData)[{offset}]);"]
class NetString(NetVariable):
def emit_declaration(self):
@ -338,6 +354,9 @@ class NetIntAny(NetVariable):
return [f"pMsg->{self.name} = pUnpacker->GetIntOrDefault({self.default});"]
def emit_pack(self):
return [f"pPacker->AddInt({self.name});"]
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d\", aRawData, pObj->{self.name});"]
class NetIntRange(NetIntAny):
def __init__(self, name, min_val, max_val, default=None):
@ -348,6 +367,23 @@ class NetIntRange(NetIntAny):
return [f"if(!CheckInt(\"{self.name}\", pObj->{self.name}, {self.min}, {self.max})) return -1;"]
def emit_unpack_check(self):
return [f"if(!CheckInt(\"{self.name}\", pMsg->{self.name}, {self.min}, {self.max})) break;"]
def emit_dump(self, offset):
min_fmt=f"min={self.min}"
min_arg = ''
try:
int(self.min)
except ValueError:
min_fmt = f"min={self.min}(%d)"
min_arg = f", (int){self.min}"
max_fmt=f"max={self.max}"
max_arg = ''
try:
int(self.max)
except ValueError:
max_fmt = f"max={self.max}(%d)"
max_arg = f", (int){self.max}"
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d ({min_fmt} {max_fmt})\", aRawData, pObj->{self.name}{min_arg}{max_arg});"]
class NetEnum(NetIntRange):
def __init__(self, name, enum):
@ -366,6 +402,9 @@ class NetFlag(NetIntAny):
return [f"if(!CheckFlag(\"{self.name}\", pObj->{self.name}, {self.mask})) return -1;"]
def emit_unpack_check(self):
return [f"if(!CheckFlag(\"{self.name}\", pMsg->{self.name}, {self.mask})) break;"]
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d (mask=%d)\", aRawData, pObj->{self.name}, {self.mask});"]
class NetBool(NetIntRange):
def __init__(self, name, default=None):

@ -1 +1 @@
Subproject commit d5f0cd9194936d1ab5bd19952645b8dffe9ae06c
Subproject commit e78f350e7898fc6b0702cdc3b7ce6ee347c97d49

View file

@ -4,6 +4,7 @@ Requirements for building for Android
- At least 10-15 GiB of free disk space.
- First follow the general instructions for setting up https://github.com/ddnet/ddnet for building on Linux.
This guide has only been tested on Linux.
- Note: Use a stable version of Rust. Using the nightly version results in linking errors.
- Install the Android NDK (version 26) in the same location
where Android Studio would unpack it (`~/Android/Sdk/ndk/`):
```shell

View file

@ -7,8 +7,6 @@ export MAKEFLAGS
ANDROID_NDK_VERSION="$(cd "$ANDROID_HOME/ndk" && find . -maxdepth 1 | sort -n | tail -1)"
ANDROID_NDK_VERSION="${ANDROID_NDK_VERSION:2}"
# ANDROID_NDK_VERSION must be exported for build.sh step
export ANDROID_NDK_VERSION
# ANDROID_NDK_HOME must be exported for cargo-ndk
export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION"
@ -197,6 +195,7 @@ cd "${BUILD_FOLDER}" || exit 1
mkdir -p src/main
mkdir -p src/main/res/values
mkdir -p src/main/res/xml
mkdir -p src/main/res/mipmap
function copy_dummy_files() {
@ -213,6 +212,7 @@ copy_dummy_files scripts/android/files/proguard-rules.pro proguard-rules.pro
copy_dummy_files scripts/android/files/settings.gradle settings.gradle
copy_dummy_files scripts/android/files/AndroidManifest.xml src/main/AndroidManifest.xml
copy_dummy_files scripts/android/files/res/values/strings.xml src/main/res/values/strings.xml
copy_dummy_files scripts/android/files/res/xml/shortcuts.xml src/main/res/xml/shortcuts.xml
copy_dummy_files other/icons/DDNet_256x256x32.png src/main/res/mipmap/ic_launcher.png
copy_dummy_files other/icons/DDNet_256x256x32.png src/main/res/mipmap/ic_launcher_round.png

View file

@ -30,7 +30,8 @@
android:name="org.ddnet.client.NativeMain"
android:exported="true"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:screenOrientation="landscape">
android:screenOrientation="landscape"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@ -38,6 +39,9 @@
<meta-data
android:name="android.app.lib_name"
android:value="DDNet" />
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
</application>
</manifest>

View file

@ -18,7 +18,6 @@ java {
android {
compileSdkVersion 34
ndkVersion "TW_NDK_VERSION"
defaultConfig {
applicationId "org.ddnet.client"
namespace("org.ddnet.client")
@ -43,6 +42,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled false
shrinkResources false
}

View file

@ -45,12 +45,13 @@ sed -i "s/TW_KEY_NAME/${TW_KEY_NAME_ESCAPED}/g" build.gradle
sed -i "s/TW_KEY_PW/${TW_KEY_PW_ESCAPED}/g" build.gradle
sed -i "s/TW_KEY_ALIAS/${TW_KEY_ALIAS_ESCAPED}/g" build.gradle
sed -i "s/TW_NDK_VERSION/${ANDROID_NDK_VERSION}/g" build.gradle
sed -i "s/TW_VERSION_CODE/${TW_VERSION_CODE}/g" build.gradle
sed -i "s/TW_VERSION_NAME/${TW_VERSION_NAME}/g" build.gradle
sed -i "s/DDNet/${APK_BASENAME}/g" src/main/res/values/strings.xml
sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" src/main/res/xml/shortcuts.xml
sed -i "s/\"DDNet\"/\"${APK_BASENAME}\"/g" src/main/AndroidManifest.xml
sed -i "s/org.ddnet.client/${APK_PACKAGE_NAME}/g" src/main/AndroidManifest.xml

View file

@ -10,6 +10,8 @@ public class NativeMain extends SDLActivity {
private static final int COMMAND_RESTART_APP = SDLActivity.COMMAND_USER + 1;
private String[] launchArguments = new String[0];
@Override
protected String[] getLibraries() {
return new String[] {
@ -20,17 +22,35 @@ public class NativeMain extends SDLActivity {
@Override
public void onCreate(Bundle SavedInstanceState) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Intent intent = getIntent();
if(intent != null) {
String gfxBackend = intent.getStringExtra("gfx-backend");
if(gfxBackend != null) {
if(gfxBackend.equals("Vulkan")) {
launchArguments = new String[] {"gfx_backend Vulkan"};
} else if(gfxBackend.equals("OpenGL")) {
launchArguments = new String[] {"gfx_backend OpenGL"};
}
}
}
super.onCreate(SavedInstanceState);
}
@Override
protected String[] getArguments() {
return launchArguments;
}
@Override
protected boolean onUnhandledMessage(int command, Object param) {
if(command == COMMAND_RESTART_APP) {
restartApp();
return true;
}
return false;
}
return false;
}
private void restartApp() {
Intent restartIntent =

View file

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">DDNet</string>
<string name="app_name">DDNet</string>
<string name="shortcut_play_vulkan_short">Play (Vulkan)</string>
<string name="shortcut_play_opengl_short">Play (OpenGL)</string>
</resources>

View file

@ -0,0 +1,30 @@
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="play-vulkan"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/shortcut_play_vulkan_short">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="org.ddnet.client"
android:targetClass="org.ddnet.client.NativeMain">
<extra
android:name="gfx-backend"
android:value="Vulkan" />
</intent>
</shortcut>
<shortcut
android:shortcutId="play-opengl"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:shortcutShortLabel="@string/shortcut_play_opengl_short">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="org.ddnet.client"
android:targetClass="org.ddnet.client.NativeMain">
<extra
android:name="gfx-backend"
android:value="OpenGL" />
</intent>
</shortcut>
</shortcuts>

View file

@ -80,7 +80,7 @@ cd compile_libs || exit 1
build_cmake_lib zlib https://github.com/madler/zlib
build_cmake_lib png https://github.com/glennrp/libpng
build_cmake_lib curl https://github.com/curl/curl
build_cmake_lib curl https://github.com/curl/curl "curl-8_8_0"
build_cmake_lib freetype2 https://gitlab.freedesktop.org/freetype/freetype
build_cmake_lib sdl https://github.com/libsdl-org/SDL SDL2
build_cmake_lib ogg https://github.com/xiph/ogg

View file

@ -7,22 +7,6 @@ class LanguageDecodeError(Exception):
error = f"File \"{filename}\", line {line+1}: {message}"
super().__init__(error)
# Taken from https://stackoverflow.com/questions/30011379/how-can-i-parse-a-c-format-string-in-python
cfmt = r'''\
( # start of capture group 1
% # literal "%"
(?: # first option
(?:[-+0 #]{0,5}) # optional flags
(?:\d+|\*)? # width
(?:\.(?:\d+|\*))? # precision
(?:h|l|ll|w|I|I32|I64)? # size
[cCdiouxXeEfgGaAnpsSZ] # type
) | # OR
%%) # literal "%%"
'''
def decode(fileobj, elements_per_key):
data = {}
current_context = ""
@ -45,10 +29,7 @@ def decode(fileobj, elements_per_key):
if len(data[current_key]) >= 1+elements_per_key:
raise LanguageDecodeError("Wrong number of elements per key", fileobj.name, index)
if current_key:
original = current_key[0] # pylint: disable=unsubscriptable-object
translation = line[3:]
if translation and [m.group(1) for m in re.finditer(cfmt, original, flags=re.X)] != [m.group(1) for m in re.finditer(cfmt, translation, flags=re.X)]:
raise LanguageDecodeError("Non-matching formatting string", fileobj.name, index)
data[current_key].extend([translation])
else:
raise LanguageDecodeError("Element before key given", fileobj.name, index)
@ -56,7 +37,7 @@ def decode(fileobj, elements_per_key):
if current_key:
if len(data[current_key]) != 1+elements_per_key:
raise LanguageDecodeError("Wrong number of elements per key", fileobj.name, index)
data[current_key].append(index)
data[current_key].append(index - 1 if current_context else index)
if line in data:
raise LanguageDecodeError("Key defined multiple times: " + line, fileobj.name, index)
data[(line, current_context)] = [index - 1 if current_context else index]

54
scripts/languages/validate.py Executable file
View file

@ -0,0 +1,54 @@
#!/usr/bin/env python3
import os
import sys
import re
import twlang
os.chdir(os.path.dirname(__file__) + "/../..")
# Taken from https://stackoverflow.com/questions/30011379/how-can-i-parse-a-c-format-string-in-python
cfmt = '''
( # start of capture group 1
% # literal "%"
(?: # first option
(?:[-+0 #]{0,5}) # optional flags
(?:\\d+|\\*)? # width
(?:\\.(?:\\d+|\\*))? # precision
(?:h|l|ll|w|I|I32|I64)? # size
[cCdiouxXeEfgGaAnpsSZ] # type
) | # OR
%%) # literal "%%"
'''
total_errors = 0
def print_validation_error(error, filename, error_line):
print(f"Invalid: {translated}")
print(f"- {error} in {filename}:{error_line + 1}\n")
global total_errors
total_errors += 1
if len(sys.argv) > 1:
languages = sys.argv[1:]
else:
languages = twlang.languages()
local = twlang.localizes()
for language in languages:
translations = twlang.translations(language)
for (english, _), (line, translated, _) in translations.items():
if not translated:
continue
# Validate c format strings. Strings that move the formatters are not validated.
if re.findall(cfmt, english, flags=re.X) != re.findall(cfmt, translated, flags=re.X) and not "1$" in translated:
print_validation_error("Non-matching formatting", language, line)
# Check for elipisis
if "" in english and "..." in translated:
print_validation_error("Usage of ... instead of the … character", language, line)
if total_errors:
print(f"Found {total_errors} {'error' if total_errors == 1 else 'errors'} ")
sys.exit(1)

View file

@ -171,7 +171,7 @@
#define CONF_ARCH_ENDIAN_LITTLE 1
#endif
#if defined(__aarch64__) || defined(__arm64__)
#if defined(__aarch64__) || defined(__arm64__) || defined(__ARM_ARCH)
#define CONF_ARCH_ARM64 1
#define CONF_ARCH_STRING "arm64"
#define CONF_ARCH_ENDIAN_LITTLE 1

View file

@ -867,10 +867,15 @@ void sphore_destroy(SEMAPHORE *sem)
#elif defined(CONF_PLATFORM_MACOS)
void sphore_init(SEMAPHORE *sem)
{
char aBuf[32];
str_format(aBuf, sizeof(aBuf), "%p", (void *)sem);
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "/%d.%p", pid(), (void *)sem);
*sem = sem_open(aBuf, O_CREAT | O_EXCL, S_IRWXU | S_IRWXG, 0);
dbg_assert(*sem != SEM_FAILED, "sem_open failure");
if(*sem == SEM_FAILED)
{
char aError[128];
str_format(aError, sizeof(aError), "sem_open failure, errno=%d, name='%s'", errno, aBuf);
dbg_assert(false, aError);
}
}
void sphore_wait(SEMAPHORE *sem)
{
@ -888,8 +893,8 @@ void sphore_signal(SEMAPHORE *sem)
void sphore_destroy(SEMAPHORE *sem)
{
dbg_assert(sem_close(*sem) == 0, "sem_close failure");
char aBuf[32];
str_format(aBuf, sizeof(aBuf), "%p", (void *)sem);
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "/%d.%p", pid(), (void *)sem);
dbg_assert(sem_unlink(aBuf) == 0, "sem_unlink failure");
}
#elif defined(CONF_FAMILY_UNIX)
@ -1130,22 +1135,6 @@ bool net_addr_str(const NETADDR *addr, char *string, int max_length, int add_por
return true;
}
void net_addr_url_str(const NETADDR *addr, char *string, int max_length, int add_port)
{
char ipaddr[512];
if(!net_addr_str(addr, ipaddr, sizeof(ipaddr), add_port))
{
str_copy(string, ipaddr, max_length);
return;
}
str_format(
string,
max_length,
"tw-%s+udp://%s",
addr->type & NETTYPE_TW7 ? "0.7" : "0.6",
ipaddr);
}
static int priv_net_extract(const char *hostname, char *host, int max_host, int *port)
{
int i;

View file

@ -818,23 +818,6 @@ int net_addr_comp_noport(const NETADDR *a, const NETADDR *b);
*/
bool net_addr_str(const NETADDR *addr, char *string, int max_length, int add_port);
/**
* Turns a network address into a url string.
* Examples:
* tw-0.6+udp://127.0.0.1:8303
* tw-0.7+udp://127.0.0.1
*
* @ingroup Network-General
*
* @param addr Address to turn into a string.
* @param string Buffer to fill with the url string.
* @param max_length Maximum size of the url string.
* @param add_port add port to url string or not
*
* @remark The string will always be zero terminated
*/
void net_addr_url_str(const NETADDR *addr, char *string, int max_length, int add_port);
/**
* Turns url string into a network address struct.
* The url format is tw-0.6+udp://{ipaddr}[:{port}]
@ -1253,6 +1236,7 @@ int str_format_int(char *buffer, size_t buffer_size, int value);
template<typename... Args>
int str_format_opt(char *buffer, int buffer_size, const char *format, Args... args)
{
static_assert(sizeof...(args) > 0, "Use str_copy instead of str_format without format arguments");
return str_format(buffer, buffer_size, format, args...);
}

View file

@ -217,6 +217,7 @@ public:
// server info
virtual void GetServerInfo(class CServerInfo *pServerInfo) const = 0;
virtual bool ServerCapAnyPlayerFlag() const = 0;
virtual int GetPredictionTime() = 0;

View file

@ -443,7 +443,9 @@ static bool BackendInitGlew(EBackendType BackendType, int &GlewMajor, int &GlewM
#ifdef CONF_GLEW_HAS_CONTEXT_INIT
if(GLEW_OK != glewContextInit())
#else
if(GLEW_OK != glewInit())
GLenum InitResult = glewInit();
const char *pVideoDriver = SDL_GetCurrentVideoDriver();
if(GLEW_OK != InitResult && pVideoDriver && !str_comp(pVideoDriver, "wayland") && GLEW_ERROR_NO_GLX_DISPLAY != InitResult)
#endif
return false;
@ -1019,6 +1021,13 @@ int CGraphicsBackend_SDL_GL::Init(const char *pName, int *pScreen, int *pWidth,
SDL_GetVersion(&Linked);
dbg_msg("sdl", "SDL version %d.%d.%d (compiled = %d.%d.%d)", Linked.major, Linked.minor, Linked.patch,
Compiled.major, Compiled.minor, Compiled.patch);
#if CONF_PLATFORM_LINUX && SDL_VERSION_ATLEAST(2, 0, 22)
// needed to workaround SDL from forcing exclusively X11 if linking against the GLX flavour of GLEW instead of the EGL one
// w/o this on Wayland systems (no XWayland support) SDL's Video subsystem will fail to load (starting from SDL2.30+)
if(Linked.major == 2 && Linked.minor >= 30)
SDL_SetHint(SDL_HINT_VIDEODRIVER, "x11,wayland");
#endif
}
if(!SDL_WasInit(SDL_INIT_VIDEO))

View file

@ -3,6 +3,7 @@
#include <base/hash.h>
#include <base/hash_ctxt.h>
#include <base/log.h>
#include <base/logger.h>
#include <base/math.h>
#include <base/system.h>
@ -246,11 +247,7 @@ void CClient::SendReady(int Conn)
void CClient::SendMapRequest()
{
if(m_MapdownloadFileTemp)
{
io_close(m_MapdownloadFileTemp);
Storage()->RemoveFile(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE);
}
dbg_assert(!m_MapdownloadFileTemp, "Map download already in progress");
m_MapdownloadFileTemp = Storage()->OpenFile(m_aMapdownloadFilenameTemp, IOFLAG_WRITE, IStorage::TYPE_SAVE);
if(IsSixup())
{
@ -655,6 +652,7 @@ void CClient::DisconnectWithReason(const char *pReason)
m_aRconAuthed[0] = 0;
mem_zero(m_aRconUsername, sizeof(m_aRconUsername));
mem_zero(m_aRconPassword, sizeof(m_aRconPassword));
m_MapDetailsPresent = false;
m_ServerSentCapabilities = false;
m_UseTempRconCommands = 0;
m_ExpectedRconCommands = -1;
@ -670,22 +668,7 @@ void CClient::DisconnectWithReason(const char *pReason)
m_CurrentServerCurrentPingTime = -1;
m_CurrentServerNextPingTime = -1;
// disable all downloads
m_MapdownloadChunk = 0;
if(m_pMapdownloadTask)
m_pMapdownloadTask->Abort();
if(m_MapdownloadFileTemp)
{
io_close(m_MapdownloadFileTemp);
Storage()->RemoveFile(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE);
}
m_MapdownloadFileTemp = 0;
m_MapdownloadSha256Present = false;
m_MapdownloadSha256 = SHA256_ZEROED;
m_MapdownloadCrc = 0;
m_MapdownloadTotalsize = -1;
m_MapdownloadAmount = 0;
m_MapDetailsPresent = false;
ResetMapDownload(true);
// clear the current server info
mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo));
@ -1391,7 +1374,7 @@ void CClient::ProcessServerInfo(int RawType, NETADDR *pFrom, const void *pData,
#undef GET_INT
}
static CServerCapabilities GetServerCapabilities(int Version, int Flags)
static CServerCapabilities GetServerCapabilities(int Version, int Flags, bool Sixup)
{
CServerCapabilities Result;
bool DDNet = false;
@ -1400,7 +1383,7 @@ static CServerCapabilities GetServerCapabilities(int Version, int Flags)
DDNet = Flags & SERVERCAPFLAG_DDNET;
}
Result.m_ChatTimeoutCode = DDNet;
Result.m_AnyPlayerFlag = DDNet;
Result.m_AnyPlayerFlag = !Sixup;
Result.m_PingEx = false;
Result.m_AllowDummy = true;
Result.m_SyncWeaponInput = false;
@ -1501,7 +1484,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
{
return;
}
m_ServerCapabilities = GetServerCapabilities(Version, Flags);
m_ServerCapabilities = GetServerCapabilities(Version, Flags, IsSixup());
m_CanReceiveServerCapabilities = false;
m_ServerSentCapabilities = true;
}
@ -1509,7 +1492,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
{
if(m_CanReceiveServerCapabilities)
{
m_ServerCapabilities = GetServerCapabilities(0, 0);
m_ServerCapabilities = GetServerCapabilities(0, 0, IsSixup());
m_CanReceiveServerCapabilities = false;
}
bool MapDetailsWerePresent = m_MapDetailsPresent;
@ -1542,6 +1525,8 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
DummyDisconnect(0);
}
ResetMapDownload(true);
SHA256_DIGEST *pMapSha256 = nullptr;
const char *pMapUrl = nullptr;
if(MapDetailsWerePresent && str_comp(m_aMapDetailsName, pMap) == 0 && m_MapDetailsCrc == MapCrc)
@ -1558,12 +1543,6 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
}
else
{
if(m_MapdownloadFileTemp)
{
io_close(m_MapdownloadFileTemp);
Storage()->RemoveFile(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE);
}
// start map download
FormatMapDownloadFilename(pMap, pMapSha256, MapCrc, false, m_aMapdownloadFilename, sizeof(m_aMapdownloadFilename));
FormatMapDownloadFilename(pMap, pMapSha256, MapCrc, true, m_aMapdownloadFilenameTemp, sizeof(m_aMapdownloadFilenameTemp));
@ -1572,16 +1551,11 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
str_format(aBuf, sizeof(aBuf), "starting to download map to '%s'", m_aMapdownloadFilenameTemp);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", aBuf);
m_MapdownloadChunk = 0;
str_copy(m_aMapdownloadName, pMap);
m_MapdownloadSha256Present = (bool)pMapSha256;
m_MapdownloadSha256 = pMapSha256 ? *pMapSha256 : SHA256_ZEROED;
m_MapdownloadCrc = MapCrc;
m_MapdownloadTotalsize = MapSize;
m_MapdownloadAmount = 0;
ResetMapDownload();
if(pMapSha256)
{
@ -1947,13 +1921,8 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
if(Msg != NETMSG_SNAPEMPTY && pTmpBuffer3->Crc() != Crc)
{
if(g_Config.m_Debug)
{
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "snapshot crc error #%d - tick=%d wantedcrc=%d gotcrc=%d compressed_size=%d delta_tick=%d",
m_SnapCrcErrors, GameTick, Crc, pTmpBuffer3->Crc(), m_aSnapshotIncomingDataSize[Conn], DeltaTick);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf);
}
log_error("client", "snapshot crc error #%d - tick=%d wantedcrc=%d gotcrc=%d compressed_size=%d delta_tick=%d",
m_SnapCrcErrors, GameTick, Crc, pTmpBuffer3->Crc(), m_aSnapshotIncomingDataSize[Conn], DeltaTick);
m_SnapCrcErrors++;
if(m_SnapCrcErrors > 10)
@ -2224,24 +2193,44 @@ int CClient::UnpackAndValidateSnapshot(CSnapshot *pFrom, CSnapshot *pTo)
return Builder.Finish(pTo);
}
void CClient::ResetMapDownload()
void CClient::ResetMapDownload(bool ResetActive)
{
if(m_pMapdownloadTask)
{
m_pMapdownloadTask->Abort();
m_pMapdownloadTask = NULL;
m_pMapdownloadTask = nullptr;
}
if(m_MapdownloadFileTemp)
{
io_close(m_MapdownloadFileTemp);
m_MapdownloadFileTemp = 0;
}
if(Storage()->FileExists(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE))
{
Storage()->RemoveFile(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE);
}
if(ResetActive)
{
m_MapdownloadChunk = 0;
m_MapdownloadSha256Present = false;
m_MapdownloadSha256 = SHA256_ZEROED;
m_MapdownloadCrc = 0;
m_MapdownloadTotalsize = -1;
m_MapdownloadAmount = 0;
m_aMapdownloadFilename[0] = '\0';
m_aMapdownloadFilenameTemp[0] = '\0';
m_aMapdownloadName[0] = '\0';
}
m_MapdownloadFileTemp = 0;
m_MapdownloadAmount = 0;
}
void CClient::FinishMapDownload()
{
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "download complete, loading map");
int Prev = m_MapdownloadTotalsize;
m_MapdownloadTotalsize = -1;
SHA256_DIGEST *pSha256 = m_MapdownloadSha256Present ? &m_MapdownloadSha256 : 0;
SHA256_DIGEST *pSha256 = m_MapdownloadSha256Present ? &m_MapdownloadSha256 : nullptr;
bool FileSuccess = true;
if(Storage()->FileExists(m_aMapdownloadFilename, IStorage::TYPE_SAVE))
@ -2249,36 +2238,26 @@ void CClient::FinishMapDownload()
FileSuccess &= Storage()->RenameFile(m_aMapdownloadFilenameTemp, m_aMapdownloadFilename, IStorage::TYPE_SAVE);
if(!FileSuccess)
{
ResetMapDownload();
char aError[128 + IO_MAX_PATH_LENGTH];
str_format(aError, sizeof(aError), Localize("Could not save downloaded map. Try manually deleting this file: %s"), m_aMapdownloadFilename);
DisconnectWithReason(aError);
return;
}
// load map
const char *pError = LoadMap(m_aMapdownloadName, m_aMapdownloadFilename, pSha256, m_MapdownloadCrc);
if(!pError)
{
ResetMapDownload();
ResetMapDownload(true);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "loading done");
SendReady(CONN_MAIN);
}
else if(m_pMapdownloadTask) // fallback
{
ResetMapDownload();
m_MapdownloadTotalsize = Prev;
ResetMapDownload(false);
SendMapRequest();
}
else
{
if(m_MapdownloadFileTemp)
{
io_close(m_MapdownloadFileTemp);
m_MapdownloadFileTemp = 0;
Storage()->RemoveFile(m_aMapdownloadFilenameTemp, IStorage::TYPE_SAVE);
}
ResetMapDownload();
DisconnectWithReason(pError);
}
}
@ -2804,7 +2783,7 @@ void CClient::Update()
else if(m_pMapdownloadTask->State() == EHttpState::ERROR || m_pMapdownloadTask->State() == EHttpState::ABORTED)
{
dbg_msg("webdl", "http failed, falling back to gameserver");
ResetMapDownload();
ResetMapDownload(false);
SendMapRequest();
}
}
@ -3337,7 +3316,7 @@ bool CClient::InitNetworkClient(char *pError, size_t ErrorSize)
if(g_Config.m_Bindaddr[0])
str_format(pError, ErrorSize, "Could not open the network client, try changing or unsetting the bindaddr '%s'.", g_Config.m_Bindaddr);
else
str_format(pError, ErrorSize, "Could not open the network client.");
str_copy(pError, "Could not open the network client.", ErrorSize);
return false;
}
}
@ -3795,8 +3774,7 @@ const char *CClient::DemoPlayer_Play(const char *pFilename, int StorageType)
return m_DemoPlayer.ErrorMessage();
}
m_Sixup = str_startswith(m_DemoPlayer.Info()->m_Header.m_aNetversion, "0.7");
m_DemoPlayer.SetSixup(m_Sixup);
m_Sixup = m_DemoPlayer.IsSixup();
// load map
const CMapInfo *pMapInfo = m_DemoPlayer.GetMapInfo();
@ -4379,8 +4357,20 @@ void CClient::RegisterCommands()
// used for server browser update
m_pConsole->Chain("br_filter_string", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_exclude_string", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_full", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_empty", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_spectators", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_friends", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_country", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_country_index", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_pw", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_gametype", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_gametype_strict", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_connecting_players", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_serveraddress", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_unfinished_map", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("br_filter_login", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("add_favorite", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("remove_favorite", ConchainServerBrowserUpdate, this);
m_pConsole->Chain("end_favorite_group", ConchainServerBrowserUpdate, this);

View file

@ -208,6 +208,8 @@ class CClient : public IClient, public CDemoPlayer::IListener
bool m_ServerSentCapabilities = false;
CServerCapabilities m_ServerCapabilities;
bool ServerCapAnyPlayerFlag() const override { return m_ServerCapabilities.m_AnyPlayerFlag; }
CServerInfo m_CurrentServerInfo;
int64_t m_CurrentServerInfoRequestTime = -1; // >= 0 should request, == -1 got info
@ -358,7 +360,7 @@ public:
int UnpackAndValidateSnapshot(CSnapshot *pFrom, CSnapshot *pTo);
void ResetMapDownload();
void ResetMapDownload(bool ResetActive);
void FinishMapDownload();
void RequestDDNetInfo() override;

View file

@ -68,8 +68,6 @@ CInput::CInput()
m_MouseFocus = true;
m_pClipboardText = nullptr;
m_CompositionCursor = 0;
m_CandidateSelectedIndex = -1;
@ -90,7 +88,6 @@ void CInput::Init()
void CInput::Shutdown()
{
SDL_free(m_pClipboardText);
CloseJoysticks();
}
@ -303,11 +300,12 @@ const std::vector<IInput::CTouchFingerState> &CInput::TouchFingerStates() const
return m_vTouchFingerStates;
}
const char *CInput::GetClipboardText()
std::string CInput::GetClipboardText()
{
SDL_free(m_pClipboardText);
m_pClipboardText = SDL_GetClipboardText();
return m_pClipboardText;
char *pClipboardText = SDL_GetClipboardText();
std::string ClipboardText = pClipboardText;
SDL_free(pClipboardText);
return ClipboardText;
}
void CInput::SetClipboardText(const char *pText)
@ -714,35 +712,9 @@ int CInput::Update()
// handle keys
case SDL_KEYDOWN:
#if defined(CONF_PLATFORM_ANDROID)
if(Event.key.keysym.scancode == KEY_AC_BACK && m_BackButtonReleased)
{
if(m_LastBackPress == -1 || (Now - m_LastBackPress) / (float)time_freq() > 1.0f)
{
m_NumBackPresses = 1;
m_LastBackPress = Now;
}
else
{
m_NumBackPresses++;
if(m_NumBackPresses >= 3)
{
// Quit if the Android back-button was pressed 3 times within 1 second
return 1;
}
}
m_BackButtonReleased = false;
}
#endif
Scancode = TranslateScancode(Event.key);
break;
case SDL_KEYUP:
#if defined(CONF_PLATFORM_ANDROID)
if(Event.key.keysym.scancode == KEY_AC_BACK && !m_BackButtonReleased)
{
m_BackButtonReleased = true;
}
#endif
Action = IInput::FLAG_RELEASE;
Scancode = TranslateScancode(Event.key);
break;

View file

@ -74,14 +74,8 @@ private:
float GetJoystickDeadzone();
bool m_InputGrabbed;
char *m_pClipboardText;
bool m_MouseFocus;
#if defined(CONF_PLATFORM_ANDROID)
int m_NumBackPresses = 0;
bool m_BackButtonReleased = true;
int64_t m_LastBackPress = -1;
#endif
// IME support
std::string m_CompositionString;
@ -151,7 +145,7 @@ public:
const std::vector<CTouchFingerState> &TouchFingerStates() const override;
const char *GetClipboardText() override;
std::string GetClipboardText() override;
void SetClipboardText(const char *pText) override;
void StartTextInput() override;

View file

@ -27,9 +27,6 @@
#include <engine/http.h>
#include <engine/storage.h>
static constexpr const char *COMMUNITY_COUNTRY_NONE = "none";
static constexpr const char *COMMUNITY_TYPE_NONE = "None";
class CSortWrap
{
typedef bool (CServerBrowser::*SortFunc)(int, int) const;
@ -704,7 +701,22 @@ void ServerBrowserFormatAddresses(char *pBuffer, int BufferSize, NETADDR *pAddrs
{
return;
}
net_addr_url_str(&pAddrs[i], pBuffer, BufferSize, true);
char aIpAddr[512];
if(!net_addr_str(&pAddrs[i], aIpAddr, sizeof(aIpAddr), true))
{
str_copy(pBuffer, aIpAddr, BufferSize);
return;
}
if(pAddrs[i].type & NETTYPE_TW7)
{
str_format(
pBuffer,
BufferSize,
"tw-0.7+udp://%s",
aIpAddr);
return;
}
str_copy(pBuffer, aIpAddr, BufferSize);
int Length = str_length(pBuffer);
pBuffer += Length;
BufferSize -= Length;

View file

@ -234,18 +234,6 @@ public:
class CServerBrowser : public IServerBrowser
{
public:
class CServerEntry
{
public:
int64_t m_RequestTime;
bool m_RequestIgnoreInfo;
int m_GotInfo;
CServerInfo m_Info;
CServerEntry *m_pPrevReq; // request list
CServerEntry *m_pNextReq;
};
CServerBrowser();
virtual ~CServerBrowser();
@ -307,7 +295,7 @@ public:
void OnInit();
void QueueRequest(CServerEntry *pEntry);
CServerEntry *Find(const NETADDR &Addr);
CServerEntry *Find(const NETADDR &Addr) override;
int GetCurrentType() override { return m_ServerlistType; }
bool IsRegistered(const NETADDR &Addr);

View file

@ -472,6 +472,7 @@ bool CServerBrowserHttp::Parse(json_value *pJson, std::vector<CServerInfo> *pvSe
CServerInfo SetInfo = ParsedInfo;
SetInfo.m_Location = ParsedLocation;
SetInfo.m_NumAddresses = 0;
bool GotVersion6 = false;
for(unsigned int a = 0; a < Addresses.u.array.length; a++)
{
const json_value &Address = Addresses[a];
@ -479,6 +480,23 @@ bool CServerBrowserHttp::Parse(json_value *pJson, std::vector<CServerInfo> *pvSe
{
return true;
}
if(str_startswith(Addresses[a], "tw-0.6+udp://"))
{
GotVersion6 = true;
break;
}
}
for(unsigned int a = 0; a < Addresses.u.array.length; a++)
{
const json_value &Address = Addresses[a];
if(Address.type != json_string)
{
return true;
}
if(GotVersion6 && str_startswith(Addresses[a], "tw-0.7+udp://"))
{
continue;
}
NETADDR ParsedAddr;
if(ServerbrowserParseUrl(&ParsedAddr, Addresses[a]))
{

View file

@ -228,10 +228,8 @@ int CSound::Init()
return -1;
}
m_MixingRate = g_Config.m_SndRate;
SDL_AudioSpec Format, FormatOut;
Format.freq = m_MixingRate;
Format.freq = g_Config.m_SndRate;
Format.format = AUDIO_S16;
Format.channels = 2;
Format.samples = g_Config.m_SndBufferSize;
@ -239,7 +237,7 @@ int CSound::Init()
Format.userdata = this;
// Open the audio device and start playing sound!
m_Device = SDL_OpenAudioDevice(nullptr, 0, &Format, &FormatOut, 0);
m_Device = SDL_OpenAudioDevice(nullptr, 0, &Format, &FormatOut, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
if(m_Device == 0)
{
dbg_msg("sound", "unable to open audio: %s", SDL_GetError());
@ -248,6 +246,7 @@ int CSound::Init()
else
dbg_msg("sound", "sound init successful using audio driver '%s'", SDL_GetCurrentAudioDriver());
m_MixingRate = FormatOut.freq;
m_MaxFrames = FormatOut.samples * 2;
#if defined(CONF_VIDEORECORDER)
m_MaxFrames = maximum<uint32_t>(m_MaxFrames, 1024 * 2); // make the buffer bigger just in case

View file

@ -30,7 +30,7 @@ public:
ACCESS_LEVEL_HELPER,
ACCESS_LEVEL_USER,
TEMPCMD_NAME_LENGTH = 32,
TEMPCMD_NAME_LENGTH = 64,
TEMPCMD_HELP_LENGTH = 192,
TEMPCMD_PARAMS_LENGTH = 96,
@ -53,7 +53,7 @@ public:
virtual int GetInteger(unsigned Index) const = 0;
virtual float GetFloat(unsigned Index) const = 0;
virtual const char *GetString(unsigned Index) const = 0;
virtual ColorHSLA GetColor(unsigned Index, bool Light) const = 0;
virtual std::optional<ColorHSLA> GetColor(unsigned Index, bool Light) const = 0;
virtual void RemoveArgument(unsigned Index) = 0;

View file

@ -10,6 +10,7 @@
#include <cstdint>
#include <functional>
#include <string>
#include <vector>
const int g_MaxKeys = 512;
@ -138,7 +139,7 @@ public:
virtual const std::vector<CTouchFingerState> &TouchFingerStates() const = 0;
// clipboard
virtual const char *GetClipboardText() = 0;
virtual std::string GetClipboardText() = 0;
virtual void SetClipboardText(const char *pText) = 0;
// text editing

View file

@ -12,6 +12,7 @@
#include "kernel.h"
#include "message.h"
#include <engine/shared/jsonwriter.h>
#include <engine/shared/protocol.h>
#include <game/generated/protocol.h>
#include <game/generated/protocol7.h>
@ -250,9 +251,10 @@ public:
virtual int GetAuthedState(int ClientId) const = 0;
virtual const char *GetAuthName(int ClientId) const = 0;
virtual void Kick(int ClientId, const char *pReason) = 0;
virtual void Ban(int ClientId, int Seconds, const char *pReason, bool DisplayTime) = 0;
virtual void Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason) = 0;
virtual void RedirectClient(int ClientId, int Port, bool Verbose = false) = 0;
virtual void ChangeMap(const char *pMap) = 0;
virtual void ReloadMap() = 0;
virtual void DemoRecorder_HandleAutoStart() = 0;
@ -345,6 +347,9 @@ public:
virtual const char *Version() const = 0;
virtual const char *NetVersion() const = 0;
virtual CNetObjHandler *GetNetObjHandler() = 0;
virtual protocol7::CNetObjHandler *GetNetObjHandler7() = 0;
// DDRace
virtual void OnPreTickTeehistorian() = 0;
@ -365,10 +370,10 @@ public:
/**
* Used to report custom player info to master servers.
*
* @param aBuf Should be the json key values to add, starting with a ',' beforehand, like: ',"skin": "default", "team": 1'
* @param pJsonWriter A pointer to a CJsonStringWriter which the custom data will be added to.
* @param i The client id.
*/
virtual void OnUpdatePlayerServerInfo(char *aBuf, int BufSize, int Id) = 0;
virtual void OnUpdatePlayerServerInfo(CJsonStringWriter *pJSonWriter, int Id) = 0;
};
extern IGameServer *CreateGameServer();

View file

@ -24,6 +24,7 @@
#include <engine/shared/host_lookup.h>
#include <engine/shared/http.h>
#include <engine/shared/json.h>
#include <engine/shared/jsonwriter.h>
#include <engine/shared/masterserver.h>
#include <engine/shared/netban.h>
#include <engine/shared/network.h>
@ -60,7 +61,7 @@ void CServerBan::InitServerBan(IConsole *pConsole, IStorage *pStorage, CServer *
}
template<class T>
int CServerBan::BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool DisplayTime)
int CServerBan::BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool VerbatimReason)
{
// validate address
if(Server()->m_RconClientId >= 0 && Server()->m_RconClientId < MAX_CLIENTS &&
@ -99,7 +100,7 @@ int CServerBan::BanExt(T *pBanPool, const typename T::CDataType *pData, int Seco
}
}
int Result = Ban(pBanPool, pData, Seconds, pReason, DisplayTime);
int Result = Ban(pBanPool, pData, Seconds, pReason, VerbatimReason);
if(Result != 0)
return Result;
@ -122,9 +123,9 @@ int CServerBan::BanExt(T *pBanPool, const typename T::CDataType *pData, int Seco
return Result;
}
int CServerBan::BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool DisplayTime)
int CServerBan::BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool VerbatimReason)
{
return BanExt(&m_BanAddrPool, pAddr, Seconds, pReason, DisplayTime);
return BanExt(&m_BanAddrPool, pAddr, Seconds, pReason, VerbatimReason);
}
int CServerBan::BanRange(const CNetRange *pRange, int Seconds, const char *pReason)
@ -150,7 +151,7 @@ void CServerBan::ConBanExt(IConsole::IResult *pResult, void *pUser)
if(ClientId < 0 || ClientId >= MAX_CLIENTS || pThis->Server()->m_aClients[ClientId].m_State == CServer::CClient::STATE_EMPTY)
pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (invalid client id)");
else
pThis->BanAddr(pThis->Server()->m_NetServer.ClientAddr(ClientId), Minutes * 60, pReason, true);
pThis->BanAddr(pThis->Server()->m_NetServer.ClientAddr(ClientId), Minutes * 60, pReason, false);
}
else
ConBan(pResult, pUser);
@ -473,11 +474,11 @@ void CServer::Kick(int ClientId, const char *pReason)
m_NetServer.Drop(ClientId, pReason);
}
void CServer::Ban(int ClientId, int Seconds, const char *pReason, bool DisplayTime)
void CServer::Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason)
{
NETADDR Addr;
GetClientAddr(ClientId, &Addr);
m_NetServer.NetBan()->BanAddr(&Addr, Seconds, pReason, DisplayTime);
m_NetServer.NetBan()->BanAddr(&Addr, Seconds, pReason, VerbatimReason);
}
void CServer::RedirectClient(int ClientId, int Port, bool Verbose)
@ -1459,7 +1460,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
if(m_aClients[ClientId].m_Traffic > Limit)
{
m_NetServer.NetBan()->BanAddr(&pPacket->m_Address, 600, "Stressing network", true);
m_NetServer.NetBan()->BanAddr(&pPacket->m_Address, 600, "Stressing network", false);
return;
}
if(Diff > 100)
@ -1825,7 +1826,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
if(!Config()->m_SvRconBantime)
m_NetServer.Drop(ClientId, "Too many remote console authentication tries");
else
m_ServerBan.BanAddr(m_NetServer.ClientAddr(ClientId), Config()->m_SvRconBantime * 60, "Too many remote console authentication tries", true);
m_ServerBan.BanAddr(m_NetServer.ClientAddr(ClientId), Config()->m_SvRconBantime * 60, "Too many remote console authentication tries", false);
}
}
else
@ -2315,77 +2316,81 @@ void CServer::UpdateRegisterServerInfo()
int MaxPlayers = maximum(m_NetServer.MaxClients() - maximum(g_Config.m_SvSpectatorSlots, g_Config.m_SvReservedSlots), PlayerCount);
int MaxClients = maximum(m_NetServer.MaxClients() - g_Config.m_SvReservedSlots, ClientCount);
char aName[256];
char aGameType[32];
char aMapName[64];
char aVersion[64];
char aMapSha256[SHA256_MAXSTRSIZE];
sha256_str(m_aCurrentMapSha256[MAP_TYPE_SIX], aMapSha256, sizeof(aMapSha256));
char aInfo[16384];
str_format(aInfo, sizeof(aInfo),
"{"
"\"max_clients\":%d,"
"\"max_players\":%d,"
"\"passworded\":%s,"
"\"game_type\":\"%s\","
"\"name\":\"%s\","
"\"map\":{"
"\"name\":\"%s\","
"\"sha256\":\"%s\","
"\"size\":%d"
"},"
"\"version\":\"%s\","
"\"client_score_kind\":\"time\","
"\"requires_login\":false,"
"\"clients\":[",
MaxClients,
MaxPlayers,
JsonBool(g_Config.m_Password[0]),
EscapeJson(aGameType, sizeof(aGameType), GameServer()->GameType()),
EscapeJson(aName, sizeof(aName), g_Config.m_SvName),
EscapeJson(aMapName, sizeof(aMapName), m_aCurrentMap),
aMapSha256,
m_aCurrentMapSize[MAP_TYPE_SIX],
EscapeJson(aVersion, sizeof(aVersion), GameServer()->Version()));
CJsonStringWriter JsonWriter;
JsonWriter.BeginObject();
JsonWriter.WriteAttribute("max_clients");
JsonWriter.WriteIntValue(MaxClients);
JsonWriter.WriteAttribute("max_players");
JsonWriter.WriteIntValue(MaxPlayers);
JsonWriter.WriteAttribute("passworded");
JsonWriter.WriteBoolValue(g_Config.m_Password[0]);
JsonWriter.WriteAttribute("game_type");
JsonWriter.WriteStrValue(GameServer()->GameType());
JsonWriter.WriteAttribute("name");
JsonWriter.WriteStrValue(g_Config.m_SvName);
JsonWriter.WriteAttribute("map");
JsonWriter.BeginObject();
JsonWriter.WriteAttribute("name");
JsonWriter.WriteStrValue(GetMapName());
JsonWriter.WriteAttribute("sha256");
JsonWriter.WriteStrValue(aMapSha256);
JsonWriter.WriteAttribute("size");
JsonWriter.WriteIntValue(m_aCurrentMapSize[MAP_TYPE_SIX]);
JsonWriter.EndObject();
JsonWriter.WriteAttribute("version");
JsonWriter.WriteStrValue(GameServer()->Version());
JsonWriter.WriteAttribute("client_score_kind");
JsonWriter.WriteStrValue("time"); // "points" or "time"
JsonWriter.WriteAttribute("requires_login");
JsonWriter.WriteBoolValue(false);
JsonWriter.WriteAttribute("clients");
JsonWriter.BeginArray();
bool FirstPlayer = true;
for(int i = 0; i < MAX_CLIENTS; i++)
{
if(m_aClients[i].IncludedInServerInfo())
{
char aCName[32];
char aCClan[32];
JsonWriter.BeginObject();
char aExtraPlayerInfo[512];
GameServer()->OnUpdatePlayerServerInfo(aExtraPlayerInfo, sizeof(aExtraPlayerInfo), i);
JsonWriter.WriteAttribute("name");
JsonWriter.WriteStrValue(ClientName(i));
char aClientInfo[1024];
str_format(aClientInfo, sizeof(aClientInfo),
"%s{"
"\"name\":\"%s\","
"\"clan\":\"%s\","
"\"country\":%d,"
"\"score\":%d,"
"\"is_player\":%s"
"%s"
"}",
!FirstPlayer ? "," : "",
EscapeJson(aCName, sizeof(aCName), ClientName(i)),
EscapeJson(aCClan, sizeof(aCClan), ClientClan(i)),
m_aClients[i].m_Country,
m_aClients[i].m_Score.value_or(-9999),
JsonBool(GameServer()->IsClientPlayer(i)),
aExtraPlayerInfo);
str_append(aInfo, aClientInfo);
FirstPlayer = false;
JsonWriter.WriteAttribute("clan");
JsonWriter.WriteStrValue(ClientClan(i));
JsonWriter.WriteAttribute("country");
JsonWriter.WriteIntValue(m_aClients[i].m_Country);
JsonWriter.WriteAttribute("score");
JsonWriter.WriteIntValue(m_aClients[i].m_Score.value_or(-9999));
JsonWriter.WriteAttribute("is_player");
JsonWriter.WriteBoolValue(GameServer()->IsClientPlayer(i));
GameServer()->OnUpdatePlayerServerInfo(&JsonWriter, i);
JsonWriter.EndObject();
}
}
str_append(aInfo, "]}");
JsonWriter.EndArray();
JsonWriter.EndObject();
m_pRegister->OnNewInfo(aInfo);
m_pRegister->OnNewInfo(JsonWriter.GetOutputString().c_str());
}
void CServer::UpdateServerInfo(bool Resend)
@ -2546,6 +2551,11 @@ void CServer::ChangeMap(const char *pMap)
m_MapReload = str_comp(Config()->m_SvMap, m_aCurrentMap) != 0;
}
void CServer::ReloadMap()
{
m_MapReload = true;
}
int CServer::LoadMap(const char *pMapName)
{
m_MapReload = false;
@ -2970,7 +2980,7 @@ int CServer::Run()
if(Config()->m_SvDnsblBan)
{
m_NetServer.NetBan()->BanAddr(m_NetServer.ClientAddr(ClientId), 60, Config()->m_SvDnsblBanReason, false);
m_NetServer.NetBan()->BanAddr(m_NetServer.ClientAddr(ClientId), 60, Config()->m_SvDnsblBanReason, true);
}
}
}

View file

@ -46,14 +46,14 @@ class CServerBan : public CNetBan
class CServer *m_pServer;
template<class T>
int BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool DisplayTime);
int BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool VerbatimReason);
public:
class CServer *Server() const { return m_pServer; }
void InitServerBan(class IConsole *pConsole, class IStorage *pStorage, class CServer *pServer);
int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool DisplayTime) override;
int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool VerbatimReason) override;
int BanRange(const CNetRange *pRange, int Seconds, const char *pReason) override;
static void ConBanExt(class IConsole::IResult *pResult, void *pUser);
@ -279,7 +279,7 @@ public:
void SetClientFlags(int ClientId, int Flags) override;
void Kick(int ClientId, const char *pReason) override;
void Ban(int ClientId, int Seconds, const char *pReason, bool DisplayTime) override;
void Ban(int ClientId, int Seconds, const char *pReason, bool VerbatimReason) override;
void RedirectClient(int ClientId, int Port, bool Verbose = false) override;
void DemoRecorder_HandleAutoStart() override;
@ -379,6 +379,7 @@ public:
void ChangeMap(const char *pMap) override;
const char *GetMapName() const override;
void ReloadMap() override;
int LoadMap(const char *pMapName);
void SaveDemo(int ClientId, float Time) override;

View file

@ -295,8 +295,23 @@ public:
NUM_TYPES,
};
class CServerEntry
{
public:
int64_t m_RequestTime;
bool m_RequestIgnoreInfo;
int m_GotInfo;
CServerInfo m_Info;
CServerEntry *m_pPrevReq; // request list
CServerEntry *m_pNextReq;
};
static constexpr const char *COMMUNITY_DDNET = "ddnet";
static constexpr const char *COMMUNITY_NONE = "none";
static constexpr const char *COMMUNITY_COUNTRY_NONE = "none";
static constexpr const char *COMMUNITY_TYPE_NONE = "None";
/**
* Special community value for country/type filters that
* affect all communities.
@ -341,6 +356,7 @@ public:
virtual const IFilterList &TypesFilter() const = 0;
virtual void CleanFilters() = 0;
virtual CServerEntry *Find(const NETADDR &Addr) = 0;
virtual int GetCurrentType() = 0;
virtual const char *GetTutorialServer() = 0;
};

View file

@ -111,22 +111,29 @@ void SIntConfigVariable::ResetToOld()
void SColorConfigVariable::CommandCallback(IConsole::IResult *pResult, void *pUserData)
{
SColorConfigVariable *pData = static_cast<SColorConfigVariable *>(pUserData);
char aBuf[IConsole::CMDLINE_LENGTH + 64];
if(pResult->NumArguments())
{
if(pData->CheckReadOnly())
return;
const ColorHSLA Color = pResult->GetColor(0, pData->m_Light);
const unsigned Value = Color.Pack(pData->m_Light ? 0.5f : 0.0f, pData->m_Alpha);
const auto Color = pResult->GetColor(0, pData->m_Light);
if(Color)
{
const unsigned Value = Color->Pack(pData->m_Light ? 0.5f : 0.0f, pData->m_Alpha);
*pData->m_pVariable = Value;
if(pResult->m_ClientId != IConsole::CLIENT_ID_GAME)
pData->m_OldValue = Value;
*pData->m_pVariable = Value;
if(pResult->m_ClientId != IConsole::CLIENT_ID_GAME)
pData->m_OldValue = Value;
}
else
{
str_format(aBuf, sizeof(aBuf), "%s is not a valid color.", pResult->GetString(0));
pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "config", aBuf);
}
}
else
{
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "Value: %u", *pData->m_pVariable);
pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "config", aBuf);
@ -493,8 +500,8 @@ void CConfigManager::Con_Toggle(IConsole::IResult *pResult, void *pUserData)
{
SColorConfigVariable *pColorVariable = static_cast<SColorConfigVariable *>(pVariable);
const float Darkest = pColorVariable->m_Light ? 0.5f : 0.0f;
const ColorHSLA Value = *pColorVariable->m_pVariable == pResult->GetColor(1, pColorVariable->m_Light).Pack(Darkest, pColorVariable->m_Alpha) ? pResult->GetColor(2, pColorVariable->m_Light) : pResult->GetColor(1, pColorVariable->m_Light);
pColorVariable->SetValue(Value.Pack(Darkest, pColorVariable->m_Alpha));
const std::optional<ColorHSLA> Value = *pColorVariable->m_pVariable == pResult->GetColor(1, pColorVariable->m_Light).value_or(ColorHSLA(0, 0, 0)).Pack(Darkest, pColorVariable->m_Alpha) ? pResult->GetColor(2, pColorVariable->m_Light) : pResult->GetColor(1, pColorVariable->m_Light);
pColorVariable->SetValue(Value.value_or(ColorHSLA(0, 0, 0)).Pack(Darkest, pColorVariable->m_Alpha));
}
else if(pVariable->m_Type == SConfigVariable::VAR_STRING)
{

View file

@ -105,6 +105,7 @@ MACRO_CONFIG_INT(EdZoomTarget, ed_zoom_target, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG
MACRO_CONFIG_INT(EdShowkeys, ed_showkeys, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show pressed keys")
MACRO_CONFIG_INT(EdAlignQuads, ed_align_quads, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Enable/disable quad alignment. When enabled, red lines appear to show how quad/points are aligned and snapped to other quads/points when moving them")
MACRO_CONFIG_INT(EdShowQuadsRect, ed_show_quads_rect, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show the bounds of the selected quad. In case of multiple quads, it shows the bounds of the englobing rect. Can be helpful when aligning a group of quads")
MACRO_CONFIG_INT(EdAutoMapReload, ed_auto_map_reload, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Run 'hot_reload' on the local server while rcon authed on map save")
MACRO_CONFIG_INT(ClShowWelcome, cl_show_welcome, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show welcome message indicating the first launch of the client")
MACRO_CONFIG_INT(ClMotdTime, cl_motd_time, 10, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "How long to show the server message of the day")
@ -139,7 +140,7 @@ MACRO_CONFIG_INT(ClFatSkins, cl_fat_skins, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAV
MACRO_CONFIG_COL(ClPlayer7ColorBody, player7_color_body, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player body color")
MACRO_CONFIG_COL(ClPlayer7ColorFeet, player7_color_feet, 0x1C873E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player feet color")
MACRO_CONFIG_INT(ClPlayer7ColorMarking, player7_color_marking, 0xFF0000FF, 0, 0, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Player marking color")
MACRO_CONFIG_COL(ClPlayer7ColorMarking, player7_color_marking, 0xFF0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_COLALPHA | CFGFLAG_INSENSITIVE, "Player marking color")
MACRO_CONFIG_COL(ClPlayer7ColorDecoration, player7_color_decoration, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player decoration color")
MACRO_CONFIG_COL(ClPlayer7ColorHands, player7_color_hands, 0x1B759E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player hands color")
MACRO_CONFIG_COL(ClPlayer7ColorEyes, player7_color_eyes, 0x0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Player eyes color")
@ -160,7 +161,7 @@ MACRO_CONFIG_STR(ClPlayer7SkinEyes, player7_skin_eyes, protocol7::MAX_SKIN_ARRAY
MACRO_CONFIG_COL(ClDummy7ColorBody, dummy7_color_body, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy body color")
MACRO_CONFIG_COL(ClDummy7ColorFeet, dummy7_color_feet, 0x1C873E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy feet color")
MACRO_CONFIG_COL(ClDummy7ColorMarking, dummy7_color_marking, 0, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy marking color")
MACRO_CONFIG_COL(ClDummy7ColorMarking, dummy7_color_marking, 0xFF0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_COLALPHA | CFGFLAG_INSENSITIVE, "Dummy marking color")
MACRO_CONFIG_COL(ClDummy7ColorDecoration, dummy7_color_decoration, 0x1B6F74, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy decoration color")
MACRO_CONFIG_COL(ClDummy7ColorHands, dummy7_color_hands, 0x1B759E, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy hands color")
MACRO_CONFIG_COL(ClDummy7ColorEyes, dummy7_color_eyes, 0x0000FF, CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_COLLIGHT | CFGFLAG_INSENSITIVE, "Dummy eyes color")
@ -343,6 +344,9 @@ MACRO_CONFIG_INT(BrDemoSort, br_demo_sort, 0, 0, 2, CFGFLAG_SAVE | CFGFLAG_CLIEN
MACRO_CONFIG_INT(BrDemoSortOrder, br_demo_sort_order, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting order in demo browser")
MACRO_CONFIG_INT(BrDemoFetchInfo, br_demo_fetch_info, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to auto fetch demo infos on refresh")
MACRO_CONFIG_INT(GhSort, gh_sort, 1, 0, 2, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting column in ghost list")
MACRO_CONFIG_INT(GhSortOrder, gh_sort_order, 0, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sorting order in ghost list")
MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 128, 32768, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound buffer size (may cause delay if large)")
MACRO_CONFIG_INT(SndRate, snd_rate, 48000, 5512, 384000, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound mixing rate")
MACRO_CONFIG_INT(SndEnable, snd_enable, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Sound enable")
@ -599,7 +603,7 @@ MACRO_CONFIG_INT(ClOverlayEntities, cl_overlay_entities, 0, 0, 100, CFGFLAG_CLIE
MACRO_CONFIG_INT(ClShowQuads, cl_showquads, 1, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show quads (only interesting for mappers, or if your system has extremely bad performance)")
MACRO_CONFIG_COL(ClBackgroundColor, cl_background_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background color") // 0 0 128
MACRO_CONFIG_COL(ClBackgroundEntitiesColor, cl_background_entities_color, 128, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities) color") // 0 0 128
MACRO_CONFIG_STR(ClBackgroundEntities, cl_background_entities, 100, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities)")
MACRO_CONFIG_STR(ClBackgroundEntities, cl_background_entities, IO_MAX_PATH_LENGTH, "", CFGFLAG_CLIENT | CFGFLAG_SAVE, "Background (entities)")
MACRO_CONFIG_STR(ClRunOnJoin, cl_run_on_join, 100, "", CFGFLAG_CLIENT | CFGFLAG_SAVE | CFGFLAG_INSENSITIVE, "Command to run when joining a server")
// menu background map

View file

@ -40,22 +40,29 @@ float CConsole::CResult::GetFloat(unsigned Index) const
return str_tofloat(m_apArgs[Index]);
}
ColorHSLA CConsole::CResult::GetColor(unsigned Index, bool Light) const
std::optional<ColorHSLA> CConsole::CResult::GetColor(unsigned Index, bool Light) const
{
if(Index >= m_NumArgs)
return ColorHSLA(0, 0, 0);
return std::nullopt;
const char *pStr = m_apArgs[Index];
if(str_isallnum(pStr) || ((pStr[0] == '-' || pStr[0] == '+') && str_isallnum(pStr + 1))) // Teeworlds Color (Packed HSL)
{
const ColorHSLA Hsla = ColorHSLA(str_toulong_base(pStr, 10), true);
unsigned long Value = str_toulong_base(pStr, 10);
if(Value == std::numeric_limits<unsigned long>::max())
return std::nullopt;
const ColorHSLA Hsla = ColorHSLA(Value, true);
if(Light)
return Hsla.UnclampLighting();
return Hsla;
}
else if(*pStr == '$') // Hex RGB/RGBA
{
return color_cast<ColorHSLA>(color_parse<ColorRGBA>(pStr + 1).value_or(ColorRGBA(0.0f, 0.0f, 0.0f, 1.0f)));
auto ParsedColor = color_parse<ColorRGBA>(pStr + 1);
if(ParsedColor)
return color_cast<ColorHSLA>(ParsedColor.value());
else
return std::nullopt;
}
else if(!str_comp_nocase(pStr, "red"))
return ColorHSLA(0.0f / 6.0f, 1, .5f);
@ -76,7 +83,7 @@ ColorHSLA CConsole::CResult::GetColor(unsigned Index, bool Light) const
else if(!str_comp_nocase(pStr, "black"))
return ColorHSLA(0, 0, 0);
return ColorHSLA(0, 0, 0);
return std::nullopt;
}
const IConsole::CCommandInfo *CConsole::CCommand::NextCommandInfo(int AccessLevel, int FlagMask) const
@ -129,12 +136,12 @@ int CConsole::ParseStart(CResult *pResult, const char *pString, int Length)
return 0;
}
int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
int CConsole::ParseArgs(CResult *pResult, const char *pFormat, bool IsColor)
{
char Command = *pFormat;
char *pStr;
int Optional = 0;
int Error = 0;
int Error = PARSEARGS_OK;
pResult->ResetVictim();
@ -155,7 +162,7 @@ int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
{
if(!Optional)
{
Error = 1;
Error = PARSEARGS_MISSING_VALUE;
break;
}
@ -191,7 +198,7 @@ int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
pStr++; // skip due to escape
}
else if(pStr[0] == 0)
return 1; // return error
return PARSEARGS_MISSING_VALUE; // return error
*pDst = *pStr;
pDst++;
@ -215,13 +222,7 @@ int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
if(Command == 'r') // rest of the string
break;
else if(Command == 'v') // validate victim
pStr = str_skip_to_whitespace(pStr);
else if(Command == 'i') // validate int
pStr = str_skip_to_whitespace(pStr);
else if(Command == 'f') // validate float
pStr = str_skip_to_whitespace(pStr);
else if(Command == 's') // validate string
else if(Command == 'v' || Command == 'i' || Command == 'f' || Command == 's')
pStr = str_skip_to_whitespace(pStr);
if(pStr[0] != 0) // check for end of string
@ -230,6 +231,32 @@ int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
pStr++;
}
// validate args
if(Command == 'i')
{
// don't validate colors here
if(!IsColor)
{
int Value;
if(!str_toint(pResult->GetString(pResult->NumArguments() - 1), &Value) ||
Value == std::numeric_limits<int>::max() || Value == std::numeric_limits<int>::min())
{
Error = PARSEARGS_INVALID_INTEGER;
break;
}
}
}
else if(Command == 'f')
{
float Value;
if(!str_tofloat(pResult->GetString(pResult->NumArguments() - 1), &Value) ||
Value == std::numeric_limits<float>::max() || Value == std::numeric_limits<float>::min())
{
Error = PARSEARGS_INVALID_FLOAT;
break;
}
}
if(pVictim)
{
pResult->SetVictim(pVictim);
@ -487,10 +514,15 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr, int ClientId, bo
if(Stroke || IsStrokeCommand)
{
if(ParseArgs(&Result, pCommand->m_pParams))
if(int Error = ParseArgs(&Result, pCommand->m_pParams, pCommand->m_pfnCallback == &SColorConfigVariable::CommandCallback))
{
char aBuf[TEMPCMD_NAME_LENGTH + TEMPCMD_PARAMS_LENGTH + 32];
str_format(aBuf, sizeof(aBuf), "Invalid arguments. Usage: %s %s", pCommand->m_pName, pCommand->m_pParams);
char aBuf[CMDLINE_LENGTH + 64];
if(Error == PARSEARGS_INVALID_INTEGER)
str_format(aBuf, sizeof(aBuf), "%s is not a valid integer.", Result.GetString(Result.NumArguments() - 1));
else if(Error == PARSEARGS_INVALID_FLOAT)
str_format(aBuf, sizeof(aBuf), "%s is not a valid decimal number.", Result.GetString(Result.NumArguments() - 1));
else
str_format(aBuf, sizeof(aBuf), "Invalid arguments. Usage: %s %s", pCommand->m_pName, pCommand->m_pParams);
Print(OUTPUT_LEVEL_STANDARD, "chatresp", aBuf);
}
else if(m_StoreCommands && pCommand->m_Flags & CFGFLAG_STORE)

View file

@ -115,7 +115,7 @@ class CConsole : public IConsole
const char *GetString(unsigned Index) const override;
int GetInteger(unsigned Index) const override;
float GetFloat(unsigned Index) const override;
ColorHSLA GetColor(unsigned Index, bool Light) const override;
std::optional<ColorHSLA> GetColor(unsigned Index, bool Light) const override;
void RemoveArgument(unsigned Index) override
{
@ -144,7 +144,16 @@ class CConsole : public IConsole
};
int ParseStart(CResult *pResult, const char *pString, int Length);
int ParseArgs(CResult *pResult, const char *pFormat);
enum
{
PARSEARGS_OK = 0,
PARSEARGS_MISSING_VALUE,
PARSEARGS_INVALID_INTEGER,
PARSEARGS_INVALID_FLOAT,
};
int ParseArgs(CResult *pResult, const char *pFormat, bool IsColor = false);
/*
this function will set pFormat to the next parameter (i,s,r,v,?) it contains and

View file

@ -805,6 +805,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
str_copy(m_aFilename, "");
return -1;
}
m_Sixup = str_startswith(m_Info.m_Header.m_aNetversion, "0.7");
// save byte offset of map for later use
m_MapOffset = io_tell(m_File);

View file

@ -178,7 +178,6 @@ public:
int Update(bool RealTime = true);
bool IsSixup() const { return m_Sixup; }
void SetSixup(bool Sixup) { m_Sixup = Sixup; }
const CPlaybackInfo *Info() const { return &m_Info; }
bool IsPlaying() const override { return m_File != nullptr; }

View file

@ -130,7 +130,7 @@ void CEcon::Update()
if(!g_Config.m_EcBantime)
m_NetConsole.Drop(ClientId, "Too many authentication tries");
else
m_NetConsole.NetBan()->BanAddr(m_NetConsole.ClientAddr(ClientId), g_Config.m_EcBantime * 60, "Too many authentication tries", true);
m_NetConsole.NetBan()->BanAddr(m_NetConsole.ClientAddr(ClientId), g_Config.m_EcBantime * 60, "Too many authentication tries", false);
}
}
}

View file

@ -208,7 +208,7 @@ typename CNetBan::CBan<T> *CNetBan::CBanPool<T, HashCount>::Get(int Index) const
}
template<class T>
int CNetBan::Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool DisplayTime)
int CNetBan::Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool VerbatimReason)
{
// do not ban localhost
if(NetMatch(pData, &m_LocalhostIpV4) || NetMatch(pData, &m_LocalhostIpV6))
@ -222,7 +222,7 @@ int CNetBan::Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, c
// set up info
CBanInfo Info = {0};
Info.m_Expires = Stamp;
Info.m_DisplayTime = DisplayTime;
Info.m_VerbatimReason = VerbatimReason;
str_copy(Info.m_aReason, pReason);
// check if it already exists
@ -309,15 +309,15 @@ void CNetBan::Update()
}
}
int CNetBan::BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool DisplayTime)
int CNetBan::BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool VerbatimReason)
{
return Ban(&m_BanAddrPool, pAddr, Seconds, pReason, DisplayTime);
return Ban(&m_BanAddrPool, pAddr, Seconds, pReason, VerbatimReason);
}
int CNetBan::BanRange(const CNetRange *pRange, int Seconds, const char *pReason)
{
if(pRange->IsValid())
return Ban(&m_BanRangePool, pRange, Seconds, pReason, true);
return Ban(&m_BanRangePool, pRange, Seconds, pReason, false);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban failed (invalid range)");
return -1;
@ -415,7 +415,7 @@ void CNetBan::ConBan(IConsole::IResult *pResult, void *pUser)
NETADDR Addr;
if(net_addr_from_str(&Addr, pStr) == 0)
pThis->BanAddr(&Addr, Minutes * 60, pReason, true);
pThis->BanAddr(&Addr, Minutes * 60, pReason, false);
else
pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (invalid network address)");
}
@ -490,8 +490,7 @@ void CNetBan::ConBans(IConsole::IResult *pResult, void *pUser)
if(NumBans == 0)
{
str_format(aMsg, sizeof(aMsg), "The ban list is empty.");
pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aMsg);
pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "The ban list is empty.");
return;
}

View file

@ -81,7 +81,7 @@ protected:
};
int64_t m_Expires;
char m_aReason[REASON_LENGTH];
bool m_DisplayTime;
bool m_VerbatimReason;
};
template<class T>
@ -151,7 +151,7 @@ protected:
template<class T>
void MakeBanInfo(const CBan<T> *pBan, char *pBuf, unsigned BuffSize, int Type) const;
template<class T>
int Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool DisplayTime);
int Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason, bool VerbatimReason);
template<class T>
int Unban(T *pBanPool, const typename T::CDataType *pData);
@ -177,7 +177,7 @@ public:
void Init(class IConsole *pConsole, class IStorage *pStorage);
void Update();
virtual int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool DisplayTime);
virtual int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason, bool VerbatimReason);
virtual int BanRange(const CNetRange *pRange, int Seconds, const char *pReason);
int UnbanByAddr(const NETADDR *pAddr);
int UnbanByRange(const CNetRange *pRange);
@ -228,7 +228,7 @@ void CNetBan::MakeBanInfo(const CBan<T> *pBan, char *pBuf, unsigned BuffSize, in
}
// add info part
if(pBan->m_Info.m_DisplayTime && pBan->m_Info.m_Expires != CBanInfo::EXPIRES_NEVER)
if(!pBan->m_Info.m_VerbatimReason && pBan->m_Info.m_Expires != CBanInfo::EXPIRES_NEVER)
{
int Mins = ((pBan->m_Info.m_Expires - time_timestamp()) + 59) / 60;
if(Mins <= 1)

View file

@ -4,6 +4,16 @@
#include "protocolglue.h"
int GameFlags_ClampToSix(int Flags)
{
int Six = 0;
if(Flags & GAMEFLAG_TEAMS)
Six |= GAMEFLAG_TEAMS;
if(Flags & GAMEFLAG_FLAGS)
Six |= GAMEFLAG_FLAGS;
return Six;
}
int PlayerFlags_SevenToSix(int Flags)
{
int Six = 0;

View file

@ -1,6 +1,7 @@
#ifndef ENGINE_SHARED_PROTOCOLGLUE_H
#define ENGINE_SHARED_PROTOCOLGLUE_H
int GameFlags_ClampToSix(int Flags);
int PlayerFlags_SevenToSix(int Flags);
int PlayerFlags_SixToSeven(int Flags);
void PickupType_SevenToSix(int Type7, int &Type6, int &SubType6);

View file

@ -53,6 +53,7 @@ public:
};
int NumItems() const { return m_NumItems; }
int DataSize() const { return m_DataSize; }
const CSnapshotItem *GetItem(int Index) const;
int GetItemSize(int Index) const;
int GetItemIndex(int Key) const;
@ -62,6 +63,9 @@ public:
const void *FindItem(int Type, int Id) const;
unsigned Crc() const;
// Prints the raw snapshot data showing item and int boundaries.
// See also `CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap)`
// For more detailed annotations of the data.
void DebugDump() const;
bool IsValid(size_t ActualSize) const;

View file

@ -96,6 +96,7 @@ public:
CreateFolder("mapres", TYPE_SAVE);
CreateFolder("downloadedmaps", TYPE_SAVE);
CreateFolder("skins", TYPE_SAVE);
CreateFolder("skins7", TYPE_SAVE);
CreateFolder("downloadedskins", TYPE_SAVE);
CreateFolder("themes", TYPE_SAVE);
CreateFolder("communityicons", TYPE_SAVE);

Some files were not shown because too many files have changed in this diff Show more