[teeworlds] 02/07: New upstream version 0.6.4+dfsg

Felix Geyer fgeyer at moszumanska.debian.org
Thu Nov 17 20:01:45 UTC 2016


This is an automated email from the git hooks/post-receive script.

fgeyer pushed a commit to branch master
in repository teeworlds.

commit bf5e8e2c457013571b02dc97f9ed9f409efdd947
Author: Felix Geyer <fgeyer at debian.org>
Date:   Mon Nov 14 21:37:45 2016 +0100

    New upstream version 0.6.4+dfsg
---
 bam.lua                                   |   2 +-
 data/languages/belarusian.txt             |  30 +-
 data/languages/bosnian.txt                |  12 +
 data/languages/brazilian_portuguese.txt   |  38 +-
 data/languages/bulgarian.txt              | 336 +++++++-------
 data/languages/chuvash.txt                | 700 ++++++++++++++++++++++++++++++
 data/languages/czech.txt                  |  12 +
 data/languages/danish.txt                 |  12 +
 data/languages/dutch.txt                  |  15 +-
 data/languages/finnish.txt                |  12 +
 data/languages/french.txt                 |  36 +-
 data/languages/german.txt                 |  36 +-
 data/languages/hungarian.txt              |  12 +
 data/languages/index.txt                  |   8 +
 data/languages/italian.txt                |  37 +-
 data/languages/kyrgyz.txt                 | 282 ++++++------
 data/languages/norwegian.txt              |  42 +-
 data/languages/polish.txt                 |  12 +
 data/languages/portuguese.txt             |  12 +
 data/languages/romanian.txt               |  78 ++--
 data/languages/russian.txt                |  30 +-
 data/languages/sakha.txt                  | 700 ++++++++++++++++++++++++++++++
 data/languages/serbian.txt                |  12 +
 data/languages/slovak.txt                 |  12 +
 data/languages/spanish.txt                |  30 +-
 data/languages/swedish.txt                |  12 +
 data/languages/turkish.txt                |  12 +
 data/languages/ukrainian.txt              |  12 +
 datasrc/datatypes.py                      |   2 +-
 license.txt                               |   2 +-
 other/freetype/VERSION                    |   2 +-
 other/sdl/README-SDL.txt                  |  13 +
 other/sdl/VERSION                         |   1 +
 readme.txt                                |   2 +-
 scripts/cmd5.py                           |   2 +-
 scripts/refactor_count.py                 |   2 +-
 src/base/math.h                           |   2 +-
 src/base/system.c                         |  75 ++--
 src/base/system.h                         |  11 +-
 src/base/tl/threading.h                   |   2 +-
 src/base/vmath.h                          |   8 +-
 src/engine/client/backend_sdl.cpp         |   4 +-
 src/engine/client/client.cpp              |  63 ++-
 src/engine/client/client.h                |   1 +
 src/engine/client/serverbrowser.cpp       |  31 +-
 src/engine/client/serverbrowser.h         |  13 +-
 src/engine/client/sound.cpp               |  10 +-
 src/engine/server/server.cpp              |  14 +-
 src/engine/shared/config_variables.h      |   4 +-
 src/engine/shared/econ.cpp                |   5 +-
 src/engine/shared/engine.cpp              |   2 +
 src/engine/shared/jobs.cpp                |   6 +-
 src/engine/shared/network.cpp             |   2 +-
 src/engine/shared/network.h               |   5 +-
 src/engine/shared/network_client.cpp      |   5 +-
 src/engine/shared/network_conn.cpp        |  24 +-
 src/engine/shared/network_server.cpp      |   9 +-
 src/engine/shared/snapshot.cpp            |   8 +-
 src/engine/shared/snapshot.h              |   7 +-
 src/game/client/components/chat.cpp       |   1 +
 src/game/client/components/hud.cpp        |  14 +-
 src/game/client/components/items.cpp      |  24 -
 src/game/client/components/items.h        |  11 -
 src/game/client/components/mapimages.cpp  |   5 +-
 src/game/client/components/menus_demo.cpp |   2 +-
 src/game/client/components/players.cpp    |   7 +-
 src/game/client/gameclient.cpp            |  20 +-
 src/game/collision.h                      |   4 +-
 src/game/editor/editor.cpp                |  55 ++-
 src/game/editor/io.cpp                    |  17 +-
 src/game/editor/layer_tiles.cpp           |   2 +-
 src/game/editor/popups.cpp                |   6 +
 src/game/gamecore.cpp                     |  16 +-
 src/game/mapitems.h                       |   8 +-
 src/game/server/entities/character.cpp    |  33 --
 src/game/server/entity.cpp                |   4 +-
 src/game/server/gamecontext.cpp           |   6 +-
 src/game/server/gamecontroller.cpp        |  35 +-
 src/game/server/gamecontroller.h          |   2 +
 src/game/variables.h                      |   1 +
 src/game/version.h                        |   4 +-
 src/mastersrv/mastersrv.cpp               |   2 +-
 src/tools/crapnet.cpp                     |   4 +-
 src/tools/packetgen.cpp                   |   2 +-
 84 files changed, 2470 insertions(+), 696 deletions(-)

diff --git a/bam.lua b/bam.lua
index 11ac7b9..3ac85f3 100644
--- a/bam.lua
+++ b/bam.lua
@@ -144,7 +144,7 @@ function build(settings)
 	settings.cc.Output = Intermediate_Output
 
 	if config.compiler.driver == "cl" then
-		settings.cc.flags:Add("/wd4244")
+		settings.cc.flags:Add("/wd4244", "/wd4577")
 	else
 		settings.cc.flags:Add("-Wall", "-fno-exceptions")
 		if family == "windows" then
diff --git a/data/languages/belarusian.txt b/data/languages/belarusian.txt
index 47f3aa8..a5c03a7 100644
--- a/data/languages/belarusian.txt
+++ b/data/languages/belarusian.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Цела
 
+Borderless window
+== Акно без рамкі
+
 Call vote
 == Галасаваць
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Гульня скончана
 
+Game paused
+== Гульня спынена
+
 Game type
 == Тып гульні
 
@@ -241,6 +247,9 @@ Grenade
 Hammer
 == Молат
 
+Handle rendering async from updates
+== Асінхронны рэндэрынг
+
 Has people playing
 == Не пусты сервер
 
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Скінуць налады
 
+Respawn
+== Адраджэнне
+
 Rifle
 == Бласцер
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Паказваць нікі гульцоў
 
+Show only chat messages from friends
+== Паказваць паведамлення толькі ад сяброў
+
 Show only supported
 == Паказваць толькі падтрымоўваныя дазволы экрана
 
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Ёсць незахаваная карта ў рэдактары, Вы можаце захаваць яе перад тым, як выйсці.
 
+Threaded rendering
+== Струменны рэндэрынг
+
+Threaded sound loading
+== Струменная загрузка гуку
+
 Time limit
 == Ліміт часу
 
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/bosnian.txt b/data/languages/bosnian.txt
index 85f2e0c..4f136ac 100644
--- a/data/languages/bosnian.txt
+++ b/data/languages/bosnian.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/brazilian_portuguese.txt b/data/languages/brazilian_portuguese.txt
index 5bb3f73..889f521 100644
--- a/data/languages/brazilian_portuguese.txt
+++ b/data/languages/brazilian_portuguese.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Corpo
 
+Borderless window
+== Janela sem borda
+
 Call vote
 == Votar
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Fim do jogo
 
+Game paused
+== Jogo pausado
+
 Game type
 == Tipo de jogo
 
@@ -241,6 +247,9 @@ Grenade
 Hammer
 == Martelo
 
+Handle rendering async from updates
+== Lidar com renderização assíncrona de atualizações
+
 Has people playing
 == Há pessoas jogando
 
@@ -323,7 +332,7 @@ Move left
 == Esquerda
 
 Move player to spectators
-== Mover jogador para espectadores
+== Mover jogador para observador
 
 Move right
 == Direita
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Resetar configurações
 
+Respawn
+== Reaparecer
+
 Rifle
 == Laser
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Mostrar apelidos
 
+Show only chat messages from friends
+== Mostrar apenas mensagens de chat de amigos
+
 Show only supported
 == Mostrar apenas modos suportados
 
@@ -554,10 +569,10 @@ Spectate previous
 == Observar anterior
 
 Spectator mode
-== Modo espectador
+== Modo observador
 
 Spectators
-== Espectadores
+== Observadores
 
 Standard gametype
 == Tipo de jogo padrão
@@ -572,7 +587,7 @@ Strict gametype filter
 == Filtrar tipo de jogo exato
 
 Sudden Death
-== Morte Súbita
+== Morte súbita
 
 Switch weapon on pickup
 == Equipar arma ao pegá-la
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Existe um mapa não salvo no editor, você pode querer salvá-lo antes de sair do jogo.
 
+Threaded rendering
+== Renderização em paralelo
+
+Threaded sound loading
+== Carregamento de som em paralelo
+
 Time limit
 == Limite de tempo
 
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/bulgarian.txt b/data/languages/bulgarian.txt
index 83c674b..1250baf 100644
--- a/data/languages/bulgarian.txt
+++ b/data/languages/bulgarian.txt
@@ -2,28 +2,28 @@
 ##### translated strings #####
 
 %d Bytes
-== %d Байтове
+== %d Байта
 
 %d of %d servers, %d players
-== %d/%d сървъри, %d играчи
+== %d от %d сървъра, %d играчи
 
 %d%% loaded
 == %d%% заредено
 
 %ds left
-== остават %d сек.
+== Остава(т) %d сек
 
 %i minute left
-== %i минута остава
+== Остава %i минута
 
 %i minutes left
-== %i минути остават
+== Остават %i минути
 
 %i second left
-== %i секунда остава
+== Остава %i секунда
 
 %i seconds left
-== %i секунди остават
+== Остават %i секунди
 
 %s wins!
 == %s печели!
@@ -32,13 +32,13 @@
 == -Страница %d-
 
 Abort
-== Прекрати
+== Отмяна
 
 Add
-== Добави
+== Добавяне
 
 Add Friend
-== Добави Приятел
+== Добавяне на приятел
 
 Address
 == Адрес
@@ -50,40 +50,43 @@ Alpha
 == Прозрачност
 
 Always show name plates
-== Винаги показвай лентите с имената
+== Винаги да се показват лент. с им.
 
 Are you sure that you want to delete the demo?
-== Сигуен ли си че искаш да изтриеш това демо?
+== Сигурни ли сте, че искате да изтриете записа?
 
 Are you sure that you want to quit?
-== Сигурен ли си че искаш да напуснеш?
+== Сигурни ли сте, че искате да напуснете?
 
 Are you sure that you want to remove the player from your friends list?
-== Сигурен ли си че искаш да премахнеш този играч от листа с приятели?
+== Сигурни ли сте, че искате да премахнете този играч от списъка с приятели?
 
 As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server.
-== Тъй като стартираш играта за първи път, моля въведи своя ник отдолу. Препоръчително е да провериш и нагласиш настройките по ваш свой избор преди да започнеш игра.
+== Тъй като стартирате играта за първи път, моля, въведете своя псевдоним по-долу. Препоръчително е да проверите и нагласите настройките, преди да започнете игра.
 
 Automatically record demos
-== Записвай демота автоматично
+== Автоматично създаване на записи
 
 Automatically take game over screenshot
 == Автоматична снимка в края на играта
 
 Blue team
-== Отбор Сини
+== Син отбор
 
 Blue team wins!
-== Отбор Сини печели!
+== Синият отбор печели!
 
 Body
 == Тяло
 
+Borderless window
+== Прозорец без рамка
+
 Call vote
-== Гласувай
+== Гласуване
 
 Change settings
-== Промени настройките
+== Промяна на настройките
 
 Chat
 == Чат
@@ -95,37 +98,37 @@ Client
 == Клиент
 
 Close
-== Затвори
+== Затваряне
 
 Compatible version
 == Съвместима версия
 
 Connect
-== Впиши
+== Свързване
 
 Connecting to
-== Свързвам се с
+== Свързване с
 
 Connection Problems...
-== Проблеми с Връзката...
+== Проблеми с връзката...
 
 Console
 == Конзола
 
 Controls
-== Контроли
+== Управление
 
 Count players only
-== Брой на играчите
+== Броене само на играчите
 
 Country
 == Държава
 
 Crc:
-== Crc:
+== Контролна сума:
 
 Created:
-== Създаден:
+== Създадено:
 
 Current
 == Текущ
@@ -134,55 +137,55 @@ Current version: %s
 == Текуща версия: %s
 
 Custom colors
-== Произволни цветове
+== Потребителски цветове
 
 Delete
-== Изтрий
+== Изтриване
 
 Delete demo
-== Изтрий демото
+== Изтриване на записа
 
 Demo details
-== Детайли за демото
+== Подробности за записа
 
 Demofile: %s
-== Демофайл: %s
+== Файл със запис: %s
 
 Demos
-== Демота
+== Записи
 
 Disconnect
-== Отпиши
+== Разкачане
 
 Disconnected
-== Отписан
+== Разкачен
 
 Display Modes
-== Режими на Показване
+== Налични режими
 
 Downloading map
-== Свалям карта
+== Изтегляне на карта
 
 Draw!
-== Равни!
+== Равенство!
 
 Dynamic Camera
-== Динамична Камера
+== Динамична камера
 
 Emoticon
-== Емотикони
+== Емотиконка
 
 Enter
-== Влез
+== Влизане
 
 Error
 == Грешка
 
 Error loading demo
-== Грешка при зареждане на демо файл
+== Грешка при зареждане на запис
 
 FSAA samples
-== FSAA семпли
+== FSAA проби
 
 Favorite
 == Любим
@@ -203,31 +206,34 @@ Folder
 == Папка
 
 Force vote
-== Форсирай вот
+== Насилено гласуване
 
 Free-View
-== Свободен Изглед
+== Свободен изглед
 
 Friends
 == Приятели
 
 Fullscreen
-== Цял Екран
+== На цял екран
 
 Game
 == Игра
 
 Game info
-== Игра
+== Информация за играта
 
 Game over
-== Играта свърши
+== Край на играта
+
+Game paused
+== Играта е на пауза
 
 Game type
 == Тип игра
 
 Game types:
-== Тип иги:
+== Типове игри:
 
 General
 == Основни
@@ -241,47 +247,50 @@ Grenade
 Hammer
 == Чук
 
+Handle rendering async from updates
+== Изчертаването да бъде асинхронно от обновяването
+
 Has people playing
-== Не показвай празни
+== Да има играчи
 
 High Detail
-== Висока Детайлност
+== Голяма детайлност
 
 Hook
-== Верига
+== Кука
 
 Host address
 == Адрес на сървъра
 
 Hue
-== Оттенък
+== Тон
 
 Info
-== Инфо
+== Инф.
 
 Internet
 == Интернет
 
 Invalid Demo
-== Невалидно Демо
+== Невалиден запис
 
 Join blue
-== Влез син
+== Присъединяване към сините
 
 Join game
-== Влез
+== Присъединяване
 
 Join red
-== Влез червен
+== Присъединяване към червените
 
 Jump
 == Скок
 
 Kick player
-== Кикни играч
+== Изритване на играч
 
 LAN
-== ЛАН
+== Лок. мр.
 
 Language
 == Език
@@ -290,13 +299,13 @@ Length:
 == Дължина:
 
 Lht.
-== Яркост
+== Ярк.
 
 Loading
-== Зареждам
+== Зареждане
 
 MOTD
-== MOTD
+== Съобщение на деня
 
 Map
 == Карта
@@ -305,43 +314,43 @@ Map:
 == Карта:
 
 Max Screenshots
-== Максимум Снимки
+== Макс. бр. снимки
 
 Max demos
-== Максимум Демота
+== Макс. бр. записи
 
 Maximum ping:
-== Макс. пинг:
+== Макс. време за отговор:
 
 Miscellaneous
-== Допълнителни
+== Разни
 
 Mouse sens.
-== Мишка
+== Чувств. на мишката
 
 Move left
-== На ляво
+== Наляво
 
 Move player to spectators
-== Премести играча в наблюдатели
+== Преместване на играча към наблюдателите
 
 Move right
-== На дясно
+== Надясно
 
 Movement
 == Движение
 
 Mute when not active
-== Изключвай звука когато играта е неактивна
+== Заглушаване на звука когато играта е неактивна
 
 Name
 == Име
 
 Name plates size
-== Размер на лентата с имената
+== Размер на лентите с имената
 
 Netversion:
-== Версия:
+== Мрежова версия:
 
 New name:
 == Ново име:
@@ -350,49 +359,49 @@ News
 == Новини
 
 Next weapon
-== След. оръжие
+== Следв. оръжие
 
 Nickname
-== Ник
+== Псевдоним
 
 No
 == Не
 
 No password
-== Без парола
+== Няма парола
 
 No servers found
 == Няма намерени сървъри
 
 No servers match your filter criteria
-== Няма сървъри съответстващи твоите настройки
+== Няма сървъри, отговарящи на критериите
 
 Ok
 == Добре
 
 Open
-== Отвори
+== Отваряне
 
 Parent Folder
-== Предишна Папка
+== Родителска папка
 
 Password
 == Парола
 
 Password incorrect
-== Грешна Парола
+== Грешна парола
 
 Ping
-== Пинг
+== Вр. за отг.
 
 Pistol
 == Пистолет
 
 Play
-== Възпроизведи
+== Играене
 
 Play background music
-== Пусни музика за фон
+== Изпълнение на фоновата музика
 
 Player
 == Играч
@@ -401,7 +410,7 @@ Player country:
 == Страна на играча:
 
 Player options
-== Настройки на Играча
+== Настройки на играча
 
 Players
 == Играчи
@@ -410,19 +419,19 @@ Please balance teams!
 == Моля уравновесете отборите!
 
 Prev. weapon
-== Пред. оръжие
+== Предх. оръжие
 
 Quality Textures
-== Качествени Текстури
+== Качествени текстури
 
 Quick search:
-== Бързо Търсене:
+== Бързо търсене:
 
 Quit
 == Изход
 
 Quit anyway?
-== Излезни все пак?
+== Изход въпреки това?
 
 REC %3d:%02d
 == Записани %3d:%02d
@@ -431,64 +440,67 @@ Reason:
 == Причина:
 
 Record demo
-== Запиши демо
+== Започване на запис
 
 Red team
-== Отбор Червени
+== Червен отбор
 
 Red team wins!
-== Отбор Червени печели!
+== Червеният отбор печели!
 
 Refresh
-== Обнови
+== Опресняване
 
 Refreshing master servers
-== Обновновявам мастър-сървърите
+== Обновяване на главните сървъри
 
 Remote console
-== Сървър Конзола
+== Отдалечена конзола
 
 Remove
-== Премахни
+== Премахване
 
 Remove friend
-== Премахни приятел
+== Премахване на приятеля
 
 Rename
-== Преименувай
+== Преименуване
 
 Rename demo
-== Преименувай демо
+== Преименуване на записа
 
 Reset filter
-== Рестартирай филтрите
+== Нулиране на филтрите
 
 Reset to defaults
-== Рестартирай настройките
+== По подразбиране
+
+Respawn
+== Прераждане
 
 Rifle
-== Лазер
+== Винтовка
 
 Round
 == Рунд
 
 Sample rate
-== Честота
+== Честота на дискр.
 
 Sat.
-== Контраст
+== Нас.
 
 Score
-== Точки
+== Резултат
 
 Score board
-== Резултат
+== Табло с резултати
 
 Score limit
-== Лимит на точките
+== Ограничение на точките
 
 Scoreboard
-== Резултат
+== Табло с резултати
 
 Screenshot
 == Снимка
@@ -497,16 +509,16 @@ Server address:
 == Адрес на сървъра:
 
 Server details
-== Детайли за Сървъра
+== Подр. за сървъра
 
 Server filter
 == Филтър на сървъра
 
 Server info
-== Инфо
+== Информация за сървъра
 
 Server not full
-== Не показвай пълните
+== Сървърът да не е пълен
 
 Settings
 == Настройки
@@ -515,43 +527,49 @@ Shotgun
 == Пушка
 
 Show chat
-== Показвай чата
+== Показване на чата
 
 Show friends only
-== Покажи приятели
+== Показване само на приятелите
 
 Show ingame HUD
-== Показвай детайли в играта
+== Показване на интерфейса в играта
 
 Show name plates
-== Показвай лентите с имената
+== Показване на лентите с имената
+
+Show only chat messages from friends
+== Показване само на съобщ. от приятели
 
 Show only supported
-== Показвай само съвместимите
+== Показване само на съвместимите
 
 Size:
-== Размер
+== Размер:
 
 Skins
-== Модели
+== Облици
 
 Sound
 == Звук
 
 Sound error
-== Грешка в звука
+== Звукова грешка
 
 Sound volume
 == Сила на звука
 
 Spectate
-== Наблюдавай
+== Наблюдаване
 
 Spectate next
-== Наблюдавай след.
+== Наблюдаване на следв.
+
+Spectate previous
+== Наблюдаване на пред.
 
 Spectator mode
-== Наблюдател
+== Режим на наблюдаване
 
 Spectators
 == Наблюдатели
@@ -560,19 +578,19 @@ Standard gametype
 == Стандартен тип игри
 
 Standard map
-== Стандартна карта
+== Стандартни карти
 
 Stop record
-== Спри записа
+== Спиране на записването
 
 Strict gametype filter
-== Стриктен геймтайп филтър
+== Строг филтър за тип игра
 
 Sudden Death
-== Внезапна Смърт
+== Внезапна смърт
 
 Switch weapon on pickup
-== Сменяй оръжието при взимане
+== Сменяне на оръжието при вземане
 
 Team
 == Отбор
@@ -581,28 +599,34 @@ Team chat
 == Отборен чат
 
 Teeworlds %s is out! Download it at www.teeworlds.com!
-== Излезна Teeworlds %s! Свали новата версия от www.teeworlds.com!
+== Излезе Teeworlds %s! Изтеглете я от www.teeworlds.com!
 
 Texture Compression
-== Компресиране на Текстурите
+== Компресия на текстурите
 
 The audio device couldn't be initialised.
-== Аудио устройството не може да бъде стартирано.
+== Звуковото устройство не може да бъде стартирано.
 
 The server is running a non-standard tuning on a pure game type.
-== Този сървър използва нестандартен тунинг на стандартен тип ига.
+== Този сървър използва нестандартни настройки на стандартен тип игра.
 
 There's an unsaved map in the editor, you might want to save it before you quit the game.
-== Има незапазена карта в редактора, ако напуснете картата няма да бъде запазена.
+== Има незапазена карта в редактора. Ако напуснете играта, картата няма да бъде запазена.
+
+Threaded rendering
+== Многонишково изчертаване
+
+Threaded sound loading
+== Многонишково зареждане на звука
 
 Time limit
-== Лимит на Времето
+== Ограничение на времето
 
 Time limit: %d min
-== Лимит на Времето: %d мин
+== Ограничение на времето: %d мин
 
 Try again
-== Опитай пак
+== Повторен опит
 
 Type
 == Тип
@@ -611,34 +635,34 @@ Type:
 == Тип:
 
 UI Color
-== Цвят на Интерфейса
+== Звят на потр. интерфейс
 
 Unable to delete the demo
-== Изтриването неуспешно
+== Неуспешно изтриване на записа
 
 Unable to rename the demo
-== Преименуването неуспешно
+== Неуспешно преименуване на записа
 
 Use sounds
-== Използвай Звук
+== Използване на звуци
 
 Use team colors for name plates
-== Използвай  цветове в лентите
+== Използване на отборните цветове в лентите с имената
 
 V-Sync
-== Вертикална Синхронизация
+== Вертикална синхронизация
 
 Version
 == Версия
 
 Version:
-== Версия:
+== Версия
 
 Vote command:
-== Вот команда:
+== Команда за гласуване:
 
 Vote description:
-== Вот дефиниция:
+== Описание на гласуването:
 
 Vote no
 == Против
@@ -653,36 +677,24 @@ Warmup
 == Разгрявка
 
 Weapon
-== Оръжия
+== Оръжие
 
 Welcome to Teeworlds
-== Добре дошли в Teeworlds!
+== Добре дошли в Teeworlds
 
 Yes
 == Да
 
 You must restart the game for all settings to take effect.
-== Трябва да рестартираш играта за да поемат ефект новите настройки.
+== Трябва да рестартирате играта, за да се приложат новите настройки.
 
 Your skin
-== Твоят модел
+== Вашият облик
 
 no limit
-== Без лимит
+== няма ограничение
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
-Spectate previous
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/chuvash.txt b/data/languages/chuvash.txt
new file mode 100644
index 0000000..1acab9c
--- /dev/null
+++ b/data/languages/chuvash.txt
@@ -0,0 +1,700 @@
+
+##### translated strings #####
+
+%d Bytes
+== %d байт
+
+%d of %d servers, %d players
+== %d серв. %d тупнă, %d çын
+
+%d%% loaded
+== %d%% тиенĕ
+
+%ds left
+== %d сек.
+
+%i minute left
+== %i мин.
+
+%i minutes left
+== %i мин.
+
+%i second left
+== %i сек.
+
+%i seconds left
+==  %i сек.
+
+%s wins!
+== %s çĕнтерчĕ!
+
+-Page %d-
+== -Страница %d-
+
+Abort
+== Каялла
+
+Add
+== Хуш
+
+Add Friend
+== Юлташа хуш
+
+Address
+== Адрес
+
+All
+== Пурте
+
+Alpha
+== Тăрă
+
+Always show name plates
+== Вылякансен ятсене кăтартма
+
+Are you sure that you want to delete the demo?
+== Эсир демо парахасшăн-и?
+
+Are you sure that you want to quit?
+== Эсир тухасшăн-и?
+
+Are you sure that you want to remove the player from your friends list?
+== Юшташу списокра тĕплесшĕн-и?
+
+As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server.
+== Пĕрремĕш вăйă умĕнче, хăвăн ята аяларах çыр. Ĕнерленӳсене тереслер, улăштар.
+
+Automatically record demos
+== Демосене автоматикăла çыр
+
+Automatically take game over screenshot
+== Вăйăн пайта çут-ӳкерчĕк ту
+
+Blue team
+== Кăвак ушкăн
+
+Blue team wins!
+== Кăвак ушкăн çĕнтерчĕ!
+
+Body
+== Ӳт
+
+Call vote
+== Сасăла
+
+Change settings
+== Йĕркелӳсене урăхлатма
+
+Chat
+== Калаçу
+
+Clan
+== Кланĕ
+
+Client
+== Клиент
+
+Close
+== Хупма
+
+Compatible version
+== Пĕрле ĕçлекен верси
+
+Connect
+== Çых
+
+Connecting to
+== Çыхăну
+
+Connection Problems...
+== Çыхăну проблемасем
+
+Console
+== Консоль
+
+Controls
+== Пăхăнтару
+
+Count players only
+== Çынсене анчах шутлама
+
+Country
+== Çĕрĕн ялавĕ
+
+Crc:
+== Crc:
+
+Created:
+== Хайланă:
+
+Current
+== Хальхи
+
+Current version: %s
+== Хальхи версие: %s
+
+Custom colors
+== Усă кураканăн тĕсĕсем
+
+Delete
+== Шăлса тасатма
+
+Delete demo
+== Демо шăлса тасатма
+
+Demo details
+== Демо тĕплĕсем
+
+Demofile: %s
+== Демо: %s
+
+Demos
+== Демосем
+
+Disconnect
+== Çыхăну чарма
+
+Disconnected
+== Çыхăну чарăнчĕ
+
+Display Modes
+== Экран режимсем
+
+Downloading map
+== Карта илӳ
+
+Draw!
+== Никам та çĕнтермерĕ!
+
+Dynamic Camera
+== Куçакан камера
+
+Emoticon
+== Кăмăл-туйăмсем
+
+Enter
+== Кĕрӳ
+
+Error
+== Йăнăш
+
+Error loading demo
+== Демо илĕвĕн йăнăш
+
+FSAA samples
+== FSAA якату
+
+Favorite
+== Суйланни
+
+Favorites
+== Суйланнисем
+
+Feet
+== Урасем
+
+Filter
+== Фильтр
+
+Fire
+== Пĕрӳ
+
+Folder
+== Папка
+
+Force vote
+== Вăйлăт
+
+Free-View
+== Ирĕклĕ обзор
+
+Friends
+== Юлташсем
+
+Fullscreen
+== Тулли экран
+
+Game
+== Вăйă
+
+Game info
+== Вăйă пĕлтерӳ
+
+Game over
+== Вăйа вĕçленчĕ
+
+Game type
+== Вăйăн тĕс
+
+Game types:
+== Вăйăн тĕсĕсем
+
+General
+== Тĕп
+
+Graphics
+== Ӳкерӳ
+
+Grenade
+== Гранатомёт
+
+Hammer
+== Мăлатук
+
+Has people playing
+== Вылякан пур
+
+High Detail
+== Лайăх ӳкерӳ
+
+Hook
+== Çекĕл
+
+Host address
+== Сервер адресĕ
+
+Hue
+== Тĕс сĕмĕ
+
+Info
+== Пĕлтерӳ
+
+Internet
+== Интернет
+
+Invalid Demo
+== Тĕрĕс мар демо
+
+Join blue
+== Кăваксемпе!
+
+Join game
+== Выляма
+
+Join red
+== Хĕрлĕсемпе!
+
+Jump
+== Сик
+
+Kick player
+== Вылякана бан
+
+LAN
+== LAN
+
+Language
+== Чĕлхе
+
+Length:
+== Вăрăмăш
+
+Lht.
+== Çутăллăх
+
+Loading
+== Кĕт, тархасшăн
+
+MOTD
+== MOTD
+
+Map
+== Карта
+
+Map:
+== Карта:
+
+Max Screenshots
+== Ӳкерчĕксен чи пысăк хисепĕ
+
+Max demos
+== Чи пысăк демо хисепĕ
+
+Maximum ping:
+== Чи пысăк пинг:
+
+Miscellaneous
+== Хушнисем
+
+Mouse sens.
+== Шăшин туйăмлăх
+
+Move left
+== Сулахаялла
+
+Move player to spectators
+== Пăхакансем çине куçарма
+
+Move right
+== Сылтăмалла
+
+Movement
+== Куçăм
+
+Mute when not active
+== Тивмен чух сасăна шăплантар
+
+Name
+== Ят
+
+Name plates size
+== Пысăкăш
+
+Netversion:
+== Версия:
+
+New name:
+== Çĕн ят
+
+News
+== Хыпарсем
+
+Next weapon
+== Тепĕр хĕç-пăшал
+
+Nickname
+== Ят
+
+No
+== Çук
+
+No password
+== Вăрттăн сăмахсăр
+
+No servers found
+== Серверсем çук
+
+No servers match your filter criteria
+== Фильтр майлă серверсем çук
+
+Ok
+== Çапла
+
+Open
+== Уçма
+
+Parent Folder
+== Аслă каталог
+
+Password
+== Вăрттăн сăмах
+
+Password incorrect
+== Тĕрĕс мар вăрттăн сăмах
+
+Ping
+== Пинг
+
+Pistol
+== Пистолет
+
+Play
+== Пăхма
+
+Play background music
+== Кĕвви
+
+Player
+== Вылякан
+
+Player country:
+== Çĕршыв:
+
+Player options
+== Опцисем
+
+Players
+== Çынсем
+
+Please balance teams!
+== Вылякан ушкăнĕсене шайлаштар!
+
+Prev. weapon
+== Малтанхи хĕç-пăшал
+
+Quality Textures
+== Лайăх текстурасем
+
+Quick search:
+== Хăвăрт шырав:
+
+Quit
+== Туху
+
+Quit anyway?
+== Туху?
+
+REC %3d:%02d
+== REC %3d:%02d
+
+Reason:
+== Сăлтав:
+
+Record demo
+== Демо çыр
+
+Red team
+== Хĕрлĕ ушкăн
+
+Red team wins!
+== Хĕрлĕ ушкăн çĕнтерчĕ!
+
+Refresh
+== Каллех вула
+
+Refreshing master servers
+== Мастер-серверсен каллех вулу
+
+Remote console
+== Сервер консолĕ
+
+Remove
+== Тасат
+
+Remove friend
+== Юлташа тасат
+
+Rename
+== Çĕнĕ ят
+
+Rename demo
+== Демо çĕнĕ ят
+
+Reset filter
+== Фильтрсене тасат
+
+Reset to defaults
+== Йĕркелӳ тасат
+
+Rifle
+== Бластер
+
+Round
+== Раунд
+
+Sample rate
+== Тăтăшлăх
+
+Sat.
+== Контраст
+
+Score
+== Паллă
+
+Score board
+== Паллăсен хăмми
+
+Score limit
+== Паллă лимичĕ
+
+Scoreboard
+== Паллăсен хăмми
+
+Screenshot
+== Экран ӳкерӳ
+
+Server address:
+== Сервер адресĕ
+
+Server details
+== Сервер тĕплĕсем
+
+Server filter
+== Серверсен фильтр
+
+Server info
+== Пĕлтерӳ
+
+Server not full
+== Сервер тулли мар
+
+Settings
+== Йĕркелӳсем
+
+Shotgun
+== Йĕтре пăшал
+
+Show chat
+== Калаçӳ кăтартма
+
+Show friends only
+== Юлташсемпе анчах
+
+Show ingame HUD
+== Вăйă çинчи HUD кăтартма
+
+Show name plates
+== Вылякансен ят кăтартма
+
+Show only supported
+== Ĕçлекен экран режимĕсем анчах
+
+Size:
+== Пыçăкăш:
+
+Skins
+== Сăнсем
+
+Sound
+== Сасă
+
+Sound error
+== Сасă йăнăш
+
+Sound volume
+== Сасă янравлăш
+
+Spectate
+== Пăхма
+
+Spectate next
+== Тепĕрне пăхма
+
+Spectate previous
+== Малтанхине пăхма
+
+Spectator mode
+== Пăхакан
+
+Spectators
+== Пăхакансем
+
+Standard gametype
+== Стандартлă вăйă тĕсĕ
+
+Standard map
+== Стандартлă карта
+
+Stop record
+== Чарма
+
+Strict gametype filter
+== Хытă вăйă тĕс фильтрĕ
+
+Sudden Death
+== Хăвăрт вилӳ
+
+Switch weapon on pickup
+== Хĕç-пăшал илнĕ чух улăштарма
+
+Team
+== Ушкăн
+
+Team chat
+== Ушкăнри калаçу
+
+Teeworlds %s is out! Download it at www.teeworlds.com!
+== Тухрĕ Teeworlds %s! Кунта: www.teeworlds.com!
+
+Texture Compression
+== Текстур хĕсӳ
+
+The audio device couldn't be initialised.
+== Аудио ярма пултараймасть
+
+The server is running a non-standard tuning on a pure game type.
+== Серверта стардартлă мар опцисемпе таса вăйă тĕсĕрĕ
+
+There's an unsaved map in the editor, you might want to save it before you quit the game.
+== Редакторта упраман карта пур. Туху умĕн ăна упрама пултарать
+
+Time limit
+== Вăхăт лимичĕ
+
+Time limit: %d min
+== Вăхăт лимичĕ: %d мин
+
+Try again
+== Тепĕр хут
+
+Type
+== Тĕс
+
+Type:
+== Тĕс:
+
+UI Color
+== Интерфейс тĕсĕ
+
+Unable to delete the demo
+== Демо тĕплеме пултараймасть
+
+Unable to rename the demo
+== Демо ячĕ улăштарма пулмасть
+
+Use sounds
+== Сасă уса курма
+
+Use team colors for name plates
+== Ушкăн тĕсĕсем ятсем валли
+
+V-Sync
+== Вертикаллĕ синхронизаци
+
+Version
+== Версие
+
+Version:
+== Версие:
+
+Vote command:
+== Суйлав хушу:
+
+Vote description:
+== Суйлав пирки:
+
+Vote no
+== Хирĕç
+
+Vote yes
+== Çинчен
+
+Voting
+== Суйлав
+
+Warmup
+== Карăну
+
+Weapon
+== Хĕç-пăшал
+
+Welcome to Teeworlds
+== Ырă сунса кĕтетпĕр Teeworlds-ра!
+
+Yes
+== Çапла
+
+You must restart the game for all settings to take effect.
+== Режим улăштарма валли вăйă сӳнтер тата каллер яр
+
+Your skin
+== Санăн сăн
+
+no limit
+== Лимитсăр
+
+##### needs translation #####
+
+Borderless window
+== 
+
+Game paused
+== 
+
+Handle rendering async from updates
+== 
+
+Respawn
+== 
+
+Show only chat messages from friends
+== 
+
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
+##### old translations #####
+
diff --git a/data/languages/czech.txt b/data/languages/czech.txt
index dd18d67..6ab4513 100644
--- a/data/languages/czech.txt
+++ b/data/languages/czech.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/danish.txt b/data/languages/danish.txt
index 6f82249..fe5df8a 100644
--- a/data/languages/danish.txt
+++ b/data/languages/danish.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/dutch.txt b/data/languages/dutch.txt
index fca6bec..f005613 100644
--- a/data/languages/dutch.txt
+++ b/data/languages/dutch.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Lichaam
 
+Borderless window
+== Randloos scherm
+
 Call vote
 == Stem
 
@@ -244,6 +247,9 @@ Grenade
 Hammer
 == Hamer
 
+Handle rendering async from updates
+== Behandelen renderen async van updates
+
 Has people playing
 == Mensen in server
 
@@ -607,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Er is een onopgeslagen kaart in de editor, misschien wil je deze opslaan voordat je stopt.
 
+Threaded rendering
+== Renderen draadmodule
+
+Threaded sound loading
+== Laden geluidslijn
+
 Time limit
 == Tijdslimiet
 
@@ -684,4 +696,5 @@ no limit
 
 ##### needs translation #####
 
-##### old translations #####
\ No newline at end of file
+##### old translations #####
+
diff --git a/data/languages/finnish.txt b/data/languages/finnish.txt
index f9586c1..112c292 100644
--- a/data/languages/finnish.txt
+++ b/data/languages/finnish.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/french.txt b/data/languages/french.txt
index 846f4ed..8e4a1fd 100644
--- a/data/languages/french.txt
+++ b/data/languages/french.txt
@@ -68,7 +68,7 @@ Automatically record demos
 == Enregistrer automatiquement une démo
 
 Automatically take game over screenshot
-== Sauvegarder les résultats à la fin de la partie
+== Prendre une capture d'écran des résultats
 
 Blue team
 == Équipe bleue
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Corps
 
+Borderless window
+== Fenêtre sans bordure
+
 Call vote
 == Voter
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Fin de la partie
 
+Game paused
+== Jeu en pause
+
 Game type
 == Type de jeu
 
@@ -241,6 +247,9 @@ Grenade
 Hammer
 == Maillet
 
+Handle rendering async from updates
+== Rendre sans attendre les mises à jour
+
 Has people playing
 == Au moins un joueur
 
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Réinitialiser
 
+Respawn
+== Réapparaître
+
 Rifle
 == Laser
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Montrer les pseudonymes
 
+Show only chat messages from friends
+== Afficher seulement les message des amis
+
 Show only supported
 == Ne montrer que les résolutions supportées
 
@@ -539,10 +554,10 @@ Sound
 == Son
 
 Sound error
-== Erreur de son
+== Erreur audio
 
 Sound volume
-== Volume du son
+== Volume audio
 
 Spectate
 == Regarder
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Il y a une carte non-enregistrée dans l'éditeur, vous voulez peut-être l'enregistrer avant de quitter le jeu.
 
+Threaded rendering
+== Rendu en parallèle
+
+Threaded sound loading
+== Chargement des sons en paralèlle
+
 Time limit
 == Temps limite
 
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/german.txt b/data/languages/german.txt
index 3bca6ca..05d8211 100644
--- a/data/languages/german.txt
+++ b/data/languages/german.txt
@@ -1,3 +1,4 @@
+
 ##### translated strings #####
 
 %d Bytes
@@ -78,6 +79,9 @@ Blue team wins!
 Body
 == Körper
 
+Borderless window
+== Randloses Fenster
+
 Call vote
 == Abstimmen
 
@@ -121,7 +125,7 @@ Country
 == Land
 
 Crc:
-== Prüfsumme:
+== Prüfsumme(CRC32):
 
 Created:
 == Erstellt:
@@ -243,6 +247,9 @@ Grenade
 Hammer
 == Hammer
 
+Handle rendering async from updates
+== spielunabhängige Bilddarstellung
+
 Has people playing
 == Server nicht leer
 
@@ -325,7 +332,7 @@ Move left
 == Nach links
 
 Move player to spectators
-== Spieler zu Zuschauer machen
+== Spieler zum Zuschauer machen
 
 Move right
 == Nach rechts
@@ -355,7 +362,7 @@ Next weapon
 == Nächste Waffe
 
 Nickname
-== Spitzname
+== Spielername
 
 No
 == Nein
@@ -451,7 +458,7 @@ Remote console
 == Remotekonsole
 
 Remove
-== Löschen
+== Entfernen
 
 Remove friend
 == Freund entfernen
@@ -484,7 +491,7 @@ Sat.
 == Sätt.
 
 Score
-== Score
+== Punktestand
 
 Score board
 == Punktetafel
@@ -523,10 +530,10 @@ Show chat
 == Chat anzeigen
 
 Show friends only
-== Nur Freunde zeigen
+== Nur Freunde anzeigen
 
 Show ingame HUD
-== Spielanzeigen
+== Spielanzeigen darstellen
 
 Show name plates
 == Zeige Namen
@@ -601,10 +608,16 @@ The audio device couldn't be initialised.
 == Das Audiosystem konnte nicht gestartet werden.
 
 The server is running a non-standard tuning on a pure game type.
-== Der Server läuft nicht mit Standardeinstellungen.
+== Der Server läuft nicht mit standardmäßigen Tuning-Einstellungen auf einem Vanilla-Spieltypen.
 
 There's an unsaved map in the editor, you might want to save it before you quit the game.
-== Im Editor ist noch eine ungespeicherte Karte. Vielleicht möchtest du sie speichern.
+== Im Editor ist noch eine ungespeicherte Karte. Vielleicht möchtest du sie speichern, bevor du das Spiel beendest.
+
+Threaded rendering
+== Parallele Darstellung des Bildes zum Spiel
+
+Threaded sound loading
+== Paralleles Laden der Audiodateien zum Spiel
 
 Time limit
 == Zeitlimit
@@ -673,7 +686,7 @@ Yes
 == Ja
 
 You must restart the game for all settings to take effect.
-== Du musst das Spiel neustarten um die Änderungen zu übernehmen.
+== Du musst das Spiel neustarten, um die Änderungen zu übernehmen.
 
 Your skin
 == Dein Skin
@@ -683,4 +696,5 @@ no limit
 
 ##### needs translation #####
 
-##### old translations #####
\ No newline at end of file
+##### old translations #####
+
diff --git a/data/languages/hungarian.txt b/data/languages/hungarian.txt
index 97001d1..9746b5e 100644
--- a/data/languages/hungarian.txt
+++ b/data/languages/hungarian.txt
@@ -657,12 +657,18 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Demofile: %s
 == 
 
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Play background music
 == 
 
@@ -684,5 +690,11 @@ Spectate previous
 Strict gametype filter
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/index.txt b/data/languages/index.txt
index 751c6bf..7e8225b 100644
--- a/data/languages/index.txt
+++ b/data/languages/index.txt
@@ -16,6 +16,10 @@ bulgarian
 == Български
 == 100
 
+chuvash
+== Чăвашла
+== 643
+
 czech
 == Česky
 == 203
@@ -72,6 +76,10 @@ russian
 == Русский
 == 643
 
+sakha
+== Саха тыла
+== 643
+
 serbian
 == Srpski
 == 688
diff --git a/data/languages/italian.txt b/data/languages/italian.txt
index 5187985..d0d5ed7 100644
--- a/data/languages/italian.txt
+++ b/data/languages/italian.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Corpo
 
+Borderless window
+== Finestra senza bordi
+
 Call vote
 == Vota
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Partita finita
 
+Game paused
+== Gioco in pausa
+
 Game type
 == Tipo
 
@@ -241,6 +247,9 @@ Grenade
 Hammer
 == Martello
 
+Handle rendering async from updates
+== Rendering asincrono
+
 Has people playing
 == Con giocatori
 
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Reimposta
 
+Respawn
+== Rinasci
+
 Rifle
 == Laser
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Mostra nomi
 
+Show only chat messages from friends
+== Mostra solo messaggi mandati da amici
+
 Show only supported
 == Mostra solo supportati
 
@@ -584,7 +599,7 @@ Team chat
 == Chat di squadra
 
 Teeworlds %s is out! Download it at www.teeworlds.com!
-== È uscito Teeworld %s! Scaricalo su www.teeworlds.com!
+== È uscito Teeworlds %s! Scaricalo su www.teeworlds.com!
 
 Texture Compression
 == Compressione texture
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == C'è una mappa non salvata nell'editor, probabilmente vuoi salvarla prima di uscire.
 
+Threaded rendering
+== Rendering in processo separato
+
+Threaded sound loading
+== Audio in processo separato
+
 Time limit
 == Limite di tempo
 
@@ -614,7 +635,7 @@ Type:
 == Tipo:
 
 UI Color
-== Color interfaccia
+== Colore interfaccia
 
 Unable to delete the demo
 == Impossibile eliminare la demo
@@ -675,17 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
-
-== ## translated strings #####
-
diff --git a/data/languages/kyrgyz.txt b/data/languages/kyrgyz.txt
index c65e376..3702e48 100644
--- a/data/languages/kyrgyz.txt
+++ b/data/languages/kyrgyz.txt
@@ -1,3 +1,4 @@
+
 ##### translated strings #####
 
 %d Bytes
@@ -25,13 +26,13 @@
 == %i секунда калды!
 
 %s wins!
-== %s утту!
+== %s жеңди!
 
 -Page %d-
-== -Барак %d-
+== -%d бет-
 
 Abort
-== Жокко чыгаруу
+== Баш тартуу
 
 Add
 == Кошуу
@@ -49,64 +50,67 @@ Alpha
 == Тунук.
 
 Always show name plates
-== Ат көрнөкчөлөрдү дайыма көрсөтүү
+== Оюнчулардын ысымын дайыма көрсөтүү
 
 Are you sure that you want to delete the demo?
-== Сиз чын эле демонун өчүрүлүшүн каалайсызбы?
+== Сиз демону чын эле өчүргүңүз келеби?
 
 Are you sure that you want to quit?
-== Сиз чын эле оюндан чыгууну каалайсызбы?
+== Сиз оюндан чын эле чыккыңыз келеби?
 
 Are you sure that you want to remove the player from your friends list?
-== Сиз чын эле бул оюнчуну достор тизмеңизден өчүргүңүз келеби?
+== Сиз бул оюнчуну достор тизмесинен чын эле өчүргүңүз келеби?
 
 As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server.
-== Бул оюндун биринчи жүргүзүлүшү болгону үчүн, төмөн жакка такма атыңызды киргизиңиз. Серверге туташуу алдында ырастоолорду текшериңиз.
+== Оюндун биринчи жүргүзүлүшү болгондуктан, лакабыңызды төмөн жакка киргизиңиз. Серверге кошулуудан мурун баптоолоруңузду жөнгө салып алыңыз.
 
 Automatically record demos
-== Демону автоматтуу түрдө жаздыруу
+== Демолорду автоматтуу түрдө жаздыруу
 
 Automatically take game over screenshot
-== Оюн натыйжаларын сүрөткө тартуу
+== Оюндун жыйынтыгын авто. түрдө сүрөткө тартуу
 
 Blue team
-== Көктөр
+== Көк команда
 
 Blue team wins!
-== Көктөр утту!
+== Көк команда жеңди!
 
 Body
 == Дене
 
+Borderless window
+== Чек арасыз терезе
+
 Call vote
-== Добуш берүү
+== Добуш баштоо
 
 Change settings
-== Ырастоолорду өзгөртүү
+== Баптоолорду өзгөртүү
 
 Chat
 == Маек
 
 Clan
-== Кланы
+== Клан
 
 Client
-== Клиент
+== Кардар
 
 Close
-== Чыгуу
+== Жабуу
 
 Compatible version
-== Батышуучу версия
+== Сыйымдуу нуска
 
 Connect
-== Туташуу
+== Кошулуу
 
 Connecting to
-== Туташтырылууда
+== Кошулууда
 
 Connection Problems...
-== Байланыш көйгөйлөрү...
+== Байланыш маселелери...
 
 Console
 == Консоль
@@ -115,7 +119,7 @@ Controls
 == Башкаруу
 
 Count players only
-== Оюнчуларды гана саноо
+== Оюнч. гана эсепке алуу
 
 Country
 == Өлкө
@@ -124,16 +128,16 @@ Crc:
 == Crc:
 
 Created:
-== Жаратылганы:
+== Жаратылган күнү:
 
 Current
-== Кезектегиси
+== Учурдагы
 
 Current version: %s
-== Кезектеги версиясы: %s
+== Учурдагы нуска: %s
 
 Custom colors
-== Өз түстөрүңүз
+== Бапталуучу түстөр
 
 Delete
 == Өчүрүү
@@ -142,34 +146,34 @@ Delete demo
 == Демону өчүрүү
 
 Demo details
-== Демо деталдары
+== Демо тууралуу
 
 Demofile: %s
-== Демофайлы: %s
+== Демо: %s
 
 Demos
 == Демолор
 
 Disconnect
-== Өчүрүү
+== Байл. токтотуу
 
 Disconnected
-== Өчүрүлдү
+== Байланышты токтотулду
 
 Display Modes
 == Көрсөтүү режимдери
 
 Downloading map
-== Карта жүктөөлүүдө
+== Карта жүктөлүүдө
 
 Draw!
-== Тең!
+== Тең чыгуу!
 
 Dynamic Camera
 == Динамикалык камера
 
 Emoticon
-== Эмоциялар
+== Быйтыкча
 
 Enter
 == Кирүү
@@ -178,13 +182,13 @@ Error
 == Ката
 
 Error loading demo
-== Демону жүктөө учурундагы ката
+== Демону жүктөөдө ката кетти
 
 FSAA samples
 == FSAA сэмплдери
 
 Favorite
-== Тандалма
+== Тандалмага кошуу
 
 Favorites
 == Тандалмалар
@@ -196,16 +200,16 @@ Filter
 == Фильтр
 
 Fire
-== Атуу
+== Ок атуу
 
 Folder
-== Папка
+== Мукаба
 
 Force vote
-== Тездетүү
+== Добушту мажбурлоо
 
 Free-View
-== Эркин сереп
+== Эркин кароо
 
 Friends
 == Достор
@@ -217,16 +221,19 @@ Game
 == Оюн
 
 Game info
-== Оюн жөнүндө
+== Оюн тууралуу
 
 Game over
 == Оюн бүттү
 
+Game paused
+== Оюн паузага коюлду
+
 Game type
 == Оюн түрү
 
 Game types:
-== Оюн түрү:
+== Оюн түрлөрү:
 
 General
 == Негизги
@@ -240,11 +247,14 @@ Grenade
 Hammer
 == Барскан
 
+Handle rendering async from updates
+== Handle rendering async from updates
+
 Has people playing
-== Бош эмес сервер
+== Оюнчулары бар сервер
 
 High Detail
-== Жогорку деталдаштыруу
+== Жогору деталдаштыруу
 
 Hook
 == Илмек
@@ -262,22 +272,22 @@ Internet
 == Интернет
 
 Invalid Demo
-== Жарабаган демо
+== Туура эмес демо
 
 Join blue
-== Көктөргө
+== Көккө кирүү
 
 Join game
-== Ойноо
+== Оюнга кирүү
 
 Join red
-== Кызылдарга
+== Кызылга кир.
 
 Jump
 == Секирүү
 
 Kick player
-== Оюнчуну чыгаруу
+== Оюнчуну серверден кетирүү
 
 LAN
 == LAN
@@ -286,10 +296,10 @@ Language
 == Тил
 
 Length:
-== Узундугу:
+== Узактыгы:
 
 Lht.
-== Ач. түс.
+== Ачык.
 
 Loading
 == Жүктөлүүдө
@@ -298,61 +308,61 @@ MOTD
 == Күндүн билдирүүсү
 
 Map
-== Картасы
+== Карта
 
 Map:
-== Картасы:
+== Карта:
 
 Max Screenshots
-== Сүрөттөрдүн жогорку чеги
+== Сүрөттөрдүн жогорку саны
 
 Max demos
-== Демолордун жогорку чеги
+== Демолордун жогорку саны
 
 Maximum ping:
-== Пингдин ж. чеги:
+== Эң жогорку пинг:
 
 Miscellaneous
 == Кошумча
 
 Mouse sens.
-== Чычкан сезгич.
+== Чычкандын сез.
 
 Move left
 == Солго басуу
 
 Move player to spectators
-== Оюнчуну байкоочуларга ташуу
+== Оюнчуну көрүүчүгө которуу
 
 Move right
 == Оңго басуу
 
 Movement
-== Аракет
+== Кыймыл
 
 Mute when not active
-== Активдүү эмес кезде үндү өчүрүү
+== Активдүү эмес учурунда үндү өчүрүү
 
 Name
-== Аты
+== Ысым
 
 Name plates size
-== Ат көрнөкчөлөрдүн өлчөмү
+== Ысымдын өлчөмү
 
 Netversion:
-== Версиясы:
+== Нускасы:
 
 New name:
-== Жаңы аты:
+== Жаңы ысым:
 
 News
 == Жаңылыктар
 
 Next weapon
-== Кийин. курал
+== Кийинки курал
 
 Nickname
-== Такма атыңыз
+== Лакап
 
 No
 == Жок
@@ -361,55 +371,55 @@ No password
 == Сырсөзсүз
 
 No servers found
-== Серверлер табылган жок
+== Серверлер табылбады
 
 No servers match your filter criteria
-== Сиздин фильтриңизге жарай турган серверлер жок
+== Сиздин фильтриңизге шайкеш келген серверлер жок
 
 Ok
-== ОК
+== Жарайт
 
 Open
 == Ачуу
 
 Parent Folder
-== Ата-энелик каталог
+== Ата-энелик мукаба
 
 Password
-== Сырсөзү
+== Сырсөз
 
 Password incorrect
 == Сырсөз
 
 Ping
-== Пинги
+== Пинг
 
 Pistol
 == Тапанча
 
 Play
-== Көрүү
+== Ойнотуу
 
 Play background music
-== Фон музыкасын ойнотуу
+== Фондогу музыканы ойнотуу
 
 Player
 == Оюнчу
 
 Player country:
-== Өлкөсү:
+== Өлкө:
 
 Player options
-== Оюнчу опциялары
+== Оюнчунун параметрлери
 
 Players
 == Оюнчулар
 
 Please balance teams!
-== Команадаларды баланстаңыз!
+== Командаларды теңдеңиздер!
 
 Prev. weapon
-== Мурун. курал
+== Мурунку курал
 
 Quality Textures
 == Сапаттуу текстуралар
@@ -421,10 +431,10 @@ Quit
 == Чыгуу
 
 Quit anyway?
-== Чыгуу?
+== Баары бир чыгасызбы?
 
 REC %3d:%02d
-== ЖАЗДЫРУУ %3d:%02d
+== REC %3d:%02d
 
 Reason:
 == Себеби:
@@ -433,19 +443,19 @@ Record demo
 == Демо жаздыруу
 
 Red team
-== Кызылдар
+== Кызыл команда
 
 Red team wins!
-== Кызылдар утту!
+== Кызыл команда жеңди!
 
 Refresh
 == Жаңылоо
 
 Refreshing master servers
-== Мастер-серверлер тизмесин жаңылоо
+== Башкы-серверлер жаңыланууда
 
 Remote console
-== Алыскы консоль
+== Узакташкан консоль
 
 Remove
 == Өчүрүү
@@ -454,31 +464,34 @@ Remove friend
 == Досту өчүрүү
 
 Rename
-== Атын өзгөртүү
+== Жаңыча атоо
 
 Rename demo
-== Демо атын өзгөртүү
+== Демону жаңыча атоо
 
 Reset filter
-== Фильтрлерди түшүрүү
+== Фильтрди калыбына к.
 
 Reset to defaults
-== Жарыяланбаска түшүрүү
+== Адепки калыбына келтирүү
+
+Respawn
+== Кайрадан жаралуу
 
 Rifle
-== Бластер
+== Лазер
 
 Round
-== Раунду
+== Раунд
 
 Sample rate
-== Жыштыгы
+== Жыштык
 
 Sat.
-== Канык.
+== Каныккан.
 
 Score
-== Упайы
+== Упайлар
 
 Score board
 == Табло
@@ -490,13 +503,13 @@ Scoreboard
 == Табло
 
 Screenshot
-== Сүрөт
+== Скриншот
 
 Server address:
-== Сервер дареги:
+== Сервердин дареги:
 
 Server details
-== Сервер деталдары
+== Сервер тууралуу
 
 Server filter
 == Сервер фильтри
@@ -505,10 +518,10 @@ Server info
 == Маалымат
 
 Server not full
-== Сервер толук эмес
+== Бош оруну бар сервер
 
 Settings
-== Ырастоолор
+== Баптоолор
 
 Shotgun
 == Мылтык
@@ -517,16 +530,19 @@ Show chat
 == Маекти көрсөтүү
 
 Show friends only
-== Достор менен гана
+== Досторду гана көрсөтүү
 
 Show ingame HUD
 == Оюн ичиндеги HUD'ни көрсөтүү
 
 Show name plates
-== Оюнчулардын аттарын көрсөтүү
+== Оюнчулардын ысымын көрсөтүү
+
+Show only chat messages from friends
+== Достордун гана маек билдирүүлөрүн көрсөтүү
 
 Show only supported
-== Колдолгонду гана көрсөтүү
+== Колдогонун гана көрсөтүү
 
 Size:
 == Өлчөмү:
@@ -541,22 +557,22 @@ Sound error
 == Үн катасы
 
 Sound volume
-== Үн көлөмү
+== Үн бийиктиги
 
 Spectate
-== Байкоо
+== Көрүүчү реж.
 
 Spectate next
-== Кийин. байкоо
+== Кийинкини көрүү
 
 Spectate previous
-== Мурун. байкоо
+== Мурункуну көрүү
 
 Spectator mode
-== Байкоочу
+== Көрүүчү режими
 
 Spectators
-== Байкоочулар
+== Көрүүчүлөр
 
 Standard gametype
 == Стандарттуу оюн түрү
@@ -568,10 +584,10 @@ Stop record
 == Токтотуу
 
 Strict gametype filter
-== Оюн түрүнүн так фильтри
+== Оюн түрүн текши издөө
 
 Sudden Death
-== Тез өлүм
+== Күтүүсүз өлүм
 
 Switch weapon on pickup
 == Көтөрүлгөн куралга которуу
@@ -580,22 +596,28 @@ Team
 == Команда
 
 Team chat
-== Команда маеги
+== Команданын маеги
 
 Teeworlds %s is out! Download it at www.teeworlds.com!
-== Teeworlds %s чыкты! www.teeworlds.com сайтынан жүктөп алыңыз!
+== Teeworlds %s чыкты! www.teeworlds.com дон жүктөп алыңыздар!
 
 Texture Compression
-== Текстура кысылышы
+== Текстуралык кысуу
 
 The audio device couldn't be initialised.
-== Аудио түзмөгүн инициализациялап алууга мүмкүн эмес.
+== Аудио түзмөгүн иштетүү мүмкүн эмес.
 
 The server is running a non-standard tuning on a pure game type.
-== Бул сервер стандартту эмес ырастоолор менен таза оюн түрүндө иштеп жатат.
+== Бул сервер стандартту эмес баптоолору менен стандарттуу оюн түрүндө жүргүзүлгөн
 
 There's an unsaved map in the editor, you might want to save it before you quit the game.
-== Редактордо сакталбаган карта бар, аны оюндан чыгаар алдында сактасаңыз болот.
+== Редактордо сакталбаган карта калды, оюндар чыгуудан мурун сактай аласыз.
+
+Threaded rendering
+== Агымдуу визуалдаштыруу
+
+Threaded sound loading
+== Агымдуу үн жүктөө
 
 Time limit
 == Убакыт чеги
@@ -604,7 +626,7 @@ Time limit: %d min
 == Убакыт чеги: %d мин.
 
 Try again
-== ОК
+== Кайталоо
 
 Type
 == Түрү
@@ -616,31 +638,31 @@ UI Color
 == Интерфейс түсү
 
 Unable to delete the demo
-== Демону өчүрүү мүмкүн эмес
+== Демону өчүрүүгө мүмкүн эмес
 
 Unable to rename the demo
-== Демо атын өзгөртүү мүмкүн эмес
+== Демону жаңыча атоого мүмкүн эмес
 
 Use sounds
 == Үндөрдү колдонуу
 
 Use team colors for name plates
-== Аттар үчүн команданын түсүн колдонуу
+== Ысымдарга команданын түсүн колдонуу
 
 V-Sync
-== Тик синхрондоштуруусу
+== Вертикалдык синхрондоштуруу
 
 Version
-== Версиясы
+== Нускасы
 
 Version:
-== Версиясы:
+== Нускасы:
 
 Vote command:
-== Добуш коммандасы:
+== Добуш командасы:
 
 Vote description:
-== Добуш баяндамасы:
+== Добуштун сүрөттөөсү:
 
 Vote no
 == Каршы
@@ -652,7 +674,7 @@ Voting
 == Добуш берүү
 
 Warmup
-== Даярдануу
+== Камданыңыздар
 
 Weapon
 == Курал
@@ -664,7 +686,7 @@ Yes
 == Ооба
 
 You must restart the game for all settings to take effect.
-== Өзгөртүүлөрдү колдонуу үчүн оюнду кайта жүргүзүңүз.
+== Өзгөртүүлөр күчүнө кирүү үчүн, оюнду кайтадан иштетиш керек.
 
 Your skin
 == Териңиз
@@ -672,15 +694,7 @@ Your skin
 no limit
 == чексиз
 
-Game paused
-== Оюн бир азга токтотулду
-
-Respawn
-== Кайра жаралуу
-
-Show only chat messages from friends
-== Достордун гана маек билдирүүлөрүн көрсөтүү
-
 ##### needs translation #####
 
 ##### old translations #####
+
diff --git a/data/languages/norwegian.txt b/data/languages/norwegian.txt
index 3f28481..c4456cf 100644
--- a/data/languages/norwegian.txt
+++ b/data/languages/norwegian.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Kropp
 
+Borderless window
+== Vindu uten kanter
+
 Call vote
 == Stem
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Spill avsluttet
 
+Game paused
+== Pause spill
+
 Game type
 == Spilltype
 
@@ -241,11 +247,14 @@ Grenade
 Hammer
 == Hammer
 
+Handle rendering async from updates
+== Håndtere rendring async fra oppdateringer
+
 Has people playing
-== Har folk som spiller
+== Har spillere
 
 High Detail
-== Ekstra detaljer
+== Høye detaljer
 
 Hook
 == Gripe tang
@@ -266,13 +275,13 @@ Invalid Demo
 == Ugyldig Demo
 
 Join blue
-== Bli med blå
+== Join blå
 
 Join game
-== Bli med i spillet
+== Join spillet
 
 Join red
-== Bli med rød
+== Join rød
 
 Jump
 == Hopp
@@ -431,7 +440,7 @@ Reason:
 == Grunn:
 
 Record demo
-== Ta opp demo
+== Record demo
 
 Red team
 == Rødt lag
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Tilbakestill standardinstillinger
 
+Respawn
+== Respawn
+
 Rifle
 == Laser
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Vis navnskilt
 
+Show only chat messages from friends
+== Vis bare chat meldinger fra venner
+
 Show only supported
 == Vis kompatible
 
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Det er en ulagret bane i baneredigereren, du vil kanskje lagre den før du avslutter.
 
+Threaded rendering
+== Threaded rendering
+
+Threaded sound loading
+== Threaded sound loading
+
 Time limit
 == Tidsbegrensning
 
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/polish.txt b/data/languages/polish.txt
index 67d63d7..603d7a8 100644
--- a/data/languages/polish.txt
+++ b/data/languages/polish.txt
@@ -675,15 +675,27 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
 utracić swojej pracy!
diff --git a/data/languages/portuguese.txt b/data/languages/portuguese.txt
index e99e063..a6cda14 100644
--- a/data/languages/portuguese.txt
+++ b/data/languages/portuguese.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/romanian.txt b/data/languages/romanian.txt
index 7332839..8f06348 100644
--- a/data/languages/romanian.txt
+++ b/data/languages/romanian.txt
@@ -26,7 +26,7 @@
 == %i secunde rămase
 
 %s wins!
-== %s câștigă!
+== %s a câștigat!
 
 -Page %d-
 == -Pagina %d-
@@ -50,10 +50,10 @@ Alpha
 == Alfa
 
 Always show name plates
-== Afișează întotdeauna pseudonimele
+== Afișează întotdeauna etichetele
 
 Are you sure that you want to delete the demo?
-== Sigur vrei să ștergi demo-ul?
+== Sigur vrei să ștergi demonstrația?
 
 Are you sure that you want to quit?
 == Sigur vrei să ieși?
@@ -65,7 +65,7 @@ As this is the first time you launch the game, please enter your nick name below
 == Aceasta fiind prima lansare a jocului, te rog introdu-ți pseudonimul mai jos. E recomandat să verifici setările și să le ajustezi cum vrei înainte să intri pe un server.
 
 Automatically record demos
-== Înregistrează automat demo-uri
+== Înregistrează automat demonstrații
 
 Automatically take game over screenshot
 == Fă automat o captură de ecran la final
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Corp
 
+Borderless window
+== Fereastră fără margini
+
 Call vote
 == Votează
 
@@ -89,10 +92,10 @@ Chat
 == Chat
 
 Clan
-== Clanul
+== Clan
 
 Client
-== Clientul
+== Client
 
 Close
 == Închide
@@ -179,7 +182,7 @@ Error
 == Eroare
 
 Error loading demo
-== Eroare la încărcarea demo-ului
+== Eroare la încărcarea demonstrației
 
 FSAA samples
 == Eșantioane FSAA
@@ -212,7 +215,7 @@ Friends
 == Prieteni
 
 Fullscreen
-== Ecrat complet
+== Afișare pe tot ecranul
 
 Game
 == Joc
@@ -223,6 +226,9 @@ Game info
 Game over
 == Final de joc
 
+Game paused
+== Joc în pauză
+
 Game type
 == Tip de joc
 
@@ -236,11 +242,14 @@ Graphics
 == Grafică
 
 Grenade
-== Grenade
+== Grenadă
 
 Hammer
 == Ciocan
 
+Handle rendering async from updates
+== Randează asincron față de actualizări
+
 Has people playing
 == Are jucători activi
 
@@ -254,7 +263,7 @@ Host address
 == Adresa gazdei
 
 Hue
-== Tentă
+== Nuanță
 
 Info
 == Informații
@@ -308,7 +317,7 @@ Max Screenshots
 == Număr maxim de capturi de ecran
 
 Max demos
-== Număr maxim de demo-uri
+== Număr maxim de demonstrații
 
 Maximum ping:
 == Ping maxim:
@@ -317,16 +326,16 @@ Miscellaneous
 == Diverse
 
 Mouse sens.
-== Sensib. maus
+== Viteză maus
 
 Move left
-== Mută la stânga
+== Stânga
 
 Move player to spectators
 == Mută jucătorul la spectatori
 
 Move right
-== Mută la dreapta
+== Dreapta
 
 Movement
 == Mișcare
@@ -338,7 +347,7 @@ Name
 == Nume
 
 Name plates size
-== Dimensiune nume placă
+== Dimensiunea etichetei
 
 Netversion:
 == Cod rețea:
@@ -362,10 +371,10 @@ No password
 == Fără parolă
 
 No servers found
-== Nici un server găsit
+== Niciun server găsit
 
 No servers match your filter criteria
-== Nici un server nu corespunde criteriilor
+== Niciun server nu corespunde criteriilor
 
 Ok
 == Bine
@@ -458,7 +467,7 @@ Rename
 == Redenumește
 
 Rename demo
-== Redenumește demo-ul
+== Redenumește demonstrația
 
 Reset filter
 == Filtru implicit
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Setări implicite
 
+Respawn
+== Renaște
+
 Rifle
 == Carabină
 
@@ -524,7 +536,10 @@ Show ingame HUD
 == Arată scorul în joc
 
 Show name plates
-== Arată pseudonimele
+== Arată etichetele cu pseudonime
+
+Show only chat messages from friends
+== Arată doar mesajele prietenilor
 
 Show only supported
 == Arată doar modurile suportate
@@ -593,11 +608,17 @@ The audio device couldn't be initialised.
 == Dispozitivul audio nu a putut fi inițializat.
 
 The server is running a non-standard tuning on a pure game type.
-== Serverul folosește parametri ne-standard într-un joc standard.
+== Serverul nu folosește parametri standard într-un joc standard.
 
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Există o hartă nesalvată în editor. Probabil vrei să o salvezi înainte să ieși din joc.
 
+Threaded rendering
+== Randare grafică în paralel
+
+Threaded sound loading
+== Încărcare sunete în paralel
+
 Time limit
 == Timp limită
 
@@ -617,16 +638,16 @@ UI Color
 == Culoare meniu
 
 Unable to delete the demo
-== Nu pot șterge demo-ul
+== Nu pot șterge demonstrația
 
 Unable to rename the demo
-== Nu pot redenumi demo-ul
+== Nu pot redenumi demonstrația
 
 Use sounds
-== Folosește sunetul
+== Folosește sunete
 
 Use team colors for name plates
-== Folosește culorile echipelor pe etichetele de nume
+== Folosește culorile echipelor pe etichete
 
 V-Sync
 == Sincronizare verticală (V-Sync)
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/russian.txt b/data/languages/russian.txt
index 067a205..1c48cd4 100644
--- a/data/languages/russian.txt
+++ b/data/languages/russian.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Тело
 
+Borderless window
+== Окно без рамки
+
 Call vote
 == Голосовать
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Игра окончена
 
+Game paused
+== Игра остановлена
+
 Game type
 == Тип игры
 
@@ -241,6 +247,9 @@ Grenade
 Hammer
 == Молот
 
+Handle rendering async from updates
+== Обрабатывать прорисовку асинхронно из обновлений
+
 Has people playing
 == Не пустой сервер
 
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Сбросить настройки
 
+Respawn
+== Возрождение
+
 Rifle
 == Бластер
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Показывать имена игроков
 
+Show only chat messages from friends
+== Показывать сообщения только от друзей
+
 Show only supported
 == Показывать только поддерживаемые разрешения экрана
 
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Есть несохранённая карта в редакторе, Вы можете сохранить её перед тем, как выйти.
 
+Threaded rendering
+== Потоковая прорисовка
+
+Threaded sound loading
+== Потоковая загрузка звука
+
 Time limit
 == Лимит времени
 
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/sakha.txt b/data/languages/sakha.txt
new file mode 100644
index 0000000..94089e8
--- /dev/null
+++ b/data/languages/sakha.txt
@@ -0,0 +1,700 @@
+
+##### translated strings #####
+
+%d Bytes
+== %d байт
+
+%d of %d servers, %d players
+== %d-тан %d сервер, %d оонньооччу
+
+%d%% loaded
+== %d%% хачайданна
+
+%ds left
+== %d сөк. хаалла
+
+%i minute left
+== %i мүнүүтэ хаалла!
+
+%i minutes left
+== %i мүнүүтэ хаалла!
+
+%i second left
+== %i сөкүүндэ хаалла!
+
+%i seconds left
+== %i сөкүүндэ хаалла!
+
+%s wins!
+== %s кыайда!
+
+-Page %d-
+== -%d страница-
+
+Abort
+== Уурат
+
+Add
+== Эп
+
+Add Friend
+== Доҕоргун эп
+
+Address
+== Аадырыс
+
+All
+== Барыта
+
+Alpha
+== Дьэҥкирэ
+
+Always show name plates
+== Оонньооччулар ааттарын наар көрдөрөр
+
+Are you sure that you want to delete the demo?
+== Демоны сотторорго сөбүлэһэҕит дуо?
+
+Are you sure that you want to quit?
+== Кырдьык тахсыаххытын баҕараҕыт дуо?
+
+Are you sure that you want to remove the player from your friends list?
+== Оонньооччуну доҕордоргут испииһигиттэн кырдьык соттороҕут дуо?
+
+As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server.
+== Бастакы оонньуургут быһыытынан, ааккытын баһаалыста манна суруйуҥ. Оонньуоххут иннинэ онньуу туруорууларын көрөр сүбэлэнэр.
+
+Automatically record demos
+== Демоны автоматическайдык уһул
+
+Automatically take game over screenshot
+== Оонньуу бүтүүтү скриншоттаа
+
+Blue team
+== Күөхтэр
+
+Blue team wins!
+== Күөхтэр кыайдылар!
+
+Body
+== Эттик
+
+Borderless window
+== Араамката суох түннүк
+
+Call vote
+== Куоластаа
+
+Change settings
+== Туруорууларын уларыт
+
+Chat
+== Чат
+
+Clan
+== Клан
+
+Client
+== Клиент
+
+Close
+== Таҕыс
+
+Compatible version
+== Түбэсиһэр версия
+
+Connect
+== Холбон
+
+Connecting to
+== Холбонобут
+
+Connection Problems...
+== Сибээс быһылынна...
+
+Console
+== Консоль
+
+Controls
+== Салайыы
+
+Count players only
+== Ооннь. эрэ аах
+
+Country
+== Дойдугут былааҕа
+
+Crc:
+== Crc:
+
+Created:
+== Оҥоһулунна:
+
+Current
+== Билиҥҥи
+
+Current version: %s
+== Билиҥҥи версия: %s
+
+Custom colors
+== Бэйэҥ өҥнөрүн
+
+Delete
+== Соттор
+
+Delete demo
+== Демоны соттор
+
+Demo details
+== Детали демо
+
+Demofile: %s
+== Демо: %s
+
+Demos
+== Демо
+
+Disconnect
+== Сибээһи быс
+
+Disconnected
+== Сибээс быһылынна
+
+Display Modes
+== Экран разрешенията
+
+Downloading map
+== Хачайданар карта
+
+Draw!
+== Ким да кыайбата!
+
+Dynamic Camera
+== Хамсыыр камера
+
+Emoticon
+== Эмоциялар
+
+Enter
+== Киир
+
+Error
+== Сыыһа
+
+Error loading demo
+== Демо сатаан аһыллыбата
+
+FSAA samples
+== FSAA сэмпллара
+
+Favorite
+== Сөбүлүүр
+
+Favorites
+== Сөбүлүүр
+
+Feet
+== Атахтар
+
+Filter
+== Фильтр
+
+Fire
+== Ытыы
+
+Folder
+== Папка
+
+Force vote
+== Куоластат
+
+Free-View
+== Көҥүл көрөр
+
+Friends
+== Доҕордор
+
+Fullscreen
+== Полноэкраннай режим
+
+Game
+== Оонньуу
+
+Game info
+== Оонньуу туһунан
+
+Game over
+== Оонньуу бүттэ
+
+Game paused
+== Оонньуу тохтоото
+
+Game type
+== Ооньуу көрүҥэ
+
+Game types:
+== Оонньуу көрүҥэ:
+
+General
+== Бастыҥ
+
+Graphics
+== Графика
+
+Grenade
+== Гранатомёт
+
+Hammer
+== Өтүйэ
+
+Handle rendering async from updates
+== Рендериҥы саҥардааһынтан туспа оҥор
+
+Has people playing
+== Оонньооччулардаах
+
+High Detail
+== Үрдук хаачыстыбалаах
+
+Hook
+== Тордуох
+
+Host address
+== Сервер аадырыһа
+
+Hue
+== Өҥүн быһыыта
+
+Info
+== Информация
+
+Internet
+== Интернет
+
+Invalid Demo
+== Сатаммат демо
+
+Join blue
+== Күөхтэргэ
+
+Join game
+== Киир
+
+Join red
+== Кыһылларга
+
+Jump
+== Ыстан
+
+Kick player
+== Кикайдаа
+
+LAN
+== LAN
+
+Language
+== Тыл
+
+Length:
+== Устата
+
+Lht.
+== Сырдыга
+
+Loading
+== Бэлэмнээһин
+
+MOTD
+== MOTD
+
+Map
+== Карта
+
+Map:
+== Карта:
+
+Max Screenshots
+== Скриншот макс. ахсаана
+
+Max demos
+== Демо макс. ахсаана
+
+Maximum ping:
+== Пинг макс.:
+
+Miscellaneous
+== Өссө
+
+Mouse sens.
+== Мышка билимтиэтэ
+
+Move left
+== Хаҥас хаам
+
+Move player to spectators
+== Көрөөччү гын
+
+Move right
+== Уҥа хаам
+
+Movement
+== Хаамар
+
+Mute when not active
+== Тыаһын бүөлээ паузаҕа
+
+Name
+== Аат
+
+Name plates size
+== Размера
+
+Netversion:
+== Версия:
+
+New name:
+== Саҥа аат
+
+News
+== Сонун
+
+Next weapon
+== Аныг. саа
+
+Nickname
+== Аат
+
+No
+== Суох
+
+No password
+== Пөрүөлэ суох
+
+No servers found
+== Сервер көстубэтэ
+
+No servers match your filter criteria
+== Фильтрдаммыт сервер көстубэтэ
+
+Ok
+== ОК
+
+Open
+== Ас
+
+Parent Folder
+== Төрүт директория
+
+Password
+== Пөрүөл
+
+Password incorrect
+== Сыыһа пөрүөл
+
+Ping
+== Пинг
+
+Pistol
+== Бэстэлиэт
+
+Play
+== Көр
+
+Play background music
+== Тас музыканы иһит
+
+Player
+== Оонньооччу
+
+Player country:
+== Дойдута:
+
+Player options
+== Оонньооччулар опциялара
+
+Players
+== Ооннь.
+
+Please balance teams!
+== Командалары баланстааҥ!
+
+Prev. weapon
+== Инники саа
+
+Quality Textures
+== Үчүгэй текстуралар
+
+Quick search:
+== Түргэнник көрдөө:
+
+Quit
+== Таҕыс
+
+Quit anyway?
+== Син биир тахсаҕыт?
+
+REC %3d:%02d
+== REC %3d:%02d
+
+Reason:
+== Сылтах:
+
+Record demo
+== Демоны уһул
+
+Red team
+== Кыһыллар
+
+Red team wins!
+== Кыһыллар кыайдылар!
+
+Refresh
+== Саҥардат
+
+Refreshing master servers
+== Мастер-сервер испииһэгин саҥардабыт
+
+Remote console
+== Сервер консола
+
+Remove
+== Соттор
+
+Remove friend
+== Доҕоргун соттор
+
+Rename
+== Аатынык ааттаа
+
+Rename demo
+== Демоны атыннык ааттаа
+
+Reset filter
+== Фильтры сбростаа
+
+Reset to defaults
+== Туруоруулары сбростаа
+
+Respawn
+== Хаттан төрүүр
+
+Rifle
+== Бластер
+
+Round
+== Раунд
+
+Sample rate
+== Тыас частотата
+
+Sat.
+== Контраһа
+
+Score
+== Очко
+
+Score board
+== Табло
+
+Score limit
+== Очко лимита
+
+Scoreboard
+== Табло
+
+Screenshot
+== Скриншот
+
+Server address:
+== Сервер аадырыһа
+
+Server details
+== Сервер опциялара
+
+Server filter
+== Сервер фильтра
+
+Server info
+== Информация
+
+Server not full
+== Толорута суох сервер
+
+Settings
+== Туруоруулар
+
+Shotgun
+== Саа
+
+Show chat
+== Чаты көрдөр
+
+Show friends only
+== Доҕордоргун эрэ көрдөр
+
+Show ingame HUD
+== Оонньуу интерфейһын көрдөр
+
+Show name plates
+== Оонньооччулар ааттарын көрдөр
+
+Show only chat messages from friends
+== Доҕордоргут эрэ суруктарын көрдөр
+
+Show only supported
+== Барсар эрэ разрешенияны көрдөр
+
+Size:
+== Кээмэй:
+
+Skins
+== Тириилэр
+
+Sound
+== Тыас
+
+Sound error
+== Тыастар сыыһалара
+
+Sound volume
+== Тыас улахана
+
+Spectate
+== Көр
+
+Spectate next
+== Аныг. көр
+
+Spectate previous
+== Инникини кор
+
+Spectator mode
+== Көрөөччү буол
+
+Spectators
+== Көрөөччүлэр
+
+Standard gametype
+== Стандартнай ооннь. көрүҥэ
+
+Standard map
+== Стандартнай карта
+
+Stop record
+== Устан бүт
+
+Strict gametype filter
+== Ооннь. көр. строго фильтрдаа
+
+Sudden Death
+== Түргэн өлүү
+
+Switch weapon on pickup
+== Сааны булан ылар буол
+
+Team
+== Команда
+
+Team chat
+== Команда чата
+
+Teeworlds %s is out! Download it at www.teeworlds.com!
+== Teeworlds %s таҕыста! www.teeworlds.com хачайдааҥ!
+
+Texture Compression
+== Текстураны кыччат
+
+The audio device couldn't be initialised.
+== Тыас сэбэ сатаан бэлэмнэммэтэ
+
+The server is running a non-standard tuning on a pure game type.
+== Сервер станд. онньуу көрүҥҥэ атын опциялары кытта үлэлиир.
+
+There's an unsaved map in the editor, you might want to save it before you quit the game.
+== Редакторга суруллабатах карта баар, оонньууттан тахсыа иликкитинэ суруйуҥ.
+
+Threaded rendering
+== Потоковай рендеринг
+
+Threaded sound loading
+== Потоковая тыас бэлэмниитэ
+
+Time limit
+== Оонньуу бириэмэтэ
+
+Time limit: %d min
+== Оонньуу бириэмэтэ: %d
+
+Try again
+== ОК
+
+Type
+== Көрүҥ
+
+Type:
+== Көрүҥ:
+
+UI Color
+== Интерфейс өҥө
+
+Unable to delete the demo
+== Демо сатаан сотуллабата
+
+Unable to rename the demo
+== Демо аатын сатаан уларыйбата
+
+Use sounds
+== Тыаһы холбоо
+
+Use team colors for name plates
+== Оонньоочу аатыгар команда өҥүнэн гын
+
+V-Sync
+== Вертикальнай синхронизация
+
+Version
+== Версия
+
+Version:
+== Версия:
+
+Vote command:
+== Куоластыыр команда:
+
+Vote description:
+== Куолас сылтаҕа:
+
+Vote no
+== Сөбүлэспэт
+
+Vote yes
+== Сөп диир
+
+Voting
+== Куоластыыр
+
+Warmup
+== Разминка
+
+Weapon
+== Саа
+
+Welcome to Teeworlds
+== Teeworlds оонньуу, баһаалыста!
+
+Yes
+== Сөп
+
+You must restart the game for all settings to take effect.
+== Саһа туруоруулары холбоору оонньууну хаттаан холбоон.
+
+Your skin
+== Эһиги тириигит
+
+no limit
+== лимита суох
+
+##### needs translation #####
+
+##### old translations #####
+
diff --git a/data/languages/serbian.txt b/data/languages/serbian.txt
index 0abc703..bbc764d 100644
--- a/data/languages/serbian.txt
+++ b/data/languages/serbian.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/slovak.txt b/data/languages/slovak.txt
index e22d5d2..3fa648e 100644
--- a/data/languages/slovak.txt
+++ b/data/languages/slovak.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/spanish.txt b/data/languages/spanish.txt
index de2ca3a..1c28bae 100644
--- a/data/languages/spanish.txt
+++ b/data/languages/spanish.txt
@@ -79,6 +79,9 @@ Blue team wins!
 Body
 == Cuerpo
 
+Borderless window
+== Ventana sin bordes
+
 Call vote
 == Votar
 
@@ -223,6 +226,9 @@ Game info
 Game over
 == Fin de la partida
 
+Game paused
+== Juego pausado
+
 Game type
 == Modo
 
@@ -241,6 +247,9 @@ Grenade
 Hammer
 == Martillo
 
+Handle rendering async from updates
+== Manejo de renderizado asincrono de actualizaciones
+
 Has people playing
 == Hay gente jugando
 
@@ -466,6 +475,9 @@ Reset filter
 Reset to defaults
 == Resetar por defecto
 
+Respawn
+== Reaparecer
+
 Rifle
 == Láser
 
@@ -526,6 +538,9 @@ Show ingame HUD
 Show name plates
 == Mostrar apodos
 
+Show only chat messages from friends
+== Solo mostrar mensajes de chat de amigos
+
 Show only supported
 == Mostrar únicamente modos soportados
 
@@ -598,6 +613,12 @@ The server is running a non-standard tuning on a pure game type.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == Tienes un mapa sin guardar en el editor, quizá quieras guardarlo antes de salir.
 
+Threaded rendering
+== Renderizado multi-hilo
+
+Threaded sound loading
+== Carga de audio en paralelo
+
 Time limit
 == Tiempo límite
 
@@ -675,14 +696,5 @@ no limit
 
 ##### needs translation #####
 
-Game paused
-== 
-
-Respawn
-== 
-
-Show only chat messages from friends
-== 
-
 ##### old translations #####
 
diff --git a/data/languages/swedish.txt b/data/languages/swedish.txt
index 23e42d9..4c38e40 100644
--- a/data/languages/swedish.txt
+++ b/data/languages/swedish.txt
@@ -675,14 +675,26 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Respawn
 == 
 
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
diff --git a/data/languages/turkish.txt b/data/languages/turkish.txt
index 2273c23..7985f7e 100644
--- a/data/languages/turkish.txt
+++ b/data/languages/turkish.txt
@@ -672,9 +672,15 @@ no limit
 
 ##### needs translation #####
 
+Borderless window
+== 
+
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Player country:
 == 
 
@@ -684,6 +690,12 @@ Respawn
 Show only chat messages from friends
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 ##### old translations #####
 
 
diff --git a/data/languages/ukrainian.txt b/data/languages/ukrainian.txt
index aaf4a4c..bec7a97 100644
--- a/data/languages/ukrainian.txt
+++ b/data/languages/ukrainian.txt
@@ -522,6 +522,9 @@ Automatically record demos
 Automatically take game over screenshot
 == 
 
+Borderless window
+== 
+
 Change settings
 == 
 
@@ -561,6 +564,9 @@ Friends
 Game paused
 == 
 
+Handle rendering async from updates
+== 
+
 Kick player
 == 
 
@@ -660,6 +666,12 @@ The audio device couldn't be initialised.
 There's an unsaved map in the editor, you might want to save it before you quit the game.
 == 
 
+Threaded rendering
+== 
+
+Threaded sound loading
+== 
+
 Type:
 == 
 
diff --git a/datasrc/datatypes.py b/datasrc/datatypes.py
index 5441e37..f4ab825 100644
--- a/datasrc/datatypes.py
+++ b/datasrc/datatypes.py
@@ -147,7 +147,7 @@ class Float(BaseType):
 	def Set(self, value):
 		self.value = value
 	def EmitDefinition(self, name):
-		return ["%f"%self.value]
+		return ["%ff"%self.value]
 		#return ["%d /* %s */"%(self.value, self._target_name)]
 
 class String(BaseType):
diff --git a/license.txt b/license.txt
index 24b0564..7fbc50b 100644
--- a/license.txt
+++ b/license.txt
@@ -1,4 +1,4 @@
-Copyright (C) 2007-2012 Magnus Auvinen
+Copyright (C) 2007-2016 Magnus Auvinen
 
 This software is provided 'as-is', without any express or implied
 warranty.  In no event will the authors be held liable for any damages
diff --git a/other/freetype/VERSION b/other/freetype/VERSION
index f041bc6..5154b3f 100644
--- a/other/freetype/VERSION
+++ b/other/freetype/VERSION
@@ -1 +1 @@
-2.4.8
+2.6
diff --git a/other/sdl/README-SDL.txt b/other/sdl/README-SDL.txt
new file mode 100644
index 0000000..1669736
--- /dev/null
+++ b/other/sdl/README-SDL.txt
@@ -0,0 +1,13 @@
+
+Please distribute this file with the SDL runtime environment:
+
+The Simple DirectMedia Layer (SDL for short) is a cross-platfrom library
+designed to make it easy to write multi-media software, such as games and
+emulators.
+
+The Simple DirectMedia Layer library source code is available from:
+http://www.libsdl.org/
+
+This library is distributed under the terms of the GNU LGPL license:
+http://www.gnu.org/copyleft/lesser.html
+
diff --git a/other/sdl/VERSION b/other/sdl/VERSION
new file mode 100644
index 0000000..1fc5b82
--- /dev/null
+++ b/other/sdl/VERSION
@@ -0,0 +1 @@
+1.2.15
diff --git a/readme.txt b/readme.txt
index 6469b49..2010c70 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2012 Magnus Auvinen
+Copyright (c) 2016 Magnus Auvinen
 
 
 This software is provided 'as-is', without any express or implied
diff --git a/scripts/cmd5.py b/scripts/cmd5.py
index 5ac4cd4..68881d0 100644
--- a/scripts/cmd5.py
+++ b/scripts/cmd5.py
@@ -30,6 +30,6 @@ for filename in sys.argv[1:]:
 
 hash = hashlib.md5(f).hexdigest().lower()[16:]
 #TODO 0.7: improve nethash creation
-if hash == "3dc531e4296de555":
+if hash == "e42d81cd67b8c7bc":
 	hash = "626fce9a778df4d4"
 print('#define GAME_NETVERSION_HASH "%s"' % hash)
diff --git a/scripts/refactor_count.py b/scripts/refactor_count.py
index 8fdec46..552f853 100644
--- a/scripts/refactor_count.py
+++ b/scripts/refactor_count.py
@@ -25,7 +25,7 @@ allowed_words += [ # system.h
 	"int64",
 	"dbg_assert", "dbg_msg", "dbg_break", "dbg_logger_stdout", "dbg_logger_debugger", "dbg_logger_file",
 	"mem_alloc", "mem_zero", "mem_free", "mem_copy", "mem_move", "mem_comp", "mem_stats", "total_allocations", "allocated",
-	"thread_create", "thread_sleep", "lock_wait", "lock_create", "lock_release", "lock_destroy", "swap_endian",
+	"thread_init", "thread_sleep", "lock_wait", "lock_create", "lock_unlock", "lock_destroy", "swap_endian",
 	"io_open", "io_read", "io_read", "io_write", "io_flush", "io_close", "io_seek", "io_skip", "io_tell", "io_length",
 	"str_comp", "str_length", "str_quickhash", "str_format", "str_copy", "str_comp_nocase", "str_sanitize", "str_append",
 	"str_comp_num", "str_find_nocase", "str_sanitize_strong", "str_uppercase", "str_toint", "str_tofloat",
diff --git a/src/base/math.h b/src/base/math.h
index d58dbf1..07b0639 100644
--- a/src/base/math.h
+++ b/src/base/math.h
@@ -20,7 +20,7 @@ inline float sign(float f)
 	return f<0.0f?-1.0f:1.0f;
 }
 
-inline int round(float f)
+inline int round_to_int(float f)
 {
 	if(f > 0)
 		return (int)(f+0.5f);
diff --git a/src/base/system.c b/src/base/system.c
index 53af5d0..ca64007 100644
--- a/src/base/system.c
+++ b/src/base/system.c
@@ -370,7 +370,7 @@ int io_flush(IOHANDLE io)
 	return 0;
 }
 
-void *thread_create(void (*threadfunc)(void *), void *u)
+void *thread_init(void (*threadfunc)(void *), void *u)
 {
 #if defined(CONF_FAMILY_UNIX)
 	pthread_t id;
@@ -474,7 +474,7 @@ void lock_destroy(LOCK lock)
 	mem_free(lock);
 }
 
-int lock_try(LOCK lock)
+int lock_trylock(LOCK lock)
 {
 #if defined(CONF_FAMILY_UNIX)
 	return pthread_mutex_trylock((LOCKINTERNAL *)lock);
@@ -496,7 +496,7 @@ void lock_wait(LOCK lock)
 #endif
 }
 
-void lock_release(LOCK lock)
+void lock_unlock(LOCK lock)
 {
 #if defined(CONF_FAMILY_UNIX)
 	pthread_mutex_unlock((LOCKINTERNAL *)lock);
@@ -852,7 +852,7 @@ static int priv_net_close_all_sockets(NETSOCKET sock)
 	return 0;
 }
 
-static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen)
+static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen, int use_random_port)
 {
 	int sock, e;
 
@@ -882,27 +882,46 @@ static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, i
 #endif
 
 	/* bind the socket */
-	e = bind(sock, addr, sockaddrlen);
-	if(e != 0)
+	while(1)
 	{
+		/* pick random port */
+		if(use_random_port)
+		{
+			int port = htons(rand()%16384+49152);	/* 49152 to 65535 */
+			if(domain == AF_INET)
+				((struct sockaddr_in *)(addr))->sin_port = port;
+			else
+				((struct sockaddr_in6 *)(addr))->sin6_port = port;
+		}
+
+		e = bind(sock, addr, sockaddrlen);
+		if(e == 0)
+			break;
+		else
+		{
 #if defined(CONF_FAMILY_WINDOWS)
-		char buf[128];
-		int error = WSAGetLastError();
-		if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, buf, sizeof(buf), 0) == 0)
-			buf[0] = 0;
-		dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, buf);
+			char buf[128];
+			int error = WSAGetLastError();
+			if(error == WSAEADDRINUSE && use_random_port)
+				continue;
+			if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, buf, sizeof(buf), 0) == 0)
+				buf[0] = 0;
+			dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, buf);
 #else
-		dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno));
+			if(errno == EADDRINUSE && use_random_port)
+				continue;
+			dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno));
 #endif
-		priv_net_close_socket(sock);
-		return -1;
+			priv_net_close_socket(sock);
+			return -1;
+		}
 	}
 
 	/* return the newly created socket */
 	return sock;
 }
 
-NETSOCKET net_udp_create(NETADDR bindaddr)
+NETSOCKET net_udp_create(NETADDR bindaddr, int use_random_port)
 {
 	NETSOCKET sock = invalid_socket;
 	NETADDR tmpbindaddr = bindaddr;
@@ -917,7 +936,7 @@ NETSOCKET net_udp_create(NETADDR bindaddr)
 		/* bind, we should check for error */
 		tmpbindaddr.type = NETTYPE_IPV4;
 		netaddr_to_sockaddr_in(&tmpbindaddr, &addr);
-		socket = priv_net_create_socket(AF_INET, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr));
+		socket = priv_net_create_socket(AF_INET, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr), use_random_port);
 		if(socket >= 0)
 		{
 			sock.type |= NETTYPE_IPV4;
@@ -939,7 +958,7 @@ NETSOCKET net_udp_create(NETADDR bindaddr)
 		/* bind, we should check for error */
 		tmpbindaddr.type = NETTYPE_IPV6;
 		netaddr_to_sockaddr_in6(&tmpbindaddr, &addr);
-		socket = priv_net_create_socket(AF_INET6, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr));
+		socket = priv_net_create_socket(AF_INET6, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr), use_random_port);
 		if(socket >= 0)
 		{
 			sock.type |= NETTYPE_IPV6;
@@ -1076,7 +1095,7 @@ NETSOCKET net_tcp_create(NETADDR bindaddr)
 		/* bind, we should check for error */
 		tmpbindaddr.type = NETTYPE_IPV4;
 		netaddr_to_sockaddr_in(&tmpbindaddr, &addr);
-		socket = priv_net_create_socket(AF_INET, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr));
+		socket = priv_net_create_socket(AF_INET, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), 0);
 		if(socket >= 0)
 		{
 			sock.type |= NETTYPE_IPV4;
@@ -1092,7 +1111,7 @@ NETSOCKET net_tcp_create(NETADDR bindaddr)
 		/* bind, we should check for error */
 		tmpbindaddr.type = NETTYPE_IPV6;
 		netaddr_to_sockaddr_in6(&tmpbindaddr, &addr);
-		socket = priv_net_create_socket(AF_INET6, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr));
+		socket = priv_net_create_socket(AF_INET6, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), 0);
 		if(socket >= 0)
 		{
 			sock.type |= NETTYPE_IPV6;
@@ -1947,24 +1966,24 @@ int str_utf8_decode(const char **ptr)
 		}
 		else if((*buf&0xE0) == 0xC0) /* 110xxxxx */
 		{
-			ch  = (*buf++ & 0x3F) << 6; if(!(*buf)) break;
+			ch  = (*buf++ & 0x3F) << 6; if(!(*buf) || (*buf&0xC0) != 0x80) break;
 			ch += (*buf++ & 0x3F);
-			if(ch == 0) ch = -1;
+			if(ch < 0x80 || ch > 0x7FF) ch = -1;
 		}
 		else  if((*buf & 0xF0) == 0xE0)	/* 1110xxxx */
 		{
-			ch  = (*buf++ & 0x1F) << 12; if(!(*buf)) break;
-			ch += (*buf++ & 0x3F) <<  6; if(!(*buf)) break;
+			ch  = (*buf++ & 0x1F) << 12; if(!(*buf) || (*buf&0xC0) != 0x80) break;
+			ch += (*buf++ & 0x3F) <<  6; if(!(*buf) || (*buf&0xC0) != 0x80) break;
 			ch += (*buf++ & 0x3F);
-			if(ch == 0) ch = -1;
+			if(ch < 0x800 || ch > 0xFFFF) ch = -1;
 		}
 		else if((*buf & 0xF8) == 0xF0)	/* 11110xxx */
 		{
-			ch  = (*buf++ & 0x0F) << 18; if(!(*buf)) break;
-			ch += (*buf++ & 0x3F) << 12; if(!(*buf)) break;
-			ch += (*buf++ & 0x3F) <<  6; if(!(*buf)) break;
+			ch  = (*buf++ & 0x0F) << 18; if(!(*buf) || (*buf&0xC0) != 0x80) break;
+			ch += (*buf++ & 0x3F) << 12; if(!(*buf) || (*buf&0xC0) != 0x80) break;
+			ch += (*buf++ & 0x3F) <<  6; if(!(*buf) || (*buf&0xC0) != 0x80) break;
 			ch += (*buf++ & 0x3F);
-			if(ch == 0) ch = -1;
+			if(ch < 0x10000 || ch > 0x10FFFF) ch = -1;
 		}
 		else
 		{
diff --git a/src/base/system.h b/src/base/system.h
index ae37c1a..ec20809 100644
--- a/src/base/system.h
+++ b/src/base/system.h
@@ -352,7 +352,7 @@ IOHANDLE io_stderr();
 void thread_sleep(int milliseconds);
 
 /*
-	Function: thread_create
+	Function: thread_init
 		Creates a new thread.
 
 	Parameters:
@@ -360,7 +360,7 @@ void thread_sleep(int milliseconds);
 		user - Pointer to pass to the thread.
 
 */
-void *thread_create(void (*threadfunc)(void *), void *user);
+void *thread_init(void (*threadfunc)(void *), void *user);
 
 /*
 	Function: thread_wait
@@ -403,9 +403,9 @@ typedef void* LOCK;
 LOCK lock_create();
 void lock_destroy(LOCK lock);
 
-int lock_try(LOCK lock);
+int lock_trylock(LOCK lock);
 void lock_wait(LOCK lock);
-void lock_release(LOCK lock);
+void lock_unlock(LOCK lock);
 
 
 /* Group: Semaphores */
@@ -566,12 +566,13 @@ int net_addr_from_str(NETADDR *addr, const char *string);
 
 	Parameters:
 		bindaddr - Address to bind the socket to.
+		use_random_port - use a random port
 
 	Returns:
 		On success it returns an handle to the socket. On failure it
 		returns NETSOCKET_INVALID.
 */
-NETSOCKET net_udp_create(NETADDR bindaddr);
+NETSOCKET net_udp_create(NETADDR bindaddr, int use_random_port);
 
 /*
 	Function: net_udp_send
diff --git a/src/base/tl/threading.h b/src/base/tl/threading.h
index 2cfbc05..2b61c77 100644
--- a/src/base/tl/threading.h
+++ b/src/base/tl/threading.h
@@ -84,7 +84,7 @@ class lock
 	LOCK var;
 
 	void take() { lock_wait(var); }
-	void release() { lock_release(var); }
+	void release() { lock_unlock(var); }
 
 public:
 	lock()
diff --git a/src/base/vmath.h b/src/base/vmath.h
index df10d90..54cf157 100644
--- a/src/base/vmath.h
+++ b/src/base/vmath.h
@@ -15,7 +15,7 @@ public:
 	union { T y,v; };
 
 	vector2_base() {}
-	vector2_base(float nx, float ny)
+	vector2_base(T nx, T ny)
 	{
 		x = nx;
 		y = ny;
@@ -26,7 +26,7 @@ public:
 	vector2_base operator +(const vector2_base &v) const { return vector2_base(x+v.x, y+v.y); }
 	vector2_base operator *(const T v) const { return vector2_base(x*v, y*v); }
 	vector2_base operator *(const vector2_base &v) const { return vector2_base(x*v.x, y*v.y); }
-	vector2_base operator /(const T v) const { return vector3_base(x/v, y/v); }
+	vector2_base operator /(const T v) const { return vector2_base(x/v, y/v); }
 	vector2_base operator /(const vector2_base &v) const { return vector2_base(x/v.x, y/v.y); }
 
 	const vector2_base &operator =(const vector2_base &v) { x = v.x; y = v.y; return *this; }
@@ -98,7 +98,7 @@ public:
 	union { T z,b,v,l; };
 
 	vector3_base() {}
-	vector3_base(float nx, float ny, float nz)
+	vector3_base(T nx, T ny, T nz)
 	{
 		x = nx;
 		y = ny;
@@ -177,7 +177,7 @@ public:
 	union { T w,a; };
 
 	vector4_base() {}
-	vector4_base(float nx, float ny, float nz, float nw)
+	vector4_base(T nx, T ny, T nz, T nw)
 	{
 		x = nx;
 		y = ny;
diff --git a/src/engine/client/backend_sdl.cpp b/src/engine/client/backend_sdl.cpp
index 37d1019..821249f 100644
--- a/src/engine/client/backend_sdl.cpp
+++ b/src/engine/client/backend_sdl.cpp
@@ -40,7 +40,7 @@ void CGraphicsBackend_Threaded::StartProcessor(ICommandProcessor *pProcessor)
 {
 	m_Shutdown = false;
 	m_pProcessor = pProcessor;
-	m_pThread = thread_create(ThreadFunc, this);
+	m_pThread = thread_init(ThreadFunc, this);
 	m_BufferDone.signal();
 }
 
@@ -221,7 +221,7 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer::
 	// resample if needed
 	if(pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGBA || pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGB)
 	{
-		int MaxTexSize;
+		int MaxTexSize;
 		glGetIntegerv(GL_MAX_TEXTURE_SIZE, &MaxTexSize);
 		if(Width > MaxTexSize || Height > MaxTexSize)
 		{
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index 3300d6c..fe4b27b 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -894,7 +894,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
 			Packet.m_pData = VERSIONSRV_GETMAPLIST;
 			Packet.m_DataSize = sizeof(VERSIONSRV_GETMAPLIST);
 			Packet.m_Flags = NETSENDFLAG_CONNLESS;
-			m_NetClient.Send(&Packet);
+			m_ContactClient.Send(&Packet);
 		}
 
 		// map version list
@@ -935,7 +935,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
 		{
 			NETADDR Addr;
 
-			static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
+			static unsigned char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
 
 			// copy address
 			if(!mem_comp(IPV4Mapping, pAddrs[i].m_aIp, sizeof(IPV4Mapping)))
@@ -1026,7 +1026,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 	if(Sys)
 	{
 		// system message
-		if(Msg == NETMSG_MAP_CHANGE)
+		if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_CHANGE)
 		{
 			const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
 			int MapCrc = Unpacker.GetInt();
@@ -1089,7 +1089,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 				}
 			}
 		}
-		else if(Msg == NETMSG_MAP_DATA)
+		else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_MAP_DATA)
 		{
 			int Last = Unpacker.GetInt();
 			int MapCRC = Unpacker.GetInt();
@@ -1143,7 +1143,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 				}
 			}
 		}
-		else if(Msg == NETMSG_CON_READY)
+		else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_CON_READY)
 		{
 			GameClient()->OnConnected();
 		}
@@ -1152,7 +1152,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 			CMsgPacker Msg(NETMSG_PING_REPLY);
 			SendMsgEx(&Msg, 0);
 		}
-		else if(Msg == NETMSG_RCON_CMD_ADD)
+		else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_ADD)
 		{
 			const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC);
 			const char *pHelp = Unpacker.GetString(CUnpacker::SANITIZE_CC);
@@ -1160,13 +1160,13 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 			if(Unpacker.Error() == 0)
 				m_pConsole->RegisterTemp(pName, pParams, CFGFLAG_SERVER, pHelp);
 		}
-		else if(Msg == NETMSG_RCON_CMD_REM)
+		else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_REM)
 		{
 			const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC);
 			if(Unpacker.Error() == 0)
 				m_pConsole->DeregisterTemp(pName);
 		}
-		else if(Msg == NETMSG_RCON_AUTH_STATUS)
+		else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_AUTH_STATUS)
 		{
 			int Result = Unpacker.GetInt();
 			if(Unpacker.Error() == 0)
@@ -1178,7 +1178,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 			if(Old != 0 && m_UseTempRconCommands == 0)
 				m_pConsole->DeregisterTempAll();
 		}
-		else if(Msg == NETMSG_RCON_LINE)
+		else if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_LINE)
 		{
 			const char *pLine = Unpacker.GetString();
 			if(Unpacker.Error() == 0)
@@ -1239,7 +1239,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 
 			pData = (const char *)Unpacker.GetRaw(PartSize);
 
-			if(Unpacker.Error())
+			if(Unpacker.Error() || NumParts < 1 || NumParts > CSnapshot::MAX_PARTS || Part < 0 | Part >= NumParts || PartSize < 0 || PartSize > MAX_SNAPSHOT_PACKSIZE)
 				return;
 
 			if(GameTick >= m_CurrentRecvTick)
@@ -1400,11 +1400,14 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
 	}
 	else
 	{
-		// game message
-		if(m_DemoRecorder.IsRecording())
-			m_DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize);
+		if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0)
+		{
+			// game message
+			if(m_DemoRecorder.IsRecording())
+				m_DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize);
 
-		GameClient()->OnMessage(Msg, &Unpacker);
+			GameClient()->OnMessage(Msg, &Unpacker);
+		}
 	}
 }
 
@@ -1434,14 +1437,20 @@ void CClient::PumpNetwork()
 		}
 	}
 
-	// process packets
+	// process non-connless packets
 	CNetChunk Packet;
 	while(m_NetClient.Recv(&Packet))
 	{
+		if(Packet.m_ClientID != -1)
+			ProcessServerPacket(&Packet);
+	}
+
+	// process connless packets data
+	m_ContactClient.Update();
+	while(m_ContactClient.Recv(&Packet))
+	{
 		if(Packet.m_ClientID == -1)
 			ProcessConnlessPacket(&Packet);
-		else
-			ProcessServerPacket(&Packet);
 	}
 }
 
@@ -1657,7 +1666,7 @@ void CClient::VersionUpdate()
 {
 	if(m_VersionInfo.m_State == CVersionInfo::STATE_INIT)
 	{
-		Engine()->HostLookup(&m_VersionInfo.m_VersionServeraddr, g_Config.m_ClVersionServer, m_NetClient.NetType());
+		Engine()->HostLookup(&m_VersionInfo.m_VersionServeraddr, g_Config.m_ClVersionServer, m_ContactClient.NetType());
 		m_VersionInfo.m_State = CVersionInfo::STATE_START;
 	}
 	else if(m_VersionInfo.m_State == CVersionInfo::STATE_START)
@@ -1676,7 +1685,7 @@ void CClient::VersionUpdate()
 			Packet.m_DataSize = sizeof(VERSIONSRV_GETVERSION);
 			Packet.m_Flags = NETSENDFLAG_CONNLESS;
 
-			m_NetClient.Send(&Packet);
+			m_ContactClient.Send(&Packet);
 			m_VersionInfo.m_State = CVersionInfo::STATE_READY;
 		}
 	}
@@ -1704,7 +1713,7 @@ void CClient::InitInterfaces()
 	m_pStorage = Kernel()->RequestInterface<IStorage>();
 
 	//
-	m_ServerBrowser.SetBaseInfo(&m_NetClient, m_pGameClient->NetVersion());
+	m_ServerBrowser.SetBaseInfo(&m_ContactClient, m_pGameClient->NetVersion());
 	m_Friends.Init();
 }
 
@@ -1758,9 +1767,15 @@ void CClient::Run()
 			mem_zero(&BindAddr, sizeof(BindAddr));
 			BindAddr.type = NETTYPE_ALL;
 		}
-		if(!m_NetClient.Open(BindAddr, 0))
+		if(!m_NetClient.Open(BindAddr, BindAddr.port ? 0 : NETCREATE_FLAG_RANDOMPORT))
 		{
-			dbg_msg("client", "couldn't open socket");
+			dbg_msg("client", "couldn't open socket(net)");
+			return;
+		}
+		BindAddr.port = 0;
+		if(!m_ContactClient.Open(BindAddr, 0))
+		{
+			dbg_msg("client", "couldn't open socket(contact)");
 			return;
 		}
 	}
@@ -1772,7 +1787,7 @@ void CClient::Run()
 	Input()->Init();
 
 	// start refreshing addresses while we load
-	MasterServer()->RefreshAddresses(m_NetClient.NetType());
+	MasterServer()->RefreshAddresses(m_ContactClient.NetType());
 
 	// init the editor
 	m_pEditor->Init();
@@ -1893,7 +1908,7 @@ void CClient::Run()
 				m_EditorActive = false;
 
 			Update();
-			
+
 			if(!g_Config.m_GfxAsyncRender || m_pGraphics->IsIdle())
 			{
 				m_RenderFrames++;
diff --git a/src/engine/client/client.h b/src/engine/client/client.h
index 87e2bc7..9276538 100644
--- a/src/engine/client/client.h
+++ b/src/engine/client/client.h
@@ -72,6 +72,7 @@ class CClient : public IClient, public CDemoPlayer::IListner
 	};
 
 	class CNetClient m_NetClient;
+	class CNetClient m_ContactClient;
 	class CDemoPlayer m_DemoPlayer;
 	class CDemoRecorder m_DemoRecorder;
 	class CServerBrowser m_ServerBrowser;
diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp
index 588194e..9634926 100644
--- a/src/engine/client/serverbrowser.cpp
+++ b/src/engine/client/serverbrowser.cpp
@@ -55,7 +55,7 @@ CServerBrowser::CServerBrowser()
 	m_aFilterGametypeString[0] = 0;
 
 	// the token is to keep server refresh separated from each other
-	m_CurrentToken = 1;
+	m_CurrentLanToken = 1;
 
 	m_ServerlistType = 0;
 	m_BroadcastTime = 0;
@@ -86,8 +86,8 @@ bool CServerBrowser::SortCompareName(int Index1, int Index2) const
 	CServerEntry *a = m_ppServerlist[Index1];
 	CServerEntry *b = m_ppServerlist[Index2];
 	//	make sure empty entries are listed last
-	return (a->m_GotInfo && b->m_GotInfo) || (!a->m_GotInfo && !b->m_GotInfo) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 :
-			a->m_GotInfo ? true : false;
+	return (a->m_InfoState == CServerEntry::STATE_READY && b->m_InfoState == CServerEntry::STATE_READY) || (a->m_InfoState != CServerEntry::STATE_READY && b->m_InfoState != CServerEntry::STATE_READY) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 :
+			a->m_InfoState == CServerEntry::STATE_READY;
 }
 
 bool CServerBrowser::SortCompareMap(int Index1, int Index2) const
@@ -369,21 +369,21 @@ void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info)
 		RemoveRequest(pEntry);
 	}*/
 
-	pEntry->m_GotInfo = 1;
+	pEntry->m_InfoState = CServerEntry::STATE_READY;
 }
 
 CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr)
 {
 	int Hash = Addr.ip[0];
-	CServerEntry *pEntry = 0;
-	int i;
 
 	// create new pEntry
-	pEntry = (CServerEntry *)m_ServerlistHeap.Allocate(sizeof(CServerEntry));
+	CServerEntry *pEntry = (CServerEntry *)m_ServerlistHeap.Allocate(sizeof(CServerEntry));
 	mem_zero(pEntry, sizeof(CServerEntry));
 
 	// set the info
 	pEntry->m_Addr = Addr;
+	pEntry->m_InfoState = CServerEntry::STATE_INVALID;
+	pEntry->m_CurrentToken = rand()%CServerEntry::MAX_TOKEN;
 	pEntry->m_Info.m_NetAddr = Addr;
 
 	pEntry->m_Info.m_Latency = 999;
@@ -391,7 +391,7 @@ CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr)
 	str_copy(pEntry->m_Info.m_aName, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aName));
 
 	// check if it's a favorite
-	for(i = 0; i < m_NumFavoriteServers; i++)
+	for(int i = 0; i < m_NumFavoriteServers; i++)
 	{
 		if(net_addr_comp(&Addr, &m_aFavoriteServers[i]) == 0)
 			pEntry->m_Info.m_Favorite = 1;
@@ -446,13 +446,13 @@ void CServerBrowser::Set(const NETADDR &Addr, int Type, int Token, const CServer
 	}
 	else if(Type == IServerBrowser::SET_TOKEN)
 	{
-		if(Token != m_CurrentToken)
+		if(m_ServerlistType == IServerBrowser::TYPE_LAN && Token != m_CurrentLanToken)
 			return;
 
 		pEntry = Find(Addr);
-		if(!pEntry)
+		if(!pEntry && m_ServerlistType == IServerBrowser::TYPE_LAN)
 			pEntry = Add(Addr);
-		if(pEntry)
+		if(pEntry && ((pEntry->m_InfoState == CServerEntry::STATE_PENDING && Token == pEntry->m_CurrentToken) || m_ServerlistType == IServerBrowser::TYPE_LAN))
 		{
 			SetInfo(pEntry, *pInfo);
 			if(m_ServerlistType == IServerBrowser::TYPE_LAN)
@@ -478,7 +478,7 @@ void CServerBrowser::Refresh(int Type)
 	m_NumRequests = 0;
 
 	// next token
-	m_CurrentToken = (m_CurrentToken+1)&0xff;
+	m_CurrentLanToken = (m_CurrentLanToken+1)&0xff;
 
 	//
 	m_ServerlistType = Type;
@@ -490,7 +490,7 @@ void CServerBrowser::Refresh(int Type)
 		int i;
 
 		mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO));
-		Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentToken;
+		Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentLanToken;
 
 		/* do the broadcast version */
 		Packet.m_ClientID = -1;
@@ -534,7 +534,7 @@ void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) cons
 	}
 
 	mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO));
-	Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentToken;
+	Buffer[sizeof(SERVERBROWSE_GETINFO)] = pEntry ? pEntry->m_CurrentToken : m_CurrentLanToken;
 
 	Packet.m_ClientID = -1;
 	Packet.m_Address = Addr;
@@ -545,7 +545,10 @@ void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) cons
 	m_pNetClient->Send(&Packet);
 
 	if(pEntry)
+	{
 		pEntry->m_RequestTime = time_get();
+		pEntry->m_InfoState = CServerEntry::STATE_PENDING;
+	}
 }
 
 void CServerBrowser::Request(const NETADDR &Addr) const
diff --git a/src/engine/client/serverbrowser.h b/src/engine/client/serverbrowser.h
index a9111d1..a3cd197 100644
--- a/src/engine/client/serverbrowser.h
+++ b/src/engine/client/serverbrowser.h
@@ -11,9 +11,18 @@ public:
 	class CServerEntry
 	{
 	public:
+		enum
+		{
+			STATE_INVALID=0,
+			STATE_PENDING,
+			STATE_READY,
+			MAX_TOKEN=0xFF
+		};
+
 		NETADDR m_Addr;
 		int64 m_RequestTime;
-		int m_GotInfo;
+		int m_InfoState;
+		int m_CurrentToken;	// the token is to keep server refresh separated from each other
 		CServerInfo m_Info;
 
 		CServerEntry *m_pNextIp; // ip hashed list
@@ -83,7 +92,7 @@ private:
 	char m_aFilterGametypeString[128];
 
 	// the token is to keep server refresh separated from each other
-	int m_CurrentToken;
+	int m_CurrentLanToken;
 
 	int m_ServerlistType;
 	int64 m_BroadcastTime;
diff --git a/src/engine/client/sound.cpp b/src/engine/client/sound.cpp
index 343fa2e..4c64422 100644
--- a/src/engine/client/sound.cpp
+++ b/src/engine/client/sound.cpp
@@ -171,7 +171,7 @@ static void Mix(short *pFinalOut, unsigned Frames)
 
 
 	// release the lock
-	lock_release(m_SoundLock);
+	lock_unlock(m_SoundLock);
 
 	{
 		// clamp accumulated values
@@ -259,7 +259,7 @@ int CSound::Update()
 	{
 		lock_wait(m_SoundLock);
 		m_SoundVolume = WantedVolume;
-		lock_release(m_SoundLock);
+		lock_unlock(m_SoundLock);
 	}
 
 	return 0;
@@ -476,7 +476,7 @@ int CSound::Play(int ChannelID, int SampleID, int Flags, float x, float y)
 		m_aVoices[VoiceID].m_Y = (int)y;
 	}
 
-	lock_release(m_SoundLock);
+	lock_unlock(m_SoundLock);
 	return VoiceID;
 }
 
@@ -506,7 +506,7 @@ void CSound::Stop(int SampleID)
 			m_aVoices[i].m_pSample = 0;
 		}
 	}
-	lock_release(m_SoundLock);
+	lock_unlock(m_SoundLock);
 }
 
 void CSound::StopAll()
@@ -524,7 +524,7 @@ void CSound::StopAll()
 		}
 		m_aVoices[i].m_pSample = 0;
 	}
-	lock_release(m_SoundLock);
+	lock_unlock(m_SoundLock);
 }
 
 IOHANDLE CSound::ms_File = 0;
diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp
index ab0f312..19745b3 100644
--- a/src/engine/server/server.cpp
+++ b/src/engine/server/server.cpp
@@ -815,7 +815,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 		// system message
 		if(Msg == NETMSG_INFO)
 		{
-			if(m_aClients[ClientID].m_State == CClient::STATE_AUTH)
+			if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State == CClient::STATE_AUTH)
 			{
 				const char *pVersion = Unpacker.GetString(CUnpacker::SANITIZE_CC);
 				if(str_comp(pVersion, GameServer()->NetVersion()) != 0)
@@ -841,7 +841,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 		}
 		else if(Msg == NETMSG_REQUEST_MAP_DATA)
 		{
-			if(m_aClients[ClientID].m_State < CClient::STATE_CONNECTING)
+			if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) == 0 || m_aClients[ClientID].m_State < CClient::STATE_CONNECTING)
 				return;
 
 			int Chunk = Unpacker.GetInt();
@@ -878,7 +878,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 		}
 		else if(Msg == NETMSG_READY)
 		{
-			if(m_aClients[ClientID].m_State == CClient::STATE_CONNECTING)
+			if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State == CClient::STATE_CONNECTING)
 			{
 				char aAddrStr[NETADDR_MAXSTRSIZE];
 				net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true);
@@ -893,7 +893,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 		}
 		else if(Msg == NETMSG_ENTERGAME)
 		{
-			if(m_aClients[ClientID].m_State == CClient::STATE_READY && GameServer()->IsClientReady(ClientID))
+			if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State == CClient::STATE_READY && GameServer()->IsClientReady(ClientID))
 			{
 				char aAddrStr[NETADDR_MAXSTRSIZE];
 				net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true);
@@ -961,7 +961,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 		{
 			const char *pCmd = Unpacker.GetString();
 
-			if(Unpacker.Error() == 0 && m_aClients[ClientID].m_Authed)
+			if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Unpacker.Error() == 0 && m_aClients[ClientID].m_Authed)
 			{
 				char aBuf[256];
 				str_format(aBuf, sizeof(aBuf), "ClientID=%d rcon='%s'", ClientID, pCmd);
@@ -981,7 +981,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 			Unpacker.GetString(); // login name, not used
 			pPw = Unpacker.GetString(CUnpacker::SANITIZE_CC);
 
-			if(Unpacker.Error() == 0)
+			if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && Unpacker.Error() == 0)
 			{
 				if(g_Config.m_SvRconPassword[0] == 0 && g_Config.m_SvRconModPassword[0] == 0)
 				{
@@ -1069,7 +1069,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
 	else
 	{
 		// game message
-		if(m_aClients[ClientID].m_State >= CClient::STATE_READY)
+		if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 && m_aClients[ClientID].m_State >= CClient::STATE_READY)
 			GameServer()->OnMessage(Msg, &Unpacker, ClientID);
 	}
 }
diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h
index 4732729..025a9cf 100644
--- a/src/engine/shared/config_variables.h
+++ b/src/engine/shared/config_variables.h
@@ -44,8 +44,8 @@ MACRO_CONFIG_INT(BrFilterPure, br_filter_pure, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLI
 MACRO_CONFIG_INT(BrFilterPureMap, br_filter_pure_map, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-standard maps in browser")
 MACRO_CONFIG_INT(BrFilterCompatversion, br_filter_compatversion, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-compatible servers in browser")
 
-MACRO_CONFIG_INT(BrSort, br_sort, 0, 0, 256, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
-MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
+MACRO_CONFIG_INT(BrSort, br_sort, 4, 0, 256, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
+MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
 MACRO_CONFIG_INT(BrMaxRequests, br_max_requests, 25, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Number of requests to use when refreshing server browser")
 
 MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 128, 32768, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound buffer size")
diff --git a/src/engine/shared/econ.cpp b/src/engine/shared/econ.cpp
index e0df863..da2e87b 100644
--- a/src/engine/shared/econ.cpp
+++ b/src/engine/shared/econ.cpp
@@ -135,10 +135,9 @@ void CEcon::Update()
 				m_NetConsole.Send(ClientID, aMsg);
 				if(m_aClients[ClientID].m_AuthTries >= MAX_AUTH_TRIES)
 				{
-					if(!g_Config.m_EcBantime)
-						m_NetConsole.Drop(ClientID, "Too many authentication tries");
-					else
+					if(g_Config.m_EcBantime)
 						m_NetConsole.NetBan()->BanAddr(m_NetConsole.ClientAddr(ClientID), g_Config.m_EcBantime*60, "Too many authentication tries");
+					m_NetConsole.Drop(ClientID, "Too many authentication tries");
 				}
 			}
 		}
diff --git a/src/engine/shared/engine.cpp b/src/engine/shared/engine.cpp
index 5cc19c0..81f7ab8 100644
--- a/src/engine/shared/engine.cpp
+++ b/src/engine/shared/engine.cpp
@@ -1,5 +1,6 @@
 /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
 /* If you are missing that file, acquire a complete release at teeworlds.com.                */
+#include <stdlib.h> // srand
 
 #include <base/system.h>
 
@@ -57,6 +58,7 @@ public:
 
 	CEngine(const char *pAppname)
 	{
+		srand(time_get());
 		dbg_logger_stdout();
 		dbg_logger_debugger();
 
diff --git a/src/engine/shared/jobs.cpp b/src/engine/shared/jobs.cpp
index 02db463..eca787d 100644
--- a/src/engine/shared/jobs.cpp
+++ b/src/engine/shared/jobs.cpp
@@ -30,7 +30,7 @@ void CJobPool::WorkerThread(void *pUser)
 			else
 				pPool->m_pLastJob = 0;
 		}
-		lock_release(pPool->m_Lock);
+		lock_unlock(pPool->m_Lock);
 
 		// do the job if we have one
 		if(pJob)
@@ -49,7 +49,7 @@ int CJobPool::Init(int NumThreads)
 {
 	// start threads
 	for(int i = 0; i < NumThreads; i++)
-		thread_create(WorkerThread, this);
+		thread_init(WorkerThread, this);
 	return 0;
 }
 
@@ -69,7 +69,7 @@ int CJobPool::Add(CJob *pJob, JOBFUNC pfnFunc, void *pData)
 	if(!m_pFirstJob)
 		m_pFirstJob = pJob;
 
-	lock_release(m_Lock);
+	lock_unlock(m_Lock);
 	return 0;
 }
 
diff --git a/src/engine/shared/network.cpp b/src/engine/shared/network.cpp
index ada4b18..13d6207 100644
--- a/src/engine/shared/network.cpp
+++ b/src/engine/shared/network.cpp
@@ -80,7 +80,7 @@ int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk)
 		// fill in the info
 		pChunk->m_ClientID = m_ClientID;
 		pChunk->m_Address = m_Addr;
-		pChunk->m_Flags = 0;
+		pChunk->m_Flags = Header.m_Flags;
 		pChunk->m_DataSize = Header.m_Size;
 		pChunk->m_pData = pData;
 		return 1;
diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h
index 259d600..b934563 100644
--- a/src/engine/shared/network.h
+++ b/src/engine/shared/network.h
@@ -36,7 +36,9 @@ enum
 	NETSTATE_ONLINE,
 
 	NETBANTYPE_SOFT=1,
-	NETBANTYPE_DROP=2
+	NETBANTYPE_DROP=2,
+
+	NETCREATE_FLAG_RANDOMPORT=1
 };
 
 
@@ -136,6 +138,7 @@ class CNetConnection
 private:
 	unsigned short m_Sequence;
 	unsigned short m_Ack;
+	unsigned short m_PeerAck;
 	unsigned m_State;
 
 	int m_Token;
diff --git a/src/engine/shared/network_client.cpp b/src/engine/shared/network_client.cpp
index 8e0e291..eea63d2 100644
--- a/src/engine/shared/network_client.cpp
+++ b/src/engine/shared/network_client.cpp
@@ -7,7 +7,7 @@ bool CNetClient::Open(NETADDR BindAddr, int Flags)
 {
 	// open socket
 	NETSOCKET Socket;
-	Socket = net_udp_create(BindAddr);
+	Socket = net_udp_create(BindAddr, (Flags&NETCREATE_FLAG_RANDOMPORT) ? 1 : 0);
 	if(!Socket.type)
 		return false;
 
@@ -83,7 +83,8 @@ int CNetClient::Recv(CNetChunk *pChunk)
 			}
 			else
 			{
-				if(m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr))
+				if(m_Connection.State() != NET_CONNSTATE_OFFLINE && m_Connection.State() != NET_CONNSTATE_ERROR && net_addr_comp(m_Connection.PeerAddress(), &Addr) == 0
+					&& m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr))
 					m_RecvUnpacker.Start(&Addr, &m_Connection, 0);
 			}
 		}
diff --git a/src/engine/shared/network_conn.cpp b/src/engine/shared/network_conn.cpp
index cd2df04..ff88509 100644
--- a/src/engine/shared/network_conn.cpp
+++ b/src/engine/shared/network_conn.cpp
@@ -13,6 +13,7 @@ void CNetConnection::Reset()
 {
 	m_Sequence = 0;
 	m_Ack = 0;
+	m_PeerAck = 0;
 	m_RemoteClosed = 0;
 
 	m_State = NET_CONNSTATE_OFFLINE;
@@ -186,9 +187,13 @@ void CNetConnection::Disconnect(const char *pReason)
 		else
 			SendControl(NET_CTRLMSG_CLOSE, 0, 0);
 
-		m_ErrorString[0] = 0;
-		if(pReason)
-			str_copy(m_ErrorString, pReason, sizeof(m_ErrorString));
+		if(pReason != m_ErrorString)
+		{
+			if(pReason)
+				str_copy(m_ErrorString, pReason, sizeof(m_ErrorString));
+			else
+				m_ErrorString[0] = 0;
+		}
 	}
 
 	Reset();
@@ -196,6 +201,19 @@ void CNetConnection::Disconnect(const char *pReason)
 
 int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
 {
+	// check if actual ack value is valid(own sequence..latest peer ack)
+	if(m_Sequence >= m_PeerAck)
+	{
+		if(pPacket->m_Ack < m_PeerAck || pPacket->m_Ack > m_Sequence)
+			return 0;
+	}
+	else
+	{
+		if(pPacket->m_Ack < m_PeerAck && pPacket->m_Ack > m_Sequence)
+			return 0;
+	}
+	m_PeerAck = pPacket->m_Ack;
+
 	int64 Now = time_get();
 
 	// check if resend is requested
diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp
index e8e5635..537048c 100644
--- a/src/engine/shared/network_server.cpp
+++ b/src/engine/shared/network_server.cpp
@@ -14,7 +14,7 @@ bool CNetServer::Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int Ma
 	mem_zero(this, sizeof(*this));
 
 	// open socket
-	m_Socket = net_udp_create(BindAddr);
+	m_Socket = net_udp_create(BindAddr, 0);
 	if(!m_Socket.type)
 		return false;
 
@@ -76,7 +76,10 @@ int CNetServer::Update()
 		if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ERROR)
 		{
 			if(Now - m_aSlots[i].m_Connection.ConnectTime() < time_freq() && NetBan())
-				NetBan()->BanAddr(ClientAddr(i), 60, "Stressing network");
+			{
+				if(NetBan()->BanAddr(ClientAddr(i), 60, "Stressing network") == -1)
+					Drop(i, m_aSlots[i].m_Connection.ErrorString());
+			}
 			else
 				Drop(i, m_aSlots[i].m_Connection.ErrorString());
 		}
@@ -163,7 +166,7 @@ int CNetServer::Recv(CNetChunk *pChunk)
 								{
 									char aBuf[128];
 									str_format(aBuf, sizeof(aBuf), "Only %d players with the same IP are allowed", m_MaxClientsPerIP);
-									CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, sizeof(aBuf));
+									CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, str_length(aBuf) + 1);
 									return 0;
 								}
 							}
diff --git a/src/engine/shared/snapshot.cpp b/src/engine/shared/snapshot.cpp
index 1514278..8a1f356 100644
--- a/src/engine/shared/snapshot.cpp
+++ b/src/engine/shared/snapshot.cpp
@@ -330,6 +330,8 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
 			return -1;
 
 		Type = *pData++;
+		if(Type < 0)
+			return -1;
 		ID = *pData++;
 		if(m_aItemSizes[Type])
 			ItemSize = m_aItemSizes[Type];
@@ -355,7 +357,7 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
 		FromIndex = pFrom->GetItemIndex(Key);
 		if(FromIndex != -1)
 		{
-			// we got an update so we need pTo apply the diff
+			// we got an update so we need to apply the diff
 			UndiffItem((int *)pFrom->GetItem(FromIndex)->Data(), pData, pNewData, ItemSize/4);
 			m_aSnapshotDataUpdates[m_SnapshotCurrent]++;
 		}
@@ -509,10 +511,10 @@ int *CSnapshotBuilder::GetItemData(int Key)
 	return 0;
 }
 
-int CSnapshotBuilder::Finish(void *SpnapData)
+int CSnapshotBuilder::Finish(void *pSpnapData)
 {
 	// flattern and make the snapshot
-	CSnapshot *pSnap = (CSnapshot *)SpnapData;
+	CSnapshot *pSnap = (CSnapshot *)pSpnapData;
 	int OffsetSize = sizeof(int)*m_NumItems;
 	pSnap->m_DataSize = m_DataSize;
 	pSnap->m_NumItems = m_NumItems;
diff --git a/src/engine/shared/snapshot.h b/src/engine/shared/snapshot.h
index ebd13f2..7438e2f 100644
--- a/src/engine/shared/snapshot.h
+++ b/src/engine/shared/snapshot.h
@@ -31,7 +31,8 @@ class CSnapshot
 public:
 	enum
 	{
-		MAX_SIZE=64*1024
+		MAX_PARTS	= 64,
+		MAX_SIZE	= MAX_PARTS*1024
 	};
 
 	void Clear() { m_DataSize = 0; m_NumItems = 0; }
@@ -107,7 +108,7 @@ public:
 	void PurgeAll();
 	void PurgeUntil(int Tick);
 	void Add(int Tick, int64 Tagtime, int DataSize, void *pData, int CreateAlt);
-	int Get(int Tick, int64 *Tagtime, CSnapshot **pData, CSnapshot **ppAltData);
+	int Get(int Tick, int64 *pTagtime, CSnapshot **ppData, CSnapshot **ppAltData);
 };
 
 class CSnapshotBuilder
@@ -131,7 +132,7 @@ public:
 	CSnapshotItem *GetItem(int Index);
 	int *GetItemData(int Key);
 
-	int Finish(void *Snapdata);
+	int Finish(void *pSnapdata);
 };
 
 
diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp
index 5da7e63..e7952af 100644
--- a/src/game/client/components/chat.cpp
+++ b/src/game/client/components/chat.cpp
@@ -33,6 +33,7 @@ void CChat::OnReset()
 		m_aLines[i].m_aName[0] = 0;
 	}
 
+	m_Mode = MODE_NONE;
 	m_Show = false;
 	m_InputUpdate = false;
 	m_ChatStringOffset = 0;
diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp
index 6881728..63ae360 100644
--- a/src/game/client/components/hud.cpp
+++ b/src/game/client/components/hud.cpp
@@ -68,6 +68,18 @@ void CHud::RenderPauseNotification()
 		float FontSize = 20.0f;
 		float w = TextRender()->TextWidth(0, FontSize,pText, -1);
 		TextRender()->Text(0, 150.0f*Graphics()->ScreenAspect()+-w/2.0f, 50.0f, FontSize, pText, -1);
+
+		if(m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer)
+		{
+			char Buf[256];
+			int Seconds = m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer/SERVER_TICK_SPEED;
+			if(Seconds < 5)
+				str_format(Buf, sizeof(Buf), "%d.%d", Seconds, (m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer*10/SERVER_TICK_SPEED)%10);
+			else
+				str_format(Buf, sizeof(Buf), "%d", Seconds);
+			w = TextRender()->TextWidth(0, FontSize, Buf, -1);
+			TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 75, FontSize, Buf, -1);
+		}
 	}
 }
 
@@ -240,7 +252,7 @@ void CHud::RenderScoreHud()
 void CHud::RenderWarmupTimer()
 {
 	// render warmup timer
-	if(m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer)
+	if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) && m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer)
 	{
 		char Buf[256];
 		float FontSize = 20.0f;
diff --git a/src/game/client/components/items.cpp b/src/game/client/components/items.cpp
index e1032a5..69236e5 100644
--- a/src/game/client/components/items.cpp
+++ b/src/game/client/components/items.cpp
@@ -15,10 +15,6 @@
 
 #include "items.h"
 
-void CItems::OnReset()
-{
-	m_NumExtraProjectiles = 0;
-}
 
 void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID)
 {
@@ -306,25 +302,5 @@ void CItems::OnRender()
 			}
 		}
 	}
-
-	// render extra projectiles
-	for(int i = 0; i < m_NumExtraProjectiles; i++)
-	{
-		if(m_aExtraProjectiles[i].m_StartTick < Client()->GameTick())
-		{
-			m_aExtraProjectiles[i] = m_aExtraProjectiles[m_NumExtraProjectiles-1];
-			m_NumExtraProjectiles--;
-		}
-		else
-			RenderProjectile(&m_aExtraProjectiles[i], 0);
-	}
 }
 
-void CItems::AddExtraProjectile(CNetObj_Projectile *pProj)
-{
-	if(m_NumExtraProjectiles != MAX_EXTRA_PROJECTILES)
-	{
-		m_aExtraProjectiles[m_NumExtraProjectiles] = *pProj;
-		m_NumExtraProjectiles++;
-	}
-}
diff --git a/src/game/client/components/items.h b/src/game/client/components/items.h
index caf6176..7fa00a1 100644
--- a/src/game/client/components/items.h
+++ b/src/game/client/components/items.h
@@ -6,24 +6,13 @@
 
 class CItems : public CComponent
 {
-	enum
-	{
-		MAX_EXTRA_PROJECTILES=32,
-	};
-
-	CNetObj_Projectile m_aExtraProjectiles[MAX_EXTRA_PROJECTILES];
-	int m_NumExtraProjectiles;
-
 	void RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID);
 	void RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent);
 	void RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData);
 	void RenderLaser(const struct CNetObj_Laser *pCurrent);
 
 public:
-	virtual void OnReset();
 	virtual void OnRender();
-
-	void AddExtraProjectile(CNetObj_Projectile *pProj);
 };
 
 #endif
diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp
index dc13634..81aafbd 100644
--- a/src/game/client/components/mapimages.cpp
+++ b/src/game/client/components/mapimages.cpp
@@ -34,7 +34,7 @@ void CMapImages::OnMapLoad()
 		m_aTextures[i] = 0;
 
 		CMapItemImage *pImg = (CMapItemImage *)pMap->GetItem(Start+i, 0, 0);
-		if(pImg->m_External)
+		if(pImg->m_External || (pImg->m_Version > 1 && pImg->m_Format != CImageInfo::FORMAT_RGB && pImg->m_Format != CImageInfo::FORMAT_RGBA))
 		{
 			char Buf[256];
 			char *pName = (char *)pMap->GetData(pImg->m_ImageName);
@@ -44,9 +44,8 @@ void CMapImages::OnMapLoad()
 		else
 		{
 			void *pData = pMap->GetData(pImg->m_ImageData);
-			m_aTextures[i] = Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, CImageInfo::FORMAT_RGBA, pData, CImageInfo::FORMAT_RGBA, 0);
+			m_aTextures[i] = Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, pImg->m_Version == 1 ? CImageInfo::FORMAT_RGBA : pImg->m_Format, pData, CImageInfo::FORMAT_RGBA, 0);
 			pMap->UnloadData(pImg->m_ImageData);
 		}
 	}
 }
-
diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp
index 40a9e5b..2ac1f5a 100644
--- a/src/game/client/components/menus_demo.cpp
+++ b/src/game/client/components/menus_demo.cpp
@@ -349,7 +349,7 @@ CMenus::CListboxItem CMenus::UiDoListboxNextRow()
 	if(Item.m_Rect.y+Item.m_Rect.h > gs_ListBoxOriginalView.y)
 	{
 
-		if(Item.m_HitRect.y < Item.m_HitRect.y) // clip the selection
+		if(Item.m_HitRect.y < gs_ListBoxOriginalView.y) // clip the selection
 		{
 			Item.m_HitRect.h -= gs_ListBoxOriginalView.y-Item.m_HitRect.y;
 			Item.m_HitRect.y = gs_ListBoxOriginalView.y;
diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp
index 2eddd8a..901e579 100644
--- a/src/game/client/components/players.cpp
+++ b/src/game/client/components/players.cpp
@@ -274,7 +274,12 @@ void CPlayers::RenderPlayer(
 	bool WantOtherDir = (Player.m_Direction == -1 && Vel.x > 0) || (Player.m_Direction == 1 && Vel.x < 0);
 
 	// evaluate animation
-	float WalkTime = fmod(absolute(Position.x), 100.0f)/100.0f;
+	const float WalkTimeMagic = 100.0f;
+	float WalkTime =
+		((Position.x >= 0)
+			? fmod(Position.x, WalkTimeMagic)
+			: WalkTimeMagic - fmod(-Position.x, WalkTimeMagic))
+		/ WalkTimeMagic;
 	CAnimState State;
 	State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0);
 
diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp
index f9b8b67..77187b5 100644
--- a/src/game/client/gameclient.cpp
+++ b/src/game/client/gameclient.cpp
@@ -477,25 +477,7 @@ void CGameClient::OnRelease()
 void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
 {
 	// special messages
-	if(MsgId == NETMSGTYPE_SV_EXTRAPROJECTILE)
-	{
-		int Num = pUnpacker->GetInt();
-
-		for(int k = 0; k < Num; k++)
-		{
-			CNetObj_Projectile Proj;
-			for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
-				((int *)&Proj)[i] = pUnpacker->GetInt();
-
-			if(pUnpacker->Error())
-				return;
-
-			g_GameClient.m_pItems->AddExtraProjectile(&Proj);
-		}
-
-		return;
-	}
-	else if(MsgId == NETMSGTYPE_SV_TUNEPARAMS)
+	if(MsgId == NETMSGTYPE_SV_TUNEPARAMS)
 	{
 		// unpack the new tuning
 		CTuningParams NewTuning;
diff --git a/src/game/collision.h b/src/game/collision.h
index d16f2d5..cad75bb 100644
--- a/src/game/collision.h
+++ b/src/game/collision.h
@@ -25,9 +25,9 @@ public:
 
 	CCollision();
 	void Init(class CLayers *pLayers);
-	bool CheckPoint(float x, float y) { return IsTileSolid(round(x), round(y)); }
+	bool CheckPoint(float x, float y) { return IsTileSolid(round_to_int(x), round_to_int(y)); }
 	bool CheckPoint(vec2 Pos) { return CheckPoint(Pos.x, Pos.y); }
-	int GetCollisionAt(float x, float y) { return GetTile(round(x), round(y)); }
+	int GetCollisionAt(float x, float y) { return GetTile(round_to_int(x), round_to_int(y)); }
 	int GetWidth() { return m_Width; };
 	int GetHeight() { return m_Height; };
 	int IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision);
diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp
index 5e8c240..3e12c0d 100644
--- a/src/game/editor/editor.cpp
+++ b/src/game/editor/editor.cpp
@@ -164,35 +164,42 @@ int CLayerGroup::SwapLayers(int Index0, int Index1)
 
 void CEditorImage::AnalyseTileFlags()
 {
-	mem_zero(m_aTileFlags, sizeof(m_aTileFlags));
-
-	int tw = m_Width/16; // tilesizes
-	int th = m_Height/16;
-	if ( tw == th )
+	if(m_Format == CImageInfo::FORMAT_RGB)
 	{
-		unsigned char *pPixelData = (unsigned char *)m_pData;
+		for(int i = 0; i < 256; ++i)
+			m_aTileFlags[i] = TILEFLAG_OPAQUE;
+	}
+	else
+	{
+		mem_zero(m_aTileFlags, sizeof(m_aTileFlags));
 
-		int TileID = 0;
-		for(int ty = 0; ty < 16; ty++)
-			for(int tx = 0; tx < 16; tx++, TileID++)
-			{
-				bool Opaque = true;
-				for(int x = 0; x < tw; x++)
-					for(int y = 0; y < th; y++)
-					{
-						int p = (ty*tw+y)*m_Width + tx*tw+x;
-						if(pPixelData[p*4+3] < 250)
+		int tw = m_Width/16; // tilesizes
+		int th = m_Height/16;
+		if(tw == th)
+		{
+			unsigned char *pPixelData = (unsigned char *)m_pData;
+
+			int TileID = 0;
+			for(int ty = 0; ty < 16; ty++)
+				for(int tx = 0; tx < 16; tx++, TileID++)
+				{
+					bool Opaque = true;
+					for(int x = 0; x < tw; x++)
+						for(int y = 0; y < th; y++)
 						{
-							Opaque = false;
-							break;
+							int p = (ty*tw+y)*m_Width + tx*tw+x;
+							if(pPixelData[p*4+3] < 250)
+							{
+								Opaque = false;
+								break;
+							}
 						}
-					}
 
-				if(Opaque)
-					m_aTileFlags[TileID] |= TILEFLAG_OPAQUE;
-			}
+					if(Opaque)
+						m_aTileFlags[TileID] |= TILEFLAG_OPAQUE;
+				}
+		}
 	}
-
 }
 
 void CEditor::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser)
@@ -613,7 +620,7 @@ int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, in
 
 	if(UI()->ActiveItem() == pID)
 	{
-		if(!UI()->MouseButton(0))
+		if(!UI()->MouseButton(0) || Input()->KeyDown(KEY_ESCAPE))
 		{
 			m_LockMouse = false;
 			UI()->SetActiveItem(0);
diff --git a/src/game/editor/io.cpp b/src/game/editor/io.cpp
index 641ec81..9a10615 100644
--- a/src/game/editor/io.cpp
+++ b/src/game/editor/io.cpp
@@ -255,7 +255,7 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName)
 		pImg->AnalyseTileFlags();
 
 		CMapItemImage Item;
-		Item.m_Version = 1;
+		Item.m_Version = CMapItemImage::CURRENT_VERSION;
 
 		Item.m_Width = pImg->m_Width;
 		Item.m_Height = pImg->m_Height;
@@ -264,7 +264,11 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName)
 		if(pImg->m_External)
 			Item.m_ImageData = -1;
 		else
-			Item.m_ImageData = df.AddData(Item.m_Width*Item.m_Height*4, pImg->m_pData);
+		{
+			int PixelSize = pImg->m_Format == CImageInfo::FORMAT_RGB ? 3 : 4;
+			Item.m_ImageData = df.AddData(Item.m_Width*Item.m_Height*PixelSize, pImg->m_pData);
+		}
+		Item.m_Format = pImg->m_Format;
 		df.AddItem(MAPITEMTYPE_IMAGE, i, sizeof(Item), &Item);
 	}
 
@@ -470,7 +474,7 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag
 				CEditorImage *pImg = new CEditorImage(m_pEditor);
 				pImg->m_External = pItem->m_External;
 
-				if(pItem->m_External)
+				if(pItem->m_External || (pItem->m_Version > 1 && pItem->m_Format != CImageInfo::FORMAT_RGB && pItem->m_Format != CImageInfo::FORMAT_RGBA))
 				{
 					char aBuf[256];
 					str_format(aBuf, sizeof(aBuf),"mapres/%s.png", pName);
@@ -489,12 +493,13 @@ int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int Storag
 				{
 					pImg->m_Width = pItem->m_Width;
 					pImg->m_Height = pItem->m_Height;
-					pImg->m_Format = CImageInfo::FORMAT_RGBA;
+					pImg->m_Format = pItem->m_Version == 1 ? CImageInfo::FORMAT_RGBA : pItem->m_Format;
+					int PixelSize = pImg->m_Format == CImageInfo::FORMAT_RGB ? 3 : 4;
 
 					// copy image data
 					void *pData = DataFile.GetData(pItem->m_ImageData);
-					pImg->m_pData = mem_alloc(pImg->m_Width*pImg->m_Height*4, 1);
-					mem_copy(pImg->m_pData, pData, pImg->m_Width*pImg->m_Height*4);
+					pImg->m_pData = mem_alloc(pImg->m_Width*pImg->m_Height*PixelSize, 1);
+					mem_copy(pImg->m_pData, pData, pImg->m_Width*pImg->m_Height*PixelSize);
 					pImg->m_TexID = m_pEditor->Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, pImg->m_Format, pImg->m_pData, CImageInfo::FORMAT_AUTO, 0);
 				}
 
diff --git a/src/game/editor/layer_tiles.cpp b/src/game/editor/layer_tiles.cpp
index 032f391..0cdd760 100644
--- a/src/game/editor/layer_tiles.cpp
+++ b/src/game/editor/layer_tiles.cpp
@@ -248,7 +248,7 @@ void CLayerTiles::BrushFlipY()
 
 void CLayerTiles::BrushRotate(float Amount)
 {
-	int Rotation = (round(360.0f*Amount/(pi*2))/90)%4;	// 0=0�, 1=90�, 2=180�, 3=270�
+	int Rotation = (round_to_int(360.0f*Amount/(pi*2))/90)%4;	// 0=0�, 1=90�, 2=180�, 3=270�
 	if(Rotation < 0)
 		Rotation +=4;
 
diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp
index f281c6a..91736a3 100644
--- a/src/game/editor/popups.cpp
+++ b/src/game/editor/popups.cpp
@@ -75,10 +75,16 @@ void CEditor::UiDoPopupMenu()
 		r.Margin(4.0f, &r);
 
 		if(s_UiPopups[i].m_pfnFunc(this, r))
+		{
 			g_UiNumPopups--;
+			UI()->SetActiveItem(0);
+		}
 
 		if(Input()->KeyDown(KEY_ESCAPE))
+		{
 			g_UiNumPopups--;
+			UI()->SetActiveItem(0);
+		}
 	}
 }
 
diff --git a/src/game/gamecore.cpp b/src/game/gamecore.cpp
index d43492a..a325a53 100644
--- a/src/game/gamecore.cpp
+++ b/src/game/gamecore.cpp
@@ -401,17 +401,17 @@ void CCharacterCore::Move()
 
 void CCharacterCore::Write(CNetObj_CharacterCore *pObjCore)
 {
-	pObjCore->m_X = round(m_Pos.x);
-	pObjCore->m_Y = round(m_Pos.y);
+	pObjCore->m_X = round_to_int(m_Pos.x);
+	pObjCore->m_Y = round_to_int(m_Pos.y);
 
-	pObjCore->m_VelX = round(m_Vel.x*256.0f);
-	pObjCore->m_VelY = round(m_Vel.y*256.0f);
+	pObjCore->m_VelX = round_to_int(m_Vel.x*256.0f);
+	pObjCore->m_VelY = round_to_int(m_Vel.y*256.0f);
 	pObjCore->m_HookState = m_HookState;
 	pObjCore->m_HookTick = m_HookTick;
-	pObjCore->m_HookX = round(m_HookPos.x);
-	pObjCore->m_HookY = round(m_HookPos.y);
-	pObjCore->m_HookDx = round(m_HookDir.x*256.0f);
-	pObjCore->m_HookDy = round(m_HookDir.y*256.0f);
+	pObjCore->m_HookX = round_to_int(m_HookPos.x);
+	pObjCore->m_HookY = round_to_int(m_HookPos.y);
+	pObjCore->m_HookDx = round_to_int(m_HookDir.x*256.0f);
+	pObjCore->m_HookDy = round_to_int(m_HookDir.y*256.0f);
 	pObjCore->m_HookedPlayer = m_HookedPlayer;
 	pObjCore->m_Jumped = m_Jumped;
 	pObjCore->m_Direction = m_Direction;
diff --git a/src/game/mapitems.h b/src/game/mapitems.h
index e1dda4e..e88388e 100644
--- a/src/game/mapitems.h
+++ b/src/game/mapitems.h
@@ -99,7 +99,7 @@ struct CMapItemInfo
 	int m_License;
 } ;
 
-struct CMapItemImage
+struct CMapItemImage_v1
 {
 	int m_Version;
 	int m_Width;
@@ -109,6 +109,12 @@ struct CMapItemImage
 	int m_ImageData;
 } ;
 
+struct CMapItemImage : public CMapItemImage_v1
+{
+	enum { CURRENT_VERSION=2 };
+	int m_Format;
+};
+
 struct CMapItemGroup_v1
 {
 	int m_Version;
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp
index 6794429..33699ee 100644
--- a/src/game/server/entities/character.cpp
+++ b/src/game/server/entities/character.cpp
@@ -333,17 +333,6 @@ void CCharacter::FireWeapon()
 				(int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GunLifetime),
 				1, 0, 0, -1, WEAPON_GUN);
 
-			// pack the Projectile and send it to the client Directly
-			CNetObj_Projectile p;
-			pProj->FillInfo(&p);
-
-			CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE);
-			Msg.AddInt(1);
-			for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
-				Msg.AddInt(((int *)&p)[i]);
-
-			Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID());
-
 			GameServer()->CreateSound(m_Pos, SOUND_GUN_FIRE);
 		} break;
 
@@ -351,9 +340,6 @@ void CCharacter::FireWeapon()
 		{
 			int ShotSpread = 2;
 
-			CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE);
-			Msg.AddInt(ShotSpread*2+1);
-
 			for(int i = -ShotSpread; i <= ShotSpread; ++i)
 			{
 				float Spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f};
@@ -367,17 +353,8 @@ void CCharacter::FireWeapon()
 					vec2(cosf(a), sinf(a))*Speed,
 					(int)(Server()->TickSpeed()*GameServer()->Tuning()->m_ShotgunLifetime),
 					1, 0, 0, -1, WEAPON_SHOTGUN);
-
-				// pack the Projectile and send it to the client Directly
-				CNetObj_Projectile p;
-				pProj->FillInfo(&p);
-
-				for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
-					Msg.AddInt(((int *)&p)[i]);
 			}
 
-			Server()->SendMsg(&Msg, 0,m_pPlayer->GetCID());
-
 			GameServer()->CreateSound(m_Pos, SOUND_SHOTGUN_FIRE);
 		} break;
 
@@ -390,16 +367,6 @@ void CCharacter::FireWeapon()
 				(int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GrenadeLifetime),
 				1, true, 0, SOUND_GRENADE_EXPLODE, WEAPON_GRENADE);
 
-			// pack the Projectile and send it to the client Directly
-			CNetObj_Projectile p;
-			pProj->FillInfo(&p);
-
-			CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE);
-			Msg.AddInt(1);
-			for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
-				Msg.AddInt(((int *)&p)[i]);
-			Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID());
-
 			GameServer()->CreateSound(m_Pos, SOUND_GRENADE_FIRE);
 		} break;
 
diff --git a/src/game/server/entity.cpp b/src/game/server/entity.cpp
index 788c3f4..3b47e02 100644
--- a/src/game/server/entity.cpp
+++ b/src/game/server/entity.cpp
@@ -51,6 +51,6 @@ int CEntity::NetworkClipped(int SnappingClient, vec2 CheckPos)
 
 bool CEntity::GameLayerClipped(vec2 CheckPos)
 {
-	return round(CheckPos.x)/32 < -200 || round(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 ||
-			round(CheckPos.y)/32 < -200 || round(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false;
+	return round_to_int(CheckPos.x)/32 < -200 || round_to_int(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 ||
+			round_to_int(CheckPos.y)/32 < -200 || round_to_int(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false;
 }
diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp
index f1c5335..897e348 100644
--- a/src/game/server/gamecontext.cpp
+++ b/src/game/server/gamecontext.cpp
@@ -1067,11 +1067,7 @@ void CGameContext::ConTuneDump(IConsole::IResult *pResult, void *pUserData)
 void CGameContext::ConPause(IConsole::IResult *pResult, void *pUserData)
 {
 	CGameContext *pSelf = (CGameContext *)pUserData;
-
-	if(pSelf->m_pController->IsGameOver())
-		return;
-
-	pSelf->m_World.m_Paused ^= 1;
+	pSelf->m_pController->TogglePause();
 }
 
 void CGameContext::ConChangeMap(IConsole::IResult *pResult, void *pUserData)
diff --git a/src/game/server/gamecontroller.cpp b/src/game/server/gamecontroller.cpp
index 0ee250e..68e5508 100644
--- a/src/game/server/gamecontroller.cpp
+++ b/src/game/server/gamecontroller.cpp
@@ -18,6 +18,7 @@ IGameController::IGameController(class CGameContext *pGameServer)
 
 	//
 	DoWarmup(g_Config.m_SvWarmup);
+	m_UnpauseTimer = 0;
 	m_GameOverTick = -1;
 	m_SuddenDeath = 0;
 	m_RoundStartTick = Server()->Tick();
@@ -376,6 +377,30 @@ void IGameController::DoWarmup(int Seconds)
 		m_Warmup = Seconds*Server()->TickSpeed();
 }
 
+void IGameController::TogglePause()
+{
+	if(IsGameOver())
+		return;
+
+	if(GameServer()->m_World.m_Paused)
+	{
+		// unpause
+		if(g_Config.m_SvUnpauseTimer > 0)
+			m_UnpauseTimer = g_Config.m_SvUnpauseTimer*Server()->TickSpeed();
+		else
+		{
+			GameServer()->m_World.m_Paused = false;
+			m_UnpauseTimer = 0;
+		}
+	}
+	else
+	{
+		// pause
+		GameServer()->m_World.m_Paused = true;
+		m_UnpauseTimer = 0;
+	}
+}
+
 bool IGameController::IsFriendlyFire(int ClientID1, int ClientID2)
 {
 	if(ClientID1 == ClientID2)
@@ -412,7 +437,7 @@ bool IGameController::CanBeMovedOnBalance(int ClientID)
 void IGameController::Tick()
 {
 	// do warmup
-	if(m_Warmup)
+	if(!GameServer()->m_World.m_Paused && m_Warmup)
 	{
 		m_Warmup--;
 		if(!m_Warmup)
@@ -429,6 +454,12 @@ void IGameController::Tick()
 			m_RoundCount++;
 		}
 	}
+	else if(GameServer()->m_World.m_Paused && m_UnpauseTimer)
+	{
+		--m_UnpauseTimer;
+		if(!m_UnpauseTimer)
+			GameServer()->m_World.m_Paused = false;
+	}
 
 	// game is Paused
 	if(GameServer()->m_World.m_Paused)
@@ -561,7 +592,7 @@ void IGameController::Snap(int SnappingClient)
 	if(GameServer()->m_World.m_Paused)
 		pGameInfoObj->m_GameStateFlags |= GAMESTATEFLAG_PAUSED;
 	pGameInfoObj->m_RoundStartTick = m_RoundStartTick;
-	pGameInfoObj->m_WarmupTimer = m_Warmup;
+	pGameInfoObj->m_WarmupTimer = GameServer()->m_World.m_Paused ? m_UnpauseTimer : m_Warmup;
 
 	pGameInfoObj->m_ScoreLimit = g_Config.m_SvScorelimit;
 	pGameInfoObj->m_TimeLimit = g_Config.m_SvTimelimit;
diff --git a/src/game/server/gamecontroller.h b/src/game/server/gamecontroller.h
index 1675fe3..66ff1dc 100644
--- a/src/game/server/gamecontroller.h
+++ b/src/game/server/gamecontroller.h
@@ -54,6 +54,7 @@ protected:
 	int m_aTeamscore[2];
 
 	int m_Warmup;
+	int m_UnpauseTimer;
 	int m_RoundCount;
 
 	int m_GameFlags;
@@ -72,6 +73,7 @@ public:
 	virtual void DoWincheck();
 
 	void DoWarmup(int Seconds);
+	void TogglePause();
 
 	void StartRound();
 	void EndRound();
diff --git a/src/game/variables.h b/src/game/variables.h
index e57a095..1cc329a 100644
--- a/src/game/variables.h
+++ b/src/game/variables.h
@@ -57,6 +57,7 @@ MACRO_CONFIG_INT(GfxNoclip, gfx_noclip, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "D
 
 // server
 MACRO_CONFIG_INT(SvWarmup, sv_warmup, 0, 0, 0, CFGFLAG_SERVER, "Number of seconds to do warmup before round starts")
+MACRO_CONFIG_INT(SvUnpauseTimer, sv_unpause_timer, 0, 0, 0, CFGFLAG_SERVER, "Number of seconds till the game continues")
 MACRO_CONFIG_STR(SvMotd, sv_motd, 900, "", CFGFLAG_SERVER, "Message of the day to display for the clients")
 MACRO_CONFIG_INT(SvTeamdamage, sv_teamdamage, 0, 0, 1, CFGFLAG_SERVER, "Team damage")
 MACRO_CONFIG_STR(SvMaprotation, sv_maprotation, 768, "", CFGFLAG_SERVER, "Maps to rotate between")
diff --git a/src/game/version.h b/src/game/version.h
index 6634d55..1d386ca 100644
--- a/src/game/version.h
+++ b/src/game/version.h
@@ -3,7 +3,7 @@
 #ifndef GAME_VERSION_H
 #define GAME_VERSION_H
 #include "generated/nethash.cpp"
-#define GAME_VERSION "0.6.3"
+#define GAME_VERSION "0.6.4"
 #define GAME_NETVERSION "0.6 " GAME_NETVERSION_HASH
-static const char GAME_RELEASE_VERSION[8] = {'0', '.', '6', '.', '2', 0};
+static const char GAME_RELEASE_VERSION[8] = {'0', '.', '6', '.', '4', 0};
 #endif
diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp
index 1098123..eee3050 100644
--- a/src/mastersrv/mastersrv.cpp
+++ b/src/mastersrv/mastersrv.cpp
@@ -117,7 +117,7 @@ void BuildPackets()
 			}
 			else
 			{
-				static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
+				static unsigned char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
 
 				mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, IPV4Mapping, sizeof(IPV4Mapping));
 				m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[12] = pCurrent->m_Address.ip[0];
diff --git a/src/tools/crapnet.cpp b/src/tools/crapnet.cpp
index fbd2044..9979d00 100644
--- a/src/tools/crapnet.cpp
+++ b/src/tools/crapnet.cpp
@@ -42,10 +42,10 @@ static int m_ConfigInterval = 10; // seconds between different pingconfigs
 static int m_ConfigLog = 0;
 static int m_ConfigReorder = 0;
 
-void Run(int Port, NETADDR Dest)
+void Run(unsigned short Port, NETADDR Dest)
 {
 	NETADDR Src = {NETTYPE_IPV4, {0,0,0,0}, Port};
-	NETSOCKET Socket = net_udp_create(Src);
+	NETSOCKET Socket = net_udp_create(Src, 0);
 
 	char aBuffer[1024*2];
 	int ID = 0;
diff --git a/src/tools/packetgen.cpp b/src/tools/packetgen.cpp
index 9b52aad..0d3f5c0 100644
--- a/src/tools/packetgen.cpp
+++ b/src/tools/packetgen.cpp
@@ -11,7 +11,7 @@ void Run(NETADDR Dest)
 	for(int i = 0; i < NUM_SOCKETS; i++)
 	{
 		NETADDR BindAddr = {NETTYPE_IPV4, {0}, 0};
-	 	aSockets[i] = net_udp_create(BindAddr);
+	 	aSockets[i] = net_udp_create(BindAddr, 0);
 	}
 
 	while(1)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/teeworlds.git



More information about the Pkg-games-commits mailing list