mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
added "Whitespace and line Endings cleanup" by GreYFoX
This commit is contained in:
parent
63e059b8ff
commit
06115dd49d
44
bam.lua
44
bam.lua
|
@ -23,17 +23,17 @@ end
|
|||
|
||||
function CHash(output, ...)
|
||||
local inputs = TableFlatten({...})
|
||||
|
||||
|
||||
output = Path(output)
|
||||
|
||||
|
||||
-- compile all the files
|
||||
local cmd = Script("scripts/cmd5.py") .. " "
|
||||
for index, inname in ipairs(inputs) do
|
||||
cmd = cmd .. Path(inname) .. " "
|
||||
cmd = cmd .. Path(inname) .. " "
|
||||
end
|
||||
|
||||
|
||||
cmd = cmd .. " > " .. output
|
||||
|
||||
|
||||
AddJob(output, "cmd5 " .. output, cmd)
|
||||
for index, inname in ipairs(inputs) do
|
||||
AddDependency(output, inname)
|
||||
|
@ -73,7 +73,7 @@ function Dat2c(datafile, sourcefile, arrayname)
|
|||
AddJob(
|
||||
sourcefile,
|
||||
"dat2c " .. PathFilename(sourcefile) .. " = " .. PathFilename(datafile),
|
||||
Script("scripts/dat2c.py").. "\" " .. sourcefile .. " " .. datafile .. " " .. arrayname
|
||||
Script("scripts/dat2c.py").. "\" " .. sourcefile .. " " .. datafile .. " " .. arrayname
|
||||
)
|
||||
AddDependency(sourcefile, datafile)
|
||||
return sourcefile
|
||||
|
@ -85,7 +85,7 @@ function ContentCompile(action, output)
|
|||
output,
|
||||
action .. " > " .. output,
|
||||
--Script("datasrc/compile.py") .. "\" ".. Path(output) .. " " .. action
|
||||
Script("datasrc/compile.py") .. " " .. action .. " > " .. Path(output)
|
||||
Script("datasrc/compile.py") .. " " .. action .. " > " .. Path(output)
|
||||
)
|
||||
AddDependency(output, Path("datasrc/content.py")) -- do this more proper
|
||||
AddDependency(output, Path("datasrc/network.py"))
|
||||
|
@ -150,7 +150,7 @@ function build(settings)
|
|||
settings.cc.includes:Add("src")
|
||||
|
||||
if family == "unix" then
|
||||
if platform == "macosx" then
|
||||
if platform == "macosx" then
|
||||
settings.link.frameworks:Add("Carbon")
|
||||
settings.link.frameworks:Add("AppKit")
|
||||
else
|
||||
|
@ -163,7 +163,7 @@ function build(settings)
|
|||
settings.link.libs:Add("ole32")
|
||||
settings.link.libs:Add("shell32")
|
||||
end
|
||||
|
||||
|
||||
-- compile zlib if needed
|
||||
if config.zlib.value == 1 then
|
||||
settings.link.libs:Add("z")
|
||||
|
@ -179,7 +179,7 @@ function build(settings)
|
|||
-- build the small libraries
|
||||
wavpack = Compile(settings, Collect("src/engine/external/wavpack/*.c"))
|
||||
pnglite = Compile(settings, Collect("src/engine/external/pnglite/*.c"))
|
||||
|
||||
|
||||
-- build game components
|
||||
engine_settings = settings:Copy()
|
||||
server_settings = engine_settings:Copy()
|
||||
|
@ -187,18 +187,18 @@ function build(settings)
|
|||
launcher_settings = engine_settings:Copy()
|
||||
|
||||
if family == "unix" then
|
||||
if platform == "macosx" then
|
||||
if platform == "macosx" then
|
||||
client_settings.link.frameworks:Add("OpenGL")
|
||||
client_settings.link.frameworks:Add("AGL")
|
||||
client_settings.link.frameworks:Add("Carbon")
|
||||
client_settings.link.frameworks:Add("Cocoa")
|
||||
launcher_settings.link.frameworks:Add("Cocoa")
|
||||
client_settings.link.frameworks:Add("AGL")
|
||||
client_settings.link.frameworks:Add("Carbon")
|
||||
client_settings.link.frameworks:Add("Cocoa")
|
||||
launcher_settings.link.frameworks:Add("Cocoa")
|
||||
else
|
||||
client_settings.link.libs:Add("X11")
|
||||
client_settings.link.libs:Add("GL")
|
||||
client_settings.link.libs:Add("GLU")
|
||||
end
|
||||
|
||||
|
||||
elseif family == "windows" then
|
||||
client_settings.link.libs:Add("opengl32")
|
||||
client_settings.link.libs:Add("glu32")
|
||||
|
@ -209,11 +209,11 @@ function build(settings)
|
|||
config.sdl:Apply(client_settings)
|
||||
-- apply freetype settings
|
||||
config.freetype:Apply(client_settings)
|
||||
|
||||
|
||||
engine = Compile(engine_settings, Collect("src/engine/shared/*.cpp", "src/base/*.c"))
|
||||
client = Compile(client_settings, Collect("src/engine/client/*.cpp"))
|
||||
server = Compile(server_settings, Collect("src/engine/server/*.cpp"))
|
||||
|
||||
|
||||
versionserver = Compile(settings, Collect("src/versionsrv/*.cpp"))
|
||||
masterserver = Compile(settings, Collect("src/mastersrv/*.cpp"))
|
||||
game_shared = Compile(settings, Collect("src/game/*.cpp"), nethash, network_source)
|
||||
|
@ -230,13 +230,13 @@ function build(settings)
|
|||
client_osxlaunch = Compile(client_settings, "src/osxlaunch/client.m")
|
||||
server_osxlaunch = Compile(launcher_settings, "src/osxlaunch/server.m")
|
||||
end
|
||||
|
||||
|
||||
tools = {}
|
||||
for i,v in ipairs(tools_src) do
|
||||
toolname = PathFilename(PathBase(v))
|
||||
tools[i] = Link(settings, toolname, Compile(settings, v), engine, zlib, pnglite)
|
||||
end
|
||||
|
||||
|
||||
-- build client, server, version server and master server
|
||||
client_exe = Link(client_settings, "teeworlds", game_shared, game_client,
|
||||
engine, client, game_editor, zlib, pnglite, wavpack,
|
||||
|
@ -249,7 +249,7 @@ function build(settings)
|
|||
if platform == "macosx" then
|
||||
serverlaunch = Link(launcher_settings, "serverlaunch", server_osxlaunch)
|
||||
end
|
||||
|
||||
|
||||
versionserver_exe = Link(server_settings, "versionsrv", versionserver,
|
||||
engine, zlib)
|
||||
|
||||
|
@ -284,7 +284,7 @@ release_settings.debug = 0
|
|||
release_settings.optimize = 1
|
||||
release_settings.cc.defines:Add("CONF_RELEASE")
|
||||
|
||||
if platform == "macosx" and arch == "ia32" then
|
||||
if platform == "macosx" and arch == "ia32" then
|
||||
debug_settings_ppc = debug_settings:Copy()
|
||||
debug_settings_ppc.config_name = "debug_ppc"
|
||||
debug_settings_ppc.config_ext = "_ppc_d"
|
||||
|
|
|
@ -10,12 +10,12 @@ function NewConfig(on_configured_callback)
|
|||
config.OnConfigured = function(self)
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
if on_configured_callback then config.OnConfigured = on_configured_callback end
|
||||
|
||||
|
||||
config.options = {}
|
||||
config.settings = NewSettings()
|
||||
|
||||
|
||||
config.NewSettings = function(self)
|
||||
local s = NewSettings()
|
||||
for _,v in pairs(self.options) do
|
||||
|
@ -28,25 +28,25 @@ function NewConfig(on_configured_callback)
|
|||
table.insert(self.options, o)
|
||||
self[o.name] = o
|
||||
end
|
||||
|
||||
|
||||
config.Print = function(self)
|
||||
for k,v in pairs(self.options) do
|
||||
print(v:FormatDisplay())
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
config.Save = function(self, filename)
|
||||
print("saved configuration to '"..filename.."'")
|
||||
local file = io.open(filename, "w")
|
||||
|
||||
|
||||
-- Define a little helper function to save options
|
||||
local saver = {}
|
||||
saver.file = file
|
||||
|
||||
|
||||
saver.line = function(self, str)
|
||||
self.file:write(str .. "\n")
|
||||
end
|
||||
|
||||
|
||||
saver.option = function(self, option, name)
|
||||
local valuestr = "no"
|
||||
if type(option[name]) == type(0) then
|
||||
|
@ -64,30 +64,30 @@ function NewConfig(on_configured_callback)
|
|||
self.file:write(option.name.."."..name.." = ".. valuestr.."\n")
|
||||
end
|
||||
|
||||
-- Save all the options
|
||||
-- Save all the options
|
||||
for k,v in pairs(self.options) do
|
||||
v:Save(saver)
|
||||
end
|
||||
file:close()
|
||||
end
|
||||
|
||||
|
||||
config.Load = function(self, filename)
|
||||
local options_func = loadfile(filename)
|
||||
local options_table = {}
|
||||
|
||||
|
||||
if not options_func then
|
||||
print("auto configuration")
|
||||
self:Config(filename)
|
||||
options_func = loadfile(filename)
|
||||
end
|
||||
|
||||
|
||||
if options_func then
|
||||
-- Setup the options tables
|
||||
for k,v in pairs(self.options) do
|
||||
options_table[v.name] = {}
|
||||
end
|
||||
setfenv(options_func, options_table)
|
||||
|
||||
|
||||
-- this is to make sure that we get nice error messages when
|
||||
-- someone sets an option that isn't valid.
|
||||
local mt = {}
|
||||
|
@ -96,8 +96,8 @@ function NewConfig(on_configured_callback)
|
|||
if v ~= nil then return v end
|
||||
error("there is no configuration option named '" .. key .. "'")
|
||||
end
|
||||
|
||||
setmetatable(options_table, mt)
|
||||
|
||||
setmetatable(options_table, mt)
|
||||
|
||||
-- Process the options
|
||||
options_func()
|
||||
|
@ -117,10 +117,10 @@ function NewConfig(on_configured_callback)
|
|||
print("run 'bam config' to generate")
|
||||
print("run 'bam config help' for configuration options")
|
||||
print("")
|
||||
os.exit(1)
|
||||
os.exit(1)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
config.Config = function(self, filename)
|
||||
print("")
|
||||
print("configuration:")
|
||||
|
@ -140,7 +140,7 @@ function NewConfig(on_configured_callback)
|
|||
end
|
||||
print("")
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
config.Autodetect = function(self)
|
||||
|
@ -159,7 +159,7 @@ function NewConfig(on_configured_callback)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
config.Finalize = function(self, filename)
|
||||
if _bam_targets[0] == "config" then
|
||||
if _bam_targets[1] == "help" then
|
||||
|
@ -171,11 +171,11 @@ function NewConfig(on_configured_callback)
|
|||
|
||||
os.exit(0)
|
||||
end
|
||||
|
||||
|
||||
self:Load(filename)
|
||||
bam_update_globalstamp(filename)
|
||||
end
|
||||
|
||||
|
||||
return config
|
||||
end
|
||||
|
||||
|
@ -214,10 +214,10 @@ function MakeOption(name, value, check, save, display, printhelp)
|
|||
o.auto_detected = true
|
||||
o.FormatDisplay = function(self)
|
||||
local a = "SET"
|
||||
if self.auto_detected then a = "AUTO" end
|
||||
if self.auto_detected then a = "AUTO" end
|
||||
return string.format("%-5s %-20s %s", a, self.name, self:Display())
|
||||
end
|
||||
|
||||
|
||||
o.Display = display
|
||||
o.PrintHelp = printhelp
|
||||
if o.Display == nil then o.Display = DefaultOptionDisplay end
|
||||
|
@ -244,16 +244,16 @@ function OptTestCompileC(name, source, compileoptions, desc)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local save = function(option, output)
|
||||
output:option(option, "value")
|
||||
end
|
||||
|
||||
|
||||
local printhelp = function(option)
|
||||
print("\t"..option.name.."=on|off")
|
||||
if option.desc then print("\t\t"..option.desc) end
|
||||
end
|
||||
|
||||
|
||||
local o = MakeOption(name, false, check, save, nil, printhelp)
|
||||
o.desc = desc
|
||||
o.source = source
|
||||
|
@ -275,16 +275,16 @@ function OptToggle(name, default_value, desc)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local save = function(option, output)
|
||||
output:option(option, "value")
|
||||
end
|
||||
|
||||
|
||||
local printhelp = function(option)
|
||||
print("\t"..option.name.."=on|off")
|
||||
if option.desc then print("\t\t"..option.desc) end
|
||||
end
|
||||
|
||||
|
||||
local o = MakeOption(name, default_value, check, save, nil, printhelp)
|
||||
o.desc = desc
|
||||
return o
|
||||
|
@ -297,16 +297,16 @@ function OptInteger(name, default_value, desc)
|
|||
option.value = tonumber(ScriptArgs[option.name])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local save = function(option, output)
|
||||
output:option(option, "value")
|
||||
end
|
||||
|
||||
|
||||
local printhelp = function(option)
|
||||
print("\t"..option.name.."=N")
|
||||
if option.desc then print("\t\t"..option.desc) end
|
||||
end
|
||||
|
||||
|
||||
local o = MakeOption(name, default_value, check, save, nil, printhelp)
|
||||
o.desc = desc
|
||||
return o
|
||||
|
@ -320,16 +320,16 @@ function OptString(name, default_value, desc)
|
|||
option.value = ScriptArgs[option.name]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local save = function(option, output)
|
||||
output:option(option, "value")
|
||||
end
|
||||
|
||||
|
||||
local printhelp = function(option)
|
||||
print("\t"..option.name.."=STRING")
|
||||
if option.desc then print("\t\t"..option.desc) end
|
||||
end
|
||||
|
||||
|
||||
local o = MakeOption(name, default_value, check, save, nil, printhelp)
|
||||
o.desc = desc
|
||||
return o
|
||||
|
@ -354,7 +354,7 @@ function OptCCompiler(name, default_driver, default_c, default_cxx, desc)
|
|||
if ScriptArgs[option.name..".cxx"] then
|
||||
option.cxx_compiler = ScriptArgs[option.name..".cxx"]
|
||||
end
|
||||
|
||||
|
||||
option.auto_detected = false
|
||||
elseif option.driver then
|
||||
-- no need todo anything if we have a driver
|
||||
|
@ -379,11 +379,11 @@ function OptCCompiler(name, default_driver, default_c, default_cxx, desc)
|
|||
else
|
||||
error(option.driver.." is not a known c/c++ compile driver")
|
||||
end
|
||||
|
||||
|
||||
if option.c_compiler then settings.cc.c_compiler = option.c_compiler end
|
||||
if option.cxx_compiler then settings.cc.cxx_compiler = option.cxx_compiler end
|
||||
end
|
||||
|
||||
|
||||
local save = function(option, output)
|
||||
output:option(option, "driver")
|
||||
output:option(option, "c_compiler")
|
||||
|
@ -407,7 +407,7 @@ function OptCCompiler(name, default_driver, default_c, default_cxx, desc)
|
|||
if option.cxx_compiler then s = s .. " cxx="..option.cxx_compiler end
|
||||
return s
|
||||
end
|
||||
|
||||
|
||||
local o = MakeOption(name, nil, check, save, display, printhelp)
|
||||
o.desc = desc
|
||||
o.driver = false
|
||||
|
@ -430,7 +430,7 @@ function OptLibrary(name, header, desc)
|
|||
local check = function(option, settings)
|
||||
option.value = false
|
||||
option.include_path = false
|
||||
|
||||
|
||||
local function check_compile_include(filename, paths)
|
||||
if CTestCompile(settings, "#include <" .. filename .. ">\nint main(){return 0;}", "") then
|
||||
return ""
|
||||
|
@ -441,7 +441,7 @@ function OptLibrary(name, header, desc)
|
|||
return v
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
|
@ -468,12 +468,12 @@ function OptLibrary(name, header, desc)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local save = function(option, output)
|
||||
output:option(option, "value")
|
||||
output:option(option, "include_path")
|
||||
end
|
||||
|
||||
|
||||
local display = function(option)
|
||||
if option.value then
|
||||
if option.include_path then
|
||||
|
@ -490,7 +490,7 @@ function OptLibrary(name, header, desc)
|
|||
print("\t"..option.name.."=disable|system|PATH")
|
||||
if option.desc then print("\t\t"..option.desc) end
|
||||
end
|
||||
|
||||
|
||||
local o = MakeOption(name, false, check, save, display, printhelp)
|
||||
o.include_path = false
|
||||
o.header = header
|
||||
|
|
|
@ -21,7 +21,7 @@ def create_flags_table(names):
|
|||
i += 1
|
||||
lines += ["};"]
|
||||
return lines
|
||||
|
||||
|
||||
def EmitEnum(names, num):
|
||||
print("enum")
|
||||
print("{")
|
||||
|
@ -92,11 +92,11 @@ if gen_client_content_source or gen_server_content_source:
|
|||
|
||||
# NETWORK
|
||||
if gen_network_header:
|
||||
|
||||
|
||||
print("#ifndef GAME_GENERATED_PROTOCOL_H")
|
||||
print("#define GAME_GENERATED_PROTOCOL_H")
|
||||
print(network.RawHeader)
|
||||
|
||||
|
||||
for e in network.Enums:
|
||||
for l in create_enum_table(["%s_%s"%(e.name, v) for v in e.values], 'NUM_%sS'%e.name): print(l)
|
||||
print("")
|
||||
|
@ -104,17 +104,17 @@ if gen_network_header:
|
|||
for e in network.Flags:
|
||||
for l in create_flags_table(["%s_%s" % (e.name, v) for v in e.values]): print(l)
|
||||
print("")
|
||||
|
||||
|
||||
for l in create_enum_table(["NETOBJ_INVALID"]+[o.enum_name for o in network.Objects], "NUM_NETOBJTYPES"): print(l)
|
||||
print("")
|
||||
for l in create_enum_table(["NETMSG_INVALID"]+[o.enum_name for o in network.Messages], "NUM_NETMSGTYPES"): print(l)
|
||||
print("")
|
||||
|
||||
|
||||
for item in network.Objects + network.Messages:
|
||||
for line in item.emit_declaration():
|
||||
print(line)
|
||||
print("")
|
||||
|
||||
|
||||
EmitEnum(["SOUND_%s"%i.name.value.upper() for i in content.container.sounds.items], "NUM_SOUNDS")
|
||||
EmitEnum(["WEAPON_%s"%i.name.value.upper() for i in content.container.weapons.id.items], "NUM_WEAPONS")
|
||||
|
||||
|
@ -127,11 +127,11 @@ class CNetObjHandler
|
|||
char m_aMsgData[1024];
|
||||
int m_NumObjCorrections;
|
||||
int ClampInt(const char *pErrorMsg, int Value, int Min, int Max);
|
||||
|
||||
|
||||
static const char *ms_apObjNames[];
|
||||
static int ms_aObjSizes[];
|
||||
static const char *ms_apMsgNames[];
|
||||
|
||||
|
||||
public:
|
||||
CNetObjHandler();
|
||||
|
||||
|
@ -140,7 +140,7 @@ public:
|
|||
int GetObjSize(int Type);
|
||||
int NumObjCorrections();
|
||||
const char *CorrectedObjOn();
|
||||
|
||||
|
||||
const char *GetMsgName(int Type);
|
||||
void *SecureUnpackMsg(int Type, CUnpacker *pUnpacker);
|
||||
const char *FailedMsgOn();
|
||||
|
@ -149,16 +149,16 @@ public:
|
|||
""")
|
||||
|
||||
print("#endif // GAME_GENERATED_PROTOCOL_H")
|
||||
|
||||
|
||||
|
||||
if gen_network_source:
|
||||
# create names
|
||||
lines = []
|
||||
|
||||
|
||||
lines += ['#include <engine/shared/protocol.h>']
|
||||
lines += ['#include <engine/message.h>']
|
||||
lines += ['#include "protocol.h"']
|
||||
|
||||
|
||||
lines += ['CNetObjHandler::CNetObjHandler()']
|
||||
lines += ['{']
|
||||
lines += ['\tm_pMsgFailedOn = "";']
|
||||
|
@ -202,7 +202,7 @@ if gen_network_source:
|
|||
lines += ['\t""']
|
||||
lines += ['};']
|
||||
lines += ['']
|
||||
|
||||
|
||||
lines += ['const char *CNetObjHandler::GetObjName(int Type)']
|
||||
lines += ['{']
|
||||
lines += ['\tif(Type < 0 || Type >= NUM_NETOBJTYPES) return "(out of range)";']
|
||||
|
@ -216,16 +216,16 @@ if gen_network_source:
|
|||
lines += ['\treturn ms_aObjSizes[Type];']
|
||||
lines += ['};']
|
||||
lines += ['']
|
||||
|
||||
|
||||
|
||||
|
||||
lines += ['const char *CNetObjHandler::GetMsgName(int Type)']
|
||||
lines += ['{']
|
||||
lines += ['\tif(Type < 0 || Type >= NUM_NETMSGTYPES) return "(out of range)";']
|
||||
lines += ['\treturn ms_apMsgNames[Type];']
|
||||
lines += ['};']
|
||||
lines += ['']
|
||||
|
||||
|
||||
|
||||
|
||||
for l in lines:
|
||||
print(l)
|
||||
|
||||
|
@ -255,7 +255,7 @@ if gen_network_source:
|
|||
lines += ['{']
|
||||
lines += ['\tswitch(Type)']
|
||||
lines += ['\t{']
|
||||
|
||||
|
||||
for item in network.Objects:
|
||||
for line in item.emit_validate():
|
||||
lines += ["\t" + line]
|
||||
|
@ -264,9 +264,9 @@ if gen_network_source:
|
|||
lines += ['\treturn -1;']
|
||||
lines += ['};']
|
||||
lines += ['']
|
||||
|
||||
#int Validate(int Type, void *pData, int Size);
|
||||
|
||||
|
||||
#int Validate(int Type, void *pData, int Size);
|
||||
|
||||
if 0:
|
||||
for item in network.Messages:
|
||||
for line in item.emit_unpack():
|
||||
|
@ -281,20 +281,20 @@ if gen_network_source:
|
|||
lines += ['\tsecure_unpack_%s,' % msg.name]
|
||||
lines += ['\t0x0']
|
||||
lines += ['};']
|
||||
|
||||
|
||||
#
|
||||
lines += ['void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)']
|
||||
lines += ['{']
|
||||
lines += ['\tm_pMsgFailedOn = 0;']
|
||||
lines += ['\tswitch(Type)']
|
||||
lines += ['\t{']
|
||||
|
||||
|
||||
|
||||
|
||||
for item in network.Messages:
|
||||
for line in item.emit_unpack():
|
||||
lines += ["\t" + line]
|
||||
lines += ['\t']
|
||||
|
||||
|
||||
lines += ['\tdefault:']
|
||||
lines += ['\t\tm_pMsgFailedOn = "(type out of range)";']
|
||||
lines += ['\t\tbreak;']
|
||||
|
@ -313,6 +313,6 @@ if gen_network_source:
|
|||
|
||||
for l in lines:
|
||||
print(l)
|
||||
|
||||
|
||||
if gen_client_content_header or gen_server_content_header:
|
||||
print("#endif")
|
||||
|
|
|
@ -22,7 +22,7 @@ class Image(Struct):
|
|||
self.name = String(name)
|
||||
self.filename = String(filename)
|
||||
self.id = Int(-1)
|
||||
|
||||
|
||||
class SpriteSet(Struct):
|
||||
def __init__(self, name="", image=None, gridx=0, gridy=0):
|
||||
Struct.__init__(self, "SPRITESET")
|
||||
|
@ -78,7 +78,7 @@ class WeaponSpec(Struct):
|
|||
self.sprite_proj = Pointer(Sprite, Sprite())
|
||||
self.sprite_muzzles = Array(Pointer(Sprite, Sprite()))
|
||||
self.visual_size = Int(96)
|
||||
|
||||
|
||||
self.firedelay = Int(500)
|
||||
self.maxammo = Int(10)
|
||||
self.ammoregentime = Int(0)
|
||||
|
@ -111,7 +111,7 @@ class Weapon_Gun(Struct):
|
|||
self.curvature = Float(1.25)
|
||||
self.speed = Float(2200)
|
||||
self.lifetime = Float(2.0)
|
||||
|
||||
|
||||
class Weapon_Shotgun(Struct):
|
||||
def __init__(self):
|
||||
Struct.__init__(self, "WEAPONSPEC_SHOTGUN")
|
||||
|
@ -119,7 +119,7 @@ class Weapon_Shotgun(Struct):
|
|||
self.curvature = Float(1.25)
|
||||
self.speed = Float(2200)
|
||||
self.speeddiff = Float(0.8)
|
||||
self.lifetime = Float(0.25)
|
||||
self.lifetime = Float(0.25)
|
||||
|
||||
class Weapon_Grenade(Struct):
|
||||
def __init__(self):
|
||||
|
@ -137,7 +137,7 @@ class Weapon_Rifle(Struct):
|
|||
self.bounce_delay = Int(150)
|
||||
self.bounce_num = Int(1)
|
||||
self.bounce_cost = Float(0)
|
||||
|
||||
|
||||
class Weapon_Ninja(Struct):
|
||||
def __init__(self):
|
||||
Struct.__init__(self, "WEAPONSPEC_NINJA")
|
||||
|
@ -190,7 +190,7 @@ container.sounds.Add(SoundSet("player_pain_long", FileList("audio/vo_teefault_pa
|
|||
|
||||
container.sounds.Add(SoundSet("body_land", FileList("audio/foley_land-%02d.wv", 4)))
|
||||
container.sounds.Add(SoundSet("player_airjump", FileList("audio/foley_dbljump-%02d.wv", 3)))
|
||||
container.sounds.Add(SoundSet("player_jump", FileList("audio/foley_foot_left-%02d.wv", 4) + FileList("audio/foley_foot_right-%02d.wv", 4)))
|
||||
container.sounds.Add(SoundSet("player_jump", FileList("audio/foley_foot_left-%02d.wv", 4) + FileList("audio/foley_foot_right-%02d.wv", 4)))
|
||||
container.sounds.Add(SoundSet("player_die", FileList("audio/foley_body_splat-%02d.wv", 3)))
|
||||
container.sounds.Add(SoundSet("player_spawn", FileList("audio/vo_teefault_spawn-%02d.wv", 7)))
|
||||
container.sounds.Add(SoundSet("player_skid", FileList("audio/sfx_skid-%02d.wv", 4)))
|
||||
|
@ -292,7 +292,7 @@ container.sprites.Add(Sprite("armor_empty", set_game, 23,2,2,2))
|
|||
container.sprites.Add(Sprite("star1", set_game, 15,0,2,2))
|
||||
container.sprites.Add(Sprite("star2", set_game, 17,0,2,2))
|
||||
container.sprites.Add(Sprite("star3", set_game, 19,0,2,2))
|
||||
|
||||
|
||||
container.sprites.Add(Sprite("part1", set_game, 6,0,1,1))
|
||||
container.sprites.Add(Sprite("part2", set_game, 6,1,1,1))
|
||||
container.sprites.Add(Sprite("part3", set_game, 7,0,1,1))
|
||||
|
@ -425,35 +425,35 @@ anim.body.frames.Add(AnimKeyframe(0.6, 0, 0, 0))
|
|||
anim.body.frames.Add(AnimKeyframe(0.8, 0,-1, 0))
|
||||
anim.body.frames.Add(AnimKeyframe(1.0, 0, 0, 0))
|
||||
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.0, 8, 0, 0))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.0, 8, 0, 0))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.2, -8, 0, 0))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.4,-10,-4, 0.2))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.6, -8,-8, 0.3))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.8, 4,-4,-0.2))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(1.0, 8, 0, 0))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(0.8, 4,-4,-0.2))
|
||||
anim.back_foot.frames.Add(AnimKeyframe(1.0, 8, 0, 0))
|
||||
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.0,-10,-4, 0.2))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.2, -8,-8, 0.3))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.4, 4,-4,-0.2))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.6, 8, 0, 0))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.8, 8, 0, 0))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.4, 4,-4,-0.2))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.6, 8, 0, 0))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(0.8, 8, 0, 0))
|
||||
anim.front_foot.frames.Add(AnimKeyframe(1.0,-10,-4, 0.2))
|
||||
container.animations.Add(anim)
|
||||
|
||||
anim = Animation("hammer_swing")
|
||||
anim.attach.frames.Add(AnimKeyframe(0.0, 0, 0, -0.10))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.3, 0, 0, 0.25))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.4, 0, 0, 0.30))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.5, 0, 0, 0.25))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.3, 0, 0, 0.25))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.4, 0, 0, 0.30))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.5, 0, 0, 0.25))
|
||||
anim.attach.frames.Add(AnimKeyframe(1.0, 0, 0, -0.10))
|
||||
container.animations.Add(anim)
|
||||
|
||||
|
||||
anim = Animation("ninja_swing")
|
||||
anim.attach.frames.Add(AnimKeyframe(0.00, 0, 0, -0.25))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.10, 0, 0, -0.05))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.15, 0, 0, 0.35))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.42, 0, 0, 0.40))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.50, 0, 0, 0.35))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.15, 0, 0, 0.35))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.42, 0, 0, 0.40))
|
||||
anim.attach.frames.Add(AnimKeyframe(0.50, 0, 0, 0.35))
|
||||
anim.attach.frames.Add(AnimKeyframe(1.00, 0, 0, -0.25))
|
||||
container.animations.Add(anim)
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ def FixCasing(Str):
|
|||
else:
|
||||
NewStr += c.lower()
|
||||
return NewStr
|
||||
|
||||
|
||||
def FormatName(type, name):
|
||||
if "*" in type:
|
||||
return "m_p" + FixCasing(name)
|
||||
|
@ -34,12 +34,12 @@ class BaseType:
|
|||
self._type_name = type_name
|
||||
self._target_name = "INVALID"
|
||||
self._id = GetID() # this is used to remember what order the members have in structures etc
|
||||
|
||||
|
||||
def Identifyer(self): return "x"+str(self._id)
|
||||
def TargetName(self): return self._target_name
|
||||
def TypeName(self): return self._type_name
|
||||
def ID(self): return self._id;
|
||||
|
||||
|
||||
def EmitDeclaration(self, name):
|
||||
return ["%s %s;"%(self.TypeName(), FormatName(self.TypeName(), name))]
|
||||
def EmitPreDefinition(self, target_name):
|
||||
|
@ -52,7 +52,7 @@ class MemberType:
|
|||
def __init__(self, name, var):
|
||||
self.name = name
|
||||
self.var = var
|
||||
|
||||
|
||||
class Struct(BaseType):
|
||||
def __init__(self, type_name):
|
||||
BaseType.__init__(self, type_name)
|
||||
|
@ -71,7 +71,7 @@ class Struct(BaseType):
|
|||
print(v.name, v.var)
|
||||
sys.exit(-1)
|
||||
return m
|
||||
|
||||
|
||||
def EmitTypeDeclaration(self, name):
|
||||
lines = []
|
||||
lines += ["struct " + self.TypeName()]
|
||||
|
@ -93,7 +93,7 @@ class Struct(BaseType):
|
|||
lines += ["\t" + " ".join(member.var.EmitDefinition("")) + ","]
|
||||
lines += ["}"]
|
||||
return lines
|
||||
|
||||
|
||||
class Array(BaseType):
|
||||
def __init__(self, type):
|
||||
BaseType.__init__(self, type.TypeName())
|
||||
|
@ -114,7 +114,7 @@ class Array(BaseType):
|
|||
for item in self.items:
|
||||
lines += item.EmitPreDefinition("%s[%d]"%(self.Identifyer(), i))
|
||||
i += 1
|
||||
|
||||
|
||||
if len(self.items):
|
||||
lines += ["static %s %s[] = {"%(self.TypeName(), self.Identifyer())]
|
||||
for item in self.items:
|
||||
|
@ -123,7 +123,7 @@ class Array(BaseType):
|
|||
lines += ["};"]
|
||||
else:
|
||||
lines += ["static %s *%s = 0;"%(self.TypeName(), self.Identifyer())]
|
||||
|
||||
|
||||
return lines
|
||||
def EmitDefinition(self, name):
|
||||
return [str(len(self.items))+","+self.Identifyer()]
|
||||
|
@ -139,7 +139,7 @@ class Int(BaseType):
|
|||
def EmitDefinition(self, name):
|
||||
return ["%d"%self.value]
|
||||
#return ["%d /* %s */"%(self.value, self._target_name)]
|
||||
|
||||
|
||||
class Float(BaseType):
|
||||
def __init__(self, value):
|
||||
BaseType.__init__(self, "float")
|
||||
|
@ -149,7 +149,7 @@ class Float(BaseType):
|
|||
def EmitDefinition(self, name):
|
||||
return ["%f"%self.value]
|
||||
#return ["%d /* %s */"%(self.value, self._target_name)]
|
||||
|
||||
|
||||
class String(BaseType):
|
||||
def __init__(self, value):
|
||||
BaseType.__init__(self, "const char*")
|
||||
|
@ -158,7 +158,7 @@ class String(BaseType):
|
|||
self.value = value
|
||||
def EmitDefinition(self, name):
|
||||
return ['"'+self.value+'"']
|
||||
|
||||
|
||||
class Pointer(BaseType):
|
||||
def __init__(self, type, target):
|
||||
BaseType.__init__(self, "%s*"%type().TypeName())
|
||||
|
@ -227,7 +227,7 @@ class NetObject:
|
|||
lines += ["\treturn 0;"]
|
||||
lines += ["}"]
|
||||
return lines
|
||||
|
||||
|
||||
|
||||
class NetEvent(NetObject):
|
||||
def __init__(self, name, variables):
|
||||
|
@ -265,12 +265,12 @@ class NetMessage(NetObject):
|
|||
extra += ["\t\t"+line for line in v.emit_pack()]
|
||||
extra += ["\t\treturn pPacker->Error() != 0;"]
|
||||
extra += ["\t}"]
|
||||
|
||||
|
||||
|
||||
|
||||
lines = NetObject.emit_declaration(self)
|
||||
lines = lines[:-1] + extra + lines[-1:]
|
||||
return lines
|
||||
|
||||
|
||||
|
||||
class NetVariable:
|
||||
def __init__(self, name):
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
#define BASE_DETECT_H
|
||||
|
||||
/*
|
||||
this file detected the family, platform and architecture
|
||||
to compile for.
|
||||
this file detected the family, platform and architecture
|
||||
to compile for.
|
||||
*/
|
||||
|
||||
/* platforms */
|
||||
|
|
|
@ -21,20 +21,20 @@
|
|||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <dirent.h>
|
||||
|
||||
|
||||
#if defined(CONF_PLATFORM_MACOSX)
|
||||
#include <Carbon/Carbon.h>
|
||||
#endif
|
||||
|
||||
|
||||
#elif defined(CONF_FAMILY_WINDOWS)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define _WIN32_WINNT 0x0501 /* required for mingw to get getaddrinfo to work */
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
|
@ -176,7 +176,7 @@ void *mem_alloc_debug(const char *filename, int line, unsigned size, unsigned al
|
|||
memory_stats.allocated += header->size;
|
||||
memory_stats.total_allocations++;
|
||||
memory_stats.active_allocations++;
|
||||
|
||||
|
||||
tail->guard = MEM_GUARD_VAL;
|
||||
|
||||
header->prev = (MEMHEADER *)0;
|
||||
|
@ -184,7 +184,7 @@ void *mem_alloc_debug(const char *filename, int line, unsigned size, unsigned al
|
|||
if(first)
|
||||
first->prev = header;
|
||||
first = header;
|
||||
|
||||
|
||||
/*dbg_msg("mem", "++ %p", header+1); */
|
||||
return header+1;
|
||||
}
|
||||
|
@ -195,20 +195,20 @@ void mem_free(void *p)
|
|||
{
|
||||
MEMHEADER *header = (MEMHEADER *)p - 1;
|
||||
MEMTAIL *tail = (MEMTAIL *)(((char*)(header+1))+header->size);
|
||||
|
||||
|
||||
if(tail->guard != MEM_GUARD_VAL)
|
||||
dbg_msg("mem", "!! %p", p);
|
||||
/* dbg_msg("mem", "-- %p", p); */
|
||||
memory_stats.allocated -= header->size;
|
||||
memory_stats.active_allocations--;
|
||||
|
||||
|
||||
if(header->prev)
|
||||
header->prev->next = header->next;
|
||||
else
|
||||
first = header->next;
|
||||
if(header->next)
|
||||
header->next->prev = header->prev;
|
||||
|
||||
|
||||
free(header);
|
||||
}
|
||||
}
|
||||
|
@ -219,7 +219,7 @@ void mem_debug_dump(IOHANDLE file)
|
|||
MEMHEADER *header = first;
|
||||
if(!file)
|
||||
file = io_open("memory.txt", IOFLAG_WRITE);
|
||||
|
||||
|
||||
if(file)
|
||||
{
|
||||
while(header)
|
||||
|
@ -228,7 +228,7 @@ void mem_debug_dump(IOHANDLE file)
|
|||
io_write(file, buf, strlen(buf));
|
||||
header = header->next;
|
||||
}
|
||||
|
||||
|
||||
io_close(file);
|
||||
}
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ IOHANDLE io_open(const char *filename, int flags)
|
|||
WIN32_FIND_DATA finddata;
|
||||
HANDLE handle;
|
||||
int length;
|
||||
|
||||
|
||||
length = str_length(filename);
|
||||
if(!filename || !length || filename[length-1] == '\\')
|
||||
return 0x0;
|
||||
|
@ -630,9 +630,9 @@ int net_host_lookup(const char *hostname, NETADDR *addr, int types)
|
|||
/*
|
||||
dbg_msg("host lookup", "host='%s' port=%d %d", host, port, types);
|
||||
*/
|
||||
|
||||
|
||||
mem_zero(&hints, sizeof(hints));
|
||||
|
||||
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
|
||||
if(types == NETTYPE_IPV4)
|
||||
|
@ -655,8 +655,8 @@ static int parse_int(int *out, const char **str)
|
|||
int i = 0;
|
||||
*out = 0;
|
||||
if(**str < '0' || **str > '9')
|
||||
return -1;
|
||||
|
||||
return -1;
|
||||
|
||||
i = **str - '0';
|
||||
(*str)++;
|
||||
|
||||
|
@ -665,9 +665,9 @@ static int parse_int(int *out, const char **str)
|
|||
if(**str < '0' || **str > '9')
|
||||
{
|
||||
*out = i;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
i = (i*10) + (**str - '0');
|
||||
(*str)++;
|
||||
}
|
||||
|
@ -704,7 +704,7 @@ int net_addr_from_str(NETADDR *addr, const char *string)
|
|||
{
|
||||
const char *str = string;
|
||||
mem_zero(addr, sizeof(NETADDR));
|
||||
|
||||
|
||||
if(str[0] == '[')
|
||||
{
|
||||
/* ipv6 */
|
||||
|
@ -760,10 +760,10 @@ int net_addr_from_str(NETADDR *addr, const char *string)
|
|||
str++;
|
||||
if(parse_uint16(&addr->port, &str)) return -1;
|
||||
}
|
||||
|
||||
|
||||
addr->type = NETTYPE_IPV4;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -825,7 +825,7 @@ static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, i
|
|||
priv_net_close_socket(sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/* set non-blocking */
|
||||
#if defined(CONF_FAMILY_WINDOWS)
|
||||
ioctlsocket(sock, FIONBIO, &mode);
|
||||
|
@ -835,7 +835,7 @@ static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, i
|
|||
|
||||
/* set boardcast */
|
||||
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcast, sizeof(broadcast));
|
||||
|
||||
|
||||
/* return the newly created socket */
|
||||
return sock;
|
||||
}
|
||||
|
@ -937,7 +937,7 @@ int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size
|
|||
{
|
||||
char addrstr[256];
|
||||
net_addr_str(addr, addrstr, sizeof(addrstr));
|
||||
|
||||
|
||||
dbg_msg("net", "sendto error (%d '%s')", errno, strerror(errno));
|
||||
dbg_msg("net", "\tsock = %d %x", sock, sock);
|
||||
dbg_msg("net", "\tsize = %d %x", size, size);
|
||||
|
@ -1005,8 +1005,8 @@ NETSOCKET net_tcp_create(const NETADDR *a)
|
|||
bind(sock.ipv4sock, (struct sockaddr *)&addr, sizeof(addr));
|
||||
}
|
||||
|
||||
/* return */
|
||||
return sock;
|
||||
/* return */
|
||||
return sock;
|
||||
}
|
||||
|
||||
int net_tcp_set_non_blocking(NETSOCKET sock)
|
||||
|
@ -1122,7 +1122,7 @@ int net_tcp_connect_non_blocking(NETSOCKET sock, const NETADDR *a)
|
|||
/*
|
||||
netaddr_to_sockaddr(a, &addr);
|
||||
net_tcp_set_non_blocking(sock);
|
||||
res = connect(sock, &addr, sizeof(addr));
|
||||
res = connect(sock, &addr, sizeof(addr));
|
||||
net_tcp_set_blocking(sock);
|
||||
*/
|
||||
|
||||
|
@ -1206,7 +1206,7 @@ int fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user)
|
|||
|
||||
if(!d)
|
||||
return 0;
|
||||
|
||||
|
||||
str_format(buffer, sizeof(buffer), "%s/", dir);
|
||||
length = str_length(buffer);
|
||||
|
||||
|
@ -1246,7 +1246,7 @@ int fs_storage_path(const char *appname, char *path, int max)
|
|||
for(i = strlen(home)+2; path[i]; i++)
|
||||
path[i] = tolower(path[i]);
|
||||
#endif
|
||||
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
@ -1286,7 +1286,7 @@ int fs_is_dir(const char *path)
|
|||
struct stat sb;
|
||||
if (stat(path, &sb) == -1)
|
||||
return 0;
|
||||
|
||||
|
||||
if (S_ISDIR(sb.st_mode))
|
||||
return 1;
|
||||
else
|
||||
|
@ -1326,7 +1326,7 @@ int fs_parent_dir(char *path)
|
|||
if(*path == '/' || *path == '\\')
|
||||
parent = path;
|
||||
}
|
||||
|
||||
|
||||
if(parent)
|
||||
{
|
||||
*parent = 0;
|
||||
|
@ -1377,16 +1377,16 @@ void swap_endian(void *data, unsigned elem_size, unsigned num)
|
|||
|
||||
int net_socket_read_wait(NETSOCKET sock, int time)
|
||||
{
|
||||
struct timeval tv;
|
||||
fd_set readfds;
|
||||
struct timeval tv;
|
||||
fd_set readfds;
|
||||
int sockid;
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 1000*time;
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 1000*time;
|
||||
sockid = 0;
|
||||
|
||||
FD_ZERO(&readfds);
|
||||
if(sock.ipv4sock >= 0)
|
||||
FD_ZERO(&readfds);
|
||||
if(sock.ipv4sock >= 0)
|
||||
{
|
||||
FD_SET(sock.ipv4sock, &readfds);
|
||||
sockid = sock.ipv4sock;
|
||||
|
@ -1398,8 +1398,8 @@ int net_socket_read_wait(NETSOCKET sock, int time)
|
|||
sockid = sock.ipv6sock;
|
||||
}
|
||||
|
||||
/* don't care about writefds and exceptfds */
|
||||
select(sockid+1, &readfds, NULL, NULL, &tv);
|
||||
/* don't care about writefds and exceptfds */
|
||||
select(sockid+1, &readfds, NULL, NULL, &tv);
|
||||
|
||||
if(sock.ipv4sock >= 0 && FD_ISSET(sock.ipv4sock, &readfds))
|
||||
return 1;
|
||||
|
@ -1407,7 +1407,7 @@ int net_socket_read_wait(NETSOCKET sock, int time)
|
|||
if(sock.ipv6sock >= 0 && FD_ISSET(sock.ipv6sock, &readfds))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned time_timestamp()
|
||||
|
@ -1427,7 +1427,7 @@ void str_append(char *dst, const char *src, int dst_size)
|
|||
s++;
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
dst[dst_size-1] = 0; /* assure null termination */
|
||||
}
|
||||
|
||||
|
@ -1448,12 +1448,12 @@ void str_format(char *buffer, int buffer_size, const char *format, ...)
|
|||
va_list ap;
|
||||
va_start(ap, format);
|
||||
_vsnprintf(buffer, buffer_size, format, ap);
|
||||
va_end(ap);
|
||||
va_end(ap);
|
||||
#else
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
vsnprintf(buffer, buffer_size, format, ap);
|
||||
va_end(ap);
|
||||
va_end(ap);
|
||||
#endif
|
||||
|
||||
buffer[buffer_size-1] = 0; /* assure null termination */
|
||||
|
@ -1578,7 +1578,7 @@ const char *str_find_nocase(const char *haystack, const char *needle)
|
|||
return haystack;
|
||||
haystack++;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1598,7 +1598,7 @@ const char *str_find(const char *haystack, const char *needle)
|
|||
return haystack;
|
||||
haystack++;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1620,7 +1620,7 @@ void str_timestamp(char *buffer, int buffer_size)
|
|||
{
|
||||
time_t time_data;
|
||||
struct tm *time_info;
|
||||
|
||||
|
||||
time(&time_data);
|
||||
time_info = localtime(&time_data);
|
||||
strftime(buffer, buffer_size, "%Y-%m-%d_%H-%M-%S", time_info);
|
||||
|
@ -1700,7 +1700,7 @@ float str_tofloat(const char *str) { return atof(str); }
|
|||
|
||||
static int str_utf8_isstart(char c)
|
||||
{
|
||||
if((c&0xC0) == 0x80) /* 10xxxxxx */
|
||||
if((c&0xC0) == 0x80) /* 10xxxxxx */
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -1721,7 +1721,7 @@ int str_utf8_forward(const char *str, int cursor)
|
|||
const char *buf = str + cursor;
|
||||
if(!buf[0])
|
||||
return cursor;
|
||||
|
||||
|
||||
if((*buf&0x80) == 0x0) /* 0xxxxxxx */
|
||||
return cursor+1;
|
||||
else if((*buf&0xE0) == 0xC0) /* 110xxxxx */
|
||||
|
@ -1742,7 +1742,7 @@ int str_utf8_forward(const char *str, int cursor)
|
|||
if(!buf[3]) return cursor+3;
|
||||
return cursor+4;
|
||||
}
|
||||
|
||||
|
||||
/* invalid */
|
||||
return cursor+1;
|
||||
}
|
||||
|
@ -1776,7 +1776,7 @@ int str_utf8_encode(char *ptr, int chr)
|
|||
ptr[3] = 0x80|(chr&0x3F);
|
||||
return 4;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1784,7 +1784,7 @@ int str_utf8_decode(const char **ptr)
|
|||
{
|
||||
const char *buf = *ptr;
|
||||
int ch = 0;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
if((*buf&0x80) == 0x0) /* 0xxxxxxx */
|
||||
|
@ -1819,7 +1819,7 @@ int str_utf8_decode(const char **ptr)
|
|||
buf++;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
*ptr = buf;
|
||||
return ch;
|
||||
} while(0);
|
||||
|
@ -1827,7 +1827,7 @@ int str_utf8_decode(const char **ptr)
|
|||
/* out of bounds */
|
||||
*ptr = buf;
|
||||
return -1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
int str_utf8_check(const char *str)
|
||||
|
@ -1835,7 +1835,7 @@ int str_utf8_check(const char *str)
|
|||
while(*str)
|
||||
{
|
||||
if((*str&0x80) == 0x0)
|
||||
str++;
|
||||
str++;
|
||||
else if((*str&0xE0) == 0xC0 && (*(str+1)&0xC0) == 0x80)
|
||||
str += 2;
|
||||
else if((*str&0xF0) == 0xE0 && (*(str+1)&0xC0) == 0x80 && (*(str+2)&0xC0) == 0x80)
|
||||
|
|
|
@ -18,28 +18,28 @@ extern "C" {
|
|||
/*
|
||||
Function: dbg_assert
|
||||
Breaks into the debugger based on a test.
|
||||
|
||||
|
||||
Parameters:
|
||||
test - Result of the test.
|
||||
msg - Message that should be printed if the test fails.
|
||||
|
||||
|
||||
Remarks:
|
||||
Does nothing in release version of the library.
|
||||
|
||||
|
||||
See Also:
|
||||
<dbg_break>
|
||||
*/
|
||||
void dbg_assert(int test, const char *msg);
|
||||
#define dbg_assert(test,msg) dbg_assert_imp(__FILE__, __LINE__, test, msg)
|
||||
#define dbg_assert(test,msg) dbg_assert_imp(__FILE__, __LINE__, test, msg)
|
||||
void dbg_assert_imp(const char *filename, int line, int test, const char *msg);
|
||||
|
||||
/*
|
||||
Function: dbg_break
|
||||
Breaks into the debugger.
|
||||
|
||||
|
||||
Remarks:
|
||||
Does nothing in release version of the library.
|
||||
|
||||
|
||||
See Also:
|
||||
<dbg_assert>
|
||||
*/
|
||||
|
@ -47,16 +47,16 @@ void dbg_break();
|
|||
|
||||
/*
|
||||
Function: dbg_msg
|
||||
|
||||
|
||||
Prints a debug message.
|
||||
|
||||
|
||||
Parameters:
|
||||
sys - A string that describes what system the message belongs to
|
||||
fmt - A printf styled format string.
|
||||
|
||||
|
||||
Remarks:
|
||||
Does nothing in release version of the library.
|
||||
|
||||
|
||||
See Also:
|
||||
<dbg_assert>
|
||||
*/
|
||||
|
@ -67,15 +67,15 @@ void dbg_msg(const char *sys, const char *fmt, ...);
|
|||
/*
|
||||
Function: mem_alloc
|
||||
Allocates memory.
|
||||
|
||||
|
||||
Parameters:
|
||||
size - Size of the needed block.
|
||||
alignment - Alignment for the block.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns a pointer to the newly allocated block. Returns a
|
||||
null pointer if the memory couldn't be allocated.
|
||||
|
||||
|
||||
Remarks:
|
||||
- Passing 0 to size will allocated the smallest amount possible
|
||||
and return a unique pointer.
|
||||
|
@ -89,12 +89,12 @@ void *mem_alloc_debug(const char *filename, int line, unsigned size, unsigned al
|
|||
/*
|
||||
Function: mem_free
|
||||
Frees a block allocated through <mem_alloc>.
|
||||
|
||||
|
||||
Remarks:
|
||||
- In the debug version of the library the function will assert if
|
||||
a non-valid block is passed, like a null pointer or a block that
|
||||
isn't allocated.
|
||||
|
||||
|
||||
See Also:
|
||||
<mem_alloc>
|
||||
*/
|
||||
|
@ -103,16 +103,16 @@ void mem_free(void *block);
|
|||
/*
|
||||
Function: mem_copy
|
||||
Copies a a memory block.
|
||||
|
||||
|
||||
Parameters:
|
||||
dest - Destination.
|
||||
source - Source to copy.
|
||||
size - Size of the block to copy.
|
||||
|
||||
|
||||
Remarks:
|
||||
- This functions DOES NOT handles cases where source and
|
||||
destination is overlapping.
|
||||
|
||||
|
||||
See Also:
|
||||
<mem_move>
|
||||
*/
|
||||
|
@ -121,16 +121,16 @@ void mem_copy(void *dest, const void *source, unsigned size);
|
|||
/*
|
||||
Function: mem_move
|
||||
Copies a a memory block
|
||||
|
||||
|
||||
Parameters:
|
||||
dest - Destination
|
||||
source - Source to copy
|
||||
size - Size of the block to copy
|
||||
|
||||
|
||||
Remarks:
|
||||
- This functions handles cases where source and destination
|
||||
is overlapping
|
||||
|
||||
|
||||
See Also:
|
||||
<mem_copy>
|
||||
*/
|
||||
|
@ -139,7 +139,7 @@ void mem_move(void *dest, const void *source, unsigned size);
|
|||
/*
|
||||
Function: mem_zero
|
||||
Sets a complete memory block to 0
|
||||
|
||||
|
||||
Parameters:
|
||||
block - Pointer to the block to zero out
|
||||
size - Size of the block
|
||||
|
@ -149,12 +149,12 @@ void mem_zero(void *block, unsigned size);
|
|||
/*
|
||||
Function: mem_comp
|
||||
Compares two blocks of memory
|
||||
|
||||
|
||||
Parameters:
|
||||
a - First block of data
|
||||
b - Second block of data
|
||||
size - Size of the data to compare
|
||||
|
||||
|
||||
Returns:
|
||||
<0 - Block a is lesser then block b
|
||||
0 - Block a is equal to block b
|
||||
|
@ -168,7 +168,7 @@ int mem_comp(const void *a, const void *b, int size);
|
|||
Will trigger a assert if memory has failed.
|
||||
*/
|
||||
int mem_check_imp();
|
||||
#define mem_check() dbg_assert_imp(__FILE__, __LINE__, mem_check_imp(), "Memory check failed")
|
||||
#define mem_check() dbg_assert_imp(__FILE__, __LINE__, mem_check_imp(), "Memory check failed")
|
||||
|
||||
/* Group: File IO */
|
||||
enum {
|
||||
|
@ -205,7 +205,7 @@ IOHANDLE io_open(const char *filename, int flags);
|
|||
io - Handle to the file to read data from.
|
||||
buffer - Pointer to the buffer that will recive the data.
|
||||
size - Number of bytes to read from the file.
|
||||
|
||||
|
||||
Returns:
|
||||
Number of bytes read.
|
||||
|
||||
|
@ -215,11 +215,11 @@ unsigned io_read(IOHANDLE io, void *buffer, unsigned size);
|
|||
/*
|
||||
Function: io_skip
|
||||
Skips data in a file.
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
size - Number of bytes to skip.
|
||||
|
||||
|
||||
Returns:
|
||||
Number of bytes skipped.
|
||||
*/
|
||||
|
@ -228,12 +228,12 @@ unsigned io_skip(IOHANDLE io, int size);
|
|||
/*
|
||||
Function: io_write
|
||||
Writes data from a buffer to file.
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
buffer - Pointer to the data that should be written.
|
||||
size - Number of bytes to write.
|
||||
|
||||
|
||||
Returns:
|
||||
Number of bytes written.
|
||||
*/
|
||||
|
@ -242,12 +242,12 @@ unsigned io_write(IOHANDLE io, const void *buffer, unsigned size);
|
|||
/*
|
||||
Function: io_seek
|
||||
Seeks to a specified offset in the file.
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
offset - Offset from pos to stop.
|
||||
origin - Position to start searching from.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success.
|
||||
*/
|
||||
|
@ -256,10 +256,10 @@ int io_seek(IOHANDLE io, int offset, int origin);
|
|||
/*
|
||||
Function: io_tell
|
||||
Gets the current position in the file.
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns the current position. -1L if an error occured.
|
||||
*/
|
||||
|
@ -268,10 +268,10 @@ long int io_tell(IOHANDLE io);
|
|||
/*
|
||||
Function: io_length
|
||||
Gets the total length of the file. Resetting cursor to the beginning
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns the total size. -1L if an error occured.
|
||||
*/
|
||||
|
@ -280,10 +280,10 @@ long int io_length(IOHANDLE io);
|
|||
/*
|
||||
Function: io_close
|
||||
Closes a file.
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success.
|
||||
*/
|
||||
|
@ -292,10 +292,10 @@ int io_close(IOHANDLE io);
|
|||
/*
|
||||
Function: io_flush
|
||||
Empties all buffers and writes all pending data.
|
||||
|
||||
|
||||
Parameters:
|
||||
io - Handle to the file.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success.
|
||||
*/
|
||||
|
@ -326,7 +326,7 @@ IOHANDLE io_stderr();
|
|||
/*
|
||||
Function: thread_sleep
|
||||
Suspends the current thread for a given period.
|
||||
|
||||
|
||||
Parameters:
|
||||
milliseconds - Number of milliseconds to sleep.
|
||||
*/
|
||||
|
@ -335,18 +335,18 @@ void thread_sleep(int milliseconds);
|
|||
/*
|
||||
Function: thread_create
|
||||
Creates a new thread.
|
||||
|
||||
|
||||
Parameters:
|
||||
threadfunc - Entry point for the new thread.
|
||||
user - Pointer to pass to the thread.
|
||||
|
||||
|
||||
*/
|
||||
void *thread_create(void (*threadfunc)(void *), void *user);
|
||||
|
||||
/*
|
||||
Function: thread_wait
|
||||
Waits for a thread to be done or destroyed.
|
||||
|
||||
|
||||
Parameters:
|
||||
thread - Thread to wait for.
|
||||
*/
|
||||
|
@ -355,7 +355,7 @@ void thread_wait(void *thread);
|
|||
/*
|
||||
Function: thread_destroy
|
||||
Destroys a thread.
|
||||
|
||||
|
||||
Parameters:
|
||||
thread - Thread to destroy.
|
||||
*/
|
||||
|
@ -390,7 +390,7 @@ typedef long long int64;
|
|||
/*
|
||||
Function: time_get
|
||||
Fetches a sample from a high resolution timer.
|
||||
|
||||
|
||||
Returns:
|
||||
Current value of the timer.
|
||||
|
||||
|
@ -402,7 +402,7 @@ int64 time_get();
|
|||
/*
|
||||
Function: time_freq
|
||||
Returns the frequency of the high resolution timer.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns the frequency of the high resolution timer.
|
||||
*/
|
||||
|
@ -411,7 +411,7 @@ int64 time_freq();
|
|||
/*
|
||||
Function: time_timestamp
|
||||
Retrives the current time as a UNIX timestamp
|
||||
|
||||
|
||||
Returns:
|
||||
The time as a UNIX timestamp
|
||||
*/
|
||||
|
@ -428,7 +428,7 @@ typedef struct
|
|||
enum
|
||||
{
|
||||
NETADDR_MAXSTRSIZE = 1+(8*4+7)+1+1+5+1, // [XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]:XXXXX
|
||||
|
||||
|
||||
NETTYPE_INVALID = 0,
|
||||
NETTYPE_IPV4 = 1,
|
||||
NETTYPE_IPV6 = 2,
|
||||
|
@ -446,10 +446,10 @@ typedef struct
|
|||
/*
|
||||
Function: net_init
|
||||
Initiates network functionallity.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success,
|
||||
|
||||
|
||||
Remarks:
|
||||
You must call this function before using any other network
|
||||
functions.
|
||||
|
@ -469,11 +469,11 @@ int net_host_lookup(const char *hostname, NETADDR *addr, int types);
|
|||
/*
|
||||
Function: net_addr_comp
|
||||
Compares two network addresses.
|
||||
|
||||
|
||||
Parameters:
|
||||
a - Address to compare
|
||||
b - Address to compare to.
|
||||
|
||||
|
||||
Returns:
|
||||
<0 - Address a is lesser then address b
|
||||
0 - Address a is equal to address b
|
||||
|
@ -484,12 +484,12 @@ int net_addr_comp(const NETADDR *a, const NETADDR *b);
|
|||
/*
|
||||
Function: net_addr_str
|
||||
Turns a network address into a representive string.
|
||||
|
||||
|
||||
Parameters:
|
||||
addr - Address to turn into a string.
|
||||
string - Buffer to fill with the string.
|
||||
max_length - Maximum size of the string.
|
||||
|
||||
|
||||
Remarks:
|
||||
- The string will always be zero terminated
|
||||
|
||||
|
@ -499,10 +499,10 @@ void net_addr_str(const NETADDR *addr, char *string, int max_length);
|
|||
/*
|
||||
Function: net_addr_from_str
|
||||
Turns string into a network address.
|
||||
|
||||
|
||||
Returns:
|
||||
0 on success
|
||||
|
||||
|
||||
Parameters:
|
||||
addr - Address to fill in.
|
||||
string - String to parse.
|
||||
|
@ -517,7 +517,7 @@ int net_addr_from_str(NETADDR *addr, const char *string);
|
|||
|
||||
Parameters:
|
||||
bindaddr - Address to bind the socket to.
|
||||
|
||||
|
||||
Returns:
|
||||
On success it returns an handle to the socket. On failure it
|
||||
returns NETSOCKET_INVALID.
|
||||
|
@ -533,7 +533,7 @@ NETSOCKET net_udp_create(NETADDR bindaddr);
|
|||
addr - Where to send the packet.
|
||||
data - Pointer to the packet data to send.
|
||||
size - Size of the packet.
|
||||
|
||||
|
||||
Returns:
|
||||
On success it returns the number of bytes sent. Returns -1
|
||||
on error.
|
||||
|
@ -549,7 +549,7 @@ int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size
|
|||
addr - Pointer to an NETADDR that will recive the address.
|
||||
data - Pointer to a buffer that will recive the data.
|
||||
maxsize - Maximum size to recive.
|
||||
|
||||
|
||||
Returns:
|
||||
On success it returns the number of bytes recived. Returns -1
|
||||
on error.
|
||||
|
@ -562,7 +562,7 @@ int net_udp_recv(NETSOCKET sock, NETADDR *addr, void *data, int maxsize);
|
|||
|
||||
Parameters:
|
||||
sock - Socket to close.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success. -1 on error.
|
||||
*/
|
||||
|
@ -574,7 +574,7 @@ int net_udp_close(NETSOCKET sock);
|
|||
/*
|
||||
Function: net_tcp_create
|
||||
Creates a TCP socket.
|
||||
|
||||
|
||||
Parameters:
|
||||
bindaddr - Address to bind the socket to.
|
||||
|
||||
|
@ -586,11 +586,11 @@ NETSOCKET net_tcp_create(const NETADDR *a);
|
|||
/*
|
||||
Function: net_tcp_listen
|
||||
Makes the socket start listening for new connections.
|
||||
|
||||
|
||||
Parameters:
|
||||
sock - Socket to start listen to.
|
||||
backlog - Size of the queue of incomming connections to keep.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success.
|
||||
*/
|
||||
|
@ -599,12 +599,12 @@ int net_tcp_listen(NETSOCKET sock, int backlog);
|
|||
/*
|
||||
Function: net_tcp_accept
|
||||
Polls a listning socket for a new connection.
|
||||
|
||||
|
||||
Parameters:
|
||||
sock - Listning socket to poll.
|
||||
new_sock - Pointer to a socket to fill in with the new socket.
|
||||
addr - Pointer to an address that will be filled in the remote address (optional, can be NULL).
|
||||
|
||||
|
||||
Returns:
|
||||
Returns a non-negative integer on success. Negative integer on failure.
|
||||
*/
|
||||
|
@ -613,26 +613,26 @@ int net_tcp_accept(NETSOCKET sock, NETSOCKET *new_sock, NETADDR *addr);
|
|||
/*
|
||||
Function: net_tcp_connect
|
||||
Connects one socket to another.
|
||||
|
||||
|
||||
Parameters:
|
||||
sock - Socket to connect.
|
||||
addr - Address to connect to.
|
||||
|
||||
Returns:
|
||||
Returns 0 on success.
|
||||
|
||||
|
||||
*/
|
||||
int net_tcp_connect(NETSOCKET sock, const NETADDR *addr);
|
||||
|
||||
/*
|
||||
Function: net_tcp_send
|
||||
Sends data to a TCP stream.
|
||||
|
||||
|
||||
Parameters:
|
||||
sock - Socket to send data to.
|
||||
data - Pointer to the data to send.
|
||||
size - Size of the data to send.
|
||||
|
||||
|
||||
Returns:
|
||||
Number of bytes sent. Negative value on failure.
|
||||
*/
|
||||
|
@ -641,12 +641,12 @@ int net_tcp_send(NETSOCKET sock, const void *data, int size);
|
|||
/*
|
||||
Function: net_tcp_recv
|
||||
Recvives data from a TCP stream.
|
||||
|
||||
|
||||
Parameters:
|
||||
sock - Socket to recvive data from.
|
||||
data - Pointer to a buffer to write the data to
|
||||
max_size - Maximum of data to write to the buffer.
|
||||
|
||||
|
||||
Returns:
|
||||
Number of bytes recvived. Negative value on failure. When in
|
||||
non-blocking mode, it returns 0 when there is no more data to
|
||||
|
@ -657,10 +657,10 @@ int net_tcp_recv(NETSOCKET sock, void *data, int maxsize);
|
|||
/*
|
||||
Function: net_tcp_close
|
||||
Closes a TCP socket.
|
||||
|
||||
|
||||
Parameters:
|
||||
sock - Socket to close.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success. Negative value on failure.
|
||||
*/
|
||||
|
@ -671,12 +671,12 @@ int net_tcp_close(NETSOCKET sock);
|
|||
/*
|
||||
Function: str_append
|
||||
Appends a string to another.
|
||||
|
||||
|
||||
Parameters:
|
||||
dst - Pointer to a buffer that contains a string.
|
||||
src - String to append.
|
||||
dst_size - Size of the buffer of the dst string.
|
||||
|
||||
|
||||
Remarks:
|
||||
- The strings are treated as zero-termineted strings.
|
||||
- Garantees that dst string will contain zero-termination.
|
||||
|
@ -686,7 +686,7 @@ void str_append(char *dst, const char *src, int dst_size);
|
|||
/*
|
||||
Function: str_copy
|
||||
Copies a string to another.
|
||||
|
||||
|
||||
Parameters:
|
||||
dst - Pointer to a buffer that shall recive the string.
|
||||
src - String to be copied.
|
||||
|
@ -701,10 +701,10 @@ void str_copy(char *dst, const char *src, int dst_size);
|
|||
/*
|
||||
Function: str_length
|
||||
Returns the length of a zero terminated string.
|
||||
|
||||
|
||||
Parameters:
|
||||
str - Pointer to the string.
|
||||
|
||||
|
||||
Returns:
|
||||
Length of string in bytes excluding the zero termination.
|
||||
*/
|
||||
|
@ -713,7 +713,7 @@ int str_length(const char *str);
|
|||
/*
|
||||
Function: str_format
|
||||
Performs printf formating into a buffer.
|
||||
|
||||
|
||||
Parameters:
|
||||
buffer - Pointer to the buffer to recive the formated string.
|
||||
buffer_size - Size of the buffer.
|
||||
|
@ -730,7 +730,7 @@ void str_format(char *buffer, int buffer_size, const char *format, ...);
|
|||
/*
|
||||
Function: str_sanitize_strong
|
||||
Replaces all characters below 32 and above 127 with whitespace.
|
||||
|
||||
|
||||
Parameters:
|
||||
str - String to sanitize.
|
||||
|
||||
|
@ -742,7 +742,7 @@ void str_sanitize_strong(char *str);
|
|||
/*
|
||||
Function: str_sanitize_cc
|
||||
Replaces all characters below 32 with whitespace.
|
||||
|
||||
|
||||
Parameters:
|
||||
str - String to sanitize.
|
||||
|
||||
|
@ -755,7 +755,7 @@ void str_sanitize_cc(char *str);
|
|||
Function: str_sanitize
|
||||
Replaces all characters below 32 with whitespace with
|
||||
exception to \t, \n and \r.
|
||||
|
||||
|
||||
Parameters:
|
||||
str - String to sanitize.
|
||||
|
||||
|
@ -767,7 +767,7 @@ void str_sanitize(char *str);
|
|||
/*
|
||||
Function: str_skip_to_whitespace
|
||||
Skips leading non-whitespace characters(all but ' ', '\t', '\n', '\r').
|
||||
|
||||
|
||||
Parameters:
|
||||
str - Pointer to the string.
|
||||
|
||||
|
@ -783,7 +783,7 @@ char *str_skip_to_whitespace(char *str);
|
|||
/*
|
||||
Function: str_skip_whitespaces
|
||||
Skips leading whitespace characters(' ', '\t', '\n', '\r').
|
||||
|
||||
|
||||
Parameters:
|
||||
str - Pointer to the string.
|
||||
|
||||
|
@ -799,12 +799,12 @@ char *str_skip_whitespaces(char *str);
|
|||
/*
|
||||
Function: str_comp_nocase
|
||||
Compares to strings case insensitive.
|
||||
|
||||
|
||||
Parameters:
|
||||
a - String to compare.
|
||||
b - String to compare.
|
||||
|
||||
Returns:
|
||||
|
||||
Returns:
|
||||
<0 - String a is lesser then string b
|
||||
0 - String a is equal to string b
|
||||
>0 - String a is greater then string b
|
||||
|
@ -819,12 +819,12 @@ int str_comp_nocase(const char *a, const char *b);
|
|||
/*
|
||||
Function: str_comp
|
||||
Compares to strings case sensitive.
|
||||
|
||||
|
||||
Parameters:
|
||||
a - String to compare.
|
||||
b - String to compare.
|
||||
|
||||
Returns:
|
||||
|
||||
Returns:
|
||||
<0 - String a is lesser then string b
|
||||
0 - String a is equal to string b
|
||||
>0 - String a is greater then string b
|
||||
|
@ -837,13 +837,13 @@ int str_comp(const char *a, const char *b);
|
|||
/*
|
||||
Function: str_comp_num
|
||||
Compares up to num characters of two strings case sensitive.
|
||||
|
||||
|
||||
Parameters:
|
||||
a - String to compare.
|
||||
b - String to compare.
|
||||
num - Maximum characters to compare
|
||||
|
||||
Returns:
|
||||
|
||||
Returns:
|
||||
<0 - String a is lesser then string b
|
||||
0 - String a is equal to string b
|
||||
>0 - String a is greater then string b
|
||||
|
@ -856,12 +856,12 @@ int str_comp_num(const char *a, const char *b, const int num);
|
|||
/*
|
||||
Function: str_comp_filenames
|
||||
Compares two strings case sensitive, digit chars will be compared as numbers.
|
||||
|
||||
|
||||
Parameters:
|
||||
a - String to compare.
|
||||
b - String to compare.
|
||||
|
||||
Returns:
|
||||
|
||||
Returns:
|
||||
<0 - String a is lesser then string b
|
||||
0 - String a is equal to string b
|
||||
>0 - String a is greater then string b
|
||||
|
@ -878,7 +878,7 @@ int str_comp_filenames(const char *a, const char *b);
|
|||
Parameters:
|
||||
haystack - String to search in
|
||||
needle - String to search for
|
||||
|
||||
|
||||
Returns:
|
||||
A pointer into haystack where the needle was found.
|
||||
Returns NULL of needle could not be found.
|
||||
|
@ -896,7 +896,7 @@ const char *str_find_nocase(const char *haystack, const char *needle);
|
|||
Parameters:
|
||||
haystack - String to search in
|
||||
needle - String to search for
|
||||
|
||||
|
||||
Returns:
|
||||
A pointer into haystack where the needle was found.
|
||||
Returns NULL of needle could not be found.
|
||||
|
@ -939,13 +939,13 @@ void str_timestamp(char *buffer, int buffer_size);
|
|||
/*
|
||||
Function: fs_listdir
|
||||
Lists the files in a directory
|
||||
|
||||
|
||||
Parameters:
|
||||
dir - Directory to list
|
||||
cb - Callback function to call for each entry
|
||||
type - Type of the directory
|
||||
user - Pointer to give to the callback
|
||||
|
||||
|
||||
Returns:
|
||||
Always returns 0.
|
||||
*/
|
||||
|
@ -955,13 +955,13 @@ int fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user);
|
|||
/*
|
||||
Function: fs_makedir
|
||||
Creates a directory
|
||||
|
||||
|
||||
Parameters:
|
||||
path - Directory to create
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success. Negative value on failure.
|
||||
|
||||
|
||||
Remarks:
|
||||
Does not create several directories if needed. "a/b/c" will result
|
||||
in a failure if b or a does not exist.
|
||||
|
@ -971,10 +971,10 @@ int fs_makedir(const char *path);
|
|||
/*
|
||||
Function: fs_storage_path
|
||||
Fetches per user configuration directory.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success. Negative value on failure.
|
||||
|
||||
|
||||
Remarks:
|
||||
- Returns ~/.appname on UNIX based systems
|
||||
- Returns ~/Library/Applications Support/appname on Mac OS X
|
||||
|
@ -985,7 +985,7 @@ int fs_storage_path(const char *appname, char *path, int max);
|
|||
/*
|
||||
Function: fs_is_dir
|
||||
Checks if directory exists
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 1 on success, 0 on failure.
|
||||
*/
|
||||
|
@ -994,7 +994,7 @@ int fs_is_dir(const char *path);
|
|||
/*
|
||||
Function: fs_chdir
|
||||
Changes current working directory
|
||||
|
||||
|
||||
Returns:
|
||||
Returns 0 on success, 1 on failure.
|
||||
*/
|
||||
|
@ -1003,7 +1003,7 @@ int fs_chdir(const char *path);
|
|||
/*
|
||||
Function: fs_getcwd
|
||||
Gets the current working directory.
|
||||
|
||||
|
||||
Returns:
|
||||
Returns a pointer to the buffer on success, 0 on failure.
|
||||
*/
|
||||
|
@ -1012,7 +1012,7 @@ char *fs_getcwd(char *buffer, int buffer_size);
|
|||
/*
|
||||
Function: fs_parent_dir
|
||||
Get the parent directory of a directory
|
||||
|
||||
|
||||
Parameters:
|
||||
path - The directory string
|
||||
|
||||
|
@ -1027,7 +1027,7 @@ int fs_parent_dir(char *path);
|
|||
/*
|
||||
Function: fs_remove
|
||||
Deletes the file with the specified name.
|
||||
|
||||
|
||||
Parameters:
|
||||
filename - The file to delete
|
||||
|
||||
|
@ -1042,7 +1042,7 @@ int fs_remove(const char *filename);
|
|||
/*
|
||||
Function: fs_rename
|
||||
Renames the file or directory. If the paths differ the file will be moved.
|
||||
|
||||
|
||||
Parameters:
|
||||
oldname - The actual name
|
||||
newname - The new name
|
||||
|
@ -1062,7 +1062,7 @@ int fs_rename(const char *oldname, const char *newname);
|
|||
|
||||
/*
|
||||
Function: net_tcp_connect_non_blocking
|
||||
|
||||
|
||||
DOCTODO: serp
|
||||
*/
|
||||
int net_tcp_connect_non_blocking(NETSOCKET sock, const NETADDR *a);
|
||||
|
@ -1121,7 +1121,7 @@ enum {
|
|||
#define DBG_LEVEL_LOW DBG_LEVEL_IMPORTANT
|
||||
#define DBG_LEVEL_HIGH DBG_LEVEL_INFO
|
||||
|
||||
typedef void (*DBG_LOGGER)(const char *line);
|
||||
typedef void (*DBG_LOGGER)(const char *line);
|
||||
void dbg_logger(DBG_LOGGER logger);
|
||||
|
||||
void dbg_logger_stdout();
|
||||
|
@ -1157,7 +1157,7 @@ unsigned str_quickhash(const char *str);
|
|||
/*
|
||||
Function: gui_messagebox
|
||||
Display plain OS-dependent message box
|
||||
|
||||
|
||||
Parameters:
|
||||
title - title of the message box
|
||||
message - text to display
|
||||
|
@ -1168,7 +1168,7 @@ void gui_messagebox(const char *title, const char *message);
|
|||
/*
|
||||
Function: str_utf8_rewind
|
||||
Moves a cursor backwards in an utf8 string
|
||||
|
||||
|
||||
Parameters:
|
||||
str - utf8 string
|
||||
cursor - position in the string
|
||||
|
@ -1184,11 +1184,11 @@ int str_utf8_rewind(const char *str, int cursor);
|
|||
/*
|
||||
Function: str_utf8_forward
|
||||
Moves a cursor forwards in an utf8 string
|
||||
|
||||
|
||||
Parameters:
|
||||
str - utf8 string
|
||||
cursor - position in the string
|
||||
|
||||
|
||||
Returns:
|
||||
New cursor position.
|
||||
|
||||
|
@ -1200,10 +1200,10 @@ int str_utf8_forward(const char *str, int cursor);
|
|||
/*
|
||||
Function: str_utf8_decode
|
||||
Decodes an utf8 character
|
||||
|
||||
|
||||
Parameters:
|
||||
ptr - pointer to an utf8 string. this pointer will be moved forward
|
||||
|
||||
|
||||
Returns:
|
||||
Unicode value for the character. -1 for invalid characters and 0 for end of string.
|
||||
|
||||
|
@ -1215,10 +1215,10 @@ int str_utf8_decode(const char **ptr);
|
|||
/*
|
||||
Function: str_utf8_encode
|
||||
Encode an utf8 character
|
||||
|
||||
|
||||
Parameters:
|
||||
ptr - Pointer to a buffer that should recive the data. Should be able to hold at least 4 bytes.
|
||||
|
||||
|
||||
Returns:
|
||||
Number of bytes put into the buffer.
|
||||
|
||||
|
@ -1230,10 +1230,10 @@ int str_utf8_encode(char *ptr, int chr);
|
|||
/*
|
||||
Function: str_utf8_check
|
||||
Checks if a strings contains just valid utf8 characters.
|
||||
|
||||
|
||||
Parameters:
|
||||
str - Pointer to a possible utf8 string.
|
||||
|
||||
|
||||
Returns:
|
||||
0 - invalid characters found.
|
||||
1 - only valid characters found.
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
/*
|
||||
insert 4
|
||||
v
|
||||
v
|
||||
1 2 3 4 5 6
|
||||
|
||||
*/
|
||||
|
@ -38,12 +38,12 @@ R partition_binary(R range, T value)
|
|||
concept_size::check(range);
|
||||
concept_slice::check(range);
|
||||
concept_sorted::check(range);
|
||||
|
||||
|
||||
if(range.empty())
|
||||
return range;
|
||||
if(range.back() < value)
|
||||
return R();
|
||||
|
||||
|
||||
while(range.size() > 1)
|
||||
{
|
||||
unsigned pivot = (range.size()-1)/2;
|
||||
|
@ -82,7 +82,7 @@ void sort_bubble(R range)
|
|||
concept_empty::check(range);
|
||||
concept_forwarditeration::check(range);
|
||||
concept_backwarditeration::check(range);
|
||||
|
||||
|
||||
// slow bubblesort :/
|
||||
for(; !range.empty(); range.pop_back())
|
||||
{
|
||||
|
@ -119,18 +119,18 @@ bool sort_verify(R range)
|
|||
{
|
||||
concept_empty::check(range);
|
||||
concept_forwarditeration::check(range);
|
||||
|
||||
|
||||
typename R::type *prev = &range.front();
|
||||
range.pop_front();
|
||||
for(; !range.empty(); range.pop_front())
|
||||
{
|
||||
typename R::type *cur = &range.front();
|
||||
|
||||
|
||||
if(*cur < *prev)
|
||||
return false;
|
||||
prev = cur;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,10 +10,10 @@
|
|||
/*
|
||||
Class: array
|
||||
Normal dynamic array class
|
||||
|
||||
|
||||
Remarks:
|
||||
- Grows 50% each time it needs to fit new items
|
||||
- Use set_size() if you know how many elements
|
||||
- Use set_size() if you know how many elements
|
||||
- Use optimize() to reduce the needed space.
|
||||
*/
|
||||
template <class T, class ALLOCATOR = allocator_default<T> >
|
||||
|
@ -24,7 +24,7 @@ class array : private ALLOCATOR
|
|||
list = 0x0;
|
||||
clear();
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
typedef plain_range<T> range;
|
||||
|
||||
|
@ -35,7 +35,7 @@ public:
|
|||
{
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: array copy constructor
|
||||
*/
|
||||
|
@ -60,7 +60,7 @@ public:
|
|||
|
||||
/*
|
||||
Function: delete_all
|
||||
|
||||
|
||||
Remarks:
|
||||
- Invalidates ranges
|
||||
*/
|
||||
|
@ -74,7 +74,7 @@ public:
|
|||
|
||||
/*
|
||||
Function: clear
|
||||
|
||||
|
||||
Remarks:
|
||||
- Invalidates ranges
|
||||
*/
|
||||
|
@ -124,7 +124,7 @@ public:
|
|||
|
||||
/*
|
||||
Function: remove_index
|
||||
|
||||
|
||||
Remarks:
|
||||
- Invalidates ranges
|
||||
*/
|
||||
|
@ -132,7 +132,7 @@ public:
|
|||
{
|
||||
for(int i = index+1; i < num_elements; i++)
|
||||
list[i-1] = list[i];
|
||||
|
||||
|
||||
set_size(size()-1);
|
||||
}
|
||||
|
||||
|
@ -156,10 +156,10 @@ public:
|
|||
/*
|
||||
Function: add
|
||||
Adds an item to the array.
|
||||
|
||||
|
||||
Arguments:
|
||||
item - Item to add.
|
||||
|
||||
|
||||
Remarks:
|
||||
- Invalidates ranges
|
||||
- See remarks about <array> how the array grows.
|
||||
|
@ -175,9 +175,9 @@ public:
|
|||
/*
|
||||
Function: insert
|
||||
Inserts an item into the array at a specified location.
|
||||
|
||||
|
||||
Arguments:
|
||||
item - Item to insert.
|
||||
item - Item to insert.
|
||||
r - Range where to insert the item
|
||||
|
||||
Remarks:
|
||||
|
@ -188,16 +188,16 @@ public:
|
|||
{
|
||||
if(r.empty())
|
||||
return add(item);
|
||||
|
||||
|
||||
int index = (int)(&r.front()-list);
|
||||
incsize();
|
||||
set_size(size()+1);
|
||||
|
||||
|
||||
for(int i = num_elements-1; i > index; i--)
|
||||
list[i] = list[i-1];
|
||||
|
||||
list[index] = item;
|
||||
|
||||
|
||||
return num_elements-1;
|
||||
}
|
||||
|
||||
|
@ -236,7 +236,7 @@ public:
|
|||
/*
|
||||
Function: set_size
|
||||
Resizes the array to the specified size.
|
||||
|
||||
|
||||
Arguments:
|
||||
new_size - The new size for the array.
|
||||
*/
|
||||
|
@ -251,10 +251,10 @@ public:
|
|||
Function: hint_size
|
||||
Allocates the number of elements wanted but
|
||||
does not increase the list size.
|
||||
|
||||
|
||||
Arguments:
|
||||
hint - Size to allocate.
|
||||
|
||||
|
||||
Remarks:
|
||||
- If the hint is smaller then the number of elements, nothing will be done.
|
||||
- Invalidates ranges
|
||||
|
@ -302,7 +302,7 @@ public:
|
|||
(*this)[i] = other[i];
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: all
|
||||
Returns a range that contains the whole array.
|
||||
|
@ -318,18 +318,18 @@ protected:
|
|||
alloc(list_size+1);
|
||||
else
|
||||
alloc(list_size+list_size/2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void alloc(int new_len)
|
||||
{
|
||||
list_size = new_len;
|
||||
T *new_list = ALLOCATOR::alloc_array(list_size);
|
||||
|
||||
|
||||
int end = num_elements < list_size ? num_elements : list_size;
|
||||
for(int i = 0; i < end; i++)
|
||||
new_list[i] = list[i];
|
||||
|
||||
|
||||
ALLOCATOR::free_array(list);
|
||||
|
||||
num_elements = num_elements < list_size ? num_elements : list_size;
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
/*
|
||||
Concept: concept_empty
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
|
@ -25,7 +25,7 @@ struct concept_empty
|
|||
|
||||
/*
|
||||
Concept: concept_index
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
|
@ -39,7 +39,7 @@ struct concept_index
|
|||
|
||||
/*
|
||||
Concept: concept_size
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
|
@ -53,7 +53,7 @@ struct concept_size
|
|||
|
||||
/*
|
||||
Concept: concept_slice
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
|
@ -67,7 +67,7 @@ struct concept_slice
|
|||
|
||||
/*
|
||||
Concept: concept_sorted
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
|
@ -82,13 +82,13 @@ struct concept_sorted
|
|||
/*
|
||||
Concept: concept_forwarditeration
|
||||
Checks for the front and pop_front methods
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
void pop_front();
|
||||
T &front() const;
|
||||
};
|
||||
};
|
||||
*/
|
||||
struct concept_forwarditeration
|
||||
{
|
||||
|
@ -98,13 +98,13 @@ struct concept_forwarditeration
|
|||
/*
|
||||
Concept: concept_backwarditeration
|
||||
Checks for the back and pop_back methods
|
||||
|
||||
|
||||
template<class T>
|
||||
struct range
|
||||
{
|
||||
void pop_back();
|
||||
T &back() const;
|
||||
};
|
||||
};
|
||||
*/
|
||||
struct concept_backwarditeration
|
||||
{
|
||||
|
@ -119,7 +119,7 @@ struct concept_backwarditeration
|
|||
|
||||
/*
|
||||
Class: plain_range
|
||||
|
||||
|
||||
Concepts:
|
||||
<concept_empty>
|
||||
<concept_index>
|
||||
|
@ -142,13 +142,13 @@ public:
|
|||
{
|
||||
*this = r;
|
||||
}
|
||||
|
||||
|
||||
plain_range(T *b, T *e)
|
||||
{
|
||||
begin = b;
|
||||
end = e;
|
||||
}
|
||||
|
||||
|
||||
bool empty() const { return begin >= end; }
|
||||
void pop_front() { assert(!empty()); begin++; }
|
||||
void pop_back() { assert(!empty()); end--; }
|
||||
|
@ -160,7 +160,7 @@ public:
|
|||
{
|
||||
return plain_range(begin+startindex, begin+endindex);
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
T *begin;
|
||||
T *end;
|
||||
|
@ -168,7 +168,7 @@ protected:
|
|||
|
||||
/*
|
||||
Class: plain_range_sorted
|
||||
|
||||
|
||||
Concepts:
|
||||
Same as <plain_range> but with these additions:
|
||||
<concept_sorted>
|
||||
|
@ -180,7 +180,7 @@ class plain_range_sorted : public plain_range<T>
|
|||
public:
|
||||
/* sorted concept */
|
||||
void sorted() const { }
|
||||
|
||||
|
||||
plain_range_sorted()
|
||||
{}
|
||||
|
||||
|
@ -188,11 +188,11 @@ public:
|
|||
{
|
||||
*this = r;
|
||||
}
|
||||
|
||||
|
||||
plain_range_sorted(T *b, T *e)
|
||||
: parent(b, e)
|
||||
{}
|
||||
|
||||
|
||||
plain_range_sorted slice(unsigned start, unsigned count)
|
||||
{
|
||||
return plain_range_sorted(parent::begin+start, parent::begin+start+count);
|
||||
|
@ -206,29 +206,29 @@ private:
|
|||
reverse_range() {}
|
||||
public:
|
||||
typedef typename R::type type;
|
||||
|
||||
|
||||
reverse_range(R r)
|
||||
{
|
||||
range = r;
|
||||
}
|
||||
|
||||
|
||||
reverse_range(const reverse_range &other) { range = other.range; }
|
||||
|
||||
|
||||
|
||||
bool empty() const { return range.empty(); }
|
||||
void pop_front() { range.pop_back(); }
|
||||
void pop_back() { range.pop_front(); }
|
||||
type& front() { return range.back(); }
|
||||
type& back() { return range.front(); }
|
||||
|
||||
|
||||
R range;
|
||||
};
|
||||
|
||||
template<class R> reverse_range<R> reverse(R range) {
|
||||
return reverse_range<R>(range);
|
||||
return reverse_range<R>(range);
|
||||
}
|
||||
template<class R> R reverse(reverse_range<R> range) {
|
||||
return range.range;
|
||||
return range.range;
|
||||
}
|
||||
|
||||
#endif // TL_FILE_RANGE_HPP
|
||||
|
|
|
@ -10,11 +10,11 @@ template <class T, class ALLOCATOR = allocator_default<T> >
|
|||
class sorted_array : public array<T, ALLOCATOR>
|
||||
{
|
||||
typedef array<T, ALLOCATOR> parent;
|
||||
|
||||
|
||||
// insert and size is not allowed
|
||||
int insert(const T& item, typename parent::range r) { dbg_break(); return 0; }
|
||||
int set_size(int new_size) { dbg_break(); return 0; }
|
||||
|
||||
|
||||
public:
|
||||
typedef plain_range_sorted<T> range;
|
||||
|
||||
|
@ -27,7 +27,7 @@ public:
|
|||
{
|
||||
return parent::add(item);
|
||||
}
|
||||
|
||||
|
||||
void sort_range()
|
||||
{
|
||||
sort(all());
|
||||
|
@ -37,7 +37,7 @@ public:
|
|||
/*
|
||||
Function: all
|
||||
Returns a sorted range that contains the whole array.
|
||||
*/
|
||||
*/
|
||||
range all() { return range(parent::list, parent::list+parent::num_elements); }
|
||||
};
|
||||
|
||||
|
|
|
@ -11,38 +11,38 @@ class string_base : private ALLOCATOR
|
|||
{
|
||||
char *str;
|
||||
int length;
|
||||
|
||||
|
||||
void reset()
|
||||
{
|
||||
str = 0; length = 0;
|
||||
}
|
||||
|
||||
|
||||
void free()
|
||||
{
|
||||
ALLOCATOR::free_array(str);
|
||||
reset();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void copy(const char *other_str, int other_length)
|
||||
{
|
||||
length = other_length;
|
||||
str = ALLOCATOR::alloc_array(length+1);
|
||||
mem_copy(str, other_str, length+1);
|
||||
}
|
||||
|
||||
|
||||
void copy(const string_base &other)
|
||||
{
|
||||
if(!other.str)
|
||||
return;
|
||||
copy(other.str, other.length);
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
string_base() { reset(); }
|
||||
string_base(const char *other_str) { copy(other_str, str_length(other_str)); }
|
||||
string_base(const string_base &other) { reset(); copy(other); }
|
||||
~string_base() { free(); }
|
||||
|
||||
|
||||
string_base &operator = (const char *other)
|
||||
{
|
||||
free();
|
||||
|
@ -50,17 +50,17 @@ public:
|
|||
copy(other, str_length(other));
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
string_base &operator = (const string_base &other)
|
||||
{
|
||||
free();
|
||||
copy(other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
bool operator < (const char *other_str) const { return str_comp(str, other_str) < 0; }
|
||||
operator const char *() const { return str; }
|
||||
|
||||
|
||||
const char *cstr() const { return str; }
|
||||
};
|
||||
|
||||
|
|
|
@ -13,19 +13,19 @@ class vector2_base
|
|||
public:
|
||||
union { T x,u; };
|
||||
union { T y,v; };
|
||||
|
||||
|
||||
vector2_base() {}
|
||||
vector2_base(float nx, float ny)
|
||||
{
|
||||
x = nx;
|
||||
y = ny;
|
||||
}
|
||||
|
||||
|
||||
vector2_base operator -() const { return vector2_base(-x, -y); }
|
||||
vector2_base operator -(const vector2_base &v) const { return vector2_base(x-v.x, y-v.y); }
|
||||
vector2_base operator +(const vector2_base &v) const { return vector2_base(x+v.x, y+v.y); }
|
||||
vector2_base operator *(const T v) const { return vector2_base(x*v, y*v); }
|
||||
|
||||
|
||||
const vector2_base &operator =(const vector2_base &v) { x = v.x; y = v.y; return *this; }
|
||||
|
||||
const vector2_base &operator +=(const vector2_base &v) { x += v.x; y += v.y; return *this; }
|
||||
|
@ -81,7 +81,7 @@ inline vector2_base<T> closest_point_on_line(vector2_base<T> line_point0, vector
|
|||
if (t > 1.0f) return 1.0f;
|
||||
return t;*/
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------
|
||||
template<typename T>
|
||||
class vector3_base
|
||||
|
@ -98,7 +98,7 @@ public:
|
|||
y = ny;
|
||||
z = nz;
|
||||
}
|
||||
|
||||
|
||||
const vector3_base &operator =(const vector3_base &v) { x = v.x; y = v.y; z = v.z; return *this; }
|
||||
|
||||
vector3_base operator -(const vector3_base &v) const { return vector3_base(x-v.x, y-v.y, z-v.z); }
|
||||
|
@ -107,7 +107,7 @@ public:
|
|||
vector3_base operator *(const T v) const { return vector3_base(x*v, y*v, z*v); }
|
||||
vector3_base operator *(const vector3_base &v) const { return vector3_base(x*v.x, y*v.y, z*v.z); }
|
||||
vector3_base operator /(const T v) const { return vector3_base(x/v, y/v, z/v); }
|
||||
|
||||
|
||||
const vector3_base &operator +=(const vector3_base &v) { x += v.x; y += v.y; z += v.z; return *this; }
|
||||
const vector3_base &operator -=(const vector3_base &v) { x -= v.x; y -= v.y; z -= v.z; return *this; }
|
||||
const vector3_base &operator *=(const T v) { x *= v; y *= v; z *= v; return *this; }
|
||||
|
@ -174,13 +174,13 @@ public:
|
|||
z = nz;
|
||||
w = nw;
|
||||
}
|
||||
|
||||
|
||||
vector4_base operator +(const vector4_base &v) const { return vector4_base(x+v.x, y+v.y, z+v.z, w+v.w); }
|
||||
vector4_base operator -(const vector4_base &v) const { return vector4_base(x-v.x, y-v.y, z-v.z, w-v.w); }
|
||||
vector4_base operator -() const { return vector4_base(-x, -y, -z, -w); }
|
||||
vector4_base operator *(const vector4_base &v) const { return vector4_base(x*v.x, y*v.y, z*v.z, w*v.w); }
|
||||
vector4_base operator *(const T v) const { return vector4_base(x*v, y*v, z*v, w*v); }
|
||||
|
||||
|
||||
const vector4_base &operator =(const vector4_base &v) { x = v.x; y = v.y; z = v.z; w = v.w; return *this; }
|
||||
|
||||
const vector4_base &operator +=(const vector4_base &v) { x += v.x; y += v.y; z += v.z; w += v.w; return *this; }
|
||||
|
|
|
@ -18,13 +18,13 @@ protected:
|
|||
int m_CurGameTick;
|
||||
float m_GameIntraTick;
|
||||
float m_GameTickTime;
|
||||
|
||||
|
||||
int m_PredTick;
|
||||
float m_PredIntraTick;
|
||||
|
||||
|
||||
float m_LocalTime;
|
||||
float m_FrameTime;
|
||||
|
||||
|
||||
int m_GameTickSpeed;
|
||||
public:
|
||||
|
||||
|
@ -66,11 +66,11 @@ public:
|
|||
inline float PredIntraGameTick() const { return m_PredIntraTick; }
|
||||
inline float GameTickTime() const { return m_GameTickTime; }
|
||||
inline int GameTickSpeed() const { return m_GameTickSpeed; }
|
||||
|
||||
|
||||
// other time access
|
||||
inline float FrameTime() const { return m_FrameTime; }
|
||||
inline float LocalTime() const { return m_LocalTime; }
|
||||
|
||||
|
||||
// actions
|
||||
virtual void Connect(const char *pAddress) = 0;
|
||||
virtual void Disconnect() = 0;
|
||||
|
@ -88,26 +88,26 @@ public:
|
|||
//
|
||||
virtual int MapDownloadAmount() = 0;
|
||||
virtual int MapDownloadTotalsize() = 0;
|
||||
|
||||
|
||||
// input
|
||||
virtual int *GetInput(int Tick) = 0;
|
||||
|
||||
|
||||
// remote console
|
||||
virtual void RconAuth(const char *pUsername, const char *pPassword) = 0;
|
||||
virtual bool RconAuthed() = 0;
|
||||
virtual void Rcon(const char *pLine) = 0;
|
||||
|
||||
|
||||
// server info
|
||||
virtual void GetServerInfo(class CServerInfo *pServerInfo) = 0;
|
||||
|
||||
|
||||
// snapshot interface
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
SNAP_CURRENT=0,
|
||||
SNAP_PREV=1
|
||||
};
|
||||
|
||||
|
||||
// TODO: Refactor: should redo this a bit i think, too many virtual calls
|
||||
virtual int SnapNumItems(int SnapID) = 0;
|
||||
virtual void *SnapFindItem(int SnapID, int Type, int ID) = 0;
|
||||
|
@ -126,8 +126,8 @@ public:
|
|||
return -1;
|
||||
return SendMsg(&Packer, Flags);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
virtual const char *ErrorString() = 0;
|
||||
virtual const char *LatestVersion() = 0;
|
||||
virtual bool ConnectionProblems() = 0;
|
||||
|
@ -155,9 +155,9 @@ public:
|
|||
virtual void OnMessage(int MsgID, CUnpacker *pUnpacker) = 0;
|
||||
virtual void OnPredict() = 0;
|
||||
virtual void OnActivateEditor() = 0;
|
||||
|
||||
|
||||
virtual int OnSnapInput(int *pData) = 0;
|
||||
|
||||
|
||||
virtual const char *GetItemName(int Type) = 0;
|
||||
virtual int GetCountryIndex(int Code) = 0;
|
||||
virtual const char *Version() = 0;
|
||||
|
|
|
@ -545,7 +545,7 @@ void CClient::RconAuth(const char *pName, const char *pPassword)
|
|||
{
|
||||
if(RconAuthed())
|
||||
return;
|
||||
|
||||
|
||||
CMsgPacker Msg(NETMSG_RCON_AUTH);
|
||||
Msg.AddString(pName, 32);
|
||||
Msg.AddString(pPassword, 32);
|
||||
|
@ -860,7 +860,7 @@ void CClient::DebugRender()
|
|||
total = 42
|
||||
*/
|
||||
FrameTimeAvg = FrameTimeAvg*0.9f + m_FrameTime*0.1f;
|
||||
str_format(aBuffer, sizeof(aBuffer), "ticks: %8d %8d mem %dk %d gfxmem: %dk fps: %3d",
|
||||
str_format(aBuffer, sizeof(aBuffer), "ticks: %8d %8d mem %dk %d gfxmem: %dk fps: %3d",
|
||||
m_CurGameTick, m_PredTick,
|
||||
mem_stats()->allocated/1024,
|
||||
mem_stats()->total_allocations,
|
||||
|
@ -1030,7 +1030,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
|
|||
// version info
|
||||
if(pPacket->m_DataSize == (int)(sizeof(VERSIONSRV_VERSION) + sizeof(VERSION_DATA)) &&
|
||||
mem_comp(pPacket->m_pData, VERSIONSRV_VERSION, sizeof(VERSIONSRV_VERSION)) == 0)
|
||||
|
||||
|
||||
{
|
||||
unsigned char *pVersionData = (unsigned char*)pPacket->m_pData + sizeof(VERSIONSRV_VERSION);
|
||||
int VersionMatch = !mem_comp(pVersionData, VERSION_DATA, sizeof(VERSION_DATA));
|
||||
|
@ -1060,7 +1060,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
|
|||
|
||||
// map version list
|
||||
if(pPacket->m_DataSize >= (int)sizeof(VERSIONSRV_MAPLIST) &&
|
||||
mem_comp(pPacket->m_pData, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST)) == 0)
|
||||
mem_comp(pPacket->m_pData, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST)) == 0)
|
||||
{
|
||||
int Size = pPacket->m_DataSize-sizeof(VERSIONSRV_MAPLIST);
|
||||
int Num = Size/sizeof(CMapVersion);
|
||||
|
@ -1114,7 +1114,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
|
|||
mem_copy(Addr.ip, pAddrs[i].m_aIp, sizeof(Addr.ip));
|
||||
}
|
||||
Addr.port = (pAddrs[i].m_aPort[0]<<8) | pAddrs[i].m_aPort[1];
|
||||
|
||||
|
||||
m_ServerBrowser.Set(Addr, IServerBrowser::SET_MASTER_ADD, -1, 0x0);
|
||||
}
|
||||
}
|
||||
|
@ -1125,7 +1125,7 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
|
|||
// we got ze info
|
||||
CUnpacker Up;
|
||||
CServerInfo Info = {0};
|
||||
|
||||
|
||||
Up.Reset((unsigned char*)pPacket->m_pData+sizeof(SERVERBROWSE_INFO), pPacket->m_DataSize-sizeof(SERVERBROWSE_INFO));
|
||||
int Token = str_toint(Up.GetString());
|
||||
str_copy(Info.m_aVersion, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aVersion));
|
||||
|
@ -1282,7 +1282,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket)
|
|||
if(!pError)
|
||||
{
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "loading done");
|
||||
SendReady();
|
||||
SendReady();
|
||||
}
|
||||
else
|
||||
DisconnectWithReason(pError);
|
||||
|
|
|
@ -14,14 +14,14 @@ class CFriends : public IFriends
|
|||
static void ConRemoveFriend(IConsole::IResult *pResult, void *pUserData);
|
||||
|
||||
static void ConfigSaveCallback(IConfig *pConfig, void *pUserData);
|
||||
|
||||
|
||||
public:
|
||||
CFriends();
|
||||
|
||||
|
||||
void Init();
|
||||
|
||||
|
||||
int NumFriends() const { return m_NumFriends; }
|
||||
const CFriendInfo *GetFriend(int Index) const;
|
||||
const CFriendInfo *GetFriend(int Index) const;
|
||||
bool IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const;
|
||||
|
||||
void AddFriend(const char *pName, const char *pClan);
|
||||
|
|
|
@ -50,7 +50,7 @@ static CVideoMode g_aFakeModes[] = {
|
|||
{1800,1440,8,8,8}, {1856,1392,8,8,8}, {1920,1080,8,8,8},
|
||||
{1920,1200,8,8,8}, {1920,1440,8,8,8}, {1920,2400,8,8,8},
|
||||
{2048,1536,8,8,8},
|
||||
|
||||
|
||||
{320,240,5,6,5}, {400,300,5,6,5}, {640,480,5,6,5},
|
||||
{720,400,5,6,5}, {768,576,5,6,5}, {800,600,5,6,5},
|
||||
{1024,600,5,6,5}, {1024,768,5,6,5}, {1152,864,5,6,5},
|
||||
|
@ -67,7 +67,7 @@ void CGraphics_OpenGL::Flush()
|
|||
{
|
||||
if(m_NumVertices == 0)
|
||||
return;
|
||||
|
||||
|
||||
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
|
||||
|
@ -83,7 +83,7 @@ void CGraphics_OpenGL::Flush()
|
|||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glEnableClientState(GL_COLOR_ARRAY);
|
||||
|
||||
|
||||
if(m_RenderEnable)
|
||||
{
|
||||
if(m_Drawing == DRAWING_QUADS)
|
||||
|
@ -91,7 +91,7 @@ void CGraphics_OpenGL::Flush()
|
|||
else if(m_Drawing == DRAWING_LINES)
|
||||
glDrawArrays(GL_LINES, 0, m_NumVertices);
|
||||
}
|
||||
|
||||
|
||||
// Reset pointer
|
||||
m_NumVertices = 0;
|
||||
}
|
||||
|
@ -125,26 +125,26 @@ unsigned char CGraphics_OpenGL::Sample(int w, int h, const unsigned char *pData,
|
|||
pData[(v*w+u+1)*4+Offset]+
|
||||
pData[((v+1)*w+u)*4+Offset]+
|
||||
pData[((v+1)*w+u+1)*4+Offset])/4;
|
||||
}
|
||||
}
|
||||
|
||||
CGraphics_OpenGL::CGraphics_OpenGL()
|
||||
{
|
||||
m_NumVertices = 0;
|
||||
|
||||
|
||||
m_ScreenX0 = 0;
|
||||
m_ScreenY0 = 0;
|
||||
m_ScreenX1 = 0;
|
||||
m_ScreenY1 = 0;
|
||||
|
||||
|
||||
m_ScreenWidth = -1;
|
||||
m_ScreenHeight = -1;
|
||||
|
||||
|
||||
m_Rotation = 0;
|
||||
m_Drawing = 0;
|
||||
m_InvalidTexture = 0;
|
||||
|
||||
|
||||
m_TextureMemoryUsage = 0;
|
||||
|
||||
|
||||
m_RenderEnable = true;
|
||||
m_DoScreenshot = false;
|
||||
}
|
||||
|
@ -161,7 +161,7 @@ void CGraphics_OpenGL::ClipDisable()
|
|||
//if(no_gfx) return;
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
}
|
||||
|
||||
|
||||
void CGraphics_OpenGL::BlendNone()
|
||||
{
|
||||
glDisable(GL_BLEND);
|
||||
|
@ -180,10 +180,10 @@ void CGraphics_OpenGL::BlendAdditive()
|
|||
}
|
||||
|
||||
int CGraphics_OpenGL::MemoryUsage() const
|
||||
{
|
||||
{
|
||||
return m_TextureMemoryUsage;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CGraphics_OpenGL::MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY)
|
||||
{
|
||||
m_ScreenX0 = TopLeftX;
|
||||
|
@ -220,7 +220,7 @@ void CGraphics_OpenGL::LinesEnd()
|
|||
void CGraphics_OpenGL::LinesDraw(const CLineItem *pArray, int Num)
|
||||
{
|
||||
dbg_assert(m_Drawing == DRAWING_LINES, "called draw without begin");
|
||||
|
||||
|
||||
for(int i = 0; i < Num; ++i)
|
||||
{
|
||||
m_aVertices[m_NumVertices + 2*i].m_Pos.x = pArray[i].m_X0;
|
||||
|
@ -241,10 +241,10 @@ int CGraphics_OpenGL::UnloadTexture(int Index)
|
|||
{
|
||||
if(Index == m_InvalidTexture)
|
||||
return 0;
|
||||
|
||||
|
||||
if(Index < 0)
|
||||
return 0;
|
||||
|
||||
|
||||
glDeleteTextures(1, &m_aTextures[Index].m_Tex);
|
||||
m_aTextures[Index].m_Next = m_FirstFreeTexture;
|
||||
m_TextureMemoryUsage -= m_aTextures[Index].m_MemSize;
|
||||
|
@ -261,16 +261,16 @@ int CGraphics_OpenGL::LoadTextureRaw(int Width, int Height, int Format, const vo
|
|||
int Oglformat = 0;
|
||||
int StoreOglformat = 0;
|
||||
int Tex = 0;
|
||||
|
||||
|
||||
// don't waste memory on texture if we are stress testing
|
||||
if(g_Config.m_DbgStress)
|
||||
return m_InvalidTexture;
|
||||
|
||||
|
||||
// grab texture
|
||||
Tex = m_FirstFreeTexture;
|
||||
m_FirstFreeTexture = m_aTextures[Tex].m_Next;
|
||||
m_aTextures[Tex].m_Next = -1;
|
||||
|
||||
|
||||
// resample if needed
|
||||
if(!(Flags&TEXLOAD_NORESAMPLE) && g_Config.m_GfxTextureQuality==0)
|
||||
{
|
||||
|
@ -296,13 +296,13 @@ int CGraphics_OpenGL::LoadTextureRaw(int Width, int Height, int Format, const vo
|
|||
pTexData = pTmpData;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Oglformat = GL_RGBA;
|
||||
if(Format == CImageInfo::FORMAT_RGB)
|
||||
Oglformat = GL_RGB;
|
||||
else if(Format == CImageInfo::FORMAT_ALPHA)
|
||||
Oglformat = GL_ALPHA;
|
||||
|
||||
|
||||
// upload texture
|
||||
if(g_Config.m_GfxTextureCompression)
|
||||
{
|
||||
|
@ -320,13 +320,13 @@ int CGraphics_OpenGL::LoadTextureRaw(int Width, int Height, int Format, const vo
|
|||
else if(StoreFormat == CImageInfo::FORMAT_ALPHA)
|
||||
StoreOglformat = GL_ALPHA;
|
||||
}
|
||||
|
||||
|
||||
glGenTextures(1, &m_aTextures[Tex].m_Tex);
|
||||
glBindTexture(GL_TEXTURE_2D, m_aTextures[Tex].m_Tex);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||
gluBuild2DMipmaps(GL_TEXTURE_2D, StoreOglformat, Width, Height, Oglformat, GL_UNSIGNED_BYTE, pTexData);
|
||||
|
||||
|
||||
// calculate memory usage
|
||||
{
|
||||
int PixelSize = 4;
|
||||
|
@ -346,7 +346,7 @@ int CGraphics_OpenGL::LoadTextureRaw(int Width, int Height, int Format, const vo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
m_TextureMemoryUsage += m_aTextures[Tex].m_MemSize;
|
||||
mem_free(pTmpData);
|
||||
return Tex;
|
||||
|
@ -358,7 +358,7 @@ int CGraphics_OpenGL::LoadTexture(const char *pFilename, int StorageType, int St
|
|||
int l = str_length(pFilename);
|
||||
int ID;
|
||||
CImageInfo Img;
|
||||
|
||||
|
||||
if(l < 3)
|
||||
return -1;
|
||||
if(LoadPNG(&Img, pFilename, StorageType))
|
||||
|
@ -370,7 +370,7 @@ int CGraphics_OpenGL::LoadTexture(const char *pFilename, int StorageType, int St
|
|||
mem_free(Img.m_pData);
|
||||
return ID;
|
||||
}
|
||||
|
||||
|
||||
return m_InvalidTexture;
|
||||
}
|
||||
|
||||
|
@ -379,7 +379,7 @@ int CGraphics_OpenGL::LoadPNG(CImageInfo *pImg, const char *pFilename, int Stora
|
|||
char aCompleteFilename[512];
|
||||
unsigned char *pBuffer;
|
||||
png_t Png; // ignore_convention
|
||||
|
||||
|
||||
// open file for reading
|
||||
png_init(0,0); // ignore_convention
|
||||
|
||||
|
@ -391,7 +391,7 @@ int CGraphics_OpenGL::LoadPNG(CImageInfo *pImg, const char *pFilename, int Stora
|
|||
dbg_msg("game/png", "failed to open file. filename='%s'", pFilename);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int Error = png_open_file(&Png, aCompleteFilename); // ignore_convention
|
||||
if(Error != PNG_NO_ERROR)
|
||||
{
|
||||
|
@ -400,18 +400,18 @@ int CGraphics_OpenGL::LoadPNG(CImageInfo *pImg, const char *pFilename, int Stora
|
|||
png_close_file(&Png); // ignore_convention
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if(Png.depth != 8 || (Png.color_type != PNG_TRUECOLOR && Png.color_type != PNG_TRUECOLOR_ALPHA)) // ignore_convention
|
||||
{
|
||||
dbg_msg("game/png", "invalid format. filename='%s'", aCompleteFilename);
|
||||
png_close_file(&Png); // ignore_convention
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
pBuffer = (unsigned char *)mem_alloc(Png.width * Png.height * Png.bpp, 1); // ignore_convention
|
||||
png_get_data(&Png, pBuffer); // ignore_convention
|
||||
png_close_file(&Png); // ignore_convention
|
||||
|
||||
|
||||
pImg->m_Width = Png.width; // ignore_convention
|
||||
pImg->m_Height = Png.height; // ignore_convention
|
||||
if(Png.color_type == PNG_TRUECOLOR) // ignore_convention
|
||||
|
@ -435,7 +435,7 @@ void CGraphics_OpenGL::ScreenshotDirect(const char *pFilename)
|
|||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
glReadPixels(0,0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pPixelData);
|
||||
glPixelStorei(GL_PACK_ALIGNMENT, Alignment);
|
||||
|
||||
|
||||
// flip the pixel because opengl works from bottom left corner
|
||||
for(y = 0; y < h/2; y++)
|
||||
{
|
||||
|
@ -443,16 +443,16 @@ void CGraphics_OpenGL::ScreenshotDirect(const char *pFilename)
|
|||
mem_copy(pPixelData+y*w*3, pPixelData+(h-y-1)*w*3, w*3);
|
||||
mem_copy(pPixelData+(h-y-1)*w*3, pTempRow,w*3);
|
||||
}
|
||||
|
||||
|
||||
// find filename
|
||||
{
|
||||
char aWholePath[1024];
|
||||
png_t Png; // ignore_convention
|
||||
|
||||
IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE, aWholePath, sizeof(aWholePath));
|
||||
IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE, aWholePath, sizeof(aWholePath));
|
||||
if(File)
|
||||
io_close(File);
|
||||
|
||||
|
||||
// save png
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "saved screenshot to '%s'", aWholePath);
|
||||
|
@ -490,7 +490,7 @@ void CGraphics_OpenGL::QuadsBegin()
|
|||
{
|
||||
dbg_assert(m_Drawing == 0, "called quads_begin twice");
|
||||
m_Drawing = DRAWING_QUADS;
|
||||
|
||||
|
||||
QuadsSetSubset(0,0,1,1);
|
||||
QuadsSetRotation(0);
|
||||
SetColor(1,1,1,1);
|
||||
|
@ -609,7 +609,7 @@ void CGraphics_OpenGL::QuadsDrawTL(const CQuadItem *pArray, int Num)
|
|||
void CGraphics_OpenGL::QuadsDrawFreeform(const CFreeformItem *pArray, int Num)
|
||||
{
|
||||
dbg_assert(m_Drawing == DRAWING_QUADS, "called quads_draw_freeform without begin");
|
||||
|
||||
|
||||
for(int i = 0; i < Num; ++i)
|
||||
{
|
||||
m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X0;
|
||||
|
@ -632,7 +632,7 @@ void CGraphics_OpenGL::QuadsDrawFreeform(const CFreeformItem *pArray, int Num)
|
|||
m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[2];
|
||||
m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[2];
|
||||
}
|
||||
|
||||
|
||||
AddVertices(4*Num);
|
||||
}
|
||||
|
||||
|
@ -647,7 +647,7 @@ void CGraphics_OpenGL::QuadsText(float x, float y, float Size, float r, float g,
|
|||
{
|
||||
char c = *pText;
|
||||
pText++;
|
||||
|
||||
|
||||
if(c == '\n')
|
||||
{
|
||||
x = StartX;
|
||||
|
@ -660,13 +660,13 @@ void CGraphics_OpenGL::QuadsText(float x, float y, float Size, float r, float g,
|
|||
(c/16)/16.0f,
|
||||
(c%16)/16.0f+1.0f/16.0f,
|
||||
(c/16)/16.0f+1.0f/16.0f);
|
||||
|
||||
|
||||
CQuadItem QuadItem(x, y, Size, Size);
|
||||
QuadsDrawTL(&QuadItem, 1);
|
||||
x += Size/2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QuadsEnd();
|
||||
}
|
||||
|
||||
|
@ -674,7 +674,7 @@ bool CGraphics_OpenGL::Init()
|
|||
{
|
||||
m_pStorage = Kernel()->RequestInterface<IStorage>();
|
||||
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
||||
|
||||
|
||||
// Set all z to -5.0f
|
||||
for(int i = 0; i < MAX_VERTICES; i++)
|
||||
m_aVertices[i].m_Pos.z = -5.0f;
|
||||
|
@ -691,21 +691,21 @@ bool CGraphics_OpenGL::Init()
|
|||
glDisable(GL_DEPTH_TEST);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
|
||||
glAlphaFunc(GL_GREATER, 0);
|
||||
glEnable(GL_ALPHA_TEST);
|
||||
glDepthMask(0);
|
||||
|
||||
// create null texture, will get id=0
|
||||
static const unsigned char aNullTextureData[] = {
|
||||
0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff,
|
||||
0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff,
|
||||
0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff,
|
||||
0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff,
|
||||
0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff,
|
||||
0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff,
|
||||
0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff,
|
||||
0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff,
|
||||
};
|
||||
|
||||
|
||||
m_InvalidTexture = LoadTextureRaw(4,4,CImageInfo::FORMAT_RGBA,aNullTextureData,CImageInfo::FORMAT_RGBA,TEXLOAD_NORESAMPLE);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -713,7 +713,7 @@ int CGraphics_SDL::TryInit()
|
|||
{
|
||||
const SDL_VideoInfo *pInfo;
|
||||
int Flags = SDL_OPENGL;
|
||||
|
||||
|
||||
m_ScreenWidth = g_Config.m_GfxScreenWidth;
|
||||
m_ScreenHeight = g_Config.m_GfxScreenHeight;
|
||||
|
||||
|
@ -721,7 +721,7 @@ int CGraphics_SDL::TryInit()
|
|||
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
|
||||
|
||||
// set flags
|
||||
Flags = SDL_OPENGL;
|
||||
Flags = SDL_OPENGL;
|
||||
Flags |= SDL_GL_DOUBLEBUFFER;
|
||||
Flags |= SDL_HWPALETTE;
|
||||
if(g_Config.m_DbgResizable)
|
||||
|
@ -755,7 +755,7 @@ int CGraphics_SDL::TryInit()
|
|||
|
||||
// set caption
|
||||
SDL_WM_SetCaption("Teeworlds", "Teeworlds");
|
||||
|
||||
|
||||
// create window
|
||||
m_pScreenSurface = SDL_SetVideoMode(m_ScreenWidth, m_ScreenHeight, 0, Flags);
|
||||
if(m_pScreenSurface == NULL)
|
||||
|
@ -763,7 +763,7 @@ int CGraphics_SDL::TryInit()
|
|||
dbg_msg("gfx", "unable to set video mode: %s", SDL_GetError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -772,12 +772,12 @@ int CGraphics_SDL::InitWindow()
|
|||
{
|
||||
if(TryInit() == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
// try disabling fsaa
|
||||
while(g_Config.m_GfxFsaaSamples)
|
||||
{
|
||||
g_Config.m_GfxFsaaSamples--;
|
||||
|
||||
|
||||
if(g_Config.m_GfxFsaaSamples)
|
||||
dbg_msg("gfx", "lowering FSAA to %d and trying again", g_Config.m_GfxFsaaSamples);
|
||||
else
|
||||
|
@ -799,8 +799,8 @@ int CGraphics_SDL::InitWindow()
|
|||
}
|
||||
|
||||
dbg_msg("gfx", "out of ideas. failed to init graphics");
|
||||
|
||||
return -1;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -813,34 +813,34 @@ bool CGraphics_SDL::Init()
|
|||
{
|
||||
{
|
||||
int Systems = SDL_INIT_VIDEO;
|
||||
|
||||
|
||||
if(g_Config.m_SndEnable)
|
||||
Systems |= SDL_INIT_AUDIO;
|
||||
|
||||
if(g_Config.m_ClEventthread)
|
||||
Systems |= SDL_INIT_EVENTTHREAD;
|
||||
|
||||
|
||||
if(SDL_Init(Systems) < 0)
|
||||
{
|
||||
dbg_msg("gfx", "unable to init SDL: %s", SDL_GetError());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
atexit(SDL_Quit); // ignore_convention
|
||||
|
||||
#ifdef CONF_FAMILY_WINDOWS
|
||||
if(!getenv("SDL_VIDEO_WINDOW_POS") && !getenv("SDL_VIDEO_CENTERED")) // ignore_convention
|
||||
putenv("SDL_VIDEO_WINDOW_POS=8,27"); // ignore_convention
|
||||
#endif
|
||||
|
||||
|
||||
if(InitWindow() != 0)
|
||||
return true;
|
||||
|
||||
SDL_ShowCursor(0);
|
||||
|
||||
|
||||
CGraphics_OpenGL::Init();
|
||||
|
||||
|
||||
MapScreen(0,0,g_Config.m_GfxScreenWidth, g_Config.m_GfxScreenHeight);
|
||||
return false;
|
||||
}
|
||||
|
@ -887,11 +887,11 @@ void CGraphics_SDL::Swap()
|
|||
ScreenshotDirect(m_aScreenshotName);
|
||||
m_DoScreenshot = false;
|
||||
}
|
||||
|
||||
|
||||
SDL_GL_SwapBuffers();
|
||||
|
||||
|
||||
if(g_Config.m_GfxFinish)
|
||||
glFinish();
|
||||
glFinish();
|
||||
}
|
||||
|
||||
|
||||
|
@ -908,9 +908,9 @@ int CGraphics_SDL::GetVideoModes(CVideoMode *pModes, int MaxModes)
|
|||
Count = MaxModes;
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
// TODO: fix this code on osx or windows
|
||||
|
||||
|
||||
ppModes = SDL_ListModes(NULL, SDL_OPENGL|SDL_GL_DOUBLEBUFFER|SDL_FULLSCREEN);
|
||||
if(ppModes == NULL)
|
||||
{
|
||||
|
@ -936,7 +936,7 @@ int CGraphics_SDL::GetVideoModes(CVideoMode *pModes, int MaxModes)
|
|||
NumModes++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return NumModes;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ class CGraphics_OpenGL : public IEngineGraphics
|
|||
protected:
|
||||
class IStorage *m_pStorage;
|
||||
class IConsole *m_pConsole;
|
||||
|
||||
|
||||
//
|
||||
typedef struct { float x, y, z; } CPoint;
|
||||
typedef struct { float u, v; } CTexCoord;
|
||||
|
@ -20,14 +20,14 @@ protected:
|
|||
CTexCoord m_Tex;
|
||||
CColor m_Color;
|
||||
} CVertex;
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_VERTICES = 32*1024,
|
||||
MAX_TEXTURES = 1024*4,
|
||||
|
||||
|
||||
DRAWING_QUADS=1,
|
||||
DRAWING_LINES=2
|
||||
DRAWING_LINES=2
|
||||
};
|
||||
|
||||
CVertex m_aVertices[MAX_VERTICES];
|
||||
|
@ -65,27 +65,27 @@ protected:
|
|||
void Flush();
|
||||
void AddVertices(int Count);
|
||||
void Rotate4(const CPoint &rCenter, CVertex *pPoints);
|
||||
|
||||
|
||||
static unsigned char Sample(int w, int h, const unsigned char *pData, int u, int v, int Offset);
|
||||
public:
|
||||
CGraphics_OpenGL();
|
||||
|
||||
|
||||
virtual void ClipEnable(int x, int y, int w, int h);
|
||||
virtual void ClipDisable();
|
||||
|
||||
|
||||
virtual void BlendNone();
|
||||
virtual void BlendNormal();
|
||||
virtual void BlendAdditive();
|
||||
|
||||
virtual int MemoryUsage() const;
|
||||
|
||||
|
||||
virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY);
|
||||
virtual void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY);
|
||||
|
||||
virtual void LinesBegin();
|
||||
virtual void LinesEnd();
|
||||
virtual void LinesDraw(const CLineItem *pArray, int Num);
|
||||
|
||||
|
||||
virtual int UnloadTexture(int Index);
|
||||
virtual int LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags);
|
||||
|
||||
|
@ -115,14 +115,14 @@ public:
|
|||
virtual void QuadsDrawTL(const CQuadItem *pArray, int Num);
|
||||
virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num);
|
||||
virtual void QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText);
|
||||
|
||||
|
||||
virtual bool Init();
|
||||
};
|
||||
|
||||
class CGraphics_SDL : public CGraphics_OpenGL
|
||||
{
|
||||
SDL_Surface *m_pScreenSurface;
|
||||
|
||||
SDL_Surface *m_pScreenSurface;
|
||||
|
||||
int TryInit();
|
||||
int InitWindow();
|
||||
public:
|
||||
|
@ -141,7 +141,7 @@ public:
|
|||
virtual void Swap();
|
||||
|
||||
virtual int GetVideoModes(CVideoMode *pModes, int MaxModes);
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -154,7 +154,7 @@ int CInput::Update()
|
|||
// skip private use area of the BMP(contains the unicodes for keyboard function keys on MacOS)
|
||||
if(Event.key.keysym.unicode < 0xE000 || Event.key.keysym.unicode > 0xF8FF) // ignore_convention
|
||||
AddEvent(Event.key.keysym.unicode, 0, 0); // ignore_convention
|
||||
Key = Event.key.keysym.sym; // ignore_convention
|
||||
Key = Event.key.keysym.sym; // ignore_convention
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
Action = IInput::FLAG_RELEASE;
|
||||
|
|
|
@ -86,7 +86,7 @@ bool CServerBrowser::SortCompareName(int Index1, int Index2) const
|
|||
CServerEntry *a = m_ppServerlist[Index1];
|
||||
CServerEntry *b = m_ppServerlist[Index2];
|
||||
// make sure empty entries are listed last
|
||||
return (a->m_GotInfo && b->m_GotInfo) || (!a->m_GotInfo && !b->m_GotInfo) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 :
|
||||
return (a->m_GotInfo && b->m_GotInfo) || (!a->m_GotInfo && !b->m_GotInfo) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 :
|
||||
a->m_GotInfo ? true : false;
|
||||
}
|
||||
|
||||
|
@ -535,7 +535,7 @@ void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) cons
|
|||
Packet.m_Flags = NETSENDFLAG_CONNLESS;
|
||||
Packet.m_DataSize = sizeof(Buffer);
|
||||
Packet.m_pData = Buffer;
|
||||
|
||||
|
||||
m_pNetClient->Send(&Packet);
|
||||
|
||||
if(pEntry)
|
||||
|
@ -659,7 +659,7 @@ void CServerBrowser::AddFavorite(const NETADDR &Addr)
|
|||
if(pEntry)
|
||||
pEntry->m_Info.m_Favorite = 1;
|
||||
|
||||
if(g_Config.m_Debug)
|
||||
if(g_Config.m_Debug)
|
||||
{
|
||||
char aAddrStr[NETADDR_MAXSTRSIZE];
|
||||
net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
|
||||
|
@ -705,7 +705,7 @@ int CServerBrowser::LoadingProgression() const
|
|||
{
|
||||
if(m_NumServers == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
int Servers = m_NumServers;
|
||||
int Loaded = m_NumServers-m_NumRequests;
|
||||
return 100.0f * Loaded/Servers;
|
||||
|
|
|
@ -103,7 +103,7 @@ private:
|
|||
|
||||
CServerEntry *Find(const NETADDR &Addr);
|
||||
CServerEntry *Add(const NETADDR &Addr);
|
||||
|
||||
|
||||
void RemoveRequest(CServerEntry *pEntry);
|
||||
void QueueRequest(CServerEntry *pEntry);
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ static int aFontSizes[] = {8,9,10,11,12,13,14,15,16,17,18,19,20,36,64};
|
|||
struct CFontChar
|
||||
{
|
||||
int m_ID;
|
||||
|
||||
|
||||
// these values are scaled to the pFont size
|
||||
// width * font_size == real_size
|
||||
float m_Width;
|
||||
|
@ -44,7 +44,7 @@ struct CFontChar
|
|||
float m_OffsetX;
|
||||
float m_OffsetY;
|
||||
float m_AdvanceX;
|
||||
|
||||
|
||||
float m_aUvs[4];
|
||||
int64 m_TouchTime;
|
||||
};
|
||||
|
@ -57,16 +57,16 @@ struct CFontSizeData
|
|||
GLuint m_aTextures[2];
|
||||
int m_TextureWidth;
|
||||
int m_TextureHeight;
|
||||
|
||||
|
||||
int m_NumXChars;
|
||||
int m_NumYChars;
|
||||
|
||||
|
||||
int m_CharMaxWidth;
|
||||
int m_CharMaxHeight;
|
||||
|
||||
|
||||
CFontChar m_aCharacters[MAX_CHARACTERS*MAX_CHARACTERS];
|
||||
|
||||
int m_CurrentCharacter;
|
||||
|
||||
int m_CurrentCharacter;
|
||||
};
|
||||
|
||||
class CFont
|
||||
|
@ -82,7 +82,7 @@ class CTextRender : public IEngineTextRender
|
|||
{
|
||||
IGraphics *m_pGraphics;
|
||||
IGraphics *Graphics() { return m_pGraphics; }
|
||||
|
||||
|
||||
int WordLength(const char *pText)
|
||||
{
|
||||
int s = 1;
|
||||
|
@ -106,13 +106,13 @@ class CTextRender : public IEngineTextRender
|
|||
float m_TextOutlineG;
|
||||
float m_TextOutlineB;
|
||||
float m_TextOutlineA;
|
||||
|
||||
|
||||
int m_FontTextureFormat;
|
||||
|
||||
CFont *m_pDefaultFont;
|
||||
|
||||
FT_Library m_FTLibrary;
|
||||
|
||||
|
||||
int GetFontSizeIndex(int Pixelsize)
|
||||
{
|
||||
for(unsigned i = 0; i < NUM_FONT_SIZES; i++)
|
||||
|
@ -120,18 +120,18 @@ class CTextRender : public IEngineTextRender
|
|||
if(aFontSizes[i] >= Pixelsize)
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
return NUM_FONT_SIZES-1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Grow(unsigned char *pIn, unsigned char *pOut, int w, int h)
|
||||
{
|
||||
for(int y = 0; y < h; y++)
|
||||
for(int x = 0; x < w; x++)
|
||||
{
|
||||
int c = pIn[y*w+x];
|
||||
for(int y = 0; y < h; y++)
|
||||
for(int x = 0; x < w; x++)
|
||||
{
|
||||
int c = pIn[y*w+x];
|
||||
|
||||
for(int sy = -1; sy <= 1; sy++)
|
||||
for(int sx = -1; sx <= 1; sx++)
|
||||
|
@ -142,7 +142,7 @@ class CTextRender : public IEngineTextRender
|
|||
{
|
||||
int Index = GetY*w+GetX;
|
||||
if(pIn[Index] > c)
|
||||
c = pIn[Index];
|
||||
c = pIn[Index];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,18 +157,18 @@ class CTextRender : public IEngineTextRender
|
|||
int Height = CharHeight*Ychars;
|
||||
void *pMem = mem_alloc(Width*Height, 1);
|
||||
mem_zero(pMem, Width*Height);
|
||||
|
||||
|
||||
if(pSizeData->m_aTextures[0] == 0)
|
||||
glGenTextures(2, pSizeData->m_aTextures);
|
||||
else
|
||||
FontMemoryUsage -= pSizeData->m_TextureWidth*pSizeData->m_TextureHeight*2;
|
||||
|
||||
|
||||
pSizeData->m_NumXChars = Xchars;
|
||||
pSizeData->m_NumYChars = Ychars;
|
||||
pSizeData->m_TextureWidth = Width;
|
||||
pSizeData->m_TextureHeight = Height;
|
||||
pSizeData->m_CurrentCharacter = 0;
|
||||
|
||||
|
||||
for(int i = 0; i < 2; i++)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, pSizeData->m_aTextures[i]);
|
||||
|
@ -177,9 +177,9 @@ class CTextRender : public IEngineTextRender
|
|||
glTexImage2D(GL_TEXTURE_2D, 0, m_FontTextureFormat, Width, Height, 0, m_FontTextureFormat, GL_UNSIGNED_BYTE, pMem);
|
||||
FontMemoryUsage += Width*Height;
|
||||
}
|
||||
|
||||
|
||||
dbg_msg("", "pFont memory usage: %d", FontMemoryUsage);
|
||||
|
||||
|
||||
mem_free(pMem);
|
||||
}
|
||||
|
||||
|
@ -198,43 +198,43 @@ class CTextRender : public IEngineTextRender
|
|||
pSizeData->m_NumXChars <<= 1;
|
||||
else
|
||||
pSizeData->m_NumYChars <<= 1;
|
||||
InitTexture(pSizeData, pSizeData->m_CharMaxWidth, pSizeData->m_CharMaxHeight, pSizeData->m_NumXChars, pSizeData->m_NumYChars);
|
||||
InitTexture(pSizeData, pSizeData->m_CharMaxWidth, pSizeData->m_CharMaxHeight, pSizeData->m_NumXChars, pSizeData->m_NumYChars);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// TODO: Refactor: move this into a pFont class
|
||||
void InitIndex(CFont *pFont, int Index)
|
||||
{
|
||||
CFontSizeData *pSizeData = &pFont->m_aSizes[Index];
|
||||
|
||||
|
||||
pSizeData->m_FontSize = aFontSizes[Index];
|
||||
FT_Set_Pixel_Sizes(pFont->m_FtFace, 0, pSizeData->m_FontSize);
|
||||
|
||||
|
||||
int OutlineThickness = AdjustOutlineThicknessToFontSize(1, pSizeData->m_FontSize);
|
||||
|
||||
|
||||
{
|
||||
unsigned GlyphIndex;
|
||||
int MaxH = 0;
|
||||
int MaxW = 0;
|
||||
|
||||
|
||||
int Charcode = FT_Get_First_Char(pFont->m_FtFace, &GlyphIndex);
|
||||
while(GlyphIndex != 0)
|
||||
{
|
||||
{
|
||||
// do stuff
|
||||
FT_Load_Glyph(pFont->m_FtFace, GlyphIndex, FT_LOAD_DEFAULT);
|
||||
|
||||
|
||||
if(pFont->m_FtFace->glyph->metrics.width > MaxW) MaxW = pFont->m_FtFace->glyph->metrics.width; // ignore_convention
|
||||
if(pFont->m_FtFace->glyph->metrics.height > MaxH) MaxH = pFont->m_FtFace->glyph->metrics.height; // ignore_convention
|
||||
Charcode = FT_Get_Next_Char(pFont->m_FtFace, Charcode, &GlyphIndex);
|
||||
}
|
||||
|
||||
|
||||
MaxW = (MaxW>>6)+2+OutlineThickness*2;
|
||||
MaxH = (MaxH>>6)+2+OutlineThickness*2;
|
||||
|
||||
|
||||
for(pSizeData->m_CharMaxWidth = 1; pSizeData->m_CharMaxWidth < MaxW; pSizeData->m_CharMaxWidth <<= 1);
|
||||
for(pSizeData->m_CharMaxHeight = 1; pSizeData->m_CharMaxHeight < MaxH; pSizeData->m_CharMaxHeight <<= 1);
|
||||
}
|
||||
|
||||
|
||||
//dbg_msg("pFont", "init size %d, texture size %d %d", pFont->sizes[index].font_size, w, h);
|
||||
//FT_New_Face(m_FTLibrary, "data/fonts/vera.ttf", 0, &pFont->ft_face);
|
||||
InitTexture(pSizeData, pSizeData->m_CharMaxWidth, pSizeData->m_CharMaxHeight, 8, 8);
|
||||
|
@ -253,7 +253,7 @@ class CTextRender : public IEngineTextRender
|
|||
{
|
||||
int x = (SlotID%pSizeData->m_NumXChars) * (pSizeData->m_TextureWidth/pSizeData->m_NumXChars);
|
||||
int y = (SlotID/pSizeData->m_NumXChars) * (pSizeData->m_TextureHeight/pSizeData->m_NumYChars);
|
||||
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, pSizeData->m_aTextures[Texnum]);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y,
|
||||
pSizeData->m_TextureWidth/pSizeData->m_NumXChars,
|
||||
|
@ -284,13 +284,13 @@ class CTextRender : public IEngineTextRender
|
|||
if(pSizeData->m_aCharacters[i].m_TouchTime < pSizeData->m_aCharacters[Oldest].m_TouchTime)
|
||||
Oldest = i;
|
||||
}
|
||||
|
||||
|
||||
if(time_get()-pSizeData->m_aCharacters[Oldest].m_TouchTime < time_freq())
|
||||
{
|
||||
IncreaseTextureSize(pSizeData);
|
||||
return GetSlot(pSizeData);
|
||||
}
|
||||
|
||||
|
||||
return Oldest;
|
||||
}
|
||||
}
|
||||
|
@ -315,12 +315,12 @@ class CTextRender : public IEngineTextRender
|
|||
}
|
||||
|
||||
pBitmap = &pFont->m_FtFace->glyph->bitmap; // ignore_convention
|
||||
|
||||
|
||||
// fetch slot
|
||||
SlotID = GetSlot(pSizeData);
|
||||
if(SlotID < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
// adjust spacing
|
||||
int OutlineThickness = AdjustOutlineThicknessToFontSize(1, pSizeData->m_FontSize);
|
||||
x += OutlineThickness;
|
||||
|
@ -337,7 +337,7 @@ class CTextRender : public IEngineTextRender
|
|||
}
|
||||
else if(pBitmap->pixel_mode == FT_PIXEL_MODE_MONO) // ignore_convention
|
||||
{
|
||||
for(py = 0; py < pBitmap->rows; py++) // ignore_convention
|
||||
for(py = 0; py < pBitmap->rows; py++) // ignore_convention
|
||||
for(px = 0; px < pBitmap->width; px++) // ignore_convention
|
||||
{
|
||||
if(pBitmap->buffer[py*pBitmap->pitch+px/8]&(1<<(7-(px%8)))) // ignore_convention
|
||||
|
@ -345,13 +345,13 @@ class CTextRender : public IEngineTextRender
|
|||
}
|
||||
}
|
||||
|
||||
if(0) for(py = 0; py < SlotW; py++)
|
||||
for(px = 0; px < SlotH; px++)
|
||||
if(0) for(py = 0; py < SlotW; py++)
|
||||
for(px = 0; px < SlotH; px++)
|
||||
ms_aGlyphData[py*SlotW+px] = 255;
|
||||
|
||||
|
||||
// upload the glyph
|
||||
UploadGlyph(pSizeData, 0, SlotID, Chr, ms_aGlyphData);
|
||||
|
||||
|
||||
if(OutlineThickness == 1)
|
||||
{
|
||||
Grow(ms_aGlyphData, ms_aGlyphDataOutlined, SlotW, SlotH);
|
||||
|
@ -366,7 +366,7 @@ class CTextRender : public IEngineTextRender
|
|||
}
|
||||
UploadGlyph(pSizeData, 1, SlotID, Chr, ms_aGlyphData);
|
||||
}
|
||||
|
||||
|
||||
// set char info
|
||||
{
|
||||
CFontChar *pFontchr = &pSizeData->m_aCharacters[SlotID];
|
||||
|
@ -375,27 +375,27 @@ class CTextRender : public IEngineTextRender
|
|||
float Vscale = 1.0f/pSizeData->m_TextureHeight;
|
||||
int Height = pBitmap->rows + OutlineThickness*2 + 2; // ignore_convention
|
||||
int Width = pBitmap->width + OutlineThickness*2 + 2; // ignore_convention
|
||||
|
||||
|
||||
pFontchr->m_ID = Chr;
|
||||
pFontchr->m_Height = Height * Scale;
|
||||
pFontchr->m_Width = Width * Scale;
|
||||
pFontchr->m_OffsetX = (pFont->m_FtFace->glyph->bitmap_left-1) * Scale; // ignore_convention
|
||||
pFontchr->m_OffsetY = (pSizeData->m_FontSize - pFont->m_FtFace->glyph->bitmap_top) * Scale; // ignore_convention
|
||||
pFontchr->m_AdvanceX = (pFont->m_FtFace->glyph->advance.x>>6) * Scale; // ignore_convention
|
||||
|
||||
|
||||
pFontchr->m_aUvs[0] = (SlotID%pSizeData->m_NumXChars) / (float)(pSizeData->m_NumXChars);
|
||||
pFontchr->m_aUvs[1] = (SlotID/pSizeData->m_NumXChars) / (float)(pSizeData->m_NumYChars);
|
||||
pFontchr->m_aUvs[2] = pFontchr->m_aUvs[0] + Width*Uscale;
|
||||
pFontchr->m_aUvs[3] = pFontchr->m_aUvs[1] + Height*Vscale;
|
||||
}
|
||||
|
||||
|
||||
return SlotID;
|
||||
}
|
||||
|
||||
CFontChar *GetChar(CFont *pFont, CFontSizeData *pSizeData, int Chr)
|
||||
{
|
||||
CFontChar *pFontchr = NULL;
|
||||
|
||||
|
||||
// search for the character
|
||||
// TODO: remove this linear search
|
||||
int i;
|
||||
|
@ -407,7 +407,7 @@ class CTextRender : public IEngineTextRender
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// check if we need to render the character
|
||||
if(!pFontchr)
|
||||
{
|
||||
|
@ -415,12 +415,12 @@ class CTextRender : public IEngineTextRender
|
|||
if(Index >= 0)
|
||||
pFontchr = &pSizeData->m_aCharacters[Index];
|
||||
}
|
||||
|
||||
|
||||
// touch the character
|
||||
// TODO: don't call time_get here
|
||||
if(pFontchr)
|
||||
pFontchr->m_TouchTime = time_get();
|
||||
|
||||
|
||||
return pFontchr;
|
||||
}
|
||||
|
||||
|
@ -436,8 +436,8 @@ class CTextRender : public IEngineTextRender
|
|||
FT_Get_Kerning(pFont->m_FtFace, Left, Right, FT_KERNING_DEFAULT, &Kerning);
|
||||
return (Kerning.x>>6);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public:
|
||||
CTextRender()
|
||||
{
|
||||
|
@ -457,21 +457,21 @@ public:
|
|||
// GL_LUMINANCE can be good for debugging
|
||||
m_FontTextureFormat = GL_ALPHA;
|
||||
}
|
||||
|
||||
|
||||
virtual void Init()
|
||||
{
|
||||
m_pGraphics = Kernel()->RequestInterface<IGraphics>();
|
||||
FT_Init_FreeType(&m_FTLibrary);
|
||||
}
|
||||
|
||||
|
||||
|
||||
virtual CFont *LoadFont(const char *pFilename)
|
||||
{
|
||||
CFont *pFont = (CFont *)mem_alloc(sizeof(CFont), 1);
|
||||
|
||||
|
||||
mem_zero(pFont, sizeof(*pFont));
|
||||
str_copy(pFont->m_aFilename, pFilename, sizeof(pFont->m_aFilename));
|
||||
|
||||
|
||||
if(FT_New_Face(m_FTLibrary, pFont->m_aFilename, 0, &pFont->m_FtFace))
|
||||
{
|
||||
mem_free(pFont);
|
||||
|
@ -480,7 +480,7 @@ public:
|
|||
|
||||
for(unsigned i = 0; i < NUM_FONT_SIZES; i++)
|
||||
pFont->m_aSizes[i].m_FontSize = -1;
|
||||
|
||||
|
||||
dbg_msg("textrender", "loaded pFont from '%s'", pFilename);
|
||||
return pFont;
|
||||
};
|
||||
|
@ -495,8 +495,8 @@ public:
|
|||
dbg_msg("textrender", "default pFont set %p", pFont);
|
||||
m_pDefaultFont = pFont;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
virtual void SetCursor(CTextCursor *pCursor, float x, float y, float FontSize, int Flags)
|
||||
{
|
||||
mem_zero(pCursor, sizeof(*pCursor));
|
||||
|
@ -510,8 +510,8 @@ public:
|
|||
pCursor->m_Flags = Flags;
|
||||
pCursor->m_CharCount = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
virtual void Text(void *pFontSetV, float x, float y, float Size, const char *pText, int MaxWidth)
|
||||
{
|
||||
CTextCursor Cursor;
|
||||
|
@ -527,7 +527,7 @@ public:
|
|||
TextEx(&Cursor, pText, Length);
|
||||
return Cursor.m_X;
|
||||
}
|
||||
|
||||
|
||||
virtual int TextLineCount(void *pFontSetV, float Size, const char *pText, float LineWidth)
|
||||
{
|
||||
CTextCursor Cursor;
|
||||
|
@ -552,12 +552,12 @@ public:
|
|||
m_TextOutlineB = b;
|
||||
m_TextOutlineA = a;
|
||||
}
|
||||
|
||||
|
||||
virtual void TextEx(CTextCursor *pCursor, const char *pText, int Length)
|
||||
{
|
||||
CFont *pFont = pCursor->m_pFont;
|
||||
CFontSizeData *pSizeData = NULL;
|
||||
|
||||
|
||||
//dbg_msg("textrender", "rendering text '%s'", text);
|
||||
|
||||
float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
|
||||
|
@ -576,7 +576,7 @@ public:
|
|||
|
||||
// to correct coords, convert to screen coords, round, and convert back
|
||||
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
|
||||
|
||||
|
||||
FakeToScreenX = (Graphics()->ScreenWidth()/(ScreenX1-ScreenX0));
|
||||
FakeToScreenY = (Graphics()->ScreenHeight()/(ScreenY1-ScreenY0));
|
||||
ActualX = (int)(pCursor->m_X * FakeToScreenX);
|
||||
|
@ -592,7 +592,7 @@ public:
|
|||
// fetch pFont data
|
||||
if(!pFont)
|
||||
pFont = m_pDefaultFont;
|
||||
|
||||
|
||||
if(!pFont)
|
||||
return;
|
||||
|
||||
|
@ -600,11 +600,11 @@ public:
|
|||
RenderSetup(pFont, ActualSize);
|
||||
|
||||
float Scale = 1/pSizeData->m_FontSize;
|
||||
|
||||
|
||||
// set length
|
||||
if(Length < 0)
|
||||
Length = str_length(pText);
|
||||
|
||||
|
||||
pEnd = pText + Length;
|
||||
|
||||
// if we don't want to render, we can just skip the first outline pass
|
||||
|
@ -649,7 +649,7 @@ public:
|
|||
Compare.m_Flags &= ~TEXTFLAG_RENDER;
|
||||
Compare.m_LineWidth = -1;
|
||||
TextEx(&Compare, pText, Wlen);
|
||||
|
||||
|
||||
if(Compare.m_X-DrawX > pCursor->m_LineWidth)
|
||||
{
|
||||
// word can't be fitted in one line, cut it
|
||||
|
@ -659,11 +659,11 @@ public:
|
|||
Cutter.m_Y = DrawY;
|
||||
Cutter.m_Flags &= ~TEXTFLAG_RENDER;
|
||||
Cutter.m_Flags |= TEXTFLAG_STOP_AT_END;
|
||||
|
||||
|
||||
TextEx(&Cutter, (const char *)pCurrent, Wlen);
|
||||
Wlen = Cutter.m_CharCount;
|
||||
NewLine = 1;
|
||||
|
||||
|
||||
if(Wlen <= 3) // if we can't place 3 chars of the word on this line, take the next
|
||||
Wlen = 0;
|
||||
}
|
||||
|
@ -672,10 +672,10 @@ public:
|
|||
NewLine = 1;
|
||||
Wlen = 0;
|
||||
}
|
||||
|
||||
|
||||
pBatchEnd = pCurrent + Wlen;
|
||||
}
|
||||
|
||||
|
||||
const char *pTmp = pCurrent;
|
||||
int NextCharacter = str_utf8_decode(&pTmp);
|
||||
while(pCurrent < pBatchEnd)
|
||||
|
@ -683,7 +683,7 @@ public:
|
|||
int Character = NextCharacter;
|
||||
pCurrent = pTmp;
|
||||
NextCharacter = str_utf8_decode(&pTmp);
|
||||
|
||||
|
||||
if(Character == '\n')
|
||||
{
|
||||
DrawX = pCursor->m_StartX;
|
||||
|
@ -718,14 +718,14 @@ public:
|
|||
pCursor->m_CharCount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(NewLine)
|
||||
{
|
||||
DrawX = pCursor->m_StartX;
|
||||
DrawY += Size;
|
||||
GotNewLine = 1;
|
||||
DrawX = (int)(DrawX * FakeToScreenX) / FakeToScreenX; // realign
|
||||
DrawY = (int)(DrawY * FakeToScreenY) / FakeToScreenY;
|
||||
DrawY = (int)(DrawY * FakeToScreenY) / FakeToScreenY;
|
||||
++LineCount;
|
||||
}
|
||||
}
|
||||
|
@ -736,11 +736,11 @@ public:
|
|||
|
||||
pCursor->m_X = DrawX;
|
||||
pCursor->m_LineCount = LineCount;
|
||||
|
||||
|
||||
if(GotNewLine)
|
||||
pCursor->m_Y = DrawY;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
IEngineTextRender *CreateEngineTextRender() { return new CTextRender; }
|
||||
|
|
|
@ -15,9 +15,9 @@ public:
|
|||
virtual void Reset() = 0;
|
||||
virtual void RestoreStrings() = 0;
|
||||
virtual void Save() = 0;
|
||||
|
||||
|
||||
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) = 0;
|
||||
|
||||
|
||||
virtual void WriteLine(const char *pLine) = 0;
|
||||
};
|
||||
|
||||
|
|
|
@ -25,14 +25,14 @@ public:
|
|||
public:
|
||||
IResult() { m_NumArgs = 0; }
|
||||
virtual ~IResult() {}
|
||||
|
||||
|
||||
virtual int GetInteger(unsigned Index) = 0;
|
||||
virtual float GetFloat(unsigned Index) = 0;
|
||||
virtual const char *GetString(unsigned Index) = 0;
|
||||
|
||||
|
||||
int NumArguments() const { return m_NumArgs; }
|
||||
};
|
||||
|
||||
|
||||
class CCommandInfo
|
||||
{
|
||||
public:
|
||||
|
@ -50,16 +50,16 @@ public:
|
|||
virtual void PossibleCommands(const char *pStr, int FlagMask, FPossibleCallback pfnCallback, void *pUser) = 0;
|
||||
virtual void ParseArguments(int NumArgs, const char **ppArguments) = 0;
|
||||
|
||||
virtual void Register(const char *pName, const char *pParams,
|
||||
virtual void Register(const char *pName, const char *pParams,
|
||||
int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp) = 0;
|
||||
virtual void Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser) = 0;
|
||||
virtual void StoreCommands(bool Store) = 0;
|
||||
|
||||
|
||||
virtual bool LineIsValid(const char *pStr) = 0;
|
||||
virtual void ExecuteLine(const char *Sptr) = 0;
|
||||
virtual void ExecuteLineStroked(int Stroke, const char *pStr) = 0;
|
||||
virtual void ExecuteFile(const char *pFilename) = 0;
|
||||
|
||||
|
||||
virtual void RegisterPrintCallback(FPrintCallback pfnPrintCallback, void *pUserData) = 0;
|
||||
virtual void Print(int Level, const char *pFrom, const char *pStr) = 0;
|
||||
};
|
||||
|
|
|
@ -21,11 +21,11 @@ public:
|
|||
{
|
||||
MAX_FRIENDS=128,
|
||||
};
|
||||
|
||||
|
||||
virtual void Init() = 0;
|
||||
|
||||
|
||||
virtual int NumFriends() const = 0;
|
||||
virtual const CFriendInfo *GetFriend(int Index) const = 0;
|
||||
virtual const CFriendInfo *GetFriend(int Index) const = 0;
|
||||
virtual bool IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const = 0;
|
||||
|
||||
virtual void AddFriend(const char *pName, const char *pClan) = 0;
|
||||
|
|
|
@ -19,11 +19,11 @@ public:
|
|||
/* Variable: width
|
||||
Contains the width of the image */
|
||||
int m_Width;
|
||||
|
||||
|
||||
/* Variable: height
|
||||
Contains the height of the image */
|
||||
int m_Height;
|
||||
|
||||
|
||||
/* Variable: format
|
||||
Contains the format of the image. See <Image Formats> for more information. */
|
||||
int m_Format;
|
||||
|
@ -61,27 +61,27 @@ public:
|
|||
int ScreenWidth() const { return m_ScreenWidth; }
|
||||
int ScreenHeight() const { return m_ScreenHeight; }
|
||||
float ScreenAspect() const { return (float)ScreenWidth()/(float)ScreenHeight(); }
|
||||
|
||||
|
||||
virtual void Clear(float r, float g, float b) = 0;
|
||||
|
||||
|
||||
virtual void ClipEnable(int x, int y, int w, int h) = 0;
|
||||
virtual void ClipDisable() = 0;
|
||||
|
||||
|
||||
virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) = 0;
|
||||
virtual void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) = 0;
|
||||
|
||||
|
||||
// TODO: These should perhaps not be virtuals
|
||||
virtual void BlendNone() = 0;
|
||||
virtual void BlendNormal() = 0;
|
||||
virtual void BlendAdditive() = 0;
|
||||
virtual int MemoryUsage() const = 0;
|
||||
|
||||
|
||||
virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) =0;
|
||||
virtual int UnloadTexture(int Index) = 0;
|
||||
virtual int LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags) = 0;
|
||||
virtual int LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) = 0;
|
||||
virtual void TextureSet(int TextureID) = 0;
|
||||
|
||||
|
||||
struct CLineItem
|
||||
{
|
||||
float m_X0, m_Y0, m_X1, m_Y1;
|
||||
|
@ -91,13 +91,13 @@ public:
|
|||
virtual void LinesBegin() = 0;
|
||||
virtual void LinesEnd() = 0;
|
||||
virtual void LinesDraw(const CLineItem *pArray, int Num) = 0;
|
||||
|
||||
|
||||
virtual void QuadsBegin() = 0;
|
||||
virtual void QuadsEnd() = 0;
|
||||
virtual void QuadsSetRotation(float Angle) = 0;
|
||||
virtual void QuadsSetSubset(float TopLeftY, float TopLeftV, float BottomRightU, float BottomRightV) = 0;
|
||||
virtual void QuadsSetSubsetFree(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) = 0;
|
||||
|
||||
|
||||
struct CQuadItem
|
||||
{
|
||||
float m_X, m_Y, m_Width, m_Height;
|
||||
|
@ -106,7 +106,7 @@ public:
|
|||
};
|
||||
virtual void QuadsDraw(CQuadItem *pArray, int Num) = 0;
|
||||
virtual void QuadsDrawTL(const CQuadItem *pArray, int Num) = 0;
|
||||
|
||||
|
||||
struct CFreeformItem
|
||||
{
|
||||
float m_X0, m_Y0, m_X1, m_Y1, m_X2, m_Y2, m_X3, m_Y3;
|
||||
|
@ -116,7 +116,7 @@ public:
|
|||
};
|
||||
virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) = 0;
|
||||
virtual void QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText) = 0;
|
||||
|
||||
|
||||
struct CColorVertex
|
||||
{
|
||||
int m_Index;
|
||||
|
@ -126,7 +126,7 @@ public:
|
|||
};
|
||||
virtual void SetColorVertex(const CColorVertex *pArray, int Num) = 0;
|
||||
virtual void SetColor(float r, float g, float b, float a) = 0;
|
||||
|
||||
|
||||
virtual void TakeScreenshot(const char *pFilename) = 0;
|
||||
virtual int GetVideoModes(CVideoMode *pModes, int MaxModes) = 0;
|
||||
|
||||
|
@ -139,13 +139,13 @@ class IEngineGraphics : public IGraphics
|
|||
public:
|
||||
virtual bool Init() = 0;
|
||||
virtual void Shutdown() = 0;
|
||||
|
||||
|
||||
virtual void Minimize() = 0;
|
||||
virtual void Maximize() = 0;
|
||||
|
||||
|
||||
virtual int WindowActive() = 0;
|
||||
virtual int WindowOpen() = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
extern IEngineGraphics *CreateEngineGraphics();
|
||||
|
|
|
@ -41,7 +41,7 @@ protected:
|
|||
|
||||
int KeyWasPressed(int Key) { return m_aInputState[m_InputCurrent^1][Key]; }
|
||||
|
||||
public:
|
||||
public:
|
||||
enum
|
||||
{
|
||||
FLAG_PRESS=1,
|
||||
|
@ -53,7 +53,7 @@ public:
|
|||
int NumEvents() const { return m_NumEvents; }
|
||||
void ClearEvents() { m_NumEvents = 0; }
|
||||
CEvent GetEvent(int Index) const
|
||||
{
|
||||
{
|
||||
if(Index < 0 || Index >= m_NumEvents)
|
||||
{
|
||||
IInput::CEvent e = {0,0};
|
||||
|
@ -61,19 +61,19 @@ public:
|
|||
}
|
||||
return m_aInputEvents[Index];
|
||||
}
|
||||
|
||||
|
||||
// keys
|
||||
int KeyPressed(int Key) { return m_aInputState[m_InputCurrent][Key]; }
|
||||
int KeyReleases(int Key) { return m_aInputCount[m_InputCurrent][Key].m_Releases; }
|
||||
int KeyPresses(int Key) { return m_aInputCount[m_InputCurrent][Key].m_Presses; }
|
||||
int KeyDown(int Key) { return KeyPressed(Key)&&!KeyWasPressed(Key); }
|
||||
const char *KeyName(int Key) { return (Key >= 0 && Key < 512) ? g_aaKeyStrings[Key] : g_aaKeyStrings[0]; }
|
||||
|
||||
|
||||
//
|
||||
virtual void MouseModeRelative() = 0;
|
||||
virtual void MouseModeAbsolute() = 0;
|
||||
virtual int MouseDoubleClick() = 0;
|
||||
|
||||
|
||||
virtual void MouseRelative(float *x, float *y) = 0;
|
||||
};
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ protected:
|
|||
public:
|
||||
IInterface() : m_pKernel(0) {}
|
||||
virtual ~IInterface() {}
|
||||
|
||||
|
||||
//virtual unsigned InterfaceID() = 0;
|
||||
//virtual const char *InterfaceName() = 0;
|
||||
};
|
||||
|
@ -27,7 +27,7 @@ public:
|
|||
public: \
|
||||
static const char *InterfaceName() { return Name; } \
|
||||
private:
|
||||
|
||||
|
||||
//virtual unsigned InterfaceID() { return INTERFACE_ID; }
|
||||
//virtual const char *InterfaceName() { return name; }
|
||||
|
||||
|
@ -55,7 +55,7 @@ public:
|
|||
{
|
||||
return ReregisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface);
|
||||
}
|
||||
|
||||
|
||||
// Usage example:
|
||||
// IMyInterface *pMyHandle = Kernel()->RequestInterface<IMyInterface>()
|
||||
template<class TINTERFACE>
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
const char *m_pName;
|
||||
int m_Latency;
|
||||
};
|
||||
|
||||
|
||||
int Tick() const { return m_CurrentGameTick; }
|
||||
int TickSpeed() const { return m_TickSpeed; }
|
||||
|
||||
|
@ -32,7 +32,7 @@ public:
|
|||
virtual int GetClientInfo(int ClientID, CClientInfo *pInfo) = 0;
|
||||
virtual void GetClientAddr(int ClientID, char *pAddrStr, int Size) = 0;
|
||||
virtual int *LatestInput(int ClientID, int *pSize) = 0;
|
||||
|
||||
|
||||
virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientID) = 0;
|
||||
|
||||
template<class T>
|
||||
|
@ -43,18 +43,18 @@ public:
|
|||
return -1;
|
||||
return SendMsg(&Packer, Flags, ClientID);
|
||||
}
|
||||
|
||||
|
||||
virtual void SetClientName(int ClientID, char const *pName) = 0;
|
||||
virtual void SetClientClan(int ClientID, char const *pClan) = 0;
|
||||
virtual void SetClientCountry(int ClientID, int Country) = 0;
|
||||
virtual void SetClientScore(int ClientID, int Score) = 0;
|
||||
|
||||
|
||||
virtual int SnapNewID() = 0;
|
||||
virtual void SnapFreeID(int ID) = 0;
|
||||
virtual void *SnapNewItem(int Type, int ID, int Size) = 0;
|
||||
|
||||
virtual void SnapSetStaticsize(int ItemType, int Size) = 0;
|
||||
|
||||
|
||||
virtual bool IsAuthed(int ClientID) = 0;
|
||||
virtual void Kick(int ClientID, const char *pReason) = 0;
|
||||
};
|
||||
|
@ -67,12 +67,12 @@ public:
|
|||
virtual void OnInit() = 0;
|
||||
virtual void OnConsoleInit() = 0;
|
||||
virtual void OnShutdown() = 0;
|
||||
|
||||
|
||||
virtual void OnTick() = 0;
|
||||
virtual void OnPreSnap() = 0;
|
||||
virtual void OnSnap(int ClientID) = 0;
|
||||
virtual void OnPostSnap() = 0;
|
||||
|
||||
|
||||
virtual void OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) = 0;
|
||||
|
||||
virtual void OnClientConnected(int ClientID) = 0;
|
||||
|
@ -83,7 +83,7 @@ public:
|
|||
|
||||
virtual bool IsClientReady(int ClientID) = 0;
|
||||
virtual bool IsClientPlayer(int ClientID) = 0;
|
||||
|
||||
|
||||
virtual const char *GameType() = 0;
|
||||
virtual const char *Version() = 0;
|
||||
virtual const char *NetVersion() = 0;
|
||||
|
|
|
@ -41,15 +41,15 @@ void CRegister::RegisterSendFwcheckresponse(NETADDR *pAddr)
|
|||
Packet.m_pData = SERVERBROWSE_FWRESPONSE;
|
||||
m_pNetServer->Send(&Packet);
|
||||
}
|
||||
|
||||
|
||||
void CRegister::RegisterSendHeartbeat(NETADDR Addr)
|
||||
{
|
||||
static unsigned char aData[sizeof(SERVERBROWSE_HEARTBEAT) + 2];
|
||||
unsigned short Port = g_Config.m_SvPort;
|
||||
CNetChunk Packet;
|
||||
|
||||
|
||||
mem_copy(aData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT));
|
||||
|
||||
|
||||
Packet.m_ClientID = -1;
|
||||
Packet.m_Address = Addr;
|
||||
Packet.m_Flags = NETSENDFLAG_CONNLESS;
|
||||
|
@ -118,7 +118,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
else if(m_RegisterState == REGISTERSTATE_UPDATE_ADDRS)
|
||||
{
|
||||
m_RegisterRegisteredServer = -1;
|
||||
|
||||
|
||||
if(!m_pMasterServer->IsRefreshing())
|
||||
{
|
||||
int i;
|
||||
|
@ -137,7 +137,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
m_aMasterserverInfo[i].m_Count = -1;
|
||||
m_aMasterserverInfo[i].m_LastSend = 0;
|
||||
}
|
||||
|
||||
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "fetching server counts");
|
||||
RegisterNewState(REGISTERSTATE_QUERY_COUNT);
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
{
|
||||
if(!m_aMasterserverInfo[i].m_Valid)
|
||||
continue;
|
||||
|
||||
|
||||
if(m_aMasterserverInfo[i].m_Count == -1)
|
||||
{
|
||||
Left++;
|
||||
|
@ -160,7 +160,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// check if we are done or timed out
|
||||
if(Left == 0 || Now > m_RegisterStateStart+Freq*3)
|
||||
{
|
||||
|
@ -171,7 +171,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
{
|
||||
if(!m_aMasterserverInfo[i].m_Valid || m_aMasterserverInfo[i].m_Count == -1)
|
||||
continue;
|
||||
|
||||
|
||||
if(Best == -1 || m_aMasterserverInfo[i].m_Count < m_aMasterserverInfo[Best].m_Count)
|
||||
Best = i;
|
||||
}
|
||||
|
@ -184,7 +184,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
RegisterNewState(REGISTERSTATE_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "chose '%s' as master, sending heartbeats", m_pMasterServer->GetName(m_RegisterRegisteredServer));
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", aBuf);
|
||||
|
@ -201,7 +201,7 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
m_aMasterserverInfo[m_RegisterRegisteredServer].m_LastSend = Now;
|
||||
RegisterSendHeartbeat(m_aMasterserverInfo[m_RegisterRegisteredServer].m_Addr);
|
||||
}
|
||||
|
||||
|
||||
if(Now > m_RegisterStateStart+Freq*60)
|
||||
{
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "WARNING: Master server is not responding, switching master");
|
||||
|
@ -212,9 +212,9 @@ void CRegister::RegisterUpdate(int Nettype)
|
|||
{
|
||||
if(m_RegisterFirst)
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "server registered");
|
||||
|
||||
|
||||
m_RegisterFirst = 0;
|
||||
|
||||
|
||||
// check if we should send new heartbeat again
|
||||
if(Now > m_RegisterStateStart+Freq)
|
||||
{
|
||||
|
@ -253,7 +253,7 @@ int CRegister::RegisterProcessPacket(CNetChunk *pPacket)
|
|||
}
|
||||
if(!Valid)
|
||||
return 0;
|
||||
|
||||
|
||||
if(pPacket->m_DataSize == sizeof(SERVERBROWSE_FWCHECK) &&
|
||||
mem_comp(pPacket->m_pData, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0)
|
||||
{
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "register.h"
|
||||
#include "server.h"
|
||||
|
||||
#if defined(CONF_FAMILY_WINDOWS)
|
||||
#if defined(CONF_FAMILY_WINDOWS)
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
@ -75,7 +75,7 @@ void CSnapIDPool::Reset()
|
|||
m_aIDs[i].m_Next = i+1;
|
||||
m_aIDs[i].m_State = 0;
|
||||
}
|
||||
|
||||
|
||||
m_aIDs[MAX_IDS-1].m_Next = -1;
|
||||
m_FirstFree = 0;
|
||||
m_FirstTimed = -1;
|
||||
|
@ -88,17 +88,17 @@ void CSnapIDPool::Reset()
|
|||
void CSnapIDPool::RemoveFirstTimeout()
|
||||
{
|
||||
int NextTimed = m_aIDs[m_FirstTimed].m_Next;
|
||||
|
||||
|
||||
// add it to the free list
|
||||
m_aIDs[m_FirstTimed].m_Next = m_FirstFree;
|
||||
m_aIDs[m_FirstTimed].m_State = 0;
|
||||
m_FirstFree = m_FirstTimed;
|
||||
|
||||
|
||||
// remove it from the timed list
|
||||
m_FirstTimed = NextTimed;
|
||||
if(m_FirstTimed == -1)
|
||||
m_LastTimed = -1;
|
||||
|
||||
|
||||
m_Usage--;
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ int CSnapIDPool::NewID()
|
|||
// process timed ids
|
||||
while(m_FirstTimed != -1 && m_aIDs[m_FirstTimed].m_Timeout < Now)
|
||||
RemoveFirstTimeout();
|
||||
|
||||
|
||||
int ID = m_FirstFree;
|
||||
dbg_assert(ID != -1, "id error");
|
||||
if(ID == -1)
|
||||
|
@ -138,7 +138,7 @@ void CSnapIDPool::FreeID(int ID)
|
|||
m_aIDs[ID].m_State = 2;
|
||||
m_aIDs[ID].m_Timeout = time_get()+time_freq()*5;
|
||||
m_aIDs[ID].m_Next = -1;
|
||||
|
||||
|
||||
if(m_LastTimed != -1)
|
||||
{
|
||||
m_aIDs[m_LastTimed].m_Next = ID;
|
||||
|
@ -150,7 +150,7 @@ void CSnapIDPool::FreeID(int ID)
|
|||
m_LastTimed = ID;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CServer::CClient::Reset()
|
||||
{
|
||||
// reset input
|
||||
|
@ -169,15 +169,15 @@ void CServer::CClient::Reset()
|
|||
CServer::CServer() : m_DemoRecorder(&m_SnapshotDelta)
|
||||
{
|
||||
m_TickSpeed = SERVER_TICK_SPEED;
|
||||
|
||||
|
||||
m_pGameServer = 0;
|
||||
|
||||
|
||||
m_CurrentGameTick = 0;
|
||||
m_RunServer = 1;
|
||||
|
||||
m_pCurrentMapData = 0;
|
||||
m_CurrentMapSize = 0;
|
||||
|
||||
|
||||
m_MapReload = 0;
|
||||
|
||||
m_RconClientID = -1;
|
||||
|
@ -202,12 +202,12 @@ int CServer::TrySetClientName(int ClientID, const char *pName)
|
|||
str_format(aBuf, sizeof(aBuf), "'%s' -> '%s'", pName, aTrimmedName);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf);
|
||||
pName = aTrimmedName;
|
||||
|
||||
|
||||
|
||||
|
||||
// check for empty names
|
||||
if(!pName[0])
|
||||
return -1;
|
||||
|
||||
|
||||
// make sure that two clients doesn't have the same name
|
||||
for(int i = 0; i < MAX_CLIENTS; i++)
|
||||
if(i != ClientID && m_aClients[i].m_State >= CClient::STATE_READY)
|
||||
|
@ -227,10 +227,10 @@ void CServer::SetClientName(int ClientID, const char *pName)
|
|||
{
|
||||
if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY)
|
||||
return;
|
||||
|
||||
|
||||
if(!pName)
|
||||
return;
|
||||
|
||||
|
||||
char aNameTry[MAX_NAME_LENGTH];
|
||||
str_copy(aNameTry, pName, MAX_NAME_LENGTH);
|
||||
if(TrySetClientName(ClientID, aNameTry))
|
||||
|
@ -249,7 +249,7 @@ void CServer::SetClientClan(int ClientID, const char *pClan)
|
|||
{
|
||||
if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY || !pClan)
|
||||
return;
|
||||
|
||||
|
||||
str_copy(m_aClients[ClientID].m_aClan, pClan, MAX_CLAN_LENGTH);
|
||||
}
|
||||
|
||||
|
@ -257,7 +257,7 @@ void CServer::SetClientCountry(int ClientID, int Country)
|
|||
{
|
||||
if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY)
|
||||
return;
|
||||
|
||||
|
||||
m_aClients[ClientID].m_Country = Country;
|
||||
}
|
||||
|
||||
|
@ -280,7 +280,7 @@ void CServer::Kick(int ClientID, const char *pReason)
|
|||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "you can't kick yourself");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
m_NetServer.Drop(ClientID, pReason);
|
||||
}
|
||||
|
||||
|
@ -343,7 +343,7 @@ void CServer::GetClientAddr(int ClientID, char *pAddrStr, int Size)
|
|||
net_addr_str(&Addr, pAddrStr, Size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int *CServer::LatestInput(int ClientID, int *size)
|
||||
{
|
||||
|
@ -360,7 +360,7 @@ const char *CServer::ClientName(int ClientID)
|
|||
return m_aClients[ClientID].m_aName;
|
||||
else
|
||||
return "(connecting client)";
|
||||
|
||||
|
||||
}
|
||||
|
||||
const char *CServer::ClientClan(int ClientID)
|
||||
|
@ -398,13 +398,13 @@ int CServer::SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System)
|
|||
CNetChunk Packet;
|
||||
if(!pMsg)
|
||||
return -1;
|
||||
|
||||
|
||||
mem_zero(&Packet, sizeof(CNetChunk));
|
||||
|
||||
|
||||
Packet.m_ClientID = ClientID;
|
||||
Packet.m_pData = pMsg->Data();
|
||||
Packet.m_DataSize = pMsg->Size();
|
||||
|
||||
|
||||
// HACK: modify the message id in the packet and store the system flag
|
||||
*((unsigned char*)Packet.m_pData) <<= 1;
|
||||
if(System)
|
||||
|
@ -414,7 +414,7 @@ int CServer::SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System)
|
|||
Packet.m_Flags |= NETSENDFLAG_VITAL;
|
||||
if(Flags&MSGFLAG_FLUSH)
|
||||
Packet.m_Flags |= NETSENDFLAG_FLUSH;
|
||||
|
||||
|
||||
// write message to demo recorder
|
||||
if(!(Flags&MSGFLAG_NORECORD))
|
||||
m_DemoRecorder.RecordMessage(pMsg->Data(), pMsg->Size());
|
||||
|
@ -441,7 +441,7 @@ int CServer::SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System)
|
|||
void CServer::DoSnapshot()
|
||||
{
|
||||
GameServer()->OnPreSnap();
|
||||
|
||||
|
||||
// create snapshot for demo recording
|
||||
if(m_DemoRecorder.IsRecording())
|
||||
{
|
||||
|
@ -452,7 +452,7 @@ void CServer::DoSnapshot()
|
|||
m_SnapshotBuilder.Init();
|
||||
GameServer()->OnSnap(-1);
|
||||
SnapshotSize = m_SnapshotBuilder.Finish(aData);
|
||||
|
||||
|
||||
// write snapshot
|
||||
m_DemoRecorder.RecordSnapshot(Tick(), aData, SnapshotSize);
|
||||
}
|
||||
|
@ -463,15 +463,15 @@ void CServer::DoSnapshot()
|
|||
// client must be ingame to recive snapshots
|
||||
if(m_aClients[i].m_State != CClient::STATE_INGAME)
|
||||
continue;
|
||||
|
||||
|
||||
// this client is trying to recover, don't spam snapshots
|
||||
if(m_aClients[i].m_SnapRate == CClient::SNAPRATE_RECOVER && (Tick()%50) != 0)
|
||||
continue;
|
||||
|
||||
|
||||
// this client is trying to recover, don't spam snapshots
|
||||
if(m_aClients[i].m_SnapRate == CClient::SNAPRATE_INIT && (Tick()%10) != 0)
|
||||
continue;
|
||||
|
||||
|
||||
{
|
||||
char aData[CSnapshot::MAX_SIZE];
|
||||
CSnapshot *pData = (CSnapshot*)aData; // Fix compiler warning for strict-aliasing
|
||||
|
@ -496,13 +496,13 @@ void CServer::DoSnapshot()
|
|||
// remove old snapshos
|
||||
// keep 3 seconds worth of snapshots
|
||||
m_aClients[i].m_Snapshots.PurgeUntil(m_CurrentGameTick-SERVER_TICK_SPEED*3);
|
||||
|
||||
|
||||
// save it the snapshot
|
||||
m_aClients[i].m_Snapshots.Add(m_CurrentGameTick, time_get(), SnapshotSize, pData, 0);
|
||||
|
||||
|
||||
// find snapshot that we can preform delta against
|
||||
EmptySnap.Clear();
|
||||
|
||||
|
||||
{
|
||||
DeltashotSize = m_aClients[i].m_Snapshots.Get(m_aClients[i].m_LastAckedSnapshot, 0, &pDeltashot, 0);
|
||||
if(DeltashotSize >= 0)
|
||||
|
@ -514,10 +514,10 @@ void CServer::DoSnapshot()
|
|||
m_aClients[i].m_SnapRate = CClient::SNAPRATE_RECOVER;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create delta
|
||||
DeltaSize = m_SnapshotDelta.CreateDelta(pDeltashot, pData, aDeltaData);
|
||||
|
||||
|
||||
if(DeltaSize)
|
||||
{
|
||||
// compress it
|
||||
|
@ -527,7 +527,7 @@ void CServer::DoSnapshot()
|
|||
|
||||
SnapshotSize = CVariableInt::Compress(aDeltaData, DeltaSize, aCompData);
|
||||
NumPackets = (SnapshotSize+MaxSize-1)/MaxSize;
|
||||
|
||||
|
||||
for(int n = 0, Left = SnapshotSize; Left; n++)
|
||||
{
|
||||
int Chunk = Left < MaxSize ? Left : MaxSize;
|
||||
|
@ -549,7 +549,7 @@ void CServer::DoSnapshot()
|
|||
Msg.AddInt(m_CurrentGameTick);
|
||||
Msg.AddInt(m_CurrentGameTick-DeltaTick);
|
||||
Msg.AddInt(NumPackets);
|
||||
Msg.AddInt(n);
|
||||
Msg.AddInt(n);
|
||||
Msg.AddInt(Crc);
|
||||
Msg.AddInt(Chunk);
|
||||
Msg.AddRaw(&aCompData[n*MaxSize], Chunk);
|
||||
|
@ -587,7 +587,7 @@ int CServer::NewClientCallback(int ClientID, void *pUser)
|
|||
int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser)
|
||||
{
|
||||
CServer *pThis = (CServer *)pUser;
|
||||
|
||||
|
||||
NETADDR Addr = pThis->m_NetServer.ClientAddr(ClientID);
|
||||
char aAddrStr[NETADDR_MAXSTRSIZE];
|
||||
net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
|
||||
|
@ -598,7 +598,7 @@ int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser)
|
|||
// notify the mod about the drop
|
||||
if(pThis->m_aClients[ClientID].m_State >= CClient::STATE_READY)
|
||||
pThis->GameServer()->OnClientDrop(ClientID, pReason);
|
||||
|
||||
|
||||
pThis->m_aClients[ClientID].m_State = CClient::STATE_EMPTY;
|
||||
pThis->m_aClients[ClientID].m_aName[0] = 0;
|
||||
pThis->m_aClients[ClientID].m_aClan[0] = 0;
|
||||
|
@ -636,16 +636,16 @@ void CServer::SendRconLineAuthed(const char *pLine, void *pUser)
|
|||
CServer *pThis = (CServer *)pUser;
|
||||
static volatile int ReentryGuard = 0;
|
||||
int i;
|
||||
|
||||
|
||||
if(ReentryGuard) return;
|
||||
ReentryGuard++;
|
||||
|
||||
|
||||
for(i = 0; i < MAX_CLIENTS; i++)
|
||||
{
|
||||
if(pThis->m_aClients[i].m_State != CClient::STATE_EMPTY && pThis->m_aClients[i].m_Authed)
|
||||
pThis->SendRconLine(i, pLine);
|
||||
}
|
||||
|
||||
|
||||
ReentryGuard--;
|
||||
}
|
||||
|
||||
|
@ -655,15 +655,15 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
NETADDR Addr;
|
||||
CUnpacker Unpacker;
|
||||
Unpacker.Reset(pPacket->m_pData, pPacket->m_DataSize);
|
||||
|
||||
|
||||
// unpack msgid and system flag
|
||||
int Msg = Unpacker.GetInt();
|
||||
int Sys = Msg&1;
|
||||
Msg >>= 1;
|
||||
|
||||
|
||||
if(Unpacker.Error())
|
||||
return;
|
||||
|
||||
|
||||
if(Sys)
|
||||
{
|
||||
// system message
|
||||
|
@ -680,7 +680,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
m_NetServer.Drop(ClientID, aReason);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const char *pPassword = Unpacker.GetString(CUnpacker::SANITIZE_CC);
|
||||
if(g_Config.m_Password[0] != 0 && str_comp(g_Config.m_Password, pPassword) != 0)
|
||||
{
|
||||
|
@ -688,7 +688,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
m_NetServer.Drop(ClientID, "Wrong password");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
m_aClients[ClientID].m_State = CClient::STATE_CONNECTING;
|
||||
SendMap(ClientID);
|
||||
}
|
||||
|
@ -699,11 +699,11 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
int ChunkSize = 1024-128;
|
||||
int Offset = Chunk * ChunkSize;
|
||||
int Last = 0;
|
||||
|
||||
|
||||
// drop faulty map data requests
|
||||
if(Chunk < 0 || Offset > m_CurrentMapSize)
|
||||
return;
|
||||
|
||||
|
||||
if(Offset+ChunkSize >= m_CurrentMapSize)
|
||||
{
|
||||
ChunkSize = m_CurrentMapSize-Offset;
|
||||
|
@ -711,7 +711,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
ChunkSize = 0;
|
||||
Last = 1;
|
||||
}
|
||||
|
||||
|
||||
CMsgPacker Msg(NETMSG_MAP_DATA);
|
||||
Msg.AddInt(Last);
|
||||
Msg.AddInt(m_CurrentMapCrc);
|
||||
|
@ -719,7 +719,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
Msg.AddInt(ChunkSize);
|
||||
Msg.AddRaw(&m_pCurrentMapData[Offset], ChunkSize);
|
||||
SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID, true);
|
||||
|
||||
|
||||
if(g_Config.m_Debug)
|
||||
{
|
||||
char aBuf[256];
|
||||
|
@ -734,7 +734,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
Addr = m_NetServer.ClientAddr(ClientID);
|
||||
char aAddrStr[NETADDR_MAXSTRSIZE];
|
||||
net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
|
||||
|
||||
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "player is ready. ClientID=%x addr=%s", ClientID, aAddrStr);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf);
|
||||
|
@ -750,7 +750,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
Addr = m_NetServer.ClientAddr(ClientID);
|
||||
char aAddrStr[NETADDR_MAXSTRSIZE];
|
||||
net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
|
||||
|
||||
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "player has entered the game. ClientID=%x addr=%s", ClientID, aAddrStr);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
|
||||
|
@ -762,18 +762,18 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
{
|
||||
CClient::CInput *pInput;
|
||||
int64 TagTime;
|
||||
|
||||
|
||||
m_aClients[ClientID].m_LastAckedSnapshot = Unpacker.GetInt();
|
||||
int IntendedTick = Unpacker.GetInt();
|
||||
int Size = Unpacker.GetInt();
|
||||
|
||||
|
||||
// check for errors
|
||||
if(Unpacker.Error() || Size/4 > MAX_INPUT_SIZE)
|
||||
return;
|
||||
|
||||
if(m_aClients[ClientID].m_LastAckedSnapshot > 0)
|
||||
m_aClients[ClientID].m_SnapRate = CClient::SNAPRATE_FULL;
|
||||
|
||||
|
||||
if(m_aClients[ClientID].m_Snapshots.Get(m_aClients[ClientID].m_LastAckedSnapshot, &TagTime, 0, 0) >= 0)
|
||||
m_aClients[ClientID].m_Latency = (int)(((time_get()-TagTime)*1000)/time_freq());
|
||||
|
||||
|
@ -782,7 +782,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
if(IntendedTick > m_aClients[ClientID].m_LastInputTick)
|
||||
{
|
||||
int TimeLeft = ((TickStartTime(IntendedTick)-time_get())*1000) / time_freq();
|
||||
|
||||
|
||||
CMsgPacker Msg(NETMSG_INPUTTIMING);
|
||||
Msg.AddInt(IntendedTick);
|
||||
Msg.AddInt(TimeLeft);
|
||||
|
@ -792,20 +792,20 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
m_aClients[ClientID].m_LastInputTick = IntendedTick;
|
||||
|
||||
pInput = &m_aClients[ClientID].m_aInputs[m_aClients[ClientID].m_CurrentInput];
|
||||
|
||||
|
||||
if(IntendedTick <= Tick())
|
||||
IntendedTick = Tick()+1;
|
||||
|
||||
pInput->m_GameTick = IntendedTick;
|
||||
|
||||
|
||||
for(int i = 0; i < Size/4; i++)
|
||||
pInput->m_aData[i] = Unpacker.GetInt();
|
||||
|
||||
|
||||
mem_copy(m_aClients[ClientID].m_LatestInput.m_aData, pInput->m_aData, MAX_INPUT_SIZE*sizeof(int));
|
||||
|
||||
|
||||
m_aClients[ClientID].m_CurrentInput++;
|
||||
m_aClients[ClientID].m_CurrentInput %= 200;
|
||||
|
||||
|
||||
// call the mod with the fresh input data
|
||||
if(m_aClients[ClientID].m_State == CClient::STATE_INGAME)
|
||||
GameServer()->OnClientDirectInput(ClientID, m_aClients[ClientID].m_LatestInput.m_aData);
|
||||
|
@ -813,7 +813,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
else if(Msg == NETMSG_RCON_CMD)
|
||||
{
|
||||
const char *pCmd = Unpacker.GetString();
|
||||
|
||||
|
||||
if(Unpacker.Error() == 0 && m_aClients[ClientID].m_Authed)
|
||||
{
|
||||
char aBuf[256];
|
||||
|
@ -829,7 +829,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
const char *pPw;
|
||||
Unpacker.GetString(); // login name, not used
|
||||
pPw = Unpacker.GetString(CUnpacker::SANITIZE_CC);
|
||||
|
||||
|
||||
if(Unpacker.Error() == 0)
|
||||
{
|
||||
if(g_Config.m_SvRconPassword[0] == 0)
|
||||
|
@ -841,7 +841,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS);
|
||||
Msg.AddInt(1);
|
||||
SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true);
|
||||
|
||||
|
||||
m_aClients[ClientID].m_Authed = 1;
|
||||
SendRconLine(ClientID, "Authentication successful. Remote console access granted.");
|
||||
char aBuf[256];
|
||||
|
@ -905,7 +905,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
|
|||
GameServer()->OnMessage(Msg, &Unpacker, ClientID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CServer::SendServerInfo(NETADDR *pAddr, int Token)
|
||||
{
|
||||
CNetChunk Packet;
|
||||
|
@ -920,17 +920,17 @@ void CServer::SendServerInfo(NETADDR *pAddr, int Token)
|
|||
{
|
||||
if(GameServer()->IsClientPlayer(i))
|
||||
PlayerCount++;
|
||||
|
||||
|
||||
ClientCount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
p.Reset();
|
||||
|
||||
p.AddRaw(SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO));
|
||||
str_format(aBuf, sizeof(aBuf), "%d", Token);
|
||||
p.AddString(aBuf, 6);
|
||||
|
||||
|
||||
p.AddString(GameServer()->Version(), 32);
|
||||
p.AddString(g_Config.m_SvName, 64);
|
||||
p.AddString(GetMapName(), 32);
|
||||
|
@ -940,28 +940,28 @@ void CServer::SendServerInfo(NETADDR *pAddr, int Token)
|
|||
|
||||
// flags
|
||||
int i = 0;
|
||||
if(g_Config.m_Password[0]) // password set
|
||||
if(g_Config.m_Password[0]) // password set
|
||||
i |= SERVER_FLAG_PASSWORD;
|
||||
str_format(aBuf, sizeof(aBuf), "%d", i);
|
||||
p.AddString(aBuf, 2);
|
||||
|
||||
str_format(aBuf, sizeof(aBuf), "%d", PlayerCount); p.AddString(aBuf, 3); // num players
|
||||
str_format(aBuf, sizeof(aBuf), "%d", PlayerCount); p.AddString(aBuf, 3); // num players
|
||||
str_format(aBuf, sizeof(aBuf), "%d", m_NetServer.MaxClients()-g_Config.m_SvSpectatorSlots); p.AddString(aBuf, 3); // max players
|
||||
str_format(aBuf, sizeof(aBuf), "%d", ClientCount); p.AddString(aBuf, 3); // num clients
|
||||
str_format(aBuf, sizeof(aBuf), "%d", ClientCount); p.AddString(aBuf, 3); // num clients
|
||||
str_format(aBuf, sizeof(aBuf), "%d", m_NetServer.MaxClients()); p.AddString(aBuf, 3); // max clients
|
||||
|
||||
for(i = 0; i < MAX_CLIENTS; i++)
|
||||
{
|
||||
if(m_aClients[i].m_State != CClient::STATE_EMPTY)
|
||||
{
|
||||
p.AddString(ClientName(i), MAX_NAME_LENGTH); // client name
|
||||
p.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan
|
||||
str_format(aBuf, sizeof(aBuf), "%d", m_aClients[i].m_Country); p.AddString(aBuf, 6); // client country
|
||||
str_format(aBuf, sizeof(aBuf), "%d", m_aClients[i].m_Score); p.AddString(aBuf, 6); // client score
|
||||
str_format(aBuf, sizeof(aBuf), "%d", GameServer()->IsClientPlayer(i)?1:0); p.AddString(aBuf, 2); // is player?
|
||||
p.AddString(ClientName(i), MAX_NAME_LENGTH); // client name
|
||||
p.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan
|
||||
str_format(aBuf, sizeof(aBuf), "%d", m_aClients[i].m_Country); p.AddString(aBuf, 6); // client country
|
||||
str_format(aBuf, sizeof(aBuf), "%d", m_aClients[i].m_Score); p.AddString(aBuf, 6); // client score
|
||||
str_format(aBuf, sizeof(aBuf), "%d", GameServer()->IsClientPlayer(i)?1:0); p.AddString(aBuf, 2); // is player?
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Packet.m_ClientID = -1;
|
||||
Packet.m_Address = *pAddr;
|
||||
Packet.m_Flags = NETSENDFLAG_CONNLESS;
|
||||
|
@ -994,21 +994,21 @@ int CServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
|
|||
str_format(aBuf, sizeof(aBuf), "banned %s for life", aAddrStr);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
|
||||
|
||||
return m_NetServer.BanAdd(Addr, Seconds, pReason);
|
||||
return m_NetServer.BanAdd(Addr, Seconds, pReason);
|
||||
}
|
||||
|
||||
int CServer::BanRemove(NETADDR Addr)
|
||||
{
|
||||
return m_NetServer.BanRemove(Addr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CServer::PumpNetwork()
|
||||
{
|
||||
CNetChunk Packet;
|
||||
|
||||
m_NetServer.Update();
|
||||
|
||||
|
||||
// process packets
|
||||
while(m_NetServer.Recv(&Packet))
|
||||
{
|
||||
|
@ -1046,7 +1046,7 @@ int CServer::LoadMap(const char *pMapName)
|
|||
//DATAFILE *df;
|
||||
char aBuf[512];
|
||||
str_format(aBuf, sizeof(aBuf), "maps/%s.map", pMapName);
|
||||
|
||||
|
||||
/*df = datafile_load(buf);
|
||||
if(!df)
|
||||
return 0;*/
|
||||
|
@ -1057,25 +1057,25 @@ int CServer::LoadMap(const char *pMapName)
|
|||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mapchecker", "invalid standard map");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if(!m_pMap->Load(aBuf))
|
||||
return 0;
|
||||
|
||||
|
||||
// stop recording when we change map
|
||||
m_DemoRecorder.Stop();
|
||||
|
||||
|
||||
// reinit snapshot ids
|
||||
m_IDPool.TimeoutIDs();
|
||||
|
||||
|
||||
// get the crc of the map
|
||||
m_CurrentMapCrc = m_pMap->Crc();
|
||||
char aBufMsg[256];
|
||||
str_format(aBufMsg, sizeof(aBufMsg), "%s crc is %08x", aBuf, m_CurrentMapCrc);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBufMsg);
|
||||
|
||||
|
||||
str_copy(m_aCurrentMap, pMapName, sizeof(m_aCurrentMap));
|
||||
//map_set(df);
|
||||
|
||||
|
||||
// load compelate map into memory for download
|
||||
{
|
||||
IOHANDLE File = Storage()->OpenFile(aBuf, IOFLAG_READ, IStorage::TYPE_ALL);
|
||||
|
@ -1109,7 +1109,7 @@ int CServer::Run()
|
|||
dbg_msg("server", "failed to load map. mapname='%s'", g_Config.m_SvMap);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// start server
|
||||
NETADDR BindAddr;
|
||||
if(g_Config.m_SvBindaddr[0] && net_host_lookup(g_Config.m_SvBindaddr, &BindAddr, NETTYPE_ALL) == 0)
|
||||
|
@ -1123,8 +1123,8 @@ int CServer::Run()
|
|||
BindAddr.type = NETTYPE_ALL;
|
||||
BindAddr.port = g_Config.m_SvPort;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if(!m_NetServer.Open(BindAddr, g_Config.m_SvMaxClients, g_Config.m_SvMaxClientsPerIP, 0))
|
||||
{
|
||||
dbg_msg("server", "couldn't open socket. port might already be in use");
|
||||
|
@ -1132,11 +1132,11 @@ int CServer::Run()
|
|||
}
|
||||
|
||||
m_NetServer.SetCallbacks(NewClientCallback, DelClientCallback, this);
|
||||
|
||||
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "server name is '%s'", g_Config.m_SvName);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
|
||||
|
||||
|
||||
GameServer()->OnInit();
|
||||
str_format(aBuf, sizeof(aBuf), "version %s", GameServer()->NetVersion());
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
|
||||
|
@ -1148,10 +1148,10 @@ int CServer::Run()
|
|||
{
|
||||
int64 ReportTime = time_get();
|
||||
int ReportInterval = 3;
|
||||
|
||||
|
||||
m_Lastheartbeat = 0;
|
||||
m_GameStartTime = time_get();
|
||||
|
||||
|
||||
if(g_Config.m_Debug)
|
||||
{
|
||||
str_format(aBuf, sizeof(aBuf), "baseline memory usage %dk", mem_stats()->allocated/1024);
|
||||
|
@ -1162,28 +1162,28 @@ int CServer::Run()
|
|||
{
|
||||
int64 t = time_get();
|
||||
int NewTicks = 0;
|
||||
|
||||
|
||||
// load new map TODO: don't poll this
|
||||
if(str_comp(g_Config.m_SvMap, m_aCurrentMap) != 0 || m_MapReload)
|
||||
{
|
||||
m_MapReload = 0;
|
||||
|
||||
|
||||
// load map
|
||||
if(LoadMap(g_Config.m_SvMap))
|
||||
{
|
||||
// new map loaded
|
||||
GameServer()->OnShutdown();
|
||||
|
||||
|
||||
for(int c = 0; c < MAX_CLIENTS; c++)
|
||||
{
|
||||
if(m_aClients[c].m_State <= CClient::STATE_AUTH)
|
||||
continue;
|
||||
|
||||
|
||||
SendMap(c);
|
||||
m_aClients[c].Reset();
|
||||
m_aClients[c].m_State = CClient::STATE_CONNECTING;
|
||||
}
|
||||
|
||||
|
||||
m_GameStartTime = time_get();
|
||||
m_CurrentGameTick = 0;
|
||||
Kernel()->ReregisterInterface(GameServer());
|
||||
|
@ -1197,12 +1197,12 @@ int CServer::Run()
|
|||
str_copy(g_Config.m_SvMap, m_aCurrentMap, sizeof(g_Config.m_SvMap));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
while(t > TickStartTime(m_CurrentGameTick+1))
|
||||
{
|
||||
m_CurrentGameTick++;
|
||||
NewTicks++;
|
||||
|
||||
|
||||
// apply new input
|
||||
for(int c = 0; c < MAX_CLIENTS; c++)
|
||||
{
|
||||
|
@ -1221,19 +1221,19 @@ int CServer::Run()
|
|||
|
||||
GameServer()->OnTick();
|
||||
}
|
||||
|
||||
|
||||
// snap game
|
||||
if(NewTicks)
|
||||
{
|
||||
if(g_Config.m_SvHighBandwidth || (m_CurrentGameTick%2) == 0)
|
||||
DoSnapshot();
|
||||
}
|
||||
|
||||
|
||||
// master server stuff
|
||||
m_Register.RegisterUpdate(BindAddr.type);
|
||||
|
||||
|
||||
PumpNetwork();
|
||||
|
||||
|
||||
if(ReportTime < time_get())
|
||||
{
|
||||
if(g_Config.m_Debug)
|
||||
|
@ -1242,23 +1242,23 @@ int CServer::Run()
|
|||
static NETSTATS prev_stats;
|
||||
NETSTATS stats;
|
||||
netserver_stats(net, &stats);
|
||||
|
||||
|
||||
perf_next();
|
||||
|
||||
|
||||
if(config.dbg_pref)
|
||||
perf_dump(&rootscope);
|
||||
|
||||
dbg_msg("server", "send=%8d recv=%8d",
|
||||
(stats.send_bytes - prev_stats.send_bytes)/reportinterval,
|
||||
(stats.recv_bytes - prev_stats.recv_bytes)/reportinterval);
|
||||
|
||||
|
||||
prev_stats = stats;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
ReportTime += time_freq()*ReportInterval;
|
||||
}
|
||||
|
||||
|
||||
// wait for incomming data
|
||||
net_socket_read_wait(m_NetServer.Socket(), 5);
|
||||
}
|
||||
|
@ -1296,14 +1296,14 @@ void CServer::ConBan(IConsole::IResult *pResult, void *pUser)
|
|||
CServer *pServer = (CServer *)pUser;
|
||||
const char *pStr = pResult->GetString(0);
|
||||
int Minutes = 30;
|
||||
const char *pReason = "No reason given";
|
||||
|
||||
const char *pReason = "No reason given";
|
||||
|
||||
if(pResult->NumArguments() > 1)
|
||||
Minutes = pResult->GetInteger(1);
|
||||
|
||||
|
||||
if(pResult->NumArguments() > 2)
|
||||
pReason = pResult->GetString(2);
|
||||
|
||||
|
||||
if(net_addr_from_str(&Addr, pStr) == 0)
|
||||
{
|
||||
if(pServer->m_RconClientID >= 0 && pServer->m_RconClientID < MAX_CLIENTS && pServer->m_aClients[pServer->m_RconClientID].m_State != CClient::STATE_EMPTY)
|
||||
|
@ -1348,7 +1348,7 @@ void CServer::ConUnban(IConsole::IResult *pResult, void *pUser)
|
|||
NETADDR Addr;
|
||||
CServer *pServer = (CServer *)pUser;
|
||||
const char *pStr = pResult->GetString(0);
|
||||
|
||||
|
||||
if(net_addr_from_str(&Addr, pStr) == 0 && !pServer->BanRemove(Addr))
|
||||
{
|
||||
char aAddrStr[NETADDR_MAXSTRSIZE];
|
||||
|
@ -1384,7 +1384,7 @@ void CServer::ConBans(IConsole::IResult *pResult, void *pUser)
|
|||
char aBuf[1024];
|
||||
char aAddrStr[NETADDR_MAXSTRSIZE];
|
||||
CServer* pServer = (CServer *)pUser;
|
||||
|
||||
|
||||
int Num = pServer->m_NetServer.BanNum();
|
||||
for(int i = 0; i < Num; i++)
|
||||
{
|
||||
|
@ -1392,7 +1392,7 @@ void CServer::ConBans(IConsole::IResult *pResult, void *pUser)
|
|||
pServer->m_NetServer.BanGet(i, &Info);
|
||||
NETADDR Addr = Info.m_Addr;
|
||||
net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
|
||||
|
||||
|
||||
if(Info.m_Expires == -1)
|
||||
{
|
||||
str_format(aBuf, sizeof(aBuf), "#%i %s for life", i, aAddrStr);
|
||||
|
@ -1480,7 +1480,7 @@ void CServer::ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pU
|
|||
void CServer::RegisterCommands()
|
||||
{
|
||||
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
||||
|
||||
|
||||
Console()->Register("kick", "i?r", CFGFLAG_SERVER, ConKick, this, "");
|
||||
Console()->Register("ban", "s?ir", CFGFLAG_SERVER|CFGFLAG_STORE, ConBan, this, "");
|
||||
Console()->Register("unban", "s", CFGFLAG_SERVER|CFGFLAG_STORE, ConUnban, this, "");
|
||||
|
@ -1490,14 +1490,14 @@ void CServer::RegisterCommands()
|
|||
|
||||
Console()->Register("record", "?s", CFGFLAG_SERVER|CFGFLAG_STORE, ConRecord, this, "");
|
||||
Console()->Register("stoprecord", "", CFGFLAG_SERVER, ConStopRecord, this, "");
|
||||
|
||||
|
||||
Console()->Register("reload", "", CFGFLAG_SERVER, ConMapReload, this, "");
|
||||
|
||||
Console()->Chain("sv_name", ConchainSpecialInfoupdate, this);
|
||||
Console()->Chain("password", ConchainSpecialInfoupdate, this);
|
||||
|
||||
Console()->Chain("sv_max_clients_per_ip", ConchainMaxclientsperipUpdate, this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int CServer::SnapNewID()
|
||||
|
@ -1515,7 +1515,7 @@ void *CServer::SnapNewItem(int Type, int ID, int Size)
|
|||
{
|
||||
dbg_assert(Type >= 0 && Type <=0xffff, "incorrect type");
|
||||
dbg_assert(ID >= 0 && ID <=0xffff, "incorrect id");
|
||||
return ID < 0 ? 0 : m_SnapshotBuilder.NewItem(Type, ID, Size);
|
||||
return ID < 0 ? 0 : m_SnapshotBuilder.NewItem(Type, ID, Size);
|
||||
}
|
||||
|
||||
void CServer::SnapSetStaticsize(int ItemType, int Size)
|
||||
|
@ -1549,7 +1549,7 @@ int main(int argc, const char **argv) // ignore_convention
|
|||
IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer();
|
||||
IStorage *pStorage = CreateStorage("Teeworlds", argc, argv); // ignore_convention
|
||||
IConfig *pConfig = CreateConfig();
|
||||
|
||||
|
||||
pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole);
|
||||
|
||||
{
|
||||
|
@ -1565,20 +1565,20 @@ int main(int argc, const char **argv) // ignore_convention
|
|||
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig);
|
||||
RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IEngineMasterServer*>(pEngineMasterServer)); // register as both
|
||||
RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IMasterServer*>(pEngineMasterServer));
|
||||
|
||||
|
||||
if(RegisterFail)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
pEngine->Init();
|
||||
pConfig->Init();
|
||||
pEngineMasterServer->Init();
|
||||
pEngineMasterServer->Load();
|
||||
|
||||
|
||||
// register all console commands
|
||||
pServer->RegisterCommands();
|
||||
pGameServer->OnConsoleInit();
|
||||
|
||||
|
||||
// execute autoexec file
|
||||
pConsole->ExecuteFile("autoexec.cfg");
|
||||
|
||||
|
@ -1588,13 +1588,13 @@ int main(int argc, const char **argv) // ignore_convention
|
|||
|
||||
// restore empty config strings to their defaults
|
||||
pConfig->RestoreStrings();
|
||||
|
||||
|
||||
pEngine->InitLogfile();
|
||||
|
||||
// run the server
|
||||
dbg_msg("server", "starting...");
|
||||
pServer->Run();
|
||||
|
||||
|
||||
// free
|
||||
delete pServer;
|
||||
delete pKernel;
|
||||
|
|
|
@ -21,17 +21,17 @@ class CSnapIDPool
|
|||
};
|
||||
|
||||
CID m_aIDs[MAX_IDS];
|
||||
|
||||
|
||||
int m_FirstFree;
|
||||
int m_FirstTimed;
|
||||
int m_LastTimed;
|
||||
int m_Usage;
|
||||
int m_InUsage;
|
||||
|
||||
public:
|
||||
|
||||
public:
|
||||
|
||||
CSnapIDPool();
|
||||
|
||||
|
||||
void Reset();
|
||||
void RemoveFirstTimeout();
|
||||
int NewID();
|
||||
|
@ -52,7 +52,7 @@ public:
|
|||
class CClient
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
STATE_EMPTY = 0,
|
||||
|
@ -60,49 +60,49 @@ public:
|
|||
STATE_CONNECTING,
|
||||
STATE_READY,
|
||||
STATE_INGAME,
|
||||
|
||||
|
||||
SNAPRATE_INIT=0,
|
||||
SNAPRATE_FULL,
|
||||
SNAPRATE_RECOVER
|
||||
};
|
||||
|
||||
|
||||
class CInput
|
||||
{
|
||||
public:
|
||||
int m_aData[MAX_INPUT_SIZE];
|
||||
int m_GameTick; // the tick that was chosen for the input
|
||||
};
|
||||
|
||||
|
||||
// connection state info
|
||||
int m_State;
|
||||
int m_Latency;
|
||||
int m_SnapRate;
|
||||
|
||||
|
||||
int m_LastAckedSnapshot;
|
||||
int m_LastInputTick;
|
||||
CSnapshotStorage m_Snapshots;
|
||||
|
||||
|
||||
CInput m_LatestInput;
|
||||
CInput m_aInputs[200]; // TODO: handle input better
|
||||
int m_CurrentInput;
|
||||
|
||||
|
||||
char m_aName[MAX_NAME_LENGTH];
|
||||
char m_aClan[MAX_CLAN_LENGTH];
|
||||
int m_Country;
|
||||
int m_Score;
|
||||
int m_Authed;
|
||||
int m_AuthTries;
|
||||
|
||||
|
||||
void Reset();
|
||||
};
|
||||
|
||||
|
||||
CClient m_aClients[MAX_CLIENTS];
|
||||
|
||||
CSnapshotDelta m_SnapshotDelta;
|
||||
CSnapshotBuilder m_SnapshotBuilder;
|
||||
CSnapIDPool m_IDPool;
|
||||
CNetServer m_NetServer;
|
||||
|
||||
|
||||
IEngineMap *m_pMap;
|
||||
|
||||
int64 m_GameStartTime;
|
||||
|
@ -117,14 +117,14 @@ public:
|
|||
char m_aCurrentMap[64];
|
||||
unsigned m_CurrentMapCrc;
|
||||
unsigned char *m_pCurrentMapData;
|
||||
int m_CurrentMapSize;
|
||||
|
||||
int m_CurrentMapSize;
|
||||
|
||||
CDemoRecorder m_DemoRecorder;
|
||||
CRegister m_Register;
|
||||
CMapChecker m_MapChecker;
|
||||
|
||||
|
||||
CServer();
|
||||
|
||||
|
||||
int TrySetClientName(int ClientID, const char *pName);
|
||||
|
||||
virtual void SetClientName(int ClientID, const char *pName);
|
||||
|
@ -162,15 +162,15 @@ public:
|
|||
void SendConnectionReady(int ClientID);
|
||||
void SendRconLine(int ClientID, const char *pLine);
|
||||
static void SendRconLineAuthed(const char *pLine, void *pUser);
|
||||
|
||||
|
||||
void ProcessClientPacket(CNetChunk *pPacket);
|
||||
|
||||
|
||||
void SendServerInfo(NETADDR *pAddr, int Token);
|
||||
void UpdateServerInfo();
|
||||
|
||||
int BanAdd(NETADDR Addr, int Seconds, const char *pReason);
|
||||
int BanRemove(NETADDR Addr);
|
||||
|
||||
|
||||
|
||||
void PumpNetwork();
|
||||
|
||||
|
@ -193,8 +193,8 @@ public:
|
|||
static void ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
|
||||
void RegisterCommands();
|
||||
|
||||
|
||||
|
||||
|
||||
virtual int SnapNewID();
|
||||
virtual void SnapFreeID(int ID);
|
||||
virtual void *SnapNewItem(int Type, int ID, int Size);
|
||||
|
|
|
@ -28,11 +28,11 @@ public:
|
|||
|
||||
int m_SortedIndex;
|
||||
int m_ServerIndex;
|
||||
|
||||
|
||||
NETADDR m_NetAddr;
|
||||
|
||||
|
||||
int m_QuickSearchHit;
|
||||
|
||||
|
||||
int m_MaxClients;
|
||||
int m_NumClients;
|
||||
int m_MaxPlayers;
|
||||
|
@ -66,11 +66,11 @@ public:
|
|||
SORT_MAP,
|
||||
SORT_GAMETYPE,
|
||||
SORT_NUMPLAYERS,
|
||||
|
||||
|
||||
QUICK_SERVERNAME=1,
|
||||
QUICK_PLAYER=2,
|
||||
QUICK_MAPNAME=4,
|
||||
|
||||
|
||||
TYPE_INTERNET = 0,
|
||||
TYPE_LAN = 1,
|
||||
TYPE_FAVORITES = 2,
|
||||
|
@ -84,12 +84,12 @@ public:
|
|||
virtual bool IsRefreshing() const = 0;
|
||||
virtual bool IsRefreshingMasters() const = 0;
|
||||
virtual int LoadingProgression() const = 0;
|
||||
|
||||
|
||||
virtual int NumServers() const = 0;
|
||||
|
||||
|
||||
virtual int NumSortedServers() const = 0;
|
||||
virtual const CServerInfo *SortedGet(int Index) const = 0;
|
||||
|
||||
|
||||
virtual bool IsFavorite(const NETADDR &Addr) const = 0;
|
||||
virtual void AddFavorite(const NETADDR &Addr) = 0;
|
||||
virtual void RemoveFavorite(const NETADDR &Addr) = 0;
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
|
||||
#include "compression.h"
|
||||
|
||||
// Format: ESDDDDDD EDDDDDDD EDD... Extended, Data, Sign
|
||||
unsigned char *CVariableInt::Pack(unsigned char *pDst, int i)
|
||||
{
|
||||
// Format: ESDDDDDD EDDDDDDD EDD... Extended, Data, Sign
|
||||
unsigned char *CVariableInt::Pack(unsigned char *pDst, int i)
|
||||
{
|
||||
*pDst = (i>>25)&0x40; // set sign bit if i<0
|
||||
i = i^(i>>31); // if(i<0) i = ~i
|
||||
|
||||
|
@ -27,16 +27,16 @@ unsigned char *CVariableInt::Pack(unsigned char *pDst, int i)
|
|||
}
|
||||
|
||||
pDst++;
|
||||
return pDst;
|
||||
}
|
||||
|
||||
return pDst;
|
||||
}
|
||||
|
||||
const unsigned char *CVariableInt::Unpack(const unsigned char *pSrc, int *pInOut)
|
||||
{
|
||||
int Sign = (*pSrc>>6)&1;
|
||||
*pInOut = *pSrc&0x3F;
|
||||
{
|
||||
int Sign = (*pSrc>>6)&1;
|
||||
*pInOut = *pSrc&0x3F;
|
||||
|
||||
do
|
||||
{
|
||||
{
|
||||
if(!(*pSrc&0x80)) break;
|
||||
pSrc++;
|
||||
*pInOut |= (*pSrc&(0x7F))<<(6);
|
||||
|
@ -56,8 +56,8 @@ const unsigned char *CVariableInt::Unpack(const unsigned char *pSrc, int *pInOut
|
|||
|
||||
pSrc++;
|
||||
*pInOut ^= -Sign; // if(sign) *i = ~(*i)
|
||||
return pSrc;
|
||||
}
|
||||
return pSrc;
|
||||
}
|
||||
|
||||
|
||||
long CVariableInt::Decompress(const void *pSrc_, int Size, void *pDst_)
|
||||
|
|
|
@ -10,21 +10,21 @@ class CConfig : public IConfig
|
|||
{
|
||||
IStorage *m_pStorage;
|
||||
IOHANDLE m_ConfigFile;
|
||||
|
||||
|
||||
struct CCallback
|
||||
{
|
||||
SAVECALLBACKFUNC m_pfnFunc;
|
||||
void *m_pUserData;
|
||||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_CALLBACKS = 16
|
||||
};
|
||||
|
||||
|
||||
CCallback m_aCallbacks[MAX_CALLBACKS];
|
||||
int m_NumCallbacks;
|
||||
|
||||
|
||||
void EscapeParam(char *pDst, const char *pSrc, int size)
|
||||
{
|
||||
for(int i = 0; *pSrc && i < size - 1; ++i)
|
||||
|
@ -43,22 +43,22 @@ public:
|
|||
m_ConfigFile = 0;
|
||||
m_NumCallbacks = 0;
|
||||
}
|
||||
|
||||
|
||||
virtual void Init()
|
||||
{
|
||||
m_pStorage = Kernel()->RequestInterface<IStorage>();
|
||||
Reset();
|
||||
}
|
||||
|
||||
|
||||
virtual void Reset()
|
||||
{
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) g_Config.m_##Name = def;
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) str_copy(g_Config.m_##Name, def, len);
|
||||
|
||||
#include "config_variables.h"
|
||||
#include "config_variables.h"
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
|
||||
virtual void RestoreStrings()
|
||||
|
@ -71,34 +71,34 @@ public:
|
|||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
|
||||
|
||||
virtual void Save()
|
||||
{
|
||||
if(!m_pStorage)
|
||||
return;
|
||||
m_ConfigFile = m_pStorage->OpenFile("settings.cfg", IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
||||
|
||||
|
||||
if(!m_ConfigFile)
|
||||
return;
|
||||
|
||||
|
||||
char aLineBuf[1024*2];
|
||||
char aEscapeBuf[1024*2];
|
||||
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) if((flags)&CFGFLAG_SAVE){ str_format(aLineBuf, sizeof(aLineBuf), "%s %i", #ScriptName, g_Config.m_##Name); WriteLine(aLineBuf); }
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if((flags)&CFGFLAG_SAVE){ EscapeParam(aEscapeBuf, g_Config.m_##Name, sizeof(aEscapeBuf)); str_format(aLineBuf, sizeof(aLineBuf), "%s \"%s\"", #ScriptName, aEscapeBuf); WriteLine(aLineBuf); }
|
||||
|
||||
#include "config_variables.h"
|
||||
#include "config_variables.h"
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
|
||||
for(int i = 0; i < m_NumCallbacks; i++)
|
||||
m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData);
|
||||
|
||||
|
||||
io_close(m_ConfigFile);
|
||||
m_ConfigFile = 0;
|
||||
}
|
||||
|
||||
|
||||
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData)
|
||||
{
|
||||
dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks");
|
||||
|
@ -106,7 +106,7 @@ public:
|
|||
m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData;
|
||||
m_NumCallbacks++;
|
||||
}
|
||||
|
||||
|
||||
virtual void WriteLine(const char *pLine)
|
||||
{
|
||||
if(!m_ConfigFile)
|
||||
|
@ -117,7 +117,7 @@ public:
|
|||
static const char Newline[] = "\n";
|
||||
#endif
|
||||
io_write(m_ConfigFile, pLine, str_length(pLine));
|
||||
io_write(m_ConfigFile, Newline, sizeof(Newline)-1);
|
||||
io_write(m_ConfigFile, Newline, sizeof(Newline)-1);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -4,12 +4,12 @@
|
|||
#define ENGINE_SHARED_CONFIG_H
|
||||
|
||||
struct CConfiguration
|
||||
{
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Save,Desc) int m_##Name;
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,Len,Def,Save,Desc) char m_##Name[Len]; // Flawfinder: ignore
|
||||
#include "config_variables.h"
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
{
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Save,Desc) int m_##Name;
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,Len,Def,Save,Desc) char m_##Name[Len]; // Flawfinder: ignore
|
||||
#include "config_variables.h"
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
};
|
||||
|
||||
extern CConfiguration g_Config;
|
||||
|
|
|
@ -56,7 +56,7 @@ MACRO_CONFIG_INT(SndNonactiveMute, snd_nonactive_mute, 0, 0, 1, CFGFLAG_SAVE|CFG
|
|||
MACRO_CONFIG_INT(GfxScreenWidth, gfx_screen_width, 800, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Screen resolution width")
|
||||
MACRO_CONFIG_INT(GfxScreenHeight, gfx_screen_height, 600, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Screen resolution height")
|
||||
MACRO_CONFIG_INT(GfxFullscreen, gfx_fullscreen, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Fullscreen")
|
||||
MACRO_CONFIG_INT(GfxAlphabits, gfx_alphabits, 0, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Alpha bits for framebuffer (fullscreen only)")
|
||||
MACRO_CONFIG_INT(GfxAlphabits, gfx_alphabits, 0, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Alpha bits for framebuffer (fullscreen only)")
|
||||
MACRO_CONFIG_INT(GfxColorDepth, gfx_color_depth, 24, 16, 24, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Colors bits for framebuffer (fullscreen only)")
|
||||
MACRO_CONFIG_INT(GfxClear, gfx_clear, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Clear screen before rendering")
|
||||
MACRO_CONFIG_INT(GfxVsync, gfx_vsync, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Vertical sync")
|
||||
|
|
|
@ -38,21 +38,21 @@ int CConsole::ParseStart(CResult *pResult, const char *pString, int Length)
|
|||
int Len = sizeof(pResult->m_aStringStorage);
|
||||
if(Length < Len)
|
||||
Len = Length;
|
||||
|
||||
|
||||
str_copy(pResult->m_aStringStorage, pString, Length);
|
||||
pStr = pResult->m_aStringStorage;
|
||||
|
||||
|
||||
// get command
|
||||
pStr = str_skip_whitespaces(pStr);
|
||||
pResult->m_pCommand = pStr;
|
||||
pStr = str_skip_to_whitespace(pStr);
|
||||
|
||||
|
||||
if(*pStr)
|
||||
{
|
||||
pStr[0] = 0;
|
||||
pStr++;
|
||||
}
|
||||
|
||||
|
||||
pResult->m_pArgsStart = pStr;
|
||||
return 0;
|
||||
}
|
||||
|
@ -63,38 +63,38 @@ int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
|
|||
char *pStr;
|
||||
int Optional = 0;
|
||||
int Error = 0;
|
||||
|
||||
|
||||
pStr = pResult->m_pArgsStart;
|
||||
|
||||
while(1)
|
||||
while(1)
|
||||
{
|
||||
// fetch command
|
||||
Command = *pFormat;
|
||||
pFormat++;
|
||||
|
||||
|
||||
if(!Command)
|
||||
break;
|
||||
|
||||
|
||||
if(Command == '?')
|
||||
Optional = 1;
|
||||
else
|
||||
{
|
||||
pStr = str_skip_whitespaces(pStr);
|
||||
|
||||
|
||||
if(!(*pStr)) // error, non optional command needs value
|
||||
{
|
||||
if(!Optional)
|
||||
Error = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// add token
|
||||
if(*pStr == '"')
|
||||
{
|
||||
char *pDst;
|
||||
pStr++;
|
||||
pResult->AddArgument(pStr);
|
||||
|
||||
|
||||
pDst = pStr; // we might have to process escape data
|
||||
while(1)
|
||||
{
|
||||
|
@ -109,22 +109,22 @@ int CConsole::ParseArgs(CResult *pResult, const char *pFormat)
|
|||
}
|
||||
else if(pStr[0] == 0)
|
||||
return 1; // return error
|
||||
|
||||
|
||||
*pDst = *pStr;
|
||||
pDst++;
|
||||
pStr++;
|
||||
}
|
||||
|
||||
|
||||
// write null termination
|
||||
*pDst = 0;
|
||||
|
||||
|
||||
|
||||
pStr++;
|
||||
}
|
||||
else
|
||||
{
|
||||
pResult->AddArgument(pStr);
|
||||
|
||||
|
||||
if(Command == 'r') // rest of the string
|
||||
break;
|
||||
else if(Command == 'i') // validate int
|
||||
|
@ -167,14 +167,14 @@ bool CConsole::LineIsValid(const char *pStr)
|
|||
{
|
||||
if(!pStr || *pStr == 0)
|
||||
return false;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
CResult Result;
|
||||
const char *pEnd = pStr;
|
||||
const char *pNextPart = 0;
|
||||
int InString = 0;
|
||||
|
||||
|
||||
while(*pEnd)
|
||||
{
|
||||
if(*pEnd == '"')
|
||||
|
@ -186,25 +186,25 @@ bool CConsole::LineIsValid(const char *pStr)
|
|||
}
|
||||
else if(!InString)
|
||||
{
|
||||
if(*pEnd == ';') // command separator
|
||||
if(*pEnd == ';') // command separator
|
||||
{
|
||||
pNextPart = pEnd+1;
|
||||
break;
|
||||
}
|
||||
else if(*pEnd == '#') // comment, no need to do anything more
|
||||
else if(*pEnd == '#') // comment, no need to do anything more
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
pEnd++;
|
||||
}
|
||||
|
||||
|
||||
if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0)
|
||||
return false;
|
||||
|
||||
CCommand *pCommand = FindCommand(Result.m_pCommand, m_FlagMask);
|
||||
if(!pCommand || ParseArgs(&Result, pCommand->m_pParams))
|
||||
return false;
|
||||
|
||||
|
||||
pStr = pNextPart;
|
||||
}
|
||||
while(pStr && *pStr);
|
||||
|
@ -213,14 +213,14 @@ bool CConsole::LineIsValid(const char *pStr)
|
|||
}
|
||||
|
||||
void CConsole::ExecuteLineStroked(int Stroke, const char *pStr)
|
||||
{
|
||||
{
|
||||
while(pStr && *pStr)
|
||||
{
|
||||
CResult Result;
|
||||
const char *pEnd = pStr;
|
||||
const char *pNextPart = 0;
|
||||
int InString = 0;
|
||||
|
||||
|
||||
while(*pEnd)
|
||||
{
|
||||
if(*pEnd == '"')
|
||||
|
@ -232,18 +232,18 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr)
|
|||
}
|
||||
else if(!InString)
|
||||
{
|
||||
if(*pEnd == ';') // command separator
|
||||
if(*pEnd == ';') // command separator
|
||||
{
|
||||
pNextPart = pEnd+1;
|
||||
break;
|
||||
}
|
||||
else if(*pEnd == '#') // comment, no need to do anything more
|
||||
else if(*pEnd == '#') // comment, no need to do anything more
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
pEnd++;
|
||||
}
|
||||
|
||||
|
||||
if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0)
|
||||
return;
|
||||
|
||||
|
@ -258,7 +258,7 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr)
|
|||
Result.AddArgument(m_paStrokeStr[Stroke]);
|
||||
IsStrokeCommand = 1;
|
||||
}
|
||||
|
||||
|
||||
if(Stroke || IsStrokeCommand)
|
||||
{
|
||||
if(ParseArgs(&Result, pCommand->m_pParams))
|
||||
|
@ -284,7 +284,7 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr)
|
|||
str_format(aBuf, sizeof(aBuf), "No such command: %s.", Result.m_pCommand);
|
||||
Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf);
|
||||
}
|
||||
|
||||
|
||||
pStr = pNextPart;
|
||||
}
|
||||
}
|
||||
|
@ -299,7 +299,7 @@ void CConsole::PossibleCommands(const char *pStr, int FlagMask, FPossibleCallbac
|
|||
if(str_find_nocase(pCommand->m_pName, pStr))
|
||||
pfnCallback(pCommand->m_pName, pUser);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CConsole::CCommand *CConsole::FindCommand(const char *pName, int FlagMask)
|
||||
|
@ -312,8 +312,8 @@ CConsole::CCommand *CConsole::FindCommand(const char *pName, int FlagMask)
|
|||
if(str_comp_nocase(pCommand->m_pName, pName) == 0)
|
||||
return pCommand;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
|
@ -335,7 +335,7 @@ void CConsole::ExecuteFile(const char *pFilename)
|
|||
m_pStorage = Kernel()->RequestInterface<IStorage>();
|
||||
if(!m_pStorage)
|
||||
return;
|
||||
|
||||
|
||||
// push this one to the stack
|
||||
CExecFile ThisFile;
|
||||
CExecFile *pPrev = m_pFirstExec;
|
||||
|
@ -345,13 +345,13 @@ void CConsole::ExecuteFile(const char *pFilename)
|
|||
|
||||
// exec the file
|
||||
IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL);
|
||||
|
||||
|
||||
char aBuf[256];
|
||||
if(File)
|
||||
{
|
||||
char *pLine;
|
||||
CLineReader lr;
|
||||
|
||||
|
||||
str_format(aBuf, sizeof(aBuf), "executing '%s'", pFilename);
|
||||
Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf);
|
||||
lr.Init(File);
|
||||
|
@ -366,7 +366,7 @@ void CConsole::ExecuteFile(const char *pFilename)
|
|||
str_format(aBuf, sizeof(aBuf), "failed to open '%s'", pFilename);
|
||||
Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf);
|
||||
}
|
||||
|
||||
|
||||
m_pFirstExec = pPrev;
|
||||
}
|
||||
|
||||
|
@ -402,7 +402,7 @@ static void IntVariableCommand(IConsole::IResult *pResult, void *pUserData)
|
|||
if(pResult->NumArguments())
|
||||
{
|
||||
int Val = pResult->GetInteger(0);
|
||||
|
||||
|
||||
// do clamping
|
||||
if(pData->m_Min != pData->m_Max)
|
||||
{
|
||||
|
@ -468,30 +468,30 @@ CConsole::CConsole(int FlagMask)
|
|||
m_pFirstExec = 0;
|
||||
m_pPrintCallbackUserdata = 0;
|
||||
m_pfnPrintCallback = 0;
|
||||
|
||||
|
||||
m_pStorage = 0;
|
||||
|
||||
|
||||
// register some basic commands
|
||||
Register("echo", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_Echo, this, "Echo the text");
|
||||
Register("exec", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_Exec, this, "Execute the specified file");
|
||||
|
||||
|
||||
// TODO: this should disappear
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Flags,Desc) \
|
||||
{ \
|
||||
static CIntVariableData Data = { this, &g_Config.m_##Name, Min, Max }; \
|
||||
Register(#ScriptName, "?i", Flags, IntVariableCommand, &Data, Desc); \
|
||||
}
|
||||
|
||||
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,Len,Def,Flags,Desc) \
|
||||
{ \
|
||||
static CStrVariableData Data = { this, g_Config.m_##Name, Len }; \
|
||||
Register(#ScriptName, "?r", Flags, StrVariableCommand, &Data, Desc); \
|
||||
}
|
||||
|
||||
#include "config_variables.h"
|
||||
#include "config_variables.h"
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
|
||||
void CConsole::ParseArguments(int NumArgs, const char **ppArguments)
|
||||
|
@ -518,7 +518,7 @@ void CConsole::ParseArguments(int NumArgs, const char **ppArguments)
|
|||
}
|
||||
}
|
||||
|
||||
void CConsole::Register(const char *pName, const char *pParams,
|
||||
void CConsole::Register(const char *pName, const char *pParams,
|
||||
int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp)
|
||||
{
|
||||
CCommand *pCommand = (CCommand *)mem_alloc(sizeof(CCommand), sizeof(void*));
|
||||
|
@ -528,8 +528,8 @@ void CConsole::Register(const char *pName, const char *pParams,
|
|||
pCommand->m_pName = pName;
|
||||
pCommand->m_pParams = pParams;
|
||||
pCommand->m_Flags = Flags;
|
||||
|
||||
|
||||
|
||||
|
||||
pCommand->m_pNext = m_pFirstCommand;
|
||||
m_pFirstCommand = pCommand;
|
||||
}
|
||||
|
@ -543,7 +543,7 @@ void CConsole::Con_Chain(IResult *pResult, void *pUserData)
|
|||
void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser)
|
||||
{
|
||||
CCommand *pCommand = FindCommand(pName, m_FlagMask);
|
||||
|
||||
|
||||
if(!pCommand)
|
||||
{
|
||||
char aBuf[256];
|
||||
|
@ -551,7 +551,7 @@ void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void
|
|||
Print(IConsole::OUTPUT_LEVEL_DEBUG, "console", aBuf);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
CChain *pChainInfo = (CChain *)mem_alloc(sizeof(CChain), sizeof(void*));
|
||||
|
||||
// store info
|
||||
|
@ -559,7 +559,7 @@ void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void
|
|||
pChainInfo->m_pUserData = pUser;
|
||||
pChainInfo->m_pfnCallback = pCommand->m_pfnCallback;
|
||||
pChainInfo->m_pCallbackUserData = pCommand->m_pUserData;
|
||||
|
||||
|
||||
// chain
|
||||
pCommand->m_pfnCallback = Con_Chain;
|
||||
pCommand->m_pUserData = pChainInfo;
|
||||
|
|
|
@ -16,7 +16,7 @@ class CConsole : public IConsole
|
|||
FCommandCallback m_pfnCallback;
|
||||
void *m_pUserData;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class CChain
|
||||
{
|
||||
|
@ -25,8 +25,8 @@ class CConsole : public IConsole
|
|||
FCommandCallback m_pfnCallback;
|
||||
void *m_pCallbackUserData;
|
||||
void *m_pUserData;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
int m_FlagMask;
|
||||
bool m_StoreCommands;
|
||||
const char *m_paStrokeStr[2];
|
||||
|
@ -38,7 +38,7 @@ class CConsole : public IConsole
|
|||
const char *m_pFilename;
|
||||
struct CExecFile *m_pPrev;
|
||||
};
|
||||
|
||||
|
||||
CExecFile *m_pFirstExec;
|
||||
class IStorage *m_pStorage;
|
||||
|
||||
|
@ -48,22 +48,22 @@ class CConsole : public IConsole
|
|||
|
||||
void ExecuteFileRecurse(const char *pFilename);
|
||||
void ExecuteLineStroked(int Stroke, const char *pStr);
|
||||
|
||||
|
||||
FPrintCallback m_pfnPrintCallback;
|
||||
void *m_pPrintCallbackUserdata;
|
||||
|
||||
enum
|
||||
{
|
||||
CONSOLE_MAX_STR_LENGTH = 1024,
|
||||
CONSOLE_MAX_STR_LENGTH = 1024,
|
||||
MAX_PARTS = (CONSOLE_MAX_STR_LENGTH+1)/2
|
||||
};
|
||||
|
||||
|
||||
class CResult : public IResult
|
||||
{
|
||||
public:
|
||||
char m_aStringStorage[CONSOLE_MAX_STR_LENGTH+1];
|
||||
char *m_pArgsStart;
|
||||
|
||||
|
||||
const char *m_pCommand;
|
||||
const char *m_apArgs[MAX_PARTS];
|
||||
|
||||
|
@ -89,7 +89,7 @@ class CConsole : public IConsole
|
|||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
void AddArgument(const char *pArg)
|
||||
{
|
||||
m_apArgs[m_NumArgs++] = pArg;
|
||||
|
@ -99,7 +99,7 @@ class CConsole : public IConsole
|
|||
virtual int GetInteger(unsigned Index);
|
||||
virtual float GetFloat(unsigned Index);
|
||||
};
|
||||
|
||||
|
||||
int ParseStart(CResult *pResult, const char *pString, int Length);
|
||||
int ParseArgs(CResult *pResult, const char *pFormat);
|
||||
|
||||
|
@ -146,7 +146,7 @@ public:
|
|||
virtual void Register(const char *pName, const char *pParams, int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp);
|
||||
virtual void Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser);
|
||||
virtual void StoreCommands(bool Store);
|
||||
|
||||
|
||||
virtual bool LineIsValid(const char *pStr);
|
||||
virtual void ExecuteLine(const char *pStr);
|
||||
virtual void ExecuteFile(const char *pFilename);
|
||||
|
|
|
@ -75,9 +75,9 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
{
|
||||
dbg_msg("datafile", "could not open '%s'", pFilename);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// take the CRC of the file and store it
|
||||
unsigned Crc = 0;
|
||||
{
|
||||
|
@ -85,9 +85,9 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
{
|
||||
BUFFER_SIZE = 64*1024
|
||||
};
|
||||
|
||||
|
||||
unsigned char aBuffer[BUFFER_SIZE];
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
unsigned Bytes = io_read(File, aBuffer, BUFFER_SIZE);
|
||||
|
@ -95,11 +95,11 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
break;
|
||||
Crc = crc32(Crc, aBuffer, Bytes); // ignore_convention
|
||||
}
|
||||
|
||||
|
||||
io_seek(File, 0, IOSEEK_START);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// TODO: change this header
|
||||
CDatafileHeader Header;
|
||||
io_read(File, &Header, sizeof(Header));
|
||||
|
@ -113,14 +113,14 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
}
|
||||
|
||||
#if defined(CONF_ARCH_ENDIAN_BIG)
|
||||
swap_endian(&Header, sizeof(int), sizeof(Header)/sizeof(int));
|
||||
swap_endian(&Header, sizeof(int), sizeof(Header)/sizeof(int));
|
||||
#endif
|
||||
if(Header.m_Version != 3 && Header.m_Version != 4)
|
||||
{
|
||||
dbg_msg("datafile", "wrong version. version=%x", Header.m_Version);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// read in the rest except the data
|
||||
unsigned Size = 0;
|
||||
Size += Header.m_NumItemTypes*sizeof(CDatafileItemType);
|
||||
|
@ -128,7 +128,7 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
if(Header.m_Version == 4)
|
||||
Size += Header.m_NumRawData*sizeof(int); // v4 has uncompressed data sizes aswell
|
||||
Size += Header.m_ItemSize;
|
||||
|
||||
|
||||
unsigned AllocSize = Size;
|
||||
AllocSize += sizeof(CDatafile); // add space for info structure
|
||||
AllocSize += Header.m_NumRawData*sizeof(void*); // add space for data pointers
|
||||
|
@ -140,10 +140,10 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
pTmpDataFile->m_pData = (char *)(pTmpDataFile+1)+Header.m_NumRawData*sizeof(char *);
|
||||
pTmpDataFile->m_File = File;
|
||||
pTmpDataFile->m_Crc = Crc;
|
||||
|
||||
|
||||
// clear the data pointers
|
||||
mem_zero(pTmpDataFile->m_ppDataPtrs, Header.m_NumRawData*sizeof(void*));
|
||||
|
||||
|
||||
// read types, offsets, sizes and item data
|
||||
unsigned ReadSize = io_read(File, pTmpDataFile->m_pData, Size);
|
||||
if(ReadSize != Size)
|
||||
|
@ -169,12 +169,12 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
dbg_msg("datafile", "swaplen=%d", Header.m_Swaplen);
|
||||
dbg_msg("datafile", "item_size=%d", m_pDataFile->m_Header.m_ItemSize);
|
||||
}
|
||||
|
||||
|
||||
m_pDataFile->m_Info.m_pItemTypes = (CDatafileItemType *)m_pDataFile->m_pData;
|
||||
m_pDataFile->m_Info.m_pItemOffsets = (int *)&m_pDataFile->m_Info.m_pItemTypes[m_pDataFile->m_Header.m_NumItemTypes];
|
||||
m_pDataFile->m_Info.m_pDataOffsets = (int *)&m_pDataFile->m_Info.m_pItemOffsets[m_pDataFile->m_Header.m_NumItems];
|
||||
m_pDataFile->m_Info.m_pDataSizes = (int *)&m_pDataFile->m_Info.m_pDataOffsets[m_pDataFile->m_Header.m_NumRawData];
|
||||
|
||||
|
||||
if(Header.m_Version == 4)
|
||||
m_pDataFile->m_Info.m_pItemStart = (char *)&m_pDataFile->m_Info.m_pDataSizes[m_pDataFile->m_Header.m_NumRawData];
|
||||
else
|
||||
|
@ -191,7 +191,7 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
void *p = datafile_get_data(df, i);
|
||||
dbg_msg("datafile", "%d %d", (int)((char*)p - (char*)(&m_pDataFile->data)), size);
|
||||
}
|
||||
|
||||
|
||||
for(int i = 0; i < datafile_num_items(df); i++)
|
||||
{
|
||||
int type, id;
|
||||
|
@ -218,7 +218,7 @@ bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int
|
|||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -227,7 +227,7 @@ bool CDataFileReader::GetCrcSize(class IStorage *pStorage, const char *pFilename
|
|||
IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType);
|
||||
if(!File)
|
||||
return false;
|
||||
|
||||
|
||||
// get crc and size
|
||||
unsigned Crc = 0;
|
||||
unsigned Size = 0;
|
||||
|
@ -240,7 +240,7 @@ bool CDataFileReader::GetCrcSize(class IStorage *pStorage, const char *pFilename
|
|||
Crc = crc32(Crc, aBuffer, Bytes); // ignore_convention
|
||||
Size += Bytes;
|
||||
}
|
||||
|
||||
|
||||
io_close(File);
|
||||
|
||||
*pCrc = Crc;
|
||||
|
@ -258,23 +258,23 @@ int CDataFileReader::NumData()
|
|||
int CDataFileReader::GetDataSize(int Index)
|
||||
{
|
||||
if(!m_pDataFile) { return 0; }
|
||||
|
||||
|
||||
if(Index == m_pDataFile->m_Header.m_NumRawData-1)
|
||||
return m_pDataFile->m_Header.m_DataSize-m_pDataFile->m_Info.m_pDataOffsets[Index];
|
||||
return m_pDataFile->m_Info.m_pDataOffsets[Index+1]-m_pDataFile->m_Info.m_pDataOffsets[Index];
|
||||
return m_pDataFile->m_Info.m_pDataOffsets[Index+1]-m_pDataFile->m_Info.m_pDataOffsets[Index];
|
||||
}
|
||||
|
||||
void *CDataFileReader::GetDataImpl(int Index, int Swap)
|
||||
{
|
||||
if(!m_pDataFile) { return 0; }
|
||||
|
||||
|
||||
// load it if needed
|
||||
if(!m_pDataFile->m_ppDataPtrs[Index])
|
||||
{
|
||||
// fetch the data size
|
||||
int DataSize = GetDataSize(Index);
|
||||
int SwapSize = DataSize;
|
||||
|
||||
|
||||
if(m_pDataFile->m_Header.m_Version == 4)
|
||||
{
|
||||
// v4 has compressed data
|
||||
|
@ -284,7 +284,7 @@ void *CDataFileReader::GetDataImpl(int Index, int Swap)
|
|||
|
||||
dbg_msg("datafile", "loading data index=%d size=%d uncompressed=%d", Index, DataSize, UncompressedSize);
|
||||
m_pDataFile->m_ppDataPtrs[Index] = (char *)mem_alloc(UncompressedSize, 1);
|
||||
|
||||
|
||||
// read the compressed data
|
||||
io_seek(m_pDataFile->m_File, m_pDataFile->m_DataStartOffset+m_pDataFile->m_Info.m_pDataOffsets[Index], IOSEEK_START);
|
||||
io_read(m_pDataFile->m_File, pTemp, DataSize);
|
||||
|
@ -311,7 +311,7 @@ void *CDataFileReader::GetDataImpl(int Index, int Swap)
|
|||
swap_endian(m_pDataFile->m_ppDataPtrs[Index], sizeof(int), SwapSize/sizeof(int));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
return m_pDataFile->m_ppDataPtrs[Index];
|
||||
}
|
||||
|
||||
|
@ -329,7 +329,7 @@ void CDataFileReader::UnloadData(int Index)
|
|||
{
|
||||
if(Index < 0)
|
||||
return;
|
||||
|
||||
|
||||
//
|
||||
mem_free(m_pDataFile->m_ppDataPtrs[Index]);
|
||||
m_pDataFile->m_ppDataPtrs[Index] = 0x0;
|
||||
|
@ -340,13 +340,13 @@ int CDataFileReader::GetItemSize(int Index)
|
|||
if(!m_pDataFile) { return 0; }
|
||||
if(Index == m_pDataFile->m_Header.m_NumItems-1)
|
||||
return m_pDataFile->m_Header.m_ItemSize-m_pDataFile->m_Info.m_pItemOffsets[Index];
|
||||
return m_pDataFile->m_Info.m_pItemOffsets[Index+1]-m_pDataFile->m_Info.m_pItemOffsets[Index];
|
||||
return m_pDataFile->m_Info.m_pItemOffsets[Index+1]-m_pDataFile->m_Info.m_pItemOffsets[Index];
|
||||
}
|
||||
|
||||
void *CDataFileReader::GetItem(int Index, int *pType, int *pID)
|
||||
{
|
||||
if(!m_pDataFile) { if(pType) *pType = 0; if(pID) *pID = 0; return 0; }
|
||||
|
||||
|
||||
CDatafileItem *i = (CDatafileItem *)(m_pDataFile->m_Info.m_pItemStart+m_pDataFile->m_Info.m_pItemOffsets[Index]);
|
||||
if(pType)
|
||||
*pType = (i->m_TypeAndID>>16)&0xffff; // remove sign extention
|
||||
|
@ -362,7 +362,7 @@ void CDataFileReader::GetType(int Type, int *pStart, int *pNum)
|
|||
|
||||
if(!m_pDataFile)
|
||||
return;
|
||||
|
||||
|
||||
for(int i = 0; i < m_pDataFile->m_Header.m_NumItemTypes; i++)
|
||||
{
|
||||
if(m_pDataFile->m_Info.m_pItemTypes[i].m_Type == Type)
|
||||
|
@ -377,7 +377,7 @@ void CDataFileReader::GetType(int Type, int *pStart, int *pNum)
|
|||
void *CDataFileReader::FindItem(int Type, int ID)
|
||||
{
|
||||
if(!m_pDataFile) return 0;
|
||||
|
||||
|
||||
int Start, Num;
|
||||
GetType(Type, &Start, &Num);
|
||||
for(int i = 0; i < Num; i++)
|
||||
|
@ -400,12 +400,12 @@ bool CDataFileReader::Close()
|
|||
{
|
||||
if(!m_pDataFile)
|
||||
return true;
|
||||
|
||||
|
||||
// free the data that is loaded
|
||||
int i;
|
||||
for(i = 0; i < m_pDataFile->m_Header.m_NumRawData; i++)
|
||||
mem_free(m_pDataFile->m_ppDataPtrs[i]);
|
||||
|
||||
|
||||
io_close(m_pDataFile->m_File);
|
||||
mem_free(m_pDataFile);
|
||||
m_pDataFile = 0;
|
||||
|
@ -424,7 +424,7 @@ bool CDataFileWriter::Open(class IStorage *pStorage, const char *pFilename)
|
|||
m_File = pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
||||
if(!m_File)
|
||||
return false;
|
||||
|
||||
|
||||
m_NumItems = 0;
|
||||
m_NumDatas = 0;
|
||||
m_NumItemTypes = 0;
|
||||
|
@ -435,7 +435,7 @@ bool CDataFileWriter::Open(class IStorage *pStorage, const char *pFilename)
|
|||
m_aItemTypes[i].m_First = -1;
|
||||
m_aItemTypes[i].m_Last = -1;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -450,7 +450,7 @@ int CDataFileWriter::AddItem(int Type, int ID, int Size, void *pData)
|
|||
m_aItems[m_NumItems].m_Type = Type;
|
||||
m_aItems[m_NumItems].m_ID = ID;
|
||||
m_aItems[m_NumItems].m_Size = Size;
|
||||
|
||||
|
||||
// copy data
|
||||
m_aItems[m_NumItems].m_pData = mem_alloc(Size, 1);
|
||||
mem_copy(m_aItems[m_NumItems].m_pData, pData, Size);
|
||||
|
@ -461,16 +461,16 @@ int CDataFileWriter::AddItem(int Type, int ID, int Size, void *pData)
|
|||
// link
|
||||
m_aItems[m_NumItems].m_Prev = m_aItemTypes[Type].m_Last;
|
||||
m_aItems[m_NumItems].m_Next = -1;
|
||||
|
||||
|
||||
if(m_aItemTypes[Type].m_Last != -1)
|
||||
m_aItems[m_aItemTypes[Type].m_Last].m_Next = m_NumItems;
|
||||
m_aItemTypes[Type].m_Last = m_NumItems;
|
||||
|
||||
|
||||
if(m_aItemTypes[Type].m_First == -1)
|
||||
m_aItemTypes[Type].m_First = m_NumItems;
|
||||
|
||||
|
||||
m_aItemTypes[Type].m_Num++;
|
||||
|
||||
|
||||
m_NumItems++;
|
||||
return m_NumItems-1;
|
||||
}
|
||||
|
@ -491,7 +491,7 @@ int CDataFileWriter::AddData(int Size, void *pData)
|
|||
dbg_msg("datafile", "compression error %d", Result);
|
||||
dbg_assert(0, "zlib error");
|
||||
}
|
||||
|
||||
|
||||
pInfo->m_UncompressedSize = Size;
|
||||
pInfo->m_CompressedSize = (int)s;
|
||||
pInfo->m_pCompressedData = mem_alloc(pInfo->m_CompressedSize, 1);
|
||||
|
@ -539,23 +539,23 @@ int CDataFileWriter::Finish()
|
|||
dbg_msg("datafile", "item=%d size=%d (%d)", i, m_aItems[i].m_Size, m_aItems[i].m_Size+sizeof(CDatafileItem));
|
||||
ItemSize += m_aItems[i].m_Size + sizeof(CDatafileItem);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
for(int i = 0; i < m_NumDatas; i++)
|
||||
DataSize += m_aDatas[i].m_CompressedSize;
|
||||
|
||||
|
||||
// calculate the complete size
|
||||
TypesSize = m_NumItemTypes*sizeof(CDatafileItemType);
|
||||
HeaderSize = sizeof(CDatafileHeader);
|
||||
OffsetSize = (m_NumItems + m_NumDatas + m_NumDatas) * sizeof(int); // ItemOffsets, DataOffsets, DataUncompressedSizes
|
||||
FileSize = HeaderSize + TypesSize + OffsetSize + ItemSize + DataSize;
|
||||
SwapSize = FileSize - DataSize;
|
||||
|
||||
|
||||
(void)SwapSize;
|
||||
|
||||
|
||||
if(DEBUG)
|
||||
dbg_msg("datafile", "num_m_aItemTypes=%d TypesSize=%d m_aItemsize=%d DataSize=%d", m_NumItemTypes, TypesSize, ItemSize, DataSize);
|
||||
|
||||
|
||||
// construct Header
|
||||
{
|
||||
Header.m_aID[0] = 'D';
|
||||
|
@ -570,7 +570,7 @@ int CDataFileWriter::Finish()
|
|||
Header.m_NumRawData = m_NumDatas;
|
||||
Header.m_ItemSize = ItemSize;
|
||||
Header.m_DataSize = DataSize;
|
||||
|
||||
|
||||
// write Header
|
||||
if(DEBUG)
|
||||
dbg_msg("datafile", "HeaderSize=%d", sizeof(Header));
|
||||
|
@ -579,7 +579,7 @@ int CDataFileWriter::Finish()
|
|||
#endif
|
||||
io_write(m_File, &Header, sizeof(Header));
|
||||
}
|
||||
|
||||
|
||||
// write types
|
||||
for(int i = 0, Count = 0; i < 0xffff; i++)
|
||||
{
|
||||
|
@ -599,7 +599,7 @@ int CDataFileWriter::Finish()
|
|||
Count += m_aItemTypes[i].m_Num;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// write item offsets
|
||||
for(int i = 0, Offset = 0; i < 0xffff; i++)
|
||||
{
|
||||
|
@ -617,13 +617,13 @@ int CDataFileWriter::Finish()
|
|||
#endif
|
||||
io_write(m_File, &Temp, sizeof(Temp));
|
||||
Offset += m_aItems[k].m_Size + sizeof(CDatafileItem);
|
||||
|
||||
|
||||
// next
|
||||
k = m_aItems[k].m_Next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// write data offsets
|
||||
for(int i = 0, Offset = 0; i < m_NumDatas; i++)
|
||||
{
|
||||
|
@ -648,7 +648,7 @@ int CDataFileWriter::Finish()
|
|||
#endif
|
||||
io_write(m_File, &UncompressedSize, sizeof(UncompressedSize));
|
||||
}
|
||||
|
||||
|
||||
// write m_aItems
|
||||
for(int i = 0; i < 0xffff; i++)
|
||||
{
|
||||
|
@ -663,20 +663,20 @@ int CDataFileWriter::Finish()
|
|||
Item.m_Size = m_aItems[k].m_Size;
|
||||
if(DEBUG)
|
||||
dbg_msg("datafile", "writing item type=%x idx=%d id=%d size=%d", i, k, m_aItems[k].m_ID, m_aItems[k].m_Size);
|
||||
|
||||
|
||||
#if defined(CONF_ARCH_ENDIAN_BIG)
|
||||
swap_endian(&Item, sizeof(int), sizeof(Item)/sizeof(int));
|
||||
swap_endian(m_aItems[k].m_pData, sizeof(int), m_aItems[k].m_Size/sizeof(int));
|
||||
#endif
|
||||
io_write(m_File, &Item, sizeof(Item));
|
||||
io_write(m_File, m_aItems[k].m_pData, m_aItems[k].m_Size);
|
||||
|
||||
|
||||
// next
|
||||
k = m_aItems[k].m_Next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// write data
|
||||
for(int i = 0; i < m_NumDatas; i++)
|
||||
{
|
||||
|
@ -690,10 +690,10 @@ int CDataFileWriter::Finish()
|
|||
mem_free(m_aItems[i].m_pData);
|
||||
for(int i = 0; i < m_NumDatas; ++i)
|
||||
mem_free(m_aDatas[i].m_pCompressedData);
|
||||
|
||||
|
||||
io_close(m_File);
|
||||
m_File = 0;
|
||||
|
||||
|
||||
if(DEBUG)
|
||||
dbg_msg("datafile", "done");
|
||||
return 0;
|
||||
|
|
|
@ -11,14 +11,14 @@ class CDataFileReader
|
|||
public:
|
||||
CDataFileReader() : m_pDataFile(0) {}
|
||||
~CDataFileReader() { Close(); }
|
||||
|
||||
|
||||
bool IsOpen() const { return m_pDataFile != 0; }
|
||||
|
||||
|
||||
bool Open(class IStorage *pStorage, const char *pFilename, int StorageType);
|
||||
bool Close();
|
||||
|
||||
static bool GetCrcSize(class IStorage *pStorage, const char *pFilename, int StorageType, unsigned *pCrc, unsigned *pSize);
|
||||
|
||||
|
||||
void *GetData(int Index);
|
||||
void *GetDataSwapped(int Index); // makes sure that the data is 32bit LE ints when saved
|
||||
int GetDataSize(int Index);
|
||||
|
@ -30,7 +30,7 @@ public:
|
|||
int NumItems();
|
||||
int NumData();
|
||||
void Unload();
|
||||
|
||||
|
||||
unsigned Crc();
|
||||
};
|
||||
|
||||
|
@ -60,15 +60,15 @@ class CDataFileWriter
|
|||
int m_First;
|
||||
int m_Last;
|
||||
};
|
||||
|
||||
|
||||
IOHANDLE m_File;
|
||||
int m_NumItems;
|
||||
int m_NumDatas;
|
||||
int m_NumItemTypes;
|
||||
CItemTypeInfo m_aItemTypes[0xffff];
|
||||
CItemInfo m_aItems[1024];
|
||||
CDataInfo m_aDatas[1024];
|
||||
|
||||
CDataInfo m_aDatas[1024];
|
||||
|
||||
public:
|
||||
CDataFileWriter() : m_File(0) {}
|
||||
bool Open(class IStorage *pStorage, const char *Filename);
|
||||
|
|
|
@ -47,7 +47,7 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
|
|||
char aBuf[512];
|
||||
str_format(aMapFilename, sizeof(aMapFilename), "%s.map", pMap);
|
||||
if(pStorage->FindFile(aMapFilename, "maps", IStorage::TYPE_ALL, aBuf, sizeof(aBuf)))
|
||||
MapFile = pStorage->OpenFile(aBuf, IOFLAG_READ, IStorage::TYPE_ALL);
|
||||
MapFile = pStorage->OpenFile(aBuf, IOFLAG_READ, IStorage::TYPE_ALL);
|
||||
}
|
||||
if(!MapFile)
|
||||
{
|
||||
|
@ -67,7 +67,7 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
|
|||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", aBuf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// write header
|
||||
mem_zero(&Header, sizeof(Header));
|
||||
mem_copy(Header.m_aMarker, gs_aHeaderMarker, sizeof(Header.m_aMarker));
|
||||
|
@ -87,7 +87,7 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
|
|||
// Header.m_Length - add this on stop
|
||||
str_timestamp(Header.m_aTimestamp, sizeof(Header.m_aTimestamp));
|
||||
io_write(DemoFile, &Header, sizeof(Header));
|
||||
|
||||
|
||||
// write map data
|
||||
while(1)
|
||||
{
|
||||
|
@ -98,11 +98,11 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
|
|||
io_write(DemoFile, &aChunk, Bytes);
|
||||
}
|
||||
io_close(MapFile);
|
||||
|
||||
|
||||
m_LastKeyFrame = -1;
|
||||
m_LastTickMarker = -1;
|
||||
m_FirstTick = -1;
|
||||
|
||||
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "Recording to '%s'", pFilename);
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", aBuf);
|
||||
|
@ -113,25 +113,25 @@ int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, con
|
|||
|
||||
/*
|
||||
Tickmarker
|
||||
7 = Always set
|
||||
6 = Keyframe flag
|
||||
0-5 = Delta tick
|
||||
|
||||
7 = Always set
|
||||
6 = Keyframe flag
|
||||
0-5 = Delta tick
|
||||
|
||||
Normal
|
||||
7 = Not set
|
||||
5-6 = Type
|
||||
0-4 = Size
|
||||
7 = Not set
|
||||
5-6 = Type
|
||||
0-4 = Size
|
||||
*/
|
||||
|
||||
enum
|
||||
{
|
||||
CHUNKTYPEFLAG_TICKMARKER = 0x80,
|
||||
CHUNKTICKFLAG_KEYFRAME = 0x40, // only when tickmarker is set
|
||||
|
||||
|
||||
CHUNKMASK_TICK = 0x3f,
|
||||
CHUNKMASK_TYPE = 0x60,
|
||||
CHUNKMASK_SIZE = 0x1f,
|
||||
|
||||
|
||||
CHUNKTYPE_SNAPSHOT = 1,
|
||||
CHUNKTYPE_MESSAGE = 2,
|
||||
CHUNKTYPE_DELTA = 3,
|
||||
|
@ -152,7 +152,7 @@ void CDemoRecorder::WriteTickMarker(int Tick, int Keyframe)
|
|||
|
||||
if(Keyframe)
|
||||
aChunk[0] |= CHUNKTICKFLAG_KEYFRAME;
|
||||
|
||||
|
||||
io_write(m_File, aChunk, sizeof(aChunk));
|
||||
}
|
||||
else
|
||||
|
@ -160,7 +160,7 @@ void CDemoRecorder::WriteTickMarker(int Tick, int Keyframe)
|
|||
unsigned char aChunk[1];
|
||||
aChunk[0] = CHUNKTYPEFLAG_TICKMARKER | (Tick-m_LastTickMarker);
|
||||
io_write(m_File, aChunk, sizeof(aChunk));
|
||||
}
|
||||
}
|
||||
|
||||
m_LastTickMarker = Tick;
|
||||
if(m_FirstTick < 0)
|
||||
|
@ -172,7 +172,7 @@ void CDemoRecorder::Write(int Type, const void *pData, int Size)
|
|||
char aBuffer[64*1024];
|
||||
char aBuffer2[64*1024];
|
||||
unsigned char aChunk[3];
|
||||
|
||||
|
||||
if(!m_File)
|
||||
return;
|
||||
|
||||
|
@ -183,8 +183,8 @@ void CDemoRecorder::Write(int Type, const void *pData, int Size)
|
|||
aBuffer2[Size++] = 0;
|
||||
Size = CVariableInt::Compress(aBuffer2, Size, aBuffer); // buffer2 -> buffer
|
||||
Size = CNetBase::Compress(aBuffer, Size, aBuffer2, sizeof(aBuffer2)); // buffer -> buffer2
|
||||
|
||||
|
||||
|
||||
|
||||
aChunk[0] = ((Type&0x3)<<5);
|
||||
if(Size < 30)
|
||||
{
|
||||
|
@ -207,7 +207,7 @@ void CDemoRecorder::Write(int Type, const void *pData, int Size)
|
|||
io_write(m_File, aChunk, 3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
io_write(m_File, aBuffer2, Size);
|
||||
}
|
||||
|
||||
|
@ -217,10 +217,10 @@ void CDemoRecorder::RecordSnapshot(int Tick, const void *pData, int Size)
|
|||
{
|
||||
// write full tickmarker
|
||||
WriteTickMarker(Tick, 1);
|
||||
|
||||
|
||||
// write snapshot
|
||||
Write(CHUNKTYPE_SNAPSHOT, pData, Size);
|
||||
|
||||
|
||||
m_LastKeyFrame = Tick;
|
||||
mem_copy(m_aLastSnapshotData, pData, Size);
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ void CDemoRecorder::RecordSnapshot(int Tick, const void *pData, int Size)
|
|||
|
||||
// write tickmarker
|
||||
WriteTickMarker(Tick, 0);
|
||||
|
||||
|
||||
DeltaSize = m_pSnapshotDelta->CreateDelta((CSnapshot*)m_aLastSnapshotData, (CSnapshot*)pData, &aDeltaData);
|
||||
if(DeltaSize)
|
||||
{
|
||||
|
@ -262,7 +262,7 @@ int CDemoRecorder::Stop()
|
|||
aLength[2] = (DemoLength>>8)&0xff;
|
||||
aLength[3] = (DemoLength)&0xff;
|
||||
io_write(m_File, aLength, sizeof(aLength));
|
||||
|
||||
|
||||
io_close(m_File);
|
||||
m_File = 0;
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Stopped recording");
|
||||
|
@ -290,19 +290,19 @@ void CDemoPlayer::SetListner(IListner *pListner)
|
|||
int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick)
|
||||
{
|
||||
unsigned char Chunk = 0;
|
||||
|
||||
|
||||
*pSize = 0;
|
||||
*pType = 0;
|
||||
|
||||
|
||||
if(io_read(m_File, &Chunk, sizeof(Chunk)) != sizeof(Chunk))
|
||||
return -1;
|
||||
|
||||
|
||||
if(Chunk&CHUNKTYPEFLAG_TICKMARKER)
|
||||
{
|
||||
// decode tick marker
|
||||
int Tickdelta = Chunk&(CHUNKMASK_TICK);
|
||||
*pType = Chunk&(CHUNKTYPEFLAG_TICKMARKER|CHUNKTICKFLAG_KEYFRAME);
|
||||
|
||||
|
||||
if(Tickdelta == 0)
|
||||
{
|
||||
unsigned char aTickdata[4];
|
||||
|
@ -314,21 +314,21 @@ int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick)
|
|||
{
|
||||
*pTick += Tickdelta;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// decode normal chunk
|
||||
*pType = (Chunk&CHUNKMASK_TYPE)>>5;
|
||||
*pSize = Chunk&CHUNKMASK_SIZE;
|
||||
|
||||
|
||||
if(*pSize == 30)
|
||||
{
|
||||
unsigned char aSizedata[1];
|
||||
if(io_read(m_File, aSizedata, sizeof(aSizedata)) != sizeof(aSizedata))
|
||||
return -1;
|
||||
*pSize = aSizedata[0];
|
||||
|
||||
|
||||
}
|
||||
else if(*pSize == 31)
|
||||
{
|
||||
|
@ -338,7 +338,7 @@ int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick)
|
|||
*pSize = (aSizedata[1]<<8) | aSizedata[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -358,17 +358,17 @@ void CDemoPlayer::ScanFile()
|
|||
while(1)
|
||||
{
|
||||
long CurrentPos = io_tell(m_File);
|
||||
|
||||
|
||||
if(ReadChunkHeader(&ChunkType, &ChunkSize, &ChunkTick))
|
||||
break;
|
||||
|
||||
|
||||
// read the chunk
|
||||
if(ChunkType&CHUNKTYPEFLAG_TICKMARKER)
|
||||
{
|
||||
if(ChunkType&CHUNKTICKFLAG_KEYFRAME)
|
||||
{
|
||||
CKeyFrameSearch *pKey;
|
||||
|
||||
|
||||
// save the position
|
||||
pKey = (CKeyFrameSearch *)Heap.Allocate(sizeof(CKeyFrameSearch));
|
||||
pKey->m_Frame.m_Filepos = CurrentPos;
|
||||
|
@ -381,21 +381,21 @@ void CDemoPlayer::ScanFile()
|
|||
pCurrentKey = pKey;
|
||||
m_Info.m_SeekablePoints++;
|
||||
}
|
||||
|
||||
|
||||
if(m_Info.m_Info.m_FirstTick == -1)
|
||||
m_Info.m_Info.m_FirstTick = ChunkTick;
|
||||
m_Info.m_Info.m_LastTick = ChunkTick;
|
||||
}
|
||||
else if(ChunkSize)
|
||||
io_skip(m_File, ChunkSize);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// copy all the frames to an array instead for fast access
|
||||
m_pKeyFrames = (CKeyFrame*)mem_alloc(m_Info.m_SeekablePoints*sizeof(CKeyFrame), 1);
|
||||
for(pCurrentKey = pFirstKey, i = 0; pCurrentKey; pCurrentKey = pCurrentKey->m_pNext, i++)
|
||||
m_pKeyFrames[i] = pCurrentKey->m_Frame;
|
||||
|
||||
|
||||
// destroy the temporary heap and seek back to the start
|
||||
io_seek(m_File, StartPos, IOSEEK_START);
|
||||
}
|
||||
|
@ -429,7 +429,7 @@ void CDemoPlayer::DoTick()
|
|||
Pause();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// read the chunk
|
||||
if(ChunkSize)
|
||||
{
|
||||
|
@ -440,7 +440,7 @@ void CDemoPlayer::DoTick()
|
|||
Stop();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
DataSize = CNetBase::Decompress(aCompresseddata, ChunkSize, aDecompressed, sizeof(aDecompressed));
|
||||
if(DataSize < 0)
|
||||
{
|
||||
|
@ -449,7 +449,7 @@ void CDemoPlayer::DoTick()
|
|||
Stop();
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
DataSize = CVariableInt::Decompress(aDecompressed, DataSize, aData);
|
||||
|
||||
if(DataSize < 0)
|
||||
|
@ -459,16 +459,16 @@ void CDemoPlayer::DoTick()
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(ChunkType == CHUNKTYPE_DELTA)
|
||||
{
|
||||
// process delta snapshot
|
||||
static char aNewsnap[CSnapshot::MAX_SIZE];
|
||||
|
||||
|
||||
GotSnapshot = 1;
|
||||
|
||||
|
||||
DataSize = m_pSnapshotDelta->UnpackDelta((CSnapshot*)m_aLastSnapshotData, (CSnapshot*)aNewsnap, aData, DataSize);
|
||||
|
||||
|
||||
if(DataSize >= 0)
|
||||
{
|
||||
if(m_pListner)
|
||||
|
@ -488,7 +488,7 @@ void CDemoPlayer::DoTick()
|
|||
{
|
||||
// process full snapshot
|
||||
GotSnapshot = 1;
|
||||
|
||||
|
||||
m_LastSnapshotDataSize = DataSize;
|
||||
mem_copy(m_aLastSnapshotData, aData, DataSize);
|
||||
if(m_pListner)
|
||||
|
@ -502,7 +502,7 @@ void CDemoPlayer::DoTick()
|
|||
GotSnapshot = 1;
|
||||
m_pListner->OnDemoPlayerSnapshot(m_aLastSnapshotData, m_LastSnapshotDataSize);
|
||||
}
|
||||
|
||||
|
||||
// check the remaining types
|
||||
if(ChunkType&CHUNKTYPEFLAG_TICKMARKER)
|
||||
{
|
||||
|
@ -544,7 +544,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
|
|||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", aBuf);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// store the filename
|
||||
str_copy(m_aFilename, pFilename, sizeof(m_aFilename));
|
||||
|
||||
|
@ -556,7 +556,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
|
|||
m_Info.m_Info.m_CurrentTick = -1;
|
||||
m_Info.m_PreviousTick = -1;
|
||||
m_Info.m_Info.m_Speed = 1;
|
||||
|
||||
|
||||
m_LastSnapshotDataSize = -1;
|
||||
|
||||
// read the header
|
||||
|
@ -580,7 +580,7 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
|
|||
m_File = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// get demo type
|
||||
if(!str_comp(m_Info.m_Header.m_aType, "client"))
|
||||
m_DemoType = DEMOTYPE_CLIENT;
|
||||
|
@ -588,17 +588,17 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
|
|||
m_DemoType = DEMOTYPE_SERVER;
|
||||
else
|
||||
m_DemoType = DEMOTYPE_INVALID;
|
||||
|
||||
|
||||
// read map
|
||||
unsigned MapSize = (m_Info.m_Header.m_aMapSize[0]<<24) | (m_Info.m_Header.m_aMapSize[1]<<16) | (m_Info.m_Header.m_aMapSize[2]<<8) | (m_Info.m_Header.m_aMapSize[3]);
|
||||
|
||||
|
||||
// check if we already have the map
|
||||
// TODO: improve map checking (maps folder, check crc)
|
||||
unsigned Crc = (m_Info.m_Header.m_aMapCrc[0]<<24) | (m_Info.m_Header.m_aMapCrc[1]<<16) | (m_Info.m_Header.m_aMapCrc[2]<<8) | (m_Info.m_Header.m_aMapCrc[3]);
|
||||
char aMapFilename[128];
|
||||
str_format(aMapFilename, sizeof(aMapFilename), "downloadedmaps/%s_%08x.map", m_Info.m_Header.m_aMapName, Crc);
|
||||
IOHANDLE MapFile = pStorage->OpenFile(aMapFilename, IOFLAG_READ, IStorage::TYPE_ALL);
|
||||
|
||||
|
||||
if(MapFile)
|
||||
{
|
||||
io_skip(m_File, MapSize);
|
||||
|
@ -609,20 +609,20 @@ int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const
|
|||
// get map data
|
||||
unsigned char *pMapData = (unsigned char *)mem_alloc(MapSize, 1);
|
||||
io_read(m_File, pMapData, MapSize);
|
||||
|
||||
|
||||
// save map
|
||||
MapFile = pStorage->OpenFile(aMapFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
||||
io_write(MapFile, pMapData, MapSize);
|
||||
io_close(MapFile);
|
||||
|
||||
|
||||
// free data
|
||||
mem_free(pMapData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// scan the file for interessting points
|
||||
ScanFile();
|
||||
|
||||
|
||||
// ready for playback
|
||||
return 0;
|
||||
}
|
||||
|
@ -638,7 +638,7 @@ int CDemoPlayer::Play()
|
|||
// fill in previous and next tick
|
||||
while(m_Info.m_PreviousTick == -1 && IsPlaying())
|
||||
DoTick();
|
||||
|
||||
|
||||
// set start info
|
||||
/*m_Info.start_tick = m_Info.previous_tick;
|
||||
m_Info.start_time = time_get();*/
|
||||
|
@ -653,15 +653,15 @@ int CDemoPlayer::SetPos(float Percent)
|
|||
int WantedTick;
|
||||
if(!m_File)
|
||||
return -1;
|
||||
|
||||
|
||||
// -5 because we have to have a current tick and previous tick when we do the playback
|
||||
WantedTick = m_Info.m_Info.m_FirstTick + (int)((m_Info.m_Info.m_LastTick-m_Info.m_Info.m_FirstTick)*Percent) - 5;
|
||||
|
||||
|
||||
Keyframe = (int)(m_Info.m_SeekablePoints*Percent);
|
||||
|
||||
if(Keyframe < 0 || Keyframe >= m_Info.m_SeekablePoints)
|
||||
return -1;
|
||||
|
||||
|
||||
// get correct key frame
|
||||
if(m_pKeyFrames[Keyframe].m_Tick < WantedTick)
|
||||
while(Keyframe < m_Info.m_SeekablePoints-1 && m_pKeyFrames[Keyframe].m_Tick < WantedTick)
|
||||
|
@ -669,7 +669,7 @@ int CDemoPlayer::SetPos(float Percent)
|
|||
|
||||
while(Keyframe && m_pKeyFrames[Keyframe].m_Tick > WantedTick)
|
||||
Keyframe--;
|
||||
|
||||
|
||||
// seek to the correct keyframe
|
||||
io_seek(m_File, m_pKeyFrames[Keyframe].m_Filepos, IOSEEK_START);
|
||||
|
||||
|
@ -681,9 +681,9 @@ int CDemoPlayer::SetPos(float Percent)
|
|||
// playback everything until we hit our tick
|
||||
while(m_Info.m_PreviousTick < WantedTick)
|
||||
DoTick();
|
||||
|
||||
|
||||
Play();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -697,19 +697,19 @@ int CDemoPlayer::Update()
|
|||
int64 Now = time_get();
|
||||
int64 Deltatime = Now-m_Info.m_LastUpdate;
|
||||
m_Info.m_LastUpdate = Now;
|
||||
|
||||
|
||||
if(!IsPlaying())
|
||||
return 0;
|
||||
|
||||
|
||||
if(m_Info.m_Info.m_Paused)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
int64 Freq = time_freq();
|
||||
m_Info.m_CurrentTime += (int64)(Deltatime*(double)m_Info.m_Info.m_Speed);
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
int64 CurtickStart = (m_Info.m_Info.m_CurrentTick)*Freq/SERVER_TICK_SPEED;
|
||||
|
@ -717,22 +717,22 @@ int CDemoPlayer::Update()
|
|||
// break if we are ready
|
||||
if(CurtickStart > m_Info.m_CurrentTime)
|
||||
break;
|
||||
|
||||
|
||||
// do one more tick
|
||||
DoTick();
|
||||
|
||||
|
||||
if(m_Info.m_Info.m_Paused)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// update intratick
|
||||
{
|
||||
{
|
||||
int64 CurtickStart = (m_Info.m_Info.m_CurrentTick)*Freq/SERVER_TICK_SPEED;
|
||||
int64 PrevtickStart = (m_Info.m_PreviousTick)*Freq/SERVER_TICK_SPEED;
|
||||
m_Info.m_IntraTick = (m_Info.m_CurrentTime - PrevtickStart) / (float)(CurtickStart-PrevtickStart);
|
||||
m_Info.m_TickTime = (m_Info.m_CurrentTime - PrevtickStart) / (float)Freq;
|
||||
}
|
||||
|
||||
|
||||
if(m_Info.m_Info.m_CurrentTick == m_Info.m_PreviousTick ||
|
||||
m_Info.m_Info.m_CurrentTick == m_Info.m_NextTick)
|
||||
{
|
||||
|
@ -742,7 +742,7 @@ int CDemoPlayer::Update()
|
|||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", aBuf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -750,7 +750,7 @@ int CDemoPlayer::Stop()
|
|||
{
|
||||
if(!m_File)
|
||||
return -1;
|
||||
|
||||
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", "Stopped playback");
|
||||
io_close(m_File);
|
||||
m_File = 0;
|
||||
|
@ -776,20 +776,20 @@ bool CDemoPlayer::GetDemoInfo(class IStorage *pStorage, const char *pFilename, i
|
|||
{
|
||||
if(!pDemoHeader)
|
||||
return false;
|
||||
|
||||
|
||||
mem_zero(pDemoHeader, sizeof(CDemoHeader));
|
||||
|
||||
IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType);
|
||||
if(!File)
|
||||
return false;
|
||||
|
||||
|
||||
io_read(File, pDemoHeader, sizeof(CDemoHeader));
|
||||
if(mem_comp(pDemoHeader->m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) || pDemoHeader->m_Version < gs_ActVersion)
|
||||
{
|
||||
io_close(File);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
io_close(File);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -17,12 +17,12 @@ class CDemoRecorder : public IDemoRecorder
|
|||
int m_FirstTick;
|
||||
unsigned char m_aLastSnapshotData[CSnapshot::MAX_SIZE];
|
||||
class CSnapshotDelta *m_pSnapshotDelta;
|
||||
|
||||
|
||||
void WriteTickMarker(int Tick, int Keyframe);
|
||||
void Write(int Type, const void *pData, int Size);
|
||||
public:
|
||||
CDemoRecorder(class CSnapshotDelta *pSnapshotDelta);
|
||||
|
||||
|
||||
int Start(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, const char *pNetversion, const char *pMap, unsigned MapCrc, const char *pType);
|
||||
int Stop();
|
||||
|
||||
|
@ -44,21 +44,21 @@ public:
|
|||
virtual void OnDemoPlayerSnapshot(void *pData, int Size) = 0;
|
||||
virtual void OnDemoPlayerMessage(void *pData, int Size) = 0;
|
||||
};
|
||||
|
||||
|
||||
struct CPlaybackInfo
|
||||
{
|
||||
CDemoHeader m_Header;
|
||||
|
||||
|
||||
IDemoPlayer::CInfo m_Info;
|
||||
|
||||
int64 m_LastUpdate;
|
||||
int64 m_CurrentTime;
|
||||
|
||||
|
||||
int m_SeekablePoints;
|
||||
|
||||
|
||||
int m_NextTick;
|
||||
int m_PreviousTick;
|
||||
|
||||
|
||||
float m_IntraTick;
|
||||
float m_TickTime;
|
||||
};
|
||||
|
@ -73,12 +73,12 @@ private:
|
|||
long m_Filepos;
|
||||
int m_Tick;
|
||||
};
|
||||
|
||||
|
||||
struct CKeyFrameSearch
|
||||
{
|
||||
CKeyFrame m_Frame;
|
||||
CKeyFrameSearch *m_pNext;
|
||||
};
|
||||
};
|
||||
|
||||
class IConsole *m_pConsole;
|
||||
IOHANDLE m_File;
|
||||
|
@ -97,25 +97,25 @@ private:
|
|||
int NextFrame();
|
||||
|
||||
public:
|
||||
|
||||
|
||||
CDemoPlayer(class CSnapshotDelta *m_pSnapshotDelta);
|
||||
|
||||
|
||||
void SetListner(IListner *pListner);
|
||||
|
||||
|
||||
int Load(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, int StorageType);
|
||||
int Play();
|
||||
void Pause();
|
||||
void Unpause();
|
||||
int Stop();
|
||||
int Stop();
|
||||
void SetSpeed(float Speed);
|
||||
int SetPos(float Precent);
|
||||
const CInfo *BaseInfo() const { return &m_Info.m_Info; }
|
||||
char *GetDemoName();
|
||||
bool GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader) const;
|
||||
int GetDemoType() const;
|
||||
|
||||
|
||||
int Update();
|
||||
|
||||
|
||||
const CPlaybackInfo *Info() const { return &m_Info; }
|
||||
int IsPlaying() const { return m_File != 0; }
|
||||
};
|
||||
|
|
|
@ -43,7 +43,7 @@ public:
|
|||
pEngine->m_Logging = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
char aBuf[32];
|
||||
str_timestamp(aBuf, sizeof(aBuf));
|
||||
char aFilenameSent[128], aFilenameRecv[128];
|
||||
|
@ -59,7 +59,7 @@ public:
|
|||
{
|
||||
dbg_logger_stdout();
|
||||
dbg_logger_debugger();
|
||||
|
||||
|
||||
//
|
||||
dbg_msg("engine", "running on %s-%s-%s", CONF_FAMILY_STRING, CONF_PLATFORM_STRING, CONF_ARCH_STRING);
|
||||
#ifdef CONF_ARCH_ENDIAN_LITTLE
|
||||
|
@ -73,7 +73,7 @@ public:
|
|||
// init the network
|
||||
net_init();
|
||||
CNetBase::Init();
|
||||
|
||||
|
||||
m_JobPool.Init(1);
|
||||
|
||||
m_Logging = false;
|
||||
|
|
|
@ -15,7 +15,7 @@ void CHuffman::Setbits_r(CNode *pNode, int Bits, unsigned Depth)
|
|||
Setbits_r(&m_aNodes[pNode->m_aLeafs[1]], Bits|(1<<Depth), Depth+1);
|
||||
if(pNode->m_aLeafs[0] != 0xffff)
|
||||
Setbits_r(&m_aNodes[pNode->m_aLeafs[0]], Bits, Depth+1);
|
||||
|
||||
|
||||
if(pNode->m_NumBits)
|
||||
{
|
||||
pNode->m_Bits = Bits;
|
||||
|
@ -28,7 +28,7 @@ static void BubbleSort(CHuffmanConstructNode **ppList, int Size)
|
|||
{
|
||||
int Changed = 1;
|
||||
CHuffmanConstructNode *pTemp;
|
||||
|
||||
|
||||
while(Changed)
|
||||
{
|
||||
Changed = 0;
|
||||
|
@ -68,15 +68,15 @@ void CHuffman::ConstructTree(const unsigned *pFrequencies)
|
|||
apNodesLeft[i] = &aNodesLeftStorage[i];
|
||||
|
||||
}
|
||||
|
||||
|
||||
m_NumNodes = HUFFMAN_MAX_SYMBOLS;
|
||||
|
||||
|
||||
// construct the table
|
||||
while(NumNodesLeft > 1)
|
||||
{
|
||||
// we can't rely on stdlib's qsort for this, it can generate different results on different implementations
|
||||
BubbleSort(apNodesLeft, NumNodesLeft);
|
||||
|
||||
|
||||
m_aNodes[m_NumNodes].m_NumBits = 0;
|
||||
m_aNodes[m_NumNodes].m_aLeafs[0] = apNodesLeft[NumNodesLeft-1]->m_NodeId;
|
||||
m_aNodes[m_NumNodes].m_aLeafs[1] = apNodesLeft[NumNodesLeft-2]->m_NodeId;
|
||||
|
@ -89,7 +89,7 @@ void CHuffman::ConstructTree(const unsigned *pFrequencies)
|
|||
|
||||
// set start node
|
||||
m_pStartNode = &m_aNodes[m_NumNodes-1];
|
||||
|
||||
|
||||
// build symbol bits
|
||||
Setbits_r(m_pStartNode, 0, 0);
|
||||
}
|
||||
|
@ -230,7 +230,7 @@ int CHuffman::Decompress(const void *pInput, int InputSize, void *pOutput, int O
|
|||
// {C} load symbol now if we didn't that earlier at location {A}
|
||||
if(!pNode)
|
||||
pNode = m_apDecodeLut[Bits&HUFFMAN_LUTMASK];
|
||||
|
||||
|
||||
if(!pNode)
|
||||
return -1;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ class CHuffman
|
|||
|
||||
HUFFMAN_MAX_SYMBOLS=HUFFMAN_EOF_SYMBOL+1,
|
||||
HUFFMAN_MAX_NODES=HUFFMAN_MAX_SYMBOLS*2-1,
|
||||
|
||||
|
||||
HUFFMAN_LUTBITS = 10,
|
||||
HUFFMAN_LUTSIZE = (1<<HUFFMAN_LUTBITS),
|
||||
HUFFMAN_LUTMASK = (HUFFMAN_LUTSIZE-1)
|
||||
|
@ -36,10 +36,10 @@ class CHuffman
|
|||
CNode *m_apDecodeLut[HUFFMAN_LUTSIZE];
|
||||
CNode *m_pStartNode;
|
||||
int m_NumNodes;
|
||||
|
||||
|
||||
void Setbits_r(CNode *pNode, int Bits, unsigned Depth);
|
||||
void ConstructTree(const unsigned *pFrequencies);
|
||||
|
||||
|
||||
public:
|
||||
/*
|
||||
Function: huffman_init
|
||||
|
@ -86,6 +86,6 @@ public:
|
|||
Returns the size of the uncompressed data. Negative value on failure.
|
||||
*/
|
||||
int Decompress(const void *pInput, int InputSize, void *pOutput, int OutputSize);
|
||||
|
||||
|
||||
};
|
||||
#endif // __HUFFMAN_HEADER__
|
||||
|
|
|
@ -14,11 +14,11 @@ CJobPool::CJobPool()
|
|||
void CJobPool::WorkerThread(void *pUser)
|
||||
{
|
||||
CJobPool *pPool = (CJobPool *)pUser;
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
CJob *pJob = 0;
|
||||
|
||||
|
||||
// fetch job from queue
|
||||
lock_wait(pPool->m_Lock);
|
||||
if(pPool->m_pFirstJob)
|
||||
|
@ -31,7 +31,7 @@ void CJobPool::WorkerThread(void *pUser)
|
|||
pPool->m_pLastJob = 0;
|
||||
}
|
||||
lock_release(pPool->m_Lock);
|
||||
|
||||
|
||||
// do the job if we have one
|
||||
if(pJob)
|
||||
{
|
||||
|
@ -42,7 +42,7 @@ void CJobPool::WorkerThread(void *pUser)
|
|||
else
|
||||
thread_sleep(10);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
int CJobPool::Init(int NumThreads)
|
||||
|
@ -58,9 +58,9 @@ int CJobPool::Add(CJob *pJob, JOBFUNC pfnFunc, void *pData)
|
|||
mem_zero(pJob, sizeof(CJob));
|
||||
pJob->m_pfnFunc = pfnFunc;
|
||||
pJob->m_pFuncData = pData;
|
||||
|
||||
|
||||
lock_wait(m_Lock);
|
||||
|
||||
|
||||
// add job to queue
|
||||
pJob->m_pPrev = m_pLastJob;
|
||||
if(m_pLastJob)
|
||||
|
@ -68,7 +68,7 @@ int CJobPool::Add(CJob *pJob, JOBFUNC pfnFunc, void *pData)
|
|||
m_pLastJob = pJob;
|
||||
if(!m_pFirstJob)
|
||||
m_pFirstJob = pJob;
|
||||
|
||||
|
||||
lock_release(m_Lock);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -9,14 +9,14 @@ class CJobPool;
|
|||
class CJob
|
||||
{
|
||||
friend class CJobPool;
|
||||
|
||||
|
||||
CJobPool *m_pPool;
|
||||
CJob *m_pPrev;
|
||||
CJob *m_pNext;
|
||||
|
||||
|
||||
volatile int m_Status;
|
||||
volatile int m_Result;
|
||||
|
||||
|
||||
JOBFUNC m_pfnFunc;
|
||||
void *m_pFuncData;
|
||||
public:
|
||||
|
@ -25,14 +25,14 @@ public:
|
|||
m_Status = STATE_DONE;
|
||||
m_pFuncData = 0;
|
||||
}
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
STATE_PENDING=0,
|
||||
STATE_RUNNING,
|
||||
STATE_DONE
|
||||
};
|
||||
|
||||
|
||||
int Status() const { return m_Status; }
|
||||
int Result() const {return m_Result; }
|
||||
};
|
||||
|
@ -42,12 +42,12 @@ class CJobPool
|
|||
LOCK m_Lock;
|
||||
CJob *m_pFirstJob;
|
||||
CJob *m_pLastJob;
|
||||
|
||||
|
||||
static void WorkerThread(void *pUser);
|
||||
|
||||
|
||||
public:
|
||||
CJobPool();
|
||||
|
||||
|
||||
int Init(int NumThreads);
|
||||
int Add(CJob *pJob, JOBFUNC pfnFunc, void *pData);
|
||||
};
|
||||
|
|
|
@ -9,7 +9,7 @@ class CKernel : public IKernel
|
|||
{
|
||||
MAX_INTERFACES=32,
|
||||
};
|
||||
|
||||
|
||||
class CInterfaceInfo
|
||||
{
|
||||
public:
|
||||
|
@ -18,14 +18,14 @@ class CKernel : public IKernel
|
|||
m_aName[0] = 0;
|
||||
m_pInterface = 0x0;
|
||||
}
|
||||
|
||||
|
||||
char m_aName[64];
|
||||
IInterface *m_pInterface;
|
||||
};
|
||||
|
||||
CInterfaceInfo m_aInterfaces[MAX_INTERFACES];
|
||||
int m_NumInterfaces;
|
||||
|
||||
|
||||
CInterfaceInfo *FindInterfaceInfo(const char *pName)
|
||||
{
|
||||
for(int i = 0; i < m_NumInterfaces; i++)
|
||||
|
@ -35,7 +35,7 @@ class CKernel : public IKernel
|
|||
}
|
||||
return 0x0;
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
|
||||
CKernel()
|
||||
|
@ -58,18 +58,18 @@ public:
|
|||
dbg_msg("kernel", "ERROR: couldn't register interface '%s'. maximum of interfaces reached", pName);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if(FindInterfaceInfo(pName) != 0)
|
||||
{
|
||||
dbg_msg("kernel", "ERROR: couldn't register interface '%s'. interface already exists", pName);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
pInterface->m_pKernel = this;
|
||||
m_aInterfaces[m_NumInterfaces].m_pInterface = pInterface;
|
||||
str_copy(m_aInterfaces[m_NumInterfaces].m_aName, pName, sizeof(m_aInterfaces[m_NumInterfaces].m_aName));
|
||||
m_NumInterfaces++;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -80,12 +80,12 @@ public:
|
|||
dbg_msg("kernel", "ERROR: couldn't reregister interface '%s'. interface doesn't exist");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
pInterface->m_pKernel = this;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
virtual IInterface *RequestInterfaceImpl(const char *pName)
|
||||
{
|
||||
CInterfaceInfo *pInfo = FindInterfaceInfo(pName);
|
||||
|
|
|
@ -10,7 +10,7 @@ class CMap : public IEngineMap
|
|||
CDataFileReader m_DataFile;
|
||||
public:
|
||||
CMap() {}
|
||||
|
||||
|
||||
virtual void *GetData(int Index) { return m_DataFile.GetData(Index); }
|
||||
virtual void *GetDataSwapped(int Index) { return m_DataFile.GetDataSwapped(Index); }
|
||||
virtual void UnloadData(int Index) { m_DataFile.UnloadData(Index); }
|
||||
|
@ -18,7 +18,7 @@ public:
|
|||
virtual void GetType(int Type, int *pStart, int *pNum) { m_DataFile.GetType(Type, pStart, pNum); }
|
||||
virtual void *FindItem(int Type, int ID) { return m_DataFile.FindItem(Type, ID); }
|
||||
virtual int NumItems() { return m_DataFile.NumItems(); }
|
||||
|
||||
|
||||
virtual void Unload()
|
||||
{
|
||||
m_DataFile.Close();
|
||||
|
@ -31,12 +31,12 @@ public:
|
|||
return false;
|
||||
return m_DataFile.Open(pStorage, pMapName, IStorage::TYPE_ALL);
|
||||
}
|
||||
|
||||
|
||||
virtual bool IsLoaded()
|
||||
{
|
||||
return m_DataFile.IsOpen();
|
||||
}
|
||||
|
||||
|
||||
virtual unsigned Crc()
|
||||
{
|
||||
return m_DataFile.Crc();
|
||||
|
|
|
@ -42,7 +42,7 @@ void CMapChecker::AddMaplist(CMapVersion *pMaplist, int Num)
|
|||
m_pFirst = pEntry;
|
||||
|
||||
str_copy(pEntry->m_aMapName, pMaplist[i].m_aName, sizeof(pEntry->m_aMapName));
|
||||
pEntry->m_MapCrc = (pMaplist[i].m_aCrc[0]<<24) | (pMaplist[i].m_aCrc[1]<<16) | (pMaplist[i].m_aCrc[2]<<8) | pMaplist[i].m_aCrc[3];
|
||||
pEntry->m_MapCrc = (pMaplist[i].m_aCrc[0]<<24) | (pMaplist[i].m_aCrc[1]<<16) | (pMaplist[i].m_aCrc[2]<<8) | pMaplist[i].m_aCrc[3];
|
||||
pEntry->m_MapSize = (pMaplist[i].m_aSize[0]<<24) | (pMaplist[i].m_aSize[1]<<16) | (pMaplist[i].m_aSize[2]<<8) | pMaplist[i].m_aSize[3];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ class CMapChecker
|
|||
unsigned m_MapSize;
|
||||
CWhitelistEntry *m_pNext;
|
||||
};
|
||||
|
||||
|
||||
class CHeap m_Whitelist;
|
||||
CWhitelistEntry *m_pFirst;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ public:
|
|||
char m_aHostname[128];
|
||||
NETADDR m_Addr;
|
||||
bool m_Valid;
|
||||
|
||||
|
||||
CHostLookup m_Lookup;
|
||||
} ;
|
||||
|
||||
|
@ -27,7 +27,7 @@ public:
|
|||
int m_NeedsUpdate;
|
||||
IEngine *m_pEngine;
|
||||
IStorage *m_pStorage;
|
||||
|
||||
|
||||
CMasterServer()
|
||||
{
|
||||
SetDefault();
|
||||
|
@ -38,10 +38,10 @@ public:
|
|||
virtual int RefreshAddresses(int Nettype)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if(m_NeedsUpdate != -1)
|
||||
return 0;
|
||||
|
||||
|
||||
dbg_msg("engine/mastersrv", "refreshing master server addresses");
|
||||
|
||||
// add lookup jobs
|
||||
|
@ -50,7 +50,7 @@ public:
|
|||
m_pEngine->HostLookup(&m_aMasterServers[i].m_Lookup, m_aMasterServers[i].m_aHostname, Nettype);
|
||||
m_aMasterServers[i].m_Valid = false;
|
||||
}
|
||||
|
||||
|
||||
m_NeedsUpdate = 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ public:
|
|||
if(m_NeedsUpdate != 1)
|
||||
return;
|
||||
m_NeedsUpdate = 0;
|
||||
|
||||
|
||||
for(int i = 0; i < MAX_MASTERSERVERS; i++)
|
||||
{
|
||||
if(m_aMasterServers[i].m_Lookup.m_Job.Status() != CJob::STATE_DONE)
|
||||
|
@ -78,7 +78,7 @@ public:
|
|||
m_aMasterServers[i].m_Valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!m_NeedsUpdate)
|
||||
{
|
||||
dbg_msg("engine/mastersrv", "saving addresses");
|
||||
|
@ -91,12 +91,12 @@ public:
|
|||
return m_NeedsUpdate;
|
||||
}
|
||||
|
||||
virtual NETADDR GetAddr(int Index)
|
||||
virtual NETADDR GetAddr(int Index)
|
||||
{
|
||||
return m_aMasterServers[Index].m_Addr;
|
||||
}
|
||||
|
||||
virtual const char *GetName(int Index)
|
||||
virtual const char *GetName(int Index)
|
||||
{
|
||||
return m_aMasterServers[Index].m_aHostname;
|
||||
}
|
||||
|
@ -136,12 +136,12 @@ public:
|
|||
int Count = 0;
|
||||
if(!m_pStorage)
|
||||
return -1;
|
||||
|
||||
|
||||
// try to open file
|
||||
File = m_pStorage->OpenFile("masters.cfg", IOFLAG_READ, IStorage::TYPE_SAVE);
|
||||
if(!File)
|
||||
return -1;
|
||||
|
||||
|
||||
LineReader.Init(File);
|
||||
while(1)
|
||||
{
|
||||
|
@ -166,7 +166,7 @@ public:
|
|||
//else
|
||||
// dbg_msg("engine/mastersrv", "warning: couldn't parse master server '%s'", pLine);
|
||||
}
|
||||
|
||||
|
||||
io_close(File);
|
||||
return 0;
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ public:
|
|||
|
||||
if(!m_pStorage)
|
||||
return -1;
|
||||
|
||||
|
||||
// try to open file
|
||||
File = m_pStorage->OpenFile("masters.cfg", IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
||||
if(!File)
|
||||
|
@ -189,10 +189,10 @@ public:
|
|||
net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr));
|
||||
char aBuf[1024];
|
||||
str_format(aBuf, sizeof(aBuf), "%s %s\n", m_aMasterServers[i].m_aHostname, aAddrStr);
|
||||
|
||||
|
||||
io_write(File, aBuf, str_length(aBuf));
|
||||
}
|
||||
|
||||
|
||||
io_close(File);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ void CHeap::NewChunk()
|
|||
{
|
||||
CChunk *pChunk;
|
||||
char *pMem;
|
||||
|
||||
|
||||
// allocate memory
|
||||
pMem = (char*)mem_alloc(sizeof(CChunk)+CHUNK_SIZE, 1);
|
||||
if(!pMem)
|
||||
|
@ -25,14 +25,14 @@ void CHeap::NewChunk()
|
|||
pChunk->m_pNext = (CChunk *)0x0;
|
||||
|
||||
pChunk->m_pNext = m_pCurrent;
|
||||
m_pCurrent = pChunk;
|
||||
m_pCurrent = pChunk;
|
||||
}
|
||||
|
||||
//****************
|
||||
void *CHeap::AllocateFromChunk(unsigned int Size)
|
||||
{
|
||||
char *pMem;
|
||||
|
||||
|
||||
// check if we need can fit the allocation
|
||||
if(m_pCurrent->m_pCurrent + Size > m_pCurrent->m_pEnd)
|
||||
return (void*)0x0;
|
||||
|
@ -66,14 +66,14 @@ void CHeap::Clear()
|
|||
{
|
||||
CChunk *pChunk = m_pCurrent;
|
||||
CChunk *pNext;
|
||||
|
||||
|
||||
while(pChunk)
|
||||
{
|
||||
pNext = pChunk->m_pNext;
|
||||
mem_free(pChunk);
|
||||
pChunk = pNext;
|
||||
}
|
||||
|
||||
|
||||
m_pCurrent = 0x0;
|
||||
}
|
||||
|
||||
|
@ -88,10 +88,10 @@ void *CHeap::Allocate(unsigned Size)
|
|||
{
|
||||
// allocate new chunk and add it to the heap
|
||||
NewChunk();
|
||||
|
||||
|
||||
// try to allocate again
|
||||
pMem = (char *)AllocateFromChunk(Size);
|
||||
}
|
||||
|
||||
|
||||
return pMem;
|
||||
}
|
||||
|
|
|
@ -11,20 +11,20 @@ class CHeap
|
|||
char *m_pEnd;
|
||||
CChunk *m_pNext;
|
||||
};
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
// how large each chunk should be
|
||||
CHUNK_SIZE = 1025*64,
|
||||
};
|
||||
|
||||
|
||||
CChunk *m_pCurrent;
|
||||
|
||||
|
||||
|
||||
|
||||
void Clear();
|
||||
void NewChunk();
|
||||
void *AllocateFromChunk(unsigned int Size);
|
||||
|
||||
|
||||
public:
|
||||
CHeap();
|
||||
~CHeap();
|
||||
|
|
|
@ -26,35 +26,35 @@ int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk)
|
|||
{
|
||||
CNetChunkHeader Header;
|
||||
unsigned char *pEnd = m_Data.m_aChunkData + m_Data.m_DataSize;
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
unsigned char *pData = m_Data.m_aChunkData;
|
||||
|
||||
|
||||
// check for old data to unpack
|
||||
if(!m_Valid || m_CurrentChunk >= m_Data.m_NumChunks)
|
||||
{
|
||||
Clear();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// TODO: add checking here so we don't read too far
|
||||
for(int i = 0; i < m_CurrentChunk; i++)
|
||||
{
|
||||
pData = Header.Unpack(pData);
|
||||
pData += Header.m_Size;
|
||||
}
|
||||
|
||||
|
||||
// unpack the header
|
||||
pData = Header.Unpack(pData);
|
||||
m_CurrentChunk++;
|
||||
|
||||
|
||||
if(pData+Header.m_Size > pEnd)
|
||||
{
|
||||
Clear();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// handle sequence stuff
|
||||
if(m_pConnection && (Header.m_Flags&NET_CHUNKFLAG_VITAL))
|
||||
{
|
||||
|
@ -76,7 +76,7 @@ int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk)
|
|||
continue; // take the next chunk in the packet
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// fill in the info
|
||||
pChunk->m_ClientID = m_ClientID;
|
||||
pChunk->m_Address = m_Addr;
|
||||
|
@ -116,7 +116,7 @@ void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct
|
|||
io_write(ms_DataLogSent, &pPacket->m_aChunkData, pPacket->m_DataSize);
|
||||
io_flush(ms_DataLogSent);
|
||||
}
|
||||
|
||||
|
||||
// compress
|
||||
CompressedSize = ms_Huffman.Compress(pPacket->m_aChunkData, pPacket->m_DataSize, &aBuffer[3], NET_MAX_PACKETSIZE-4);
|
||||
|
||||
|
@ -174,7 +174,7 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct
|
|||
io_write(ms_DataLogRecv, pBuffer, Size);
|
||||
io_flush(ms_DataLogRecv);
|
||||
}
|
||||
|
||||
|
||||
// read the packet
|
||||
pPacket->m_Flags = pBuffer[0]>>4;
|
||||
pPacket->m_Ack = ((pBuffer[0]&0xf)<<8) | pBuffer[1];
|
||||
|
@ -188,7 +188,7 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct
|
|||
dbg_msg("", "connection less packet too small, %d", Size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
pPacket->m_Flags = NET_PACKETFLAG_CONNLESS;
|
||||
pPacket->m_Ack = 0;
|
||||
pPacket->m_NumChunks = 0;
|
||||
|
@ -220,7 +220,7 @@ int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct
|
|||
io_write(ms_DataLogRecv, pPacket->m_aChunkData, pPacket->m_DataSize);
|
||||
io_flush(ms_DataLogRecv);
|
||||
}
|
||||
|
||||
|
||||
// return success
|
||||
return 0;
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ void CNetBase::SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int Con
|
|||
Construct.m_DataSize = 1+ExtraSize;
|
||||
Construct.m_aChunkData[0] = ControlMsg;
|
||||
mem_copy(&Construct.m_aChunkData[1], pExtra, ExtraSize);
|
||||
|
||||
|
||||
// send the control message
|
||||
CNetBase::SendPacket(Socket, pAddr, &Construct);
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ int CNetBase::IsSeqInBackroom(int Seq, int Ack)
|
|||
if(Seq <= Ack && Seq >= Bottom)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ CURRENT:
|
|||
unsigned char flags_ack; // 4bit flags, 4bit ack
|
||||
unsigned char ack; // 8 bit ack
|
||||
unsigned char num_chunks; // 8 bit chunks
|
||||
|
||||
|
||||
(unsigned char padding[3]) // 24 bit extra incase it's a connection less packet
|
||||
// this is to make sure that it's compatible with the
|
||||
// old protocol
|
||||
|
@ -30,11 +30,11 @@ enum
|
|||
NETSENDFLAG_VITAL=1,
|
||||
NETSENDFLAG_CONNLESS=2,
|
||||
NETSENDFLAG_FLUSH=4,
|
||||
|
||||
|
||||
NETSTATE_OFFLINE=0,
|
||||
NETSTATE_CONNECTING,
|
||||
NETSTATE_ONLINE,
|
||||
|
||||
|
||||
NETBANTYPE_SOFT=1,
|
||||
NETBANTYPE_DROP=2
|
||||
};
|
||||
|
@ -65,17 +65,17 @@ enum
|
|||
|
||||
NET_CHUNKFLAG_VITAL=1,
|
||||
NET_CHUNKFLAG_RESEND=2,
|
||||
|
||||
|
||||
NET_CTRLMSG_KEEPALIVE=0,
|
||||
NET_CTRLMSG_CONNECT=1,
|
||||
NET_CTRLMSG_CONNECTACCEPT=2,
|
||||
NET_CTRLMSG_ACCEPT=3,
|
||||
NET_CTRLMSG_CLOSE=4,
|
||||
|
||||
|
||||
NET_SERVER_MAXBANS=1024,
|
||||
|
||||
|
||||
NET_CONN_BUFFERSIZE=1024*32,
|
||||
|
||||
|
||||
NET_ENUM_TERMINATOR
|
||||
};
|
||||
|
||||
|
@ -100,7 +100,7 @@ public:
|
|||
int m_Flags;
|
||||
int m_Size;
|
||||
int m_Sequence;
|
||||
|
||||
|
||||
unsigned char *Pack(unsigned char *pData);
|
||||
unsigned char *Unpack(unsigned char *pData);
|
||||
};
|
||||
|
@ -138,30 +138,30 @@ private:
|
|||
unsigned short m_Sequence;
|
||||
unsigned short m_Ack;
|
||||
unsigned m_State;
|
||||
|
||||
|
||||
int m_Token;
|
||||
int m_RemoteClosed;
|
||||
|
||||
|
||||
TStaticRingBuffer<CNetChunkResend, NET_CONN_BUFFERSIZE> m_Buffer;
|
||||
|
||||
|
||||
int64 m_LastUpdateTime;
|
||||
int64 m_LastRecvTime;
|
||||
int64 m_LastSendTime;
|
||||
|
||||
|
||||
char m_ErrorString[256];
|
||||
|
||||
|
||||
CNetPacketConstruct m_Construct;
|
||||
|
||||
|
||||
NETADDR m_PeerAddr;
|
||||
NETSOCKET m_Socket;
|
||||
NETSTATS m_Stats;
|
||||
|
||||
|
||||
//
|
||||
void Reset();
|
||||
void ResetStats();
|
||||
void SetError(const char *pString);
|
||||
void AckChunks(int Ack);
|
||||
|
||||
|
||||
int QueueChunkEx(int Flags, int DataSize, const void *pData, int Sequence);
|
||||
void SendControl(int ControlMsg, const void *pExtra, int ExtraSize);
|
||||
void ResendChunk(CNetChunkResend *pResend);
|
||||
|
@ -173,7 +173,7 @@ public:
|
|||
void Disconnect(const char *pReason);
|
||||
|
||||
int Update();
|
||||
int Flush();
|
||||
int Flush();
|
||||
|
||||
int Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr);
|
||||
int QueueChunk(int Flags, int DataSize, const void *pData);
|
||||
|
@ -182,13 +182,13 @@ public:
|
|||
void SignalResend();
|
||||
int State() const { return m_State; }
|
||||
NETADDR PeerAddress() const { return m_PeerAddr; }
|
||||
|
||||
|
||||
void ResetErrorString() { m_ErrorString[0] = 0; }
|
||||
const char *ErrorString() const { return m_ErrorString; }
|
||||
|
||||
|
||||
// Needed for GotProblems in NetClient
|
||||
int64 LastRecvTime() const { return m_LastRecvTime; }
|
||||
|
||||
|
||||
int AckSequence() const { return m_Ack; }
|
||||
};
|
||||
|
||||
|
@ -196,7 +196,7 @@ struct CNetRecvUnpacker
|
|||
{
|
||||
public:
|
||||
bool m_Valid;
|
||||
|
||||
|
||||
NETADDR m_Addr;
|
||||
CNetConnection *m_pConnection;
|
||||
int m_CurrentChunk;
|
||||
|
@ -207,7 +207,7 @@ public:
|
|||
CNetRecvUnpacker() { Clear(); }
|
||||
void Clear();
|
||||
void Start(const NETADDR *pAddr, CNetConnection *pConnection, int ClientID);
|
||||
int FetchChunk(CNetChunk *pChunk);
|
||||
int FetchChunk(CNetChunk *pChunk);
|
||||
};
|
||||
|
||||
// server side
|
||||
|
@ -220,29 +220,29 @@ public:
|
|||
int m_Expires;
|
||||
char m_Reason[128];
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
class CSlot
|
||||
{
|
||||
public:
|
||||
CNetConnection m_Connection;
|
||||
};
|
||||
|
||||
|
||||
class CBan
|
||||
{
|
||||
public:
|
||||
CBanInfo m_Info;
|
||||
|
||||
|
||||
// hash list
|
||||
CBan *m_pHashNext;
|
||||
CBan *m_pHashPrev;
|
||||
|
||||
|
||||
// used or free list
|
||||
CBan *m_pNext;
|
||||
CBan *m_pPrev;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
NETSOCKET m_Socket;
|
||||
CSlot m_aSlots[NET_MAX_CLIENTS];
|
||||
int m_MaxClients;
|
||||
|
@ -256,23 +256,23 @@ private:
|
|||
NETFUNC_NEWCLIENT m_pfnNewClient;
|
||||
NETFUNC_DELCLIENT m_pfnDelClient;
|
||||
void *m_UserPtr;
|
||||
|
||||
|
||||
CNetRecvUnpacker m_RecvUnpacker;
|
||||
|
||||
|
||||
void BanRemoveByObject(CBan *pBan);
|
||||
|
||||
|
||||
public:
|
||||
int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser);
|
||||
|
||||
//
|
||||
bool Open(NETADDR BindAddr, int MaxClients, int MaxClientsPerIP, int Flags);
|
||||
int Close();
|
||||
|
||||
|
||||
//
|
||||
int Recv(CNetChunk *pChunk);
|
||||
int Send(CNetChunk *pChunk);
|
||||
int Update();
|
||||
|
||||
|
||||
//
|
||||
int Drop(int ClientID, const char *pReason);
|
||||
|
||||
|
@ -304,21 +304,21 @@ public:
|
|||
// openness
|
||||
bool Open(NETADDR BindAddr, int Flags);
|
||||
int Close();
|
||||
|
||||
|
||||
// connection state
|
||||
int Disconnect(const char *Reason);
|
||||
int Connect(NETADDR *Addr);
|
||||
|
||||
|
||||
// communication
|
||||
int Recv(CNetChunk *Chunk);
|
||||
int Send(CNetChunk *Chunk);
|
||||
|
||||
|
||||
// pumping
|
||||
int Update();
|
||||
int Flush();
|
||||
|
||||
int ResetErrorString();
|
||||
|
||||
|
||||
// error and state
|
||||
int State();
|
||||
int GotProblems();
|
||||
|
@ -339,14 +339,14 @@ public:
|
|||
static void Init();
|
||||
static int Compress(const void *pData, int DataSize, void *pOutput, int OutputSize);
|
||||
static int Decompress(const void *pData, int DataSize, void *pOutput, int OutputSize);
|
||||
|
||||
|
||||
static void SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize);
|
||||
static void SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize);
|
||||
static void SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket);
|
||||
static int UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket);
|
||||
|
||||
// The backroom is ack-NET_MAX_SEQUENCE/2. Used for knowing if we acked a packet or not
|
||||
static int IsSeqInBackroom(int Seq, int Ack);
|
||||
static int IsSeqInBackroom(int Seq, int Ack);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ int CNetClient::Recv(CNetChunk *pChunk)
|
|||
// check for a chunk
|
||||
if(m_RecvUnpacker.FetchChunk(pChunk))
|
||||
return 1;
|
||||
|
||||
|
||||
// TODO: empty the recvinfo
|
||||
NETADDR Addr;
|
||||
int Bytes = net_udp_recv(m_Socket, &Addr, m_RecvUnpacker.m_aBuffer, NET_MAX_PACKETSIZE);
|
||||
|
@ -98,7 +98,7 @@ int CNetClient::Send(CNetChunk *pChunk)
|
|||
dbg_msg("netclient", "chunk payload too big. %d. dropping chunk", pChunk->m_DataSize);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if(pChunk->m_Flags&NETSENDFLAG_CONNLESS)
|
||||
{
|
||||
// send connectionless packet
|
||||
|
@ -108,10 +108,10 @@ int CNetClient::Send(CNetChunk *pChunk)
|
|||
{
|
||||
int Flags = 0;
|
||||
dbg_assert(pChunk->m_ClientID == 0, "errornous client id");
|
||||
|
||||
|
||||
if(pChunk->m_Flags&NETSENDFLAG_VITAL)
|
||||
Flags = NET_CHUNKFLAG_VITAL;
|
||||
|
||||
|
||||
m_Connection.QueueChunk(Flags, pChunk->m_DataSize, pChunk->m_pData);
|
||||
|
||||
if(pChunk->m_Flags&NETSENDFLAG_FLUSH)
|
||||
|
|
|
@ -14,16 +14,16 @@ void CNetConnection::Reset()
|
|||
m_Sequence = 0;
|
||||
m_Ack = 0;
|
||||
m_RemoteClosed = 0;
|
||||
|
||||
|
||||
m_State = NET_CONNSTATE_OFFLINE;
|
||||
m_LastSendTime = 0;
|
||||
m_LastRecvTime = 0;
|
||||
m_LastUpdateTime = 0;
|
||||
m_Token = -1;
|
||||
mem_zero(&m_PeerAddr, sizeof(m_PeerAddr));
|
||||
|
||||
|
||||
m_Buffer.Init();
|
||||
|
||||
|
||||
mem_zero(&m_Construct, sizeof(m_Construct));
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@ void CNetConnection::Init(NETSOCKET Socket)
|
|||
{
|
||||
Reset();
|
||||
ResetStats();
|
||||
|
||||
|
||||
m_Socket = Socket;
|
||||
mem_zero(m_ErrorString, sizeof(m_ErrorString));
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ void CNetConnection::AckChunks(int Ack)
|
|||
CNetChunkResend *pResend = m_Buffer.First();
|
||||
if(!pResend)
|
||||
break;
|
||||
|
||||
|
||||
if(CNetBase::IsSeqInBackroom(pResend->m_Sequence, Ack))
|
||||
m_Buffer.PopFirst();
|
||||
else
|
||||
|
@ -75,10 +75,10 @@ int CNetConnection::Flush()
|
|||
// send of the packets
|
||||
m_Construct.m_Ack = m_Ack;
|
||||
CNetBase::SendPacket(m_Socket, &m_PeerAddr, &m_Construct);
|
||||
|
||||
|
||||
// update send times
|
||||
m_LastSendTime = time_get();
|
||||
|
||||
|
||||
// clear construct so we can start building a new package
|
||||
mem_zero(&m_Construct, sizeof(m_Construct));
|
||||
return NumChunks;
|
||||
|
@ -87,7 +87,7 @@ int CNetConnection::Flush()
|
|||
int CNetConnection::QueueChunkEx(int Flags, int DataSize, const void *pData, int Sequence)
|
||||
{
|
||||
unsigned char *pChunkData;
|
||||
|
||||
|
||||
// check if we have space for it, if not, flush the connection
|
||||
if(m_Construct.m_DataSize + DataSize + NET_MAX_CHUNKHEADERSIZE > (int)sizeof(m_Construct.m_aChunkData))
|
||||
Flush();
|
||||
|
@ -105,9 +105,9 @@ int CNetConnection::QueueChunkEx(int Flags, int DataSize, const void *pData, int
|
|||
//
|
||||
m_Construct.m_NumChunks++;
|
||||
m_Construct.m_DataSize = (int)(pChunkData-m_Construct.m_aChunkData);
|
||||
|
||||
|
||||
// set packet flags aswell
|
||||
|
||||
|
||||
if(Flags&NET_CHUNKFLAG_VITAL && !(Flags&NET_CHUNKFLAG_RESEND))
|
||||
{
|
||||
// save packet if we need to resend
|
||||
|
@ -163,7 +163,7 @@ int CNetConnection::Connect(NETADDR *pAddr)
|
|||
{
|
||||
if(State() != NET_CONNSTATE_OFFLINE)
|
||||
return -1;
|
||||
|
||||
|
||||
// init connection
|
||||
Reset();
|
||||
m_PeerAddr = *pAddr;
|
||||
|
@ -189,14 +189,14 @@ void CNetConnection::Disconnect(const char *pReason)
|
|||
if(pReason)
|
||||
str_copy(m_ErrorString, pReason, sizeof(m_ErrorString));
|
||||
}
|
||||
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
|
||||
{
|
||||
int64 Now = time_get();
|
||||
|
||||
|
||||
// check if resend is requested
|
||||
if(pPacket->m_Flags&NET_PACKETFLAG_RESEND)
|
||||
Resend();
|
||||
|
@ -205,14 +205,14 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
|
|||
if(pPacket->m_Flags&NET_PACKETFLAG_CONTROL)
|
||||
{
|
||||
int CtrlMsg = pPacket->m_aChunkData[0];
|
||||
|
||||
|
||||
if(CtrlMsg == NET_CTRLMSG_CLOSE)
|
||||
{
|
||||
if(net_addr_comp(&m_PeerAddr, pAddr) == 0)
|
||||
{
|
||||
m_State = NET_CONNSTATE_ERROR;
|
||||
m_RemoteClosed = 1;
|
||||
|
||||
|
||||
if(pPacket->m_DataSize)
|
||||
{
|
||||
// make sure to sanitize the error string form the other party
|
||||
|
@ -222,17 +222,17 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
|
|||
else
|
||||
str_copy(Str, (char *)pPacket->m_aChunkData, sizeof(Str));
|
||||
str_sanitize_strong(Str);
|
||||
|
||||
|
||||
// set the error string
|
||||
SetError(Str);
|
||||
}
|
||||
else
|
||||
SetError("No reason given");
|
||||
|
||||
|
||||
if(g_Config.m_Debug)
|
||||
dbg_msg("conn", "closed reason='%s'", ErrorString());
|
||||
}
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -249,7 +249,7 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
|
|||
m_LastUpdateTime = Now;
|
||||
SendControl(NET_CTRLMSG_CONNECTACCEPT, 0, 0);
|
||||
if(g_Config.m_Debug)
|
||||
dbg_msg("connection", "got connection, sending connect+accept");
|
||||
dbg_msg("connection", "got connection, sending connect+accept");
|
||||
}
|
||||
}
|
||||
else if(State() == NET_CONNSTATE_CONNECT)
|
||||
|
@ -276,13 +276,13 @@ int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr)
|
|||
dbg_msg("connection", "connecting online");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(State() == NET_CONNSTATE_ONLINE)
|
||||
{
|
||||
m_LastRecvTime = Now;
|
||||
AckChunks(pPacket->m_Ack);
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -292,7 +292,7 @@ int CNetConnection::Update()
|
|||
|
||||
if(State() == NET_CONNSTATE_OFFLINE || State() == NET_CONNSTATE_ERROR)
|
||||
return 0;
|
||||
|
||||
|
||||
// check for timeout
|
||||
if(State() != NET_CONNSTATE_OFFLINE &&
|
||||
State() != NET_CONNSTATE_CONNECT &&
|
||||
|
@ -320,7 +320,7 @@ int CNetConnection::Update()
|
|||
ResendChunk(pResend);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// send keep alives if nothing has happend for 250ms
|
||||
if(State() == NET_CONNSTATE_ONLINE)
|
||||
{
|
||||
|
@ -330,7 +330,7 @@ int CNetConnection::Update()
|
|||
if(NumFlushedChunks && g_Config.m_Debug)
|
||||
dbg_msg("connection", "flushed connection due to timeout. %d chunks.", NumFlushedChunks);
|
||||
}
|
||||
|
||||
|
||||
if(time_get()-m_LastSendTime > time_freq())
|
||||
SendControl(NET_CTRLMSG_KEEPALIVE, 0, 0);
|
||||
}
|
||||
|
@ -344,6 +344,6 @@ int CNetConnection::Update()
|
|||
if(time_get()-m_LastSendTime > time_freq()/2) // send a new connect/accept every 500ms
|
||||
SendControl(NET_CTRLMSG_CONNECTACCEPT, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
Object->Prev = (struct CBan *)0; \
|
||||
Object->Next = First; \
|
||||
First = Object; }
|
||||
|
||||
|
||||
#define MACRO_LIST_LINK_AFTER(Object, After, Prev, Next) \
|
||||
{ Object->Prev = After; \
|
||||
Object->Next = After->Next; \
|
||||
|
@ -22,7 +22,7 @@
|
|||
if(Object->Prev) Object->Prev->Next = Object->Next; \
|
||||
else First = Object->Next; \
|
||||
Object->Next = 0; Object->Prev = 0; }
|
||||
|
||||
|
||||
#define MACRO_LIST_FIND(Start, Next, Expression) \
|
||||
{ while(Start && !(Expression)) Start = Start->Next; }
|
||||
|
||||
|
@ -30,12 +30,12 @@ bool CNetServer::Open(NETADDR BindAddr, int MaxClients, int MaxClientsPerIP, int
|
|||
{
|
||||
// zero out the whole structure
|
||||
mem_zero(this, sizeof(*this));
|
||||
|
||||
|
||||
// open socket
|
||||
m_Socket = net_udp_create(BindAddr);
|
||||
if(!m_Socket.type)
|
||||
return false;
|
||||
|
||||
|
||||
// clamp clients
|
||||
m_MaxClients = MaxClients;
|
||||
if(m_MaxClients > NET_MAX_CLIENTS)
|
||||
|
@ -44,17 +44,17 @@ bool CNetServer::Open(NETADDR BindAddr, int MaxClients, int MaxClientsPerIP, int
|
|||
m_MaxClients = 1;
|
||||
|
||||
m_MaxClientsPerIP = MaxClientsPerIP;
|
||||
|
||||
|
||||
for(int i = 0; i < NET_MAX_CLIENTS; i++)
|
||||
m_aSlots[i].m_Connection.Init(m_Socket);
|
||||
|
||||
|
||||
// setup all pointers for bans
|
||||
for(int i = 1; i < NET_SERVER_MAXBANS-1; i++)
|
||||
{
|
||||
m_BanPool[i].m_pNext = &m_BanPool[i+1];
|
||||
m_BanPool[i].m_pPrev = &m_BanPool[i-1];
|
||||
}
|
||||
|
||||
|
||||
m_BanPool[0].m_pNext = &m_BanPool[1];
|
||||
m_BanPool[NET_SERVER_MAXBANS-1].m_pPrev = &m_BanPool[NET_SERVER_MAXBANS-2];
|
||||
m_BanPool_FirstFree = &m_BanPool[0];
|
||||
|
@ -88,9 +88,9 @@ int CNetServer::Drop(int ClientID, const char *pReason)
|
|||
);*/
|
||||
if(m_pfnDelClient)
|
||||
m_pfnDelClient(ClientID, pReason, m_UserPtr);
|
||||
|
||||
|
||||
m_aSlots[ClientID].m_Connection.Disconnect(pReason);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -99,7 +99,7 @@ int CNetServer::BanGet(int Index, CBanInfo *pInfo)
|
|||
CBan *pBan;
|
||||
for(pBan = m_BanPool_FirstUsed; pBan && Index; pBan = pBan->m_pNext, Index--)
|
||||
{}
|
||||
|
||||
|
||||
if(!pBan)
|
||||
return 0;
|
||||
*pInfo = pBan->m_Info;
|
||||
|
@ -134,15 +134,15 @@ int CNetServer::BanRemove(NETADDR Addr)
|
|||
int IpHash = (Addr.ip[0]+Addr.ip[1]+Addr.ip[2]+Addr.ip[3]+Addr.ip[4]+Addr.ip[5]+Addr.ip[6]+Addr.ip[7]+
|
||||
Addr.ip[8]+Addr.ip[9]+Addr.ip[10]+Addr.ip[11]+Addr.ip[12]+Addr.ip[13]+Addr.ip[14]+Addr.ip[15])&0xff;
|
||||
CBan *pBan = m_aBans[IpHash];
|
||||
|
||||
|
||||
MACRO_LIST_FIND(pBan, m_pHashNext, net_addr_comp(&pBan->m_Info.m_Addr, &Addr) == 0);
|
||||
|
||||
|
||||
if(pBan)
|
||||
{
|
||||
BanRemoveByObject(pBan);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -152,13 +152,13 @@ int CNetServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
|
|||
Addr.ip[8]+Addr.ip[9]+Addr.ip[10]+Addr.ip[11]+Addr.ip[12]+Addr.ip[13]+Addr.ip[14]+Addr.ip[15])&0xff;
|
||||
int Stamp = -1;
|
||||
CBan *pBan;
|
||||
|
||||
|
||||
// remove the port
|
||||
Addr.port = 0;
|
||||
|
||||
|
||||
if(Seconds)
|
||||
Stamp = time_timestamp() + Seconds;
|
||||
|
||||
|
||||
// search to see if it already exists
|
||||
pBan = m_aBans[IpHash];
|
||||
MACRO_LIST_FIND(pBan, m_pHashNext, net_addr_comp(&pBan->m_Info.m_Addr, &Addr) == 0);
|
||||
|
@ -168,29 +168,29 @@ int CNetServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
|
|||
pBan->m_Info.m_Expires = Stamp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if(!m_BanPool_FirstFree)
|
||||
return -1;
|
||||
|
||||
// fetch and clear the new ban
|
||||
pBan = m_BanPool_FirstFree;
|
||||
MACRO_LIST_UNLINK(pBan, m_BanPool_FirstFree, m_pPrev, m_pNext);
|
||||
|
||||
|
||||
// setup the ban info
|
||||
pBan->m_Info.m_Expires = Stamp;
|
||||
pBan->m_Info.m_Addr = Addr;
|
||||
str_copy(pBan->m_Info.m_Reason, pReason, sizeof(pBan->m_Info.m_Reason));
|
||||
|
||||
|
||||
// add it to the ban hash
|
||||
MACRO_LIST_LINK_FIRST(pBan, m_aBans[IpHash], m_pHashPrev, m_pHashNext);
|
||||
|
||||
|
||||
// insert it into the used list
|
||||
{
|
||||
if(m_BanPool_FirstUsed)
|
||||
{
|
||||
CBan *pInsertAfter = m_BanPool_FirstUsed;
|
||||
MACRO_LIST_FIND(pInsertAfter, m_pNext, Stamp < pInsertAfter->m_Info.m_Expires);
|
||||
|
||||
|
||||
if(pInsertAfter)
|
||||
pInsertAfter = pInsertAfter->m_pPrev;
|
||||
else
|
||||
|
@ -200,7 +200,7 @@ int CNetServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
|
|||
while(pInsertAfter->m_pNext)
|
||||
pInsertAfter = pInsertAfter->m_pNext;
|
||||
}
|
||||
|
||||
|
||||
if(pInsertAfter)
|
||||
{
|
||||
MACRO_LIST_LINK_AFTER(pBan, pInsertAfter, m_pPrev, m_pNext);
|
||||
|
@ -220,7 +220,7 @@ int CNetServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
|
|||
{
|
||||
char Buf[128];
|
||||
NETADDR BanAddr;
|
||||
|
||||
|
||||
int Mins = (Seconds + 59) / 60;
|
||||
if(Mins)
|
||||
{
|
||||
|
@ -231,12 +231,12 @@ int CNetServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
|
|||
}
|
||||
else
|
||||
str_format(Buf, sizeof(Buf), "You have been banned for life (%s)", pReason);
|
||||
|
||||
|
||||
for(int i = 0; i < MaxClients(); i++)
|
||||
{
|
||||
BanAddr = m_aSlots[i].m_Connection.PeerAddress();
|
||||
BanAddr.port = 0;
|
||||
|
||||
|
||||
if(net_addr_comp(&Addr, &BanAddr) == 0)
|
||||
Drop(i, Buf);
|
||||
}
|
||||
|
@ -253,14 +253,14 @@ int CNetServer::Update()
|
|||
if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ERROR)
|
||||
Drop(i, m_aSlots[i].m_Connection.ErrorString());
|
||||
}
|
||||
|
||||
|
||||
// remove expired bans
|
||||
while(m_BanPool_FirstUsed && m_BanPool_FirstUsed->m_Info.m_Expires < Now)
|
||||
{
|
||||
CBan *pBan = m_BanPool_FirstUsed;
|
||||
BanRemoveByObject(pBan);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -270,22 +270,22 @@ int CNetServer::Update()
|
|||
int CNetServer::Recv(CNetChunk *pChunk)
|
||||
{
|
||||
unsigned Now = time_timestamp();
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
NETADDR Addr;
|
||||
|
||||
|
||||
// check for a chunk
|
||||
if(m_RecvUnpacker.FetchChunk(pChunk))
|
||||
return 1;
|
||||
|
||||
|
||||
// TODO: empty the recvinfo
|
||||
int Bytes = net_udp_recv(m_Socket, &Addr, m_RecvUnpacker.m_aBuffer, NET_MAX_PACKETSIZE);
|
||||
|
||||
// no more packets for now
|
||||
if(Bytes <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if(CNetBase::UnpackPacket(m_RecvUnpacker.m_aBuffer, Bytes, &m_RecvUnpacker.m_Data) == 0)
|
||||
{
|
||||
CBan *pBan = 0;
|
||||
|
@ -294,14 +294,14 @@ int CNetServer::Recv(CNetChunk *pChunk)
|
|||
BanAddr.ip[8]+BanAddr.ip[9]+BanAddr.ip[10]+BanAddr.ip[11]+BanAddr.ip[12]+BanAddr.ip[13]+BanAddr.ip[14]+BanAddr.ip[15])&0xff;
|
||||
int Found = 0;
|
||||
BanAddr.port = 0;
|
||||
|
||||
|
||||
// search a ban
|
||||
for(pBan = m_aBans[IpHash]; pBan; pBan = pBan->m_pHashNext)
|
||||
{
|
||||
if(net_addr_comp(&pBan->m_Info.m_Addr, &BanAddr) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// check if we just should drop the packet
|
||||
if(pBan)
|
||||
{
|
||||
|
@ -320,7 +320,7 @@ int CNetServer::Recv(CNetChunk *pChunk)
|
|||
CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, BanStr, str_length(BanStr)+1);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS)
|
||||
{
|
||||
pChunk->m_Flags = NETSENDFLAG_CONNLESS;
|
||||
|
@ -331,12 +331,12 @@ int CNetServer::Recv(CNetChunk *pChunk)
|
|||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
// TODO: check size here
|
||||
if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONTROL && m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_CONNECT)
|
||||
{
|
||||
Found = 0;
|
||||
|
||||
|
||||
// check if we already got this client
|
||||
for(int i = 0; i < MaxClients(); i++)
|
||||
{
|
||||
|
@ -348,7 +348,7 @@ int CNetServer::Recv(CNetChunk *pChunk)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// client that wants to connect
|
||||
if(!Found)
|
||||
{
|
||||
|
@ -386,7 +386,7 @@ int CNetServer::Recv(CNetChunk *pChunk)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!Found)
|
||||
{
|
||||
const char FullMsg[] = "This server is full";
|
||||
|
@ -423,7 +423,7 @@ int CNetServer::Send(CNetChunk *pChunk)
|
|||
dbg_msg("netserver", "packet payload too big. %d. dropping packet", pChunk->m_DataSize);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if(pChunk->m_Flags&NETSENDFLAG_CONNLESS)
|
||||
{
|
||||
// send connectionless packet
|
||||
|
@ -434,10 +434,10 @@ int CNetServer::Send(CNetChunk *pChunk)
|
|||
int Flags = 0;
|
||||
dbg_assert(pChunk->m_ClientID >= 0, "errornous client id");
|
||||
dbg_assert(pChunk->m_ClientID < MaxClients(), "errornous client id");
|
||||
|
||||
|
||||
if(pChunk->m_Flags&NETSENDFLAG_VITAL)
|
||||
Flags = NET_CHUNKFLAG_VITAL;
|
||||
|
||||
|
||||
if(m_aSlots[pChunk->m_ClientID].m_Connection.QueueChunk(Flags, pChunk->m_DataSize, pChunk->m_pData) == 0)
|
||||
{
|
||||
if(pChunk->m_Flags&NETSENDFLAG_FLUSH)
|
||||
|
|
|
@ -17,7 +17,7 @@ void CPacker::AddInt(int i)
|
|||
{
|
||||
if(m_Error)
|
||||
return;
|
||||
|
||||
|
||||
// make sure that we have space enough
|
||||
if(m_pEnd - m_pCurrent < 6)
|
||||
{
|
||||
|
@ -32,7 +32,7 @@ void CPacker::AddString(const char *pStr, int Limit)
|
|||
{
|
||||
if(m_Error)
|
||||
return;
|
||||
|
||||
|
||||
//
|
||||
if(Limit > 0)
|
||||
{
|
||||
|
@ -40,7 +40,7 @@ void CPacker::AddString(const char *pStr, int Limit)
|
|||
{
|
||||
*m_pCurrent++ = *pStr++;
|
||||
Limit--;
|
||||
|
||||
|
||||
if(m_pCurrent >= m_pEnd)
|
||||
{
|
||||
m_Error = 1;
|
||||
|
@ -69,13 +69,13 @@ void CPacker::AddRaw(const void *pData, int Size)
|
|||
{
|
||||
if(m_Error)
|
||||
return;
|
||||
|
||||
|
||||
if(m_pCurrent+Size >= m_pEnd)
|
||||
{
|
||||
m_Error = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const unsigned char *pSrc = (const unsigned char *)pData;
|
||||
while(Size)
|
||||
{
|
||||
|
@ -97,13 +97,13 @@ int CUnpacker::GetInt()
|
|||
{
|
||||
if(m_Error)
|
||||
return 0;
|
||||
|
||||
|
||||
if(m_pCurrent >= m_pEnd)
|
||||
{
|
||||
m_Error = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int i;
|
||||
m_pCurrent = CVariableInt::Unpack(m_pCurrent, &i);
|
||||
if(m_pCurrent > m_pEnd)
|
||||
|
@ -118,7 +118,7 @@ const char *CUnpacker::GetString(int SanitizeType)
|
|||
{
|
||||
if(m_Error || m_pCurrent >= m_pEnd)
|
||||
return "";
|
||||
|
||||
|
||||
char *pPtr = (char *)m_pCurrent;
|
||||
while(*m_pCurrent) // skip the string
|
||||
{
|
||||
|
@ -130,7 +130,7 @@ const char *CUnpacker::GetString(int SanitizeType)
|
|||
}
|
||||
}
|
||||
m_pCurrent++;
|
||||
|
||||
|
||||
// sanitize all strings
|
||||
if(SanitizeType&SANITIZE)
|
||||
str_sanitize(pPtr);
|
||||
|
@ -144,7 +144,7 @@ const unsigned char *CUnpacker::GetRaw(int Size)
|
|||
const unsigned char *pPtr = m_pCurrent;
|
||||
if(m_Error)
|
||||
return 0;
|
||||
|
||||
|
||||
// check for nasty sizes
|
||||
if(Size < 0 || m_pCurrent+Size > m_pEnd)
|
||||
{
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
void AddInt(int i);
|
||||
void AddString(const char *pStr, int Limit);
|
||||
void AddRaw(const void *pData, int Size);
|
||||
|
||||
|
||||
int Size() const { return (int)(m_pCurrent-m_aBuffer); }
|
||||
const unsigned char *Data() const { return m_aBuffer; }
|
||||
bool Error() const { return m_Error; }
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
|
||||
/*
|
||||
Connection diagram - How the initilization works.
|
||||
|
||||
|
||||
Client -> INFO -> Server
|
||||
Contains version info, name, and some other info.
|
||||
|
||||
|
||||
Client <- MAP <- Server
|
||||
Contains current map.
|
||||
|
||||
|
||||
Client -> READY -> Server
|
||||
The client has loaded the map and is ready to go,
|
||||
but the mod needs to send it's information aswell.
|
||||
|
@ -21,7 +21,7 @@
|
|||
mods_connected is called on the server.
|
||||
The client should call client_entergame when the
|
||||
mod has done it's initilization.
|
||||
|
||||
|
||||
Client -> ENTERGAME -> Server
|
||||
Tells the server to start sending snapshots.
|
||||
client_entergame and server_client_enter is called.
|
||||
|
@ -31,11 +31,11 @@
|
|||
enum
|
||||
{
|
||||
NETMSG_NULL=0,
|
||||
|
||||
|
||||
// the first thing sent by the client
|
||||
// contains the version info for the client
|
||||
NETMSG_INFO=1,
|
||||
|
||||
|
||||
// sent by server
|
||||
NETMSG_MAP_CHANGE, // sent when client should switch map
|
||||
NETMSG_MAP_DATA, // map transfer, contains a chunk of the map file
|
||||
|
@ -50,18 +50,18 @@ enum
|
|||
|
||||
NETMSG_AUTH_CHALLANGE, //
|
||||
NETMSG_AUTH_RESULT, //
|
||||
|
||||
|
||||
// sent by client
|
||||
NETMSG_READY, //
|
||||
NETMSG_ENTERGAME,
|
||||
NETMSG_INPUT, // contains the inputdata from the client
|
||||
NETMSG_RCON_CMD, //
|
||||
NETMSG_RCON_CMD, //
|
||||
NETMSG_RCON_AUTH, //
|
||||
NETMSG_REQUEST_MAP_DATA,//
|
||||
|
||||
NETMSG_AUTH_START, //
|
||||
NETMSG_AUTH_RESPONSE, //
|
||||
|
||||
|
||||
// sent by both
|
||||
NETMSG_PING,
|
||||
NETMSG_PING_REPLY,
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include <base/system.h>
|
||||
|
||||
#include "ringbuffer.h"
|
||||
|
||||
|
||||
CRingBufferBase::CItem *CRingBufferBase::NextBlock(CItem *pItem)
|
||||
{
|
||||
if(pItem->m_pNext)
|
||||
|
@ -27,19 +27,19 @@ CRingBufferBase::CItem *CRingBufferBase::MergeBack(CItem *pItem)
|
|||
// merge the blocks
|
||||
pItem->m_pPrev->m_Size += pItem->m_Size;
|
||||
pItem->m_pPrev->m_pNext = pItem->m_pNext;
|
||||
|
||||
|
||||
// fixup pointers
|
||||
if(pItem->m_pNext)
|
||||
pItem->m_pNext->m_pPrev = pItem->m_pPrev;
|
||||
else
|
||||
m_pLast = pItem->m_pPrev;
|
||||
|
||||
|
||||
if(pItem == m_pProduce)
|
||||
m_pProduce = pItem->m_pPrev;
|
||||
|
||||
|
||||
if(pItem == m_pConsume)
|
||||
m_pConsume = pItem->m_pPrev;
|
||||
|
||||
|
||||
// return the current block
|
||||
return pItem->m_pPrev;
|
||||
}
|
||||
|
@ -54,8 +54,8 @@ void CRingBufferBase::Init(void *pMemory, int Size, int Flags)
|
|||
m_pLast = m_pFirst;
|
||||
m_pProduce = m_pFirst;
|
||||
m_pConsume = m_pFirst;
|
||||
m_Flags = Flags;
|
||||
|
||||
m_Flags = Flags;
|
||||
|
||||
}
|
||||
|
||||
void *CRingBufferBase::Allocate(int Size)
|
||||
|
@ -67,7 +67,7 @@ void *CRingBufferBase::Allocate(int Size)
|
|||
if(WantedSize > m_Size)
|
||||
return 0;
|
||||
|
||||
while(1)
|
||||
while(1)
|
||||
{
|
||||
// check for space
|
||||
if(m_pProduce->m_Free)
|
||||
|
@ -81,7 +81,7 @@ void *CRingBufferBase::Allocate(int Size)
|
|||
pBlock = m_pFirst;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(pBlock)
|
||||
break;
|
||||
else
|
||||
|
@ -96,9 +96,9 @@ void *CRingBufferBase::Allocate(int Size)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// okey, we have our block
|
||||
|
||||
|
||||
// split the block if needed
|
||||
if(pBlock->m_Size > WantedSize+(int)sizeof(CItem))
|
||||
{
|
||||
|
@ -108,19 +108,19 @@ void *CRingBufferBase::Allocate(int Size)
|
|||
if(pNewItem->m_pNext)
|
||||
pNewItem->m_pNext->m_pPrev = pNewItem;
|
||||
pBlock->m_pNext = pNewItem;
|
||||
|
||||
|
||||
pNewItem->m_Free = 1;
|
||||
pNewItem->m_Size = pBlock->m_Size - WantedSize;
|
||||
pBlock->m_Size = WantedSize;
|
||||
|
||||
|
||||
if(!pNewItem->m_pNext)
|
||||
m_pLast = pNewItem;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// set next block
|
||||
m_pProduce = NextBlock(pBlock);
|
||||
|
||||
|
||||
// set as used and return the item pointer
|
||||
pBlock->m_Free = 0;
|
||||
return (void *)(pBlock+1);
|
||||
|
@ -130,13 +130,13 @@ int CRingBufferBase::PopFirst()
|
|||
{
|
||||
if(m_pConsume->m_Free)
|
||||
return 0;
|
||||
|
||||
|
||||
// set the free flag
|
||||
m_pConsume->m_Free = 1;
|
||||
|
||||
|
||||
// previous block is also free, merge them
|
||||
m_pConsume = MergeBack(m_pConsume);
|
||||
|
||||
|
||||
// advance the consume pointer
|
||||
m_pConsume = NextBlock(m_pConsume);
|
||||
while(m_pConsume->m_Free && m_pConsume != m_pProduce)
|
||||
|
@ -144,7 +144,7 @@ int CRingBufferBase::PopFirst()
|
|||
m_pConsume = MergeBack(m_pConsume);
|
||||
m_pConsume = NextBlock(m_pConsume);
|
||||
}
|
||||
|
||||
|
||||
// in the case that we have catched up with the produce pointer
|
||||
// we might stand on a free block so merge em
|
||||
MergeBack(m_pConsume);
|
||||
|
@ -155,7 +155,7 @@ int CRingBufferBase::PopFirst()
|
|||
void *CRingBufferBase::Prev(void *pCurrent)
|
||||
{
|
||||
CItem *pItem = ((CItem *)pCurrent) - 1;
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
pItem = PrevBlock(pItem);
|
||||
|
@ -169,7 +169,7 @@ void *CRingBufferBase::Prev(void *pCurrent)
|
|||
void *CRingBufferBase::Next(void *pCurrent)
|
||||
{
|
||||
CItem *pItem = ((CItem *)pCurrent) - 1;
|
||||
|
||||
|
||||
while(1)
|
||||
{
|
||||
pItem = NextBlock(pItem);
|
||||
|
|
|
@ -15,28 +15,28 @@ class CRingBufferBase
|
|||
int m_Free;
|
||||
int m_Size;
|
||||
};
|
||||
|
||||
|
||||
CItem *m_pProduce;
|
||||
CItem *m_pConsume;
|
||||
|
||||
|
||||
CItem *m_pFirst;
|
||||
CItem *m_pLast;
|
||||
|
||||
|
||||
void *m_pMemory;
|
||||
int m_Size;
|
||||
int m_Flags;
|
||||
|
||||
|
||||
CItem *NextBlock(CItem *pItem);
|
||||
CItem *PrevBlock(CItem *pItem);
|
||||
CItem *MergeBack(CItem *pItem);
|
||||
protected:
|
||||
void *Allocate(int Size);
|
||||
|
||||
|
||||
void *Prev(void *pCurrent);
|
||||
void *Next(void *pCurrent);
|
||||
void *First();
|
||||
void *Last();
|
||||
|
||||
|
||||
void Init(void *pMemory, int Size, int Flags);
|
||||
int PopFirst();
|
||||
public:
|
||||
|
@ -53,9 +53,9 @@ class TStaticRingBuffer : public CRingBufferBase
|
|||
unsigned char m_aBuffer[TSIZE];
|
||||
public:
|
||||
TStaticRingBuffer() { Init(); }
|
||||
|
||||
|
||||
void Init() { CRingBufferBase::Init(m_aBuffer, TSIZE, TFLAGS); }
|
||||
|
||||
|
||||
T *Allocate(int Size) { return (T*)CRingBufferBase::Allocate(Size); }
|
||||
int PopFirst() { return CRingBufferBase::PopFirst(); }
|
||||
|
||||
|
|
|
@ -12,31 +12,31 @@ CSnapshotItem *CSnapshot::GetItem(int Index)
|
|||
|
||||
int CSnapshot::GetItemSize(int Index)
|
||||
{
|
||||
if(Index == m_NumItems-1)
|
||||
return (m_DataSize - Offsets()[Index]) - sizeof(CSnapshotItem);
|
||||
return (Offsets()[Index+1] - Offsets()[Index]) - sizeof(CSnapshotItem);
|
||||
if(Index == m_NumItems-1)
|
||||
return (m_DataSize - Offsets()[Index]) - sizeof(CSnapshotItem);
|
||||
return (Offsets()[Index+1] - Offsets()[Index]) - sizeof(CSnapshotItem);
|
||||
}
|
||||
|
||||
int CSnapshot::GetItemIndex(int Key)
|
||||
{
|
||||
// TODO: OPT: this should not be a linear search. very bad
|
||||
for(int i = 0; i < m_NumItems; i++)
|
||||
{
|
||||
if(GetItem(i)->Key() == Key)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
// TODO: OPT: this should not be a linear search. very bad
|
||||
for(int i = 0; i < m_NumItems; i++)
|
||||
{
|
||||
if(GetItem(i)->Key() == Key)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int CSnapshot::Crc()
|
||||
{
|
||||
int Crc = 0;
|
||||
|
||||
|
||||
for(int i = 0; i < m_NumItems; i++)
|
||||
{
|
||||
CSnapshotItem *pItem = GetItem(i);
|
||||
int Size = GetItemSize(i);
|
||||
|
||||
|
||||
for(int b = 0; b < Size/4; b++)
|
||||
Crc += pItem->Data()[b];
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ static void GenerateHash(CItemList *pHashlist, CSnapshot *pSnapshot)
|
|||
{
|
||||
for(int i = 0; i < HASHLIST_SIZE; i++)
|
||||
pHashlist[i].m_Num = 0;
|
||||
|
||||
|
||||
for(int i = 0; i < pSnapshot->NumItems(); i++)
|
||||
{
|
||||
int Key = pSnapshot->GetItem(i)->Key();
|
||||
|
@ -97,7 +97,7 @@ static int GetItemIndexHashed(int Key, const CItemList *pHashlist)
|
|||
if(pHashlist[HashID].m_aKeys[i] == Key)
|
||||
return pHashlist[HashID].m_aIndex[i];
|
||||
}
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ static int DiffItem(int *pPast, int *pCurrent, int *pOut, int Size)
|
|||
pCurrent++;
|
||||
Size--;
|
||||
}
|
||||
|
||||
|
||||
return Needed;
|
||||
}
|
||||
|
||||
|
@ -122,16 +122,16 @@ void CSnapshotDelta::UndiffItem(int *pPast, int *pDiff, int *pOut, int Size)
|
|||
while(Size)
|
||||
{
|
||||
*pOut = *pPast+*pDiff;
|
||||
|
||||
|
||||
if(*pDiff == 0)
|
||||
m_aSnapshotDataRate[m_SnapshotCurrent] += 1;
|
||||
else
|
||||
{
|
||||
unsigned char aBuf[16];
|
||||
unsigned char *pEnd = CVariableInt::Pack(aBuf, *pDiff);
|
||||
unsigned char *pEnd = CVariableInt::Pack(aBuf, *pDiff);
|
||||
m_aSnapshotDataRate[m_SnapshotCurrent] += (int)(pEnd - (unsigned char*)aBuf) * 8;
|
||||
}
|
||||
|
||||
|
||||
pOut++;
|
||||
pPast++;
|
||||
pDiff++;
|
||||
|
@ -169,11 +169,11 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
CSnapshotItem *pPastItem;
|
||||
int Count = 0;
|
||||
int SizeCount = 0;
|
||||
|
||||
|
||||
pDelta->m_NumDeletedItems = 0;
|
||||
pDelta->m_NumUpdateItems = 0;
|
||||
pDelta->m_NumTempItems = 0;
|
||||
|
||||
|
||||
CItemList Hashlist[HASHLIST_SIZE];
|
||||
GenerateHash(Hashlist, pTo);
|
||||
|
||||
|
@ -189,7 +189,7 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
pData++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GenerateHash(Hashlist, pFrom);
|
||||
int aPastIndecies[1024];
|
||||
|
||||
|
@ -197,29 +197,29 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
// we do this as a separate pass because it helps the cache
|
||||
for(i = 0; i < pTo->NumItems(); i++)
|
||||
{
|
||||
pCurItem = pTo->GetItem(i); // O(1) .. O(n)
|
||||
pCurItem = pTo->GetItem(i); // O(1) .. O(n)
|
||||
aPastIndecies[i] = GetItemIndexHashed(pCurItem->Key(), Hashlist); // O(n) .. O(n^n)
|
||||
}
|
||||
|
||||
|
||||
for(i = 0; i < pTo->NumItems(); i++)
|
||||
{
|
||||
// do delta
|
||||
ItemSize = pTo->GetItemSize(i); // O(1) .. O(n)
|
||||
pCurItem = pTo->GetItem(i); // O(1) .. O(n)
|
||||
pCurItem = pTo->GetItem(i); // O(1) .. O(n)
|
||||
PastIndex = aPastIndecies[i];
|
||||
|
||||
|
||||
if(PastIndex != -1)
|
||||
{
|
||||
int *pItemDataDst = pData+3;
|
||||
|
||||
|
||||
pPastItem = pFrom->GetItem(PastIndex);
|
||||
|
||||
|
||||
if(m_aItemSizes[pCurItem->Type()])
|
||||
pItemDataDst = pData+2;
|
||||
|
||||
|
||||
if(DiffItem((int*)pPastItem->Data(), (int*)pCurItem->Data(), pItemDataDst, ItemSize/4))
|
||||
{
|
||||
|
||||
|
||||
*pData++ = pCurItem->Type();
|
||||
*pData++ = pCurItem->ID();
|
||||
if(!m_aItemSizes[pCurItem->Type()])
|
||||
|
@ -234,7 +234,7 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
*pData++ = pCurItem->ID();
|
||||
if(!m_aItemSizes[pCurItem->Type()])
|
||||
*pData++ = ItemSize/4;
|
||||
|
||||
|
||||
mem_copy(pData, pCurItem->Data(), ItemSize);
|
||||
SizeCount += ItemSize;
|
||||
pData += ItemSize/4;
|
||||
|
@ -242,7 +242,7 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
Count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(0)
|
||||
{
|
||||
dbg_msg("snapshot", "%d %d %d",
|
||||
|
@ -253,7 +253,7 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
|
||||
/*
|
||||
// TODO: pack temp stuff
|
||||
|
||||
|
||||
// finish
|
||||
//mem_copy(pDelta->offsets, deleted, pDelta->num_deleted_items*sizeof(int));
|
||||
//mem_copy(&(pDelta->offsets[pDelta->num_deleted_items]), update, pDelta->num_update_items*sizeof(int));
|
||||
|
@ -261,10 +261,10 @@ int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData
|
|||
//mem_copy(pDelta->data_start(), data, data_size);
|
||||
//pDelta->data_size = data_size;
|
||||
* */
|
||||
|
||||
|
||||
if(!pDelta->m_NumDeletedItems && !pDelta->m_NumUpdateItems && !pDelta->m_NumTempItems)
|
||||
return 0;
|
||||
|
||||
|
||||
return (int)((char*)pData-(char*)pDstData);
|
||||
}
|
||||
|
||||
|
@ -281,16 +281,16 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
|
|||
CData *pDelta = (CData *)pSrcData;
|
||||
int *pData = (int *)pDelta->m_pData;
|
||||
int *pEnd = (int *)(((char *)pSrcData + DataSize));
|
||||
|
||||
|
||||
CSnapshotItem *pFromItem;
|
||||
int Keep, ItemSize;
|
||||
int *pDeleted;
|
||||
int ID, Type, Key;
|
||||
int FromIndex;
|
||||
int *pNewData;
|
||||
|
||||
|
||||
Builder.Init();
|
||||
|
||||
|
||||
// unpack deleted stuff
|
||||
pDeleted = pData;
|
||||
pData += pDelta->m_NumDeletedItems;
|
||||
|
@ -302,7 +302,7 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
|
|||
{
|
||||
// dbg_assert(0, "fail!");
|
||||
pFromItem = pFrom->GetItem(i);
|
||||
ItemSize = pFrom->GetItemSize(i);
|
||||
ItemSize = pFrom->GetItemSize(i);
|
||||
Keep = 1;
|
||||
for(int d = 0; d < pDelta->m_NumDeletedItems; d++)
|
||||
{
|
||||
|
@ -312,7 +312,7 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(Keep)
|
||||
{
|
||||
// keep it
|
||||
|
@ -321,13 +321,13 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
|
|||
pFromItem->Data(), ItemSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// unpack updated stuff
|
||||
for(int i = 0; i < pDelta->m_NumUpdateItems; i++)
|
||||
{
|
||||
if(pData+2 > pEnd)
|
||||
return -1;
|
||||
|
||||
|
||||
Type = *pData++;
|
||||
ID = *pData++;
|
||||
if(m_aItemSizes[Type])
|
||||
|
@ -339,18 +339,18 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
|
|||
ItemSize = (*pData++) * 4;
|
||||
}
|
||||
m_SnapshotCurrent = Type;
|
||||
|
||||
|
||||
if(RangeCheck(pEnd, pData, ItemSize) || ItemSize < 0) return -3;
|
||||
|
||||
|
||||
Key = (Type<<16)|ID;
|
||||
|
||||
|
||||
// create the item if needed
|
||||
pNewData = Builder.GetItemData(Key);
|
||||
if(!pNewData)
|
||||
pNewData = (int *)Builder.NewItem(Key>>16, Key&0xffff, ItemSize);
|
||||
|
||||
//if(range_check(pEnd, pNewData, ItemSize)) return -4;
|
||||
|
||||
|
||||
FromIndex = pFrom->GetItemIndex(Key);
|
||||
if(FromIndex != -1)
|
||||
{
|
||||
|
@ -364,10 +364,10 @@ int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData
|
|||
m_aSnapshotDataRate[m_SnapshotCurrent] += ItemSize*8;
|
||||
m_aSnapshotDataUpdates[m_SnapshotCurrent]++;
|
||||
}
|
||||
|
||||
|
||||
pData += ItemSize/4;
|
||||
}
|
||||
|
||||
|
||||
// finish up
|
||||
return Builder.Finish(pTo);
|
||||
}
|
||||
|
@ -402,24 +402,24 @@ void CSnapshotStorage::PurgeUntil(int Tick)
|
|||
{
|
||||
CHolder *pHolder = m_pFirst;
|
||||
CHolder *pNext;
|
||||
|
||||
|
||||
while(pHolder)
|
||||
{
|
||||
pNext = pHolder->m_pNext;
|
||||
if(pHolder->m_Tick >= Tick)
|
||||
return; // no more to remove
|
||||
mem_free(pHolder);
|
||||
|
||||
|
||||
// did we come to the end of the list?
|
||||
if (!pNext)
|
||||
break;
|
||||
if (!pNext)
|
||||
break;
|
||||
|
||||
m_pFirst = pNext;
|
||||
pNext->m_pPrev = 0x0;
|
||||
|
||||
|
||||
pHolder = pNext;
|
||||
}
|
||||
|
||||
|
||||
// no more snapshots in storage
|
||||
m_pFirst = 0;
|
||||
m_pLast = 0;
|
||||
|
@ -429,12 +429,12 @@ void CSnapshotStorage::Add(int Tick, int64 Tagtime, int DataSize, void *pData, i
|
|||
{
|
||||
// allocate memory for holder + snapshot_data
|
||||
int TotalSize = sizeof(CHolder)+DataSize;
|
||||
|
||||
|
||||
if(CreateAlt)
|
||||
TotalSize += DataSize;
|
||||
|
||||
|
||||
CHolder *pHolder = (CHolder *)mem_alloc(TotalSize, 1);
|
||||
|
||||
|
||||
// set data
|
||||
pHolder->m_Tick = Tick;
|
||||
pHolder->m_Tagtime = Tagtime;
|
||||
|
@ -449,8 +449,8 @@ void CSnapshotStorage::Add(int Tick, int64 Tagtime, int DataSize, void *pData, i
|
|||
}
|
||||
else
|
||||
pHolder->m_pAltSnap = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
// link
|
||||
pHolder->m_pNext = 0;
|
||||
pHolder->m_pPrev = m_pLast;
|
||||
|
@ -464,7 +464,7 @@ void CSnapshotStorage::Add(int Tick, int64 Tagtime, int DataSize, void *pData, i
|
|||
int CSnapshotStorage::Get(int Tick, int64 *pTagtime, CSnapshot **ppData, CSnapshot **ppAltData)
|
||||
{
|
||||
CHolder *pHolder = m_pFirst;
|
||||
|
||||
|
||||
while(pHolder)
|
||||
{
|
||||
if(pHolder->m_Tick == Tick)
|
||||
|
@ -477,10 +477,10 @@ int CSnapshotStorage::Get(int Tick, int64 *pTagtime, CSnapshot **ppData, CSnapsh
|
|||
*ppData = pHolder->m_pAltSnap;
|
||||
return pHolder->m_SnapSize;
|
||||
}
|
||||
|
||||
|
||||
pHolder = pHolder->m_pNext;
|
||||
}
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -492,7 +492,7 @@ void CSnapshotBuilder::Init()
|
|||
m_NumItems = 0;
|
||||
}
|
||||
|
||||
CSnapshotItem *CSnapshotBuilder::GetItem(int Index)
|
||||
CSnapshotItem *CSnapshotBuilder::GetItem(int Index)
|
||||
{
|
||||
return (CSnapshotItem *)&(m_aData[m_aOffsets[Index]]);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ class CSnapshotItem
|
|||
{
|
||||
public:
|
||||
int m_TypeAndID;
|
||||
|
||||
|
||||
int *Data() { return (int *)(this+1); }
|
||||
int Type() { return m_TypeAndID>>16; }
|
||||
int ID() { return m_TypeAndID&0xffff; }
|
||||
|
@ -90,15 +90,15 @@ public:
|
|||
public:
|
||||
CHolder *m_pPrev;
|
||||
CHolder *m_pNext;
|
||||
|
||||
|
||||
int64 m_Tagtime;
|
||||
int m_Tick;
|
||||
|
||||
|
||||
int m_SnapSize;
|
||||
CSnapshot *m_pSnap;
|
||||
CSnapshot *m_pAltSnap;
|
||||
};
|
||||
|
||||
|
||||
|
||||
CHolder *m_pFirst;
|
||||
CHolder *m_pLast;
|
||||
|
@ -125,12 +125,12 @@ class CSnapshotBuilder
|
|||
|
||||
public:
|
||||
void Init();
|
||||
|
||||
|
||||
void *NewItem(int Type, int ID, int Size);
|
||||
|
||||
|
||||
CSnapshotItem *GetItem(int Index);
|
||||
int *GetItemData(int Key);
|
||||
|
||||
|
||||
int Finish(void *Snapdata);
|
||||
};
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
char m_aDatadir[MAX_PATH_LENGTH];
|
||||
char m_aUserdir[MAX_PATH_LENGTH];
|
||||
char m_aCurrentdir[MAX_PATH_LENGTH];
|
||||
|
||||
|
||||
CStorage()
|
||||
{
|
||||
mem_zero(m_aaStoragePaths, sizeof(m_aaStoragePaths));
|
||||
|
@ -29,7 +29,7 @@ public:
|
|||
m_aDatadir[0] = 0;
|
||||
m_aUserdir[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
int Init(const char *pApplicationName, int NumArgs, const char **ppArguments)
|
||||
{
|
||||
// get userdir
|
||||
|
@ -85,7 +85,7 @@ public:
|
|||
str_append(aBuffer, "/storage.cfg", sizeof(aBuffer));
|
||||
File = io_open(aBuffer, IOFLAG_READ);
|
||||
}
|
||||
|
||||
|
||||
if(Pos >= MAX_PATH_LENGTH || !File)
|
||||
{
|
||||
dbg_msg("storage", "couldn't open storage.cfg");
|
||||
|
@ -151,7 +151,7 @@ public:
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void FindDatadir(const char *pArgv0)
|
||||
{
|
||||
// 1) use data-dir in PWD if present
|
||||
|
@ -160,35 +160,35 @@ public:
|
|||
str_copy(m_aDatadir, "data", sizeof(m_aDatadir));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 2) use compiled-in data-dir if present
|
||||
if(fs_is_dir(DATA_DIR "/mapres"))
|
||||
{
|
||||
str_copy(m_aDatadir, DATA_DIR, sizeof(m_aDatadir));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 3) check for usable path in argv[0]
|
||||
{
|
||||
unsigned int Pos = ~0U;
|
||||
for(unsigned i = 0; pArgv0[i]; i++)
|
||||
if(pArgv0[i] == '/' || pArgv0[i] == '\\')
|
||||
Pos = i;
|
||||
|
||||
|
||||
if(Pos < MAX_PATH_LENGTH)
|
||||
{
|
||||
char aBaseDir[MAX_PATH_LENGTH];
|
||||
str_copy(aBaseDir, pArgv0, Pos+1);
|
||||
str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", aBaseDir);
|
||||
str_append(aBaseDir, "/data/mapres", sizeof(aBaseDir));
|
||||
|
||||
|
||||
if(fs_is_dir(aBaseDir))
|
||||
return;
|
||||
else
|
||||
m_aDatadir[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if defined(CONF_FAMILY_UNIX)
|
||||
// 4) check for all default locations
|
||||
{
|
||||
|
@ -200,7 +200,7 @@ public:
|
|||
"/opt/teeworlds/data"
|
||||
};
|
||||
const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]);
|
||||
|
||||
|
||||
int i;
|
||||
for (i = 0; i < DirsCount; i++)
|
||||
{
|
||||
|
@ -214,7 +214,7 @@ public:
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// no data-dir found
|
||||
dbg_msg("storage", "warning no data directory found");
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ public:
|
|||
str_format(pBuffer, BufferSize, "%s%s%s", m_aaStoragePaths[Type], !m_aaStoragePaths[Type][0] ? "" : "/", pDir);
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
|
||||
virtual IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = 0, int BufferSize = 0)
|
||||
{
|
||||
char aBuffer[MAX_PATH_LENGTH];
|
||||
|
@ -249,7 +249,7 @@ public:
|
|||
pBuffer = aBuffer;
|
||||
BufferSize = sizeof(aBuffer);
|
||||
}
|
||||
|
||||
|
||||
if(Flags&IOFLAG_WRITE)
|
||||
{
|
||||
return io_open(GetPath(TYPE_SAVE, pFilename, pBuffer, BufferSize), Flags);
|
||||
|
@ -276,11 +276,11 @@ public:
|
|||
return Handle;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pBuffer[0] = 0;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct CFindCBData
|
||||
{
|
||||
CStorage *pStorage;
|
||||
|
@ -321,7 +321,7 @@ public:
|
|||
{
|
||||
if(BufferSize < 1)
|
||||
return false;
|
||||
|
||||
|
||||
pBuffer[0] = 0;
|
||||
char aBuf[MAX_PATH_LENGTH];
|
||||
CFindCBData Data;
|
||||
|
|
|
@ -14,7 +14,7 @@ public:
|
|||
TYPE_SAVE = 0,
|
||||
TYPE_ALL = -1
|
||||
};
|
||||
|
||||
|
||||
virtual void ListDirectory(int Type, const char *pPath, FS_LISTDIR_CALLBACK pfnCallback, void *pUser) = 0;
|
||||
virtual IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = 0, int BufferSize = 0) = 0;
|
||||
virtual bool FindFile(const char *pFilename, const char *pPath, int Type, char *pBuffer, int BufferSize) = 0;
|
||||
|
|
|
@ -20,12 +20,12 @@ public:
|
|||
int m_LineCount;
|
||||
int m_CharCount;
|
||||
int m_MaxLines;
|
||||
|
||||
|
||||
float m_StartX;
|
||||
float m_StartY;
|
||||
float m_LineWidth;
|
||||
float m_X, m_Y;
|
||||
|
||||
|
||||
CFont *m_pFont;
|
||||
float m_FontSize;
|
||||
};
|
||||
|
@ -35,15 +35,15 @@ class ITextRender : public IInterface
|
|||
MACRO_INTERFACE("textrender", 0)
|
||||
public:
|
||||
virtual void SetCursor(CTextCursor *pCursor, float x, float y, float FontSize, int Flags) = 0;
|
||||
|
||||
|
||||
virtual CFont *LoadFont(const char *pFilename) = 0;
|
||||
virtual void DestroyFont(CFont *pFont) = 0;
|
||||
|
||||
|
||||
virtual void SetDefaultFont(CFont *pFont) = 0;
|
||||
|
||||
//
|
||||
virtual void TextEx(CTextCursor *pCursor, const char *pText, int Length) = 0;
|
||||
|
||||
|
||||
// old foolish interface
|
||||
virtual void TextColor(float r, float g, float b, float a) = 0;
|
||||
virtual void TextOutlineColor(float r, float g, float b, float a) = 0;
|
||||
|
|
|
@ -84,13 +84,13 @@ CAnimState *CAnimState::GetIdle()
|
|||
{
|
||||
static CAnimState State;
|
||||
static bool Init = true;
|
||||
|
||||
|
||||
if(Init)
|
||||
{
|
||||
State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0);
|
||||
State.Add(&g_pData->m_aAnimations[ANIM_IDLE], 0, 1.0f);
|
||||
Init = false;
|
||||
}
|
||||
|
||||
|
||||
return &State;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ public:
|
|||
ANIM_KEYFRAME *GetAttach() { return &m_Attach; };
|
||||
void Set(ANIMATION *pAnim, float Time);
|
||||
void Add(ANIMATION *pAdded, float Time, float Amount);
|
||||
|
||||
|
||||
static CAnimState *GetIdle();
|
||||
};
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ protected:
|
|||
friend class CGameClient;
|
||||
|
||||
CGameClient *m_pClient;
|
||||
|
||||
|
||||
// perhaps propagte pointers for these as well
|
||||
class IKernel *Kernel() const { return m_pClient->Kernel(); }
|
||||
class IGraphics *Graphics() const { return m_pClient->Graphics(); }
|
||||
|
@ -31,7 +31,7 @@ protected:
|
|||
class CCollision *Collision() const { return m_pClient->Collision(); }
|
||||
public:
|
||||
virtual ~CComponent() {}
|
||||
|
||||
|
||||
virtual void OnStateChange(int NewState, int OldState) {};
|
||||
virtual void OnConsoleInit() {};
|
||||
virtual void OnInit() {};
|
||||
|
|
|
@ -12,11 +12,11 @@ bool CBinds::CBindsSpecial::OnInput(IInput::CEvent Event)
|
|||
int Stroke = 0;
|
||||
if(Event.m_Flags&IInput::FLAG_PRESS)
|
||||
Stroke = 1;
|
||||
|
||||
|
||||
m_pBinds->GetConsole()->ExecuteLineStroked(Stroke, m_pBinds->m_aaKeyBindings[Event.m_Key]);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ void CBinds::Bind(int KeyID, const char *pStr)
|
|||
{
|
||||
if(KeyID < 0 || KeyID >= KEY_LAST)
|
||||
return;
|
||||
|
||||
|
||||
str_copy(m_aaKeyBindings[KeyID], pStr, sizeof(m_aaKeyBindings[KeyID]));
|
||||
char aBuf[256];
|
||||
if(!m_aaKeyBindings[KeyID][0])
|
||||
|
@ -74,11 +74,11 @@ const char *CBinds::GetKey(const char *pBindStr)
|
|||
const char *pBind = Get(KeyId);
|
||||
if(!pBind[0])
|
||||
continue;
|
||||
|
||||
|
||||
if(str_comp(pBind, pBindStr) == 0)
|
||||
return Input()->KeyName(KeyId);
|
||||
}
|
||||
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@ -108,15 +108,15 @@ void CBinds::SetDefaults()
|
|||
Bind('3', "+weapon3");
|
||||
Bind('4', "+weapon4");
|
||||
Bind('5', "+weapon5");
|
||||
|
||||
|
||||
Bind(KEY_MOUSE_WHEEL_UP, "+prevweapon");
|
||||
Bind(KEY_MOUSE_WHEEL_DOWN, "+nextweapon");
|
||||
|
||||
|
||||
Bind('t', "chat all");
|
||||
Bind('y', "chat team");
|
||||
Bind('y', "chat team");
|
||||
|
||||
Bind(KEY_F3, "vote yes");
|
||||
Bind(KEY_F4, "vote no");
|
||||
Bind(KEY_F4, "vote no");
|
||||
}
|
||||
|
||||
void CBinds::OnConsoleInit()
|
||||
|
@ -125,12 +125,12 @@ void CBinds::OnConsoleInit()
|
|||
IConfig *pConfig = Kernel()->RequestInterface<IConfig>();
|
||||
if(pConfig)
|
||||
pConfig->RegisterCallback(ConfigSaveCallback, this);
|
||||
|
||||
|
||||
Console()->Register("bind", "sr", CFGFLAG_CLIENT, ConBind, this, "Bind key to execute the command");
|
||||
Console()->Register("unbind", "s", CFGFLAG_CLIENT, ConUnbind, this, "Unbind key");
|
||||
Console()->Register("unbindall", "", CFGFLAG_CLIENT, ConUnbindAll, this, "Unbind all keys");
|
||||
Console()->Register("dump_binds", "", CFGFLAG_CLIENT, ConDumpBinds, this, "Dump binds");
|
||||
|
||||
|
||||
// default bindings
|
||||
SetDefaults();
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ void CBinds::ConBind(IConsole::IResult *pResult, void *pUserData)
|
|||
CBinds *pBinds = (CBinds *)pUserData;
|
||||
const char *pKeyName = pResult->GetString(0);
|
||||
int id = pBinds->GetKeyID(pKeyName);
|
||||
|
||||
|
||||
if(!id)
|
||||
{
|
||||
char aBuf[256];
|
||||
|
@ -148,7 +148,7 @@ void CBinds::ConBind(IConsole::IResult *pResult, void *pUserData)
|
|||
pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
pBinds->Bind(id, pResult->GetString(1));
|
||||
}
|
||||
|
||||
|
@ -158,7 +158,7 @@ void CBinds::ConUnbind(IConsole::IResult *pResult, void *pUserData)
|
|||
CBinds *pBinds = (CBinds *)pUserData;
|
||||
const char *pKeyName = pResult->GetString(0);
|
||||
int id = pBinds->GetKeyID(pKeyName);
|
||||
|
||||
|
||||
if(!id)
|
||||
{
|
||||
char aBuf[256];
|
||||
|
@ -166,7 +166,7 @@ void CBinds::ConUnbind(IConsole::IResult *pResult, void *pUserData)
|
|||
pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
pBinds->Bind(id, "");
|
||||
}
|
||||
|
||||
|
@ -200,21 +200,21 @@ int CBinds::GetKeyID(const char *pKeyName)
|
|||
if(i > 0 && i < KEY_LAST)
|
||||
return i; // numeric
|
||||
}
|
||||
|
||||
|
||||
// search for key
|
||||
for(int i = 0; i < KEY_LAST; i++)
|
||||
{
|
||||
if(str_comp(pKeyName, Input()->KeyName(i)) == 0)
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
|
||||
{
|
||||
CBinds *pSelf = (CBinds *)pUserData;
|
||||
|
||||
|
||||
char aBuffer[256];
|
||||
char *pEnd = aBuffer+sizeof(aBuffer)-8;
|
||||
pConfig->WriteLine("unbindall");
|
||||
|
@ -223,7 +223,7 @@ void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
|
|||
if(pSelf->m_aaKeyBindings[i][0] == 0)
|
||||
continue;
|
||||
str_format(aBuffer, sizeof(aBuffer), "bind %s ", pSelf->Input()->KeyName(i));
|
||||
|
||||
|
||||
// process the string. we need to escape some characters
|
||||
const char *pSrc = pSelf->m_aaKeyBindings[i];
|
||||
char *pDst = aBuffer + str_length(aBuffer);
|
||||
|
@ -236,7 +236,7 @@ void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
|
|||
}
|
||||
*pDst++ = '"';
|
||||
*pDst++ = 0;
|
||||
|
||||
|
||||
pConfig->WriteLine(aBuffer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,27 +16,27 @@ class CBinds : public CComponent
|
|||
static void ConUnbindAll(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConDumpBinds(IConsole::IResult *pResult, void *pUserData);
|
||||
class IConsole *GetConsole() const { return Console(); }
|
||||
|
||||
|
||||
static void ConfigSaveCallback(class IConfig *pConfig, void *pUserData);
|
||||
|
||||
|
||||
public:
|
||||
CBinds();
|
||||
|
||||
|
||||
class CBindsSpecial : public CComponent
|
||||
{
|
||||
public:
|
||||
CBinds *m_pBinds;
|
||||
virtual bool OnInput(IInput::CEvent Event);
|
||||
};
|
||||
|
||||
|
||||
CBindsSpecial m_SpecialBinds;
|
||||
|
||||
|
||||
void Bind(int KeyID, const char *pStr);
|
||||
void SetDefaults();
|
||||
void UnbindAll();
|
||||
const char *Get(int KeyID);
|
||||
const char *GetKey(const char *pBindStr);
|
||||
|
||||
|
||||
virtual void OnConsoleInit();
|
||||
virtual bool OnInput(IInput::CEvent Event);
|
||||
};
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include <game/client/components/scoreboard.h>
|
||||
|
||||
#include "broadcast.h"
|
||||
|
||||
|
||||
void CBroadcast::OnReset()
|
||||
{
|
||||
m_BroadcastTime = 0;
|
||||
|
@ -24,7 +24,7 @@ void CBroadcast::OnRender()
|
|||
return;
|
||||
|
||||
Graphics()->MapScreen(0, 0, 300*Graphics()->ScreenAspect(), 300);
|
||||
|
||||
|
||||
if(time_get() < m_BroadcastTime)
|
||||
{
|
||||
CTextCursor Cursor;
|
||||
|
|
|
@ -20,7 +20,7 @@ void CCamera::OnRender()
|
|||
//vec2 center;
|
||||
m_Zoom = 1.0f;
|
||||
|
||||
// update camera center
|
||||
// update camera center
|
||||
if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition)
|
||||
{
|
||||
if(m_CamType != CAMTYPE_SPEC)
|
||||
|
@ -50,7 +50,7 @@ void CCamera::OnRender()
|
|||
|
||||
CameraOffset = normalize(m_pClient->m_pControls->m_MousePos)*OffsetAmount;
|
||||
}
|
||||
|
||||
|
||||
if(m_pClient->m_Snap.m_SpecInfo.m_Active)
|
||||
m_Center = m_pClient->m_Snap.m_SpecInfo.m_Position + CameraOffset;
|
||||
else
|
||||
|
|
|
@ -32,7 +32,7 @@ void CChat::OnReset()
|
|||
m_aLines[i].m_aText[0] = 0;
|
||||
m_aLines[i].m_aName[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
m_Show = false;
|
||||
m_InputUpdate = false;
|
||||
m_ChatStringOffset = 0;
|
||||
|
@ -126,7 +126,7 @@ bool CChat::OnInput(IInput::CEvent Event)
|
|||
|
||||
for(m_PlaceholderLength = 0; *pCursor && *pCursor != ' '; ++pCursor)
|
||||
++m_PlaceholderLength;
|
||||
|
||||
|
||||
str_copy(m_aCompletionBuffer, m_Input.GetString()+m_PlaceholderOffset, min(static_cast<int>(sizeof(m_aCompletionBuffer)), m_PlaceholderLength+1));
|
||||
}
|
||||
|
||||
|
@ -204,7 +204,7 @@ bool CChat::OnInput(IInput::CEvent Event)
|
|||
else
|
||||
m_Input.Clear();
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -220,7 +220,7 @@ void CChat::EnableMode(int Team)
|
|||
m_Mode = MODE_TEAM;
|
||||
else
|
||||
m_Mode = MODE_ALL;
|
||||
|
||||
|
||||
m_Input.Clear();
|
||||
Input()->ClearEvents();
|
||||
m_CompletionChosen = -1;
|
||||
|
@ -241,7 +241,7 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine)
|
|||
if(ClientID != -1 && (m_pClient->m_aClients[ClientID].m_aName[0] == '\0' || // unknown client
|
||||
m_pClient->m_aClients[ClientID].m_ChatIgnore))
|
||||
return;
|
||||
|
||||
|
||||
bool Highlighted = false;
|
||||
char *p = const_cast<char*>(pLine);
|
||||
while(*p)
|
||||
|
@ -285,11 +285,11 @@ void CChat::AddLine(int ClientID, int Team, const char *pLine)
|
|||
else if(m_pClient->m_aClients[ClientID].m_Team == TEAM_BLUE)
|
||||
m_aLines[m_CurrentLine].m_NameColor = TEAM_BLUE;
|
||||
}
|
||||
|
||||
|
||||
str_copy(m_aLines[m_CurrentLine].m_aName, m_pClient->m_aClients[ClientID].m_aName, sizeof(m_aLines[m_CurrentLine].m_aName));
|
||||
str_format(m_aLines[m_CurrentLine].m_aText, sizeof(m_aLines[m_CurrentLine].m_aText), ": %s", pLine);
|
||||
}
|
||||
|
||||
|
||||
char aBuf[1024];
|
||||
str_format(aBuf, sizeof(aBuf), "%s%s", m_aLines[m_CurrentLine].m_aName, m_aLines[m_CurrentLine].m_aText);
|
||||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "chat", aBuf);
|
||||
|
@ -317,7 +317,7 @@ void CChat::OnRender()
|
|||
TextRender()->SetCursor(&Cursor, x, y, 8.0f, TEXTFLAG_RENDER);
|
||||
Cursor.m_LineWidth = Width-190.0f;
|
||||
Cursor.m_MaxLines = 2;
|
||||
|
||||
|
||||
if(m_Mode == MODE_ALL)
|
||||
TextRender()->TextEx(&Cursor, Localize("All"), -1);
|
||||
else if(m_Mode == MODE_TEAM)
|
||||
|
@ -326,7 +326,7 @@ void CChat::OnRender()
|
|||
TextRender()->TextEx(&Cursor, Localize("Chat"), -1);
|
||||
|
||||
TextRender()->TextEx(&Cursor, ": ", -1);
|
||||
|
||||
|
||||
// check if the visible text has to be moved
|
||||
if(m_InputUpdate)
|
||||
{
|
||||
|
@ -373,7 +373,7 @@ void CChat::OnRender()
|
|||
int r = ((m_CurrentLine-i)+MAX_LINES)%MAX_LINES;
|
||||
if(Now > m_aLines[r].m_Time+16*time_freq() && !m_Show)
|
||||
break;
|
||||
|
||||
|
||||
// get the y offset (calculate it if we haven't done that yet)
|
||||
if(m_aLines[r].m_YOffset[OffsetType] < 0.0f)
|
||||
{
|
||||
|
@ -388,7 +388,7 @@ void CChat::OnRender()
|
|||
// cut off if msgs waste too much space
|
||||
if(y < HeightLimit)
|
||||
break;
|
||||
|
||||
|
||||
float Blend = Now > m_aLines[r].m_Time+14*time_freq() && !m_Show ? 1.0f-(Now-m_aLines[r].m_Time-14*time_freq())/(2.0f*time_freq()) : 1.0f;
|
||||
|
||||
// reset the cursor
|
||||
|
@ -408,7 +408,7 @@ void CChat::OnRender()
|
|||
TextRender()->TextColor(0.75f, 0.5f, 0.75f, Blend); // spectator
|
||||
else
|
||||
TextRender()->TextColor(0.8f, 0.8f, 0.8f, Blend);
|
||||
|
||||
|
||||
TextRender()->TextEx(&Cursor, m_aLines[r].m_aName, -1);
|
||||
|
||||
// render line
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
class CChat : public CComponent
|
||||
{
|
||||
CLineInput m_Input;
|
||||
|
||||
enum
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_LINES = 25,
|
||||
};
|
||||
|
@ -49,23 +49,23 @@ class CChat : public CComponent
|
|||
int m_PlaceholderLength;
|
||||
char *m_pHistoryEntry;
|
||||
TStaticRingBuffer<char, 64*1024, CRingBufferBase::FLAG_RECYCLE> m_History;
|
||||
|
||||
|
||||
static void ConSay(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConSayTeam(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConChat(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConShowChat(IConsole::IResult *pResult, void *pUserData);
|
||||
|
||||
|
||||
public:
|
||||
CChat();
|
||||
|
||||
bool IsActive() const { return m_Mode != MODE_NONE; }
|
||||
|
||||
|
||||
void AddLine(int ClientID, int Team, const char *pLine);
|
||||
|
||||
|
||||
void EnableMode(int Team);
|
||||
|
||||
|
||||
void Say(int Team, const char *pLine);
|
||||
|
||||
|
||||
virtual void OnReset();
|
||||
virtual void OnConsoleInit();
|
||||
virtual void OnStateChange(int NewState, int OldState);
|
||||
|
|
|
@ -39,9 +39,9 @@ enum
|
|||
CGameConsole::CInstance::CInstance(int Type)
|
||||
{
|
||||
m_pHistoryEntry = 0x0;
|
||||
|
||||
|
||||
m_Type = Type;
|
||||
|
||||
|
||||
if(Type == CGameConsole::CONSOLETYPE_LOCAL)
|
||||
m_CompletionFlagmask = CFGFLAG_CLIENT;
|
||||
else
|
||||
|
@ -50,7 +50,7 @@ CGameConsole::CInstance::CInstance(int Type)
|
|||
m_aCompletionBuffer[0] = 0;
|
||||
m_CompletionChosen = -1;
|
||||
m_CompletionRenderOffset = 0.0f;
|
||||
|
||||
|
||||
m_pCommand = 0x0;
|
||||
}
|
||||
|
||||
|
@ -95,7 +95,7 @@ void CGameConsole::CInstance::PossibleCommandsCompleteCallback(const char *pStr,
|
|||
void CGameConsole::CInstance::OnInput(IInput::CEvent Event)
|
||||
{
|
||||
bool Handled = false;
|
||||
|
||||
|
||||
if(Event.m_Flags&IInput::FLAG_PRESS)
|
||||
{
|
||||
if(Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER)
|
||||
|
@ -111,7 +111,7 @@ void CGameConsole::CInstance::OnInput(IInput::CEvent Event)
|
|||
m_Input.Clear();
|
||||
m_pHistoryEntry = 0x0;
|
||||
}
|
||||
|
||||
|
||||
Handled = true;
|
||||
}
|
||||
else if (Event.m_Key == KEY_UP)
|
||||
|
@ -197,7 +197,7 @@ void CGameConsole::CInstance::OnInput(IInput::CEvent Event)
|
|||
for(; i < (int)sizeof(aBuf)-1 && *pSrc && *pSrc != ' '; i++, pSrc++)
|
||||
aBuf[i] = *pSrc;
|
||||
aBuf[i] = 0;
|
||||
|
||||
|
||||
m_pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask);
|
||||
}
|
||||
}
|
||||
|
@ -233,9 +233,9 @@ float CGameConsole::TimeNow()
|
|||
|
||||
CGameConsole::CInstance *CGameConsole::CurrentConsole()
|
||||
{
|
||||
if(m_ConsoleType == CONSOLETYPE_REMOTE)
|
||||
return &m_RemoteConsole;
|
||||
return &m_LocalConsole;
|
||||
if(m_ConsoleType == CONSOLETYPE_REMOTE)
|
||||
return &m_RemoteConsole;
|
||||
return &m_LocalConsole;
|
||||
}
|
||||
|
||||
void CGameConsole::OnReset()
|
||||
|
@ -263,7 +263,7 @@ struct CRenderInfo
|
|||
void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser)
|
||||
{
|
||||
CRenderInfo *pInfo = static_cast<CRenderInfo *>(pUser);
|
||||
|
||||
|
||||
if(pInfo->m_EnumCount == pInfo->m_WantedCompletion)
|
||||
{
|
||||
float tw = pInfo->m_pSelf->TextRender()->TextWidth(pInfo->m_Cursor.m_pFont, pInfo->m_Cursor.m_FontSize, pStr, -1);
|
||||
|
@ -272,7 +272,7 @@ void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser)
|
|||
pInfo->m_pSelf->Graphics()->SetColor(229.0f/255.0f,185.0f/255.0f,4.0f/255.0f,0.85f);
|
||||
pInfo->m_pSelf->RenderTools()->DrawRoundRect(pInfo->m_Cursor.m_X-3, pInfo->m_Cursor.m_Y, tw+5, pInfo->m_Cursor.m_FontSize+4, pInfo->m_Cursor.m_FontSize/3);
|
||||
pInfo->m_pSelf->Graphics()->QuadsEnd();
|
||||
|
||||
|
||||
// scroll when out of sight
|
||||
if(pInfo->m_Cursor.m_X < 3.0f)
|
||||
pInfo->m_Offset = 0.0f;
|
||||
|
@ -285,7 +285,7 @@ void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser)
|
|||
else
|
||||
{
|
||||
const char *pMatchStart = str_find_nocase(pStr, pInfo->m_pCurrentCmd);
|
||||
|
||||
|
||||
if(pMatchStart)
|
||||
{
|
||||
pInfo->m_pSelf->TextRender()->TextColor(0.5f,0.5f,0.5f,1);
|
||||
|
@ -301,14 +301,14 @@ void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser)
|
|||
pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr, -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pInfo->m_EnumCount++;
|
||||
pInfo->m_Cursor.m_X += 7.0f;
|
||||
}
|
||||
|
||||
void CGameConsole::OnRender()
|
||||
{
|
||||
CUIRect Screen = *UI()->Screen();
|
||||
CUIRect Screen = *UI()->Screen();
|
||||
float ConsoleMaxHeight = Screen.h*3/5.0f;
|
||||
float ConsoleHeight;
|
||||
|
||||
|
@ -325,11 +325,11 @@ void CGameConsole::OnRender()
|
|||
}
|
||||
|
||||
if (m_ConsoleState == CONSOLE_OPEN && g_Config.m_ClEditor)
|
||||
Toggle(CONSOLETYPE_LOCAL);
|
||||
|
||||
Toggle(CONSOLETYPE_LOCAL);
|
||||
|
||||
if (m_ConsoleState == CONSOLE_CLOSED)
|
||||
return;
|
||||
|
||||
|
||||
if (m_ConsoleState == CONSOLE_OPEN)
|
||||
Input()->MouseModeAbsolute();
|
||||
|
||||
|
@ -348,31 +348,31 @@ void CGameConsole::OnRender()
|
|||
|
||||
// do console shadow
|
||||
Graphics()->TextureSet(-1);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->QuadsBegin();
|
||||
IGraphics::CColorVertex Array[4] = {
|
||||
IGraphics::CColorVertex(0, 0,0,0, 0.5f),
|
||||
IGraphics::CColorVertex(1, 0,0,0, 0.5f),
|
||||
IGraphics::CColorVertex(2, 0,0,0, 0.0f),
|
||||
IGraphics::CColorVertex(0, 0,0,0, 0.5f),
|
||||
IGraphics::CColorVertex(1, 0,0,0, 0.5f),
|
||||
IGraphics::CColorVertex(2, 0,0,0, 0.0f),
|
||||
IGraphics::CColorVertex(3, 0,0,0, 0.0f)};
|
||||
Graphics()->SetColorVertex(Array, 4);
|
||||
IGraphics::CQuadItem QuadItem(0, ConsoleHeight, Screen.w, 10.0f);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
// do background
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CONSOLE_BG].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(0.2f, 0.2f, 0.2f,0.9f);
|
||||
if(m_ConsoleType == CONSOLETYPE_REMOTE)
|
||||
Graphics()->SetColor(0.4f, 0.2f, 0.2f,0.9f);
|
||||
Graphics()->QuadsSetSubset(0,-ConsoleHeight*0.075f,Screen.w*0.075f*0.5f,0);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(0.2f, 0.2f, 0.2f,0.9f);
|
||||
if(m_ConsoleType == CONSOLETYPE_REMOTE)
|
||||
Graphics()->SetColor(0.4f, 0.2f, 0.2f,0.9f);
|
||||
Graphics()->QuadsSetSubset(0,-ConsoleHeight*0.075f,Screen.w*0.075f*0.5f,0);
|
||||
QuadItem = IGraphics::CQuadItem(0, 0, Screen.w, ConsoleHeight);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
// do small bar shadow
|
||||
Graphics()->TextureSet(-1);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->QuadsBegin();
|
||||
Array[0] = IGraphics::CColorVertex(0, 0,0,0, 0.0f);
|
||||
Array[1] = IGraphics::CColorVertex(1, 0,0,0, 0.0f);
|
||||
Array[2] = IGraphics::CColorVertex(2, 0,0,0, 0.25f);
|
||||
|
@ -380,20 +380,20 @@ void CGameConsole::OnRender()
|
|||
Graphics()->SetColorVertex(Array, 4);
|
||||
QuadItem = IGraphics::CQuadItem(0, ConsoleHeight-20, Screen.w, 10);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
// do the lower bar
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CONSOLE_BAR].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.9f);
|
||||
Graphics()->QuadsSetSubset(0,0.1f,Screen.w*0.015f,1-0.1f);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.9f);
|
||||
Graphics()->QuadsSetSubset(0,0.1f,Screen.w*0.015f,1-0.1f);
|
||||
QuadItem = IGraphics::CQuadItem(0,ConsoleHeight-10.0f,Screen.w,10.0f);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
ConsoleHeight -= 22.0f;
|
||||
|
||||
CInstance *pConsole = CurrentConsole();
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
ConsoleHeight -= 22.0f;
|
||||
|
||||
CInstance *pConsole = CurrentConsole();
|
||||
|
||||
{
|
||||
float FontSize = 10.0f;
|
||||
|
@ -410,7 +410,7 @@ void CGameConsole::OnRender()
|
|||
Info.m_pCurrentCmd = pConsole->m_aCompletionBuffer;
|
||||
TextRender()->SetCursor(&Info.m_Cursor, x+Info.m_Offset, y+RowHeight+2.0f, FontSize, TEXTFLAG_RENDER);
|
||||
|
||||
// render prompt
|
||||
// render prompt
|
||||
CTextCursor Cursor;
|
||||
TextRender()->SetCursor(&Cursor, x, y, FontSize, TEXTFLAG_RENDER);
|
||||
const char *pPrompt = "> ";
|
||||
|
@ -427,7 +427,7 @@ void CGameConsole::OnRender()
|
|||
pPrompt = "NOT CONNECTED> ";
|
||||
}
|
||||
TextRender()->TextEx(&Cursor, pPrompt, -1);
|
||||
|
||||
|
||||
x = Cursor.m_X;
|
||||
|
||||
// render console input (wrap line)
|
||||
|
@ -435,7 +435,7 @@ void CGameConsole::OnRender()
|
|||
y -= (Lines - 1) * FontSize;
|
||||
TextRender()->SetCursor(&Cursor, x, y, FontSize, TEXTFLAG_RENDER);
|
||||
Cursor.m_LineWidth = Screen.w - 10.0f - x;
|
||||
|
||||
|
||||
//hide rcon password
|
||||
char aInputString[256];
|
||||
str_copy(aInputString, pConsole->m_Input.GetString(), sizeof(aInputString));
|
||||
|
@ -444,12 +444,12 @@ void CGameConsole::OnRender()
|
|||
for(int i = 0; i < pConsole->m_Input.GetLength(); ++i)
|
||||
aInputString[i] = '*';
|
||||
}
|
||||
|
||||
|
||||
TextRender()->TextEx(&Cursor, aInputString, pConsole->m_Input.GetCursorOffset());
|
||||
CTextCursor Marker = Cursor;
|
||||
TextRender()->TextEx(&Marker, "|", -1);
|
||||
TextRender()->TextEx(&Cursor, aInputString+pConsole->m_Input.GetCursorOffset(), -1);
|
||||
|
||||
|
||||
// render possible commands
|
||||
if(m_ConsoleType == CONSOLETYPE_LOCAL || Client()->RconAuthed())
|
||||
{
|
||||
|
@ -457,12 +457,12 @@ void CGameConsole::OnRender()
|
|||
{
|
||||
m_pConsole->PossibleCommands(pConsole->m_aCompletionBuffer, pConsole->m_CompletionFlagmask, PossibleCommandsRenderCallback, &Info);
|
||||
pConsole->m_CompletionRenderOffset = Info.m_Offset;
|
||||
|
||||
|
||||
if(Info.m_EnumCount <= 0)
|
||||
{
|
||||
if(pConsole->m_pCommand)
|
||||
{
|
||||
|
||||
|
||||
char aBuf[512];
|
||||
str_format(aBuf, sizeof(aBuf), "Help: %s ", pConsole->m_pCommand->m_pHelp);
|
||||
TextRender()->TextEx(&Info.m_Cursor, aBuf, -1);
|
||||
|
@ -492,7 +492,7 @@ void CGameConsole::OnRender()
|
|||
pEntry->m_YOffset = Cursor.m_Y+Cursor.m_FontSize+LineOffset;
|
||||
}
|
||||
OffsetY += pEntry->m_YOffset;
|
||||
|
||||
|
||||
// next page when lines reach the top
|
||||
if(y-OffsetY <= RowHeight)
|
||||
break;
|
||||
|
@ -533,7 +533,7 @@ void CGameConsole::OnRender()
|
|||
str_format(aBuf, sizeof(aBuf), "v%s", GAME_VERSION);
|
||||
float Width = TextRender()->TextWidth(0, FontSize, aBuf, -1);
|
||||
TextRender()->Text(0, Screen.w-Width-10.0f, 0.0f, FontSize, aBuf, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CGameConsole::OnMessage(int MsgType, void *pRawMsg)
|
||||
|
@ -551,7 +551,7 @@ bool CGameConsole::OnInput(IInput::CEvent Event)
|
|||
Toggle(m_ConsoleType);
|
||||
else
|
||||
CurrentConsole()->OnInput(Event);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -562,7 +562,7 @@ void CGameConsole::Toggle(int Type)
|
|||
// don't toggle console, just switch what console to use
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
if (m_ConsoleState == CONSOLE_CLOSED || m_ConsoleState == CONSOLE_OPEN)
|
||||
{
|
||||
m_StateChangeEnd = TimeNow()+m_StateChangeDuration;
|
||||
|
@ -671,10 +671,10 @@ void CGameConsole::OnConsoleInit()
|
|||
m_RemoteConsole.Init(this);
|
||||
|
||||
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
||||
|
||||
|
||||
//
|
||||
Console()->RegisterPrintCallback(ClientConsolePrintCallback, this);
|
||||
|
||||
|
||||
Console()->Register("toggle_local_console", "", CFGFLAG_CLIENT, ConToggleLocalConsole, this, "Toggle local console");
|
||||
Console()->Register("toggle_remote_console", "", CFGFLAG_CLIENT, ConToggleRemoteConsole, this, "Toggle remote console");
|
||||
Console()->Register("clear_local_console", "", CFGFLAG_CLIENT, ConClearLocalConsole, this, "Clear local console");
|
||||
|
|
|
@ -24,15 +24,15 @@ class CGameConsole : public CComponent
|
|||
int m_Type;
|
||||
int m_CompletionEnumerationCount;
|
||||
int m_BacklogActPage;
|
||||
|
||||
|
||||
public:
|
||||
CGameConsole *m_pGameConsole;
|
||||
|
||||
|
||||
char m_aCompletionBuffer[128];
|
||||
int m_CompletionChosen;
|
||||
int m_CompletionFlagmask;
|
||||
float m_CompletionRenderOffset;
|
||||
|
||||
|
||||
IConsole::CCommandInfo *m_pCommand;
|
||||
|
||||
CInstance(int t);
|
||||
|
@ -42,22 +42,22 @@ class CGameConsole : public CComponent
|
|||
void ClearHistory();
|
||||
|
||||
void ExecuteLine(const char *pLine);
|
||||
|
||||
|
||||
void OnInput(IInput::CEvent Event);
|
||||
void PrintLine(const char *pLine);
|
||||
|
||||
|
||||
const char *GetString() const { return m_Input.GetString(); }
|
||||
static void PossibleCommandsCompleteCallback(const char *pStr, void *pUser);
|
||||
};
|
||||
|
||||
|
||||
class IConsole *m_pConsole;
|
||||
|
||||
|
||||
CInstance m_LocalConsole;
|
||||
CInstance m_RemoteConsole;
|
||||
|
||||
|
||||
CInstance *CurrentConsole();
|
||||
float TimeNow();
|
||||
|
||||
|
||||
int m_ConsoleType;
|
||||
int m_ConsoleState;
|
||||
float m_StateChangeEnd;
|
||||
|
@ -74,7 +74,7 @@ class CGameConsole : public CComponent
|
|||
static void ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData);
|
||||
|
||||
|
||||
public:
|
||||
enum
|
||||
{
|
||||
|
|
|
@ -28,7 +28,7 @@ void CControls::OnReset()
|
|||
m_LastData.m_Fire &= INPUT_STATE_MASK;
|
||||
m_LastData.m_Jump = 0;
|
||||
m_InputData = m_LastData;
|
||||
|
||||
|
||||
m_InputDirectionLeft = 0;
|
||||
m_InputDirectionRight = 0;
|
||||
}
|
||||
|
@ -86,31 +86,31 @@ void CControls::OnConsoleInit()
|
|||
Console()->Register("+hook", "", CFGFLAG_CLIENT, ConKeyInputState, &m_InputData.m_Hook, "Hook");
|
||||
Console()->Register("+fire", "", CFGFLAG_CLIENT, ConKeyInputCounter, &m_InputData.m_Fire, "Fire");
|
||||
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 1}; Console()->Register("+weapon1", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to hammer"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 2}; Console()->Register("+weapon2", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to gun"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 3}; Console()->Register("+weapon3", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to shotgun"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 4}; Console()->Register("+weapon4", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to grenade"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 5}; Console()->Register("+weapon5", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to rifle"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 1}; Console()->Register("+weapon1", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to hammer"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 2}; Console()->Register("+weapon2", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to gun"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 3}; Console()->Register("+weapon3", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to shotgun"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 4}; Console()->Register("+weapon4", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to grenade"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 5}; Console()->Register("+weapon5", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to rifle"); }
|
||||
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_NextWeapon, 0}; Console()->Register("+nextweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to next weapon"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_PrevWeapon, 0}; Console()->Register("+prevweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to previous weapon"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_NextWeapon, 0}; Console()->Register("+nextweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to next weapon"); }
|
||||
{ static CInputSet s_Set = {this, &m_InputData.m_PrevWeapon, 0}; Console()->Register("+prevweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to previous weapon"); }
|
||||
}
|
||||
|
||||
void CControls::OnMessage(int Msg, void *pRawMsg)
|
||||
{
|
||||
if(Msg == NETMSGTYPE_SV_WEAPONPICKUP)
|
||||
{
|
||||
CNetMsg_Sv_WeaponPickup *pMsg = (CNetMsg_Sv_WeaponPickup *)pRawMsg;
|
||||
if(g_Config.m_ClAutoswitchWeapons)
|
||||
m_InputData.m_WantedWeapon = pMsg->m_Weapon+1;
|
||||
}
|
||||
if(Msg == NETMSGTYPE_SV_WEAPONPICKUP)
|
||||
{
|
||||
CNetMsg_Sv_WeaponPickup *pMsg = (CNetMsg_Sv_WeaponPickup *)pRawMsg;
|
||||
if(g_Config.m_ClAutoswitchWeapons)
|
||||
m_InputData.m_WantedWeapon = pMsg->m_Weapon+1;
|
||||
}
|
||||
}
|
||||
|
||||
int CControls::SnapInput(int *pData)
|
||||
{
|
||||
static int64 LastSendTime = 0;
|
||||
bool Send = false;
|
||||
|
||||
|
||||
// update player state
|
||||
if(m_pClient->m_pChat->IsActive())
|
||||
m_InputData.m_PlayerFlags = PLAYERFLAG_CHATTING;
|
||||
|
@ -118,20 +118,20 @@ int CControls::SnapInput(int *pData)
|
|||
m_InputData.m_PlayerFlags = PLAYERFLAG_IN_MENU;
|
||||
else
|
||||
m_InputData.m_PlayerFlags = PLAYERFLAG_PLAYING;
|
||||
|
||||
|
||||
if(m_pClient->m_pScoreboard->Active())
|
||||
m_InputData.m_PlayerFlags |= PLAYERFLAG_SCOREBOARD;
|
||||
|
||||
if(m_LastData.m_PlayerFlags != m_InputData.m_PlayerFlags)
|
||||
Send = true;
|
||||
|
||||
|
||||
m_LastData.m_PlayerFlags = m_InputData.m_PlayerFlags;
|
||||
|
||||
|
||||
// we freeze the input if chat or menu is activated
|
||||
if(!(m_InputData.m_PlayerFlags&PLAYERFLAG_PLAYING))
|
||||
{
|
||||
OnReset();
|
||||
|
||||
|
||||
mem_copy(pData, &m_InputData, sizeof(m_InputData));
|
||||
|
||||
// send once a second just to be sure
|
||||
|
@ -140,7 +140,7 @@ int CControls::SnapInput(int *pData)
|
|||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
m_InputData.m_TargetX = (int)m_MousePos.x;
|
||||
m_InputData.m_TargetY = (int)m_MousePos.y;
|
||||
if(!m_InputData.m_TargetX && !m_InputData.m_TargetY)
|
||||
|
@ -148,7 +148,7 @@ int CControls::SnapInput(int *pData)
|
|||
m_InputData.m_TargetX = 1;
|
||||
m_MousePos.x = 1;
|
||||
}
|
||||
|
||||
|
||||
// set direction
|
||||
m_InputData.m_Direction = 0;
|
||||
if(m_InputDirectionLeft && !m_InputDirectionRight)
|
||||
|
@ -184,16 +184,16 @@ int CControls::SnapInput(int *pData)
|
|||
if(time_get() > LastSendTime + time_freq()/25)
|
||||
Send = true;
|
||||
}
|
||||
|
||||
// copy and return size
|
||||
|
||||
// copy and return size
|
||||
m_LastData = m_InputData;
|
||||
|
||||
|
||||
if(!Send)
|
||||
return 0;
|
||||
|
||||
|
||||
LastSendTime = time_get();
|
||||
mem_copy(pData, &m_InputData, sizeof(m_InputData));
|
||||
return sizeof(m_InputData);
|
||||
return sizeof(m_InputData);
|
||||
}
|
||||
|
||||
void CControls::OnRender()
|
||||
|
@ -211,7 +211,7 @@ bool CControls::OnMouseMove(float x, float y)
|
|||
{
|
||||
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)
|
||||
return false;
|
||||
|
||||
|
||||
m_MousePos += vec2(x, y); // TODO: ugly
|
||||
ClampMousePos();
|
||||
|
||||
|
@ -224,14 +224,14 @@ void CControls::ClampMousePos()
|
|||
{
|
||||
m_MousePos.x = clamp(m_MousePos.x, 200.0f, Collision()->GetWidth()*32-200.0f);
|
||||
m_MousePos.y = clamp(m_MousePos.y, 200.0f, Collision()->GetHeight()*32-200.0f);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
float CameraMaxDistance = 200.0f;
|
||||
float FollowFactor = g_Config.m_ClMouseFollowfactor/100.0f;
|
||||
float MouseMax = min(CameraMaxDistance/FollowFactor + g_Config.m_ClMouseDeadzone, (float)g_Config.m_ClMouseMaxDistance);
|
||||
|
||||
|
||||
if(length(m_MousePos) > MouseMax)
|
||||
m_MousePos = normalize(m_MousePos)*MouseMax;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <game/client/component.h>
|
||||
|
||||
class CControls : public CComponent
|
||||
{
|
||||
{
|
||||
public:
|
||||
vec2 m_MousePos;
|
||||
vec2 m_TargetPos;
|
||||
|
@ -17,7 +17,7 @@ public:
|
|||
int m_InputDirectionRight;
|
||||
|
||||
CControls();
|
||||
|
||||
|
||||
virtual void OnReset();
|
||||
virtual void OnRelease();
|
||||
virtual void OnRender();
|
||||
|
@ -25,7 +25,7 @@ public:
|
|||
virtual bool OnMouseMove(float x, float y);
|
||||
virtual void OnConsoleInit();
|
||||
virtual void OnPlayerDeath();
|
||||
|
||||
|
||||
int SnapInput(int *pData);
|
||||
void ClampMousePos();
|
||||
};
|
||||
|
|
|
@ -19,7 +19,7 @@ void CCountryFlags::LoadCountryflagsIndexfile()
|
|||
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", "couldn't open index file");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
char aOrigin[128];
|
||||
CLineReader LineReader;
|
||||
LineReader.Init(File);
|
||||
|
@ -28,7 +28,7 @@ void CCountryFlags::LoadCountryflagsIndexfile()
|
|||
{
|
||||
if(!str_length(pLine) || pLine[0] == '#') // skip empty lines and comments
|
||||
continue;
|
||||
|
||||
|
||||
str_copy(aOrigin, pLine, sizeof(aOrigin));
|
||||
char *pReplacement = LineReader.Get();
|
||||
if(!pReplacement)
|
||||
|
@ -36,7 +36,7 @@ void CCountryFlags::LoadCountryflagsIndexfile()
|
|||
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", "unexpected end of index file");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if(pReplacement[0] != '=' || pReplacement[1] != '=' || pReplacement[2] != ' ')
|
||||
{
|
||||
char aBuf[128];
|
||||
|
@ -44,7 +44,7 @@ void CCountryFlags::LoadCountryflagsIndexfile()
|
|||
Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// load the graphic file
|
||||
char aBuf[128];
|
||||
str_format(aBuf, sizeof(aBuf), "countryflags/%s.png", aOrigin);
|
||||
|
|
|
@ -13,16 +13,16 @@ public:
|
|||
{
|
||||
int m_CountryCode;
|
||||
int m_Texture;
|
||||
|
||||
|
||||
bool operator<(const CCountryFlag &Other) { return m_CountryCode < Other.m_CountryCode; }
|
||||
};
|
||||
|
||||
|
||||
void OnInit();
|
||||
|
||||
|
||||
int Num() const;
|
||||
const CCountryFlag *Get(int Index) const;
|
||||
int Find(int CountryCode) const;
|
||||
|
||||
|
||||
private:
|
||||
sorted_array<CCountryFlag> m_aCountryFlags;
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ class CDamageInd : public CComponent
|
|||
CItem *CreateI();
|
||||
void DestroyI(CItem *i);
|
||||
|
||||
public:
|
||||
public:
|
||||
CDamageInd();
|
||||
|
||||
void Create(vec2 Pos, vec2 Dir);
|
||||
|
|
|
@ -22,16 +22,16 @@ void CDebugHud::RenderNetCorrections()
|
|||
if(!g_Config.m_Debug || g_Config.m_DbgGraphs || !m_pClient->m_Snap.m_pLocalCharacter || !m_pClient->m_Snap.m_pLocalPrevCharacter)
|
||||
return;
|
||||
|
||||
float Width = 300*Graphics()->ScreenAspect();
|
||||
float Width = 300*Graphics()->ScreenAspect();
|
||||
Graphics()->MapScreen(0, 0, Width, 300);
|
||||
|
||||
|
||||
/*float speed = distance(vec2(netobjects.local_prev_character->x, netobjects.local_prev_character->y),
|
||||
vec2(netobjects.local_character->x, netobjects.local_character->y));*/
|
||||
|
||||
float Velspeed = length(vec2(m_pClient->m_Snap.m_pLocalCharacter->m_VelX/256.0f, m_pClient->m_Snap.m_pLocalCharacter->m_VelY/256.0f))*50;
|
||||
float Ramp = VelocityRamp(Velspeed, m_pClient->m_Tuning.m_VelrampStart, m_pClient->m_Tuning.m_VelrampRange, m_pClient->m_Tuning.m_VelrampCurvature);
|
||||
|
||||
const char *paStrings[] = {"velspeed:", "velspeed*ramp:", "ramp:", "Pos", " x:", " y:", "netobj corrections", " num:", " on:"};
|
||||
|
||||
const char *paStrings[] = {"velspeed:", "velspeed*ramp:", "ramp:", "Pos", " x:", " y:", "netobj corrections", " num:", " on:"};
|
||||
const int Num = sizeof(paStrings)/sizeof(char *);
|
||||
const float LineHeight = 6.0f;
|
||||
const float Fontsize = 5.0f;
|
||||
|
@ -75,11 +75,11 @@ void CDebugHud::RenderTuning()
|
|||
// render tuning debugging
|
||||
if(!g_Config.m_DbgTuning)
|
||||
return;
|
||||
|
||||
|
||||
CTuningParams StandardTuning;
|
||||
|
||||
|
||||
Graphics()->MapScreen(0, 0, 300*Graphics()->ScreenAspect(), 300);
|
||||
|
||||
|
||||
float y = 50.0f;
|
||||
int Count = 0;
|
||||
for(int i = 0; i < m_pClient->m_Tuning.Num(); i++)
|
||||
|
@ -88,7 +88,7 @@ void CDebugHud::RenderTuning()
|
|||
float Current, Standard;
|
||||
m_pClient->m_Tuning.Get(i, &Current);
|
||||
StandardTuning.Get(i, &Standard);
|
||||
|
||||
|
||||
if(Standard == Current)
|
||||
TextRender()->TextColor(1,1,1,1.0f);
|
||||
else
|
||||
|
@ -96,7 +96,7 @@ void CDebugHud::RenderTuning()
|
|||
|
||||
float w;
|
||||
float x = 5.0f;
|
||||
|
||||
|
||||
str_format(aBuf, sizeof(aBuf), "%.2f", Standard);
|
||||
x += 20.0f;
|
||||
w = TextRender()->TextWidth(0, 5, aBuf, -1);
|
||||
|
@ -109,12 +109,12 @@ void CDebugHud::RenderTuning()
|
|||
|
||||
x += 5.0f;
|
||||
TextRender()->Text(0x0, x, y+Count*6, 5, m_pClient->m_Tuning.m_apNames[i], -1);
|
||||
|
||||
|
||||
Count++;
|
||||
}
|
||||
|
||||
|
||||
y = y+Count*6;
|
||||
|
||||
|
||||
Graphics()->TextureSet(-1);
|
||||
Graphics()->BlendNormal();
|
||||
Graphics()->LinesBegin();
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#include <game/client/component.h>
|
||||
|
||||
class CDebugHud : public CComponent
|
||||
{
|
||||
{
|
||||
void RenderNetCorrections();
|
||||
void RenderTuning();
|
||||
public:
|
||||
|
|
|
@ -43,7 +43,7 @@ void CEffects::AirJump(vec2 Pos)
|
|||
|
||||
p.m_Pos = Pos + vec2(6.0f, 16.0f);
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p);
|
||||
|
||||
|
||||
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, Pos);
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ void CEffects::PowerupShine(vec2 Pos, vec2 size)
|
|||
{
|
||||
if(!m_Add50hz)
|
||||
return;
|
||||
|
||||
|
||||
CParticle p;
|
||||
p.SetDefault();
|
||||
p.m_Spr = SPRITE_PART_SLICE;
|
||||
|
@ -77,7 +77,7 @@ void CEffects::SmokeTrail(vec2 Pos, vec2 Vel)
|
|||
{
|
||||
if(!m_Add50hz)
|
||||
return;
|
||||
|
||||
|
||||
CParticle p;
|
||||
p.SetDefault();
|
||||
p.m_Spr = SPRITE_PART_SMOKE;
|
||||
|
@ -96,7 +96,7 @@ void CEffects::SkidTrail(vec2 Pos, vec2 Vel)
|
|||
{
|
||||
if(!m_Add100hz)
|
||||
return;
|
||||
|
||||
|
||||
CParticle p;
|
||||
p.SetDefault();
|
||||
p.m_Spr = SPRITE_PART_SMOKE;
|
||||
|
@ -108,14 +108,14 @@ void CEffects::SkidTrail(vec2 Pos, vec2 Vel)
|
|||
p.m_Friction = 0.7f;
|
||||
p.m_Gravity = frandom()*-500.0f;
|
||||
p.m_Color = vec4(0.75f,0.75f,0.75f,1.0f);
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p);
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p);
|
||||
}
|
||||
|
||||
void CEffects::BulletTrail(vec2 Pos)
|
||||
{
|
||||
if(!m_Add100hz)
|
||||
return;
|
||||
|
||||
|
||||
CParticle p;
|
||||
p.SetDefault();
|
||||
p.m_Spr = SPRITE_PART_BALL;
|
||||
|
@ -145,7 +145,7 @@ void CEffects::PlayerSpawn(vec2 Pos)
|
|||
p.m_Friction = 0.7f;
|
||||
p.m_Color = vec4(0xb5/255.0f, 0x50/255.0f, 0xcb/255.0f, 1.0f);
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p);
|
||||
|
||||
|
||||
}
|
||||
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_PLAYER_SPAWN, 1.0f, Pos);
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ void CEffects::PlayerDeath(vec2 Pos, int ClientID)
|
|||
{
|
||||
vec3 BloodColor(1.0f,1.0f,1.0f);
|
||||
|
||||
if(ClientID >= 0)
|
||||
if(ClientID >= 0)
|
||||
{
|
||||
if(m_pClient->m_aClients[ClientID].m_UseCustomColor)
|
||||
BloodColor = m_pClient->m_pSkins->GetColorV3(m_pClient->m_aClients[ClientID].m_ColorBody);
|
||||
|
@ -165,7 +165,7 @@ void CEffects::PlayerDeath(vec2 Pos, int ClientID)
|
|||
BloodColor = s->m_BloodColor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(int i = 0; i < 64; i++)
|
||||
{
|
||||
CParticle p;
|
||||
|
@ -195,11 +195,11 @@ void CEffects::Explosion(vec2 Pos)
|
|||
{
|
||||
if(x == 0 && y == 0)
|
||||
continue;
|
||||
|
||||
|
||||
float a = 1 - (length(vec2(x,y)) / length(vec2(8,8)));
|
||||
m_pClient->m_pFlow->Add(Pos+vec2(x,y)*16, normalize(vec2(x,y))*5000.0f*a, 10.0f);
|
||||
}
|
||||
|
||||
|
||||
// add the explosion
|
||||
CParticle p;
|
||||
p.SetDefault();
|
||||
|
@ -210,7 +210,7 @@ void CEffects::Explosion(vec2 Pos)
|
|||
p.m_EndSize = 0;
|
||||
p.m_Rot = frandom()*pi*2;
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_EXPLOSIONS, &p);
|
||||
|
||||
|
||||
// add the smoke
|
||||
for(int i = 0; i < 24; i++)
|
||||
{
|
||||
|
@ -241,7 +241,7 @@ void CEffects::HammerHit(vec2 Pos)
|
|||
p.m_StartSize = 120.0f;
|
||||
p.m_EndSize = 0;
|
||||
p.m_Rot = frandom()*pi*2;
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_EXPLOSIONS, &p);
|
||||
m_pClient->m_pParticles->Add(CParticles::GROUP_EXPLOSIONS, &p);
|
||||
m_pClient->m_pSounds->Play(CSounds::CHN_WORLD, SOUND_HAMMER_HIT, 1.0f, Pos);
|
||||
}
|
||||
|
||||
|
@ -253,7 +253,7 @@ void CEffects::OnRender()
|
|||
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
|
||||
{
|
||||
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
|
||||
|
||||
|
||||
if(time_get()-LastUpdate100hz > time_freq()/(100*pInfo->m_Speed))
|
||||
{
|
||||
m_Add100hz = true;
|
||||
|
@ -269,10 +269,10 @@ void CEffects::OnRender()
|
|||
}
|
||||
else
|
||||
m_Add50hz = false;
|
||||
|
||||
|
||||
if(m_Add50hz)
|
||||
m_pClient->m_pFlow->Update();
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -291,7 +291,7 @@ void CEffects::OnRender()
|
|||
}
|
||||
else
|
||||
m_Add50hz = false;
|
||||
|
||||
|
||||
if(m_Add50hz)
|
||||
m_pClient->m_pFlow->Update();
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#include <game/client/component.h>
|
||||
|
||||
class CEffects : public CComponent
|
||||
{
|
||||
{
|
||||
bool m_Add50hz;
|
||||
bool m_Add100hz;
|
||||
public:
|
||||
|
|
|
@ -53,7 +53,7 @@ bool CEmoticon::OnMouseMove(float x, float y)
|
|||
{
|
||||
if(!m_Active)
|
||||
return false;
|
||||
|
||||
|
||||
m_SelectorMouse += vec2(x,y);
|
||||
return true;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ void CEmoticon::DrawCircle(float x, float y, float r, int Segments)
|
|||
m_pClient->Graphics()->QuadsDrawFreeform(Array, NumItems);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CEmoticon::OnRender()
|
||||
{
|
||||
if(!m_Active)
|
||||
|
@ -100,9 +100,9 @@ void CEmoticon::OnRender()
|
|||
m_WasActive = false;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
m_WasActive = true;
|
||||
|
||||
|
||||
if (length(m_SelectorMouse) > 140)
|
||||
m_SelectorMouse = normalize(m_SelectorMouse) * 140;
|
||||
|
||||
|
@ -113,7 +113,7 @@ void CEmoticon::OnRender()
|
|||
if (length(m_SelectorMouse) > 100)
|
||||
m_SelectedEmote = (int)(SelectedAngle / (2*pi) * NUM_EMOTICONS);
|
||||
|
||||
CUIRect Screen = *UI()->Screen();
|
||||
CUIRect Screen = *UI()->Screen();
|
||||
|
||||
Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h);
|
||||
|
||||
|
@ -147,12 +147,12 @@ void CEmoticon::OnRender()
|
|||
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(1,1,1,1);
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(1,1,1,1);
|
||||
IGraphics::CQuadItem QuadItem(m_SelectorMouse.x+Screen.w/2,m_SelectorMouse.y+Screen.h/2,24,24);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->QuadsEnd();
|
||||
}
|
||||
|
||||
void CEmoticon::Emote(int Emoticon)
|
||||
|
|
|
@ -8,19 +8,19 @@
|
|||
class CEmoticon : public CComponent
|
||||
{
|
||||
void DrawCircle(float x, float y, float r, int Segments);
|
||||
|
||||
|
||||
bool m_WasActive;
|
||||
bool m_Active;
|
||||
|
||||
|
||||
vec2 m_SelectorMouse;
|
||||
int m_SelectedEmote;
|
||||
|
||||
static void ConKeyEmoticon(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConEmote(IConsole::IResult *pResult, void *pUserData);
|
||||
|
||||
|
||||
public:
|
||||
CEmoticon();
|
||||
|
||||
|
||||
virtual void OnReset();
|
||||
virtual void OnConsoleInit();
|
||||
virtual void OnRender();
|
||||
|
|
|
@ -12,7 +12,7 @@ CFlow::CFlow()
|
|||
m_Width = 0;
|
||||
m_Spacing = 16;
|
||||
}
|
||||
|
||||
|
||||
void CFlow::DbgRender()
|
||||
{
|
||||
if(!m_pCells)
|
||||
|
@ -34,7 +34,7 @@ void CFlow::DbgRender()
|
|||
NumItems = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(NumItems)
|
||||
Graphics()->LinesDraw(Array, NumItems);
|
||||
Graphics()->LinesEnd();
|
||||
|
@ -47,12 +47,12 @@ void CFlow::Init()
|
|||
mem_free(m_pCells);
|
||||
m_pCells = 0;
|
||||
}
|
||||
|
||||
|
||||
CMapItemLayerTilemap *pTilemap = Layers()->GameLayer();
|
||||
m_Width = pTilemap->m_Width*32/m_Spacing;
|
||||
m_Height = pTilemap->m_Height*32/m_Spacing;
|
||||
|
||||
// allocate and clear
|
||||
// allocate and clear
|
||||
m_pCells = (CCell *)mem_alloc(sizeof(CCell)*m_Width*m_Height, 1);
|
||||
for(int y = 0; y < m_Height; y++)
|
||||
for(int x = 0; x < m_Width; x++)
|
||||
|
@ -63,7 +63,7 @@ void CFlow::Update()
|
|||
{
|
||||
if(!m_pCells)
|
||||
return;
|
||||
|
||||
|
||||
for(int y = 0; y < m_Height; y++)
|
||||
for(int x = 0; x < m_Width; x++)
|
||||
m_pCells[y*m_Width+x].m_Vel *= 0.85f;
|
||||
|
@ -73,24 +73,24 @@ vec2 CFlow::Get(vec2 Pos)
|
|||
{
|
||||
if(!m_pCells)
|
||||
return vec2(0,0);
|
||||
|
||||
|
||||
int x = (int)(Pos.x / m_Spacing);
|
||||
int y = (int)(Pos.y / m_Spacing);
|
||||
if(x < 0 || y < 0 || x >= m_Width || y >= m_Height)
|
||||
return vec2(0,0);
|
||||
|
||||
return m_pCells[y*m_Width+x].m_Vel;
|
||||
|
||||
return m_pCells[y*m_Width+x].m_Vel;
|
||||
}
|
||||
|
||||
void CFlow::Add(vec2 Pos, vec2 Vel, float Size)
|
||||
{
|
||||
if(!m_pCells)
|
||||
return;
|
||||
|
||||
|
||||
int x = (int)(Pos.x / m_Spacing);
|
||||
int y = (int)(Pos.y / m_Spacing);
|
||||
if(x < 0 || y < 0 || x >= m_Width || y >= m_Height)
|
||||
return;
|
||||
|
||||
|
||||
m_pCells[y*m_Width+x].m_Vel += Vel;
|
||||
}
|
||||
|
|
|
@ -16,12 +16,12 @@ class CFlow : public CComponent
|
|||
int m_Height;
|
||||
int m_Width;
|
||||
int m_Spacing;
|
||||
|
||||
|
||||
void DbgRender();
|
||||
void Init();
|
||||
public:
|
||||
CFlow();
|
||||
|
||||
|
||||
vec2 Get(vec2 Pos);
|
||||
void Add(vec2 Pos, vec2 Vel, float Size);
|
||||
void Update();
|
||||
|
|
|
@ -22,7 +22,7 @@ CHud::CHud()
|
|||
// won't work if zero
|
||||
m_AverageFPS = 1.0f;
|
||||
}
|
||||
|
||||
|
||||
void CHud::OnReset()
|
||||
{
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ void CHud::OnReset()
|
|||
void CHud::RenderGameTimer()
|
||||
{
|
||||
float Half = 300.0f*Graphics()->ScreenAspect()/2.0f;
|
||||
|
||||
|
||||
if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_SUDDENDEATH))
|
||||
{
|
||||
char Buf[32];
|
||||
|
@ -40,7 +40,7 @@ void CHud::RenderGameTimer()
|
|||
Time = m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit*60 - ((Client()->GameTick()-m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick)/Client()->GameTickSpeed());
|
||||
|
||||
if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)
|
||||
Time = 0;
|
||||
Time = 0;
|
||||
}
|
||||
else
|
||||
Time = (Client()->GameTick()-m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick)/Client()->GameTickSpeed();
|
||||
|
@ -72,7 +72,7 @@ void CHud::RenderSuddenDeath()
|
|||
}
|
||||
|
||||
void CHud::RenderScoreHud()
|
||||
{
|
||||
{
|
||||
// render small score hud
|
||||
if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER))
|
||||
{
|
||||
|
@ -89,7 +89,7 @@ void CHud::RenderScoreHud()
|
|||
float ScoreWidthMax = max(max(aScoreTeamWidth[TEAM_RED], aScoreTeamWidth[TEAM_BLUE]), TextRender()->TextWidth(0, 14.0f, "100", -1));
|
||||
float Split = 3.0f;
|
||||
float ImageSize = GameFlags&GAMEFLAG_FLAGS ? 16.0f : Split;
|
||||
|
||||
|
||||
for(int t = 0; t < 2; t++)
|
||||
{
|
||||
// draw box
|
||||
|
@ -178,7 +178,7 @@ void CHud::RenderScoreHud()
|
|||
float aScoreWidth[2] = {TextRender()->TextWidth(0, 14.0f, aScore[0], -1), TextRender()->TextWidth(0, 14.0f, aScore[1], -1)};
|
||||
float ScoreWidthMax = max(max(aScoreWidth[0], aScoreWidth[1]), TextRender()->TextWidth(0, 14.0f, "10", -1));
|
||||
float Split = 3.0f, ImageSize = 16.0f, PosSize = 16.0f;
|
||||
|
||||
|
||||
for(int t = 0; t < 2; t++)
|
||||
{
|
||||
// draw box
|
||||
|
@ -230,7 +230,7 @@ void CHud::RenderWarmupTimer()
|
|||
str_format(Buf, sizeof(Buf), "%d", Seconds);
|
||||
w = TextRender()->TextWidth(0, FontSize, Buf, -1);
|
||||
TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 75, FontSize, Buf, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CHud::MapscreenToGroup(float CenterX, float CenterY, CMapItemGroup *pGroup)
|
||||
|
@ -269,7 +269,7 @@ void CHud::RenderTeambalanceWarning()
|
|||
// render prompt about team-balance
|
||||
bool Flash = time_get()/(time_freq()/2)%2 == 0;
|
||||
if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS)
|
||||
{
|
||||
{
|
||||
int TeamDiff = m_pClient->m_Snap.m_aTeamSize[TEAM_RED]-m_pClient->m_Snap.m_aTeamSize[TEAM_BLUE];
|
||||
if (g_Config.m_ClWarningTeambalance && (TeamDiff >= 2 || TeamDiff <= -2))
|
||||
{
|
||||
|
@ -289,7 +289,7 @@ void CHud::RenderVoting()
|
|||
{
|
||||
if(!m_pClient->m_pVoting->IsVoting() || Client()->State() == IClient::STATE_DEMOPLAYBACK)
|
||||
return;
|
||||
|
||||
|
||||
Graphics()->TextureSet(-1);
|
||||
Graphics()->QuadsBegin();
|
||||
Graphics()->SetColor(0,0,0,0.40f);
|
||||
|
@ -309,7 +309,7 @@ void CHud::RenderVoting()
|
|||
Cursor.m_LineWidth = 100.0f-tw;
|
||||
Cursor.m_MaxLines = 3;
|
||||
TextRender()->TextEx(&Cursor, m_pClient->m_pVoting->VoteDescription(), -1);
|
||||
|
||||
|
||||
// reason
|
||||
str_format(aBuf, sizeof(aBuf), "%s %s", Localize("Reason:"), m_pClient->m_pVoting->VoteReason());
|
||||
TextRender()->SetCursor(&Cursor, 5.0f, 79.0f, 6.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END);
|
||||
|
@ -318,7 +318,7 @@ void CHud::RenderVoting()
|
|||
|
||||
CUIRect Base = {5, 88, 100, 4};
|
||||
m_pClient->m_pVoting->RenderBars(Base, false);
|
||||
|
||||
|
||||
const char *pYesKey = m_pClient->m_pBinds->GetKey("vote yes");
|
||||
const char *pNoKey = m_pClient->m_pBinds->GetKey("vote no");
|
||||
str_format(aBuf, sizeof(aBuf), "%s - %s", pYesKey, Localize("Vote yes"));
|
||||
|
@ -333,7 +333,7 @@ void CHud::RenderCursor()
|
|||
{
|
||||
if(!m_pClient->m_Snap.m_pLocalCharacter || Client()->State() == IClient::STATE_DEMOPLAYBACK)
|
||||
return;
|
||||
|
||||
|
||||
MapscreenToGroup(m_pClient->m_pCamera->m_Center.x, m_pClient->m_pCamera->m_Center.y, Layers()->GameGroup());
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
|
@ -359,9 +359,9 @@ void CHud::RenderHealthAndAmmo(const CNetObj_Character *pCharacter)
|
|||
// render gui stuff
|
||||
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
|
||||
|
||||
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
|
||||
// if weaponstage is active, put a "glow" around the stage ammo
|
||||
RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[pCharacter->m_Weapon%NUM_WEAPONS].m_pSpriteProj);
|
||||
IGraphics::CQuadItem Array[10];
|
||||
|
@ -421,7 +421,7 @@ void CHud::OnRender()
|
|||
{
|
||||
if(!m_pClient->m_Snap.m_pGameInfoObj)
|
||||
return;
|
||||
|
||||
|
||||
m_Width = 300.0f*Graphics()->ScreenAspect();
|
||||
m_Height = 300.0f;
|
||||
Graphics()->MapScreen(0.0f, 0.0f, m_Width, m_Height);
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
#include <game/client/component.h>
|
||||
|
||||
class CHud : public CComponent
|
||||
{
|
||||
{
|
||||
float m_Width, m_Height;
|
||||
float m_AverageFPS;
|
||||
|
||||
|
||||
void RenderCursor();
|
||||
|
||||
|
||||
void RenderFps();
|
||||
void RenderConnectionWarning();
|
||||
void RenderTeambalanceWarning();
|
||||
|
@ -25,7 +25,7 @@ class CHud : public CComponent
|
|||
void MapscreenToGroup(float CenterX, float CenterY, struct CMapItemGroup *PGroup);
|
||||
public:
|
||||
CHud();
|
||||
|
||||
|
||||
virtual void OnReset();
|
||||
virtual void OnRender();
|
||||
};
|
||||
|
|
|
@ -45,7 +45,7 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID)
|
|||
float Ct = (Client()->PrevGameTick()-pCurrent->m_StartTick)/(float)SERVER_TICK_SPEED + Client()->GameTickTime();
|
||||
if(Ct < 0)
|
||||
return; // projectile havn't been shot yet
|
||||
|
||||
|
||||
vec2 StartPos(pCurrent->m_X, pCurrent->m_Y);
|
||||
vec2 StartVel(pCurrent->m_VelX/100.0f, pCurrent->m_VelY/100.0f);
|
||||
vec2 Pos = CalcPos(StartPos, StartVel, Curvature, Speed, Ct);
|
||||
|
@ -54,29 +54,29 @@ void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID)
|
|||
|
||||
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
|
||||
RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[clamp(pCurrent->m_Type, 0, NUM_WEAPONS-1)].m_pSpriteProj);
|
||||
vec2 Vel = Pos-PrevPos;
|
||||
//vec2 pos = mix(vec2(prev->x, prev->y), vec2(current->x, current->y), Client()->IntraGameTick());
|
||||
|
||||
|
||||
|
||||
// add particle for this projectile
|
||||
if(pCurrent->m_Type == WEAPON_GRENADE)
|
||||
{
|
||||
m_pClient->m_pEffects->SmokeTrail(Pos, Vel*-1);
|
||||
m_pClient->m_pFlow->Add(Pos, Vel*1000*Client()->FrameTime(), 10.0f);
|
||||
|
||||
|
||||
if(Client()->State() == IClient::STATE_DEMOPLAYBACK)
|
||||
{
|
||||
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
|
||||
static float Time = 0;
|
||||
static float LastLocalTime = Client()->LocalTime();
|
||||
|
||||
|
||||
if(!pInfo->m_Paused)
|
||||
Time += (Client()->LocalTime()-LastLocalTime)*pInfo->m_Speed;
|
||||
|
||||
|
||||
Graphics()->QuadsSetRotation(Time*pi*2*2 + ItemID);
|
||||
|
||||
|
||||
LastLocalTime = Client()->LocalTime();
|
||||
}
|
||||
else
|
||||
|
@ -139,13 +139,13 @@ void CItems::RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCu
|
|||
const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo();
|
||||
static float Time = 0;
|
||||
static float LastLocalTime = Client()->LocalTime();
|
||||
|
||||
|
||||
if(!pInfo->m_Paused)
|
||||
Time += (Client()->LocalTime()-LastLocalTime)*pInfo->m_Speed;
|
||||
|
||||
|
||||
Pos.x += cosf(Time*2.0f+Offset)*2.5f;
|
||||
Pos.y += sinf(Time*2.0f+Offset)*2.5f;
|
||||
|
||||
|
||||
LastLocalTime = Client()->LocalTime();
|
||||
}
|
||||
else
|
||||
|
@ -174,7 +174,7 @@ void CItems::RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent,
|
|||
Graphics()->QuadsSetRotation(Angle);
|
||||
|
||||
vec2 Pos = mix(vec2(pPrev->m_X, pPrev->m_Y), vec2(pCurrent->m_X, pCurrent->m_Y), Client()->IntraGameTick());
|
||||
|
||||
|
||||
if(pCurGameData)
|
||||
{
|
||||
// make sure that the flag isn't interpolated between capture and return
|
||||
|
@ -204,16 +204,16 @@ void CItems::RenderLaser(const struct CNetObj_Laser *pCurrent)
|
|||
|
||||
float Ticks = Client()->GameTick() + Client()->IntraGameTick() - pCurrent->m_StartTick;
|
||||
float Ms = (Ticks/50.0f) * 1000.0f;
|
||||
float a = Ms / m_pClient->m_Tuning.m_LaserBounceDelay;
|
||||
float a = Ms / m_pClient->m_Tuning.m_LaserBounceDelay;
|
||||
a = clamp(a, 0.0f, 1.0f);
|
||||
float Ia = 1-a;
|
||||
|
||||
|
||||
vec2 Out, Border;
|
||||
|
||||
|
||||
Graphics()->BlendNormal();
|
||||
Graphics()->TextureSet(-1);
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
|
||||
//vec4 inner_color(0.15f,0.35f,0.75f,1.0f);
|
||||
//vec4 outer_color(0.65f,0.85f,1.0f,1.0f);
|
||||
|
||||
|
@ -229,20 +229,20 @@ void CItems::RenderLaser(const struct CNetObj_Laser *pCurrent)
|
|||
Pos.x+Out.x, Pos.y+Out.y);
|
||||
Graphics()->QuadsDrawFreeform(&Freeform, 1);
|
||||
|
||||
// do inner
|
||||
// do inner
|
||||
vec4 InnerColor(0.5f, 0.5f, 1.0f, 1.0f);
|
||||
Out = vec2(Dir.y, -Dir.x) * (5.0f*Ia);
|
||||
Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, 1.0f); // center
|
||||
|
||||
|
||||
Freeform = IGraphics::CFreeformItem(
|
||||
From.x-Out.x, From.y-Out.y,
|
||||
From.x+Out.x, From.y+Out.y,
|
||||
Pos.x-Out.x, Pos.y-Out.y,
|
||||
Pos.x+Out.x, Pos.y+Out.y);
|
||||
Graphics()->QuadsDrawFreeform(&Freeform, 1);
|
||||
|
||||
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
|
||||
// render head
|
||||
{
|
||||
Graphics()->BlendNormal();
|
||||
|
@ -260,8 +260,8 @@ void CItems::RenderLaser(const struct CNetObj_Laser *pCurrent)
|
|||
Graphics()->QuadsDraw(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
}
|
||||
|
||||
Graphics()->BlendNormal();
|
||||
|
||||
Graphics()->BlendNormal();
|
||||
}
|
||||
|
||||
void CItems::OnRender()
|
||||
|
@ -302,7 +302,7 @@ void CItems::OnRender()
|
|||
const void *pPrev = Client()->SnapFindItem(IClient::SNAP_PREV, Item.m_Type, Item.m_ID);
|
||||
if (pPrev)
|
||||
{
|
||||
const void *pPrevGameData = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_GAMEDATA, m_pClient->m_Snap.m_GameDataSnapID);
|
||||
const void *pPrevGameData = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_GAMEDATA, m_pClient->m_Snap.m_GameDataSnapID);
|
||||
RenderFlag(static_cast<const CNetObj_Flag *>(pPrev), static_cast<const CNetObj_Flag *>(pData),
|
||||
static_cast<const CNetObj_GameData *>(pPrevGameData), m_pClient->m_Snap.m_pGameDataObj);
|
||||
}
|
||||
|
|
|
@ -5,24 +5,24 @@
|
|||
#include <game/client/component.h>
|
||||
|
||||
class CItems : public CComponent
|
||||
{
|
||||
{
|
||||
enum
|
||||
{
|
||||
MAX_EXTRA_PROJECTILES=32,
|
||||
};
|
||||
|
||||
|
||||
CNetObj_Projectile aExtraProjectiles[MAX_EXTRA_PROJECTILES];
|
||||
int ExtraProjectilesNum;
|
||||
|
||||
|
||||
void RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID);
|
||||
void RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent);
|
||||
void RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData);
|
||||
void RenderLaser(const struct CNetObj_Laser *pCurrent);
|
||||
|
||||
|
||||
public:
|
||||
virtual void OnReset();
|
||||
virtual void OnRender();
|
||||
|
||||
|
||||
void AddExtraProjectile(CNetObj_Projectile *pProj);
|
||||
};
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ void CKillMessages::OnMessage(int MsgType, void *pRawMsg)
|
|||
if(MsgType == NETMSGTYPE_SV_KILLMSG)
|
||||
{
|
||||
CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg;
|
||||
|
||||
|
||||
// unpack messages
|
||||
CKillMsg Kill;
|
||||
Kill.m_VictimID = pMsg->m_Victim;
|
||||
|
@ -69,7 +69,7 @@ void CKillMessages::OnRender()
|
|||
|
||||
// render victim tee
|
||||
x -= 24.0f;
|
||||
|
||||
|
||||
if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_FLAGS)
|
||||
{
|
||||
if(m_aKillmsgs[r].m_ModeSpecial&1)
|
||||
|
@ -82,17 +82,17 @@ void CKillMessages::OnRender()
|
|||
RenderTools()->SelectSprite(SPRITE_FLAG_BLUE);
|
||||
else
|
||||
RenderTools()->SelectSprite(SPRITE_FLAG_RED);
|
||||
|
||||
|
||||
float Size = 56.0f;
|
||||
IGraphics::CQuadItem QuadItem(x, y-16, Size/2, Size);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->QuadsEnd();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_VictimRenderInfo, EMOTE_PAIN, vec2(-1,0), vec2(x, y+28));
|
||||
x -= 32.0f;
|
||||
|
||||
|
||||
// render weapon
|
||||
x -= 44.0f;
|
||||
if (m_aKillmsgs[r].m_Weapon >= 0)
|
||||
|
@ -119,14 +119,14 @@ void CKillMessages::OnRender()
|
|||
RenderTools()->SelectSprite(SPRITE_FLAG_BLUE, SPRITE_FLAG_FLIP_X);
|
||||
else
|
||||
RenderTools()->SelectSprite(SPRITE_FLAG_RED, SPRITE_FLAG_FLIP_X);
|
||||
|
||||
|
||||
float Size = 56.0f;
|
||||
IGraphics::CQuadItem QuadItem(x-56, y-16, Size/2, Size);
|
||||
Graphics()->QuadsDrawTL(&QuadItem, 1);
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->QuadsEnd();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// render killer tee
|
||||
x -= 24.0f;
|
||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_KillerRenderInfo, EMOTE_ANGRY, vec2(1,0), vec2(x, y+28));
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue