Merge branch 'master' into pr/317

This commit is contained in:
H-M-H 2015-11-15 00:05:04 +01:00
commit 8d9dd65f0b
53 changed files with 561 additions and 476 deletions

View file

@ -12,8 +12,10 @@ Building
To compile DDNet yourself, you can follow the [instructions for compiling Teeworlds](https://www.teeworlds.com/?page=docs&wiki=compiling_everything). To compile DDNet yourself, you can follow the [instructions for compiling Teeworlds](https://www.teeworlds.com/?page=docs&wiki=compiling_everything).
DDNet requires additional libraries, that are bundled for the most common platforms (Windows, Mac, Linux, all x86 and x86_64). Instead you can install these libraries on your system, remove the `config.lua` and `bam` should use the system-wide libraries by default: `libcurl, libogg, libopus, libopusfile` DDNet requires additional libraries, that are bundled for the most common platforms (Windows, Mac, Linux, all x86 and x86_64). Instead you can install these libraries on your system, remove the `config.lua` and `bam` should use the system-wide libraries by default. You can install all required dependencies on Debian and Ubuntu like this:
apt-get install libsdl1.2-dev libfreetype6-dev libcurl4-openssl-dev libogg-dev libopus-dev libopusfile-dev
If you have the libraries installed, but still want to use the bundled ones instead, you can specify so by running `bam config curl.use_pkgconfig=false opus.use_pkgconfig=false opusfile.use_pkgconfig=false ogg.use_pkgconfig=false`. If you have the libraries installed, but still want to use the bundled ones instead, you can specify so by running `bam config curl.use_pkgconfig=false opus.use_pkgconfig=false opusfile.use_pkgconfig=false ogg.use_pkgconfig=false`.
The MySQL server is not included in the binary releases and can be built with `bam server_sql_release`. It requires `libmariadbclient-dev` and `libmysqlcppconn-dev`, which are also bundled for the common platforms. The MySQL server is not included in the binary releases and can be built with `bam server_sql_release`. It requires `libmariadbclient-dev`, `libmysqlcppconn-dev` and `libboost-dev`, which are also bundled for the common platforms.

View file

@ -26,6 +26,9 @@ sv_rcon_password ""
# rcon (F2) password for moderator. If you don't set one, none exists. # rcon (F2) password for moderator. If you don't set one, none exists.
sv_rcon_mod_password "" sv_rcon_mod_password ""
# rcon (F2) password for helper. If you don't set one, none exists.
sv_rcon_helper_password ""
# Map to start server with # Map to start server with
sv_map "Kobra 4" sv_map "Kobra 4"
@ -137,36 +140,47 @@ add_vote "Option: Shutdown server" "shutdown"
# ADDITIONAL COMMANDS PERMISSIONS # ADDITIONAL COMMANDS PERMISSIONS
# ------------------------------- # -------------------------------
# You can see all commands which are accessible for moderators by using "mod_status" # You can see all commands which are accessible for specific authentication-levels by using "access_status"
# and "user_status" for normal players # Format: acces_status [0: admin, 1: moderator, 2: helper or 3: user]
# #
# Format: mod_command [command] [0 or 1] # Format: access_level [command] [0: admin, 1: moderator, 2: helper or 3: user]
# Where 0 means no permissions to use, and 1 gives access to command # Where 0 means only accessible for admin, 1 gives access to moderator and 2 gives access to helper
# Example: mod_command ban 1 # Example: mod_command ban 1
# Non-default commands to which moderator will have access # Non-default commands to which moderators and helpers will have access
mod_command left 1 access_level left 2
mod_command right 1 access_level right 2
mod_command up 1 access_level up 2
mod_command down 1 access_level down 2
mod_command super 1 access_level super 2
mod_command unsuper 1 access_level unsuper 2
mod_command tele 1 access_level tele 2
mod_command totele 1 access_level totele 2
mod_command totelecp 1 access_level totelecp 2
mod_command logout 1 access_level logout 2
mod_command ninja 1 access_level ninja 2
mod_command grenade 1 access_level grenade 2
mod_command shotgun 1 access_level shotgun 2
mod_command rifle 1 access_level rifle 2
mod_command weapons 1 access_level weapons 2
mod_command unweapons 1 access_level unweapons 2
mod_command unrifle 1 access_level unrifle 2
mod_command unshotgun 1 access_level unshotgun 2
mod_command ungrenade 1 access_level ungrenade 2
mod_command unsolo 1 access_level unsolo 2
mod_command undeep 1 access_level undeep 2
mod_command status 1 access_level status 2
# commands for moderators only
access_level ban 1
access_level unban 1
access_level ban_range 1
access_level unban_range 1
access_level unban_all 1
access_level bans 1
access_level bans_save 1
access_level kick 1
access_level force_vote 1

110
bam.lua
View file

@ -1,5 +1,18 @@
CheckVersion("0.4") CheckVersion("0.4")
target_family = os.getenv("TARGET_FAMILY")
if target_family then
family = target_family
end
target_platform = os.getenv("TARGET_PLATFORM")
if target_platform then
platform = target_platform
end
target_arch = os.getenv("TARGET_ARCH")
if target_arch then
arch = target_arch
end
Import("configure.lua") Import("configure.lua")
Import("other/sdl/sdl.lua") Import("other/sdl/sdl.lua")
Import("other/freetype/freetype.lua") Import("other/freetype/freetype.lua")
@ -28,7 +41,7 @@ config:Finalize("config.lua")
-- data compiler -- data compiler
function Script(name) function Script(name)
if family == "windows" then if family == "windows" and target_family ~= "windows" then
return str_replace(name, "/", "\\") return str_replace(name, "/", "\\")
end end
return "python " .. name return "python " .. name
@ -67,14 +80,20 @@ DuplicateDirectoryStructure("src", "src", "objs")
]] ]]
function ResCompile(scriptfile) function ResCompile(scriptfile)
windres = os.getenv("WINDRES")
if not windres then
windres = "windres"
end
scriptfile = Path(scriptfile) scriptfile = Path(scriptfile)
if config.compiler.driver == "cl" then if config.compiler.driver == "cl" then
output = PathBase(scriptfile) .. ".res" output = PathBase(scriptfile) .. ".res"
AddJob(output, "rc " .. scriptfile, "rc /fo " .. output .. " " .. scriptfile) AddJob(output, "rc " .. scriptfile, "rc /fo " .. output .. " " .. scriptfile)
elseif config.compiler.driver == "gcc" then elseif config.compiler.driver == "gcc" then
output = PathBase(scriptfile) .. ".coff" output = PathBase(scriptfile) .. ".coff"
AddJob(output, "windres " .. scriptfile, "windres -i " .. scriptfile .. " -o " .. output) AddJob(output, windres .. " " .. scriptfile, windres .. " -i " .. scriptfile .. " -o " .. output)
end end
AddDependency(output, scriptfile) AddDependency(output, scriptfile)
return output return output
end end
@ -128,36 +147,37 @@ server_sql_depends = {}
if family == "windows" then if family == "windows" then
if platform == "win32" then if platform == "win32" then
table.insert(client_depends, CopyToDirectory(".", "other\\freetype\\lib32\\freetype.dll")) table.insert(client_depends, CopyToDirectory(".", "other/freetype/lib32/freetype.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\sdl\\lib32\\SDL.dll")) table.insert(client_depends, CopyToDirectory(".", "other/sdl/lib32/SDL.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib32\\libcurl.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib32/libcurl.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib32\\libeay32.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib32/libeay32.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib32\\libidn-11.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib32/libidn-11.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib32\\ssleay32.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib32/ssleay32.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib32\\zlib1.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib32/zlib1.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib32\\libgcc_s_sjlj-1.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib32/libwinpthread-1.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib32\\libogg-0.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib32/libgcc_s_sjlj-1.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib32\\libopus-0.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib32/libogg-0.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib32\\libopusfile-0.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib32/libopus-0.dll"))
table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib32/libopusfile-0.dll"))
else else
table.insert(client_depends, CopyToDirectory(".", "other\\freetype\\lib64\\freetype.dll")) table.insert(client_depends, CopyToDirectory(".", "other/freetype/lib64/freetype.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\sdl\\lib64\\SDL.dll")) table.insert(client_depends, CopyToDirectory(".", "other/sdl/lib64/SDL.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib64\\libcurl.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib64/libcurl.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib64\\libeay32.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib64/libeay32.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib64\\ssleay32.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib64/ssleay32.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\curl\\windows\\lib64\\zlib1.dll")) table.insert(client_depends, CopyToDirectory(".", "other/curl/windows/lib64/zlib1.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib64\\libwinpthread-1.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib64/libwinpthread-1.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib64\\libgcc_s_seh-1.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib64/libgcc_s_seh-1.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib64\\libogg-0.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib64/libogg-0.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib64\\libopus-0.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib64/libopus-0.dll"))
table.insert(client_depends, CopyToDirectory(".", "other\\opus\\windows\\lib64\\libopusfile-0.dll")) table.insert(client_depends, CopyToDirectory(".", "other/opus/windows/lib64/libopusfile-0.dll"))
end end
table.insert(server_sql_depends, CopyToDirectory(".", "other\\mysql\\vc2005libs\\mysqlcppconn.dll")) table.insert(server_sql_depends, CopyToDirectory(".", "other/mysql/vc2005libs/mysqlcppconn.dll"))
table.insert(server_sql_depends, CopyToDirectory(".", "other\\mysql\\vc2005libs\\libmysql.dll")) table.insert(server_sql_depends, CopyToDirectory(".", "other/mysql/vc2005libs/libmysql.dll"))
if config.compiler.driver == "cl" then if config.compiler.driver == "cl" then
client_link_other = {ResCompile("other/icons/teeworlds_cl.rc")} client_link_other = {ResCompile("other/icons/teeworlds_cl.rc")}
@ -175,13 +195,20 @@ end
function build(settings) function build(settings)
-- apply compiler settings -- apply compiler settings
config.compiler:Apply(settings) config.compiler:Apply(settings)
--settings.objdir = Path("objs") --settings.objdir = Path("objs")
settings.cc.Output = Intermediate_Output settings.cc.Output = Intermediate_Output
--settings.cc.flags:Add("-m32") cc = os.getenv("CC")
--settings.link.flags:Add("-m32") if cc then
settings.cc.exe_c = cc
end
cxx = os.getenv("CXX")
if cxx then
settings.cc.exe_cxx = cxx
settings.link.exe = cxx
settings.dll.exe = cxx
end
cflags = os.getenv("CFLAGS") cflags = os.getenv("CFLAGS")
if cflags then if cflags then
settings.cc.flags:Add(cflags) settings.cc.flags:Add(cflags)
@ -228,14 +255,12 @@ function build(settings)
if platform == "macosx" then if platform == "macosx" then
settings.link.frameworks:Add("Carbon") settings.link.frameworks:Add("Carbon")
settings.link.frameworks:Add("AppKit") settings.link.frameworks:Add("AppKit")
settings.link.libs:Add("dl")
settings.link.libs:Add("crypto") settings.link.libs:Add("crypto")
else else
settings.link.libs:Add("pthread") settings.link.libs:Add("pthread")
settings.link.libs:Add("dl")
settings.link.libs:Add("rt") settings.link.libs:Add("rt")
end end
if platform == "solaris" then if platform == "solaris" then
settings.link.flags:Add("-lsocket") settings.link.flags:Add("-lsocket")
settings.link.flags:Add("-lnsl") settings.link.flags:Add("-lnsl")
@ -288,7 +313,6 @@ function build(settings)
client_settings.link.libs:Add("X11") client_settings.link.libs:Add("X11")
client_settings.link.libs:Add("GL") client_settings.link.libs:Add("GL")
client_settings.link.libs:Add("GLU") client_settings.link.libs:Add("GLU")
client_settings.link.libs:Add("dl")
end end
elseif family == "windows" then elseif family == "windows" then
@ -315,6 +339,13 @@ function build(settings)
config.opus:Apply(client_settings) config.opus:Apply(client_settings)
config.ogg:Apply(client_settings) config.ogg:Apply(client_settings)
if family == "unix" and (platform == "macosx" or platform == "linux") then
engine_settings.link.libs:Add("dl")
server_settings.link.libs:Add("dl")
client_settings.link.libs:Add("dl")
launcher_settings.link.libs:Add("dl")
end
engine = Compile(engine_settings, Collect("src/engine/shared/*.cpp", "src/base/*.c")) engine = Compile(engine_settings, Collect("src/engine/shared/*.cpp", "src/base/*.c"))
client = Compile(client_settings, Collect("src/engine/client/*.cpp")) client = Compile(client_settings, Collect("src/engine/client/*.cpp"))
server = Compile(server_settings, Collect("src/engine/server/*.cpp")) server = Compile(server_settings, Collect("src/engine/server/*.cpp"))
@ -336,7 +367,6 @@ function build(settings)
if platform == "macosx" then if platform == "macosx" then
notification_settings = client_settings:Copy() notification_settings = client_settings:Copy()
notification_settings.cc.flags:Add("-x objective-c++") notification_settings.cc.flags:Add("-x objective-c++")
notification_settings.cc.flags:Add("-I/System/Library/Frameworks/Foundation.framework/Versions/C/Headers")
client_notification = Compile(notification_settings, "src/osx/notification.m") client_notification = Compile(notification_settings, "src/osx/notification.m")
client_osxlaunch = Compile(client_settings, "src/osxlaunch/client.m") client_osxlaunch = Compile(client_settings, "src/osxlaunch/client.m")
server_osxlaunch = Compile(launcher_settings, "src/osxlaunch/server.m") server_osxlaunch = Compile(launcher_settings, "src/osxlaunch/server.m")
@ -434,14 +464,14 @@ if platform == "macosx" then
debug_sql_settings_ppc.cc.flags:Add("-arch ppc") debug_sql_settings_ppc.cc.flags:Add("-arch ppc")
debug_sql_settings_ppc.link.flags:Add("-arch ppc") debug_sql_settings_ppc.link.flags:Add("-arch ppc")
debug_sql_settings_ppc.cc.defines:Add("CONF_DEBUG", "CONF_SQL") debug_sql_settings_ppc.cc.defines:Add("CONF_DEBUG", "CONF_SQL")
release_settings_ppc = release_settings:Copy() release_settings_ppc = release_settings:Copy()
release_settings_ppc.config_name = "release_ppc" release_settings_ppc.config_name = "release_ppc"
release_settings_ppc.config_ext = "_ppc" release_settings_ppc.config_ext = "_ppc"
release_settings_ppc.cc.flags:Add("-arch ppc") release_settings_ppc.cc.flags:Add("-arch ppc")
release_settings_ppc.link.flags:Add("-arch ppc") release_settings_ppc.link.flags:Add("-arch ppc")
release_settings_ppc.cc.defines:Add("CONF_RELEASE") release_settings_ppc.cc.defines:Add("CONF_RELEASE")
release_sql_settings_ppc = release_sql_settings:Copy() release_sql_settings_ppc = release_sql_settings:Copy()
release_sql_settings_ppc.config_name = "sql_release_ppc" release_sql_settings_ppc.config_name = "sql_release_ppc"
release_sql_settings_ppc.config_ext = "_sql_ppc" release_sql_settings_ppc.config_ext = "_sql_ppc"
@ -475,7 +505,7 @@ if platform == "macosx" then
release_settings_x86.cc.flags:Add("-arch i386") release_settings_x86.cc.flags:Add("-arch i386")
release_settings_x86.link.flags:Add("-arch i386") release_settings_x86.link.flags:Add("-arch i386")
release_settings_x86.cc.defines:Add("CONF_RELEASE") release_settings_x86.cc.defines:Add("CONF_RELEASE")
release_sql_settings_x86 = release_sql_settings:Copy() release_sql_settings_x86 = release_sql_settings:Copy()
release_sql_settings_x86.config_name = "sql_release_x86" release_sql_settings_x86.config_name = "sql_release_x86"
release_sql_settings_x86.config_ext = "_sql_x86" release_sql_settings_x86.config_ext = "_sql_x86"
@ -510,7 +540,7 @@ if platform == "macosx" then
release_settings_x86_64.cc.flags:Add("-arch x86_64") release_settings_x86_64.cc.flags:Add("-arch x86_64")
release_settings_x86_64.link.flags:Add("-arch x86_64") release_settings_x86_64.link.flags:Add("-arch x86_64")
release_settings_x86_64.cc.defines:Add("CONF_RELEASE") release_settings_x86_64.cc.defines:Add("CONF_RELEASE")
release_sql_settings_x86_64 = release_sql_settings:Copy() release_sql_settings_x86_64 = release_sql_settings:Copy()
release_sql_settings_x86_64.config_name = "sql_release_x86_64" release_sql_settings_x86_64.config_name = "sql_release_x86_64"
release_sql_settings_x86_64.config_ext = "_sql_x86_64" release_sql_settings_x86_64.config_ext = "_sql_x86_64"
@ -525,7 +555,7 @@ if platform == "macosx" then
end end
DefaultTarget("game_debug_x86") DefaultTarget("game_debug_x86")
if config.macosxppc.value == 1 then if config.macosxppc.value == 1 then
if arch == "ia32" then if arch == "ia32" then
PseudoTarget("release", ppc_r, x86_r) PseudoTarget("release", ppc_r, x86_r)

View file

@ -382,8 +382,8 @@ function OptCCompiler(name, default_driver, default_c, default_cxx, desc)
error(option.driver.." is not a known c/c++ compile driver") error(option.driver.." is not a known c/c++ compile driver")
end end
if option.c_compiler then settings.cc.c_compiler = option.c_compiler end if option.c_compiler then settings.cc.exe_c = option.c_compiler end
if option.cxx_compiler then settings.cc.cxx_compiler = option.cxx_compiler end if option.cxx_compiler then settings.cc.exe_cxx = option.cxx_compiler end
end end
local save = function(option, output) local save = function(option, output)

View file

@ -12,7 +12,7 @@ Curl = {
option.use_pkgconfig = true option.use_pkgconfig = true
end end
if ExecuteSilent("pkg-config libcurl") == 0 then if family ~= "windows" and ExecuteSilent("pkg-config libcurl") == 0 then
option.value = true option.value = true
if option.use_pkgconfig == nil then if option.use_pkgconfig == nil then
option.use_pkgconfig = true option.use_pkgconfig = true
@ -59,10 +59,9 @@ Curl = {
settings.link.libpath:Add("other/curl/mac/lib32") settings.link.libpath:Add("other/curl/mac/lib32")
elseif platform == "macosx" and string.find(settings.config_name, "64") then elseif platform == "macosx" and string.find(settings.config_name, "64") then
settings.link.libpath:Add("other/curl/mac/lib64") settings.link.libpath:Add("other/curl/mac/lib64")
elseif platform == "linux" and arch == "ia32" then elseif platform == "linux" then
settings.link.libpath:Add("other/curl/linux/lib32")
elseif platform == "linux" and arch == "amd64" then
settings.link.libpath:Add("other/curl/linux/lib64") settings.link.libpath:Add("other/curl/linux/lib64")
settings.link.libpath:Add("other/curl/linux/lib32")
end end
end end
end end

View file

@ -4,13 +4,13 @@ FreeType = {
OptFind = function (name, required) OptFind = function (name, required)
local check = function(option, settings) local check = function(option, settings)
option.value = false option.value = false
option.use_ftconfig = false option.use_pkgconfig = false
option.use_winlib = 0 option.use_winlib = 0
option.lib_path = nil option.lib_path = nil
if ExecuteSilent("freetype-config") > 0 and ExecuteSilent("freetype-config --cflags") == 0 then if family ~= "windows" and ExecuteSilent("pkg-config freetype2") == 0 then
option.value = true option.value = true
option.use_ftconfig = true option.use_pkgconfig = true
end end
if platform == "win32" then if platform == "win32" then
@ -26,9 +26,9 @@ FreeType = {
-- include path -- include path
settings.cc.includes:Add(FreeType.basepath .. "/include") settings.cc.includes:Add(FreeType.basepath .. "/include")
if option.use_ftconfig == true then if option.use_pkgconfig == true then
settings.cc.flags:Add("`freetype-config --cflags`") settings.cc.flags:Add("`pkg-config freetype2 --cflags`")
settings.link.flags:Add("`freetype-config --libs`") settings.link.flags:Add("`pkg-config freetype2 --libs`")
elseif option.use_winlib > 0 then elseif option.use_winlib > 0 then
if option.use_winlib == 32 then if option.use_winlib == 32 then
@ -42,13 +42,13 @@ FreeType = {
local save = function(option, output) local save = function(option, output)
output:option(option, "value") output:option(option, "value")
output:option(option, "use_ftconfig") output:option(option, "use_pkgconfig")
output:option(option, "use_winlib") output:option(option, "use_winlib")
end end
local display = function(option) local display = function(option)
if option.value == true then if option.value == true then
if option.use_ftconfig == true then return "using freetype-config" end if option.use_pkgconfig == true then return "using pkg-config" end
if option.use_winlib == 32 then return "using supplied win32 libraries" end if option.use_winlib == 32 then return "using supplied win32 libraries" end
if option.use_winlib == 64 then return "using supplied win64 libraries" end if option.use_winlib == 64 then return "using supplied win64 libraries" end
return "using unknown method" return "using unknown method"

View file

@ -57,10 +57,9 @@ Mysql = {
settings.link.libpath:Add("other/mysql/mac/lib32") settings.link.libpath:Add("other/mysql/mac/lib32")
elseif platform == "macosx" and string.find(settings.config_name, "64") then elseif platform == "macosx" and string.find(settings.config_name, "64") then
settings.link.libpath:Add("other/mysql/mac/lib64") settings.link.libpath:Add("other/mysql/mac/lib64")
elseif platform == "linux" and arch == "ia32" then elseif platform == "linux" then
settings.link.libpath:Add("other/mysql/linux/lib32")
elseif platform == "linux" and arch == "amd64" then
settings.link.libpath:Add("other/mysql/linux/lib64") settings.link.libpath:Add("other/mysql/linux/lib64")
settings.link.libpath:Add("other/mysql/linux/lib32")
end end
end end
end end

View file

@ -12,7 +12,7 @@ Ogg = {
option.use_pkgconfig = true option.use_pkgconfig = true
end end
if ExecuteSilent("pkg-config ogg") == 0 then if family ~= "windows" and ExecuteSilent("pkg-config ogg") == 0 then
option.value = true option.value = true
if option.use_pkgconfig == nil then if option.use_pkgconfig == nil then
option.use_pkgconfig = true option.use_pkgconfig = true
@ -58,10 +58,9 @@ Ogg = {
client_settings.link.libpath:Add("other/opus/mac/lib32") client_settings.link.libpath:Add("other/opus/mac/lib32")
elseif platform == "macosx" and string.find(settings.config_name, "64") then elseif platform == "macosx" and string.find(settings.config_name, "64") then
client_settings.link.libpath:Add("other/opus/mac/lib64") client_settings.link.libpath:Add("other/opus/mac/lib64")
elseif platform == "linux" and arch == "ia32" then elseif platform == "linux" then
client_settings.link.libpath:Add("other/opus/linux/lib32")
elseif platform == "linux" and arch == "amd64" then
client_settings.link.libpath:Add("other/opus/linux/lib64") client_settings.link.libpath:Add("other/opus/linux/lib64")
client_settings.link.libpath:Add("other/opus/linux/lib32")
end end
end end
end end

View file

@ -12,7 +12,7 @@ Opus = {
option.use_pkgconfig = true option.use_pkgconfig = true
end end
if ExecuteSilent("pkg-config opus") == 0 then if family ~= "windows" and ExecuteSilent("pkg-config opus") == 0 then
option.value = true option.value = true
if option.use_pkgconfig == nil then if option.use_pkgconfig == nil then
option.use_pkgconfig = true option.use_pkgconfig = true
@ -58,10 +58,9 @@ Opus = {
client_settings.link.libpath:Add("other/opus/mac/lib32") client_settings.link.libpath:Add("other/opus/mac/lib32")
elseif platform == "macosx" and string.find(settings.config_name, "64") then elseif platform == "macosx" and string.find(settings.config_name, "64") then
client_settings.link.libpath:Add("other/opus/mac/lib64") client_settings.link.libpath:Add("other/opus/mac/lib64")
elseif platform == "linux" and arch == "ia32" then elseif platform == "linux" then
client_settings.link.libpath:Add("other/opus/linux/lib32")
elseif platform == "linux" and arch == "amd64" then
client_settings.link.libpath:Add("other/opus/linux/lib64") client_settings.link.libpath:Add("other/opus/linux/lib64")
client_settings.link.libpath:Add("other/opus/linux/lib32")
end end
end end
end end

View file

@ -12,7 +12,7 @@ Opusfile = {
option.use_pkgconfig = true option.use_pkgconfig = true
end end
if ExecuteSilent("pkg-config opusfile") == 0 then if family ~= "windows" and ExecuteSilent("pkg-config opusfile") == 0 then
option.value = true option.value = true
if option.use_pkgconfig == nil then if option.use_pkgconfig == nil then
option.use_pkgconfig = true option.use_pkgconfig = true
@ -58,10 +58,9 @@ Opusfile = {
client_settings.link.libpath:Add("other/opus/mac/lib32") client_settings.link.libpath:Add("other/opus/mac/lib32")
elseif platform == "macosx" and string.find(settings.config_name, "64") then elseif platform == "macosx" and string.find(settings.config_name, "64") then
client_settings.link.libpath:Add("other/opus/mac/lib64") client_settings.link.libpath:Add("other/opus/mac/lib64")
elseif platform == "linux" and arch == "ia32" then elseif platform == "linux" then
client_settings.link.libpath:Add("other/opus/linux/lib32")
elseif platform == "linux" and arch == "amd64" then
client_settings.link.libpath:Add("other/opus/linux/lib64") client_settings.link.libpath:Add("other/opus/linux/lib64")
client_settings.link.libpath:Add("other/opus/linux/lib32")
end end
end end
end end

Binary file not shown.

View file

@ -4,14 +4,14 @@ SDL = {
OptFind = function (name, required) OptFind = function (name, required)
local check = function(option, settings) local check = function(option, settings)
option.value = false option.value = false
option.use_sdlconfig = false option.use_pkgconfig = false
option.use_winlib = 0 option.use_winlib = 0
option.use_osxframework = false option.use_osxframework = false
option.lib_path = nil option.lib_path = nil
if ExecuteSilent("sdl-config") > 0 and ExecuteSilent("sdl-config --cflags") == 0 then if family ~= "windows" and ExecuteSilent("pkg-config sdl") == 0 then
option.value = true option.value = true
option.use_sdlconfig = true option.use_pkgconfig = true
end end
if platform == "win32" then if platform == "win32" then
@ -25,14 +25,14 @@ SDL = {
if platform == "macosx" then if platform == "macosx" then
option.value = true option.value = true
option.use_osxframework = true option.use_osxframework = true
option.use_sdlconfig = false option.use_pkgconfig = false
end end
end end
local apply = function(option, settings) local apply = function(option, settings)
if option.use_sdlconfig == true then if option.use_pkgconfig == true then
settings.cc.flags:Add("`sdl-config --cflags`") settings.cc.flags:Add("`pkg-config sdl --cflags`")
settings.link.flags:Add("`sdl-config --libs`") settings.link.flags:Add("`pkg-config sdl --libs`")
end end
if option.use_osxframework == true then if option.use_osxframework == true then
@ -54,14 +54,14 @@ SDL = {
local save = function(option, output) local save = function(option, output)
output:option(option, "value") output:option(option, "value")
output:option(option, "use_sdlconfig") output:option(option, "use_pkgconfig")
output:option(option, "use_winlib") output:option(option, "use_winlib")
output:option(option, "use_osxframework") output:option(option, "use_osxframework")
end end
local display = function(option) local display = function(option)
if option.value == true then if option.value == true then
if option.use_sdlconfig == true then return "using sdl-config" end if option.use_pkgconfig == true then return "using pkg-config" end
if option.use_winlib == 32 then return "using supplied win32 libraries" end if option.use_winlib == 32 then return "using supplied win32 libraries" end
if option.use_winlib == 64 then return "using supplied win64 libraries" end if option.use_winlib == 64 then return "using supplied win64 libraries" end
if option.use_osxframework == true then return "using osx framework" end if option.use_osxframework == true then return "using osx framework" end

View file

@ -18,6 +18,7 @@ rm -rf AndroidData
# Actual compilation, needs a key to sign # Actual compilation, needs a key to sign
cd /media/commandergenius cd /media/commandergenius
ln -s teeworlds project/jni/application/src
./changeAppSettings.sh -a ./changeAppSettings.sh -a
android update project -p project android update project -p project
./build.sh ./build.sh

View file

@ -74,8 +74,8 @@ if include_data and not use_bundle:
shutil.copy("libgcc_s_sjlj-1.dll", package_dir) shutil.copy("libgcc_s_sjlj-1.dll", package_dir)
shutil.copy("libidn-11.dll", package_dir) shutil.copy("libidn-11.dll", package_dir)
elif platform == "win64": elif platform == "win64":
shutil.copy("libwinpthread-1.dll", package_dir)
shutil.copy("libgcc_s_seh-1.dll", package_dir) shutil.copy("libgcc_s_seh-1.dll", package_dir)
shutil.copy("libwinpthread-1.dll", package_dir)
shutil.copy("libogg-0.dll", package_dir) shutil.copy("libogg-0.dll", package_dir)
shutil.copy("libopus-0.dll", package_dir) shutil.copy("libopus-0.dll", package_dir)
shutil.copy("libopusfile-0.dll", package_dir) shutil.copy("libopusfile-0.dll", package_dir)

View file

@ -32,6 +32,13 @@
#define CONF_PLATFORM_STRING "freebsd" #define CONF_PLATFORM_STRING "freebsd"
#endif #endif
#if defined(__NetBSD__)
#define CONF_FAMILY_UNIX 1
#define CONF_FAMILY_STRING "unix"
#define CONF_PLATFORM_NETBSD 1
#define CONF_PLATFORM_STRING "netbsd"
#endif
#if defined(__OpenBSD__) #if defined(__OpenBSD__)
#define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_UNIX 1
#define CONF_FAMILY_STRING "unix" #define CONF_FAMILY_STRING "unix"
@ -82,7 +89,7 @@
/* use gcc endianness definitions when available */ /* use gcc endianness definitions when available */
#if defined(__GNUC__) && !defined(__APPLE__) && !defined(__MINGW32__) && !defined(__sun) #if defined(__GNUC__) && !defined(__APPLE__) && !defined(__MINGW32__) && !defined(__sun)
#if defined(__FreeBSD__) || defined(__OpenBSD__) #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
#include <sys/endian.h> #include <sys/endian.h>
#else #else
#include <endian.h> #include <endian.h>

View file

@ -49,6 +49,7 @@
#elif defined(CONF_FAMILY_WINDOWS) #elif defined(CONF_FAMILY_WINDOWS)
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501 /* required for mingw to get getaddrinfo to work */ #define _WIN32_WINNT 0x0501 /* required for mingw to get getaddrinfo to work */
#include <windows.h> #include <windows.h>
#include <winsock2.h> #include <winsock2.h>
@ -181,9 +182,7 @@ void dbg_enable_threaded()
dbg_msg_threaded = 1; dbg_msg_threaded = 1;
Thread = thread_init(dbg_msg_thread, 0); Thread = thread_init(dbg_msg_thread, 0);
#if defined(CONF_FAMILY_UNIX) thread_detach(Thread);
pthread_detach((pthread_t)Thread);
#endif
} }
#endif #endif
@ -192,7 +191,6 @@ void dbg_msg(const char *sys, const char *fmt, ...)
va_list args; va_list args;
char *msg; char *msg;
int len; int len;
int e;
//str_format(str, sizeof(str), "[%08x][%s]: ", (int)time(0), sys); //str_format(str, sizeof(str), "[%08x][%s]: ", (int)time(0), sys);
time_t rawtime; time_t rawtime;
@ -207,6 +205,7 @@ void dbg_msg(const char *sys, const char *fmt, ...)
#if !defined(CONF_PLATFORM_MACOSX) #if !defined(CONF_PLATFORM_MACOSX)
if(dbg_msg_threaded) if(dbg_msg_threaded)
{ {
int e;
semaphore_wait(&log_queue.notfull); semaphore_wait(&log_queue.notfull);
semaphore_wait(&log_queue.mutex); semaphore_wait(&log_queue.mutex);
e = queue_empty(&log_queue); e = queue_empty(&log_queue);
@ -2370,7 +2369,7 @@ int str_utf8_decode(const char **ptr)
{ {
return byte; return byte;
} }
else if(0x80 <= byte && byte <= 0xDF) else if(0xC2 <= byte && byte <= 0xDF)
{ {
utf8_bytes_needed = 1; utf8_bytes_needed = 1;
utf8_code_point = byte - 0xC0; utf8_code_point = byte - 0xC0;

View file

@ -42,7 +42,7 @@ public:
int m_LocalIDs[2]; int m_LocalIDs[2];
char m_aNews[NEWS_SIZE]; char m_aNews[NEWS_SIZE];
CNetObj_PlayerInput DummyInput; CNetObj_PlayerInput m_DummyInput;
bool m_DummySendConnInfo; bool m_DummySendConnInfo;
@ -210,6 +210,7 @@ public:
virtual int OnSnapInput(int *pData) = 0; virtual int OnSnapInput(int *pData) = 0;
virtual void SendDummyInfo(bool Start) = 0; virtual void SendDummyInfo(bool Start) = 0;
virtual void ResetDummyInput() = 0; virtual void ResetDummyInput() = 0;
virtual const CNetObj_PlayerInput &getPlayerInput(int dummy) = 0;
virtual const char *GetItemName(int Type) = 0; virtual const char *GetItemName(int Type) = 0;
virtual const char *Version() = 0; virtual const char *Version() = 0;

View file

@ -326,7 +326,7 @@ CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta)
m_Fire = 0; m_Fire = 0;
mem_zero(&m_aInputs, sizeof(m_aInputs)); mem_zero(&m_aInputs, sizeof(m_aInputs));
mem_zero(&DummyInput, sizeof(DummyInput)); mem_zero(&m_DummyInput, sizeof(m_DummyInput));
mem_zero(&HammerInput, sizeof(HammerInput)); mem_zero(&HammerInput, sizeof(HammerInput));
HammerInput.m_Fire = 0; HammerInput.m_Fire = 0;
@ -510,16 +510,16 @@ void CClient::SendInput()
if(m_LastDummy != (bool)g_Config.m_ClDummy) if(m_LastDummy != (bool)g_Config.m_ClDummy)
{ {
mem_copy(&DummyInput, &m_aInputs[!g_Config.m_ClDummy][(m_CurrentInput[!g_Config.m_ClDummy]+200-1)%200], sizeof(DummyInput)); m_DummyInput = GameClient()->getPlayerInput(!g_Config.m_ClDummy);
m_LastDummy = g_Config.m_ClDummy; m_LastDummy = g_Config.m_ClDummy;
if (g_Config.m_ClDummyResetOnSwitch) if (g_Config.m_ClDummyResetOnSwitch)
{ {
DummyInput.m_Jump = 0; m_DummyInput.m_Jump = 0;
DummyInput.m_Hook = 0; m_DummyInput.m_Hook = 0;
if(DummyInput.m_Fire & 1) if(m_DummyInput.m_Fire & 1)
DummyInput.m_Fire++; m_DummyInput.m_Fire++;
DummyInput.m_Direction = 0; m_DummyInput.m_Direction = 0;
GameClient()->ResetDummyInput(); GameClient()->ResetDummyInput();
} }
} }
@ -535,22 +535,22 @@ void CClient::SendInput()
{ {
if(m_Fire != 0) if(m_Fire != 0)
{ {
DummyInput.m_Fire = HammerInput.m_Fire; m_DummyInput.m_Fire = HammerInput.m_Fire;
m_Fire = 0; m_Fire = 0;
} }
if(!Size && (!DummyInput.m_Direction && !DummyInput.m_Jump && !DummyInput.m_Hook)) if(!Size && (!m_DummyInput.m_Direction && !m_DummyInput.m_Jump && !m_DummyInput.m_Hook))
return; return;
// pack input // pack input
CMsgPacker Msg(NETMSG_INPUT); CMsgPacker Msg(NETMSG_INPUT);
Msg.AddInt(m_AckGameTick[!g_Config.m_ClDummy]); Msg.AddInt(m_AckGameTick[!g_Config.m_ClDummy]);
Msg.AddInt(m_PredTick[!g_Config.m_ClDummy]); Msg.AddInt(m_PredTick[!g_Config.m_ClDummy]);
Msg.AddInt(sizeof(DummyInput)); Msg.AddInt(sizeof(m_DummyInput));
// pack it // pack it
for(unsigned int i = 0; i < sizeof(DummyInput)/4; i++) for(unsigned int i = 0; i < sizeof(m_DummyInput)/4; i++)
Msg.AddInt(((int*) &DummyInput)[i]); Msg.AddInt(((int*) &m_DummyInput)[i]);
SendMsgExY(&Msg, MSGFLAG_FLUSH, true, !g_Config.m_ClDummy); SendMsgExY(&Msg, MSGFLAG_FLUSH, true, !g_Config.m_ClDummy);
} }
@ -1493,7 +1493,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
if(Sys) if(Sys)
{ {
// system message // 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); const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
int MapCrc = Unpacker.GetInt(); int MapCrc = Unpacker.GetInt();
@ -1602,7 +1602,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(); GameClient()->OnConnected();
} }
@ -1611,7 +1611,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
CMsgPacker Msg(NETMSG_PING_REPLY); CMsgPacker Msg(NETMSG_PING_REPLY);
SendMsgEx(&Msg, 0); 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 *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC);
const char *pHelp = Unpacker.GetString(CUnpacker::SANITIZE_CC); const char *pHelp = Unpacker.GetString(CUnpacker::SANITIZE_CC);
@ -1619,13 +1619,13 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
if(Unpacker.Error() == 0) if(Unpacker.Error() == 0)
m_pConsole->RegisterTemp(pName, pParams, CFGFLAG_SERVER, pHelp); 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); const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC);
if(Unpacker.Error() == 0) if(Unpacker.Error() == 0)
m_pConsole->DeregisterTemp(pName); 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(); int Result = Unpacker.GetInt();
if(Unpacker.Error() == 0) if(Unpacker.Error() == 0)
@ -1637,7 +1637,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
if(Old != 0 && m_UseTempRconCommands == 0) if(Old != 0 && m_UseTempRconCommands == 0)
m_pConsole->DeregisterTempAll(); 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(); const char *pLine = Unpacker.GetString();
if(Unpacker.Error() == 0) if(Unpacker.Error() == 0)
@ -1891,12 +1891,15 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
} }
else else
{ {
// game message if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 || Msg == NETMSGTYPE_SV_EXTRAPROJECTILE)
for(int i = 0; i < RECORDER_MAX; i++) {
if(m_DemoRecorder[i].IsRecording()) // game message
m_DemoRecorder[i].RecordMessage(pPacket->m_pData, pPacket->m_DataSize); for(int i = 0; i < RECORDER_MAX; i++)
if(m_DemoRecorder[i].IsRecording())
m_DemoRecorder[i].RecordMessage(pPacket->m_pData, pPacket->m_DataSize);
GameClient()->OnMessage(Msg, &Unpacker); GameClient()->OnMessage(Msg, &Unpacker);
}
} }
} }
@ -3312,10 +3315,10 @@ int main(int argc, const char **argv) // ignore_convention
pClient->InitInterfaces(); pClient->InitInterfaces();
// execute config file // execute config file
IOHANDLE file = pStorage->OpenFile(CONFIG_FILE, IOFLAG_READ, IStorage::TYPE_ALL); IOHANDLE File = pStorage->OpenFile(CONFIG_FILE, IOFLAG_READ, IStorage::TYPE_ALL);
if(file) if(File)
{ {
io_close(file); io_close(File);
pConsole->ExecuteFile(CONFIG_FILE); pConsole->ExecuteFile(CONFIG_FILE);
} }
else // fallback else // fallback
@ -3324,10 +3327,10 @@ int main(int argc, const char **argv) // ignore_convention
} }
// execute autoexec file // execute autoexec file
file = pStorage->OpenFile(AUTOEXEC_CLIENT_FILE, IOFLAG_READ, IStorage::TYPE_ALL); File = pStorage->OpenFile(AUTOEXEC_CLIENT_FILE, IOFLAG_READ, IStorage::TYPE_ALL);
if(file) if(File)
{ {
io_close(file); io_close(File);
pConsole->ExecuteFile(AUTOEXEC_CLIENT_FILE); pConsole->ExecuteFile(AUTOEXEC_CLIENT_FILE);
} }
else // fallback else // fallback
@ -3335,6 +3338,17 @@ int main(int argc, const char **argv) // ignore_convention
pConsole->ExecuteFile(AUTOEXEC_FILE); pConsole->ExecuteFile(AUTOEXEC_FILE);
} }
if(g_Config.m_ClConfigVersion < 1)
{
if(g_Config.m_ClAntiPing == 0)
{
g_Config.m_ClAntiPingPlayers = 1;
g_Config.m_ClAntiPingGrenade = 1;
g_Config.m_ClAntiPingWeapons = 1;
}
}
g_Config.m_ClConfigVersion = 1;
// parse the command line arguments // parse the command line arguments
if(argc > 1) // ignore_convention if(argc > 1) // ignore_convention
pConsole->ParseArguments(argc-1, &argv[1]); // ignore_convention pConsole->ParseArguments(argc-1, &argv[1]); // ignore_convention

View file

@ -19,6 +19,7 @@ public:
ACCESS_LEVEL_ADMIN=0, ACCESS_LEVEL_ADMIN=0,
ACCESS_LEVEL_MOD, ACCESS_LEVEL_MOD,
ACCESS_LEVEL_HELPER,
ACCESS_LEVEL_USER, ACCESS_LEVEL_USER,
TEMPCMD_NAME_LENGTH=32, TEMPCMD_NAME_LENGTH=32,

View file

@ -309,6 +309,7 @@ CServer::CServer()
m_CurrentMapSize = 0; m_CurrentMapSize = 0;
m_MapReload = 0; m_MapReload = 0;
m_ReloadedWhenEmpty = false;
m_RconClientID = IServer::RCON_CID_SERV; m_RconClientID = IServer::RCON_CID_SERV;
m_RconAuthLevel = AUTHED_ADMIN; m_RconAuthLevel = AUTHED_ADMIN;
@ -910,7 +911,7 @@ void CServer::UpdateClientRconCommands()
if(m_aClients[ClientID].m_State != CClient::STATE_EMPTY && m_aClients[ClientID].m_Authed) if(m_aClients[ClientID].m_State != CClient::STATE_EMPTY && m_aClients[ClientID].m_Authed)
{ {
int ConsoleAccessLevel = m_aClients[ClientID].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : IConsole::ACCESS_LEVEL_MOD; int ConsoleAccessLevel = m_aClients[ClientID].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : m_aClients[ClientID].m_Authed == AUTHED_MOD ? IConsole::ACCESS_LEVEL_MOD : IConsole::ACCESS_LEVEL_HELPER;
for(int i = 0; i < MAX_RCONCMD_SEND && m_aClients[ClientID].m_pRconCmdToSend; ++i) for(int i = 0; i < MAX_RCONCMD_SEND && m_aClients[ClientID].m_pRconCmdToSend; ++i)
{ {
SendRconCmdAdd(m_aClients[ClientID].m_pRconCmdToSend, ClientID); SendRconCmdAdd(m_aClients[ClientID].m_pRconCmdToSend, ClientID);
@ -957,7 +958,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
// system message // system message
if(Msg == NETMSG_INFO) 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); const char *pVersion = Unpacker.GetString(CUnpacker::SANITIZE_CC);
if(str_comp(pVersion, GameServer()->NetVersion()) != 0) if(str_comp(pVersion, GameServer()->NetVersion()) != 0)
@ -990,8 +991,8 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
} }
else if(Msg == NETMSG_REQUEST_MAP_DATA) 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; // no map w/o password, sorry guys return;
int Chunk = Unpacker.GetInt(); int Chunk = Unpacker.GetInt();
unsigned int ChunkSize = 1024-128; unsigned int ChunkSize = 1024-128;
@ -1035,7 +1036,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
} }
else if(Msg == NETMSG_READY) 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]; char aAddrStr[NETADDR_MAXSTRSIZE];
net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true);
@ -1051,7 +1052,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
} }
else if(Msg == NETMSG_ENTERGAME) 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]; char aAddrStr[NETADDR_MAXSTRSIZE];
net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true);
@ -1124,7 +1125,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
if (GameServer->m_apPlayers[ClientID] && GameServer->m_apPlayers[ClientID]->m_ClientVersion < VERSION_DDNET_OLD) if (GameServer->m_apPlayers[ClientID] && GameServer->m_apPlayers[ClientID]->m_ClientVersion < VERSION_DDNET_OLD)
GameServer->m_apPlayers[ClientID]->m_ClientVersion = VERSION_DDNET_OLD; GameServer->m_apPlayers[ClientID]->m_ClientVersion = VERSION_DDNET_OLD;
} else } else
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)
{ {
CGameContext *GameServer = (CGameContext *) m_pGameServer; CGameContext *GameServer = (CGameContext *) m_pGameServer;
if (GameServer->m_apPlayers[ClientID] && (GameServer->m_apPlayers[ClientID]->m_ClientVersion < VERSION_DDNET_RCONPROTECT || m_aClients[ClientID].m_LastAuthed)) if (GameServer->m_apPlayers[ClientID] && (GameServer->m_apPlayers[ClientID]->m_ClientVersion < VERSION_DDNET_RCONPROTECT || m_aClients[ClientID].m_LastAuthed))
@ -1134,7 +1135,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf);
m_RconClientID = ClientID; m_RconClientID = ClientID;
m_RconAuthLevel = m_aClients[ClientID].m_Authed; m_RconAuthLevel = m_aClients[ClientID].m_Authed;
Console()->SetAccessLevel(m_aClients[ClientID].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : m_aClients[ClientID].m_Authed == AUTHED_MOD ? IConsole::ACCESS_LEVEL_MOD : IConsole::ACCESS_LEVEL_USER); Console()->SetAccessLevel(m_aClients[ClientID].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : m_aClients[ClientID].m_Authed == AUTHED_MOD ? IConsole::ACCESS_LEVEL_MOD : m_aClients[ClientID].m_Authed == AUTHED_HELPER ? IConsole::ACCESS_LEVEL_HELPER : IConsole::ACCESS_LEVEL_USER);
Console()->ExecuteLineFlag(pCmd, CFGFLAG_SERVER, ClientID); Console()->ExecuteLineFlag(pCmd, CFGFLAG_SERVER, ClientID);
Console()->SetAccessLevel(IConsole::ACCESS_LEVEL_ADMIN); Console()->SetAccessLevel(IConsole::ACCESS_LEVEL_ADMIN);
m_RconClientID = IServer::RCON_CID_SERV; m_RconClientID = IServer::RCON_CID_SERV;
@ -1149,56 +1150,63 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
Unpacker.GetString(); // login name, not used Unpacker.GetString(); // login name, not used
pPw = Unpacker.GetString(CUnpacker::SANITIZE_CC); 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) int AuthLevel = -1;
if(g_Config.m_SvRconPassword[0] == 0 && g_Config.m_SvRconModPassword[0] == 0 && g_Config.m_SvRconHelperPassword[0] == 0)
{ {
SendRconLine(ClientID, "No rcon password set on server. Set sv_rcon_password and/or sv_rcon_mod_password to enable the remote console."); SendRconLine(ClientID, "No rcon password set on server. Set sv_rcon_password and/or sv_rcon_mod_password to enable the remote console.");
} }
else if(g_Config.m_SvRconPassword[0] && str_comp(pPw, g_Config.m_SvRconPassword) == 0) else if(g_Config.m_SvRconPassword[0] && str_comp(pPw, g_Config.m_SvRconPassword) == 0)
{ AuthLevel = AUTHED_ADMIN;
m_aClients[ClientID].m_LastAuthed = AUTHED_ADMIN;
if(m_aClients[ClientID].m_Authed != AUTHED_ADMIN)
{
CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS);
Msg.AddInt(1); //authed
Msg.AddInt(1); //cmdlist
SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true);
m_aClients[ClientID].m_Authed = AUTHED_ADMIN;
int SendRconCmds = Unpacker.GetInt();
if(Unpacker.Error() == 0 && SendRconCmds)
m_aClients[ClientID].m_pRconCmdToSend = Console()->FirstCommandInfo(IConsole::ACCESS_LEVEL_ADMIN, CFGFLAG_SERVER);
SendRconLine(ClientID, "Admin authentication successful. Full remote console access granted.");
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (admin)", ClientID);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
// DDRace
GameServer()->OnSetAuthed(ClientID, AUTHED_ADMIN);
}
}
else if(g_Config.m_SvRconModPassword[0] && str_comp(pPw, g_Config.m_SvRconModPassword) == 0) else if(g_Config.m_SvRconModPassword[0] && str_comp(pPw, g_Config.m_SvRconModPassword) == 0)
AuthLevel = AUTHED_MOD;
else if(g_Config.m_SvRconHelperPassword[0] && str_comp(pPw, g_Config.m_SvRconHelperPassword) == 0)
AuthLevel = AUTHED_HELPER;
if(AuthLevel != -1)
{ {
m_aClients[ClientID].m_LastAuthed = AUTHED_MOD; m_aClients[ClientID].m_LastAuthed = AuthLevel;
if(m_aClients[ClientID].m_Authed != AUTHED_MOD) if(m_aClients[ClientID].m_Authed != AuthLevel)
{ {
CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS); CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS);
Msg.AddInt(1); //authed Msg.AddInt(1); //authed
Msg.AddInt(1); //cmdlist Msg.AddInt(1); //cmdlist
SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true); SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true);
m_aClients[ClientID].m_Authed = AUTHED_MOD; m_aClients[ClientID].m_Authed = AuthLevel;
int SendRconCmds = Unpacker.GetInt(); int SendRconCmds = Unpacker.GetInt();
if(Unpacker.Error() == 0 && SendRconCmds) if(Unpacker.Error() == 0 && SendRconCmds)
m_aClients[ClientID].m_pRconCmdToSend = Console()->FirstCommandInfo(IConsole::ACCESS_LEVEL_MOD, CFGFLAG_SERVER); // AUTHED_ADMIN - AuthLevel gets the proper IConsole::ACCESS_LEVEL_<x>
SendRconLine(ClientID, "Moderator authentication successful. Limited remote console access granted."); m_aClients[ClientID].m_pRconCmdToSend = Console()->FirstCommandInfo(AUTHED_ADMIN - AuthLevel, CFGFLAG_SERVER);
char aBuf[256]; char aBuf[256];
str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (moderator)", ClientID); switch (AuthLevel)
{
case AUTHED_ADMIN:
{
SendRconLine(ClientID, "Admin authentication successful. Full remote console access granted.");
str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (admin)", ClientID);
break;
}
case AUTHED_MOD:
{
SendRconLine(ClientID, "Moderator authentication successful. Limited remote console access granted.");
str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (moderator)", ClientID);
break;
}
case AUTHED_HELPER:
{
SendRconLine(ClientID, "Helper authentication successful. Limited remote console access granted.");
str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (helper)", ClientID);
break;
}
}
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
// DDRace // DDRace
GameServer()->OnSetAuthed(ClientID, AUTHED_MOD); GameServer()->OnSetAuthed(ClientID, AuthLevel);
} }
} }
else if(g_Config.m_SvRconMaxTries) else if(g_Config.m_SvRconMaxTries)
@ -1251,7 +1259,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
else else
{ {
// game message // 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); GameServer()->OnMessage(Msg, &Unpacker, ClientID);
} }
} }
@ -1701,6 +1709,17 @@ int CServer::Run()
// wait for incoming data // wait for incoming data
if (NonActive) if (NonActive)
{ {
if(g_Config.m_SvReloadWhenEmpty == 1)
{
m_MapReload = true;
g_Config.m_SvReloadWhenEmpty = 0;
}
else if(g_Config.m_SvReloadWhenEmpty == 2 && !m_ReloadedWhenEmpty)
{
m_MapReload = true;
m_ReloadedWhenEmpty = true;
}
if(g_Config.m_SvShutdownWhenEmpty) if(g_Config.m_SvShutdownWhenEmpty)
m_RunServer = false; m_RunServer = false;
else else
@ -1708,6 +1727,8 @@ int CServer::Run()
} }
else else
{ {
m_ReloadedWhenEmpty = false;
set_new_tick(); set_new_tick();
int64 t = time_get(); int64 t = time_get();
int x = (TickStartTime(m_CurrentGameTick+1) - t) * 1000000 / time_freq() + 1; int x = (TickStartTime(m_CurrentGameTick+1) - t) * 1000000 / time_freq() + 1;
@ -1776,7 +1797,8 @@ void CServer::ConStatus(IConsole::IResult *pResult, void *pUser)
if(pThis->m_aClients[i].m_State == CClient::STATE_INGAME) if(pThis->m_aClients[i].m_State == CClient::STATE_INGAME)
{ {
const char *pAuthStr = pThis->m_aClients[i].m_Authed == CServer::AUTHED_ADMIN ? "(Admin)" : const char *pAuthStr = pThis->m_aClients[i].m_Authed == CServer::AUTHED_ADMIN ? "(Admin)" :
pThis->m_aClients[i].m_Authed == CServer::AUTHED_MOD ? "(Mod)" : ""; pThis->m_aClients[i].m_Authed == CServer::AUTHED_MOD ? "(Mod)" :
pThis->m_aClients[i].m_Authed == CServer::AUTHED_HELPER ? "(Helper)" : "";
str_format(aBuf, sizeof(aBuf), "id=%d addr=%s name='%s' score=%d client=%d secure=%s %s", i, aAddrStr, str_format(aBuf, sizeof(aBuf), "id=%d addr=%s name='%s' score=%d client=%d secure=%s %s", i, aAddrStr,
pThis->m_aClients[i].m_aName, pThis->m_aClients[i].m_Score, ((CGameContext *)(pThis->GameServer()))->m_apPlayers[i]->m_ClientVersion, pThis->m_NetServer.HasSecurityToken(i) ? "yes":"no", pAuthStr); pThis->m_aClients[i].m_aName, pThis->m_aClients[i].m_Score, ((CGameContext *)(pThis->GameServer()))->m_apPlayers[i]->m_ClientVersion, pThis->m_NetServer.HasSecurityToken(i) ? "yes":"no", pAuthStr);
} }
@ -1921,7 +1943,7 @@ void CServer::ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pU
((CServer *)pUserData)->m_NetServer.SetMaxClientsPerIP(pResult->GetInteger(0)); ((CServer *)pUserData)->m_NetServer.SetMaxClientsPerIP(pResult->GetInteger(0));
} }
void CServer::ConchainModCommandUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) void CServer::ConchainCommandAccessUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
{ {
if(pResult->NumArguments() == 2) if(pResult->NumArguments() == 2)
{ {
@ -1935,11 +1957,13 @@ void CServer::ConchainModCommandUpdate(IConsole::IResult *pResult, void *pUserDa
{ {
for(int i = 0; i < MAX_CLIENTS; ++i) for(int i = 0; i < MAX_CLIENTS; ++i)
{ {
if(pThis->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY || pThis->m_aClients[i].m_Authed != CServer::AUTHED_MOD || if(pThis->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY ||
(pThis->m_aClients[i].m_pRconCmdToSend && str_comp(pResult->GetString(0), pThis->m_aClients[i].m_pRconCmdToSend->m_pName) >= 0)) (pInfo->GetAccessLevel() > AUTHED_ADMIN - pThis->m_aClients[i].m_Authed && AUTHED_ADMIN - pThis->m_aClients[i].m_Authed < OldAccessLevel) ||
(pInfo->GetAccessLevel() < AUTHED_ADMIN - pThis->m_aClients[i].m_Authed && AUTHED_ADMIN - pThis->m_aClients[i].m_Authed > OldAccessLevel) ||
(pThis->m_aClients[i].m_pRconCmdToSend && str_comp(pResult->GetString(0), pThis->m_aClients[i].m_pRconCmdToSend->m_pName) >= 0))
continue; continue;
if(OldAccessLevel == IConsole::ACCESS_LEVEL_ADMIN) if(OldAccessLevel < pInfo->GetAccessLevel())
pThis->SendRconCmdAdd(pInfo, i); pThis->SendRconCmdAdd(pInfo, i);
else else
pThis->SendRconCmdRem(pInfo, i); pThis->SendRconCmdRem(pInfo, i);
@ -1960,34 +1984,39 @@ void CServer::ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void
} }
} }
void CServer::LogoutByAuthLevel(int AuthLevel) // AUTHED_<x>
{
for(int i = 0; i < MAX_CLIENTS; i++)
{
if(m_aClients[i].m_State == CServer::CClient::STATE_EMPTY)
continue;
if(m_aClients[i].m_Authed == AuthLevel)
{
CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS);
Msg.AddInt(0); //authed
Msg.AddInt(0); //cmdlist
SendMsgEx(&Msg, MSGFLAG_VITAL, i, true);
m_aClients[i].m_Authed = AUTHED_NO;
m_aClients[i].m_LastAuthed = AUTHED_NO;
m_aClients[i].m_AuthTries = 0;
m_aClients[i].m_pRconCmdToSend = 0;
SendRconLine(i, "Logged out by password change.");
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "ClientID=%d logged out by password change", i);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
}
}
}
void CServer::ConchainRconPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) void CServer::ConchainRconPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
{ {
pfnCallback(pResult, pCallbackUserData); pfnCallback(pResult, pCallbackUserData);
if(pResult->NumArguments() == 1) if(pResult->NumArguments() == 1)
{ {
CServer *pServer = (CServer *)pUserData; CServer *pServer = (CServer *)pUserData;
for(int i = 0; i < MAX_CLIENTS; i++) pServer->LogoutByAuthLevel(AUTHED_ADMIN);
{
if(pServer->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY)
continue;
if(pServer->m_aClients[i].m_Authed == AUTHED_ADMIN)
{
CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS);
Msg.AddInt(0); //authed
Msg.AddInt(0); //cmdlist
pServer->SendMsgEx(&Msg, MSGFLAG_VITAL, i, true);
pServer->m_aClients[i].m_Authed = AUTHED_NO;
pServer->m_aClients[i].m_LastAuthed = AUTHED_NO;
pServer->m_aClients[i].m_AuthTries = 0;
pServer->m_aClients[i].m_pRconCmdToSend = 0;
pServer->SendRconLine(i, "Logged out by password change.");
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "ClientID=%d logged out by password change", i);
pServer->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
}
}
} }
} }
@ -1997,28 +2026,17 @@ void CServer::ConchainRconModPasswordChange(IConsole::IResult *pResult, void *pU
if(pResult->NumArguments() == 1) if(pResult->NumArguments() == 1)
{ {
CServer *pServer = (CServer *)pUserData; CServer *pServer = (CServer *)pUserData;
for(int i = 0; i < MAX_CLIENTS; i++) pServer->LogoutByAuthLevel(AUTHED_MOD);
{ }
if(pServer->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY) }
continue;
if(pServer->m_aClients[i].m_Authed == AUTHED_MOD)
{
CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS);
Msg.AddInt(0); //authed
Msg.AddInt(0); //cmdlist
pServer->SendMsgEx(&Msg, MSGFLAG_VITAL, i, true);
pServer->m_aClients[i].m_Authed = AUTHED_NO; void CServer::ConchainRconHelperPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
pServer->m_aClients[i].m_LastAuthed = AUTHED_NO; {
pServer->m_aClients[i].m_AuthTries = 0; pfnCallback(pResult, pCallbackUserData);
pServer->m_aClients[i].m_pRconCmdToSend = 0; if(pResult->NumArguments() == 1)
{
pServer->SendRconLine(i, "Logged out by password change."); CServer *pServer = (CServer *)pUserData;
char aBuf[64]; pServer->LogoutByAuthLevel(AUTHED_HELPER);
str_format(aBuf, sizeof(aBuf), "ClientID=%d logged out by password change", i);
pServer->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
}
}
} }
} }
@ -2044,11 +2062,12 @@ void CServer::RegisterCommands()
Console()->Chain("password", ConchainSpecialInfoupdate, this); Console()->Chain("password", ConchainSpecialInfoupdate, this);
Console()->Chain("sv_max_clients_per_ip", ConchainMaxclientsperipUpdate, this); Console()->Chain("sv_max_clients_per_ip", ConchainMaxclientsperipUpdate, this);
Console()->Chain("mod_command", ConchainModCommandUpdate, this); Console()->Chain("access_level", ConchainCommandAccessUpdate, this);
Console()->Chain("console_output_level", ConchainConsoleOutputLevelUpdate, this); Console()->Chain("console_output_level", ConchainConsoleOutputLevelUpdate, this);
Console()->Chain("sv_rcon_password", ConchainRconPasswordChange, this); Console()->Chain("sv_rcon_password", ConchainRconPasswordChange, this);
Console()->Chain("sv_rcon_mod_password", ConchainRconModPasswordChange, this); Console()->Chain("sv_rcon_mod_password", ConchainRconModPasswordChange, this);
Console()->Chain("sv_rcon_helper_password", ConchainRconHelperPasswordChange, this);
// register console commands in sub parts // register console commands in sub parts
m_ServerBan.InitServerBan(Console(), Storage(), this); m_ServerBan.InitServerBan(Console(), Storage(), this);

View file

@ -83,6 +83,7 @@ public:
enum enum
{ {
AUTHED_NO=0, AUTHED_NO=0,
AUTHED_HELPER,
AUTHED_MOD, AUTHED_MOD,
AUTHED_ADMIN, AUTHED_ADMIN,
@ -162,6 +163,7 @@ public:
//int m_CurrentGameTick; //int m_CurrentGameTick;
int m_RunServer; int m_RunServer;
int m_MapReload; int m_MapReload;
bool m_ReloadedWhenEmpty;
int m_RconClientID; int m_RconClientID;
int m_RconAuthLevel; int m_RconAuthLevel;
int m_PrintCBIndex; int m_PrintCBIndex;
@ -263,10 +265,14 @@ public:
static void ConLogout(IConsole::IResult *pResult, void *pUser); static void ConLogout(IConsole::IResult *pResult, void *pUser);
static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainModCommandUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainCommandAccessUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
void LogoutByAuthLevel(int AuthLevel);
static void ConchainRconPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainRconPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainRconModPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainRconModPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
static void ConchainRconHelperPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
void RegisterCommands(); void RegisterCommands();

View file

@ -75,7 +75,7 @@ public:
virtual void Save() virtual void Save()
{ {
if(!m_pStorage) if(!m_pStorage || !g_Config.m_ClSaveSettings)
return; return;
m_ConfigFile = m_pStorage->OpenFile(CONFIG_FILE ".tmp", IOFLAG_WRITE, IStorage::TYPE_SAVE); m_ConfigFile = m_pStorage->OpenFile(CONFIG_FILE ".tmp", IOFLAG_WRITE, IStorage::TYPE_SAVE);

View file

@ -15,6 +15,7 @@ MACRO_CONFIG_STR(Password, password, 32, "", CFGFLAG_CLIENT|CFGFLAG_SERVER, "Pas
MACRO_CONFIG_STR(Logfile, logfile, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT|CFGFLAG_SERVER, "Filename to log all output to") MACRO_CONFIG_STR(Logfile, logfile, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT|CFGFLAG_SERVER, "Filename to log all output to")
MACRO_CONFIG_INT(ConsoleOutputLevel, console_output_level, 0, 0, 2, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Adjusts the amount of information in the console") MACRO_CONFIG_INT(ConsoleOutputLevel, console_output_level, 0, 0, 2, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Adjusts the amount of information in the console")
MACRO_CONFIG_INT(ClSaveSettings, cl_save_settings, 1, 0, 1, CFGFLAG_CLIENT, "Write the settings file on exit")
MACRO_CONFIG_INT(ClCpuThrottle, cl_cpu_throttle, 0, 0, 100, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(ClCpuThrottle, cl_cpu_throttle, 0, 0, 100, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
MACRO_CONFIG_INT(ClCpuThrottleInactive, cl_cpu_throttle_inactive, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(ClCpuThrottleInactive, cl_cpu_throttle_inactive, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "")
MACRO_CONFIG_INT(ClEditor, cl_editor, 0, 0, 1, CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(ClEditor, cl_editor, 0, 0, 1, CFGFLAG_CLIENT, "")
@ -140,6 +141,7 @@ MACRO_CONFIG_INT(SvHighBandwidth, sv_high_bandwidth, 0, 0, 1, CFGFLAG_SERVER, "U
MACRO_CONFIG_INT(SvRegister, sv_register, 1, 0, 1, CFGFLAG_SERVER, "Register server with master server for public listing") MACRO_CONFIG_INT(SvRegister, sv_register, 1, 0, 1, CFGFLAG_SERVER, "Register server with master server for public listing")
MACRO_CONFIG_STR(SvRconPassword, sv_rcon_password, 32, "", CFGFLAG_SERVER, "Remote console password (full access)") MACRO_CONFIG_STR(SvRconPassword, sv_rcon_password, 32, "", CFGFLAG_SERVER, "Remote console password (full access)")
MACRO_CONFIG_STR(SvRconModPassword, sv_rcon_mod_password, 32, "", CFGFLAG_SERVER, "Remote console password for moderators (limited access)") MACRO_CONFIG_STR(SvRconModPassword, sv_rcon_mod_password, 32, "", CFGFLAG_SERVER, "Remote console password for moderators (limited access)")
MACRO_CONFIG_STR(SvRconHelperPassword, sv_rcon_helper_password, 32, "", CFGFLAG_SERVER, "Remote console password for helpers (limited access)")
MACRO_CONFIG_INT(SvRconMaxTries, sv_rcon_max_tries, 30, 0, 100, CFGFLAG_SERVER, "Maximum number of tries for remote console authentication") MACRO_CONFIG_INT(SvRconMaxTries, sv_rcon_max_tries, 30, 0, 100, CFGFLAG_SERVER, "Maximum number of tries for remote console authentication")
MACRO_CONFIG_INT(SvRconBantime, sv_rcon_bantime, 5, 0, 1440, CFGFLAG_SERVER, "The time a client gets banned if remote console authentication fails. 0 makes it just use kick") MACRO_CONFIG_INT(SvRconBantime, sv_rcon_bantime, 5, 0, 1440, CFGFLAG_SERVER, "The time a client gets banned if remote console authentication fails. 0 makes it just use kick")
MACRO_CONFIG_INT(SvAutoDemoRecord, sv_auto_demo_record, 0, 0, 1, CFGFLAG_SERVER, "Automatically record demos") MACRO_CONFIG_INT(SvAutoDemoRecord, sv_auto_demo_record, 0, 0, 1, CFGFLAG_SERVER, "Automatically record demos")
@ -217,24 +219,25 @@ MACRO_CONFIG_STR(SvSqlUser, sv_sql_user, 32, "nameless", CFGFLAG_SERVER, "SQL Us
MACRO_CONFIG_STR(SvSqlPw, sv_sql_pw, 32, "tee", CFGFLAG_SERVER, "SQL Password") MACRO_CONFIG_STR(SvSqlPw, sv_sql_pw, 32, "tee", CFGFLAG_SERVER, "SQL Password")
MACRO_CONFIG_STR(SvSqlIp, sv_sql_ip, 32, "127.0.0.1", CFGFLAG_SERVER, "SQL Database IP") MACRO_CONFIG_STR(SvSqlIp, sv_sql_ip, 32, "127.0.0.1", CFGFLAG_SERVER, "SQL Database IP")
MACRO_CONFIG_INT(SvSqlPort, sv_sql_port, 3306, 0, 65535, CFGFLAG_SERVER, "SQL Database port") MACRO_CONFIG_INT(SvSqlPort, sv_sql_port, 3306, 0, 65535, CFGFLAG_SERVER, "SQL Database port")
MACRO_CONFIG_INT(SvSqlCreateTables, sv_sql_create_tables, 1, 0, 1, CFGFLAG_SERVER, "Try to create the SQL tables when starting")
MACRO_CONFIG_STR(SvSqlDatabase, sv_sql_database, 16, "teeworlds", CFGFLAG_SERVER, "SQL Database name") MACRO_CONFIG_STR(SvSqlDatabase, sv_sql_database, 16, "teeworlds", CFGFLAG_SERVER, "SQL Database name")
MACRO_CONFIG_STR(SvSqlServerName, sv_sql_servername, 4, "UNK", CFGFLAG_SERVER, "SQL Server name that is inserted into record table") MACRO_CONFIG_STR(SvSqlServerName, sv_sql_servername, 5, "UNK", CFGFLAG_SERVER, "SQL Server name that is inserted into record table")
MACRO_CONFIG_STR(SvSqlPrefix, sv_sql_prefix, 16, "record", CFGFLAG_SERVER, "SQL Database table prefix") MACRO_CONFIG_STR(SvSqlPrefix, sv_sql_prefix, 16, "record", CFGFLAG_SERVER, "SQL Database table prefix")
MACRO_CONFIG_INT(SvSaveGames, sv_savegames, 1, 0, 1, CFGFLAG_SERVER, "Enables savegames (/save and /load)") MACRO_CONFIG_INT(SvSaveGames, sv_savegames, 1, 0, 1, CFGFLAG_SERVER, "Enables savegames (/save and /load)")
MACRO_CONFIG_INT(SvSaveGamesDelay, sv_savegames_delay, 60, 0, 10000, CFGFLAG_SERVER, "Delay in seconds for loading a savegame") MACRO_CONFIG_INT(SvSaveGamesDelay, sv_savegames_delay, 60, 0, 10000, CFGFLAG_SERVER, "Delay in seconds for loading a savegame")
#endif #endif
MACRO_CONFIG_INT(SvDDRaceRules, sv_ddrace_rules, 1, 0, 1, CFGFLAG_SERVER, "Whether the default mod rules are displayed or not") MACRO_CONFIG_INT(SvDDRaceRules, sv_ddrace_rules, 1, 0, 1, CFGFLAG_SERVER, "Whether the default mod rules are displayed or not")
MACRO_CONFIG_STR(SvRulesLine1, sv_rules_line1, 40, "", CFGFLAG_SERVER, "Rules line 1") MACRO_CONFIG_STR(SvRulesLine1, sv_rules_line1, 128, "", CFGFLAG_SERVER, "Rules line 1")
MACRO_CONFIG_STR(SvRulesLine2, sv_rules_line2, 40, "", CFGFLAG_SERVER, "Rules line 2") MACRO_CONFIG_STR(SvRulesLine2, sv_rules_line2, 128, "", CFGFLAG_SERVER, "Rules line 2")
MACRO_CONFIG_STR(SvRulesLine3, sv_rules_line3, 40, "", CFGFLAG_SERVER, "Rules line 3") MACRO_CONFIG_STR(SvRulesLine3, sv_rules_line3, 128, "", CFGFLAG_SERVER, "Rules line 3")
MACRO_CONFIG_STR(SvRulesLine4, sv_rules_line4, 40, "", CFGFLAG_SERVER, "Rules line 4") MACRO_CONFIG_STR(SvRulesLine4, sv_rules_line4, 128, "", CFGFLAG_SERVER, "Rules line 4")
MACRO_CONFIG_STR(SvRulesLine5, sv_rules_line5, 40, "", CFGFLAG_SERVER, "Rules line 5") MACRO_CONFIG_STR(SvRulesLine5, sv_rules_line5, 128, "", CFGFLAG_SERVER, "Rules line 5")
MACRO_CONFIG_STR(SvRulesLine6, sv_rules_line6, 40, "", CFGFLAG_SERVER, "Rules line 6") MACRO_CONFIG_STR(SvRulesLine6, sv_rules_line6, 128, "", CFGFLAG_SERVER, "Rules line 6")
MACRO_CONFIG_STR(SvRulesLine7, sv_rules_line7, 40, "", CFGFLAG_SERVER, "Rules line 7") MACRO_CONFIG_STR(SvRulesLine7, sv_rules_line7, 128, "", CFGFLAG_SERVER, "Rules line 7")
MACRO_CONFIG_STR(SvRulesLine8, sv_rules_line8, 40, "", CFGFLAG_SERVER, "Rules line 8") MACRO_CONFIG_STR(SvRulesLine8, sv_rules_line8, 128, "", CFGFLAG_SERVER, "Rules line 8")
MACRO_CONFIG_STR(SvRulesLine9, sv_rules_line9, 40, "", CFGFLAG_SERVER, "Rules line 9") MACRO_CONFIG_STR(SvRulesLine9, sv_rules_line9, 128, "", CFGFLAG_SERVER, "Rules line 9")
MACRO_CONFIG_STR(SvRulesLine10, sv_rules_line10, 40, "", CFGFLAG_SERVER, "Rules line 10") MACRO_CONFIG_STR(SvRulesLine10, sv_rules_line10, 128, "", CFGFLAG_SERVER, "Rules line 10")
MACRO_CONFIG_INT(SvTeam, sv_team, 1, 0, 3, CFGFLAG_SERVER|CFGFLAG_GAME, "Teams configuration (0 = off, 1 = on but optional, 2 = must play only with teams, 3 = forced random team only for you)") MACRO_CONFIG_INT(SvTeam, sv_team, 1, 0, 3, CFGFLAG_SERVER|CFGFLAG_GAME, "Teams configuration (0 = off, 1 = on but optional, 2 = must play only with teams, 3 = forced random team only for you)")
MACRO_CONFIG_INT(SvTeamMaxSize, sv_max_team_size, MAX_CLIENTS, 1, MAX_CLIENTS, CFGFLAG_SERVER|CFGFLAG_GAME, "Maximum team size (from 2 to 64)") MACRO_CONFIG_INT(SvTeamMaxSize, sv_max_team_size, MAX_CLIENTS, 1, MAX_CLIENTS, CFGFLAG_SERVER|CFGFLAG_GAME, "Maximum team size (from 2 to 64)")
@ -311,6 +314,7 @@ MACRO_CONFIG_INT(SvMaxAfkTime, sv_max_afk_time, 0, 0, 9999, CFGFLAG_SERVER, "The
MACRO_CONFIG_INT(SvMaxAfkVoteTime, sv_max_afk_vote_time, 300, 0, 9999, CFGFLAG_SERVER, "The time in seconds a player can be afk and his votes still count (0 = disabled)") MACRO_CONFIG_INT(SvMaxAfkVoteTime, sv_max_afk_vote_time, 300, 0, 9999, CFGFLAG_SERVER, "The time in seconds a player can be afk and his votes still count (0 = disabled)")
MACRO_CONFIG_INT(SvPlasmaRange, sv_plasma_range, 700, 1, 99999, CFGFLAG_SERVER|CFGFLAG_GAME, "How far will the plasma gun track tees") MACRO_CONFIG_INT(SvPlasmaRange, sv_plasma_range, 700, 1, 99999, CFGFLAG_SERVER|CFGFLAG_GAME, "How far will the plasma gun track tees")
MACRO_CONFIG_INT(SvPlasmaPerSec, sv_plasma_per_sec, 3, 0, 50, CFGFLAG_SERVER|CFGFLAG_GAME, "How many shots does the plasma gun fire per seconds") MACRO_CONFIG_INT(SvPlasmaPerSec, sv_plasma_per_sec, 3, 0, 50, CFGFLAG_SERVER|CFGFLAG_GAME, "How many shots does the plasma gun fire per seconds")
MACRO_CONFIG_INT(SvDraggerRange, sv_dragger_range, 700, 1, 99999, CFGFLAG_SERVER|CFGFLAG_GAME, "How far will the dragger track tees")
MACRO_CONFIG_INT(SvVotePause, sv_vote_pause, 1, 0, 1, CFGFLAG_SERVER, "Allow voting to pause players (instead of moving to spectators)") MACRO_CONFIG_INT(SvVotePause, sv_vote_pause, 1, 0, 1, CFGFLAG_SERVER, "Allow voting to pause players (instead of moving to spectators)")
MACRO_CONFIG_INT(SvVotePauseTime, sv_vote_pause_time, 10, 0, 360, CFGFLAG_SERVER, "The time (in seconds) players have to wait in pause when paused by vote") MACRO_CONFIG_INT(SvVotePauseTime, sv_vote_pause_time, 10, 0, 360, CFGFLAG_SERVER, "The time (in seconds) players have to wait in pause when paused by vote")
MACRO_CONFIG_INT(SvTuneReset, sv_tune_reset, 1, 0, 1, CFGFLAG_SERVER, "Whether tuning is reset after each map change or not") MACRO_CONFIG_INT(SvTuneReset, sv_tune_reset, 1, 0, 1, CFGFLAG_SERVER, "Whether tuning is reset after each map change or not")
@ -330,6 +334,7 @@ MACRO_CONFIG_INT(SvSpamMuteDuration, sv_spam_mute_duration, 60, 0, 3600 , CFGFLA
MACRO_CONFIG_INT(SvEvents, sv_events, 1, 0, 1, CFGFLAG_SERVER, "Enable triggering of server events, like the happy eyeemotes on some holidays.") MACRO_CONFIG_INT(SvEvents, sv_events, 1, 0, 1, CFGFLAG_SERVER, "Enable triggering of server events, like the happy eyeemotes on some holidays.")
MACRO_CONFIG_INT(SvRankCheats, sv_rank_cheats, 0, 0, 1, CFGFLAG_SERVER, "Enable ranks after cheats have been used (file based server only)") MACRO_CONFIG_INT(SvRankCheats, sv_rank_cheats, 0, 0, 1, CFGFLAG_SERVER, "Enable ranks after cheats have been used (file based server only)")
MACRO_CONFIG_INT(SvShutdownWhenEmpty, sv_shutdown_when_empty, 0, 0, 1, CFGFLAG_SERVER, "Shutdown server as soon as noone is on it anymore") MACRO_CONFIG_INT(SvShutdownWhenEmpty, sv_shutdown_when_empty, 0, 0, 1, CFGFLAG_SERVER, "Shutdown server as soon as noone is on it anymore")
MACRO_CONFIG_INT(SvReloadWhenEmpty, sv_reload_when_empty, 0, 0, 2, CFGFLAG_SERVER, "Reload map when server is empty (1 = reload once, 2 = reload everytime server gets empty)")
MACRO_CONFIG_INT(SvKillProtection, sv_kill_protection, 20, 0, 9999, CFGFLAG_SERVER, "0 - Disable, 1-9999 minutes") MACRO_CONFIG_INT(SvKillProtection, sv_kill_protection, 20, 0, 9999, CFGFLAG_SERVER, "0 - Disable, 1-9999 minutes")
MACRO_CONFIG_INT(SvSoloServer, sv_solo_server, 0, 0, 1, CFGFLAG_SERVER|CFGFLAG_GAME, "Set server to solo mode (no player interactions, has to be set before loading the map)") MACRO_CONFIG_INT(SvSoloServer, sv_solo_server, 0, 0, 1, CFGFLAG_SERVER|CFGFLAG_GAME, "Set server to solo mode (no player interactions, has to be set before loading the map)")
MACRO_CONFIG_STR(SvClientSuggestion, sv_client_suggestion, 128, "Get DDNet client from DDNet.tw to use all features on DDNet!", CFGFLAG_SERVER, "Broadcast to display to players without DDNet client") MACRO_CONFIG_STR(SvClientSuggestion, sv_client_suggestion, 128, "Get DDNet client from DDNet.tw to use all features on DDNet!", CFGFLAG_SERVER, "Broadcast to display to players without DDNet client")
@ -359,6 +364,7 @@ MACRO_CONFIG_INT(InpJoystick, inp_joystick, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT
#else #else
MACRO_CONFIG_INT(InpJoystick, inp_joystick, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Try to use a joystick as input") MACRO_CONFIG_INT(InpJoystick, inp_joystick, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Try to use a joystick as input")
#endif #endif
MACRO_CONFIG_INT(ClConfigVersion, cl_config_version, 0, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SAVE, "The config version. Helps newer clients fix bugs with older configs.")
// demo editor // demo editor
MACRO_CONFIG_INT(ClDemoSliceBegin, cl_demo_slice_begin, -1, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Begin marker for demo slice") MACRO_CONFIG_INT(ClDemoSliceBegin, cl_demo_slice_begin, -1, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Begin marker for demo slice")

View file

@ -514,7 +514,7 @@ void CConsole::Con_Exec(IResult *pResult, void *pUserData)
((CConsole*)pUserData)->ExecuteFile(pResult->GetString(0)); ((CConsole*)pUserData)->ExecuteFile(pResult->GetString(0));
} }
void CConsole::ConModCommandAccess(IResult *pResult, void *pUser) void CConsole::ConCommandAccess(IResult *pResult, void *pUser)
{ {
CConsole* pConsole = static_cast<CConsole *>(pUser); CConsole* pConsole = static_cast<CConsole *>(pUser);
char aBuf[128]; char aBuf[128];
@ -526,12 +526,16 @@ void CConsole::ConModCommandAccess(IResult *pResult, void *pUser)
pCommand->SetAccessLevel(pResult->GetInteger(1)); pCommand->SetAccessLevel(pResult->GetInteger(1));
str_format(aBuf, sizeof(aBuf), "moderator access for '%s' is now %s", pResult->GetString(0), pCommand->GetAccessLevel() ? "enabled" : "disabled"); str_format(aBuf, sizeof(aBuf), "moderator access for '%s' is now %s", pResult->GetString(0), pCommand->GetAccessLevel() ? "enabled" : "disabled");
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
str_format(aBuf, sizeof(aBuf), "helper access for '%s' is now %s", pResult->GetString(0), pCommand->GetAccessLevel() >= ACCESS_LEVEL_HELPER ? "enabled" : "disabled");
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
str_format(aBuf, sizeof(aBuf), "user access for '%s' is now %s", pResult->GetString(0), pCommand->GetAccessLevel() >= ACCESS_LEVEL_USER ? "enabled" : "disabled"); str_format(aBuf, sizeof(aBuf), "user access for '%s' is now %s", pResult->GetString(0), pCommand->GetAccessLevel() >= ACCESS_LEVEL_USER ? "enabled" : "disabled");
} }
else else
{ {
str_format(aBuf, sizeof(aBuf), "moderator access for '%s' is %s", pResult->GetString(0), pCommand->GetAccessLevel() ? "enabled" : "disabled"); str_format(aBuf, sizeof(aBuf), "moderator access for '%s' is %s", pResult->GetString(0), pCommand->GetAccessLevel() ? "enabled" : "disabled");
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
str_format(aBuf, sizeof(aBuf), "helper access for '%s' is %s", pResult->GetString(0), pCommand->GetAccessLevel() >= ACCESS_LEVEL_HELPER ? "enabled" : "disabled");
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
str_format(aBuf, sizeof(aBuf), "user access for '%s' is %s", pResult->GetString(0), pCommand->GetAccessLevel() >= ACCESS_LEVEL_USER ? "enabled" : "disabled"); str_format(aBuf, sizeof(aBuf), "user access for '%s' is %s", pResult->GetString(0), pCommand->GetAccessLevel() >= ACCESS_LEVEL_USER ? "enabled" : "disabled");
} }
} }
@ -541,7 +545,7 @@ void CConsole::ConModCommandAccess(IResult *pResult, void *pUser)
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
} }
void CConsole::ConModCommandStatus(IResult *pResult, void *pUser) void CConsole::ConCommandStatus(IResult *pResult, void *pUser)
{ {
CConsole* pConsole = static_cast<CConsole *>(pUser); CConsole* pConsole = static_cast<CConsole *>(pUser);
char aBuf[240]; char aBuf[240];
@ -550,7 +554,7 @@ void CConsole::ConModCommandStatus(IResult *pResult, void *pUser)
for(CCommand *pCommand = pConsole->m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) for(CCommand *pCommand = pConsole->m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext)
{ {
if(pCommand->m_Flags&pConsole->m_FlagMask && pCommand->GetAccessLevel() >= ACCESS_LEVEL_MOD) if(pCommand->m_Flags&pConsole->m_FlagMask && pCommand->GetAccessLevel() >= clamp(pResult->GetInteger(0), (int)ACCESS_LEVEL_ADMIN, (int)ACCESS_LEVEL_USER))
{ {
int Length = str_length(pCommand->m_pName); int Length = str_length(pCommand->m_pName);
if(Used + Length + 2 < (int)(sizeof(aBuf))) if(Used + Length + 2 < (int)(sizeof(aBuf)))
@ -576,6 +580,18 @@ void CConsole::ConModCommandStatus(IResult *pResult, void *pUser)
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf); pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
} }
void CConsole::ConUserCommandStatus(IResult *pResult, void *pUser)
{
CConsole* pConsole = static_cast<CConsole *>(pUser);
CResult Result;
Result.m_pCommand = "access_status";
char aBuf[4];
str_format(aBuf, sizeof(aBuf), "%d", IConsole::ACCESS_LEVEL_USER);
Result.AddArgument(aBuf);
pConsole->ConCommandStatus(&Result, pConsole);
}
struct CIntVariableData struct CIntVariableData
{ {
IConsole *m_pConsole; IConsole *m_pConsole;
@ -753,9 +769,8 @@ CConsole::CConsole(int FlagMask)
Register("toggle", "sii", CFGFLAG_SERVER|CFGFLAG_CLIENT, ConToggle, this, "Toggle config value"); Register("toggle", "sii", CFGFLAG_SERVER|CFGFLAG_CLIENT, ConToggle, this, "Toggle config value");
Register("+toggle", "sii", CFGFLAG_CLIENT, ConToggleStroke, this, "Toggle config value via keypress"); Register("+toggle", "sii", CFGFLAG_CLIENT, ConToggleStroke, this, "Toggle config value via keypress");
Register("mod_command", "s?i", CFGFLAG_SERVER, ConModCommandAccess, this, "Specify command accessibility for moderators"); Register("access_level", "s?i", CFGFLAG_SERVER, ConCommandAccess, this, "Specify command accessibility (admin = 0, moderator = 1, helper = 2, all = 3)");
Register("mod_status", "", CFGFLAG_SERVER, ConModCommandStatus, this, "List all commands which are accessible for moderators"); Register("access_status", "i", CFGFLAG_SERVER, ConCommandStatus, this, "List all commands which are accessible for admin = 0, moderator = 1, helper = 2, all = 3");
Register("user_status", "", CFGFLAG_SERVER, ConUserCommandStatus, this, "List all commands which are accessible for users");
Register("cmdlist", "", CFGFLAG_SERVER|CFGFLAG_CHAT, ConUserCommandStatus, this, "List all commands which are accessible for users"); Register("cmdlist", "", CFGFLAG_SERVER|CFGFLAG_CHAT, ConUserCommandStatus, this, "List all commands which are accessible for users");
// TODO: this should disappear // TODO: this should disappear
@ -1003,41 +1018,6 @@ const IConsole::CCommandInfo *CConsole::GetCommandInfo(const char *pName, int Fl
extern IConsole *CreateConsole(int FlagMask) { return new CConsole(FlagMask); } extern IConsole *CreateConsole(int FlagMask) { return new CConsole(FlagMask); }
void CConsole::ConUserCommandStatus(IResult *pResult, void *pUser)
{
CConsole* pConsole = static_cast<CConsole *>(pUser);
char aBuf[240];
mem_zero(aBuf, sizeof(aBuf));
int Used = 0;
for(CCommand *pCommand = pConsole->m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext)
{
if(pCommand->m_Flags&pConsole->m_FlagMask && pCommand->GetAccessLevel() == ACCESS_LEVEL_USER)
{
int Length = str_length(pCommand->m_pName);
if(Used + Length + 2 < (int)(sizeof(aBuf)))
{
if(Used > 0)
{
Used += 2;
str_append(aBuf, ", ", sizeof(aBuf));
}
str_append(aBuf, pCommand->m_pName, sizeof(aBuf));
Used += Length;
}
else
{
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
mem_zero(aBuf, sizeof(aBuf));
str_copy(aBuf, pCommand->m_pName, sizeof(aBuf));
Used = Length;
}
}
}
if(Used > 0)
pConsole->Print(OUTPUT_LEVEL_STANDARD, "console", aBuf);
}
void CConsole::ResetServerGameSettings() void CConsole::ResetServerGameSettings()
{ {
#define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Flags,Desc) \ #define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Flags,Desc) \

View file

@ -56,8 +56,8 @@ class CConsole : public IConsole
static void Con_Exec(IResult *pResult, void *pUserData); static void Con_Exec(IResult *pResult, void *pUserData);
static void ConToggle(IResult *pResult, void *pUser); static void ConToggle(IResult *pResult, void *pUser);
static void ConToggleStroke(IResult *pResult, void *pUser); static void ConToggleStroke(IResult *pResult, void *pUser);
static void ConModCommandAccess(IResult *pResult, void *pUser); static void ConCommandAccess(IResult *pResult, void *pUser);
static void ConModCommandStatus(IConsole::IResult *pResult, void *pUser); static void ConCommandStatus(IConsole::IResult *pResult, void *pUser);
void ExecuteFileRecurse(const char *pFilename); void ExecuteFileRecurse(const char *pFilename);
void ExecuteLineStroked(int Stroke, const char *pStr, int ClientID = -1); void ExecuteLineStroked(int Stroke, const char *pStr, int ClientID = -1);

View file

@ -28,7 +28,7 @@ FifoConsole::FifoConsole(IConsole *pConsole, char *pFifoFile, int flag)
m_pConsole = pConsole; m_pConsole = pConsole;
m_flag = flag; m_flag = flag;
pthread_detach((pthread_t)m_pFifoThread); thread_detach(m_pFifoThread);
} }
FifoConsole::~FifoConsole() FifoConsole::~FifoConsole()

View file

@ -83,7 +83,7 @@ int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk)
// fill in the info // fill in the info
pChunk->m_ClientID = m_ClientID; pChunk->m_ClientID = m_ClientID;
pChunk->m_Address = m_Addr; pChunk->m_Address = m_Addr;
pChunk->m_Flags = 0; pChunk->m_Flags = Header.m_Flags;
pChunk->m_DataSize = Header.m_Size; pChunk->m_DataSize = Header.m_Size;
pChunk->m_pData = pData; pChunk->m_pData = pData;
return 1; return 1;

View file

@ -153,6 +153,7 @@ class CNetConnection
private: private:
unsigned short m_Sequence; unsigned short m_Sequence;
unsigned short m_Ack; unsigned short m_Ack;
unsigned short m_PeerAck;
unsigned m_State; unsigned m_State;
int m_Token; int m_Token;

View file

@ -20,6 +20,7 @@ void CNetConnection::Reset(bool Rejoin)
{ {
m_Sequence = 0; m_Sequence = 0;
m_Ack = 0; m_Ack = 0;
m_PeerAck = 0;
m_RemoteClosed = 0; m_RemoteClosed = 0;
if (!Rejoin) if (!Rejoin)
@ -205,9 +206,12 @@ void CNetConnection::Disconnect(const char *pReason)
else else
SendControl(NET_CTRLMSG_CLOSE, 0, 0); SendControl(NET_CTRLMSG_CLOSE, 0, 0);
m_ErrorString[0] = 0; if(pReason != m_ErrorString)
if(pReason && pReason != m_ErrorString) {
str_copy(m_ErrorString, pReason, sizeof(m_ErrorString)); m_ErrorString[0] = 0;
if(pReason)
str_copy(m_ErrorString, pReason, sizeof(m_ErrorString));
}
} }
Reset(); Reset();
@ -246,6 +250,19 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr, SECURITY_
} }
} }
// 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(); int64 Now = time_get();
// check if resend is requested // check if resend is requested

View file

@ -207,6 +207,8 @@ public:
"/usr/share/games/teeworlds/data", "/usr/share/games/teeworlds/data",
"/usr/local/share/teeworlds/data", "/usr/local/share/teeworlds/data",
"/usr/local/share/games/teeworlds/data", "/usr/local/share/games/teeworlds/data",
"/usr/pkg/share/teeworlds/data",
"/usr/pkg/share/games/teeworlds/data",
"/opt/teeworlds/data" "/opt/teeworlds/data"
}; };
const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]); const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]);

View file

@ -264,7 +264,7 @@ int CControls::SnapInput(int *pData)
// dummy copy moves // dummy copy moves
if(g_Config.m_ClDummyCopyMoves) if(g_Config.m_ClDummyCopyMoves)
{ {
CNetObj_PlayerInput *DummyInput = &Client()->DummyInput; CNetObj_PlayerInput *DummyInput = &Client()->m_DummyInput;
DummyInput->m_Direction = m_InputData[g_Config.m_ClDummy].m_Direction; DummyInput->m_Direction = m_InputData[g_Config.m_ClDummy].m_Direction;
DummyInput->m_Hook = m_InputData[g_Config.m_ClDummy].m_Hook; DummyInput->m_Hook = m_InputData[g_Config.m_ClDummy].m_Hook;
DummyInput->m_Jump = m_InputData[g_Config.m_ClDummy].m_Jump; DummyInput->m_Jump = m_InputData[g_Config.m_ClDummy].m_Jump;

View file

@ -57,7 +57,7 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID)
int PrevTick = Client()->PrevGameTick(); int PrevTick = Client()->PrevGameTick();
if (g_Config.m_ClAntiPingGrenade && LocalPlayerInGame && !(Client()->State() == IClient::STATE_DEMOPLAYBACK)) if (m_pClient->AntiPingGrenade() && LocalPlayerInGame && !(Client()->State() == IClient::STATE_DEMOPLAYBACK))
{ {
// calc predicted game tick // calc predicted game tick
static int Offset = 0; static int Offset = 0;

View file

@ -125,8 +125,6 @@ void CMapLayers::OnRender()
Graphics()->GetScreen(&Screen.x, &Screen.y, &Screen.w, &Screen.h); Graphics()->GetScreen(&Screen.x, &Screen.y, &Screen.w, &Screen.h);
vec2 Center = m_pClient->m_pCamera->m_Center; vec2 Center = m_pClient->m_pCamera->m_Center;
//float center_x = gameclient.camera->center.x;
//float center_y = gameclient.camera->center.y;
bool PassedGameLayer = false; bool PassedGameLayer = false;
@ -176,7 +174,7 @@ void CMapLayers::OnRender()
if(pLayer == (CMapItemLayer*)m_pLayers->GameLayer()) if(pLayer == (CMapItemLayer*)m_pLayers->GameLayer())
{ {
IsGameLayer = true; IsGameLayer = true;
PassedGameLayer = 1; PassedGameLayer = true;
} }
if(pLayer == (CMapItemLayer*)m_pLayers->FrontLayer()) if(pLayer == (CMapItemLayer*)m_pLayers->FrontLayer())
@ -200,13 +198,13 @@ void CMapLayers::OnRender()
if(m_Type == -1) if(m_Type == -1)
Render = true; Render = true;
else if(m_Type == 0) else if(m_Type == TYPE_BACKGROUND)
{ {
if(PassedGameLayer) if(PassedGameLayer)
return; return;
Render = true; Render = true;
} }
else else // TYPE_FOREGROUND
{ {
if(PassedGameLayer && !IsGameLayer) if(PassedGameLayer && !IsGameLayer)
Render = true; Render = true;
@ -235,8 +233,6 @@ void CMapLayers::OnRender()
if((Render && g_Config.m_ClOverlayEntities < 100 && !IsGameLayer && !IsFrontLayer && !IsSwitchLayer && !IsTeleLayer && !IsSpeedupLayer && !IsTuneLayer) || (g_Config.m_ClOverlayEntities && IsGameLayer)) if((Render && g_Config.m_ClOverlayEntities < 100 && !IsGameLayer && !IsFrontLayer && !IsSwitchLayer && !IsTeleLayer && !IsSpeedupLayer && !IsTuneLayer) || (g_Config.m_ClOverlayEntities && IsGameLayer))
{ {
//layershot_begin();
if(pLayer->m_Type == LAYERTYPE_TILES) if(pLayer->m_Type == LAYERTYPE_TILES)
{ {
CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer;
@ -283,10 +279,8 @@ void CMapLayers::OnRender()
Graphics()->BlendNormal(); Graphics()->BlendNormal();
RenderTools()->RenderQuads(pQuads, pQLayer->m_NumQuads, LAYERRENDERFLAG_TRANSPARENT, EnvelopeEval, this); RenderTools()->RenderQuads(pQuads, pQLayer->m_NumQuads, LAYERRENDERFLAG_TRANSPARENT, EnvelopeEval, this);
} }
//layershot_end();
} }
else if(g_Config.m_ClOverlayEntities && IsFrontLayer) else if(Render && g_Config.m_ClOverlayEntities && IsFrontLayer)
{ {
CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer;
Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities());
@ -305,7 +299,7 @@ void CMapLayers::OnRender()
EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset); EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset);
} }
} }
else if(g_Config.m_ClOverlayEntities && IsSwitchLayer) else if(Render && g_Config.m_ClOverlayEntities && IsSwitchLayer)
{ {
CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer;
Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities());
@ -323,7 +317,7 @@ void CMapLayers::OnRender()
RenderTools()->RenderSwitchOverlay(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, g_Config.m_ClOverlayEntities/100.0f); RenderTools()->RenderSwitchOverlay(pSwitchTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, g_Config.m_ClOverlayEntities/100.0f);
} }
} }
else if(g_Config.m_ClOverlayEntities && IsTeleLayer) else if(Render && g_Config.m_ClOverlayEntities && IsTeleLayer)
{ {
CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer;
Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities());
@ -341,7 +335,7 @@ void CMapLayers::OnRender()
RenderTools()->RenderTeleOverlay(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, g_Config.m_ClOverlayEntities/100.0f); RenderTools()->RenderTeleOverlay(pTeleTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, g_Config.m_ClOverlayEntities/100.0f);
} }
} }
else if(g_Config.m_ClOverlayEntities && IsSpeedupLayer) else if(Render && g_Config.m_ClOverlayEntities && IsSpeedupLayer)
{ {
CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer;
Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities());
@ -359,7 +353,7 @@ void CMapLayers::OnRender()
RenderTools()->RenderSpeedupOverlay(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, g_Config.m_ClOverlayEntities/100.0f); RenderTools()->RenderSpeedupOverlay(pSpeedupTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, g_Config.m_ClOverlayEntities/100.0f);
} }
} }
else if(g_Config.m_ClOverlayEntities && IsTuneLayer) else if(Render && g_Config.m_ClOverlayEntities && IsTuneLayer)
{ {
CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer;
Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities()); Graphics()->TextureSet(m_pClient->m_pMapimages->GetEntities());

View file

@ -1243,11 +1243,12 @@ void CMenus::RenderServerbrowser(CUIRect MainView)
// status box // status box
{ {
CUIRect Button, ButtonArea, Part; CUIRect Button, ButtonArea;
StatusBox.HSplitTop(5.0f, 0, &StatusBox); StatusBox.HSplitTop(5.0f, 0, &StatusBox);
// version note // version note
#if defined(CONF_FAMILY_WINDOWS) || (defined(CONF_PLATFORM_LINUX) && !defined(__ANDROID__)) #if defined(CONF_FAMILY_WINDOWS) || (defined(CONF_PLATFORM_LINUX) && !defined(__ANDROID__))
CUIRect Part;
StatusBox.HSplitBottom(15.0f, &StatusBox, &Button); StatusBox.HSplitBottom(15.0f, &StatusBox, &Button);
char aBuf[64]; char aBuf[64];
int State = Updater()->GetCurrentState(); int State = Updater()->GetCurrentState();

View file

@ -796,9 +796,7 @@ void CMenus::RenderInGameBrowser(CUIRect MainView)
CUIRect Box = MainView; CUIRect Box = MainView;
CUIRect Button; CUIRect Button;
static int PrevPage = g_Config.m_UiPage; int Page = g_Config.m_UiPage;
static int LastServersPage = g_Config.m_UiPage;
int ActivePage = g_Config.m_UiPage;
int NewPage = -1; int NewPage = -1;
RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f);
@ -809,40 +807,37 @@ void CMenus::RenderInGameBrowser(CUIRect MainView)
Box.VSplitLeft(100.0f, &Button, &Box); Box.VSplitLeft(100.0f, &Button, &Box);
static int s_InternetButton=0; static int s_InternetButton=0;
if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), ActivePage==PAGE_INTERNET, &Button, CUI::CORNER_TL)) if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), Page==PAGE_INTERNET, &Button, CUI::CORNER_TL))
{ {
if (PrevPage != PAGE_SETTINGS || LastServersPage != PAGE_INTERNET) ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); if (Page != PAGE_INTERNET)
LastServersPage = PAGE_INTERNET; ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET);
NewPage = PAGE_INTERNET; NewPage = PAGE_INTERNET;
} }
//Box.VSplitLeft(4.0f, 0, &Box);
Box.VSplitLeft(80.0f, &Button, &Box); Box.VSplitLeft(80.0f, &Button, &Box);
static int s_LanButton=0; static int s_LanButton=0;
if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), ActivePage==PAGE_LAN, &Button, 0)) if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), Page==PAGE_LAN, &Button, 0))
{ {
if (PrevPage != PAGE_SETTINGS || LastServersPage != PAGE_LAN) ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); if (Page != PAGE_LAN)
LastServersPage = PAGE_LAN; ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN);
NewPage = PAGE_LAN; NewPage = PAGE_LAN;
} }
//box.VSplitLeft(4.0f, 0, &box);
Box.VSplitLeft(110.0f, &Button, &Box); Box.VSplitLeft(110.0f, &Button, &Box);
static int s_FavoritesButton=0; static int s_FavoritesButton=0;
if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), ActivePage==PAGE_FAVORITES, &Button, 0)) if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), Page==PAGE_FAVORITES, &Button, 0))
{ {
if (PrevPage != PAGE_SETTINGS || LastServersPage != PAGE_FAVORITES) ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); if (Page != PAGE_FAVORITES)
LastServersPage = PAGE_FAVORITES; ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES);
NewPage = PAGE_FAVORITES; NewPage = PAGE_FAVORITES;
} }
//box.VSplitLeft(4.0f, 0, &box);
Box.VSplitLeft(110.0f, &Button, &Box); Box.VSplitLeft(110.0f, &Button, &Box);
static int s_DDNetButton=0; static int s_DDNetButton=0;
if(DoButton_MenuTab(&s_DDNetButton, Localize("DDNet"), ActivePage==PAGE_DDNET, &Button, CUI::CORNER_TR)) if(DoButton_MenuTab(&s_DDNetButton, Localize("DDNet"), Page==PAGE_DDNET, &Button, CUI::CORNER_TR))
{ {
if (PrevPage != PAGE_SETTINGS || LastServersPage != PAGE_DDNET) ServerBrowser()->Refresh(IServerBrowser::TYPE_DDNET); if (Page != PAGE_DDNET)
LastServersPage = PAGE_DDNET; ServerBrowser()->Refresh(IServerBrowser::TYPE_DDNET);
NewPage = PAGE_DDNET; NewPage = PAGE_DDNET;
} }
@ -852,8 +847,6 @@ void CMenus::RenderInGameBrowser(CUIRect MainView)
g_Config.m_UiPage = NewPage; g_Config.m_UiPage = NewPage;
} }
PrevPage = g_Config.m_UiPage;
RenderServerbrowser(MainView); RenderServerbrowser(MainView);
return; return;
} }

View file

@ -392,7 +392,7 @@ void CMenus::RenderSettingsTee(CUIRect MainView)
Dummy.HSplitTop(20.0f, &DummyLabel, &Dummy); Dummy.HSplitTop(20.0f, &DummyLabel, &Dummy);
if(DoButton_CheckBox(&g_Config.m_ClVanillaSkinsOnly, Localize("Vanilla Skins only"), !g_Config.m_ClVanillaSkinsOnly, &DummyLabel)) if(DoButton_CheckBox(&g_Config.m_ClVanillaSkinsOnly, Localize("Vanilla Skins only"), g_Config.m_ClVanillaSkinsOnly, &DummyLabel))
{ {
g_Config.m_ClVanillaSkinsOnly ^= 1; g_Config.m_ClVanillaSkinsOnly ^= 1;
m_NeedRestartSkins = true; m_NeedRestartSkins = true;
@ -936,7 +936,7 @@ void CMenus::RenderSettingsSound(CUIRect MainView)
g_Config.m_SndEnable ^= 1; g_Config.m_SndEnable ^= 1;
if(g_Config.m_SndEnable) if(g_Config.m_SndEnable)
{ {
if(g_Config.m_SndMusic) if(g_Config.m_SndMusic && Client()->State() == IClient::STATE_OFFLINE)
m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f); m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f);
} }
else else

View file

@ -88,7 +88,7 @@ void CNamePlates::RenderNameplate(
void CNamePlates::OnRender() void CNamePlates::OnRender()
{ {
if (!g_Config.m_ClNameplates || g_Config.m_ClAntiPingPlayers) if (!g_Config.m_ClNameplates || m_pClient->AntiPingPlayers())
return; return;
for(int i = 0; i < MAX_CLIENTS; i++) for(int i = 0; i < MAX_CLIENTS; i++)

View file

@ -257,7 +257,7 @@ void CPlayers::RenderHook(
// set size // set size
RenderInfo.m_Size = 64.0f; RenderInfo.m_Size = 64.0f;
if (!g_Config.m_ClAntiPingPlayers) if (!m_pClient->AntiPingPlayers())
{ {
// use preditect players if needed // use preditect players if needed
if(pInfo.m_Local && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) if(pInfo.m_Local && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK)
@ -290,7 +290,7 @@ void CPlayers::RenderHook(
} }
vec2 Position; vec2 Position;
if (!g_Config.m_ClAntiPingPlayers) if (!m_pClient->AntiPingPlayers())
Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick);
else else
Position = parPosition; Position = parPosition;
@ -305,7 +305,7 @@ void CPlayers::RenderHook(
vec2 Pos = Position; vec2 Pos = Position;
vec2 HookPos; vec2 HookPos;
if (!g_Config.m_ClAntiPingPlayers) if (!m_pClient->AntiPingPlayers())
{ {
if(pPlayerChar->m_HookedPlayer != -1) if(pPlayerChar->m_HookedPlayer != -1)
{ {
@ -440,7 +440,7 @@ void CPlayers::RenderPlayer(
// use preditect players if needed // use preditect players if needed
if (!g_Config.m_ClAntiPingPlayers) if (!m_pClient->AntiPingPlayers())
{ {
if(pInfo.m_Local && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) if(pInfo.m_Local && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK)
{ {
@ -475,7 +475,7 @@ void CPlayers::RenderPlayer(
vec2 Direction = GetDirection((int)(Angle*256.0f)); vec2 Direction = GetDirection((int)(Angle*256.0f));
vec2 Position; vec2 Position;
if (!g_Config.m_ClAntiPingPlayers) if (!m_pClient->AntiPingPlayers())
Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick);
else else
Position = parPosition; Position = parPosition;
@ -878,7 +878,7 @@ void CPlayers::RenderPlayer(
Graphics()->QuadsEnd(); Graphics()->QuadsEnd();
} }
if(g_Config.m_ClNameplates && g_Config.m_ClAntiPingPlayers) if(g_Config.m_ClNameplates && m_pClient->AntiPingPlayers())
{ {
float FontSize = 18.0f + 20.0f * g_Config.m_ClNameplatesSize / 100.0f; float FontSize = 18.0f + 20.0f * g_Config.m_ClNameplatesSize / 100.0f;
float FontSizeClan = 18.0f + 20.0f * g_Config.m_ClNameplatesClanSize / 100.0f; float FontSizeClan = 18.0f + 20.0f * g_Config.m_ClNameplatesClanSize / 100.0f;
@ -972,7 +972,7 @@ void CPlayers::OnRender()
static int predcnt = 0; static int predcnt = 0;
if (g_Config.m_ClAntiPingPlayers) if (m_pClient->AntiPingPlayers())
{ {
for(int i = 0; i < MAX_CLIENTS; i++) for(int i = 0; i < MAX_CLIENTS; i++)
{ {
@ -999,7 +999,7 @@ void CPlayers::OnRender()
} }
} }
if(g_Config.m_ClAntiPingPlayers && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) if(m_pClient->AntiPingPlayers() && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK)
if(m_pClient->m_Snap.m_pLocalCharacter && !(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) if(m_pClient->m_Snap.m_pLocalCharacter && !(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER))
{ {
// double ping = m_pClient->m_Snap.m_pLocalInfo->m_Latency; // double ping = m_pClient->m_Snap.m_pLocalInfo->m_Latency;

View file

@ -185,7 +185,7 @@ void CSpectator::OnRender()
return; return;
} }
if(!m_pClient->m_Snap.m_SpecInfo.m_Active && !Client()->State() == IClient::STATE_DEMOPLAYBACK) if(!m_pClient->m_Snap.m_SpecInfo.m_Active && Client()->State() != IClient::STATE_DEMOPLAYBACK)
{ {
m_Active = false; m_Active = false;
m_WasActive = false; m_WasActive = false;

View file

@ -110,6 +110,11 @@ const char *CGameClient::Version() { return GAME_VERSION; }
const char *CGameClient::NetVersion() { return GAME_NETVERSION; } const char *CGameClient::NetVersion() { return GAME_NETVERSION; }
const char *CGameClient::GetItemName(int Type) { return m_NetObjHandler.GetObjName(Type); } const char *CGameClient::GetItemName(int Type) { return m_NetObjHandler.GetObjName(Type); }
const CNetObj_PlayerInput &CGameClient::getPlayerInput(int dummy)
{
return m_pControls->m_InputData[dummy];
}
void CGameClient::ResetDummyInput() void CGameClient::ResetDummyInput()
{ {
m_pControls->ResetInput(!g_Config.m_ClDummy); m_pControls->ResetInput(!g_Config.m_ClDummy);
@ -461,7 +466,7 @@ void CGameClient::UpdatePositions()
// local character position // local character position
if(g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) if(g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK)
{ {
if (!g_Config.m_ClAntiPingPlayers) if(!AntiPingPlayers())
{ {
if(!m_Snap.m_pLocalCharacter || (m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) if(!m_Snap.m_pLocalCharacter || (m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER))
{ {
@ -488,7 +493,7 @@ void CGameClient::UpdatePositions()
vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y), Client()->IntraGameTick()); vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y), Client()->IntraGameTick());
} }
if (g_Config.m_ClAntiPingPlayers) if (AntiPingPlayers())
{ {
for (int i = 0; i < MAX_CLIENTS; i++) for (int i = 0; i < MAX_CLIENTS; i++)
{ {
@ -579,14 +584,6 @@ void CGameClient::OnRender()
m_NewTick = false; m_NewTick = false;
m_NewPredictedTick = false; m_NewPredictedTick = false;
if(g_Config.m_ClAntiPing != m_CurrentAntiPing)
{
g_Config.m_ClAntiPingPlayers = g_Config.m_ClAntiPing;
g_Config.m_ClAntiPingGrenade = g_Config.m_ClAntiPing;
g_Config.m_ClAntiPingWeapons = g_Config.m_ClAntiPing;
m_CurrentAntiPing = g_Config.m_ClAntiPing;
}
if(g_Config.m_ClDummy && !Client()->DummyConnected()) if(g_Config.m_ClDummy && !Client()->DummyConnected())
g_Config.m_ClDummy = 0; g_Config.m_ClDummy = 0;
@ -664,7 +661,7 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker, bool IsDummy)
g_GameClient.m_pItems->AddExtraProjectile(&Proj); g_GameClient.m_pItems->AddExtraProjectile(&Proj);
if(g_Config.m_ClAntiPingWeapons && Proj.m_Type == WEAPON_GRENADE && !UseExtraInfo(&Proj)) if(AntiPingWeapons() && Proj.m_Type == WEAPON_GRENADE && !UseExtraInfo(&Proj))
{ {
vec2 StartPos; vec2 StartPos;
vec2 Direction; vec2 Direction;
@ -1310,7 +1307,7 @@ void CGameClient::OnPredict()
} }
static bool IsWeaker[2][MAX_CLIENTS] = {{0}}; static bool IsWeaker[2][MAX_CLIENTS] = {{0}};
if(g_Config.m_ClAntiPingPlayers) if(AntiPingPlayers())
FindWeaker(IsWeaker); FindWeaker(IsWeaker);
// repredict character // repredict character
@ -1338,7 +1335,7 @@ void CGameClient::OnPredict()
int ReloadTimer = 0; int ReloadTimer = 0;
vec2 PrevPos; vec2 PrevPos;
if(g_Config.m_ClAntiPingWeapons) if(AntiPingWeapons())
{ {
for(int Index = 0; Index < MaxProjectiles; Index++) for(int Index = 0; Index < MaxProjectiles; Index++)
PredictedProjectiles[Index].Deactivate(); PredictedProjectiles[Index].Deactivate();
@ -1419,7 +1416,7 @@ void CGameClient::OnPredict()
} }
} }
if(g_Config.m_ClAntiPingWeapons) if(AntiPingWeapons())
{ {
const float ProximityRadius = 28.0f; const float ProximityRadius = 28.0f;
CNetObj_PlayerInput Input; CNetObj_PlayerInput Input;
@ -1593,7 +1590,7 @@ void CGameClient::OnPredict()
} }
// calculate where everyone should move // calculate where everyone should move
if(g_Config.m_ClAntiPingPlayers) if(AntiPingPlayers())
{ {
//first apply Tick to weaker players (players that the local client has strong hook against), then local, then stronger players //first apply Tick to weaker players (players that the local client has strong hook against), then local, then stronger players
for(int h = 0; h < 3; h++) for(int h = 0; h < 3; h++)
@ -1623,7 +1620,7 @@ void CGameClient::OnPredict()
} }
// move all players and quantize their data // move all players and quantize their data
if(g_Config.m_ClAntiPingPlayers) if(AntiPingPlayers())
{ {
// Everyone with weaker hook // Everyone with weaker hook
for(int c = 0; c < MAX_CLIENTS; c++) for(int c = 0; c < MAX_CLIENTS; c++)
@ -1700,7 +1697,7 @@ void CGameClient::OnPredict()
{ {
m_PredictedChar = *World.m_apCharacters[m_Snap.m_LocalClientID]; m_PredictedChar = *World.m_apCharacters[m_Snap.m_LocalClientID];
if (g_Config.m_ClAntiPingPlayers) if (AntiPingPlayers())
{ {
for (int c = 0; c < MAX_CLIENTS; c++) for (int c = 0; c < MAX_CLIENTS; c++)
{ {

View file

@ -314,6 +314,8 @@ public:
virtual const char *Version(); virtual const char *Version();
virtual const char *NetVersion(); virtual const char *NetVersion();
virtual const CNetObj_PlayerInput &getPlayerInput(int dummy);
// actions // actions
// TODO: move these // TODO: move these
@ -363,11 +365,13 @@ public:
void FindWeaker(bool IsWeaker[2][MAX_CLIENTS]); void FindWeaker(bool IsWeaker[2][MAX_CLIENTS]);
private: bool AntiPingPlayers() { return g_Config.m_ClAntiPing && g_Config.m_ClAntiPingPlayers; }
bool AntiPingGrenade() { return g_Config.m_ClAntiPing && g_Config.m_ClAntiPingGrenade; }
bool AntiPingWeapons() { return g_Config.m_ClAntiPing && g_Config.m_ClAntiPingWeapons; }
private:
bool m_DDRaceMsgSent[2]; bool m_DDRaceMsgSent[2];
int m_ShowOthers[2]; int m_ShowOthers[2];
bool m_CurrentAntiPing;
}; };

View file

@ -324,6 +324,9 @@ void CRenderTools::RenderTilemap(CTile *pTiles, int w, int h, float Scale, vec4
void CRenderTools::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, float Alpha) void CRenderTools::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, float Alpha)
{ {
if(!g_Config.m_ClTextEntities)
return;
float ScreenX0, ScreenY0, ScreenX1, ScreenY1; float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
@ -412,27 +415,32 @@ void CRenderTools::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, fl
Graphics()->QuadsEnd(); Graphics()->QuadsEnd();
// draw force if(g_Config.m_ClTextEntities)
char aBuf[16];
str_format(aBuf, sizeof(aBuf), "%d", Force);
UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha);
UI()->TextRender()->Text(0, mx*Scale, my*Scale+16, Scale-20, aBuf, -1);
UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f);
if(MaxSpeed)
{ {
str_format(aBuf, sizeof(aBuf), "%d", MaxSpeed); // draw force
char aBuf[16];
str_format(aBuf, sizeof(aBuf), "%d", Force);
UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha);
UI()->TextRender()->Text(0, mx*Scale, my*Scale-2, Scale-20, aBuf, -1); UI()->TextRender()->Text(0, mx*Scale, my*Scale+16, Scale-20, aBuf, -1);
UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f);
if(MaxSpeed)
{
str_format(aBuf, sizeof(aBuf), "%d", MaxSpeed);
UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha);
UI()->TextRender()->Text(0, mx*Scale, my*Scale-2, Scale-20, aBuf, -1);
UI()->TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f);
}
} }
} }
} }
Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1);
} }
void CRenderTools::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, float Alpha) void CRenderTools::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, float Alpha)
{ {
if(!g_Config.m_ClTextEntities)
return;
float ScreenX0, ScreenY0, ScreenX1, ScreenY1; float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
@ -488,6 +496,9 @@ void CRenderTools::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float
void CRenderTools::RenderTuneOverlay(CTuneTile *pTune, int w, int h, float Scale, float Alpha) void CRenderTools::RenderTuneOverlay(CTuneTile *pTune, int w, int h, float Scale, float Alpha)
{ {
if(!g_Config.m_ClTextEntities)
return;
float ScreenX0, ScreenY0, ScreenX1, ScreenY1; float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);

View file

@ -206,7 +206,7 @@ void CEditorImage::AnalyseTileFlags()
int tw = m_Width/16; // tilesizes int tw = m_Width/16; // tilesizes
int th = m_Height/16; int th = m_Height/16;
if ( tw == th ) if ( tw == th && m_Format == CImageInfo::FORMAT_RGBA )
{ {
unsigned char *pPixelData = (unsigned char *)m_pData; unsigned char *pPixelData = (unsigned char *)m_pData;
@ -4267,8 +4267,8 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
{ {
if(pNewEnv->m_Channels == 4) if(pNewEnv->m_Channels == 4)
{ {
pNewEnv->AddPoint(0, 1,1,1,1); pNewEnv->AddPoint(0, f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f));
pNewEnv->AddPoint(1000, 1,1,1,1); pNewEnv->AddPoint(1000, f2fx(1.0f), f2fx(1.0f), f2fx(1.0f), f2fx(1.0f));
} }
else else
{ {
@ -4417,7 +4417,7 @@ void CEditor::RenderEnvelopeEditor(CUIRect View)
int Time = (int)(((UI()->MouseX()-View.x)*TimeScale)*1000.0f); int Time = (int)(((UI()->MouseX()-View.x)*TimeScale)*1000.0f);
//float env_y = (UI()->MouseY()-view.y)/TimeScale; //float env_y = (UI()->MouseY()-view.y)/TimeScale;
float aChannels[4]; float aChannels[4];
pEnvelope->Eval(Time, aChannels); pEnvelope->Eval(Time / 1000.0f, aChannels);
pEnvelope->AddPoint(Time, pEnvelope->AddPoint(Time,
f2fx(aChannels[0]), f2fx(aChannels[1]), f2fx(aChannels[0]), f2fx(aChannels[1]),
f2fx(aChannels[2]), f2fx(aChannels[3])); f2fx(aChannels[2]), f2fx(aChannels[3]));
@ -5466,9 +5466,7 @@ void CEditor::DoMapBorder()
void CEditor::CreateUndoStep() void CEditor::CreateUndoStep()
{ {
void *CreateThread = thread_init(CreateUndoStepThread, this); void *CreateThread = thread_init(CreateUndoStepThread, this);
#if defined(CONF_FAMILY_UNIX) thread_detach(CreateThread);
pthread_detach((pthread_t)CreateThread);
#endif
} }
void CEditor::CreateUndoStepThread(void *pUser) void CEditor::CreateUndoStepThread(void *pUser)

View file

@ -622,16 +622,28 @@ void CGameContext::ConSave(IConsole::IResult *pResult, void *pUserData)
int Team = ((CGameControllerDDRace*) pSelf->m_pController)->m_Teams.m_Core.Team(pResult->m_ClientID); int Team = ((CGameControllerDDRace*) pSelf->m_pController)->m_Teams.m_Core.Team(pResult->m_ClientID);
const char* pCode = pResult->GetString(0); const char* pCode = pResult->GetString(0);
char aCountry[4]; char aCountry[5];
if(str_length(pCode) > 3 && pCode[0] >= 'A' && pCode[0] <= 'Z' && pCode[1] >= 'A' if(str_length(pCode) > 3 && pCode[0] >= 'A' && pCode[0] <= 'Z' && pCode[1] >= 'A'
&& pCode[1] <= 'Z' && pCode[2] >= 'A' && pCode[2] <= 'Z' && pCode[3] == ' ') && pCode[1] <= 'Z' && pCode[2] >= 'A' && pCode[2] <= 'Z')
{ {
str_copy(aCountry, pCode, 4); if(pCode[3] == ' ')
pCode = pCode + 4; {
str_copy(aCountry, pCode, 4);
pCode = pCode + 4;
}
else if(str_length(pCode) > 4 && pCode[4] == ' ')
{
str_copy(aCountry, pCode, 5);
pCode = pCode + 5;
}
else
{
str_copy(aCountry, g_Config.m_SvSqlServerName, sizeof(aCountry));
}
} }
else else
{ {
str_copy(aCountry, g_Config.m_SvSqlServerName, 4); str_copy(aCountry, g_Config.m_SvSqlServerName, sizeof(aCountry));
} }
pSelf->Score()->SaveTeam(Team, pCode, pResult->m_ClientID, aCountry); pSelf->Score()->SaveTeam(Team, pCode, pResult->m_ClientID, aCountry);

View file

@ -476,7 +476,7 @@ void CCharacter::FireWeapon()
for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
Msg.AddInt(((int *)&p)[i]); Msg.AddInt(((int *)&p)[i]);
Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID()); Server()->SendMsg(&Msg, MSGFLAG_VITAL, m_pPlayer->GetCID());
GameServer()->CreateSound(m_Pos, SOUND_GUN_FIRE, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID())); GameServer()->CreateSound(m_Pos, SOUND_GUN_FIRE, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID()));
} }
} break; } break;
@ -510,7 +510,7 @@ void CCharacter::FireWeapon()
Msg.AddInt(((int *)&p)[i]); Msg.AddInt(((int *)&p)[i]);
} }
Server()->SendMsg(&Msg, 0,m_pPlayer->GetCID()); Server()->SendMsg(&Msg, MSGFLAG_VITAL, m_pPlayer->GetCID());
GameServer()->CreateSound(m_Pos, SOUND_SHOTGUN_FIRE);*/ GameServer()->CreateSound(m_Pos, SOUND_SHOTGUN_FIRE);*/
float LaserReach; float LaserReach;
@ -554,7 +554,7 @@ void CCharacter::FireWeapon()
Msg.AddInt(1); Msg.AddInt(1);
for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++)
Msg.AddInt(((int *)&p)[i]); Msg.AddInt(((int *)&p)[i]);
Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID()); Server()->SendMsg(&Msg, MSGFLAG_VITAL, m_pPlayer->GetCID());
GameServer()->CreateSound(m_Pos, SOUND_GRENADE_FIRE, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID())); GameServer()->CreateSound(m_Pos, SOUND_GRENADE_FIRE, Teams()->TeamMask(Team(), -1, m_pPlayer->GetCID()));
} break; } break;

View file

@ -1,14 +1,13 @@
/* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */ /* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */
#include <engine/config.h> #include <engine/config.h>
#include <engine/server.h> #include <engine/server.h>
#include <engine/shared/config.h>
#include <game/generated/protocol.h> #include <game/generated/protocol.h>
#include <game/server/gamecontext.h> #include <game/server/gamecontext.h>
#include <game/server/teams.h> #include <game/server/teams.h>
#include <game/server/gamemodes/DDRace.h> #include <game/server/gamemodes/DDRace.h>
#include "dragger.h" #include "dragger.h"
const int LENGTH = 700;
CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW,
int CatchedTeam, int Layer, int Number) : int CatchedTeam, int Layer, int Number) :
CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER)
@ -39,7 +38,7 @@ void CDragger::Move()
mem_zero(m_SoloEnts, sizeof(m_SoloEnts)); mem_zero(m_SoloEnts, sizeof(m_SoloEnts));
CCharacter *TempEnts[MAX_CLIENTS]; CCharacter *TempEnts[MAX_CLIENTS];
int Num = GameServer()->m_World.FindEntities(m_Pos, LENGTH, int Num = GameServer()->m_World.FindEntities(m_Pos, g_Config.m_SvDraggerRange,
(CEntity**) m_SoloEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); (CEntity**) m_SoloEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER);
mem_copy(TempEnts, m_SoloEnts, sizeof(TempEnts)); mem_copy(TempEnts, m_SoloEnts, sizeof(TempEnts));
@ -118,7 +117,7 @@ void CDragger::Drag()
else else
Res = GameServer()->Collision()->IntersectNoLaserNW(m_Pos, Res = GameServer()->Collision()->IntersectNoLaserNW(m_Pos,
Target->m_Pos, 0, 0); Target->m_Pos, 0, 0);
if (Res || length(m_Pos - Target->m_Pos) > 700) if (Res || length(m_Pos - Target->m_Pos) > g_Config.m_SvDraggerRange)
{ {
Target = 0; Target = 0;
if (i == -1) if (i == -1)

View file

@ -1096,7 +1096,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
Console()->SetFlagMask(CFGFLAG_CHAT); Console()->SetFlagMask(CFGFLAG_CHAT);
if (pPlayer->m_Authed) if (pPlayer->m_Authed)
Console()->SetAccessLevel(pPlayer->m_Authed == CServer::AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : IConsole::ACCESS_LEVEL_MOD); Console()->SetAccessLevel(pPlayer->m_Authed == CServer::AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : pPlayer->m_Authed == CServer::AUTHED_MOD ? IConsole::ACCESS_LEVEL_MOD : IConsole::ACCESS_LEVEL_HELPER);
else else
Console()->SetAccessLevel(IConsole::ACCESS_LEVEL_USER); Console()->SetAccessLevel(IConsole::ACCESS_LEVEL_USER);
Console()->SetPrintOutputLevel(m_ChatPrintCBIndex, 0); Console()->SetPrintOutputLevel(m_ChatPrintCBIndex, 0);

View file

@ -96,9 +96,7 @@ void CFileScore::SaveScoreThread(void *pUser)
void CFileScore::Save() void CFileScore::Save()
{ {
void *pSaveThread = thread_init(SaveScoreThread, this); void *pSaveThread = thread_init(SaveScoreThread, this);
#if defined(CONF_FAMILY_UNIX) thread_detach(pSaveThread);
pthread_detach((pthread_t)pSaveThread);
#endif
} }
void CFileScore::Init() void CFileScore::Init()

View file

@ -95,8 +95,11 @@ bool CSqlScore::Connect()
m_pStatement = m_pConnection->createStatement(); m_pStatement = m_pConnection->createStatement();
// Create database if not exists // Create database if not exists
str_format(aBuf, sizeof(aBuf), "CREATE DATABASE IF NOT EXISTS %s", m_pDatabase); if(g_Config.m_SvSqlCreateTables)
m_pStatement->execute(aBuf); {
str_format(aBuf, sizeof(aBuf), "CREATE DATABASE IF NOT EXISTS %s", m_pDatabase);
m_pStatement->execute(aBuf);
}
// Connect to specific database // Connect to specific database
m_pConnection->setSchema(m_pDatabase); m_pConnection->setSchema(m_pDatabase);
@ -163,25 +166,27 @@ void CSqlScore::Init()
{ {
try try
{ {
// create tables
char aBuf[1024]; char aBuf[1024];
// create tables
if(g_Config.m_SvSqlCreateTables)
{
str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_race (Map VARCHAR(128) BINARY NOT NULL, Name VARCHAR(%d) BINARY NOT NULL, Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , Time FLOAT DEFAULT 0, Server CHAR(4), cp1 FLOAT DEFAULT 0, cp2 FLOAT DEFAULT 0, cp3 FLOAT DEFAULT 0, cp4 FLOAT DEFAULT 0, cp5 FLOAT DEFAULT 0, cp6 FLOAT DEFAULT 0, cp7 FLOAT DEFAULT 0, cp8 FLOAT DEFAULT 0, cp9 FLOAT DEFAULT 0, cp10 FLOAT DEFAULT 0, cp11 FLOAT DEFAULT 0, cp12 FLOAT DEFAULT 0, cp13 FLOAT DEFAULT 0, cp14 FLOAT DEFAULT 0, cp15 FLOAT DEFAULT 0, cp16 FLOAT DEFAULT 0, cp17 FLOAT DEFAULT 0, cp18 FLOAT DEFAULT 0, cp19 FLOAT DEFAULT 0, cp20 FLOAT DEFAULT 0, cp21 FLOAT DEFAULT 0, cp22 FLOAT DEFAULT 0, cp23 FLOAT DEFAULT 0, cp24 FLOAT DEFAULT 0, cp25 FLOAT DEFAULT 0, KEY (Map, Name)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH);
m_pStatement->execute(aBuf);
str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_race (Map VARCHAR(128) BINARY NOT NULL, Name VARCHAR(%d) BINARY NOT NULL, Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , Time FLOAT DEFAULT 0, Server CHAR(3), cp1 FLOAT DEFAULT 0, cp2 FLOAT DEFAULT 0, cp3 FLOAT DEFAULT 0, cp4 FLOAT DEFAULT 0, cp5 FLOAT DEFAULT 0, cp6 FLOAT DEFAULT 0, cp7 FLOAT DEFAULT 0, cp8 FLOAT DEFAULT 0, cp9 FLOAT DEFAULT 0, cp10 FLOAT DEFAULT 0, cp11 FLOAT DEFAULT 0, cp12 FLOAT DEFAULT 0, cp13 FLOAT DEFAULT 0, cp14 FLOAT DEFAULT 0, cp15 FLOAT DEFAULT 0, cp16 FLOAT DEFAULT 0, cp17 FLOAT DEFAULT 0, cp18 FLOAT DEFAULT 0, cp19 FLOAT DEFAULT 0, cp20 FLOAT DEFAULT 0, cp21 FLOAT DEFAULT 0, cp22 FLOAT DEFAULT 0, cp23 FLOAT DEFAULT 0, cp24 FLOAT DEFAULT 0, cp25 FLOAT DEFAULT 0, KEY (Map, Name)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH); str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_teamrace (Map VARCHAR(128) BINARY NOT NULL, Name VARCHAR(%d) BINARY NOT NULL, Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, Time FLOAT DEFAULT 0, ID VARBINARY(16) NOT NULL, KEY Map (Map)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH);
m_pStatement->execute(aBuf); m_pStatement->execute(aBuf);
str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_teamrace (Map VARCHAR(128) BINARY NOT NULL, Name VARCHAR(%d) BINARY NOT NULL, Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, Time FLOAT DEFAULT 0, ID VARBINARY(16) NOT NULL, KEY Map (Map)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH); str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_maps (Map VARCHAR(128) BINARY NOT NULL, Server VARCHAR(32) BINARY NOT NULL, Mapper VARCHAR(128) BINARY NOT NULL, Points INT DEFAULT 0, Stars INT DEFAULT 0, Timestamp TIMESTAMP, UNIQUE KEY Map (Map)) CHARACTER SET utf8 ;", m_pPrefix);
m_pStatement->execute(aBuf); m_pStatement->execute(aBuf);
str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_maps (Map VARCHAR(128) BINARY NOT NULL, Server VARCHAR(32) BINARY NOT NULL, Mapper VARCHAR(128) BINARY NOT NULL, Points INT DEFAULT 0, Stars INT DEFAULT 0, Timestamp TIMESTAMP, UNIQUE KEY Map (Map)) CHARACTER SET utf8 ;", m_pPrefix); str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_saves (Savegame TEXT CHARACTER SET utf8 BINARY NOT NULL, Map VARCHAR(128) BINARY NOT NULL, Code VARCHAR(128) BINARY NOT NULL, Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, Server CHAR(4), UNIQUE KEY (Map, Code)) CHARACTER SET utf8 ;", m_pPrefix);
m_pStatement->execute(aBuf); m_pStatement->execute(aBuf);
str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_saves (Savegame TEXT CHARACTER SET utf8 BINARY NOT NULL, Map VARCHAR(128) BINARY NOT NULL, Code VARCHAR(128) BINARY NOT NULL, Timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, Server CHAR(3), UNIQUE KEY (Map, Code)) CHARACTER SET utf8 ;", m_pPrefix); str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_points (Name VARCHAR(%d) BINARY NOT NULL, Points INT DEFAULT 0, UNIQUE KEY Name (Name)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH);
m_pStatement->execute(aBuf); m_pStatement->execute(aBuf);
str_format(aBuf, sizeof(aBuf), "CREATE TABLE IF NOT EXISTS %s_points (Name VARCHAR(%d) BINARY NOT NULL, Points INT DEFAULT 0, UNIQUE KEY Name (Name)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH); dbg_msg("SQL", "Tables were created successfully");
m_pStatement->execute(aBuf); }
dbg_msg("SQL", "Tables were created successfully");
// get the best time // get the best time
str_format(aBuf, sizeof(aBuf), "SELECT Time FROM %s_race WHERE Map='%s' ORDER BY `Time` ASC LIMIT 0, 1;", m_pPrefix, m_aMap); str_format(aBuf, sizeof(aBuf), "SELECT Time FROM %s_race WHERE Map='%s' ORDER BY `Time` ASC LIMIT 0, 1;", m_pPrefix, m_aMap);
@ -279,9 +284,7 @@ void CSqlScore::LoadScore(int ClientID)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *LoadThread = thread_init(LoadScoreThread, Tmp); void *LoadThread = thread_init(LoadScoreThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(LoadThread);
pthread_detach((pthread_t)LoadThread);
#endif
} }
void CSqlScore::SaveTeamScoreThread(void *pUser) void CSqlScore::SaveTeamScoreThread(void *pUser)
@ -416,9 +419,7 @@ void CSqlScore::MapVote(int ClientID, const char* MapName)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *VoteThread = thread_init(MapVoteThread, Tmp); void *VoteThread = thread_init(MapVoteThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(VoteThread);
pthread_detach((pthread_t)VoteThread);
#endif
} }
void CSqlScore::MapVoteThread(void *pUser) void CSqlScore::MapVoteThread(void *pUser)
@ -518,9 +519,7 @@ void CSqlScore::MapInfo(int ClientID, const char* MapName)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *InfoThread = thread_init(MapInfoThread, Tmp); void *InfoThread = thread_init(MapInfoThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(InfoThread);
pthread_detach((pthread_t)InfoThread);
#endif
} }
void CSqlScore::MapInfoThread(void *pUser) void CSqlScore::MapInfoThread(void *pUser)
@ -693,9 +692,7 @@ void CSqlScore::SaveScore(int ClientID, float Time, float CpTime[NUM_CHECKPOINTS
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *SaveThread = thread_init(SaveScoreThread, Tmp); void *SaveThread = thread_init(SaveScoreThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(SaveThread);
pthread_detach((pthread_t)SaveThread);
#endif
} }
void CSqlScore::SaveTeamScore(int* aClientIDs, unsigned int Size, float Time) void CSqlScore::SaveTeamScore(int* aClientIDs, unsigned int Size, float Time)
@ -714,9 +711,7 @@ void CSqlScore::SaveTeamScore(int* aClientIDs, unsigned int Size, float Time)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *SaveTeamThread = thread_init(SaveTeamScoreThread, Tmp); void *SaveTeamThread = thread_init(SaveTeamScoreThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(SaveTeamThread);
pthread_detach((pthread_t)SaveTeamThread);
#endif
} }
void CSqlScore::ShowTeamRankThread(void *pUser) void CSqlScore::ShowTeamRankThread(void *pUser)
@ -836,7 +831,7 @@ void CSqlScore::ShowTeamTop5Thread(void *pUser)
char aNames[2300]; char aNames[2300];
int Rank = 0; int Rank = 0;
float Time = 0; float Time = 0;
int aCuts[Rows]; int aCuts[320]; // 64 * 5
int CutPos = 0; int CutPos = 0;
aNames[0] = '\0'; aNames[0] = '\0';
@ -983,9 +978,7 @@ void CSqlScore::ShowTeamRank(int ClientID, const char* pName, bool Search)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *TeamRankThread = thread_init(ShowTeamRankThread, Tmp); void *TeamRankThread = thread_init(ShowTeamRankThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(TeamRankThread);
pthread_detach((pthread_t)TeamRankThread);
#endif
} }
void CSqlScore::ShowRank(int ClientID, const char* pName, bool Search) void CSqlScore::ShowRank(int ClientID, const char* pName, bool Search)
@ -998,9 +991,7 @@ void CSqlScore::ShowRank(int ClientID, const char* pName, bool Search)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *RankThread = thread_init(ShowRankThread, Tmp); void *RankThread = thread_init(ShowRankThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(RankThread);
pthread_detach((pthread_t)RankThread);
#endif
} }
void CSqlScore::ShowTop5Thread(void *pUser) void CSqlScore::ShowTop5Thread(void *pUser)
@ -1152,9 +1143,7 @@ void CSqlScore::ShowTeamTop5(IConsole::IResult *pResult, int ClientID, void *pUs
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *TeamTop5Thread = thread_init(ShowTeamTop5Thread, Tmp); void *TeamTop5Thread = thread_init(ShowTeamTop5Thread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(TeamTop5Thread);
pthread_detach((pthread_t)TeamTop5Thread);
#endif
} }
void CSqlScore::ShowTop5(IConsole::IResult *pResult, int ClientID, void *pUserData, int Debut) void CSqlScore::ShowTop5(IConsole::IResult *pResult, int ClientID, void *pUserData, int Debut)
@ -1165,9 +1154,7 @@ void CSqlScore::ShowTop5(IConsole::IResult *pResult, int ClientID, void *pUserDa
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *Top5Thread = thread_init(ShowTop5Thread, Tmp); void *Top5Thread = thread_init(ShowTop5Thread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(Top5Thread);
pthread_detach((pthread_t)Top5Thread);
#endif
} }
void CSqlScore::ShowTimes(int ClientID, int Debut) void CSqlScore::ShowTimes(int ClientID, int Debut)
@ -1179,9 +1166,7 @@ void CSqlScore::ShowTimes(int ClientID, int Debut)
Tmp->m_Search = false; Tmp->m_Search = false;
void *TimesThread = thread_init(ShowTimesThread, Tmp); void *TimesThread = thread_init(ShowTimesThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(TimesThread);
pthread_detach((pthread_t)TimesThread);
#endif
} }
void CSqlScore::ShowTimes(int ClientID, const char* pName, int Debut) void CSqlScore::ShowTimes(int ClientID, const char* pName, int Debut)
@ -1194,9 +1179,7 @@ void CSqlScore::ShowTimes(int ClientID, const char* pName, int Debut)
Tmp->m_Search = true; Tmp->m_Search = true;
void *TimesThread = thread_init(ShowTimesThread, Tmp); void *TimesThread = thread_init(ShowTimesThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(TimesThread);
pthread_detach((pthread_t)TimesThread);
#endif
} }
void CSqlScore::FuzzyString(char *pString) void CSqlScore::FuzzyString(char *pString)
@ -1221,7 +1204,7 @@ void CSqlScore::FuzzyString(char *pString)
// anti SQL injection // anti SQL injection
void CSqlScore::ClearString(char *pString, int size) void CSqlScore::ClearString(char *pString, int size)
{ {
char newString[size*2-1]; char *newString = (char *)malloc(size * 2 - 1);
int pos = 0; int pos = 0;
for(int i=0;i<size;i++) for(int i=0;i<size;i++)
@ -1250,6 +1233,7 @@ void CSqlScore::ClearString(char *pString, int size)
newString[pos] = '\0'; newString[pos] = '\0';
strcpy(pString,newString); strcpy(pString,newString);
free(newString);
} }
void CSqlScore::agoTimeToString(int agoTime, char agoString[]) void CSqlScore::agoTimeToString(int agoTime, char agoString[])
@ -1399,9 +1383,7 @@ void CSqlScore::ShowPoints(int ClientID, const char* pName, bool Search)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *PointsThread = thread_init(ShowPointsThread, Tmp); void *PointsThread = thread_init(ShowPointsThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(PointsThread);
pthread_detach((pthread_t)PointsThread);
#endif
} }
void CSqlScore::ShowTopPointsThread(void *pUser) void CSqlScore::ShowTopPointsThread(void *pUser)
@ -1463,9 +1445,7 @@ void CSqlScore::ShowTopPoints(IConsole::IResult *pResult, int ClientID, void *pU
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *TopPointsThread = thread_init(ShowTopPointsThread, Tmp); void *TopPointsThread = thread_init(ShowTopPointsThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(TopPointsThread);
pthread_detach((pthread_t)TopPointsThread);
#endif
} }
void CSqlScore::RandomMapThread(void *pUser) void CSqlScore::RandomMapThread(void *pUser)
@ -1589,9 +1569,7 @@ void CSqlScore::RandomMap(int ClientID, int stars)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *RandomThread = thread_init(RandomMapThread, Tmp); void *RandomThread = thread_init(RandomMapThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(RandomThread);
pthread_detach((pthread_t)RandomThread);
#endif
} }
void CSqlScore::RandomUnfinishedMap(int ClientID, int stars) void CSqlScore::RandomUnfinishedMap(int ClientID, int stars)
@ -1603,9 +1581,7 @@ void CSqlScore::RandomUnfinishedMap(int ClientID, int stars)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *RandomUnfinishedThread = thread_init(RandomUnfinishedMapThread, Tmp); void *RandomUnfinishedThread = thread_init(RandomUnfinishedMapThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(RandomUnfinishedThread);
pthread_detach((pthread_t)RandomUnfinishedThread);
#endif
} }
void CSqlScore::SaveTeam(int Team, const char* Code, int ClientID, const char* Server) void CSqlScore::SaveTeam(int Team, const char* Code, int ClientID, const char* Server)
@ -1630,9 +1606,7 @@ void CSqlScore::SaveTeam(int Team, const char* Code, int ClientID, const char* S
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *SaveThread = thread_init(SaveTeamThread, Tmp); void *SaveThread = thread_init(SaveTeamThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(SaveThread);
pthread_detach((pthread_t)SaveThread);
#endif
} }
void CSqlScore::SaveTeamThread(void *pUser) void CSqlScore::SaveTeamThread(void *pUser)
@ -1745,9 +1719,7 @@ void CSqlScore::LoadTeam(const char* Code, int ClientID)
Tmp->m_pSqlData = this; Tmp->m_pSqlData = this;
void *LoadThread = thread_init(LoadTeamThread, Tmp); void *LoadThread = thread_init(LoadTeamThread, Tmp);
#if defined(CONF_FAMILY_UNIX) thread_detach(LoadThread);
pthread_detach((pthread_t)LoadThread);
#endif
} }
void CSqlScore::LoadTeamThread(void *pUser) void CSqlScore::LoadTeamThread(void *pUser)
@ -1776,7 +1748,7 @@ void CSqlScore::LoadTeamThread(void *pUser)
if (pData->m_pSqlData->m_pResults->rowsCount() > 0) if (pData->m_pSqlData->m_pResults->rowsCount() > 0)
{ {
pData->m_pSqlData->m_pResults->first(); pData->m_pSqlData->m_pResults->first();
char ServerName[4]; char ServerName[5];
str_copy(ServerName, pData->m_pSqlData->m_pResults->getString("Server").c_str(), sizeof(ServerName)); str_copy(ServerName, pData->m_pSqlData->m_pResults->getString("Server").c_str(), sizeof(ServerName));
if(str_comp(ServerName, g_Config.m_SvSqlServerName)) if(str_comp(ServerName, g_Config.m_SvSqlServerName))
{ {

View file

@ -144,7 +144,7 @@ struct CSqlTeamSave
int m_Team; int m_Team;
int m_ClientID; int m_ClientID;
char m_Code[128]; char m_Code[128];
char m_Server[4]; char m_Server[5];
CSqlScore *m_pSqlData; CSqlScore *m_pSqlData;
}; };

View file

@ -623,11 +623,21 @@ void CGameTeams::OnCharacterDeath(int ClientID, int Weapon)
SetForceCharacterTeam(ClientID, Team); SetForceCharacterTeam(ClientID, Team);
if (GetTeamState(Team) != TEAMSTATE_OPEN) if (GetTeamState(Team) != TEAMSTATE_OPEN)
{
ChangeTeamState(Team, CGameTeams::TEAMSTATE_OPEN);
char aBuf[512];
str_format(aBuf, sizeof(aBuf), "Everyone in your locked team was killed because you %s.", Weapon == WEAPON_SELF ? "killed" : "died");
GameServer()->SendChatTarget(ClientID, aBuf);
str_format(aBuf, sizeof(aBuf), "Everyone in your locked team was killed because '%s' %s.", Server()->ClientName(ClientID), Weapon == WEAPON_SELF ? "killed" : "died");
for (int i = 0; i < MAX_CLIENTS; i++) for (int i = 0; i < MAX_CLIENTS; i++)
if(m_Core.Team(i) == Team && i != ClientID && GameServer()->m_apPlayers[i]) if(m_Core.Team(i) == Team && i != ClientID && GameServer()->m_apPlayers[i])
GameServer()->m_apPlayers[i]->KillCharacter(-2); {
GameServer()->m_apPlayers[i]->KillCharacter(WEAPON_SELF);
ChangeTeamState(Team, CGameTeams::TEAMSTATE_OPEN); GameServer()->SendChatTarget(i, aBuf);
}
}
} }
} }

View file

@ -7,16 +7,17 @@
// client // client
MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Predict client movements") MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Predict client movements")
MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Antiping limit (0 to disable)") MACRO_CONFIG_INT(ClAntiPingLimit, cl_antiping_limit, 0, 0, 200, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Antiping limit (0 to disable)")
MACRO_CONFIG_INT(ClAntiPing, cl_antiping, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Antiping (sets all Antiping settings)") MACRO_CONFIG_INT(ClAntiPing, cl_antiping, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Enable antiping, i. e. more aggressive prediction.")
MACRO_CONFIG_INT(ClAntiPingPlayers, cl_antiping_players, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Antiping (predict other players' movements)") MACRO_CONFIG_INT(ClAntiPingPlayers, cl_antiping_players, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Predict other player's movement more aggressively (only enabled if cl_antiping is set to 1)")
MACRO_CONFIG_INT(ClAntiPingGrenade, cl_antiping_grenade, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Antiping (predict grenades)") MACRO_CONFIG_INT(ClAntiPingGrenade, cl_antiping_grenade, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Predict grenades (only enabled if cl_antiping is set to 1)")
MACRO_CONFIG_INT(ClAntiPingWeapons, cl_antiping_weapons, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Antiping (predict weapons)") MACRO_CONFIG_INT(ClAntiPingWeapons, cl_antiping_weapons, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Predict weapon projectiles (only enabled if cl_antiping is set to 1)")
MACRO_CONFIG_INT(ClNameplates, cl_nameplates, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show name plates") MACRO_CONFIG_INT(ClNameplates, cl_nameplates, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show name plates")
MACRO_CONFIG_INT(ClNameplatesAlways, cl_nameplates_always, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Always show name plates disregarding of distance") MACRO_CONFIG_INT(ClNameplatesAlways, cl_nameplates_always, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Always show name plates disregarding of distance")
MACRO_CONFIG_INT(ClNameplatesTeamcolors, cl_nameplates_teamcolors, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Use team colors for name plates") MACRO_CONFIG_INT(ClNameplatesTeamcolors, cl_nameplates_teamcolors, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Use team colors for name plates")
MACRO_CONFIG_INT(ClNameplatesSize, cl_nameplates_size, 50, 0, 100, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Size of the name plates from 0 to 100%") MACRO_CONFIG_INT(ClNameplatesSize, cl_nameplates_size, 50, 0, 100, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Size of the name plates from 0 to 100%")
MACRO_CONFIG_INT(ClNameplatesClan, cl_nameplates_clan, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show clan in name plates") MACRO_CONFIG_INT(ClNameplatesClan, cl_nameplates_clan, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show clan in name plates")
MACRO_CONFIG_INT(ClNameplatesClanSize, cl_nameplates_clan_size, 30, 0, 100, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Size of the clan plates from 0 to 100%") MACRO_CONFIG_INT(ClNameplatesClanSize, cl_nameplates_clan_size, 30, 0, 100, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Size of the clan plates from 0 to 100%")
MACRO_CONFIG_INT(ClTextEntities, cl_text_entities, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Render textual entity data")
#if defined(__ANDROID__) #if defined(__ANDROID__)
MACRO_CONFIG_INT(ClAutoswitchWeapons, cl_autoswitch_weapons, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Auto switch weapon on pickup") MACRO_CONFIG_INT(ClAutoswitchWeapons, cl_autoswitch_weapons, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Auto switch weapon on pickup")
MACRO_CONFIG_INT(ClAutoswitchWeaponsOutOfAmmo, cl_autoswitch_weapons_out_of_ammo, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Auto switch weapon when out of ammo") MACRO_CONFIG_INT(ClAutoswitchWeaponsOutOfAmmo, cl_autoswitch_weapons_out_of_ammo, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Auto switch weapon when out of ammo")

View file

@ -1,7 +1,7 @@
#include <NSString.h> #import <Foundation/Foundation.h>
#include <NSUserNotification.h> #import <Foundation/NSUserNotification.h>
#include <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#include "notification.h" #import "notification.h"
void CNotification::notify(const char *pTitle, const char *pMsg) void CNotification::notify(const char *pTitle, const char *pMsg)
{ {