mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-14 03:58:18 +00:00
Merge branch 'master' into pr/317
This commit is contained in:
commit
8d9dd65f0b
|
@ -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.
|
||||||
|
|
|
@ -27,6 +27,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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
96
bam.lua
96
bam.lua
|
@ -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")}
|
||||||
|
@ -179,9 +199,16 @@ function build(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,11 +255,9 @@ 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
|
||||||
|
|
||||||
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
BIN
other/opus/windows/lib32/libwinpthread-1.dll
Executable file
BIN
other/opus/windows/lib32/libwinpthread-1.dll
Executable file
Binary file not shown.
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
@ -1890,6 +1890,8 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if((pPacket->m_Flags&NET_CHUNKFLAG_VITAL) != 0 || Msg == NETMSGTYPE_SV_EXTRAPROJECTILE)
|
||||||
{
|
{
|
||||||
// game message
|
// game message
|
||||||
for(int i = 0; i < RECORDER_MAX; i++)
|
for(int i = 0; i < RECORDER_MAX; i++)
|
||||||
|
@ -1898,6 +1900,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
|
||||||
|
|
||||||
GameClient()->OnMessage(Msg, &Unpacker);
|
GameClient()->OnMessage(Msg, &Unpacker);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CClient::ProcessServerPacketDummy(CNetChunk *pPacket)
|
void CClient::ProcessServerPacketDummy(CNetChunk *pPacket)
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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];
|
||||||
|
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);
|
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 ||
|
||||||
|
(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))
|
(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;
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CServer::ConchainRconHelperPasswordChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
|
||||||
|
{
|
||||||
|
pfnCallback(pResult, pCallbackUserData);
|
||||||
|
if(pResult->NumArguments() == 1)
|
||||||
|
{
|
||||||
|
CServer *pServer = (CServer *)pUserData;
|
||||||
|
pServer->LogoutByAuthLevel(AUTHED_HELPER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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) \
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,10 +206,13 @@ void CNetConnection::Disconnect(const char *pReason)
|
||||||
else
|
else
|
||||||
SendControl(NET_CTRLMSG_CLOSE, 0, 0);
|
SendControl(NET_CTRLMSG_CLOSE, 0, 0);
|
||||||
|
|
||||||
|
if(pReason != m_ErrorString)
|
||||||
|
{
|
||||||
m_ErrorString[0] = 0;
|
m_ErrorString[0] = 0;
|
||||||
if(pReason && pReason != m_ErrorString)
|
if(pReason)
|
||||||
str_copy(m_ErrorString, pReason, sizeof(m_ErrorString));
|
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
|
||||||
|
|
|
@ -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]);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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++)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,6 +415,8 @@ void CRenderTools::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, fl
|
||||||
|
|
||||||
Graphics()->QuadsEnd();
|
Graphics()->QuadsEnd();
|
||||||
|
|
||||||
|
if(g_Config.m_ClTextEntities)
|
||||||
|
{
|
||||||
// draw force
|
// draw force
|
||||||
char aBuf[16];
|
char aBuf[16];
|
||||||
str_format(aBuf, sizeof(aBuf), "%d", Force);
|
str_format(aBuf, sizeof(aBuf), "%d", Force);
|
||||||
|
@ -427,12 +432,15 @@ void CRenderTools::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, fl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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')
|
||||||
|
{
|
||||||
|
if(pCode[3] == ' ')
|
||||||
{
|
{
|
||||||
str_copy(aCountry, pCode, 4);
|
str_copy(aCountry, pCode, 4);
|
||||||
pCode = pCode + 4;
|
pCode = pCode + 4;
|
||||||
}
|
}
|
||||||
|
else if(str_length(pCode) > 4 && pCode[4] == ' ')
|
||||||
|
{
|
||||||
|
str_copy(aCountry, pCode, 5);
|
||||||
|
pCode = pCode + 5;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str_copy(aCountry, g_Config.m_SvSqlServerName, 4);
|
str_copy(aCountry, g_Config.m_SvSqlServerName, sizeof(aCountry));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
if(g_Config.m_SvSqlCreateTables)
|
||||||
|
{
|
||||||
str_format(aBuf, sizeof(aBuf), "CREATE DATABASE IF NOT EXISTS %s", m_pDatabase);
|
str_format(aBuf, sizeof(aBuf), "CREATE DATABASE IF NOT EXISTS %s", m_pDatabase);
|
||||||
m_pStatement->execute(aBuf);
|
m_pStatement->execute(aBuf);
|
||||||
|
}
|
||||||
|
|
||||||
// Connect to specific database
|
// Connect to specific database
|
||||||
m_pConnection->setSchema(m_pDatabase);
|
m_pConnection->setSchema(m_pDatabase);
|
||||||
|
@ -163,10 +166,11 @@ void CSqlScore::Init()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// create tables
|
|
||||||
char aBuf[1024];
|
char aBuf[1024];
|
||||||
|
// create tables
|
||||||
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);
|
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);
|
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_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);
|
||||||
|
@ -175,13 +179,14 @@ void CSqlScore::Init()
|
||||||
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_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_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_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_points (Name VARCHAR(%d) BINARY NOT NULL, Points INT DEFAULT 0, UNIQUE KEY Name (Name)) CHARACTER SET utf8 ;", m_pPrefix, MAX_NAME_LENGTH);
|
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);
|
||||||
|
|
||||||
dbg_msg("SQL", "Tables were created successfully");
|
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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue