added "Whitespace and line Endings cleanup" by GreYFoX

This commit is contained in:
oy 2011-04-13 20:37:12 +02:00
parent 63e059b8ff
commit 06115dd49d
187 changed files with 3486 additions and 3486 deletions

44
bam.lua
View file

@ -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"

View file

@ -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

View file

@ -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")

View file

@ -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)

View file

@ -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):

View file

@ -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 */

View file

@ -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)

View file

@ -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.

View file

@ -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;
}

View file

@ -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;

View file

@ -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

View file

@ -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); }
};

View file

@ -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; }
};

View file

@ -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; }

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -103,7 +103,7 @@ private:
CServerEntry *Find(const NETADDR &Addr);
CServerEntry *Add(const NETADDR &Addr);
void RemoveRequest(CServerEntry *pEntry);
void QueueRequest(CServerEntry *pEntry);

View file

@ -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; }

View file

@ -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;
};

View file

@ -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;
};

View file

@ -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;

View file

@ -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();

View file

@ -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;
};

View file

@ -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>

View file

@ -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;

View file

@ -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)
{

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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_)

View file

@ -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);
}
};

View file

@ -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;

View file

@ -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")

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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;
}

View file

@ -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; }
};

View file

@ -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;

View file

@ -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;

View file

@ -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__

View file

@ -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;
}

View file

@ -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);
};

View file

@ -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);

View file

@ -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();

View file

@ -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];
}
}

View file

@ -19,7 +19,7 @@ class CMapChecker
unsigned m_MapSize;
CWhitelistEntry *m_pNext;
};
class CHeap m_Whitelist;
CWhitelistEntry *m_pFirst;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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();

View file

@ -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;
}

View file

@ -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);
};

View file

@ -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)

View file

@ -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;
}

View file

@ -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)

View file

@ -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)
{

View file

@ -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; }

View file

@ -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,

View file

@ -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);

View file

@ -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(); }

View file

@ -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]]);
}

View file

@ -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);
};

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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();
};

View file

@ -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() {};

View file

@ -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);
}
}

View file

@ -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);
};

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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");

View file

@ -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
{

View file

@ -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;
}

View file

@ -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();
};

View file

@ -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);

View file

@ -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;

View file

@ -27,7 +27,7 @@ class CDamageInd : public CComponent
CItem *CreateI();
void DestroyI(CItem *i);
public:
public:
CDamageInd();
void Create(vec2 Pos, vec2 Dir);

View file

@ -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();

View file

@ -5,7 +5,7 @@
#include <game/client/component.h>
class CDebugHud : public CComponent
{
{
void RenderNetCorrections();
void RenderTuning();
public:

View file

@ -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();
}

View file

@ -5,7 +5,7 @@
#include <game/client/component.h>
class CEffects : public CComponent
{
{
bool m_Add50hz;
bool m_Add100hz;
public:

View file

@ -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)

View file

@ -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();

View file

@ -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;
}

View file

@ -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();

View file

@ -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);

View file

@ -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();
};

View file

@ -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);
}

View file

@ -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);
};

View file

@ -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