mirror of
https://github.com/bearstonem/openmohaa-vr.git
synced 2026-10-17 22:00:21 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
312332ac5e | ||
|
|
27dcbdb49a | ||
|
|
96ecb4535a | ||
|
|
f1f1f6e073 | ||
|
|
55dc84d932 | ||
|
|
6c874641d7 | ||
|
|
fe01523cb1 | ||
|
|
827bd38603 | ||
|
|
862142b6c4 | ||
|
|
014e86747f | ||
|
|
08057f52bc | ||
|
|
d3870ccf45 | ||
|
|
e54f4a65f9 | ||
|
|
a69aa0830a | ||
|
|
fe8170e102 | ||
|
|
c660e0162f | ||
|
|
55ad4dacdd | ||
|
|
dd0799b52f | ||
|
|
d546dd9895 | ||
|
|
389da58ec5 | ||
|
|
4e3eb02915 | ||
|
|
756198a02c | ||
|
|
9a6e7f23f9 | ||
|
|
c4aca55b1a | ||
|
|
96bf729c54 | ||
|
|
edcf521506 | ||
|
|
9e7991f4b1 | ||
|
|
86e7a24b38 | ||
|
|
ff587a8444 | ||
|
|
c3e98ed681 | ||
|
|
cc2d698fe2 | ||
|
|
420161095f | ||
|
|
58b0d335e7 | ||
|
|
ce336e8962 | ||
|
|
5b72eb189a | ||
|
|
7600d3ca02 | ||
|
|
8c3be9d549 | ||
|
|
2ddb534321 | ||
|
|
21a1f61b04 | ||
|
|
7219848655 | ||
|
|
4695449fc7 | ||
|
|
af3dd2602b | ||
|
|
5bba5abece | ||
|
|
bdcb6c42b6 | ||
|
|
0fe01d23d6 | ||
|
|
fc675e4064 | ||
|
|
a29af7c3f6 | ||
|
|
732872f433 | ||
|
|
04b5fdb934 | ||
|
|
e23ce01d19 | ||
|
|
648dc395e7 | ||
|
|
ab2a26a14e | ||
|
|
238e94b4d5 | ||
|
|
0c18e0e26c | ||
|
|
7085d60d02 | ||
|
|
3933e63044 | ||
|
|
342552c349 | ||
|
|
9addff08ce | ||
|
|
2ff1071115 | ||
|
|
49f4ac66ab | ||
|
|
7761cbd74c | ||
|
|
103debcf6b | ||
|
|
526ab8071c | ||
|
|
ac45f20fa6 | ||
|
|
a45b36f2f3 | ||
|
|
bea35d28fc | ||
|
|
bb71f84985 | ||
|
|
2f62e61dc8 | ||
|
|
dceceb976d | ||
|
|
59bf9fbd54 | ||
|
|
a1cd6f2746 | ||
|
|
76178064a0 | ||
|
|
31ac3f7096 | ||
|
|
545dc19811 | ||
|
|
5f598cf1f9 | ||
|
|
4e66f2482f | ||
|
|
f873fd447f | ||
|
|
a4123f65b3 | ||
|
|
93e56d968e | ||
|
|
b4e22d3040 | ||
|
|
351f601986 | ||
|
|
41fdd28d8b | ||
|
|
d7c6cc0157 | ||
|
|
f1b83f1dab | ||
|
|
bb401d8d3c | ||
|
|
8bb9cd46f8 | ||
|
|
c27695247e | ||
|
|
7b9835a118 | ||
|
|
2dc75b7527 | ||
|
|
6c577a7251 | ||
|
|
5031402c2c | ||
|
|
a4bd37af8c | ||
|
|
4dc60b9aa4 | ||
|
|
ce89399824 | ||
|
|
b92d2972f6 | ||
|
|
f53680983b | ||
|
|
d6fd337a07 | ||
|
|
95230a8d0a | ||
|
|
04524e9de9 | ||
|
|
df4f6f9515 | ||
|
|
e9c7a1f959 | ||
|
|
c4502469f4 | ||
|
|
c2cb15a1d1 | ||
|
|
4d108a272f | ||
|
|
f523c32044 | ||
|
|
5ac5632e59 | ||
|
|
80f3296854 | ||
|
|
1b1433dd1b | ||
|
|
7647bbaf36 | ||
|
|
f00fd281b3 | ||
|
|
b5ea1ddb53 | ||
|
|
b16ce90be3 | ||
|
|
4c0f7a34de | ||
|
|
2e11cd4ea2 | ||
|
|
c2ad608508 | ||
|
|
5ec8c901e2 | ||
|
|
e6bbbdb79e | ||
|
|
f5fa8d15d1 | ||
|
|
7aee02ba8d |
No files matched your search
@@ -1,4 +1,6 @@
|
||||
build
|
||||
mohaa-re
|
||||
out
|
||||
Makefile.local
|
||||
*.swp
|
||||
*tags
|
||||
|
||||
@@ -2,22 +2,23 @@
|
||||
|
||||
| Path | Description |
|
||||
| ---------------------|-------------------------------------------------------------------
|
||||
| build/ | Output files |
|
||||
| code/ | OpenMoHAA source code |
|
||||
| code/cgame | Client game code |
|
||||
| code/client | Client (network stuff, snapshots, etc) |
|
||||
| code/game | Server game code (game logic stuff, etc) |
|
||||
| code/gamespy | Gamespy SDK |
|
||||
| code/mohui | MoHAA User Interface |
|
||||
| code/null | Null redirector (used by the OpenMoHAA Dedicated Server) |
|
||||
| code/parser | Flex/Bison parser |
|
||||
| code/qcommon | Global shared stuff such as maths |
|
||||
| code/renderer | OpenMoHAA renderer |
|
||||
| code/sdl(12) | SDL code |
|
||||
| code/script | Script engine |
|
||||
| code/server | Server code (networkn snapshots, handling clients etc) |
|
||||
| code/server | Server code (network, snapshots, handling clients etc) |
|
||||
| code/skeletor | Skeleton model engine |
|
||||
| code/sys | Main application system |
|
||||
| code/tiki | Complete TIKI engine |
|
||||
| code/uilib | UI library (Ubertools stuff) |
|
||||
| code/{win32,unix} | Platform-specific code |
|
||||
| docker | Docker files, for compiling on various linux versions |
|
||||
| docs | Documentation stuff |
|
||||
| misc/ | Project stuff, definition files and various resources stuff. |
|
||||
@@ -41,6 +41,8 @@ Here is the current working state for each part of the engine:
|
||||
| Server module (fgame) | | x | | | | | Actor, vehicle, and few gameplay bugs |
|
||||
| UI | | | | x | | | Has core features only (menu, widgets, console, hud, urc loading) |
|
||||
|
||||
NOTE: Both client and server version can be compiled to target **Medal of Honor: Spearhead** and **Medal of Honor: Breakthrough**.
|
||||
|
||||
## Running
|
||||
|
||||
Backup existing mohaa files, **cgamex86.dll** and **gamex86.dll** (set their extension to **.bak**)
|
||||
@@ -70,7 +72,9 @@ These are the tools required for all platforms :
|
||||
|
||||
The installation directory can be set to MOHAA directory.
|
||||
|
||||
The client build and successfully be built by adding `-DWITH_CLIENT=1` to the CMake command line.
|
||||
The client build can be built by adding `-DWITH_CLIENT=1` to the CMake command line. This will compile the cgame module and the full app with rendering, ui and sound suppport, alongside the dedicated server version.
|
||||
|
||||
To compile for either Spearhead or Breakthrough, append `-DTARGET_GAME_TYPE=x` where x can be 1 for Team Assault (Spearhead), and 2 for Team Tactics (Breakthrough). 2 is recommended because Team Tactics can connect to both Spearhead and Breakthrough servers.
|
||||
|
||||
### Linux
|
||||
|
||||
@@ -87,8 +91,11 @@ Visual Studio (2019 or 2022) is generally preferred.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
| | |
|
||||
|---------------------------------------------------------------------|---------------------------------------------------------------------------|
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
|
||||
## Third party
|
||||
|
||||
@@ -126,8 +133,8 @@ https://xiph.org/vorbis/
|
||||
|
||||
https://opus-codec.org/
|
||||
|
||||
## URL
|
||||
## URLs and communities
|
||||
|
||||
- https://openmohaa.sourceforge.net/
|
||||
- https://github.com/openmoh/openmohaa/
|
||||
- https://mohaaaa.co.uk/AAAAMOHAA/index.php
|
||||
- https://x-null.net/
|
||||
|
||||
+180
-37
@@ -1795,6 +1795,10 @@ void ClientGameCommandManager::SetAlignStretch(Event* ev)
|
||||
void ClientGameCommandManager::SetDecalRadius(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->cgd.decal_radius = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
@@ -1806,6 +1810,10 @@ void ClientGameCommandManager::SetDecalOrientation(Event* ev)
|
||||
{
|
||||
str deg;
|
||||
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
deg = ev->GetString(1);
|
||||
|
||||
if (!deg.icmp("random")) {
|
||||
@@ -1820,6 +1828,10 @@ void ClientGameCommandManager::SetDecalOrientation(Event* ev)
|
||||
//===============
|
||||
void ClientGameCommandManager::SetBounceDecal(Event* ev)
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->cgd.flags2 |= T2_BOUNCE_DECAL;
|
||||
if (ev->NumArgs() > 1) {
|
||||
m_spawnthing->cgd.maxbouncecount = ev->GetInteger(1);
|
||||
@@ -1837,8 +1849,11 @@ void ClientGameCommandManager::SetBounceDecal(Event* ev)
|
||||
// SetParallel
|
||||
//===============
|
||||
void ClientGameCommandManager::SetParallel(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->cgd.flags2 |= T2_PARALLEL;
|
||||
}
|
||||
|
||||
@@ -1846,10 +1861,13 @@ void ClientGameCommandManager::SetParallel(Event* ev)
|
||||
// PhysicsRate
|
||||
//===============
|
||||
void ClientGameCommandManager::SetPhysicsRate(Event* ev)
|
||||
|
||||
{
|
||||
str rate;
|
||||
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
rate = ev->GetString(1);
|
||||
|
||||
if (!rate.icmp(rate, "every")) {
|
||||
@@ -1863,8 +1881,11 @@ void ClientGameCommandManager::SetPhysicsRate(Event* ev)
|
||||
// SetLightstyle
|
||||
//===============
|
||||
void ClientGameCommandManager::SetLightstyle(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->cgd.lightstyle = CG_RegisterLightStyle(ev->GetString(1));
|
||||
}
|
||||
|
||||
@@ -1872,8 +1893,11 @@ void ClientGameCommandManager::SetLightstyle(Event* ev)
|
||||
// SetBeamSphere
|
||||
//===============
|
||||
void ClientGameCommandManager::SetBeamSphere(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->numspherebeams = ev->GetInteger(1);
|
||||
m_spawnthing->beamflags = BEAM_SPHERE_EFFECT;
|
||||
}
|
||||
@@ -1882,8 +1906,11 @@ void ClientGameCommandManager::SetBeamSphere(Event* ev)
|
||||
// SetBeamSpread
|
||||
//===============
|
||||
void ClientGameCommandManager::SetSpread(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->spreadx = ev->GetFloat(1);
|
||||
m_spawnthing->spready = ev->GetFloat(2);
|
||||
}
|
||||
@@ -1892,8 +1919,11 @@ void ClientGameCommandManager::SetSpread(Event* ev)
|
||||
// SetUseLastTraceEnd
|
||||
//===============
|
||||
void ClientGameCommandManager::SetUseLastTraceEnd(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->use_last_trace_end = qtrue;
|
||||
}
|
||||
|
||||
@@ -1901,8 +1931,11 @@ void ClientGameCommandManager::SetUseLastTraceEnd(Event* ev)
|
||||
// SetSubdivisions
|
||||
//===============
|
||||
void ClientGameCommandManager::SetSubdivisions(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->numSubdivisions = ev->GetInteger(1);
|
||||
}
|
||||
|
||||
@@ -1910,8 +1943,11 @@ void ClientGameCommandManager::SetSubdivisions(Event* ev)
|
||||
// SetBeamPersist
|
||||
//===============
|
||||
void ClientGameCommandManager::SetBeamPersist(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->beamflags |= BEAM_PERSIST_EFFECT;
|
||||
}
|
||||
|
||||
@@ -1919,8 +1955,11 @@ void ClientGameCommandManager::SetBeamPersist(Event* ev)
|
||||
// SetBeamOffsetEndponts
|
||||
//===============
|
||||
void ClientGameCommandManager::SetBeamOffsetEndpoints(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->beamflags |= BEAM_OFFSET_ENDPOINTS;
|
||||
}
|
||||
|
||||
@@ -1928,8 +1967,11 @@ void ClientGameCommandManager::SetBeamOffsetEndpoints(Event* ev)
|
||||
// SetBeamDelay
|
||||
//===============
|
||||
void ClientGameCommandManager::SetBeamDelay(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ev->NumArgs() > 1) {
|
||||
str r = ev->GetString(1);
|
||||
if (r.icmp("random")) {
|
||||
@@ -1945,8 +1987,11 @@ void ClientGameCommandManager::SetBeamDelay(Event* ev)
|
||||
// SetBeamToggleDelay
|
||||
//===============
|
||||
void ClientGameCommandManager::SetBeamToggleDelay(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->beamflags |= BEAM_TOGGLE;
|
||||
if (ev->NumArgs() > 1) {
|
||||
str r = ev->GetString(1);
|
||||
@@ -1964,8 +2009,11 @@ void ClientGameCommandManager::SetBeamToggleDelay(Event* ev)
|
||||
// SetBeamLength
|
||||
//===============
|
||||
void ClientGameCommandManager::SetLength(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->length = ev->GetFloat(1);
|
||||
}
|
||||
|
||||
@@ -1973,8 +2021,11 @@ void ClientGameCommandManager::SetLength(Event* ev)
|
||||
// SetShader
|
||||
//===============
|
||||
void ClientGameCommandManager::SetShader(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->cgd.shadername = ev->GetString(1);
|
||||
}
|
||||
|
||||
@@ -1982,8 +2033,11 @@ void ClientGameCommandManager::SetShader(Event* ev)
|
||||
// SetMinOffset
|
||||
//===============
|
||||
void ClientGameCommandManager::SetMinOffset(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->min_offset = ev->GetInteger(1);
|
||||
}
|
||||
|
||||
@@ -1991,8 +2045,11 @@ void ClientGameCommandManager::SetMinOffset(Event* ev)
|
||||
// SetSubdivisions
|
||||
//===============
|
||||
void ClientGameCommandManager::SetMaxOffset(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->max_offset = ev->GetInteger(1);
|
||||
}
|
||||
|
||||
@@ -2000,8 +2057,11 @@ void ClientGameCommandManager::SetMaxOffset(Event* ev)
|
||||
// SetAnim
|
||||
//===============
|
||||
void ClientGameCommandManager::SetAnim(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->animName = ev->GetString(1);
|
||||
}
|
||||
|
||||
@@ -2009,8 +2069,11 @@ void ClientGameCommandManager::SetAnim(Event* ev)
|
||||
// AnimateOnce
|
||||
//===============
|
||||
void ClientGameCommandManager::AnimateOnce(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->cgd.flags |= T_ANIMATEONCE;
|
||||
}
|
||||
|
||||
@@ -2018,8 +2081,11 @@ void ClientGameCommandManager::AnimateOnce(Event* ev)
|
||||
// EmitterStartOff
|
||||
//===============
|
||||
void ClientGameCommandManager::EmitterStartOff(Event* ev)
|
||||
|
||||
{
|
||||
if (!m_spawnthing) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_spawnthing->startoff = qtrue;
|
||||
}
|
||||
|
||||
@@ -4735,7 +4801,7 @@ void ClientGameCommandManager::SpawnTempModel(int mcount, int timeAlive)
|
||||
|
||||
// Make sure to not spawn the world model as a tempmodel
|
||||
// Of course it would become extremely confusing...
|
||||
if (!(p->cgd.flags & T_DLIGHT) && p->ent.reType == ET_MODELANIM_SKEL && !p->ent.hModel)
|
||||
if (!(p->cgd.flags & T_DLIGHT) && p->ent.reType == RT_MODEL && !p->ent.hModel)
|
||||
{
|
||||
Com_Printf("^~^~^ not spawning tempmodel because it is using the world as a brush model\n");
|
||||
FreeTempModel(p);
|
||||
@@ -5073,7 +5139,7 @@ void ClientGameCommandManager::LoopSound(Event* ev)
|
||||
|
||||
// Get the real sound to play
|
||||
|
||||
if (current_tiki) {
|
||||
if (current_tiki && current_tiki->a->alias_list) {
|
||||
name = cgi.Alias_ListFindRandom((AliasList_t*)current_tiki->a->alias_list,
|
||||
sound_name.c_str(), &soundAlias);
|
||||
}
|
||||
@@ -5102,7 +5168,7 @@ void CacheResource(const char* stuff)
|
||||
{
|
||||
str real_stuff;
|
||||
|
||||
if (!stuff) {
|
||||
if (!stuff || !stuff[0]) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -5160,10 +5226,37 @@ void AliasResource(dtiki_t* pmdl, const char* alias, const char* realname,
|
||||
}
|
||||
}
|
||||
|
||||
int bLoadForMap__FPCcT0(char* psMapsBuffer, char* name)
|
||||
qboolean bLoadForMap(const char* psMapsBuffer, const char* name)
|
||||
{
|
||||
// FIXME: stub
|
||||
return 0;
|
||||
const char* token;
|
||||
const char* mapname;
|
||||
const char* override;
|
||||
|
||||
mapname = cgs.mapname;
|
||||
if (!strncmp("test", mapname, strlen("test"))) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)&psMapsBuffer, qtrue);
|
||||
override = token;
|
||||
if (token && *token)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
if (!Q_stricmpn(token, mapname, strlen(token)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)&psMapsBuffer, qtrue);
|
||||
if (!token || !token[0]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Com_Printf("ERROR bLoadForMap: %s alias with empty maps specification.\n", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
//===============
|
||||
@@ -5173,8 +5266,9 @@ void ClientGameCommandManager::AliasCache(Event* ev)
|
||||
|
||||
{
|
||||
int i;
|
||||
char parmbuffer[512]; // this holds the parameters to be passed into the
|
||||
char parmbuffer[2048]; // this holds the parameters to be passed into the
|
||||
// alias command
|
||||
const char* psMapsBuffer;
|
||||
|
||||
if (ev->NumArgs() < 2) {
|
||||
return;
|
||||
@@ -5185,14 +5279,23 @@ void ClientGameCommandManager::AliasCache(Event* ev)
|
||||
// any additional parameters are in arguments 3-n
|
||||
|
||||
parmbuffer[0] = 0;
|
||||
psMapsBuffer = NULL;
|
||||
|
||||
for (i = 3; i <= ev->NumArgs(); i++) {
|
||||
strcat(parmbuffer, ev->GetToken(i));
|
||||
strcat(parmbuffer, " ");
|
||||
if (strcmp(ev->GetToken(i).c_str(), "maps")) {
|
||||
strcat(parmbuffer, ev->GetToken(i));
|
||||
strcat(parmbuffer, " ");
|
||||
}
|
||||
else {
|
||||
psMapsBuffer = ev->GetToken(i++);
|
||||
}
|
||||
}
|
||||
|
||||
AliasResource(current_tiki, ev->GetString(1), ev->GetString(2), parmbuffer);
|
||||
CacheResource(ev->GetString(2));
|
||||
if (bLoadForMap(psMapsBuffer, ev->GetString(1)))
|
||||
{
|
||||
AliasResource(current_tiki, ev->GetString(1), ev->GetString(2), parmbuffer);
|
||||
CacheResource(ev->GetString(2));
|
||||
}
|
||||
}
|
||||
|
||||
//===============
|
||||
@@ -5202,8 +5305,10 @@ void ClientGameCommandManager::Alias(Event* ev)
|
||||
|
||||
{
|
||||
int i;
|
||||
char parmbuffer[512]; // this holds the parameters to be passed into the
|
||||
char parmbuffer[2048]; // this holds the parameters to be passed into the
|
||||
// alias command
|
||||
qboolean subtitle;
|
||||
const char* psMapsBuffer;
|
||||
|
||||
if (ev->NumArgs() < 2) {
|
||||
return;
|
||||
@@ -5213,14 +5318,43 @@ void ClientGameCommandManager::Alias(Event* ev)
|
||||
// real path is argument 2
|
||||
// any additional parameters are in arguments 3-n
|
||||
|
||||
parmbuffer[0] = 0;
|
||||
parmbuffer[0] = 0;
|
||||
subtitle = qfalse;
|
||||
psMapsBuffer = NULL;
|
||||
|
||||
for (i = 3; i <= ev->NumArgs(); i++) {
|
||||
strcat(parmbuffer, ev->GetToken(i));
|
||||
strcat(parmbuffer, " ");
|
||||
}
|
||||
for (i = 3; i <= ev->NumArgs(); i++)
|
||||
{
|
||||
if (strcmp(ev->GetToken(i).c_str(), "maps"))
|
||||
{
|
||||
if (!subtitle)
|
||||
{
|
||||
if (!Q_stricmp(ev->GetToken(i), "subtitle")) {
|
||||
subtitle = qtrue;
|
||||
strcat(parmbuffer, ev->GetToken(i));
|
||||
}
|
||||
else {
|
||||
strcat(parmbuffer, ev->GetToken(i));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
strcat(parmbuffer, "\"");
|
||||
strcat(parmbuffer, ev->GetToken(i));
|
||||
strcat(parmbuffer, "\"");
|
||||
subtitle = qfalse;
|
||||
}
|
||||
|
||||
AliasResource(current_tiki, ev->GetString(1), ev->GetString(2), parmbuffer);
|
||||
strcat(parmbuffer, " ");
|
||||
}
|
||||
else {
|
||||
psMapsBuffer = ev->GetToken(i++);
|
||||
}
|
||||
}
|
||||
|
||||
if (bLoadForMap(psMapsBuffer, ev->GetString(1)))
|
||||
{
|
||||
AliasResource(current_tiki, ev->GetString(1), ev->GetString(2), parmbuffer);
|
||||
}
|
||||
}
|
||||
|
||||
void CacheAliasList(AliasList_t* alias_list, str& name)
|
||||
@@ -6363,6 +6497,7 @@ qboolean CG_Command_ProcessFile(const char* filename, qboolean quiet, dtiki_t *c
|
||||
char* buffer;
|
||||
const char* bufstart;
|
||||
char com_token[MAX_STRING_CHARS];
|
||||
char tempName[MAX_QPATH + 1];
|
||||
|
||||
if (cgi.FS_ReadFile(filename, (void**)&buffer, quiet) == -1) {
|
||||
return qfalse;
|
||||
@@ -6375,6 +6510,10 @@ qboolean CG_Command_ProcessFile(const char* filename, qboolean quiet, dtiki_t *c
|
||||
// we are not setting up for a tiki
|
||||
current_tiki = NULL;
|
||||
|
||||
// Update the loading screen
|
||||
sprintf(tempName, "m%s", filename);
|
||||
cgi.LoadResource(tempName);
|
||||
|
||||
bufstart = buffer;
|
||||
|
||||
while (1) {
|
||||
@@ -6409,10 +6548,14 @@ qboolean CG_Command_ProcessFile(const char* filename, qboolean quiet, dtiki_t *c
|
||||
|
||||
ev->AddToken(com_token);
|
||||
}
|
||||
commandManager.ProcessEvent(ev);
|
||||
commandManager.SelectProcessEvent(ev);
|
||||
}
|
||||
cgi.FS_FreeFile((void*)bufstart);
|
||||
|
||||
// Update the loading screen
|
||||
sprintf(tempName, "o%s", filename);
|
||||
cgi.LoadResource(tempName);
|
||||
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
|
||||
@@ -273,7 +273,7 @@ enum class vsstypes_t : unsigned char {
|
||||
NUM_VSS_TYPES
|
||||
};
|
||||
|
||||
class cvssource_t : public Class
|
||||
class cvssource_t
|
||||
{
|
||||
public:
|
||||
cvssource_t* next;
|
||||
@@ -309,7 +309,7 @@ public:
|
||||
qboolean lastValid;
|
||||
};
|
||||
|
||||
class cvssourcestate_t : public Class
|
||||
class cvssourcestate_t
|
||||
{
|
||||
public:
|
||||
Vector origin;
|
||||
|
||||
@@ -123,7 +123,7 @@ void CG_ScoresUp_f( void )
|
||||
}
|
||||
|
||||
cg.showScores = qfalse;
|
||||
cgi.UI_HideScoreBoard(cg.scoresMenuName);
|
||||
cgi.UI_HideScoreBoard();
|
||||
}
|
||||
|
||||
baseshader_t* CG_GetShaderUnderCrosshair(qboolean bVerbose, trace_t* pRetTrace)
|
||||
@@ -558,15 +558,16 @@ int CG_WeaponCommandButtonBits(void)
|
||||
{
|
||||
int iShiftedWeaponCommand;
|
||||
|
||||
iShiftedWeaponCommand = cg.iWeaponCommand;
|
||||
if (!iShiftedWeaponCommand) {
|
||||
if (!cg.iWeaponCommand) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
iShiftedWeaponCommand = cg.iWeaponCommand << 7;
|
||||
|
||||
cg.iWeaponCommandSend++;
|
||||
if (cg.iWeaponCommandSend > 2) {
|
||||
cg.iWeaponCommand = 0;
|
||||
}
|
||||
|
||||
return (iShiftedWeaponCommand << 7) & WEAPON_COMMAND_MASK;
|
||||
return iShiftedWeaponCommand & WEAPON_COMMAND_MASK;
|
||||
}
|
||||
+142
-10
@@ -816,7 +816,7 @@ void CG_DrawPlayerTeam()
|
||||
return;
|
||||
}
|
||||
|
||||
handle = NULL;
|
||||
handle = 0;
|
||||
if (cg.snap->ps.stats[STAT_TEAM] == 3)
|
||||
{
|
||||
handle = cgi.R_RegisterShader("textures/hud/allies");
|
||||
@@ -851,7 +851,7 @@ void CG_DrawPlayerEntInfo()
|
||||
}
|
||||
|
||||
iClientNum = cg.snap->ps.stats[STAT_INFOCLIENT];
|
||||
handle = NULL;
|
||||
handle = 0;
|
||||
pszClientInfo = CG_ConfigString(iClientNum + CS_PLAYERS);
|
||||
pszName = Info_ValueForKey(pszClientInfo, "name");
|
||||
|
||||
@@ -982,14 +982,32 @@ void CG_DrawStopwatch()
|
||||
{
|
||||
int iFraction;
|
||||
|
||||
if (!cg_hud->integer || !cgi.stopWatch->iStartTime
|
||||
|| cgi.stopWatch->iStartTime >= cgi.stopWatch->iEndTime
|
||||
|| cgi.stopWatch->iEndTime <= cg.time
|
||||
// don't draw the stopwatch with the objective menu
|
||||
|| cg.ObjectivesCurrentAlpha >= 0.02
|
||||
// the player isn't alive
|
||||
|| cg.snap && cg.snap->ps.stats[STAT_HEALTH] <= 0)
|
||||
{
|
||||
if (!cg_hud->integer) {
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cgi.stopWatch->iStartTime) {
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cgi.stopWatch->iStartTime >= cgi.stopWatch->iEndTime) {
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cgi.stopWatch->iEndTime <= cg.time) {
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cg.ObjectivesCurrentAlpha >= 0.02) {
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cg.snap && cg.snap->ps.stats[STAT_HEALTH] <= 0) {
|
||||
cgi.Cmd_Execute(EXEC_NOW, "ui_removehud hud_stopwatch\n");
|
||||
return;
|
||||
}
|
||||
@@ -1023,6 +1041,118 @@ void CG_DrawInstantMessageMenu()
|
||||
cgi.R_DrawStretchPic(x, y, w, h, 0.0, 0.0, 1.0, 1.0, handle);
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
void CG_DrawSpectatorView()
|
||||
{
|
||||
const char* pszString;
|
||||
int iKey1, iKey2;
|
||||
int iKey1b, iKey2b;
|
||||
float fX, fY;
|
||||
qboolean bOnTeam;
|
||||
|
||||
if (!(cg.predicted_player_state.pm_flags & PMF_SPECTATING)) {
|
||||
return;
|
||||
}
|
||||
|
||||
bOnTeam = qfalse;
|
||||
if (cg.snap->ps.stats[STAT_TEAM] == TEAM_ALLIES || cg.snap->ps.stats[STAT_TEAM] == TEAM_AXIS) {
|
||||
bOnTeam = 1;
|
||||
}
|
||||
|
||||
if (!bOnTeam)
|
||||
{
|
||||
cgi.Key_GetKeysForCommand("+attackprimary", &iKey1, &iKey2);
|
||||
pszString = cgi.LV_ConvertString(va("Press Fire(%s) to join the battle!", cgi.Key_KeynumToBindString(iKey1)));
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = cgs.glconfig.vidHeight - 64.0;
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX, fY, -1, qfalse);
|
||||
}
|
||||
|
||||
if (cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW)
|
||||
{
|
||||
cgi.Key_GetKeysForCommand("+moveup", &iKey1, &iKey2);
|
||||
cgi.Key_GetKeysForCommand("+movedown", &iKey1b, &iKey2b);
|
||||
|
||||
pszString = cgi.LV_ConvertString(
|
||||
va(
|
||||
"Press Jump(%s) or Duck(%s) to follow a different player.",
|
||||
cgi.Key_KeynumToBindString(iKey1),
|
||||
cgi.Key_KeynumToBindString(iKey1b)
|
||||
)
|
||||
);
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 40.0;
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX, fY, -1, 0);
|
||||
}
|
||||
|
||||
if (!bOnTeam && (cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW))
|
||||
{
|
||||
cgi.Key_GetKeysForCommand("+use", &iKey1, &iKey2);
|
||||
pszString = cgi.LV_ConvertString(va("Press Use(%s) to enter free spectate mode.", cgi.Key_KeynumToBindString(iKey1)));
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0;
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX, fY, -1, 0);
|
||||
}
|
||||
|
||||
if (!(cg.predicted_player_state.pm_flags & PMF_CAMERA_VIEW)) {
|
||||
cgi.Key_GetKeysForCommand("+use", &iKey1, &iKey2);
|
||||
|
||||
pszString = cgi.LV_ConvertString(
|
||||
va(
|
||||
"Press Use(%s) to enter player following spectate mode.",
|
||||
cgi.Key_KeynumToBindString(iKey1)
|
||||
)
|
||||
);
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1)) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 24.0;
|
||||
cgi.R_SetColor(0);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, pszString, fX, fY, -1, 0);
|
||||
}
|
||||
|
||||
if ((cg.predicted_player_state.pm_flags & 0x80) != 0 && cg.snap && cg.snap->ps.stats[STAT_INFOCLIENT] != -1)
|
||||
{
|
||||
int iClientNum;
|
||||
qhandle_t hShader;
|
||||
vec4_t color;
|
||||
char buf[128];
|
||||
|
||||
iClientNum = cg.snap->ps.stats[STAT_INFOCLIENT];
|
||||
sprintf(buf, "%s : %i", cg.clientinfo[iClientNum].name, cg.snap->ps.stats[STAT_INFOCLIENT_HEALTH]);
|
||||
|
||||
color[0] = 0.5;
|
||||
color[1] = 1.0;
|
||||
color[2] = 0.5;
|
||||
color[3] = 1.0;
|
||||
|
||||
fX = (float)(cgs.glconfig.vidWidth - cgi.UI_FontStringWidth(cgs.media.attackerFont, pszString, -1) - 16) * 0.5;
|
||||
fY = (float)cgs.glconfig.vidHeight - 80.0;
|
||||
cgi.R_SetColor(color);
|
||||
cgi.R_DrawString(cgs.media.attackerFont, buf, fX, fY, -1, 0);
|
||||
|
||||
if (cg.clientinfo[iClientNum].team == TEAM_ALLIES) {
|
||||
hShader = cgi.R_RegisterShader("textures/hud/allies");
|
||||
} else if (cg.clientinfo[iClientNum].team == TEAM_AXIS) {
|
||||
hShader = cgi.R_RegisterShader("textures/hud/axis");
|
||||
}
|
||||
|
||||
if (hShader)
|
||||
{
|
||||
fX -= 20.0;
|
||||
cgi.R_SetColor(NULL);
|
||||
cgi.R_DrawStretchPic(fX, fY, 16.0, 16.0, 0.0, 0.0, 1.0, 1.0, hShader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void CG_DrawSpectatorView()
|
||||
{
|
||||
const char* pszString;
|
||||
@@ -1083,6 +1213,8 @@ void CG_DrawSpectatorView()
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
==============
|
||||
CG_Draw2D
|
||||
|
||||
@@ -51,7 +51,7 @@ clightstyle_t cg_lightstyle[ MAX_LIGHTSTYLES * 2 ];
|
||||
CG_LightStyleColor
|
||||
================
|
||||
*/
|
||||
qboolean CG_LightStyleColor( int style, int realtime, float color[4], qboolean clamp )
|
||||
qboolean CG_LightStyleColor( int style, int realtime, vec4_t color, qboolean clamp )
|
||||
{
|
||||
clightstyle_t *ls;
|
||||
int i, time;
|
||||
@@ -495,7 +495,7 @@ void CG_SetLightStyle( int num, const char *s )
|
||||
cg_lightstyle[ num ].map[ k ][ 1 ] = t / 255.0f;
|
||||
k++;
|
||||
}
|
||||
n = max( n, k );
|
||||
n = Q_max( n, k );
|
||||
}
|
||||
while( k < MAX_LIGHTSTYLE_LENGTH )
|
||||
{
|
||||
@@ -518,7 +518,7 @@ void CG_SetLightStyle( int num, const char *s )
|
||||
cg_lightstyle[ num ].map[ k ][ 2 ] = t / 255.0f;
|
||||
k++;
|
||||
}
|
||||
n = max( n, k );
|
||||
n = Q_max( n, k );
|
||||
}
|
||||
while( k < MAX_LIGHTSTYLE_LENGTH )
|
||||
{
|
||||
@@ -541,7 +541,7 @@ void CG_SetLightStyle( int num, const char *s )
|
||||
cg_lightstyle[ num ].map[ k ][ 3 ] = t / 255.0f;
|
||||
k++;
|
||||
}
|
||||
n = max( n, k );
|
||||
n = Q_max( n, k );
|
||||
}
|
||||
while( k < MAX_LIGHTSTYLE_LENGTH )
|
||||
{
|
||||
|
||||
+18
-9
@@ -160,6 +160,7 @@ typedef struct markPoly_s
|
||||
#define MAX_CUSTOM_SOUNDS 32
|
||||
typedef struct {
|
||||
int team;
|
||||
char name[64];
|
||||
} clientInfo_t;
|
||||
|
||||
typedef struct cobjective_s {
|
||||
@@ -297,15 +298,21 @@ typedef struct {
|
||||
qboolean testGun;
|
||||
|
||||
// farplane parameters
|
||||
float farplane_distance;
|
||||
float farplane_distance;
|
||||
float farplane_bias;
|
||||
vec3_t farplane_color;
|
||||
qboolean farplane_cull;
|
||||
qboolean farplane_cull;
|
||||
float skyboxFarplane;
|
||||
qboolean renderTerrain;
|
||||
float farclipOverride;
|
||||
vec3_t farplaneColorOverride;
|
||||
|
||||
// portal sky parameters
|
||||
qboolean sky_portal;
|
||||
float sky_alpha;
|
||||
vec3_t sky_origin;
|
||||
vec3_t sky_axis[3]; // rotation vectors
|
||||
vec3_t sky_axis[3]; // rotation vectors
|
||||
float skyboxSpeed;
|
||||
|
||||
// weapon viewkick recoil
|
||||
float viewkick[2];
|
||||
@@ -371,8 +378,9 @@ typedef struct {
|
||||
int fraglimit;
|
||||
int timelimit;
|
||||
int maxclients;
|
||||
int cinematic;
|
||||
char mapname[MAX_QPATH];
|
||||
int cinematic;
|
||||
int mapChecksum;
|
||||
char mapname[MAX_QPATH];
|
||||
|
||||
//
|
||||
// locally derived information from gamestate
|
||||
@@ -475,6 +483,7 @@ int CG_LastAttacker( void );
|
||||
void CG_Init( clientGameImport_t *imported, int serverMessageNum, int serverCommandSequence, int clientNum );
|
||||
void CG_Shutdown( void );
|
||||
void CG_ServerRestarted( void );
|
||||
void CG_ParseFogInfo(const char* str);
|
||||
|
||||
//
|
||||
// cg_modelanim.cpp
|
||||
@@ -633,8 +642,8 @@ void CG_ImpactMarkSimple(
|
||||
);
|
||||
void CG_InitTestTreadMark();
|
||||
int CG_PermanentMark(
|
||||
vec_t* origin,
|
||||
vec_t* dir,
|
||||
const vec3_t origin,
|
||||
const vec3_t dir,
|
||||
float orientation,
|
||||
float fSScale,
|
||||
float fTScale,
|
||||
@@ -801,9 +810,9 @@ void CG_MultiBeam( centity_t *cent );
|
||||
// cg_lightstyles.cpp
|
||||
void CG_SetLightStyle( int num, const char *s );
|
||||
#ifdef __cplusplus
|
||||
qboolean CG_LightStyleColor( int style, int realtime, float color[4], qboolean clamp = qfalse );
|
||||
qboolean CG_LightStyleColor( int style, int realtime, vec4_t color, qboolean clamp = qfalse );
|
||||
#else
|
||||
qboolean CG_LightStyleColor( int style, int realtime, float color[4], qboolean clamp );
|
||||
qboolean CG_LightStyleColor( int style, int realtime, vec4_t color, qboolean clamp );
|
||||
#endif
|
||||
void CG_ClearLightStyles( void );
|
||||
int CG_RegisterLightStyle( const char * name );
|
||||
|
||||
+69
-20
@@ -194,23 +194,22 @@ called during a precache command
|
||||
*/
|
||||
void CG_RegisterSounds( void )
|
||||
{
|
||||
int startTime; // esi MAPDST
|
||||
int endTime; // eax MAPDST
|
||||
char filename[64]; // [esp+28h] [ebp-40h] BYREF
|
||||
int startTime;
|
||||
int endTime;
|
||||
char filename[MAX_QPATH];
|
||||
|
||||
Com_Printf("\n\n-----------PARSING UBERSOUND------------\n");
|
||||
Com_Printf(
|
||||
"Any SetCurrentTiki errors means that tiki wasn't prefetched and "
|
||||
"tiki-specific sounds for it won't work. To fix prefe"
|
||||
"tch the tiki. Ignore if you don't use that tiki on this level.\n");
|
||||
Com_sprintf(filename, 64, "ubersound/ubersound.scr");
|
||||
Com_sprintf(filename, sizeof(filename), "ubersound/ubersound.scr");
|
||||
|
||||
startTime = cgi.Milliseconds();
|
||||
CG_Command_ProcessFile(filename, 0, 0);
|
||||
endTime = cgi.Milliseconds();
|
||||
|
||||
Com_Printf("Parse/Load time: %f seconds.\n",
|
||||
(double)((long double)(endTime - startTime) / 1000.0));
|
||||
Com_Printf("Parse/Load time: %f seconds.\n", (endTime - startTime) / 1000.0f);
|
||||
|
||||
Com_Printf("-------------UBERSOUND DONE---------------\n\n");
|
||||
Com_Printf("\n\n-----------PARSING UBERDIALOG------------\n");
|
||||
@@ -218,14 +217,13 @@ void CG_RegisterSounds( void )
|
||||
"Any SetCurrentTiki errors means that tiki wasn't prefetched and "
|
||||
"tiki-specific sounds for it won't work. To fix prefe"
|
||||
"tch the tiki. Ignore if you don't use that tiki on this level.\n");
|
||||
Com_sprintf(filename, 64, "ubersound/uberdialog.scr");
|
||||
Com_sprintf(filename, sizeof(filename), "ubersound/uberdialog.scr");
|
||||
|
||||
startTime = cgi.Milliseconds();
|
||||
CG_Command_ProcessFile(filename, 0, 0);
|
||||
endTime = cgi.Milliseconds() - startTime;
|
||||
|
||||
Com_Printf("Parse/Load time: %f seconds.\n",
|
||||
(double)((long double)endTime / 1000.0));
|
||||
Com_Printf("Parse/Load time: %f seconds.\n", endTime / 1000.0f);
|
||||
Com_Printf("-------------UBERDIALOG DONE---------------\n\n");
|
||||
}
|
||||
|
||||
@@ -302,16 +300,7 @@ void CG_ProcessConfigString(int num)
|
||||
cg.matchStartTime = atoi(str);
|
||||
return;
|
||||
case CS_FOGINFO:
|
||||
sscanf
|
||||
(
|
||||
str,
|
||||
"%d %f %f %f %f",
|
||||
&cg.farplane_cull,
|
||||
&cg.farplane_distance,
|
||||
&cg.farplane_color[0],
|
||||
&cg.farplane_color[1],
|
||||
&cg.farplane_color[2]
|
||||
);
|
||||
CG_ParseFogInfo(str);
|
||||
return;
|
||||
case CS_SKYINFO:
|
||||
sscanf
|
||||
@@ -366,7 +355,7 @@ void CG_ProcessConfigString(int num)
|
||||
}
|
||||
else if (num >= CS_SOUNDS && num < CS_SOUNDS + MAX_SOUNDS)
|
||||
{
|
||||
int len = strlen(str);
|
||||
size_t len = strlen(str);
|
||||
if (len)
|
||||
{
|
||||
qboolean streamed;
|
||||
@@ -384,6 +373,25 @@ void CG_ProcessConfigString(int num)
|
||||
{
|
||||
CG_SetLightStyle(num - CS_LIGHTSTYLES, str);
|
||||
}
|
||||
else if (num >= CS_PLAYERS && num < CS_PLAYERS + MAX_CLIENTS)
|
||||
{
|
||||
const char* value;
|
||||
|
||||
value = Info_ValueForKey(str, "name");
|
||||
if (value) {
|
||||
strncpy(cg.clientinfo[num - CS_PLAYERS].name, value, sizeof(cg.clientinfo[num - CS_PLAYERS].name));
|
||||
}
|
||||
else {
|
||||
strncpy(cg.clientinfo[num - CS_PLAYERS].name, "UnnamedSoldier", sizeof(cg.clientinfo[num - CS_PLAYERS].name));
|
||||
}
|
||||
|
||||
value = Info_ValueForKey(str, "team");
|
||||
if (value) {
|
||||
cg.clientinfo[num - CS_PLAYERS].team = atoi(value);
|
||||
} else {
|
||||
cg.clientinfo[num - CS_PLAYERS].team = TEAM_NONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===================================================================================
|
||||
@@ -778,4 +786,45 @@ void Com_Printf( const char *msg, ... ) {
|
||||
|
||||
#endif
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
void CG_ParseFogInfo(const char* str) {
|
||||
sscanf(
|
||||
str,
|
||||
"%d %f %f %f %f %f %f %f %d %f %f %f %f",
|
||||
&cg.farplane_cull,
|
||||
&cg.farplane_distance,
|
||||
&cg.farplane_bias,
|
||||
&cg.skyboxFarplane,
|
||||
&cg.skyboxSpeed,
|
||||
&cg.farplane_color[0],
|
||||
&cg.farplane_color[1],
|
||||
&cg.farplane_color[2],
|
||||
&cg.renderTerrain,
|
||||
&cg.farclipOverride,
|
||||
&cg.farplaneColorOverride[0],
|
||||
&cg.farplaneColorOverride[1],
|
||||
&cg.farplaneColorOverride[2]
|
||||
);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void CG_ParseFogInfo(const char* str) {
|
||||
cg.farclipOverride = 0.0;
|
||||
cg.farplaneColorOverride[0] = -1.0;
|
||||
cg.farplaneColorOverride[1] = -1.0;
|
||||
cg.farplaneColorOverride[2] = -1.0;
|
||||
sscanf
|
||||
(
|
||||
str,
|
||||
"%d %f %f %f %f",
|
||||
&cg.farplane_cull,
|
||||
&cg.farplane_distance,
|
||||
&cg.farplane_color[0],
|
||||
&cg.farplane_color[1],
|
||||
&cg.farplane_color[2]
|
||||
);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -444,8 +444,8 @@ void CG_AddTreadMarks()
|
||||
}
|
||||
|
||||
int CG_PermanentMark(
|
||||
vec_t* origin,
|
||||
vec_t* dir,
|
||||
const vec3_t origin,
|
||||
const vec3_t dir,
|
||||
float orientation,
|
||||
float fSScale,
|
||||
float fTScale,
|
||||
|
||||
@@ -28,6 +28,183 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
void CG_PlayerTeamUpdate(refEntity_t* pModel, entityState_t* pPlayerState)
|
||||
{
|
||||
qboolean bInArtillery, bInTeam, bSpecialIcon;
|
||||
|
||||
#if TARGET_GAME_PROTOCOL < 15
|
||||
if (pPlayerState->eFlags & EF_ALLIES)
|
||||
{
|
||||
cg.clientinfo[pPlayerState->number].team = TEAM_ALLIES;
|
||||
} else if (pPlayerState->eFlags & EF_AXIS) {
|
||||
cg.clientinfo[pPlayerState->number].team = TEAM_AXIS;
|
||||
} else {
|
||||
cg.clientinfo[pPlayerState->number].team = TEAM_NONE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (pPlayerState->number == cg.snap->ps.clientNum) {
|
||||
return;
|
||||
}
|
||||
|
||||
bInTeam = qfalse;
|
||||
bSpecialIcon = qfalse;
|
||||
if (cgs.gametype > GT_FFA
|
||||
&& (cg.snap->ps.stats[STAT_TEAM] == TEAM_ALLIES && (pPlayerState->eFlags & EF_ALLIES)
|
||||
|| cg.snap->ps.stats[STAT_TEAM] == TEAM_AXIS && (pPlayerState->eFlags & EF_AXIS)
|
||||
|| cg.snap->ps.stats[STAT_TEAM] != TEAM_AXIS && cg.snap->ps.stats[STAT_TEAM] != TEAM_ALLIES && (pPlayerState->eFlags & EF_ANY_TEAM) != 0))
|
||||
{
|
||||
bInTeam = qtrue;
|
||||
}
|
||||
|
||||
if (cgs.gametype <= GT_FFA) {
|
||||
return;
|
||||
}
|
||||
|
||||
bInArtillery = qfalse;
|
||||
if (pPlayerState->eFlags & EF_PLAYER_ARTILLERY) {
|
||||
bInArtillery = qtrue;
|
||||
}
|
||||
|
||||
if (bInTeam || (pPlayerState->eFlags & (EF_PLAYER_IN_MENU | EF_PLAYER_TALKING)) || bInArtillery)
|
||||
{
|
||||
int i;
|
||||
int iTag;
|
||||
float fAlpha;
|
||||
float fDist;
|
||||
vec3_t vTmp;
|
||||
refEntity_t iconEnt;
|
||||
|
||||
memset(&iconEnt, 0, sizeof(iconEnt));
|
||||
if ((pPlayerState->eFlags & EF_PLAYER_TALKING) != 0 && ((cg.time >> 8) & 1) != 0)
|
||||
{
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/talking_headicon.spr");
|
||||
bSpecialIcon = 1;
|
||||
}
|
||||
else if ((pPlayerState->eFlags & EF_PLAYER_IN_MENU) != 0)
|
||||
{
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/inmenu_headicon.spr");
|
||||
bSpecialIcon = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!bInTeam) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (bInArtillery)
|
||||
{
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/inmenu_artilleryicon.spr");
|
||||
bSpecialIcon = qtrue;
|
||||
}
|
||||
else if ((pPlayerState->eFlags & 0x80) != 0)
|
||||
{
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/allies_headicon.spr");
|
||||
}
|
||||
else
|
||||
{
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/axis_headicon.spr");
|
||||
}
|
||||
}
|
||||
|
||||
memset(vTmp, 0, sizeof(vTmp));
|
||||
AnglesToAxis(vTmp, iconEnt.axis);
|
||||
|
||||
iconEnt.scale = 0.5;
|
||||
iconEnt.renderfx = 0;
|
||||
iconEnt.reType = RT_SPRITE;
|
||||
iconEnt.shaderTime = 0.0;
|
||||
iconEnt.frameInfo[0].index = 0;
|
||||
iconEnt.shaderRGBA[0] = -1;
|
||||
iconEnt.shaderRGBA[1] = -1;
|
||||
iconEnt.shaderRGBA[2] = -1;
|
||||
VectorCopy(pModel->origin, iconEnt.origin);
|
||||
|
||||
iTag = cgi.Tag_NumForName(pModel->tiki, "eyes bone");
|
||||
if (iTag == -1)
|
||||
{
|
||||
iconEnt.origin[2] = iconEnt.origin[2] + 96.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
orientation_t oEyes = cgi.TIKI_Orientation(pModel, iTag);
|
||||
|
||||
for (i = 0; i < 3; ++i) {
|
||||
VectorMA(iconEnt.origin, oEyes.origin[i], pModel->axis[i], iconEnt.origin);
|
||||
}
|
||||
|
||||
iconEnt.origin[2] = iconEnt.origin[2] + 20.0;
|
||||
}
|
||||
|
||||
VectorSubtract(iconEnt.origin, cg.refdef.vieworg, vTmp);
|
||||
fDist = VectorLength(vTmp);
|
||||
|
||||
if (fDist >= 256)
|
||||
{
|
||||
if (fDist > 512.0) {
|
||||
iconEnt.scale = (fDist - 512.0) / 2560.0 + 0.5;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iconEnt.scale = fDist / 853.0 + 0.2;
|
||||
}
|
||||
|
||||
if (iconEnt.scale > 1.0) {
|
||||
iconEnt.scale = 1.0;
|
||||
}
|
||||
|
||||
if (fDist > 256.0) {
|
||||
fAlpha = 1.0;
|
||||
}
|
||||
else if (fDist >= 72.0) {
|
||||
fAlpha = (fDist - 72.0) / 184.0;
|
||||
}
|
||||
else {
|
||||
fAlpha = 0.0;
|
||||
}
|
||||
|
||||
if (cg.snap->ps.stats[STAT_TEAM] == 4 || cg.snap->ps.stats[STAT_TEAM] == 3) {
|
||||
fAlpha = fAlpha * 0.65;
|
||||
}
|
||||
else {
|
||||
fAlpha = fAlpha * 0.4;
|
||||
}
|
||||
|
||||
if (bSpecialIcon)
|
||||
{
|
||||
int value = (int)((fAlpha + 0.60000002) * 255.0);
|
||||
if (value > 255) value = 255;
|
||||
iconEnt.shaderRGBA[3] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
iconEnt.shaderRGBA[3] = (int)(fAlpha * 255.0);
|
||||
}
|
||||
|
||||
if (fAlpha > 0.0 || bSpecialIcon)
|
||||
{
|
||||
if (bSpecialIcon)
|
||||
{
|
||||
VectorMA(iconEnt.origin, -2.0, cg.refdef.viewaxis[0], iconEnt.origin);
|
||||
iconEnt.scale = iconEnt.scale + 0.05;
|
||||
}
|
||||
|
||||
cgi.R_AddRefSpriteToScene(&iconEnt);
|
||||
|
||||
if (bSpecialIcon && bInTeam && fAlpha > 0.0)
|
||||
{
|
||||
if (pPlayerState->eFlags & EF_ALLIES) {
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/allies_headicon.spr");
|
||||
}
|
||||
else {
|
||||
iconEnt.hModel = cgi.R_RegisterModel("textures/hud/axis_headicon.spr");
|
||||
}
|
||||
VectorMA(iconEnt.origin, 4.0, cg.refdef.viewaxis[0], iconEnt.origin);
|
||||
iconEnt.scale = iconEnt.scale - 0.1;
|
||||
iconEnt.shaderRGBA[3] = (int)(fAlpha * 255.0);
|
||||
cgi.R_AddRefSpriteToScene(&iconEnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
|
||||
+467
-6
@@ -64,7 +64,7 @@ static void CG_MakeBulletHole(vec3_t i_vPos, vec3_t i_vNorm, int iLarge, trace_t
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
static void CG_MakeBubbleTrail(vec3_t i_vStart, vec3_t i_vEnd, int iLarge)
|
||||
static void CG_MakeBubbleTrail(vec3_t i_vStart, vec3_t i_vEnd, int iLarge, float alpha = 1.0f)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
@@ -79,7 +79,7 @@ static void CG_MakeBulletTracerInternal(vec3_t i_vBarrel, vec3_t i_vStart, vec3_
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
static void CG_MakeBulletTracer(vec3_t i_vBarrel, vec3_t i_vStart, vec3_t* i_vEnd, int i_iNumBullets, qboolean iLarge, int iTracerVisible, qboolean bIgnoreEntities) {
|
||||
static void CG_MakeBulletTracer(vec3_t i_vBarrel, vec3_t i_vStart, vec3_t* i_vEnd, int i_iNumBullets, qboolean iLarge, int iTracerVisible, qboolean bIgnoreEntities, float alpha = 1.0f) {
|
||||
bullet_tracer_t* bullet_tracer;
|
||||
int i;
|
||||
|
||||
@@ -306,6 +306,463 @@ void CG_MakeVehicleEffect(vec3_t i_vStart, vec3_t i_vEnd , vec3_t i_vDir) {
|
||||
cgi.R_DebugLine(vFrom, trace.endpos, 1.0, 1.0, 1.0, 1.0);
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
void CG_ParseCGMessage()
|
||||
{
|
||||
int i;
|
||||
int iType;
|
||||
int iLarge;
|
||||
int iInfo;
|
||||
int iCount;
|
||||
char* szTmp;
|
||||
vec3_t vStart, vEnd, vTmp;
|
||||
vec3_t vEndArray[MAX_IMPACTS];
|
||||
float alpha;
|
||||
int value;
|
||||
|
||||
qboolean bMoreCGameMessages = qtrue;
|
||||
while (bMoreCGameMessages) {
|
||||
iType = cgi.MSG_ReadBits(6);
|
||||
|
||||
switch (iType)
|
||||
{
|
||||
case 1:
|
||||
case 2:
|
||||
case 5:
|
||||
if (iType == 1)
|
||||
{
|
||||
vTmp[0] = cgi.MSG_ReadCoord();
|
||||
vTmp[1] = cgi.MSG_ReadCoord();
|
||||
vTmp[2] = cgi.MSG_ReadCoord();
|
||||
}
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
|
||||
if (iType != 1)
|
||||
{
|
||||
vTmp[0] = vStart[0];
|
||||
vTmp[1] = vStart[1];
|
||||
vTmp[2] = vStart[2];
|
||||
}
|
||||
|
||||
vEndArray[0][0] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][1] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][2] = cgi.MSG_ReadCoord();
|
||||
iLarge = cgi.MSG_ReadBits(2);
|
||||
if (cgi.MSG_ReadBits(1)) {
|
||||
int iAlpha = cgi.MSG_ReadBits(10);
|
||||
alpha = (float)iAlpha / 512.0;
|
||||
if (alpha < 0.002) {
|
||||
alpha = 0.002;
|
||||
}
|
||||
} else {
|
||||
alpha = 1.0f;
|
||||
}
|
||||
|
||||
if (iType == 1) {
|
||||
CG_MakeBulletTracer(vTmp, vStart, vEndArray, 1, iLarge, qfalse, qtrue, alpha);
|
||||
}
|
||||
else if (iType == 2) {
|
||||
CG_MakeBulletTracer(vTmp, vStart, vEndArray, 1, iLarge, qfalse, qtrue, alpha);
|
||||
}
|
||||
else {
|
||||
CG_MakeBubbleTrail(vStart, vEndArray[0], iLarge, alpha);
|
||||
}
|
||||
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
if (iType == 3)
|
||||
{
|
||||
vTmp[0] = cgi.MSG_ReadCoord();
|
||||
vTmp[1] = cgi.MSG_ReadCoord();
|
||||
vTmp[2] = cgi.MSG_ReadCoord();
|
||||
iInfo = cgi.MSG_ReadBits(6);
|
||||
}
|
||||
else
|
||||
{
|
||||
iInfo = 0;
|
||||
}
|
||||
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
iLarge = cgi.MSG_ReadBits(2);
|
||||
if (cgi.MSG_ReadBits(1)) {
|
||||
int iAlpha = cgi.MSG_ReadBits(10);
|
||||
alpha = (float)iAlpha / 512.0;
|
||||
if (alpha < 0.002) {
|
||||
alpha = 0.002;
|
||||
}
|
||||
} else {
|
||||
alpha = 1.0f;
|
||||
}
|
||||
|
||||
iCount = cgi.MSG_ReadBits(6);
|
||||
for (i = 0; i < iCount; ++i)
|
||||
{
|
||||
vEndArray[i][0] = cgi.MSG_ReadCoord();
|
||||
vEndArray[i][1] = cgi.MSG_ReadCoord();
|
||||
vEndArray[i][2] = cgi.MSG_ReadCoord();
|
||||
}
|
||||
|
||||
if (iCount) {
|
||||
CG_MakeBulletTracer(vTmp, vStart, vEndArray, iCount, iLarge, iInfo, qtrue, alpha);
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
cgi.MSG_ReadDir(vEnd);
|
||||
iLarge = cgi.MSG_ReadBits(2);
|
||||
|
||||
switch (iType)
|
||||
{
|
||||
case 6:
|
||||
if (wall_impact_count < MAX_IMPACTS)
|
||||
{
|
||||
VectorCopy(vStart, wall_impact_pos[wall_impact_count]);
|
||||
VectorCopy(vEnd, wall_impact_norm[wall_impact_count]);
|
||||
wall_impact_large[wall_impact_count] = iLarge;
|
||||
wall_impact_type[wall_impact_count] = -1;
|
||||
wall_impact_count++;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
if (wall_impact_count < MAX_IMPACTS)
|
||||
{
|
||||
VectorCopy(vStart, wall_impact_pos[wall_impact_count]);
|
||||
VectorCopy(vEnd, wall_impact_norm[wall_impact_count]);
|
||||
wall_impact_large[wall_impact_count] = iLarge;
|
||||
wall_impact_type[wall_impact_count] = 6;
|
||||
wall_impact_count++;
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
if (flesh_impact_count < MAX_IMPACTS)
|
||||
{
|
||||
// negative
|
||||
VectorNegate(vEnd, vEnd);
|
||||
VectorCopy(vStart, flesh_impact_pos[flesh_impact_count]);
|
||||
VectorCopy(vEnd, flesh_impact_norm[flesh_impact_count]);
|
||||
flesh_impact_large[flesh_impact_count] = iLarge;
|
||||
flesh_impact_count++;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if (flesh_impact_count < MAX_IMPACTS)
|
||||
{
|
||||
// negative
|
||||
VectorNegate(vEnd, vEnd);
|
||||
VectorCopy(vStart, flesh_impact_pos[flesh_impact_count]);
|
||||
VectorCopy(vEnd, flesh_impact_norm[flesh_impact_count]);
|
||||
flesh_impact_large[flesh_impact_count] = iLarge;
|
||||
flesh_impact_count++;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
if (wall_impact_count < MAX_IMPACTS)
|
||||
{
|
||||
VectorCopy(vStart, wall_impact_pos[wall_impact_count]);
|
||||
VectorCopy(vEnd, wall_impact_norm[wall_impact_count]);
|
||||
wall_impact_large[wall_impact_count] = iLarge;
|
||||
wall_impact_type[wall_impact_count] = 2;
|
||||
wall_impact_count++;
|
||||
}
|
||||
break;
|
||||
case 11:
|
||||
if (wall_impact_count < MAX_IMPACTS)
|
||||
{
|
||||
VectorCopy(vStart, wall_impact_pos[wall_impact_count]);
|
||||
VectorCopy(vEnd, wall_impact_norm[wall_impact_count]);
|
||||
wall_impact_large[wall_impact_count] = iLarge;
|
||||
wall_impact_type[wall_impact_count] = 4;
|
||||
wall_impact_count++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
case 12:
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
vEnd[0] = cgi.MSG_ReadCoord();
|
||||
vEnd[1] = cgi.MSG_ReadCoord();
|
||||
vEnd[2] = cgi.MSG_ReadCoord();
|
||||
CG_MeleeImpact(vStart, vEnd);
|
||||
break;
|
||||
case 13:
|
||||
case 14:
|
||||
case 15:
|
||||
case 16:
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
CG_MakeExplosionEffect(vStart, iType);
|
||||
break;
|
||||
case 18:
|
||||
case 19:
|
||||
case 20:
|
||||
case 21:
|
||||
case 22:
|
||||
case 23:
|
||||
case 24:
|
||||
case 25:
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
cgi.MSG_ReadDir(vEnd);
|
||||
|
||||
sfxManager.MakeEffect_Normal(iType + 67, vStart, vEnd);
|
||||
break;
|
||||
|
||||
case 26:
|
||||
case 27:
|
||||
{
|
||||
str sEffect;
|
||||
char cTmp[8];
|
||||
vec3_t axis[3];
|
||||
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
iLarge = cgi.MSG_ReadByte();
|
||||
// get the integer as string
|
||||
snprintf(cTmp, sizeof(cTmp), "%d", iLarge);
|
||||
|
||||
if (iType == 26) {
|
||||
sEffect = "models/fx/crates/debris_";
|
||||
}
|
||||
else {
|
||||
sEffect = "models/fx/windows/debris_";
|
||||
}
|
||||
|
||||
sEffect += cTmp;
|
||||
sEffect += ".tik";
|
||||
|
||||
VectorSet(axis[0], 0, 0, 1);
|
||||
VectorSet(axis[1], 0, 1, 0);
|
||||
VectorSet(axis[2], 1, 0, 0);
|
||||
|
||||
cgi.R_SpawnEffectModel(sEffect.c_str(), vStart, axis);
|
||||
}
|
||||
break;
|
||||
|
||||
case 28:
|
||||
vTmp[0] = cgi.MSG_ReadCoord();
|
||||
vTmp[1] = cgi.MSG_ReadCoord();
|
||||
vTmp[2] = cgi.MSG_ReadCoord();
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][0] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][1] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][2] = cgi.MSG_ReadCoord();
|
||||
iLarge = cgi.MSG_ReadBits(2);
|
||||
if (cgi.MSG_ReadBits(1)) {
|
||||
int iAlpha = cgi.MSG_ReadBits(10);
|
||||
alpha = (float)iAlpha / 512.0;
|
||||
if (alpha < 0.002) {
|
||||
alpha = 0.002;
|
||||
}
|
||||
} else {
|
||||
alpha = 1.0f;
|
||||
}
|
||||
|
||||
CG_MakeBulletTracer(vTmp, vStart, vEndArray, 1, iLarge, qtrue, qtrue, alpha);
|
||||
break;
|
||||
|
||||
case 29:
|
||||
memset(vTmp, 0, sizeof(vTmp));
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][0] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][1] = cgi.MSG_ReadCoord();
|
||||
vEndArray[0][2] = cgi.MSG_ReadCoord();
|
||||
iLarge = cgi.MSG_ReadBits(1);
|
||||
if (cgi.MSG_ReadBits(1)) {
|
||||
int iAlpha = cgi.MSG_ReadBits(10);
|
||||
alpha = (float)iAlpha / 512.0;
|
||||
if (alpha < 0.002) {
|
||||
alpha = 0.002;
|
||||
}
|
||||
} else {
|
||||
alpha = 1.0f;
|
||||
}
|
||||
|
||||
CG_MakeBulletTracer(vTmp, vStart, vEndArray, 1, iLarge, qfalse, qtrue, alpha);
|
||||
break;
|
||||
|
||||
case 30:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
strcpy(cgi.HudDrawElements[iInfo].shaderName, cgi.MSG_ReadString());
|
||||
cgi.HudDrawElements[iInfo].string[0] = 0;
|
||||
cgi.HudDrawElements[iInfo].pFont = NULL;
|
||||
cgi.HudDrawElements[iInfo].fontName[0] = 0;
|
||||
// set the shader
|
||||
CG_HudDrawShader(iInfo);
|
||||
break;
|
||||
|
||||
case 31:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].iHorizontalAlign = cgi.MSG_ReadBits(2);
|
||||
cgi.HudDrawElements[iInfo].iVerticalAlign = cgi.MSG_ReadBits(2);
|
||||
break;
|
||||
|
||||
case 32:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].iX = cgi.MSG_ReadShort();
|
||||
cgi.HudDrawElements[iInfo].iY = cgi.MSG_ReadShort();
|
||||
cgi.HudDrawElements[iInfo].iWidth = cgi.MSG_ReadShort();
|
||||
cgi.HudDrawElements[iInfo].iHeight = cgi.MSG_ReadShort();
|
||||
break;
|
||||
|
||||
case 33:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].bVirtualScreen = cgi.MSG_ReadBits(1);
|
||||
break;
|
||||
|
||||
case 34:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].vColor[0] = cgi.MSG_ReadByte() / 255.0;
|
||||
cgi.HudDrawElements[iInfo].vColor[1] = cgi.MSG_ReadByte() / 255.0;
|
||||
cgi.HudDrawElements[iInfo].vColor[2] = cgi.MSG_ReadByte() / 255.0;
|
||||
break;
|
||||
|
||||
case 35:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].vColor[3] = cgi.MSG_ReadByte() / 255.0;
|
||||
break;
|
||||
|
||||
case 36:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].hShader = 0;
|
||||
strcpy(cgi.HudDrawElements[iInfo].string, cgi.MSG_ReadString());
|
||||
break;
|
||||
|
||||
case 37:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
strcpy(cgi.HudDrawElements[iInfo].fontName, cgi.MSG_ReadString());
|
||||
cgi.HudDrawElements[iInfo].hShader = 0;
|
||||
cgi.HudDrawElements[iInfo].shaderName[0] = 0;
|
||||
// load the font
|
||||
CG_HudDrawFont(iInfo);
|
||||
break;
|
||||
|
||||
case 38:
|
||||
case 39:
|
||||
{
|
||||
int iOldEnt;
|
||||
|
||||
iOldEnt = current_entity_number;
|
||||
current_entity_number = cg.snap->ps.clientNum;
|
||||
if (iType == 36) {
|
||||
commandManager.PlaySound(
|
||||
"dm_kill_notify",
|
||||
NULL,
|
||||
CHAN_LOCAL,
|
||||
2.0,
|
||||
-1,
|
||||
-1,
|
||||
1
|
||||
);
|
||||
}
|
||||
else {
|
||||
commandManager.PlaySound(
|
||||
"dm_hit_notify",
|
||||
NULL,
|
||||
CHAN_LOCAL,
|
||||
2.0,
|
||||
-1,
|
||||
-1,
|
||||
1
|
||||
);
|
||||
}
|
||||
|
||||
current_entity_number = iOldEnt;
|
||||
}
|
||||
break;
|
||||
|
||||
case 40:
|
||||
{
|
||||
int iOldEnt;
|
||||
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
iLarge = cgi.MSG_ReadBits(1);
|
||||
iInfo = cgi.MSG_ReadBits(6);
|
||||
szTmp = cgi.MSG_ReadString();
|
||||
|
||||
iOldEnt = current_entity_number;
|
||||
|
||||
if (iLarge) {
|
||||
current_entity_number = iInfo;
|
||||
|
||||
commandManager.PlaySound(
|
||||
szTmp,
|
||||
vStart,
|
||||
CHAN_LOCAL,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
0
|
||||
);
|
||||
}
|
||||
else {
|
||||
current_entity_number = cg.snap->ps.clientNum;
|
||||
|
||||
commandManager.PlaySound(
|
||||
szTmp,
|
||||
vStart,
|
||||
CHAN_AUTO,
|
||||
-1,
|
||||
-1,
|
||||
-1,
|
||||
1
|
||||
);
|
||||
}
|
||||
|
||||
current_entity_number = iOldEnt;
|
||||
}
|
||||
break;
|
||||
case 41:
|
||||
vStart[0] = cgi.MSG_ReadCoord();
|
||||
vStart[1] = cgi.MSG_ReadCoord();
|
||||
vStart[2] = cgi.MSG_ReadCoord();
|
||||
vEnd[0] = cgi.MSG_ReadCoord();
|
||||
vEnd[1] = cgi.MSG_ReadCoord();
|
||||
vEnd[2] = cgi.MSG_ReadCoord();
|
||||
cgi.MSG_ReadByte();
|
||||
cgi.MSG_ReadByte();
|
||||
VectorSubtract(vEnd, vStart, vTmp);
|
||||
|
||||
// FIXME: unimplemented
|
||||
// ?? can't figure out what is this
|
||||
break;
|
||||
default:
|
||||
cgi.Error(ERR_DROP, "CG_ParseCGMessage: Unknown CGM message type");
|
||||
break;
|
||||
}
|
||||
|
||||
bMoreCGameMessages = cgi.MSG_ReadBits(1);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void CG_ParseCGMessage()
|
||||
{
|
||||
int i;
|
||||
@@ -580,13 +1037,15 @@ void CG_ParseCGMessage()
|
||||
cgi.HudDrawElements[iInfo].bVirtualScreen = cgi.MSG_ReadBits(1);
|
||||
break;
|
||||
|
||||
case 31:
|
||||
case 31:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].vColor[0] = cgi.MSG_ReadByte() / 255.0;
|
||||
cgi.HudDrawElements[iInfo].vColor[1] = cgi.MSG_ReadByte() / 255.0;
|
||||
cgi.HudDrawElements[iInfo].vColor[2] = cgi.MSG_ReadByte() / 255.0;
|
||||
break;
|
||||
|
||||
case 32:
|
||||
case 32:
|
||||
iInfo = cgi.MSG_ReadByte();
|
||||
cgi.HudDrawElements[iInfo].vColor[3] = cgi.MSG_ReadByte() / 255.0;
|
||||
break;
|
||||
|
||||
@@ -682,10 +1141,12 @@ void CG_ParseCGMessage()
|
||||
current_entity_number = iOldEnt;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
cgi.Error(ERR_DROP, "CG_ParseCGMessage: Unknown CGM message type");
|
||||
break;
|
||||
}
|
||||
|
||||
bMoreCGameMessages = cgi.MSG_ReadBits(1);
|
||||
}
|
||||
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
#endif
|
||||
@@ -404,7 +404,7 @@ typedef struct {
|
||||
// FIXME
|
||||
//prof_cgame_t* profStruct;
|
||||
|
||||
qboolean (*CG_Command_ProcessFile)(char* name, qboolean quiet, dtiki_t* curTiki);
|
||||
qboolean (*CG_Command_ProcessFile)(const char* name, qboolean quiet, dtiki_t* curTiki);
|
||||
|
||||
} clientGameExport_t;
|
||||
|
||||
|
||||
+428
-72
@@ -54,63 +54,419 @@ int CG_GetScoreBoardDrawHeader()
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char* CG_GetColumnName(int iColumnNum, int* iColumnWidth)
|
||||
{
|
||||
int iReturnWidth;
|
||||
const char* pszReturnString;
|
||||
|
||||
switch (iColumnNum) {
|
||||
case 0:
|
||||
iReturnWidth = 128;
|
||||
pszReturnString = "Name";
|
||||
break;
|
||||
case 1:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Kills";
|
||||
break;
|
||||
case 2:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Deaths";
|
||||
if (cgs.gametype > GT_TEAM) {
|
||||
pszReturnString = "Total";
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Time";
|
||||
break;
|
||||
case 4:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Ping";
|
||||
break;
|
||||
default:
|
||||
iReturnWidth = 0;
|
||||
pszReturnString = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (iColumnWidth) {
|
||||
*iColumnWidth = iReturnWidth;
|
||||
}
|
||||
|
||||
return pszReturnString;
|
||||
}
|
||||
|
||||
void CG_PrepScoreBoardInfo()
|
||||
{
|
||||
switch (cgs.gametype) {
|
||||
switch (cgs.gametype) {
|
||||
case GT_TEAM_ROUNDS:
|
||||
strcpy(cg.scoresMenuName, "DM_Round_Scoreboard");
|
||||
break;
|
||||
case GT_OBJECTIVE:
|
||||
strcpy(cg.scoresMenuName, "Obj_Scoreboard");
|
||||
break;
|
||||
case GT_TEAM_ROUNDS:
|
||||
strcpy(cg.scoresMenuName, "DM_Round_Scoreboard");
|
||||
break;
|
||||
break;
|
||||
case GT_TOW:
|
||||
strcpy(cg.scoresMenuName, "Tow_Scoreboard");
|
||||
break;
|
||||
case GT_LIBERATION:
|
||||
strcpy(cg.scoresMenuName, "Lib_Scoreboard");
|
||||
break;
|
||||
default:
|
||||
strcpy(cg.scoresMenuName, "DM_Scoreboard");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
const char* CG_GetColumnName(int iColumnNum, int* iColumnWidth)
|
||||
{
|
||||
int iReturnWidth;
|
||||
const char* pszReturnString;
|
||||
|
||||
switch (iColumnNum) {
|
||||
case 0:
|
||||
iReturnWidth = 24;
|
||||
pszReturnString = "#";
|
||||
break;
|
||||
case 1:
|
||||
iReturnWidth = 128;
|
||||
pszReturnString = "Name";
|
||||
break;
|
||||
case 2:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Kills";
|
||||
break;
|
||||
case 3:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Deaths";
|
||||
if (cgs.gametype > GT_TEAM) {
|
||||
pszReturnString = "Total";
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Time";
|
||||
break;
|
||||
case 5:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Ping";
|
||||
break;
|
||||
default:
|
||||
iReturnWidth = 0;
|
||||
pszReturnString = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (iColumnWidth) {
|
||||
*iColumnWidth = iReturnWidth;
|
||||
}
|
||||
|
||||
return pszReturnString;
|
||||
}
|
||||
|
||||
void CG_ParseScores()
|
||||
{
|
||||
int i;
|
||||
int iEntryCount;
|
||||
int iClientTeam, iClientNum;
|
||||
int iDatumCount;
|
||||
int iMatchTeam;
|
||||
int iCurrentEntry;
|
||||
qboolean bIsDead, bIsHeader;
|
||||
char szString2[MAX_STRING_TOKENS];
|
||||
char szString3[MAX_STRING_TOKENS];
|
||||
char szString4[MAX_STRING_TOKENS];
|
||||
char szString5[MAX_STRING_TOKENS];
|
||||
char szString6[MAX_STRING_TOKENS];
|
||||
char szString7[MAX_STRING_TOKENS];
|
||||
float vSameTeamTextColor[4];
|
||||
float vSameTeamBackColor[4];
|
||||
float vOtherTeamTextColor[4];
|
||||
float vOtherTeamBackColor[4];
|
||||
float vNoTeamTextColor[4];
|
||||
float vNoTeamBackColor[4];
|
||||
float vThisClientTextColor[4];
|
||||
float vThisClientBackColor[4];
|
||||
float vDeadTextColorDead[4];
|
||||
float* pItemTextColor;
|
||||
float* pItemBackColor;
|
||||
|
||||
iMatchTeam = -1;
|
||||
vSameTeamTextColor[0] = 1.0f;
|
||||
vSameTeamTextColor[1] = 1.0f;
|
||||
vSameTeamTextColor[2] = 1.0f;
|
||||
vSameTeamTextColor[3] = 1.0f;
|
||||
vSameTeamBackColor[0] = 0.1f;
|
||||
vSameTeamBackColor[1] = 0.5f;
|
||||
vSameTeamBackColor[2] = 0.1f;
|
||||
vSameTeamBackColor[3] = 0.4f;
|
||||
vOtherTeamTextColor[0] = 1.0f;
|
||||
vOtherTeamTextColor[1] = 1.0f;
|
||||
vOtherTeamTextColor[2] = 1.0f;
|
||||
vOtherTeamTextColor[3] = 1.0f;
|
||||
vOtherTeamBackColor[0] = 0.5f;
|
||||
vOtherTeamBackColor[1] = 0.1f;
|
||||
vOtherTeamBackColor[2] = 0.1f;
|
||||
vOtherTeamBackColor[3] = 0.4f;
|
||||
vNoTeamTextColor[0] = 1.0f;
|
||||
vNoTeamTextColor[1] = 1.0f;
|
||||
vNoTeamTextColor[2] = 1.0f;
|
||||
vNoTeamTextColor[3] = 1.0f;
|
||||
vNoTeamBackColor[0] = 0.1f;
|
||||
vNoTeamBackColor[1] = 0.1f;
|
||||
vNoTeamBackColor[2] = 0.1f;
|
||||
vNoTeamBackColor[3] = 0.4f;
|
||||
vDeadTextColorDead[0] = 1.0f;
|
||||
vDeadTextColorDead[1] = 0.1f;
|
||||
vDeadTextColorDead[2] = 0.1f;
|
||||
vDeadTextColorDead[3] = 1.0f;
|
||||
|
||||
vThisClientTextColor[0] = 0.0f;
|
||||
vThisClientTextColor[1] = 0.0f;
|
||||
vThisClientTextColor[2] = 0.0f;
|
||||
vThisClientTextColor[3] = 1.0f;
|
||||
|
||||
if (cgs.gametype > GT_FFA)
|
||||
{
|
||||
vThisClientBackColor[0] = 0.5f;
|
||||
vThisClientBackColor[1] = 0.75f;
|
||||
vThisClientBackColor[2] = 0.5f;
|
||||
}
|
||||
else
|
||||
{
|
||||
vThisClientBackColor[0] = 0.75f;
|
||||
vThisClientBackColor[1] = 0.75f;
|
||||
vThisClientBackColor[2] = 0.75f;
|
||||
}
|
||||
|
||||
vThisClientBackColor[3] = 0.8f;
|
||||
|
||||
iCurrentEntry = 1;
|
||||
if (cgs.gametype > GT_FFA)
|
||||
{
|
||||
iDatumCount = 6;
|
||||
iMatchTeam = cg.snap->ps.stats[STAT_TEAM];
|
||||
if (iMatchTeam != TEAM_ALLIES && iMatchTeam != TEAM_AXIS)
|
||||
{
|
||||
iMatchTeam = TEAM_ALLIES;
|
||||
vThisClientTextColor[0] = 0.0f;
|
||||
vThisClientTextColor[1] = 0.0f;
|
||||
vThisClientTextColor[2] = 0.0f;
|
||||
vThisClientBackColor[0] = 0.75f;
|
||||
vThisClientBackColor[1] = 0.75f;
|
||||
vThisClientBackColor[2] = 0.75f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// free-for-all
|
||||
iDatumCount = 5;
|
||||
}
|
||||
|
||||
iEntryCount = atoi(cgi.Argv(iCurrentEntry++));
|
||||
if (iEntryCount > MAX_CLIENTS) {
|
||||
iEntryCount = MAX_CLIENTS;
|
||||
}
|
||||
|
||||
if (cgs.gametype == GT_TOW)
|
||||
{
|
||||
cgi.Cvar_Set("tow_allied_obj1", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_allied_obj2", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_allied_obj3", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_allied_obj4", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_allied_obj5", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_axis_obj1", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_axis_obj2", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_axis_obj3", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_axis_obj4", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("tow_axis_obj5", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
}
|
||||
|
||||
if (cgs.gametype == GT_LIBERATION)
|
||||
{
|
||||
cgi.Cvar_Set("scoreboard_toggle1", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
cgi.Cvar_Set("scoreboard_toggle2", va("%i", (int)atof(cgi.Argv(iCurrentEntry++))));
|
||||
}
|
||||
|
||||
for (i = 0; i < iEntryCount; ++i)
|
||||
{
|
||||
bIsHeader = qfalse;
|
||||
if (cgs.gametype > GT_FFA)
|
||||
{
|
||||
iClientNum = atoi(cgi.Argv(iCurrentEntry + iDatumCount * i));
|
||||
iClientTeam = atoi(cgi.Argv(1 + iCurrentEntry + iDatumCount * i));
|
||||
if (iClientTeam >= 0) {
|
||||
bIsDead = qfalse;
|
||||
}
|
||||
else {
|
||||
bIsDead = qtrue;
|
||||
iClientTeam = -iClientTeam;
|
||||
}
|
||||
|
||||
if (iClientNum == -1)
|
||||
{
|
||||
szString2[0] = 0;
|
||||
bIsHeader = qtrue;
|
||||
|
||||
switch (iClientTeam)
|
||||
{
|
||||
case 1:
|
||||
strcpy(szString3, cgi.LV_ConvertString("Spectators"));
|
||||
break;
|
||||
case 2:
|
||||
strcpy(szString3, cgi.LV_ConvertString("Free-For-Allers"));
|
||||
break;
|
||||
case 3:
|
||||
sprintf(
|
||||
szString3,
|
||||
"%s - %d %s",
|
||||
cgi.LV_ConvertString("Allies"),
|
||||
atoi(cgi.Argv(2 + iCurrentEntry + iDatumCount * i)),
|
||||
cgi.LV_ConvertString("Players")
|
||||
);
|
||||
iCurrentEntry++;
|
||||
break;
|
||||
case 4:
|
||||
sprintf(
|
||||
szString3,
|
||||
"%s - %d %s",
|
||||
cgi.LV_ConvertString("Axis"),
|
||||
atoi(cgi.Argv(2 + iCurrentEntry + iDatumCount * i)),
|
||||
cgi.LV_ConvertString("Players")
|
||||
);
|
||||
iCurrentEntry++;
|
||||
break;
|
||||
default:
|
||||
strcpy(szString3, cgi.LV_ConvertString("No Team"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (iClientNum == -2)
|
||||
{
|
||||
// spectating
|
||||
szString2[0] = 0;
|
||||
szString3[0] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(szString2, va("%i", iClientNum));
|
||||
strcpy(szString3, cg.clientinfo[iClientNum].name);
|
||||
}
|
||||
|
||||
strcpy(szString4, cgi.Argv(2 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString5, cgi.Argv(3 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString6, cgi.Argv(4 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString7, cgi.Argv(5 + iCurrentEntry + iDatumCount * i));
|
||||
|
||||
if (cgs.gametype >= GT_TEAM_ROUNDS && iClientNum == -1 && iClientTeam == TEAM_ALLIES || iClientTeam == TEAM_AXIS)
|
||||
{
|
||||
strcat(szString4, va(" %s", cgi.LV_ConvertString("Wins")));
|
||||
szString5[0] = 0;
|
||||
}
|
||||
|
||||
if (iClientNum == cg.snap->ps.clientNum)
|
||||
{
|
||||
pItemTextColor = vThisClientTextColor;
|
||||
pItemBackColor = vThisClientBackColor;
|
||||
}
|
||||
else if (iClientNum == -2)
|
||||
{
|
||||
pItemTextColor = vNoTeamTextColor;
|
||||
pItemBackColor = vNoTeamBackColor;
|
||||
}
|
||||
else if (iClientTeam == TEAM_ALLIES || iClientTeam == TEAM_AXIS)
|
||||
{
|
||||
if (iClientTeam == iMatchTeam)
|
||||
{
|
||||
pItemTextColor = vSameTeamTextColor;
|
||||
pItemBackColor = vSameTeamBackColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
pItemTextColor = vOtherTeamTextColor;
|
||||
pItemBackColor = vOtherTeamBackColor;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pItemTextColor = vNoTeamTextColor;
|
||||
pItemBackColor = vNoTeamBackColor;
|
||||
}
|
||||
|
||||
if (bIsDead) {
|
||||
pItemTextColor = vDeadTextColorDead;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
iClientNum = atoi(cgi.Argv(iDatumCount * i));
|
||||
if (iClientNum >= 0)
|
||||
{
|
||||
strcpy(szString2, va("%i", iClientNum));
|
||||
strcpy(szString3, cg.clientinfo[iClientNum].name);
|
||||
strcpy(szString4, cgi.Argv(1 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString5, cgi.Argv(2 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString6, cgi.Argv(3 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString7, cgi.Argv(4 + iCurrentEntry + iDatumCount * i));
|
||||
}
|
||||
else
|
||||
{
|
||||
szString2[0] = 0;
|
||||
if (iClientNum == -3)
|
||||
{
|
||||
strcpy(szString2, cgi.LV_ConvertString("Players"));
|
||||
bIsHeader = qtrue;
|
||||
}
|
||||
else if (iClientNum == -2)
|
||||
{
|
||||
strcpy(szString2, cgi.LV_ConvertString("Spectators"));
|
||||
bIsHeader = qtrue;
|
||||
}
|
||||
else
|
||||
{
|
||||
// unknown
|
||||
szString3[0] = 0;
|
||||
}
|
||||
szString4[0] = 0;
|
||||
szString5[0] = 0;
|
||||
szString6[0] = 0;
|
||||
szString7[0] = 0;
|
||||
}
|
||||
|
||||
if (iClientNum == cg.snap->ps.clientNum)
|
||||
{
|
||||
pItemTextColor = vThisClientTextColor;
|
||||
pItemBackColor = vThisClientBackColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
pItemTextColor = vNoTeamTextColor;
|
||||
pItemBackColor = vNoTeamBackColor;
|
||||
}
|
||||
}
|
||||
|
||||
cgi.UI_SetScoreBoardItem(
|
||||
i,
|
||||
szString2,
|
||||
szString3,
|
||||
szString4,
|
||||
szString5,
|
||||
szString6,
|
||||
szString7,
|
||||
NULL,
|
||||
NULL,
|
||||
pItemTextColor,
|
||||
pItemBackColor,
|
||||
bIsHeader
|
||||
);
|
||||
}
|
||||
|
||||
cgi.UI_DeleteScoreBoardItems(iEntryCount);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
const char* CG_GetColumnName(int iColumnNum, int* iColumnWidth)
|
||||
{
|
||||
int iReturnWidth;
|
||||
const char* pszReturnString;
|
||||
|
||||
switch (iColumnNum) {
|
||||
case 0:
|
||||
iReturnWidth = 128;
|
||||
pszReturnString = "Name";
|
||||
break;
|
||||
case 1:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Kills";
|
||||
break;
|
||||
case 2:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Deaths";
|
||||
if (cgs.gametype > GT_TEAM) {
|
||||
pszReturnString = "Total";
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Time";
|
||||
break;
|
||||
case 4:
|
||||
iReturnWidth = 64;
|
||||
pszReturnString = "Ping";
|
||||
break;
|
||||
default:
|
||||
iReturnWidth = 0;
|
||||
pszReturnString = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (iColumnWidth) {
|
||||
*iColumnWidth = iReturnWidth;
|
||||
}
|
||||
|
||||
return pszReturnString;
|
||||
}
|
||||
|
||||
void CG_ParseScores()
|
||||
{
|
||||
int i;
|
||||
@@ -118,13 +474,13 @@ void CG_ParseScores()
|
||||
int iClientTeam, iClientNum;
|
||||
int iDatumCount;
|
||||
int iMatchTeam;
|
||||
int iCurrentEntry;
|
||||
qboolean bIsDead, bIsHeader;
|
||||
char szString2[MAX_STRING_TOKENS];
|
||||
char szString3[MAX_STRING_TOKENS];
|
||||
char szString4[MAX_STRING_TOKENS];
|
||||
char szString5[MAX_STRING_TOKENS];
|
||||
char szString6[MAX_STRING_TOKENS];
|
||||
const char* pszClientInfo;
|
||||
float vSameTeamTextColor[4];
|
||||
float vSameTeamBackColor[4];
|
||||
float vOtherTeamTextColor[4];
|
||||
@@ -187,6 +543,7 @@ void CG_ParseScores()
|
||||
|
||||
vThisClientBackColor[3] = 0.8f;
|
||||
|
||||
iCurrentEntry = 1;
|
||||
if (cgs.gametype > GT_FFA)
|
||||
{
|
||||
iDatumCount = 6;
|
||||
@@ -208,7 +565,7 @@ void CG_ParseScores()
|
||||
iDatumCount = 5;
|
||||
}
|
||||
|
||||
iEntryCount = atoi(cgi.Argv(1));
|
||||
iEntryCount = atoi(cgi.Argv(iCurrentEntry++));
|
||||
if (iEntryCount > MAX_CLIENTS) {
|
||||
iEntryCount = MAX_CLIENTS;
|
||||
}
|
||||
@@ -218,8 +575,8 @@ void CG_ParseScores()
|
||||
bIsHeader = qfalse;
|
||||
if (cgs.gametype > GT_FFA)
|
||||
{
|
||||
iClientNum = atoi(cgi.Argv(2 + iDatumCount * i));
|
||||
iClientTeam = atoi(cgi.Argv(3 + iDatumCount * i));
|
||||
iClientNum = atoi(cgi.Argv(iCurrentEntry + iDatumCount * i));
|
||||
iClientTeam = atoi(cgi.Argv(1 + iCurrentEntry + iDatumCount * i));
|
||||
if (iClientTeam >= 0) {
|
||||
bIsDead = qfalse;
|
||||
}
|
||||
@@ -235,19 +592,19 @@ void CG_ParseScores()
|
||||
switch (iClientTeam)
|
||||
{
|
||||
case 1:
|
||||
strcpy(szString2, "Spectators");
|
||||
strcpy(szString2, cgi.LV_ConvertString("Spectators"));
|
||||
break;
|
||||
case 2:
|
||||
strcpy(szString2, "Free-For-Allers");
|
||||
strcpy(szString2, cgi.LV_ConvertString("Free-For-Allers"));
|
||||
break;
|
||||
case 3:
|
||||
strcpy(szString2, "Allies");
|
||||
strcpy(szString2, cgi.LV_ConvertString("Allies"));
|
||||
break;
|
||||
case 4:
|
||||
strcpy(szString2, "Axis");
|
||||
strcpy(szString2, cgi.LV_ConvertString("Axis"));
|
||||
break;
|
||||
default:
|
||||
strcpy(szString2, "No Team");
|
||||
strcpy(szString2, cgi.LV_ConvertString("No Team"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -257,15 +614,14 @@ void CG_ParseScores()
|
||||
szString2[0] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
pszClientInfo = CG_ConfigString(CS_PLAYERS + iClientNum);
|
||||
strcpy(szString2, Info_ValueForKey(pszClientInfo, "name"));
|
||||
{
|
||||
strcpy(szString2, cg.clientinfo[iClientNum].name);
|
||||
}
|
||||
|
||||
strcpy(szString3, cgi.Argv(4 + iDatumCount * i));
|
||||
strcpy(szString4, cgi.Argv(5 + iDatumCount * i));
|
||||
strcpy(szString5, cgi.Argv(6 + iDatumCount * i));
|
||||
strcpy(szString6, cgi.Argv(7 + iDatumCount * i));
|
||||
strcpy(szString3, cgi.Argv(2 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString4, cgi.Argv(3 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString5, cgi.Argv(4 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString6, cgi.Argv(5 + iCurrentEntry + iDatumCount * i));
|
||||
|
||||
if (iClientNum == cg.snap->ps.clientNum)
|
||||
{
|
||||
@@ -302,26 +658,25 @@ void CG_ParseScores()
|
||||
}
|
||||
else
|
||||
{
|
||||
iClientNum = atoi(cgi.Argv(2 + iDatumCount * i));
|
||||
iClientNum = atoi(cgi.Argv(iCurrentEntry + iDatumCount * i));
|
||||
if (iClientNum >= 0)
|
||||
{
|
||||
pszClientInfo = CG_ConfigString(CS_PLAYERS + iClientNum);
|
||||
strcpy(szString2, Info_ValueForKey(pszClientInfo, "name"));
|
||||
strcpy(szString3, cgi.Argv(3 + iDatumCount * i));
|
||||
strcpy(szString4, cgi.Argv(4 + iDatumCount * i));
|
||||
strcpy(szString5, cgi.Argv(5 + iDatumCount * i));
|
||||
strcpy(szString6, cgi.Argv(6 + iDatumCount * i));
|
||||
strcpy(szString2, cg.clientinfo[iClientNum].name);
|
||||
strcpy(szString3, cgi.Argv(1 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString4, cgi.Argv(2 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString5, cgi.Argv(3 + iCurrentEntry + iDatumCount * i));
|
||||
strcpy(szString6, cgi.Argv(4 + iCurrentEntry + iDatumCount * i));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (iClientNum == -3)
|
||||
{
|
||||
strcpy(szString2, "Players");
|
||||
strcpy(szString2, cgi.LV_ConvertString("Players"));
|
||||
bIsHeader = qtrue;
|
||||
}
|
||||
else if (iClientNum == -2)
|
||||
{
|
||||
strcpy(szString2, "Spectators");
|
||||
strcpy(szString2, cgi.LV_ConvertString("Spectators"));
|
||||
bIsHeader = qtrue;
|
||||
}
|
||||
else
|
||||
@@ -365,3 +720,4 @@ void CG_ParseScores()
|
||||
|
||||
cgi.UI_DeleteScoreBoardItems(iEntryCount);
|
||||
}
|
||||
#endif
|
||||
+134
-5
@@ -25,6 +25,58 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
#include "cg_local.h"
|
||||
|
||||
static const char* IsWeaponAllowed(int dmFlags, int flags) {
|
||||
return (dmFlags & flags) ? "0" : "1";
|
||||
}
|
||||
|
||||
static qboolean QueryLandminesAllowed2(const char* mapname, int dmflags) {
|
||||
if (dmflags & DF_WEAPON_NO_LANDMINE) {
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if (dmflags & DF_WEAPON_LANDMINE_ALWAYS) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
if (!Q_stricmpn(mapname, "obj/obj_", 8u))
|
||||
return qfalse;
|
||||
if (!Q_stricmpn(mapname, "dm/mohdm", 8u))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Bahnhof_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "obj/MP_Ardennes_TOW"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Bazaar_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "obj/MP_Berlin_TOW"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Brest_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "obj/MP_Druckkammern_TOW"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Gewitter_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "obj/MP_Flughafen_TOW"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Holland_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Malta_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Stadt_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Unterseite_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Verschneit_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "lib/mp_ship_lib"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "DM/MP_Verschneit_DM"))
|
||||
return qfalse;
|
||||
if (!Q_stricmp(mapname, "lib/mp_ship_lib"))
|
||||
return qfalse;
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
CG_ParseServerinfo
|
||||
@@ -39,6 +91,7 @@ void CG_ParseServerinfo(void)
|
||||
const char* mapname;
|
||||
char map[MAX_QPATH];
|
||||
char* spawnpos;
|
||||
const char* version;
|
||||
|
||||
info = CG_ConfigString(CS_SERVERINFO);
|
||||
cgs.gametype = atoi(Info_ValueForKey(info, "g_gametype"));
|
||||
@@ -48,6 +101,13 @@ void CG_ParseServerinfo(void)
|
||||
cgs.timelimit = atoi(Info_ValueForKey(info, "timelimit"));
|
||||
cgs.maxclients = atoi(Info_ValueForKey(info, "sv_maxclients"));
|
||||
|
||||
version = Info_ValueForKey(info, "version");
|
||||
if (strstr(version, "Spearhead")) {
|
||||
cgi.Cvar_Set("g_servertype", "1");
|
||||
} else {
|
||||
cgi.Cvar_Set("g_servertype", "2");
|
||||
}
|
||||
|
||||
cgi.Cvar_Set("cg_gametype", Info_ValueForKey(info, "g_gametype"));
|
||||
cgi.Cvar_Set("cg_fraglimit", Info_ValueForKey(info, "fraglimit"));
|
||||
cgi.Cvar_Set("cg_timelimit", Info_ValueForKey(info, "timelimit"));
|
||||
@@ -60,9 +120,18 @@ void CG_ParseServerinfo(void)
|
||||
cgi.Cvar_Set("cg_obj_axistext3", Info_ValueForKey(info, "cg_obj_axistext3"));
|
||||
cgi.Cvar_Set("cg_scoreboardpic", Info_ValueForKey(info, "g_scoreboardpic"));
|
||||
cgi.Cvar_Set("cg_scoreboardpicover", Info_ValueForKey(info, "g_scoreboardpicover"));
|
||||
cgs.mapChecksum = atoi(Info_ValueForKey(info, "sv_mapChecksum"));
|
||||
|
||||
mapname = Info_ValueForKey(info, "mapname");
|
||||
|
||||
cgi.Cvar_Set("cg_weapon_rifle", IsWeaponAllowed(cgs.dmflags, DF_WEAPON_NO_RIFLE));
|
||||
cgi.Cvar_Set("cg_weapon_sniper", IsWeaponAllowed(cgs.dmflags, DF_WEAPON_NO_SNIPER));
|
||||
cgi.Cvar_Set("cg_weapon_mg", IsWeaponAllowed(cgs.dmflags, DF_WEAPON_NO_MG));
|
||||
cgi.Cvar_Set("cg_weapon_smg", IsWeaponAllowed(cgs.dmflags, DF_WEAPON_NO_SMG));
|
||||
cgi.Cvar_Set("cg_weapon_rocket", IsWeaponAllowed(cgs.dmflags, DF_WEAPON_NO_ROCKET));
|
||||
cgi.Cvar_Set("cg_weapon_shotgun", IsWeaponAllowed(cgs.dmflags, DF_WEAPON_NO_SHOTGUN));
|
||||
cgi.Cvar_Set("cg_weapon_landmine", QueryLandminesAllowed2(mapname, cgs.dmflags) ? "1" : "0");
|
||||
|
||||
spawnpos = strchr(mapname, '$');
|
||||
if (spawnpos) {
|
||||
Q_strncpyz(map, mapname, spawnpos - mapname + 1);
|
||||
@@ -150,16 +219,32 @@ CG_Stopwatch_f
|
||||
|
||||
================
|
||||
*/
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
static void CG_Stopwatch_f()
|
||||
{
|
||||
if (cgi.Argc() != 3) {
|
||||
Com_Error(1, "stopwatch didn't have 2 parameters");
|
||||
}
|
||||
if (cgi.Argc() < 3) {
|
||||
Com_Error(ERR_DROP, "stopwatch didn't have 2 parameters");
|
||||
}
|
||||
|
||||
cgi.stopWatch->iStartTime = 1000 * atoi(cgi.Argv(1));
|
||||
cgi.stopWatch->iEndTime = cgi.stopWatch->iStartTime + 1000 * atoi(cgi.Argv(2));
|
||||
cgi.stopWatch->iStartTime = atoi(cgi.Argv(1));
|
||||
cgi.stopWatch->iEndTime = cgi.stopWatch->iStartTime + 1000 * atoi(cgi.Argv(2));
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void CG_Stopwatch_f()
|
||||
{
|
||||
if (cgi.Argc() < 3) {
|
||||
Com_Error(ERR_DROP, "stopwatch didn't have 2 parameters");
|
||||
}
|
||||
|
||||
cgi.stopWatch->iStartTime = 1000 * atoi(cgi.Argv(1));
|
||||
cgi.stopWatch->iEndTime = cgi.stopWatch->iStartTime + 1000 * atoi(cgi.Argv(2));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
================
|
||||
CG_ServerLag_f
|
||||
@@ -202,6 +287,50 @@ static void CG_ServerCommand(void)
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (!strcmp(cmd, "printdeathmsg")) {
|
||||
const char* s1, * s2, * s3, * s4, * s5;
|
||||
const char* result1, * result2;
|
||||
int hudColor;
|
||||
|
||||
result1 = NULL;
|
||||
result2 = NULL;
|
||||
s1 = cgi.Argv(1);
|
||||
s2 = cgi.Argv(2);
|
||||
s3 = cgi.Argv(3);
|
||||
s4 = cgi.Argv(4);
|
||||
s5 = cgi.Argv(5);
|
||||
|
||||
if (*s5 == tolower(*s5)) {
|
||||
hudColor = 4;
|
||||
} else {
|
||||
hudColor = 5;
|
||||
}
|
||||
|
||||
if (*s1 != 'x')
|
||||
result1 = cgi.LV_ConvertString(s1);
|
||||
if (*s2 != 'x')
|
||||
result2 = cgi.LV_ConvertString(s2);
|
||||
if (tolower(*s5) == 's')
|
||||
{
|
||||
cgi.Printf("%c%s %s\n", hudColor, s4, result1);
|
||||
}
|
||||
else if (tolower(*s5) == 'p')
|
||||
{
|
||||
if (*s2 == 'x')
|
||||
cgi.Printf("%c%s %s %s\n", hudColor, s4, result1, s3);
|
||||
else
|
||||
cgi.Printf("%c%s %s %s%s\n", hudColor, s4, result1, s3, result2);
|
||||
}
|
||||
else if (tolower(*s5) == 'w')
|
||||
{
|
||||
cgi.Printf("%c%s %s\n", hudColor, s4, result1);
|
||||
}
|
||||
else
|
||||
{
|
||||
cgi.Printf("%s", cgi.Argv(1));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(cmd, "stufftext")) {
|
||||
cgi.Cmd_Stuff(cgi.Argv(1));
|
||||
|
||||
@@ -799,7 +799,7 @@ void CG_DrawActiveFrame( int serverTime, int frameTime, stereoFrame_t stereoView
|
||||
cgi.SendClientCommand("stats");
|
||||
}
|
||||
|
||||
cg.bIntermissionDisplay = qfalse;
|
||||
cg.bIntermissionDisplay = qtrue;
|
||||
}
|
||||
else if (cg.bIntermissionDisplay)
|
||||
{
|
||||
|
||||
+179
-12
@@ -46,7 +46,40 @@ static const char* AnimPrefixList[] =
|
||||
"bazooka",
|
||||
"panzerschreck",
|
||||
"shotgun",
|
||||
"unarmed"
|
||||
"unarmed",
|
||||
//
|
||||
// Team Assault and Team Tactics weapons
|
||||
"mg42portable",
|
||||
"webley",
|
||||
"nagantrev",
|
||||
"beretta",
|
||||
"enfield",
|
||||
"svt",
|
||||
"mosin",
|
||||
"g43",
|
||||
"enfieldl42a1",
|
||||
"carcano",
|
||||
"delisle",
|
||||
"thompson",
|
||||
"sten",
|
||||
"ppsh",
|
||||
"moschetto",
|
||||
"fg42",
|
||||
"vickers",
|
||||
"breda",
|
||||
"f1grenade",
|
||||
"millsgrenade",
|
||||
"nebelhandgranate",
|
||||
"m18smokegrenade",
|
||||
"rdg1smokegrenade",
|
||||
"bomba",
|
||||
"bombabreda",
|
||||
"mine",
|
||||
"minedetector",
|
||||
"minedetectoraxis",
|
||||
"detonator",
|
||||
"kar98mortar",
|
||||
"PIAT"
|
||||
};
|
||||
|
||||
enum animPrefix_e
|
||||
@@ -69,7 +102,39 @@ enum animPrefix_e
|
||||
WPREFIX_BAZOOKA,
|
||||
WPREFIX_PANZERSCHRECK,
|
||||
WPREFIX_SHOTGUN,
|
||||
WPREFIX_UNARMED
|
||||
WPREFIX_UNARMED,
|
||||
//
|
||||
// Team Assault and Team Tactics weapons
|
||||
WPREFIX_MG42_PORTABLE,
|
||||
WPREFIX_WEBLEY,
|
||||
WPREFIX_NAGANTREV,
|
||||
WPREFIX_BERETTA,
|
||||
WPREFIX_ENFIELD,
|
||||
WPREFIX_SVT,
|
||||
WPREFIX_MOSIN,
|
||||
WPREFIX_G43,
|
||||
WPREFIX_ENFIELDL42A,
|
||||
WPREFIX_CARCANO,
|
||||
WPREFIX_DELISLE,
|
||||
WPREFIX_STEN,
|
||||
WPREFIX_PPSH,
|
||||
WPREFIX_MOSCHETTO,
|
||||
WPREFIX_FG42,
|
||||
WPREFIX_VICKERS,
|
||||
WPREFIX_BREDA,
|
||||
WPREFIX_F1_GRENADE,
|
||||
WPREFIX_MILLS_GRENADE,
|
||||
WPREFIX_NEBELHANDGRANATE,
|
||||
WPREFIX_M18_SMOKE_GRENADE,
|
||||
WPREFIX_RDG1_SMOKE_GRENADE,
|
||||
WPREFIX_BOMBA,
|
||||
WPREFIX_BOMBA_BREDA,
|
||||
WPREFIX_MINE,
|
||||
WPREFIX_MINE_DETECTOR,
|
||||
WPREFIX_MINE_DETECTOR_AXIS,
|
||||
WPREFIX_DETONATOR,
|
||||
WPREFIX_KAR98_MORTAR,
|
||||
WPREFIX_PIAT
|
||||
};
|
||||
|
||||
int CG_GetVMAnimPrefixIndex()
|
||||
@@ -83,7 +148,9 @@ int CG_GetVMAnimPrefixIndex()
|
||||
if (iWeaponClass & WEAPON_CLASS_ANY_ITEM)
|
||||
{
|
||||
if (!Q_stricmp(szWeaponName, "Papers"))
|
||||
return WPREFIX_PAPERS;
|
||||
return WPREFIX_PAPERS;
|
||||
if (!Q_stricmp(szWeaponName, "Packed MG42 Turret"))
|
||||
return WPREFIX_MG42_PORTABLE;
|
||||
}
|
||||
else if (iWeaponClass & WEAPON_CLASS_PISTOL)
|
||||
{
|
||||
@@ -92,7 +159,19 @@ int CG_GetVMAnimPrefixIndex()
|
||||
if (!Q_stricmp(szWeaponName, "Walther P38"))
|
||||
return WPREFIX_P38;
|
||||
if (!Q_stricmp(szWeaponName, "Hi-Standard Silenced"))
|
||||
return WPREFIX_HISTANDARD;
|
||||
return WPREFIX_HISTANDARD;
|
||||
|
||||
//
|
||||
// Team Assault and Team Tactics
|
||||
//
|
||||
if (!Q_stricmp(szWeaponName, "Webley Revolver"))
|
||||
return WPREFIX_WEBLEY;
|
||||
if (!Q_stricmp(szWeaponName, "Nagant Revolver"))
|
||||
return WPREFIX_NAGANTREV;
|
||||
if (!Q_stricmp(szWeaponName, "Beretta"))
|
||||
return WPREFIX_BERETTA;
|
||||
|
||||
return WPREFIX_COLT45;
|
||||
}
|
||||
else if (iWeaponClass & WEAPON_CLASS_RIFLE)
|
||||
{
|
||||
@@ -103,28 +182,97 @@ int CG_GetVMAnimPrefixIndex()
|
||||
if (!Q_stricmp(szWeaponName, "KAR98 - Sniper"))
|
||||
return WPREFIX_KAR98SNIPER;
|
||||
if (!Q_stricmp(szWeaponName, "Springfield '03 Sniper"))
|
||||
return WPREFIX_SPRINGFIELD;
|
||||
return WPREFIX_SPRINGFIELD;
|
||||
|
||||
//
|
||||
// Team Assault and Team Tactics
|
||||
//
|
||||
if (!Q_stricmp(szWeaponName, "Lee-Enfield"))
|
||||
return WPREFIX_SPRINGFIELD;
|
||||
if (!Q_stricmp(szWeaponName, "SVT 40"))
|
||||
return WPREFIX_SVT;
|
||||
if (!Q_stricmp(szWeaponName, "Mosin Nagant Rifle"))
|
||||
return WPREFIX_MOSIN;
|
||||
if (!Q_stricmp(szWeaponName, "G 43"))
|
||||
return WPREFIX_G43;
|
||||
if (!Q_stricmp(szWeaponName, "Enfield L42A1"))
|
||||
return WPREFIX_ENFIELD;
|
||||
if (!Q_stricmp(szWeaponName, "Carcano"))
|
||||
return WPREFIX_CARCANO;
|
||||
if (!Q_stricmp(szWeaponName, "DeLisle"))
|
||||
return WPREFIX_DELISLE;
|
||||
|
||||
return WPREFIX_GARAND;
|
||||
}
|
||||
else if (iWeaponClass & WEAPON_CLASS_SMG)
|
||||
{
|
||||
if (!Q_stricmp(szWeaponName, "Thompson"))
|
||||
return WPREFIX_THOMPSON;
|
||||
if (!Q_stricmp(szWeaponName, "MP40"))
|
||||
return WPREFIX_MP40;
|
||||
return WPREFIX_MP40;
|
||||
//
|
||||
// Team Assault and Team Tactics
|
||||
//
|
||||
if (!Q_stricmp(szWeaponName, "Sten Mark II"))
|
||||
return WPREFIX_STEN;
|
||||
if (!Q_stricmp(szWeaponName, "PPSH SMG"))
|
||||
return WPREFIX_PPSH;
|
||||
if (!Q_stricmp(szWeaponName, "Moschetto"))
|
||||
return WPREFIX_MOSCHETTO;
|
||||
|
||||
return WPREFIX_THOMPSON;
|
||||
}
|
||||
else if (iWeaponClass & WEAPON_CLASS_MG)
|
||||
{
|
||||
if (!Q_stricmp(szWeaponName, "BAR"))
|
||||
return WPREFIX_BAR;
|
||||
if (!Q_stricmp(szWeaponName, "StG 44"))
|
||||
return WPREFIX_MP44;
|
||||
return WPREFIX_MP44;
|
||||
//
|
||||
// Team Assault and Team Tactics
|
||||
//
|
||||
if (!Q_stricmp(szWeaponName, "FG 42"))
|
||||
return WPREFIX_MP44;
|
||||
if (!Q_stricmp(szWeaponName, "Vickers-Berthier"))
|
||||
return WPREFIX_MP44;
|
||||
if (!Q_stricmp(szWeaponName, "Breda"))
|
||||
return WPREFIX_MP44;
|
||||
|
||||
return WPREFIX_BAR;
|
||||
}
|
||||
else if (iWeaponClass & WEAPON_CLASS_GRENADE)
|
||||
{
|
||||
if (!Q_stricmp(szWeaponName, "Frag Grenade"))
|
||||
return WPREFIX_FRAGGRENADE;
|
||||
if (!Q_stricmp(szWeaponName, "Stielhandgranate"))
|
||||
return WPREFIX_STIELHANDGRANATE;
|
||||
return WPREFIX_STIELHANDGRANATE;
|
||||
//
|
||||
// Team Assault and Team Tactics
|
||||
//
|
||||
if (!Q_stricmp(szWeaponName, "F1 Grenade"))
|
||||
return WPREFIX_F1_GRENADE;
|
||||
if (!Q_stricmp(szWeaponName, "Mills Grenade"))
|
||||
return WPREFIX_MILLS_GRENADE;
|
||||
if (!Q_stricmp(szWeaponName, "Nebelhandgranate"))
|
||||
return WPREFIX_NEBELHANDGRANATE;
|
||||
if (!Q_stricmp(szWeaponName, "M18 Smoke Grenade"))
|
||||
return WPREFIX_M18_SMOKE_GRENADE;
|
||||
if (!Q_stricmp(szWeaponName, "RDG-1 Smoke Grenade"))
|
||||
return WPREFIX_RDG1_SMOKE_GRENADE;
|
||||
if (!Q_stricmp(szWeaponName, "Bomba A Mano"))
|
||||
return WPREFIX_BOMBA;
|
||||
if (!Q_stricmp(szWeaponName, "Bomba A Mano Breda"))
|
||||
return WPREFIX_BOMBA_BREDA;
|
||||
if (!Q_stricmp(szWeaponName, "LandmineAllies"))
|
||||
return WPREFIX_MINE;
|
||||
if (!Q_stricmp(szWeaponName, "LandmineAxis"))
|
||||
return WPREFIX_MINE;
|
||||
if (!Q_stricmp(szWeaponName, "Minensuchgerat"))
|
||||
return WPREFIX_MINE_DETECTOR_AXIS;
|
||||
if (!Q_stricmp(szWeaponName, "Minedetector"))
|
||||
return WPREFIX_MINE_DETECTOR;
|
||||
|
||||
return WPREFIX_FRAGGRENADE;
|
||||
}
|
||||
else if (iWeaponClass & WEAPON_CLASS_HEAVY)
|
||||
{
|
||||
@@ -133,7 +281,14 @@ int CG_GetVMAnimPrefixIndex()
|
||||
if (!Q_stricmp(szWeaponName, "Panzerschreck"))
|
||||
return WPREFIX_PANZERSCHRECK;
|
||||
if (!Q_stricmp(szWeaponName, "Shotgun"))
|
||||
return WPREFIX_SHOTGUN;
|
||||
return WPREFIX_SHOTGUN;
|
||||
//
|
||||
// Team Assault and Team Tactics
|
||||
//
|
||||
if (!Q_stricmp(szWeaponName, "PIAT"))
|
||||
return WPREFIX_PIAT;
|
||||
|
||||
return WPREFIX_BAZOOKA;
|
||||
}
|
||||
|
||||
return WPREFIX_UNARMED;
|
||||
@@ -226,10 +381,22 @@ void CG_ViewModelAnimation(refEntity_t* pModel)
|
||||
case VM_ANIM_LADDERSTEP:
|
||||
pszAnimSuffix = "ladderstep";
|
||||
break;
|
||||
case VM_ANIM_IDLE:
|
||||
case VM_ANIM_IDLE_0:
|
||||
pszAnimSuffix = "idle0";
|
||||
break;
|
||||
case VM_ANIM_IDLE_1:
|
||||
pszAnimSuffix = "idle1";
|
||||
break;
|
||||
case VM_ANIM_IDLE_2:
|
||||
pszAnimSuffix = "idle2";
|
||||
break;
|
||||
case VM_ANIM_DISABLED:
|
||||
pszAnimSuffix = "disabled";
|
||||
break;
|
||||
default:
|
||||
pszAnimSuffix = "idle";
|
||||
break;
|
||||
case VM_ANIM_IDLE:
|
||||
pszAnimSuffix = "idle";
|
||||
break;
|
||||
}
|
||||
|
||||
sprintf(szAnimName, "%s_%s", AnimPrefixList[iAnimPrefixIndex], pszAnimSuffix);
|
||||
|
||||
@@ -145,18 +145,23 @@ void VSS_AddRepulsion(cvssource_t* pA, cvssource_t* pB)
|
||||
|
||||
cvssource_t* ClientGameCommandManager::AllocateVSSSource()
|
||||
{
|
||||
m_free_vsssources = m_free_vsssources;
|
||||
cvssource_t* pNew;
|
||||
|
||||
if (!m_free_vsssources) {
|
||||
FreeVSSSource(m_active_vsssources.prev);
|
||||
}
|
||||
|
||||
pNew = m_free_vsssources;
|
||||
m_free_vsssources = m_free_vsssources->next;
|
||||
memset(m_free_vsssources, 0, sizeof(cvssource_t));
|
||||
memset(pNew, 0, sizeof(cvssource_t));
|
||||
|
||||
m_free_vsssources->next = m_active_vsssources.next;
|
||||
m_free_vsssources->prev = &m_active_vsssources;
|
||||
pNew->next = m_active_vsssources.next;
|
||||
pNew->prev = &m_active_vsssources;
|
||||
|
||||
m_active_vsssources.next->prev = m_free_vsssources;
|
||||
m_active_vsssources.next = m_free_vsssources;
|
||||
m_active_vsssources.next->prev = pNew;
|
||||
m_active_vsssources.next = pNew;
|
||||
|
||||
return m_free_vsssources;
|
||||
return pNew;
|
||||
}
|
||||
|
||||
void ClientGameCommandManager::FreeVSSSource(cvssource_t* p)
|
||||
@@ -201,7 +206,7 @@ void ClientGameCommandManager::ResetVSSSources()
|
||||
}
|
||||
|
||||
m_vsssources = (cvssource_t*)cgi.Malloc(sizeof(cvssource_t) * m_iAllocatedvsssources);
|
||||
memset(m_vsssources, 0, sizeof(sizeof(cvssource_t) * m_iAllocatedvsssources));
|
||||
memset(m_vsssources, 0, sizeof(cvssource_t) * m_iAllocatedvsssources);
|
||||
|
||||
m_active_vsssources.next = &m_active_vsssources;
|
||||
m_active_vsssources.prev = &m_active_vsssources;
|
||||
|
||||
@@ -34,6 +34,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
// refdef flags
|
||||
#define RDF_NOWORLDMODEL 1 // used for player configuration screen
|
||||
#define RDF_FULLBRIGHT 2 // fullbright intensity
|
||||
#define RDF_HYPERSPACE 4 // teleportation effect
|
||||
|
||||
typedef struct
|
||||
|
||||
+65
-21
@@ -158,6 +158,10 @@ CL_GetSnapshot
|
||||
qboolean CL_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) {
|
||||
clSnapshot_t *clSnap;
|
||||
int i, count;
|
||||
int pnum;
|
||||
int parents[MAX_ENTITIES_IN_SNAPSHOT];
|
||||
entityState_t *s1;
|
||||
int pcount = 0;
|
||||
|
||||
if ( snapshotNumber > cl.snap.messageNum ) {
|
||||
Com_Error( ERR_DROP, "CL_GetSnapshot: snapshotNumber > cl.snapshot.messageNum" );
|
||||
@@ -187,41 +191,81 @@ qboolean CL_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) {
|
||||
snapshot->serverTime = clSnap->serverTime;
|
||||
Com_Memcpy( snapshot->areamask, clSnap->areamask, sizeof( snapshot->areamask ) );
|
||||
snapshot->ps = clSnap->ps;
|
||||
|
||||
// wombat: sounds
|
||||
count = clSnap->number_of_sounds;
|
||||
if (snapshot->number_of_sounds > MAX_SERVER_SOUNDS) {
|
||||
Com_DPrintf("CL_GetSnapshot: truncated %i sounds to %i\n", count, MAX_SERVER_SOUNDS);
|
||||
count = MAX_SERVER_SOUNDS;
|
||||
}
|
||||
|
||||
snapshot->number_of_sounds = count;
|
||||
Com_Memcpy(snapshot->sounds, clSnap->sounds, sizeof(snapshot->sounds[0])* count);
|
||||
|
||||
count = clSnap->numEntities;
|
||||
if ( count > MAX_ENTITIES_IN_SNAPSHOT ) {
|
||||
Com_DPrintf( "CL_GetSnapshot: truncated %i visible entities to %i\n", count, MAX_ENTITIES_IN_SNAPSHOT );
|
||||
count = MAX_ENTITIES_IN_SNAPSHOT;
|
||||
}
|
||||
snapshot->numEntities = count;
|
||||
|
||||
snapshot->numEntities = 0;
|
||||
for ( i = 0 ; i < count ; i++ ) {
|
||||
snapshot->entities[i] =
|
||||
cl.parseEntities[ ( clSnap->parseEntitiesNum + i ) & (MAX_PARSE_ENTITIES-1) ];
|
||||
s1 = &cl.parseEntities[(clSnap->parseEntitiesNum + i) & (MAX_PARSE_ENTITIES - 1)];
|
||||
pnum = s1->parent;
|
||||
|
||||
if (pnum == ENTITYNUM_NONE) {
|
||||
parents[s1->number] = -2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (parents[pnum] == -2) {
|
||||
parents[s1->number] = -2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// add it later
|
||||
parents[s1->number] = pnum;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
snapshot->entities[snapshot->numEntities++] = *s1;
|
||||
}
|
||||
|
||||
// wombat: sounds
|
||||
count = clSnap->number_of_sounds;
|
||||
if ( snapshot->number_of_sounds > MAX_SERVER_SOUNDS) {
|
||||
Com_DPrintf( "CL_GetSnapshot: truncated %i sounds to %i\n", count, MAX_SERVER_SOUNDS);
|
||||
count = MAX_SERVER_SOUNDS;
|
||||
for(pcount = 0; pcount < 8 && snapshot->numEntities != count; pcount++)
|
||||
{
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
s1 = &cl.parseEntities[(clSnap->parseEntitiesNum + i) & (MAX_PARSE_ENTITIES - 1)];
|
||||
pnum = parents[s1->number];
|
||||
if (pnum >= 0 && parents[pnum] == -2) {
|
||||
snapshot->entities[snapshot->numEntities++] = *s1;
|
||||
}
|
||||
}
|
||||
}
|
||||
snapshot->number_of_sounds = count;
|
||||
Com_Memcpy( snapshot->sounds, clSnap->sounds, sizeof(snapshot->sounds[0])*count );
|
||||
|
||||
// FIXME: configstring changes and server commands!!!
|
||||
if (pcount >= 8)
|
||||
{
|
||||
for (i = count; i < snapshot->numEntities; i++)
|
||||
{
|
||||
s1 = &cl.parseEntities[(clSnap->parseEntitiesNum + i) & (MAX_PARSE_ENTITIES - 1)];
|
||||
if (parents[s1->number] >= 0) {
|
||||
Com_DPrintf(
|
||||
"CL_GetSnapshot: entity %d with parent %d and model '%s' at %.2f %.2f %.2f, could not find parent.\n",
|
||||
s1->number,
|
||||
s1->parent,
|
||||
CL_ConfigString(CS_MODELS + s1->modelindex),
|
||||
s1->origin[0],
|
||||
s1->origin[1],
|
||||
s1->origin[2]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_SetUserCmdValue
|
||||
=====================
|
||||
*/
|
||||
void CL_SetUserCmdValue( int userCmdValue, float sensitivityScale ) {
|
||||
cl.cgameUserCmdValue = userCmdValue;
|
||||
cl.cgameSensitivity = sensitivityScale;
|
||||
}
|
||||
|
||||
/*
|
||||
=====================
|
||||
CL_AddCgameCommand
|
||||
|
||||
+100
-88
@@ -242,6 +242,16 @@ void IN_MoveleftDown(void) {IN_KeyDown(&in_moveleft);}
|
||||
void IN_MoveleftUp(void) {IN_KeyUp(&in_moveleft);}
|
||||
void IN_MoverightDown(void) {IN_KeyDown(&in_moveright);}
|
||||
void IN_MoverightUp(void) {IN_KeyUp(&in_moveright);}
|
||||
void IN_AttackPrimaryDown(void) { IN_KeyDown(&in_buttons[0]);}
|
||||
void IN_AttackPrimaryUp(void) { IN_KeyUp(&in_buttons[0]); }
|
||||
void IN_AttackSecondaryDown(void) { IN_KeyDown(&in_buttons[1]); }
|
||||
void IN_AttackSecondaryUp(void) { IN_KeyUp(&in_buttons[1]); }
|
||||
void IN_UseDown(void) { IN_KeyDown(&in_buttons[3]); }
|
||||
void IN_UseUp(void) { IN_KeyUp(&in_buttons[3]); }
|
||||
void IN_LeanLeftDown(void) { IN_KeyDown(&in_buttons[4]); }
|
||||
void IN_LeanLeftUp(void) { IN_KeyUp(&in_buttons[4]); }
|
||||
void IN_LeanRightDown(void) { IN_KeyDown(&in_buttons[5]); }
|
||||
void IN_LeanRightUp(void) { IN_KeyUp(&in_buttons[5]); }
|
||||
|
||||
void IN_SpeedDown(void) {IN_KeyDown(&in_speed);}
|
||||
void IN_SpeedUp(void) {IN_KeyUp(&in_speed);}
|
||||
@@ -341,22 +351,10 @@ void CL_KeyMove( usercmd_t *cmd ) {
|
||||
int movespeed;
|
||||
int forward, side, up;
|
||||
|
||||
//
|
||||
// adjust for speed key / running
|
||||
// the walking flag is to keep animations consistant
|
||||
// even during acceleration and develeration
|
||||
//
|
||||
if ( in_speed.active ^ cl_run->integer ) {
|
||||
movespeed = 127;
|
||||
cmd->buttons |= BUTTON_RUN;
|
||||
} else {
|
||||
cmd->buttons &= ~BUTTON_RUN;
|
||||
movespeed = 64;
|
||||
}
|
||||
|
||||
forward = 0;
|
||||
side = 0;
|
||||
up = 0;
|
||||
movespeed = 127;
|
||||
if ( in_strafe.active ) {
|
||||
side += movespeed * CL_KeyState (&in_right);
|
||||
side -= movespeed * CL_KeyState (&in_left);
|
||||
@@ -461,16 +459,8 @@ CL_JoystickMove
|
||||
=================
|
||||
*/
|
||||
void CL_JoystickMove( usercmd_t *cmd ) {
|
||||
int movespeed;
|
||||
float anglespeed;
|
||||
|
||||
if ( in_speed.active ^ cl_run->integer ) {
|
||||
movespeed = 2;
|
||||
} else {
|
||||
movespeed = 1;
|
||||
cmd->buttons |= BUTTON_RUN;
|
||||
}
|
||||
|
||||
if ( in_speed.active ) {
|
||||
anglespeed = 0.001 * cls.frametime * cl_anglespeedkey->value;
|
||||
} else {
|
||||
@@ -566,7 +556,7 @@ CL_CmdButtons
|
||||
*/
|
||||
void CL_CmdButtons( usercmd_t *cmd ) {
|
||||
int i;
|
||||
|
||||
|
||||
//
|
||||
// figure button bits
|
||||
// send a button bit even if the key was pressed and released in
|
||||
@@ -579,18 +569,28 @@ void CL_CmdButtons( usercmd_t *cmd ) {
|
||||
in_buttons[i].wasPressed = qfalse;
|
||||
}
|
||||
|
||||
// if ( Key_GetCatcher( ) ) {
|
||||
// cmd->buttons |= BUTTON_TALK; // su44: is there a TALK button in MoHAA?
|
||||
// }
|
||||
if (UI_MenuActive() || UI_ConsoleIsOpen()) {
|
||||
cmd->buttons |= BUTTON_TALK;
|
||||
}
|
||||
|
||||
if (in_speed.active == !cl_run->integer) {
|
||||
cmd->buttons |= BUTTON_RUN;
|
||||
}
|
||||
|
||||
if (cge) {
|
||||
// send weapon commands from cg
|
||||
cmd->buttons |= cge->CG_WeaponCommandButtonBits();
|
||||
}
|
||||
|
||||
// allow the game to know if any key at all is
|
||||
// currently pressed, even if it isn't bound to anything
|
||||
if ( anykeydown && Key_GetCatcher( ) == 0 ) {
|
||||
cmd->buttons |= BUTTON_ANY;
|
||||
if ( anykeydown && Key_GetCatcher() == 0) {
|
||||
cmd->buttons |= BUTTON_MOUSE;
|
||||
}
|
||||
|
||||
// su44: add weapon command bits
|
||||
cmd->buttons |= cl.cgameUserCmdValue;
|
||||
if (anykeydown) {
|
||||
cmd->buttons |= BUTTON_ANY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -855,7 +855,7 @@ void CL_WritePacket( void ) {
|
||||
for ( i = clc.reliableAcknowledge + 1 ; i <= clc.reliableSequence ; i++ ) {
|
||||
MSG_WriteByte( &buf, clc_clientCommand );
|
||||
MSG_WriteLong( &buf, i );
|
||||
MSG_WriteString( &buf, clc.reliableCommands[ i & (MAX_RELIABLE_COMMANDS-1) ] );
|
||||
MSG_WriteScrambledString( &buf, clc.reliableCommands[ i & (MAX_RELIABLE_COMMANDS-1) ] );
|
||||
}
|
||||
|
||||
// we want to send all the usercmds that were generated in the last
|
||||
@@ -924,7 +924,7 @@ void CL_WritePacket( void ) {
|
||||
clc.lastPacketSentTime = cls.realtime;
|
||||
|
||||
if ( cl_showSend->integer ) {
|
||||
Com_Printf( "%i ", buf.cursize );
|
||||
Com_Printf( "%zu ", buf.cursize );
|
||||
}
|
||||
|
||||
CL_Netchan_Transmit (&clc.netchan, &buf);
|
||||
@@ -978,64 +978,76 @@ CL_InitInput
|
||||
============
|
||||
*/
|
||||
void CL_InitInput( void ) {
|
||||
Cmd_AddCommand ("centerview",IN_CenterView);
|
||||
Cmd_AddCommand("centerview", IN_CenterView);
|
||||
|
||||
Cmd_AddCommand ("+moveup",IN_UpDown);
|
||||
Cmd_AddCommand ("-moveup",IN_UpUp);
|
||||
Cmd_AddCommand ("+movedown",IN_DownDown);
|
||||
Cmd_AddCommand ("-movedown",IN_DownUp);
|
||||
Cmd_AddCommand ("+left",IN_LeftDown);
|
||||
Cmd_AddCommand ("-left",IN_LeftUp);
|
||||
Cmd_AddCommand ("+right",IN_RightDown);
|
||||
Cmd_AddCommand ("-right",IN_RightUp);
|
||||
Cmd_AddCommand ("+forward",IN_ForwardDown);
|
||||
Cmd_AddCommand ("-forward",IN_ForwardUp);
|
||||
Cmd_AddCommand ("+back",IN_BackDown);
|
||||
Cmd_AddCommand ("-back",IN_BackUp);
|
||||
Cmd_AddCommand ("+lookup", IN_LookupDown);
|
||||
Cmd_AddCommand ("-lookup", IN_LookupUp);
|
||||
Cmd_AddCommand ("+lookdown", IN_LookdownDown);
|
||||
Cmd_AddCommand ("-lookdown", IN_LookdownUp);
|
||||
Cmd_AddCommand ("+strafe", IN_StrafeDown);
|
||||
Cmd_AddCommand ("-strafe", IN_StrafeUp);
|
||||
Cmd_AddCommand ("+moveleft", IN_MoveleftDown);
|
||||
Cmd_AddCommand ("-moveleft", IN_MoveleftUp);
|
||||
Cmd_AddCommand ("+moveright", IN_MoverightDown);
|
||||
Cmd_AddCommand ("-moveright", IN_MoverightUp);
|
||||
Cmd_AddCommand ("+speed", IN_SpeedDown);
|
||||
Cmd_AddCommand ("-speed", IN_SpeedUp);
|
||||
Cmd_AddCommand ("+attackprimary", IN_Button0Down);
|
||||
Cmd_AddCommand ("-attackprimary", IN_Button0Up);
|
||||
Cmd_AddCommand ("+attacksecondary", IN_Button1Down);
|
||||
Cmd_AddCommand ("-attacksecondary", IN_Button1Up);
|
||||
// Cmd_AddCommand ("+speed", IN_Button2Down);
|
||||
// Cmd_AddCommand ("-speed", IN_Button2Up);
|
||||
Cmd_AddCommand ("+use", IN_Button3Down);
|
||||
Cmd_AddCommand ("-use", IN_Button3Up);
|
||||
Cmd_AddCommand ("+leanleft", IN_Button4Down);
|
||||
Cmd_AddCommand ("-leanleft", IN_Button4Up);
|
||||
Cmd_AddCommand ("+leanright", IN_Button5Down);
|
||||
Cmd_AddCommand ("-leanright", IN_Button5Up);
|
||||
Cmd_AddCommand ("+button6", IN_Button6Down);
|
||||
Cmd_AddCommand ("-button6", IN_Button6Up);
|
||||
Cmd_AddCommand ("+button7", IN_Button7Down);
|
||||
Cmd_AddCommand ("-button7", IN_Button7Up);
|
||||
Cmd_AddCommand ("+button8", IN_Button8Down);
|
||||
Cmd_AddCommand ("-button8", IN_Button8Up);
|
||||
Cmd_AddCommand ("+button9", IN_Button9Down);
|
||||
Cmd_AddCommand ("-button9", IN_Button9Up);
|
||||
Cmd_AddCommand ("+button10", IN_Button10Down);
|
||||
Cmd_AddCommand ("-button10", IN_Button10Up);
|
||||
Cmd_AddCommand ("+button11", IN_Button11Down);
|
||||
Cmd_AddCommand ("-button11", IN_Button11Up);
|
||||
Cmd_AddCommand ("+button12", IN_Button12Down);
|
||||
Cmd_AddCommand ("-button12", IN_Button12Up);
|
||||
Cmd_AddCommand ("+button13", IN_Button13Down);
|
||||
Cmd_AddCommand ("-button13", IN_Button13Up);
|
||||
Cmd_AddCommand ("+button14", IN_Button14Down);
|
||||
Cmd_AddCommand ("-button14", IN_Button14Up);
|
||||
Cmd_AddCommand ("+mlook", IN_MLookDown);
|
||||
Cmd_AddCommand ("-mlook", IN_MLookUp);
|
||||
Cmd_AddCommand("+moveup", IN_UpDown);
|
||||
Cmd_AddCommand("-moveup", IN_UpUp);
|
||||
Cmd_AddCommand("+movedown", IN_DownDown);
|
||||
Cmd_AddCommand("-movedown", IN_DownUp);
|
||||
Cmd_AddCommand("+left", IN_LeftDown);
|
||||
Cmd_AddCommand("-left", IN_LeftUp);
|
||||
Cmd_AddCommand("+right", IN_RightDown);
|
||||
Cmd_AddCommand("-right", IN_RightUp);
|
||||
Cmd_AddCommand("+forward", IN_ForwardDown);
|
||||
Cmd_AddCommand("-forward", IN_ForwardUp);
|
||||
Cmd_AddCommand("+back", IN_BackDown);
|
||||
Cmd_AddCommand("-back", IN_BackUp);
|
||||
Cmd_AddCommand("+lookup", IN_LookupDown);
|
||||
Cmd_AddCommand("-lookup", IN_LookupUp);
|
||||
Cmd_AddCommand("+lookdown", IN_LookdownDown);
|
||||
Cmd_AddCommand("-lookdown", IN_LookdownUp);
|
||||
Cmd_AddCommand("+strafe", IN_StrafeDown);
|
||||
Cmd_AddCommand("-strafe", IN_StrafeUp);
|
||||
Cmd_AddCommand("+moveleft", IN_MoveleftDown);
|
||||
Cmd_AddCommand("-moveleft", IN_MoveleftUp);
|
||||
Cmd_AddCommand("+moveright", IN_MoverightDown);
|
||||
Cmd_AddCommand("-moveright", IN_MoverightUp);
|
||||
Cmd_AddCommand("+attack", IN_AttackPrimaryDown);
|
||||
Cmd_AddCommand("-attack", IN_AttackPrimaryUp);
|
||||
Cmd_AddCommand("+attackprimary", IN_AttackPrimaryDown);
|
||||
Cmd_AddCommand("-attackprimary", IN_AttackPrimaryUp);
|
||||
Cmd_AddCommand("+attacksecondary", IN_AttackSecondaryDown);
|
||||
Cmd_AddCommand("-attacksecondary", IN_AttackSecondaryUp);
|
||||
Cmd_AddCommand("+use", IN_Button3Down);
|
||||
Cmd_AddCommand("-use", IN_Button3Up);
|
||||
Cmd_AddCommand("+leanleft", IN_LeanLeftDown);
|
||||
Cmd_AddCommand("-leanleft", IN_LeanLeftUp);
|
||||
Cmd_AddCommand("+leanright", IN_LeanRightDown);
|
||||
Cmd_AddCommand("-leanright", IN_LeanRightUp);
|
||||
Cmd_AddCommand("+speed", IN_SpeedUp);
|
||||
Cmd_AddCommand("-speed", IN_SpeedDown);
|
||||
Cmd_AddCommand("+button0", IN_Button0Down);
|
||||
Cmd_AddCommand("-button0", IN_Button0Up);
|
||||
Cmd_AddCommand("+button1", IN_Button1Down);
|
||||
Cmd_AddCommand("-button1", IN_Button1Up);
|
||||
Cmd_AddCommand("+button2", IN_Button2Down);
|
||||
Cmd_AddCommand("-button2", IN_Button2Up);
|
||||
Cmd_AddCommand("+button3", IN_Button3Down);
|
||||
Cmd_AddCommand("-button3", IN_Button3Up);
|
||||
Cmd_AddCommand("+button4", IN_Button4Down);
|
||||
Cmd_AddCommand("-button4", IN_Button4Up);
|
||||
Cmd_AddCommand("+button5", IN_Button5Down);
|
||||
Cmd_AddCommand("-button5", IN_Button5Up);
|
||||
Cmd_AddCommand("+button6", IN_Button6Down);
|
||||
Cmd_AddCommand("-button6", IN_Button6Up);
|
||||
Cmd_AddCommand("+button7", IN_Button7Down);
|
||||
Cmd_AddCommand("-button7", IN_Button7Up);
|
||||
Cmd_AddCommand("+button8", IN_Button8Down);
|
||||
Cmd_AddCommand("-button8", IN_Button8Up);
|
||||
Cmd_AddCommand("+button9", IN_Button9Down);
|
||||
Cmd_AddCommand("-button9", IN_Button9Up);
|
||||
Cmd_AddCommand("+button10", IN_Button10Down);
|
||||
Cmd_AddCommand("-button10", IN_Button10Up);
|
||||
Cmd_AddCommand("+button11", IN_Button11Down);
|
||||
Cmd_AddCommand("-button11", IN_Button11Up);
|
||||
Cmd_AddCommand("+button12", IN_Button12Down);
|
||||
Cmd_AddCommand("-button12", IN_Button12Up);
|
||||
Cmd_AddCommand("+button13", IN_Button13Down);
|
||||
Cmd_AddCommand("-button13", IN_Button13Up);
|
||||
Cmd_AddCommand("+button14", IN_Button14Down);
|
||||
Cmd_AddCommand("-button14", IN_Button14Up);
|
||||
Cmd_AddCommand("+mlook", IN_MLookDown);
|
||||
Cmd_AddCommand("-mlook", IN_MLookUp);
|
||||
|
||||
cl_nodelta = Cvar_Get ("cl_nodelta", "0", 0);
|
||||
cl_debugMove = Cvar_Get ("cl_debugMove", "0", 0);
|
||||
|
||||
+15
-8
@@ -51,8 +51,8 @@ qboolean alt_down;
|
||||
qboolean ctrl_down;
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
int keynum;
|
||||
const char *name;
|
||||
int keynum;
|
||||
} keyname_t;
|
||||
|
||||
|
||||
@@ -466,7 +466,7 @@ void Key_SetCtrlBinding( int keynum, const char *binding ) {
|
||||
Key_GetBinding
|
||||
===================
|
||||
*/
|
||||
char *Key_GetBinding( int keynum ) {
|
||||
const char *Key_GetBinding( int keynum ) {
|
||||
if ( keynum < 0 || keynum >= K_LASTKEY ) {
|
||||
return "";
|
||||
}
|
||||
@@ -521,7 +521,7 @@ Key_GetKeysForCommand
|
||||
void Key_GetKeysForCommand( const char *command, int *key1, int *key2 ) {
|
||||
int i;
|
||||
|
||||
*key1 = *key2 = 0;
|
||||
*key1 = *key2 = -1;
|
||||
|
||||
for( i = 0; i < K_LASTKEY; i++ ) {
|
||||
if( !keys[ i ].binding ) {
|
||||
@@ -947,7 +947,13 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
|
||||
ctrl_down = down;
|
||||
}
|
||||
|
||||
if( cls.state > CA_DISCONNECTED && cge && !cls.keyCatchers && cge->CG_CheckCaptureKey( key, down, time ) && key != K_ESCAPE )
|
||||
if (down && !CL_FinishedIntro())
|
||||
{
|
||||
UI_StartStageKeyEvent();
|
||||
return;
|
||||
}
|
||||
|
||||
if( cls.state > CA_DISCONNECTED && cge && !Key_GetCatcher() && cge->CG_CheckCaptureKey( key, down, time ) && key != K_ESCAPE )
|
||||
{
|
||||
if( key != '`' && key != '~' )
|
||||
return;
|
||||
@@ -958,6 +964,7 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
|
||||
if( !down ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( Cvar_VariableIntegerValue( "ui_console" ) )
|
||||
{
|
||||
UI_ToggleConsole();
|
||||
@@ -1011,10 +1018,10 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
|
||||
}
|
||||
}
|
||||
|
||||
if( in_guimouse || key <= K_MOUSE3 || key > K_JOY1 )
|
||||
if (!in_guimouse || key <= K_MOUSE3 || key > K_JOY1)
|
||||
{
|
||||
// keys can still be used for bound actions
|
||||
if( down && ( key < 128 || key == K_MOUSE4 ) &&
|
||||
if (down && (key <= K_BACKSPACE || key == K_MOUSE4) &&
|
||||
( clc.demoplaying || cls.state == CA_CINEMATIC ) && Key_GetCatcher() == 0 ) {
|
||||
Cvar_Set( "nextdemo", "" );
|
||||
key = K_ESCAPE;
|
||||
@@ -1057,7 +1064,7 @@ void CL_KeyEvent (int key, qboolean down, unsigned time) {
|
||||
UI_KeyEvent( key, time );
|
||||
} else if( cls.loading & KEYCATCH_MESSAGE ) {
|
||||
Message_Key( key );
|
||||
} else if( cls.state != CA_DISCONNECTED ) {
|
||||
} else if( cls.state != CA_DISCONNECTED || menubound[key]) {
|
||||
// send the bound action
|
||||
kb = altkeys[ key ].binding;
|
||||
if( !kb || !altkeys[ key ].down ) {
|
||||
|
||||
+64
-32
@@ -32,6 +32,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#include "../sys/sys_loadlib.h"
|
||||
#endif
|
||||
|
||||
#include "gcdkeyc.h"
|
||||
|
||||
cvar_t *cl_nodelta;
|
||||
cvar_t *cl_debugMove;
|
||||
|
||||
@@ -97,6 +99,7 @@ cvar_t *wombat;
|
||||
cvar_t *cl_r_fullscreen;
|
||||
|
||||
cvar_t *cl_consoleKeys;
|
||||
cvar_t *name;
|
||||
|
||||
cvar_t* j_pitch;
|
||||
cvar_t* j_yaw;
|
||||
@@ -218,7 +221,7 @@ CL_ChangeReliableCommand
|
||||
======================
|
||||
*/
|
||||
void CL_ChangeReliableCommand( void ) {
|
||||
int r, index, l;
|
||||
size_t r, index, l;
|
||||
|
||||
r = clc.reliableSequence - (random() * 5);
|
||||
index = clc.reliableSequence & ( MAX_RELIABLE_COMMANDS - 1 );
|
||||
@@ -246,7 +249,7 @@ Dumps the current net message, prefixed by the length
|
||||
====================
|
||||
*/
|
||||
void CL_WriteDemoMessage ( msg_t *msg, int headerBytes ) {
|
||||
int len, swlen;
|
||||
size_t len, swlen;
|
||||
|
||||
// write the packet sequence
|
||||
len = clc.serverMessageSequence;
|
||||
@@ -325,7 +328,7 @@ void CL_Record_f( void ) {
|
||||
byte bufData[MAX_MSGLEN];
|
||||
msg_t buf;
|
||||
int i;
|
||||
int len;
|
||||
size_t len;
|
||||
entityState_t *ent;
|
||||
entityState_t nullstate;
|
||||
char *s;
|
||||
@@ -557,7 +560,7 @@ CL_ReadDemoMessage
|
||||
=================
|
||||
*/
|
||||
void CL_ReadDemoMessage( void ) {
|
||||
int r;
|
||||
size_t r;
|
||||
msg_t buf;
|
||||
byte bufData[ MAX_MSGLEN ];
|
||||
int s;
|
||||
@@ -1058,7 +1061,8 @@ in anyway.
|
||||
*/
|
||||
void CL_RequestAuthorization( void ) {
|
||||
char nums[64];
|
||||
int i, j, l;
|
||||
int i, j;
|
||||
size_t l;
|
||||
cvar_t *fs;
|
||||
|
||||
if ( !cls.authorizeServer.port ) {
|
||||
@@ -1421,6 +1425,10 @@ void CL_ResetPureClientAtServer( void ) {
|
||||
CL_AddReliableCommand( va("vdr") );
|
||||
}
|
||||
|
||||
qboolean CL_Allowed_Vid_Restart() {
|
||||
return cls.state == CA_DISCONNECTED || cls.state == CA_ACTIVE;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
CL_Vid_Restart_f
|
||||
@@ -1432,33 +1440,30 @@ because the renderer doesn't know what graphics to reload
|
||||
=================
|
||||
*/
|
||||
void CL_Vid_Restart_f( void ) {
|
||||
|
||||
// Settings may have changed so stop recording now
|
||||
if( CL_VideoRecording( ) ) {
|
||||
CL_CloseAVI( );
|
||||
if (!CL_Allowed_Vid_Restart()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(clc.demorecording)
|
||||
CL_StopRecord_f();
|
||||
Com_Printf("-------- CL_Vid_Restart_f --------\n");
|
||||
cls.vid_restart = qtrue;
|
||||
|
||||
// don't let them loop during the restart
|
||||
S_StopAllSounds( qtrue );
|
||||
S_StopAllSounds(qtrue);
|
||||
|
||||
SV_ClearSvsTimeFixups();
|
||||
|
||||
S_BeginRegistration();
|
||||
|
||||
// shutdown the renderer and clear the renderer interface
|
||||
CL_ShutdownRef();
|
||||
// shutdown the CGame
|
||||
CL_ShutdownCGame();
|
||||
// initialize the renderer interface
|
||||
CL_InitRef();
|
||||
// client is no longer pure untill new checksums are sent
|
||||
CL_ResetPureClientAtServer();
|
||||
// clear pak references
|
||||
FS_ClearPakReferences( FS_UI_REF | FS_CGAME_REF );
|
||||
// reinitialize the filesystem if the game directory or checksum has changed
|
||||
FS_ConditionalRestart( clc.checksumFeed );
|
||||
// initialize the ui library
|
||||
UI_ResolutionChange();
|
||||
|
||||
cls.rendererRegistered = qfalse;
|
||||
cls.uiStarted = qfalse;
|
||||
cls.cgameStarted = qfalse;
|
||||
|
||||
// unpause so the cgame definately gets a snapshot and renders a frame
|
||||
Com_Unpause();
|
||||
@@ -1469,6 +1474,8 @@ void CL_Vid_Restart_f( void ) {
|
||||
|
||||
S_Init();
|
||||
|
||||
cls.vid_restart = qfalse;
|
||||
Com_Printf("----- finished CL_Vid_Restart_f ----\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1804,7 +1811,11 @@ void CL_CheckForResend( void ) {
|
||||
// }
|
||||
NET_OutOfBandPrint(NS_CLIENT, clc.serverAddress, "getchallenge");
|
||||
break;
|
||||
|
||||
case CA_AUTHORIZING:
|
||||
// resend the cd key authorization
|
||||
gcd_compute_response(cl_cdkey, Cmd_Argv(1), cls.gcdResponse, CDResponseMethod_REAUTH);
|
||||
NET_OutOfBandPrint(NS_CLIENT, clc.serverAddress, "authorizeThis %s", cls.gcdResponse);
|
||||
break;
|
||||
case CA_CHALLENGING:
|
||||
/*
|
||||
wombat: sending conect here: an example connect string from MOHAA looks like this:
|
||||
@@ -1817,7 +1828,11 @@ wombat: sending conect here: an example connect string from MOHAA looks like thi
|
||||
Q_strncpyz( info, Cvar_InfoString( CVAR_USERINFO ), sizeof( info ) );
|
||||
Info_SetValueForKey( info, "protocol", va("%i", PROTOCOL_VERSION ) );
|
||||
Info_SetValueForKey( info, "qport", va("%i", port ) );
|
||||
Info_SetValueForKey( info, "challenge", va("%i", clc.challenge ) );
|
||||
Info_SetValueForKey(info, "challenge", va("%i", clc.challenge));
|
||||
Info_SetValueForKey(info, "version", TARGET_GAME_VERSION);
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
Info_SetValueForKey(info, "clientType", "Breakthrough");
|
||||
#endif
|
||||
|
||||
strcpy(data, "connect ");
|
||||
// TTimo adding " " around the userinfo string to avoid truncated userinfo on the server
|
||||
@@ -2076,7 +2091,7 @@ void CL_ConnectionlessPacket( netadr_t from, msg_t *msg ) {
|
||||
|
||||
// challenge from the server we are connecting to
|
||||
if ( !Q_stricmp(c, "challengeResponse") ) {
|
||||
if ( cls.state != CA_CONNECTING ) {
|
||||
if ( cls.state != CA_CONNECTING && cls.state != CA_AUTHORIZING ) {
|
||||
Com_Printf( "Unwanted challenge response received. Ignored.\n" );
|
||||
} else {
|
||||
// start sending challenge repsonse instead of challenge request packets
|
||||
@@ -2141,8 +2156,10 @@ void CL_ConnectionlessPacket( netadr_t from, msg_t *msg ) {
|
||||
}
|
||||
|
||||
// cd check
|
||||
if ( !Q_stricmp(c, "keyAuthorize") ) {
|
||||
// we don't use these now, so dump them on the floor
|
||||
if ( !Q_stricmp(c, "getKey") ) {
|
||||
cls.state = CA_AUTHORIZING;
|
||||
gcd_compute_response(cl_cdkey, Cmd_Argv(1), cls.gcdResponse, CDResponseMethod_NEWAUTH);
|
||||
NET_OutOfBandPrint(NS_CLIENT, from, "authorizeThis %s", cls.gcdResponse);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2274,7 +2291,7 @@ qboolean CL_CheckPaused(void)
|
||||
// if paused->modified is set, the cvar has only been changed in
|
||||
// this frame. Keep paused in this frame to ensure the server doesn't
|
||||
// lag behind.
|
||||
if(paused->integer || paused->modified)
|
||||
if(paused->integer)
|
||||
return qtrue;
|
||||
|
||||
return qfalse;
|
||||
@@ -2289,6 +2306,8 @@ CL_CheckUserinfo
|
||||
==================
|
||||
*/
|
||||
void CL_CheckUserinfo( void ) {
|
||||
char szSanitizedName[MAX_NAME_LENGTH];
|
||||
|
||||
// don't add reliable commands when not yet connected
|
||||
if(cls.state < CA_CHALLENGING)
|
||||
return;
|
||||
@@ -2300,6 +2319,10 @@ void CL_CheckUserinfo( void ) {
|
||||
// send a reliable userinfo update if needed
|
||||
if(cvar_modifiedFlags & CVAR_USERINFO)
|
||||
{
|
||||
if (Com_SanitizeName(name->string, szSanitizedName)) {
|
||||
Cvar_Set("name", szSanitizedName);
|
||||
}
|
||||
|
||||
cvar_modifiedFlags &= ~CVAR_USERINFO;
|
||||
CL_AddReliableCommand( va("userinfo \"%s\"", Cvar_InfoString( CVAR_USERINFO ) ) );
|
||||
}
|
||||
@@ -3101,7 +3124,7 @@ void CL_Init( void ) {
|
||||
cl_consoleKeys = Cvar_Get( "cl_consoleKeys", "~ ` 0x7e 0x60", CVAR_ARCHIVE );
|
||||
|
||||
// userinfo
|
||||
Cvar_Get ("name", "UnnamedSoldier", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
name = Cvar_Get ("name", "UnnamedSoldier", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
Cvar_Get ("rate", "5000", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
Cvar_Get ("snaps", "20", CVAR_USERINFO | CVAR_ARCHIVE );
|
||||
Cvar_Get ("password", "", CVAR_USERINFO);
|
||||
@@ -3294,7 +3317,7 @@ CL_ServerInfoPacket
|
||||
void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) {
|
||||
int i, type;
|
||||
char info[MAX_INFO_STRING];
|
||||
char* str;
|
||||
const char* str;
|
||||
char *infoString;
|
||||
int prot;
|
||||
|
||||
@@ -3490,10 +3513,10 @@ CL_ServerStatusResponse
|
||||
===================
|
||||
*/
|
||||
void CL_ServerStatusResponse( netadr_t from, msg_t *msg ) {
|
||||
char *s;
|
||||
const char *s;
|
||||
char info[MAX_INFO_STRING];
|
||||
int i, l, score, ping;
|
||||
int len;
|
||||
size_t len;
|
||||
serverStatus_t *serverStatus;
|
||||
|
||||
serverStatus = NULL;
|
||||
@@ -3583,7 +3606,7 @@ CL_LocalServers_f
|
||||
==================
|
||||
*/
|
||||
void CL_LocalServers_f( void ) {
|
||||
char *message;
|
||||
const char *message;
|
||||
int i, j;
|
||||
netadr_t to;
|
||||
|
||||
@@ -4252,7 +4275,8 @@ qboolean CL_CDKeyValidate( const char *key, const char *checksum ) {
|
||||
char ch;
|
||||
byte sum;
|
||||
char chs[3];
|
||||
int i, len;
|
||||
int i;
|
||||
size_t len;
|
||||
|
||||
len = strlen(key);
|
||||
if( len != CDKEY_LEN ) {
|
||||
@@ -4307,4 +4331,12 @@ qboolean CL_CDKeyValidate( const char *key, const char *checksum ) {
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
void TIKI_CG_Command_ProcessFile(char* filename, qboolean quiet, dtiki_t* curTiki)
|
||||
{
|
||||
if (cge) {
|
||||
cge->CG_Command_ProcessFile(filename, quiet, curTiki);
|
||||
return;
|
||||
}
|
||||
|
||||
Com_Printf("NO CGE \n");
|
||||
}
|
||||
+38
-17
@@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#include "client.h"
|
||||
#include "cl_ui.h"
|
||||
|
||||
char *svc_strings[256] = {
|
||||
const char *svc_strings[256] = {
|
||||
"svc_bad",
|
||||
|
||||
"svc_nop",
|
||||
@@ -41,7 +41,7 @@ char *svc_strings[256] = {
|
||||
|
||||
msg_t *cl_currentMSG;
|
||||
|
||||
void SHOWNET( msg_t *msg, char *s) {
|
||||
void SHOWNET( msg_t *msg, const char *s) {
|
||||
if ( cl_shownet->integer >= 2) {
|
||||
Com_Printf ("%3i:%s\n", msg->readcount-1, s);
|
||||
}
|
||||
@@ -75,8 +75,7 @@ void CL_DeltaEntity (msg_t *msg, clSnapshot_t *frame, int newnum, entityState_t
|
||||
if ( unchanged ) {
|
||||
*state = *old;
|
||||
} else {
|
||||
// FIXME: frametime
|
||||
MSG_ReadDeltaEntity( msg, old, state, newnum, 0.0);
|
||||
MSG_ReadDeltaEntity( msg, old, state, newnum, cls.serverFrameTime);
|
||||
}
|
||||
|
||||
if ( state->number == (MAX_GENTITIES-1) ) {
|
||||
@@ -117,7 +116,7 @@ void CL_ParsePacketEntities( msg_t *msg, clSnapshot_t *oldframe, clSnapshot_t *n
|
||||
|
||||
while ( 1 ) {
|
||||
// read the entity index number
|
||||
newnum = MSG_ReadBits( msg, GENTITYNUM_BITS );
|
||||
newnum = MSG_ReadEntityNum(msg);
|
||||
|
||||
if ( newnum == (MAX_GENTITIES-1) ) {
|
||||
break;
|
||||
@@ -274,11 +273,10 @@ void CL_ParseSnapshot( msg_t *msg ) {
|
||||
|
||||
// read playerinfo
|
||||
SHOWNET(msg, "playerstate");
|
||||
// FIXME: frametime
|
||||
if ( old ) {
|
||||
MSG_ReadDeltaPlayerstate( msg, &old->ps, &newSnap.ps, 0.0 );
|
||||
MSG_ReadDeltaPlayerstate( msg, &old->ps, &newSnap.ps, cls.serverFrameTime );
|
||||
} else {
|
||||
MSG_ReadDeltaPlayerstate( msg, NULL, &newSnap.ps, 0.0);
|
||||
MSG_ReadDeltaPlayerstate( msg, NULL, &newSnap.ps, cls.serverFrameTime);
|
||||
}
|
||||
|
||||
// read packet entities
|
||||
@@ -446,6 +444,28 @@ static void CL_ParseServerInfo(void)
|
||||
sizeof(clc.sv_dlURL));
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
char* MSG_ReadGameStateChar(msg_t* msg) {
|
||||
return MSG_ReadScrambledBigString(msg);
|
||||
}
|
||||
|
||||
float MSG_ReadServerFrameTime(msg_t* msg) {
|
||||
return MSG_ReadFloat(msg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
char* MSG_ReadGameStateChar(msg_t* msg) {
|
||||
return MSG_ReadString(msg);
|
||||
}
|
||||
|
||||
float MSG_ReadServerFrameTime(msg_t* msg) {
|
||||
return 1.f / atof(Info_ValueForKey(cl.gameState.stringData + cl.gameState.stringOffsets[CS_SYSTEMINFO], "sv_fps"));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
==================
|
||||
CL_ParseGamestate
|
||||
@@ -488,7 +508,7 @@ void CL_ParseGamestate( msg_t *msg ) {
|
||||
if ( i < 0 || i >= MAX_CONFIGSTRINGS ) {
|
||||
Com_Error( ERR_DROP, "configstring > MAX_CONFIGSTRINGS" );
|
||||
}
|
||||
s = MSG_ReadString( msg );
|
||||
s = MSG_ReadGameStateChar( msg );
|
||||
len = strlen( s );
|
||||
|
||||
if ( len + 1 + cl.gameState.dataCount > MAX_GAMESTATE_CHARS ) {
|
||||
@@ -499,7 +519,7 @@ void CL_ParseGamestate( msg_t *msg ) {
|
||||
Com_Memcpy( cl.gameState.stringData + cl.gameState.dataCount, s, len + 1 );
|
||||
cl.gameState.dataCount += len + 1;
|
||||
} else if ( cmd == svc_baseline ) {
|
||||
newnum = MSG_ReadBits( msg, GENTITYNUM_BITS );
|
||||
newnum = MSG_ReadEntityNum(msg);
|
||||
if ( newnum < 0 || newnum >= MAX_GENTITIES ) {
|
||||
Com_Error( ERR_DROP, "Baseline number out of range: %i", newnum );
|
||||
}
|
||||
@@ -516,6 +536,7 @@ void CL_ParseGamestate( msg_t *msg ) {
|
||||
clc.clientNum = MSG_ReadLong(msg);
|
||||
// read the checksum feed
|
||||
clc.checksumFeed = MSG_ReadLong( msg );
|
||||
cls.serverFrameTime = MSG_ReadServerFrameTime(msg);
|
||||
|
||||
// parse serverId and other cvars
|
||||
CL_SystemInfoChanged();
|
||||
@@ -527,6 +548,7 @@ void CL_ParseGamestate( msg_t *msg ) {
|
||||
// reinitialize the filesystem if the game directory has changed
|
||||
FS_ConditionalRestart( clc.checksumFeed );
|
||||
|
||||
cls.state = CA_LOADING;
|
||||
if (!com_sv_running->integer)
|
||||
{
|
||||
const char *info = cl.gameState.stringData + cl.gameState.stringOffsets[CS_SERVERINFO];
|
||||
@@ -726,7 +748,7 @@ void CL_ParseCommandString( msg_t *msg ) {
|
||||
int index;
|
||||
|
||||
seq = MSG_ReadLong( msg );
|
||||
s = MSG_ReadString( msg );
|
||||
s = MSG_ReadScrambledString( msg );
|
||||
|
||||
// see if we have already executed stored it off
|
||||
if ( clc.serverCommandSequence >= seq ) {
|
||||
@@ -763,10 +785,9 @@ void CL_ParseLocationprint( msg_t *msg ) {
|
||||
|
||||
x = MSG_ReadShort( msg );
|
||||
y = MSG_ReadShort( msg );
|
||||
string = MSG_ReadString(msg);
|
||||
string = MSG_ReadScrambledString(msg);
|
||||
|
||||
// FIXME
|
||||
//UI_UpdateLocationPrint( x, y, string, 1.0 );
|
||||
UI_UpdateLocationPrint( x, y, string, 1.0 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -777,10 +798,10 @@ CL_ParseCenterprint
|
||||
void CL_ParseCenterprint( msg_t *msg ) {
|
||||
char *string;
|
||||
|
||||
string = MSG_ReadString( msg );
|
||||
string = MSG_ReadScrambledString( msg );
|
||||
|
||||
// FIXME
|
||||
//UI_UpdateCenterPrintf( string, 1.0 );
|
||||
UI_UpdateCenterPrint( string, 1.0 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -792,7 +813,7 @@ void CL_ParseServerMessage( msg_t *msg ) {
|
||||
int cmd;
|
||||
//Com_Printf( "ParseServerMessage: %i\n", msg->cursize );
|
||||
if ( cl_shownet->integer == 1 ) {
|
||||
Com_Printf ("%i ",msg->cursize);
|
||||
Com_Printf ("%zu ",msg->cursize);
|
||||
} else if ( cl_shownet->integer >= 2 ) {
|
||||
Com_Printf ("------------------\n");
|
||||
}
|
||||
|
||||
+99
-78
@@ -29,9 +29,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
#include "cl_ui.h"
|
||||
|
||||
#if _MSC_VER
|
||||
#include <intrin.h>
|
||||
#endif
|
||||
#include <ctime>
|
||||
|
||||
typedef struct {
|
||||
float fadetime;
|
||||
@@ -877,7 +875,7 @@ Key_GetBindingBuf
|
||||
====================
|
||||
*/
|
||||
static void Key_GetBindingBuf( int keynum, char *buf, int buflen ) {
|
||||
char *value;
|
||||
const char *value;
|
||||
|
||||
value = Key_GetBinding( keynum );
|
||||
if ( value ) {
|
||||
@@ -1119,7 +1117,7 @@ getNewConsole
|
||||
====================
|
||||
*/
|
||||
UIFloatingConsole* getNewConsole() {
|
||||
static constexpr char CONSOLE_NAME[] = PRODUCT_NAME_FULL " - " PRODUCT_VERSION_FULL;
|
||||
static constexpr char CONSOLE_NAME[] = PRODUCT_NAME " console version " PRODUCT_VERSION;
|
||||
|
||||
UIFloatingConsole* console = new UIFloatingConsole;
|
||||
console->Create(NULL, getDefaultConsoleRectangle(), CONSOLE_NAME, UWindowColor, UHudColor);
|
||||
@@ -1256,6 +1254,10 @@ void UI_PrintConsole( const char *msg )
|
||||
bDeathMessage = qtrue;
|
||||
pColor = &ULightRed;
|
||||
break;
|
||||
case MESSAGE_CHAT_GREEN:
|
||||
bDeathMessage = qtrue;
|
||||
pColor = &UGreen;
|
||||
break;
|
||||
}
|
||||
|
||||
msg++;
|
||||
@@ -1881,7 +1883,7 @@ void UI_Update(void) {
|
||||
{
|
||||
UI_ForceMenuOff(true);
|
||||
UI_DeactiveFloatingWindows();
|
||||
UI_ForceMenu("");
|
||||
UI_ForceMenu(ui_sCurrentLoadingMenu);
|
||||
uWinMan.showCursor(false);
|
||||
}
|
||||
|
||||
@@ -3638,8 +3640,8 @@ void UI_WantsKeyboard() {
|
||||
}
|
||||
|
||||
struct widgettrans_s {
|
||||
char *src;
|
||||
char *dst;
|
||||
const char *src;
|
||||
const char *dst;
|
||||
};
|
||||
|
||||
static widgettrans_s s_widgettrans[ 2 ] =
|
||||
@@ -4485,8 +4487,14 @@ ScoreboardListItem::ScoreboardListItem()
|
||||
void ScoreboardListItem::DrawListItem( int iColumn, const UIRect2D& drawRect, bool bSelected, UIFont *pFont )
|
||||
{
|
||||
DrawBox( drawRect, backColor, 1.0 );
|
||||
pFont->setColor( textColor );
|
||||
pFont->Print( drawRect.pos.x + 1, drawRect.pos.y, Sys_LV_CL_ConvertString( getListItemString( iColumn ) ), iColumn, -1 );
|
||||
pFont->setColor(textColor);
|
||||
pFont->Print(
|
||||
drawRect.pos.x + 1,
|
||||
drawRect.pos.y,
|
||||
Sys_LV_CL_ConvertString(getListItemString(iColumn)),
|
||||
-1,
|
||||
qfalse
|
||||
);
|
||||
|
||||
if( bTitleItem )
|
||||
{
|
||||
@@ -4588,10 +4596,11 @@ void UI_SetScoreBoardItem( int iItemNumber,
|
||||
{
|
||||
cge->CG_GetScoreBoardPosition( &x, &y, &w, &h );
|
||||
|
||||
if( scoreboard_x == x
|
||||
|| scoreboard_y == y
|
||||
|| scoreboard_w == w
|
||||
|| scoreboard_h == h
|
||||
// Recreate the scoreboard if it has different rect
|
||||
if( scoreboard_x != x
|
||||
|| scoreboard_y != y
|
||||
|| scoreboard_w != w
|
||||
|| scoreboard_h != h
|
||||
|| scoreboard_header != cge->CG_GetScoreBoardDrawHeader() )
|
||||
{
|
||||
delete scoreboardlist;
|
||||
@@ -4606,11 +4615,12 @@ void UI_SetScoreBoardItem( int iItemNumber,
|
||||
|
||||
if( scoreboardlist )
|
||||
{
|
||||
if( iItemNumber + 1 > scoreboardlist->getNumItems() ) {
|
||||
if (iItemNumber + 1 > scoreboardlist->getNumItems()) {
|
||||
pItem = new ScoreboardListItem;
|
||||
scoreboardlist->AddItem( pItem );
|
||||
} else {
|
||||
pItem = ( ScoreboardListItem * )scoreboardlist->GetItem( iItemNumber );
|
||||
scoreboardlist->AddItem(pItem);
|
||||
}
|
||||
else {
|
||||
pItem = (ScoreboardListItem*)scoreboardlist->GetItem(iItemNumber + 1);
|
||||
}
|
||||
|
||||
if( pItem )
|
||||
@@ -4877,7 +4887,7 @@ static void SaveConsoleRectangle( void ) {
|
||||
if( !fakk_console->IsMinimized() ) {
|
||||
r = fakk_console->getFrame();
|
||||
|
||||
Cvar_Set( "ui_consoleposition", va( "%d %d %d %d", r.pos.x, r.pos.y, r.size.width, r.size.height ) );
|
||||
Cvar_Set( "ui_consoleposition", va( "%d %d %d %d", (int)r.pos.x, (int)r.pos.y, (int)r.size.width, (int)r.size.height ) );
|
||||
|
||||
if( wasMinimized ) {
|
||||
fakk_console->ProcessEvent( UIFloatingWindow::W_MinimizePressed );
|
||||
@@ -4940,7 +4950,7 @@ void UI_RemoveHud_f( void ) {
|
||||
|
||||
if( hud && hudList.ObjectInList( hud ) )
|
||||
{
|
||||
hud->ShowMenu( NULL );
|
||||
hud->ForceHide();
|
||||
hudList.RemoveObject( hud );
|
||||
}
|
||||
}
|
||||
@@ -5431,7 +5441,7 @@ UI_BeginLoadResource
|
||||
====================
|
||||
*/
|
||||
void UI_BeginLoadResource( void ) {
|
||||
uint64_t time = __rdtsc();
|
||||
clock_t time = clock();
|
||||
|
||||
startCountHigh = time >> 32;
|
||||
startCountLow = time;
|
||||
@@ -5484,7 +5494,7 @@ qboolean UI_IsResourceLoaded( const char *name ) {
|
||||
case 104:
|
||||
return TIKI_FindTikiAnim( name + 1 ) != NULL;
|
||||
case 103:
|
||||
return SkeletorCacheFindFilename( name + 1, NULL ) != NULL;
|
||||
return SkeletorCacheFindFilename( name + 1, NULL );
|
||||
case 107:
|
||||
return S_IsSoundRegistered( name + 1 );
|
||||
case 110:
|
||||
@@ -5565,23 +5575,23 @@ UI_LoadResource
|
||||
====================
|
||||
*/
|
||||
void UI_LoadResource( const char *name ) {
|
||||
if( cls.loading == SS_DEAD ) {
|
||||
if (cls.loading == SS_DEAD) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( cls.loading == 3 )
|
||||
if (cls.loading == SS_GAME)
|
||||
{
|
||||
UI_EndLoadResource();
|
||||
UI_EndLoadResource( name );
|
||||
UI_EndLoadResource(name);
|
||||
UI_BeginLoadResource();
|
||||
}
|
||||
else if( cls.loading == 2 )
|
||||
else if (cls.loading == SS_LOADING2)
|
||||
{
|
||||
UI_RegisterLoadResource( name );
|
||||
Cvar_SetValue( "loadingbar", currentLoadTime / totalLoadTime );
|
||||
UI_RegisterLoadResource(name);
|
||||
Cvar_SetValue("loadingbar", (float)currentLoadTime / (float)totalLoadTime);
|
||||
}
|
||||
|
||||
UI_TestUpdateScreen( 333u );
|
||||
UI_TestUpdateScreen(333u);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5746,7 +5756,65 @@ void UI_BeginLoad( const char *pszMapName ) {
|
||||
UI_ForceMenuOff( true );
|
||||
UI_DeactiveFloatingWindows();
|
||||
|
||||
if( !ui_pLoadingMenu )
|
||||
if (ui_pLoadingMenu)
|
||||
{
|
||||
if (!developer->integer && UI_ConsoleIsVisible()) {
|
||||
UI_CloseConsole();
|
||||
}
|
||||
|
||||
ui_pLoadingMenu->PassEventToWidget("continuebutton", new Event(EV_Widget_Disable));
|
||||
|
||||
loadName = "maps/";
|
||||
loadName += pszMapName;
|
||||
loadName += ".min";
|
||||
mapfile = loadName + ".bsp";
|
||||
|
||||
if (UI_ArchiveLoadMapinfo(mapfile)) {
|
||||
cls.loading = SS_LOADING2;
|
||||
}
|
||||
else {
|
||||
cls.loading = SS_GAME;
|
||||
}
|
||||
|
||||
if (cls.loading == SS_LOADING2)
|
||||
{
|
||||
ui_pLoadingMenu->PassEventToWidget("loadingflasher", new Event(EV_Widget_Disable));
|
||||
ui_pLoadingMenu->PassEventToWidget("loadingbar", new Event(EV_Widget_Enable));
|
||||
ui_pLoadingMenu->PassEventToWidget("loadingbar_border", new Event(EV_Widget_Enable));
|
||||
|
||||
currentLoadTime = 0;
|
||||
Cvar_SetValue("loadingbar", 0);
|
||||
|
||||
L_ProcessPendingEvents();
|
||||
|
||||
lastTime = Sys_Milliseconds();
|
||||
if (com_sv_running->integer) {
|
||||
SCR_UpdateScreen();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_pLoadingMenu->PassEventToWidget("loadingflasher", new Event(EV_Widget_Enable));
|
||||
ui_pLoadingMenu->PassEventToWidget("loadingbar", new Event(EV_Widget_Disable));
|
||||
ui_pLoadingMenu->PassEventToWidget("loadingbar_border", new Event(EV_Widget_Disable));
|
||||
|
||||
UI_BeginLoadResource();
|
||||
loadCountLow = 0;
|
||||
loadCountHigh = 0;
|
||||
loadHead = NULL;
|
||||
loadNumber = 0;
|
||||
|
||||
cls.loading = SS_LOADING;
|
||||
|
||||
L_ProcessPendingEvents();
|
||||
lastTime = Sys_Milliseconds();
|
||||
|
||||
if (com_sv_running->integer) {
|
||||
SCR_UpdateScreen();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cls.loading = SS_LOADING;
|
||||
|
||||
@@ -5755,56 +5823,9 @@ void UI_BeginLoad( const char *pszMapName ) {
|
||||
|
||||
lastTime = Sys_Milliseconds();
|
||||
|
||||
if( com_sv_running->integer ) {
|
||||
if (com_sv_running->integer) {
|
||||
SCR_UpdateScreen();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if( !developer->integer && UI_ConsoleIsVisible() ) {
|
||||
UI_CloseConsole();
|
||||
}
|
||||
|
||||
ui_pLoadingMenu->PassEventToWidget( "continuebutton", new Event( EV_Widget_Disable ) );
|
||||
|
||||
loadName = "maps/";
|
||||
loadName += pszMapName;
|
||||
loadName += ".min";
|
||||
mapfile = loadName + ".bsp";
|
||||
|
||||
if( UI_ArchiveLoadMapinfo( mapfile ) ) {
|
||||
cls.loading = SS_LOADING2;
|
||||
} else {
|
||||
cls.loading = SS_GAME;
|
||||
}
|
||||
|
||||
if( cls.loading != SS_LOADING2 )
|
||||
{
|
||||
ui_pLoadingMenu->PassEventToWidget( "loadingflasher", new Event( EV_Widget_Enable ) );
|
||||
ui_pLoadingMenu->PassEventToWidget( "loadingbar", new Event( EV_Widget_Disable ) );
|
||||
ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", new Event( EV_Widget_Disable ) );
|
||||
|
||||
UI_BeginLoadResource();
|
||||
loadCountLow = 0;
|
||||
loadCountHigh = 0;
|
||||
loadHead = NULL;
|
||||
loadNumber = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ui_pLoadingMenu->PassEventToWidget( "loadingflasher", new Event( EV_Widget_Disable ) );
|
||||
ui_pLoadingMenu->PassEventToWidget( "loadingbar", new Event( EV_Widget_Enable ) );
|
||||
ui_pLoadingMenu->PassEventToWidget( "loadingbar_border", new Event( EV_Widget_Enable ) );
|
||||
|
||||
currentLoadTime = 0;
|
||||
Cvar_SetValue( "loadingbar", 0 );
|
||||
}
|
||||
|
||||
L_ProcessPendingEvents();
|
||||
lastTime = Sys_Milliseconds();
|
||||
|
||||
if( com_sv_running->integer ) {
|
||||
SCR_UpdateScreen();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -189,11 +189,13 @@ void UIDMBox::RemoveTopItem( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m_numitems - 1; i++) {
|
||||
m_items[i] = m_items[i + 1];
|
||||
}
|
||||
if (m_numitems > 0) {
|
||||
for (i = 0; i < m_numitems - 1; i++) {
|
||||
m_items[i] = m_items[i + 1];
|
||||
}
|
||||
|
||||
m_numitems--;
|
||||
m_numitems--;
|
||||
}
|
||||
}
|
||||
|
||||
str UIDMBox::CalculateBreaks( UIFont *font, str text, float max_width )
|
||||
@@ -291,19 +293,27 @@ void UIDMBox::Print( const char *text )
|
||||
|
||||
m_items[m_numitems].flags = 0;
|
||||
|
||||
if (*text == 2)
|
||||
if (*text == MESSAGE_CHAT_WHITE)
|
||||
{
|
||||
m_items[m_numitems].color = UGrey;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= GMBOX_ITEM_FLAG_BOLD;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_BOLD;
|
||||
|
||||
text1 = text + 1;
|
||||
}
|
||||
else if (*text == 4)
|
||||
else if (*text == MESSAGE_CHAT_RED)
|
||||
{
|
||||
m_items[m_numitems].color = ULightRed;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= GMBOX_ITEM_FLAG_BOLD;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_BOLD;
|
||||
|
||||
text1 = text + 1;
|
||||
}
|
||||
else if (*text == MESSAGE_CHAT_GREEN)
|
||||
{
|
||||
m_items[m_numitems].color = UGreen;
|
||||
m_items[m_numitems].font = m_fontbold;
|
||||
m_items[m_numitems].flags |= DMBOX_ITEM_FLAG_BOLD;
|
||||
|
||||
text1 = text + 1;
|
||||
}
|
||||
|
||||
@@ -186,11 +186,13 @@ void UIGMBox::RemoveTopItem( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m_numitems - 1; i++) {
|
||||
m_items[i] = m_items[i + 1];
|
||||
}
|
||||
if (m_numitems > 0) {
|
||||
for (i = 0; i < m_numitems - 1; i++) {
|
||||
m_items[i] = m_items[i + 1];
|
||||
}
|
||||
|
||||
m_numitems--;
|
||||
m_numitems--;
|
||||
}
|
||||
}
|
||||
|
||||
str UIGMBox::CalculateBreaks( UIFont *font, str text, float max_width )
|
||||
|
||||
@@ -29,8 +29,8 @@ public:
|
||||
|
||||
SoundPickerClass();
|
||||
|
||||
void FileSelected( str ¤tDirectory, str &partialName, str &fullname );
|
||||
void FileChosen( str ¤tDirectory, str &partialName, str &fullname );
|
||||
void FileSelected( str ¤tDirectory, str &partialName, str &fullname ) override;
|
||||
void FileChosen( str ¤tDirectory, str &partialName, str &fullname ) override;
|
||||
};
|
||||
|
||||
#endif /* __CL_UISOUNDPICKER_H__ */
|
||||
@@ -519,7 +519,8 @@ void UIFakkLabel::DrawStatbar( float frac )
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -574,6 +575,8 @@ void UIFakkLabel::DrawStatbar( float frac )
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -603,6 +606,8 @@ void UIFakkLabel::DrawStatbar( float frac )
|
||||
1.0
|
||||
);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
void UpdateLocationPrint( int x, int y, const char *s, float alpha );
|
||||
qboolean LetterboxActive( void );
|
||||
void InitSubtitle( void );
|
||||
void FrameInitialized( void );
|
||||
void FrameInitialized( void ) override;
|
||||
virtual void Pressed( Event *ev );
|
||||
};
|
||||
|
||||
|
||||
@@ -126,10 +126,6 @@ typedef struct {
|
||||
|
||||
int joystickAxis[MAX_JOYSTICK_AXIS]; // set by joystick events
|
||||
|
||||
// cgame communicates a few values to the client system
|
||||
int cgameUserCmdValue; // current weapon to add to usercmd_t
|
||||
float cgameSensitivity;
|
||||
|
||||
// cmds[cmdNumber] is the predicted command, [cmdNumber-1] is the last
|
||||
// properly generated command
|
||||
usercmd_t cmds[CMD_BACKUP]; // each mesage will send several old cmds
|
||||
@@ -145,9 +141,6 @@ typedef struct {
|
||||
// and teleport direction changes
|
||||
vec3_t viewangles;
|
||||
|
||||
vec3_t eyeAngles;
|
||||
vec3_t eyeOrigin;
|
||||
|
||||
int serverId; // included in each client message so the server
|
||||
// can tell if it is for a prior map_restart
|
||||
// big stuff at end of structure so most offsets are 15 bits or less
|
||||
@@ -310,6 +303,7 @@ typedef struct {
|
||||
|
||||
int framecount;
|
||||
int frametime; // msec since last frame
|
||||
float serverFrameTime;
|
||||
|
||||
int realtime; // ignores pause
|
||||
int realFrametime; // ignoring pause, so console always works
|
||||
@@ -352,6 +346,11 @@ typedef struct {
|
||||
hdelement_t HudDrawElements[ MAX_HUDDRAW_ELEMENTS ];
|
||||
clientAnim_t anim;
|
||||
stopWatch_t stopwatch;
|
||||
void* savedCgameState;
|
||||
int savedCgameStateSize;
|
||||
char gcdResponse[73];
|
||||
int unknown3_0;
|
||||
int currentRate;
|
||||
qhandle_t charSetShader;
|
||||
qhandle_t whiteShader;
|
||||
qhandle_t consoleShader;
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ extern int chat_playerNum;
|
||||
int Key_StringToKeynum( const char *str );
|
||||
void Key_WriteBindings( fileHandle_t f );
|
||||
void Key_SetBinding( int keynum, const char *binding );
|
||||
char *Key_GetBinding( int keynum );
|
||||
const char *Key_GetBinding( int keynum );
|
||||
qboolean Key_IsDown( int keynum );
|
||||
qboolean Key_GetOverstrikeMode( void );
|
||||
void Key_SetOverstrikeMode( qboolean state );
|
||||
|
||||
+12
-12
@@ -238,11 +238,11 @@ void BarrelObject::BarrelThink
|
||||
|
||||
if( m_iBarrelType == BARREL_OIL )
|
||||
{
|
||||
gi.MSG_StartCGM( 15 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_1);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 19 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_5);
|
||||
}
|
||||
|
||||
m_fFluidAmount -= 1.0f;
|
||||
@@ -254,11 +254,11 @@ void BarrelObject::BarrelThink
|
||||
|
||||
if( m_iBarrelType == BARREL_OIL )
|
||||
{
|
||||
gi.MSG_StartCGM( 16 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_2);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 20 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_6);
|
||||
}
|
||||
|
||||
m_fFluidAmount -= 0.75f;
|
||||
@@ -271,11 +271,11 @@ void BarrelObject::BarrelThink
|
||||
|
||||
if( m_iBarrelType == BARREL_OIL )
|
||||
{
|
||||
gi.MSG_StartCGM( 17 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_3);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 21 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_7);
|
||||
}
|
||||
|
||||
m_fFluidAmount -= 0.5f;
|
||||
@@ -294,11 +294,11 @@ void BarrelObject::BarrelThink
|
||||
|
||||
if( m_iBarrelType == BARREL_OIL )
|
||||
{
|
||||
gi.MSG_StartCGM( 17 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_3);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 21 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_7);
|
||||
}
|
||||
|
||||
gi.MSG_WriteCoord( m_vLeaks[ i ][ 0 ] );
|
||||
@@ -506,18 +506,18 @@ void BarrelObject::BarrelDamaged
|
||||
gi.SetBroadcastVisible( vHitPos, vHitPos );
|
||||
|
||||
if( m_iBarrelType == BARREL_OIL )
|
||||
gi.MSG_StartCGM( 18 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_4);
|
||||
else
|
||||
gi.MSG_StartCGM( 22 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_8);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.SetBroadcastVisible( vHitPos, vHitPos );
|
||||
|
||||
if( m_iBarrelType == BARREL_OIL )
|
||||
gi.MSG_StartCGM( 17 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_3);
|
||||
else
|
||||
gi.MSG_StartCGM( 21 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_EFFECT_7);
|
||||
}
|
||||
|
||||
gi.MSG_WriteCoord( vHitPos[ 0 ] );
|
||||
|
||||
@@ -1423,7 +1423,7 @@ void PmoveSingle( pmove_t *pmove )
|
||||
if( pm->ps->pm_type == PM_CLIMBWALL )
|
||||
{
|
||||
pm->ps->fLeanAngle = 0.0f;
|
||||
pm->cmd.buttons &= ~( BUTTON_LEANLEFT | BUTTON_LEANRIGHT );
|
||||
pm->cmd.buttons &= ~( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT );
|
||||
}
|
||||
|
||||
// clear all pmove local vars
|
||||
@@ -1447,10 +1447,10 @@ void PmoveSingle( pmove_t *pmove )
|
||||
|
||||
pml.frametime = pml.msec * 0.001;
|
||||
|
||||
if( ( pm->cmd.buttons & ( BUTTON_LEANLEFT | BUTTON_LEANRIGHT ) &&
|
||||
( pm->cmd.buttons & ( BUTTON_LEANLEFT | BUTTON_LEANRIGHT ) ) != ( BUTTON_LEANLEFT | BUTTON_LEANRIGHT ) ) )
|
||||
if( ( pm->cmd.buttons & ( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT ) &&
|
||||
( pm->cmd.buttons & ( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT ) ) != ( BUTTON_LEAN_LEFT | BUTTON_LEAN_RIGHT ) ) )
|
||||
{
|
||||
if( pm->cmd.buttons & BUTTON_LEANLEFT )
|
||||
if( pm->cmd.buttons & BUTTON_LEAN_LEFT )
|
||||
{
|
||||
if( pm->ps->fLeanAngle <= -40.0f )
|
||||
{
|
||||
|
||||
+237
-6
@@ -66,6 +66,34 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#define CS_MOTD 4 // g_motd string for server message of the day
|
||||
#define CS_WARMUP 5 // server time when the match will be restarted
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
#define CS_MUSIC 6 // MUSIC_NewSoundtrack(cs)
|
||||
#define CS_FOGINFO 7 // cg.farplane_cull cg.farplane_distance cg.farplane_color[3]
|
||||
#define CS_SKYINFO 8 // cg.sky_alpha cg.sky_portal
|
||||
|
||||
#define CS_GAME_VERSION 9
|
||||
#define CS_LEVEL_START_TIME 10 // so the timer only shows the current level cgs.levelStartTime
|
||||
|
||||
#define CS_CURRENT_OBJECTIVE 11
|
||||
|
||||
#define CS_RAIN_DENSITY 12 // cg.rain
|
||||
#define CS_RAIN_SPEED 13
|
||||
#define CS_RAIN_SPEEDVARY 14
|
||||
#define CS_RAIN_SLANT 15
|
||||
#define CS_RAIN_LENGTH 16
|
||||
#define CS_RAIN_MINDIST 17
|
||||
#define CS_RAIN_WIDTH 18
|
||||
#define CS_RAIN_SHADER 19
|
||||
#define CS_RAIN_NUMSHADERS 20
|
||||
|
||||
#define CS_VOTE_TIME 21
|
||||
#define CS_VOTE_STRING 22
|
||||
#define CS_VOTE_YES 23
|
||||
#define CS_VOTE_NO 24
|
||||
#define CS_VOTE_UNDECIDED 25
|
||||
|
||||
#else
|
||||
|
||||
#define CS_MUSIC 8 // MUSIC_NewSoundtrack(cs)
|
||||
#define CS_FOGINFO 9 // cg.farplane_cull cg.farplane_distance cg.farplane_color[3]
|
||||
#define CS_SKYINFO 10 // cg.sky_alpha cg.sky_portal
|
||||
@@ -85,6 +113,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#define CS_RAIN_SHADER 21
|
||||
#define CS_RAIN_NUMSHADERS 22
|
||||
|
||||
#endif
|
||||
|
||||
#define CS_MATCHEND 26 // cgs.matchEndTime
|
||||
|
||||
#define CS_MODELS 32
|
||||
@@ -98,11 +128,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#define CS_PLAYERS (CS_LIGHTSTYLES+MAX_LIGHTSTYLES) // 1684
|
||||
|
||||
#define CS_WEAPONS (CS_PLAYERS+MAX_CLIENTS) // su44 was here
|
||||
#define CS_TEAMS 1876
|
||||
#define CS_GENERAL_STRINGS 1877
|
||||
#define CS_SPECTATORS 1878
|
||||
#define CS_ALLIES 1879
|
||||
#define CS_AXIS 1880
|
||||
#define CS_TEAMS 1892
|
||||
#define CS_GENERAL_STRINGS 1893
|
||||
#define CS_SPECTATORS 1894
|
||||
#define CS_ALLIES 1895
|
||||
#define CS_AXIS 1896
|
||||
#define CS_SOUNDTRACK 1881
|
||||
|
||||
#define CS_TEAMINFO 1
|
||||
@@ -122,6 +152,10 @@ typedef enum {
|
||||
GT_TEAM, // team deathmatch
|
||||
GT_TEAM_ROUNDS,
|
||||
GT_OBJECTIVE,
|
||||
// Team Assault game mode
|
||||
GT_TOW,
|
||||
// Team Tactics game mode
|
||||
GT_LIBERATION,
|
||||
GT_MAX_GAME_TYPE
|
||||
} gametype_t;
|
||||
|
||||
@@ -231,6 +265,28 @@ typedef enum {
|
||||
#define PMF_LEVELEXIT (1<<20) // use camera view instead of ps view
|
||||
#endif
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
// moh pm_flags
|
||||
#define PMF_DUCKED (1<<0)
|
||||
#define PMF_VIEW_PRONE (1<<1)
|
||||
#define PMF_SPECTATING (1<<2)
|
||||
#define PMF_RESPAWNED (1<<3)
|
||||
#define PMF_NO_PREDICTION (1<<4)
|
||||
#define PMF_FROZEN (1<<5)
|
||||
#define PMF_INTERMISSION (1<<6)
|
||||
#define PMF_SPECTATE_FOLLOW (1<<7)
|
||||
#define PMF_CAMERA_VIEW (1<<7) // use camera view instead of ps view
|
||||
#define PMF_NO_MOVE (1<<8)
|
||||
#define PMF_VIEW_DUCK_RUN (1<<9)
|
||||
#define PMF_VIEW_JUMP_START (1<<10)
|
||||
#define PMF_LEVELEXIT (1<<11)
|
||||
#define PMF_NO_GRAVITY (1<<12)
|
||||
#define PMF_NO_HUD (1<<13)
|
||||
#define PMF_UNKNOWN (1<<14)
|
||||
|
||||
#else
|
||||
|
||||
// moh pm_flags
|
||||
#define PMF_DUCKED (1<<0)
|
||||
#define PMF_VIEW_PRONE (1<<1)
|
||||
@@ -249,6 +305,8 @@ typedef enum {
|
||||
#define PMF_NO_HUD (1<<15)
|
||||
#define PMF_UNKNOWN (1<<16)
|
||||
|
||||
#endif
|
||||
|
||||
// moveposflags
|
||||
#define MPF_POSITION_STANDING (1<<0)
|
||||
#define MPF_POSITION_CROUCHING (1<<1)
|
||||
@@ -395,6 +453,12 @@ typedef enum {
|
||||
#define EF_AXIS 0x00000100 // su44: this player is in axis team
|
||||
#define EF_ANY_TEAM (EF_ALLIES | EF_AXIS)
|
||||
#define EF_DEAD 0x00000200 // don't draw a foe marker over players with EF_DEAD
|
||||
//
|
||||
// Team assault flags
|
||||
//
|
||||
#define EF_PLAYER_IN_MENU 0x00000400 // Player is in menu
|
||||
#define EF_PLAYER_TALKING 0x00000800 // Player is talking
|
||||
#define EF_PLAYER_ARTILLERY 0x00002000 // Player is using an artillery
|
||||
|
||||
|
||||
// su44: q3 remnants
|
||||
@@ -528,6 +592,15 @@ extern const char *means_of_death_strings[];
|
||||
#define DF_NO_DROP_WEAPONS (1<<16)
|
||||
#define DF_NO_FOOTSTEPS (1<<17)
|
||||
|
||||
#define DF_WEAPON_LANDMINE_ALWAYS (1<<21)
|
||||
#define DF_WEAPON_NO_RIFLE (1<<22)
|
||||
#define DF_WEAPON_NO_SNIPER (1<<23)
|
||||
#define DF_WEAPON_NO_SMG (1<<24)
|
||||
#define DF_WEAPON_NO_MG (1<<25)
|
||||
#define DF_WEAPON_NO_ROCKET (1<<26)
|
||||
#define DF_WEAPON_NO_SHOTGUN (1<<27)
|
||||
#define DF_WEAPON_NO_LANDMINE (1<<28)
|
||||
|
||||
#define DM_FLAG( flag ) ( g_gametype->integer && ( ( int )dmflags->integer & ( flag ) ) )
|
||||
|
||||
// content masks
|
||||
@@ -612,7 +685,165 @@ typedef enum {
|
||||
void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result );
|
||||
|
||||
void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap );
|
||||
void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap );
|
||||
void BG_PlayerStateToEntityStateExtraPolate(playerState_t* ps, entityState_t* s, int time, qboolean snap);
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
enum vmAnim_e {
|
||||
VM_ANIM_DISABLED,
|
||||
VM_ANIM_IDLE,
|
||||
VM_ANIM_CHARGE,
|
||||
VM_ANIM_FIRE,
|
||||
VM_ANIM_FIRE_SECONDARY,
|
||||
VM_ANIM_RECHAMBER,
|
||||
VM_ANIM_RELOAD,
|
||||
VM_ANIM_RELOAD_SINGLE,
|
||||
VM_ANIM_RELOAD_END,
|
||||
VM_ANIM_PULLOUT,
|
||||
VM_ANIM_PUTAWAY,
|
||||
VM_ANIM_LADDERSTEP,
|
||||
VM_ANIM_IDLE_0,
|
||||
VM_ANIM_IDLE_1,
|
||||
VM_ANIM_IDLE_2,
|
||||
};
|
||||
|
||||
enum cg_message_e {
|
||||
CGM_NONE,
|
||||
CGM_BULLET_1,
|
||||
CGM_BULLET_2,
|
||||
CGM_BULLET_3,
|
||||
CGM_BULLET_4,
|
||||
CGM_BULLET_5,
|
||||
CGM_BULLET_6,
|
||||
CGM_BULLET_7,
|
||||
CGM_BULLET_8,
|
||||
CGM_BULLET_9,
|
||||
CGM_BULLET_10,
|
||||
CGM_BULLET_11,
|
||||
CGM_MELEE_IMPACT,
|
||||
CGM_EXPLOSION_EFFECT_1,
|
||||
CGM_EXPLOSION_EFFECT_2,
|
||||
CGM_EXPLOSION_EFFECT_3,
|
||||
CGM_EXPLOSION_EFFECT_4,
|
||||
CGM_PADDING_1,
|
||||
CGM_MAKE_EFFECT_1,
|
||||
CGM_MAKE_EFFECT_2,
|
||||
CGM_MAKE_EFFECT_3,
|
||||
CGM_MAKE_EFFECT_4,
|
||||
CGM_MAKE_EFFECT_5,
|
||||
CGM_MAKE_EFFECT_6,
|
||||
CGM_MAKE_EFFECT_7,
|
||||
CGM_MAKE_EFFECT_8,
|
||||
CGM_MAKE_CRATE_DEBRIS,
|
||||
CGM_MAKE_WINDOW_DEBRIS,
|
||||
CGM_BULLET_NO_BARREL_1,
|
||||
CGM_BULLET_NO_BARREL_2,
|
||||
CGM_HUDDRAW_SHADER,
|
||||
CGM_HUDDRAW_ALIGN,
|
||||
CGM_HUDDRAW_RECT,
|
||||
CGM_HUDDRAW_VIRTUALSIZE,
|
||||
CGM_HUDDRAW_COLOR,
|
||||
CGM_HUDDRAW_ALPHA,
|
||||
CGM_HUDDRAW_STRING,
|
||||
CGM_HUDDRAW_FONT,
|
||||
CGM_NOTIFY_KILL,
|
||||
CGM_NOTIFY_HIT,
|
||||
CGM_VOICE_CHAT,
|
||||
CGM_UNKNOWN_1,
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
enum vmAnim_e {
|
||||
VM_ANIM_IDLE,
|
||||
VM_ANIM_CHARGE,
|
||||
VM_ANIM_FIRE,
|
||||
VM_ANIM_FIRE_SECONDARY,
|
||||
VM_ANIM_RECHAMBER,
|
||||
VM_ANIM_RELOAD,
|
||||
VM_ANIM_RELOAD_SINGLE,
|
||||
VM_ANIM_RELOAD_END,
|
||||
VM_ANIM_PULLOUT,
|
||||
VM_ANIM_PUTAWAY,
|
||||
VM_ANIM_LADDERSTEP,
|
||||
VM_ANIM_IDLE_0,
|
||||
VM_ANIM_IDLE_1,
|
||||
VM_ANIM_IDLE_2,
|
||||
VM_ANIM_DISABLED,
|
||||
};
|
||||
|
||||
enum cg_message_e {
|
||||
CGM_NONE,
|
||||
CGM_BULLET_1,
|
||||
CGM_BULLET_2,
|
||||
CGM_BULLET_3,
|
||||
CGM_BULLET_4,
|
||||
CGM_BULLET_5,
|
||||
CGM_BULLET_6,
|
||||
CGM_BULLET_7,
|
||||
CGM_BULLET_8,
|
||||
CGM_BULLET_9,
|
||||
CGM_BULLET_10,
|
||||
CGM_MELEE_IMPACT,
|
||||
CGM_EXPLOSION_EFFECT_1,
|
||||
CGM_EXPLOSION_EFFECT_2,
|
||||
CGM_PADDING_1,
|
||||
CGM_MAKE_EFFECT_1,
|
||||
CGM_MAKE_EFFECT_2,
|
||||
CGM_MAKE_EFFECT_3,
|
||||
CGM_MAKE_EFFECT_4,
|
||||
CGM_MAKE_EFFECT_5,
|
||||
CGM_MAKE_EFFECT_6,
|
||||
CGM_MAKE_EFFECT_7,
|
||||
CGM_MAKE_EFFECT_8,
|
||||
CGM_MAKE_CRATE_DEBRIS,
|
||||
CGM_MAKE_WINDOW_DEBRIS,
|
||||
CGM_BULLET_NO_BARREL_1,
|
||||
CGM_BULLET_NO_BARREL_2,
|
||||
CGM_HUDDRAW_SHADER,
|
||||
CGM_HUDDRAW_ALIGN,
|
||||
CGM_HUDDRAW_RECT,
|
||||
CGM_HUDDRAW_VIRTUALSIZE,
|
||||
CGM_HUDDRAW_COLOR,
|
||||
CGM_HUDDRAW_ALPHA,
|
||||
CGM_HUDDRAW_STRING,
|
||||
CGM_HUDDRAW_FONT,
|
||||
CGM_NOTIFY_KILL,
|
||||
CGM_NOTIFY_HIT,
|
||||
CGM_VOICE_CHAT,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
#define CGM_HUDDRAW_SHADER 27
|
||||
#define CGM_HUDDRAW_ALIGN 28
|
||||
#define CGM_HUDDRAW_RECT 29
|
||||
#define CGM_HUDDRAW_VIRTUALSIZE 30
|
||||
#define CGM_HUDDRAW_COLOR 31
|
||||
#define CGM_HUDDRAW_ALPHA 32
|
||||
#define CGM_HUDDRAW_STRING 33
|
||||
#define CGM_HUDDRAW_FONT 34
|
||||
#define CGM_HUDDRAW_TIMER 38
|
||||
#define CGM_HUDDRAW_3D 39
|
||||
#define CGM_HUDDRAW_BREAK3D 40
|
||||
#define CGM_HUDDRAW_FADE 41
|
||||
#define CGM_HUDDRAW_MOVE 42
|
||||
#define CGM_HUDDRAW_SCALE 43
|
||||
#define CGM_VIEWMODELANIM 44
|
||||
#define CGM_VIEWMODELPREFIX 45
|
||||
#define CGM_MODHEIGHTFLOAT 46
|
||||
#define CGM_SETVMASPEED 47
|
||||
#define CGM_HINTSTRING 48
|
||||
#define CGM_PLAYLOCALSOUND 49
|
||||
#define CGM_SETLOCALSOUNDRATE 50
|
||||
#define CGM_STOPLOCALSOUND 51
|
||||
#define CGM_HUDDRAW_RECTX 52
|
||||
#define CGM_HUDDRAW_RECTY 53
|
||||
#define CGM_HUDDRAW_RECTWH 54
|
||||
#define CGM_REPLICATION 55
|
||||
#define CGM_HUDDRAW_DELETE 56
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -422,7 +422,7 @@ void State::ParseAndProcessCommand
|
||||
{
|
||||
int argc;
|
||||
const char *argv[ MAX_COMMANDS ];
|
||||
char args[ MAX_COMMANDS ][ MAXTOKEN ];
|
||||
char args[ MAX_COMMANDS ][ SCRIPT_MAXTOKEN ];
|
||||
Script script;
|
||||
Event *event;
|
||||
|
||||
|
||||
@@ -465,7 +465,7 @@ void CrateObject::CrateKilled
|
||||
|
||||
// Tell clients around that a crate is destroyed
|
||||
gi.SetBroadcastVisible( origin, origin );
|
||||
gi.MSG_StartCGM( 23 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_CRATE_DEBRIS);
|
||||
gi.MSG_WriteCoord( vCenter[ 0 ] );
|
||||
gi.MSG_WriteCoord( vCenter[ 1 ] );
|
||||
gi.MSG_WriteCoord( vCenter[ 2 ] );
|
||||
|
||||
@@ -6912,12 +6912,15 @@ void Entity::ProcessHint(gentity_t* client, bool bShow)
|
||||
{
|
||||
if (sv_reborn->integer)
|
||||
{
|
||||
// FIXME: delete
|
||||
/*
|
||||
gi.MSG_SetClient(client - g_entities);
|
||||
|
||||
// Send the hint string once
|
||||
gi.MSG_StartCGM(CGM_HINTSTRING);
|
||||
gi.MSG_WriteString(m_HintString);
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -241,7 +241,7 @@ typedef struct gameImport_s
|
||||
void ( *AddCommand )( const char *cmdName, xcommand_t cmdFunction );
|
||||
int ( *FS_ReadFile )( const char *qpath, void **buffer, qboolean quiet );
|
||||
void ( *FS_FreeFile )( void *buffer );
|
||||
size_t( *FS_WriteFile )( const char *qpath, const void *buffer, size_t size );
|
||||
int ( *FS_WriteFile )( const char *qpath, const void *buffer, int size );
|
||||
fileHandle_t ( *FS_FOpenFileWrite )( const char *fileName );
|
||||
fileHandle_t ( *FS_FOpenFileAppend )( const char *fileName );
|
||||
const char *( *FS_PrepFileWrite )( const char *fileName );
|
||||
|
||||
+50
-64
@@ -503,6 +503,7 @@ Hud::~Hud()
|
||||
SetNon3D();
|
||||
}
|
||||
|
||||
/*
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
@@ -510,6 +511,7 @@ Hud::~Hud()
|
||||
WriteNumber();
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
|
||||
hudElements.RemoveObject( this );
|
||||
}
|
||||
@@ -952,7 +954,9 @@ void Hud::FadeOverTime( float time )
|
||||
|
||||
fade_alpha_start = alpha;
|
||||
fade_alpha_target = alpha;
|
||||
|
||||
|
||||
// FIXME: delete
|
||||
/*
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
@@ -961,6 +965,7 @@ void Hud::FadeOverTime( float time )
|
||||
gi.MSG_WriteFloat( time );
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void Hud::MoveOverTime( float time )
|
||||
@@ -982,6 +987,7 @@ void Hud::MoveOverTime( float time )
|
||||
fade_move_x_target = x;
|
||||
fade_move_y_target = y;
|
||||
|
||||
/*
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
@@ -990,6 +996,7 @@ void Hud::MoveOverTime( float time )
|
||||
gi.MSG_WriteFloat( time );
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void Hud::Refresh( int clientNumber )
|
||||
@@ -1092,6 +1099,7 @@ void Hud::Refresh( int clientNumber )
|
||||
{
|
||||
SetBroadcast();
|
||||
|
||||
/*
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_3D );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteCoord( org[ 0 ] );
|
||||
@@ -1103,16 +1111,19 @@ void Hud::Refresh( int clientNumber )
|
||||
gi.MSG_WriteBits( !!always_show, 1 );
|
||||
gi.MSG_WriteBits( !!depth, 1 );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
if( fade_alpha )
|
||||
{
|
||||
SetBroadcast();
|
||||
|
||||
/*
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_FADE );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteFloat( fade_alpha_current );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
|
||||
SetBroadcast();
|
||||
|
||||
@@ -1126,6 +1137,7 @@ void Hud::Refresh( int clientNumber )
|
||||
{
|
||||
SetBroadcast();
|
||||
|
||||
/*
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_MOVE );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteFloat( fade_move_current );
|
||||
@@ -1138,10 +1150,12 @@ void Hud::Refresh( int clientNumber )
|
||||
gi.MSG_WriteShort( ( short )fade_move_x_target );
|
||||
gi.MSG_WriteShort( ( short )fade_move_y_target );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
if( fade_timer_flags & TIMER_ACTIVE )
|
||||
{
|
||||
/*
|
||||
SetBroadcast();
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_TIMER );
|
||||
@@ -1156,6 +1170,7 @@ void Hud::Refresh( int clientNumber )
|
||||
}
|
||||
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1182,7 +1197,8 @@ void Hud::ScaleOverTime( float time, short w, short h )
|
||||
fade_scale_w_target = w;
|
||||
fade_scale_h_target = h;
|
||||
|
||||
#ifdef GAME_DLL
|
||||
// FIXME: delete
|
||||
/*
|
||||
width = w;
|
||||
height = h;
|
||||
|
||||
@@ -1194,7 +1210,7 @@ void Hud::ScaleOverTime( float time, short w, short h )
|
||||
gi.MSG_WriteShort( w );
|
||||
gi.MSG_WriteShort( h );
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
#ifdef GAME_DLL
|
||||
@@ -1235,6 +1251,7 @@ void Hud::Set3D( Vector vector_or_offset, qboolean alwaysOnScreen, qboolean hasD
|
||||
|
||||
isDimensional = true;
|
||||
|
||||
/*
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
@@ -1250,19 +1267,20 @@ void Hud::Set3D( Vector vector_or_offset, qboolean alwaysOnScreen, qboolean hasD
|
||||
gi.MSG_WriteBits( !!hasDepth, 1 );
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void Hud::SetNon3D()
|
||||
{
|
||||
isDimensional = false;
|
||||
|
||||
#ifdef GAME_DLL
|
||||
// FIXME?
|
||||
/*
|
||||
SetBroadcast();
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_BREAK3D );
|
||||
WriteNumber();
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void Hud::SetAlignX( hudAlign_t align )
|
||||
@@ -1418,29 +1436,18 @@ void Hud::SetRectX( short value )
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
if( sv_reborn->integer )
|
||||
{
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_RECTX );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort( ( short )value );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_RECT );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort( ( short )fade_move_x_target );
|
||||
gi.MSG_WriteShort( ( short )fade_move_y_target );
|
||||
gi.MSG_WriteShort( ( short )width );
|
||||
gi.MSG_WriteShort( ( short )height );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_RECT);
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort((short)fade_move_x_target);
|
||||
gi.MSG_WriteShort((short)fade_move_y_target);
|
||||
gi.MSG_WriteShort((short)width);
|
||||
gi.MSG_WriteShort((short)height);
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
}
|
||||
|
||||
void Hud::SetRectY( short value )
|
||||
{
|
||||
//#ifdef CGAME_DLL
|
||||
if( fade_move_y_first )
|
||||
{
|
||||
fade_move_y_target = value;
|
||||
@@ -1451,30 +1458,17 @@ void Hud::SetRectY( short value )
|
||||
y = value;
|
||||
fade_move = false;
|
||||
}
|
||||
//#else
|
||||
// y = value;
|
||||
//#endif
|
||||
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
if( sv_reborn->integer )
|
||||
{
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_RECTY );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort( ( short )value );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_RECT );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort( ( short )fade_move_x_target );
|
||||
gi.MSG_WriteShort( ( short )fade_move_y_target );
|
||||
gi.MSG_WriteShort( ( short )width );
|
||||
gi.MSG_WriteShort( ( short )height );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_RECT);
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort((short)fade_move_x_target);
|
||||
gi.MSG_WriteShort((short)fade_move_y_target);
|
||||
gi.MSG_WriteShort((short)width);
|
||||
gi.MSG_WriteShort((short)height);
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1519,24 +1513,13 @@ void Hud::SetShader( const char * s, float w, float h )
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
if( sv_reborn->integer )
|
||||
{
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_RECTWH );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort( ( short )width );
|
||||
gi.MSG_WriteShort( ( short )height );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_RECT );
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort( ( short )x );
|
||||
gi.MSG_WriteShort( ( short )y );
|
||||
gi.MSG_WriteShort( ( short )width );
|
||||
gi.MSG_WriteShort( ( short )height );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_RECT);
|
||||
WriteNumber();
|
||||
gi.MSG_WriteShort((short)x);
|
||||
gi.MSG_WriteShort((short)y);
|
||||
gi.MSG_WriteShort((short)width);
|
||||
gi.MSG_WriteShort((short)height);
|
||||
gi.MSG_EndCGM();
|
||||
|
||||
SetBroadcast();
|
||||
|
||||
@@ -1586,7 +1569,8 @@ void Hud::SetTimer( float time, float fade_at_time )
|
||||
|
||||
fade_timer_flags = TIMER_ACTIVE;
|
||||
|
||||
#ifdef GAME_DLL
|
||||
// FIXME...
|
||||
/*
|
||||
SetBroadcast();
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_TIMER );
|
||||
@@ -1595,7 +1579,7 @@ void Hud::SetTimer( float time, float fade_at_time )
|
||||
gi.MSG_WriteFloat( fade_at_time );
|
||||
gi.MSG_WriteBits( 0, 1 );
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void Hud::SetTimerUp( float time, float fade_at_time )
|
||||
@@ -1612,6 +1596,7 @@ void Hud::SetTimerUp( float time, float fade_at_time )
|
||||
|
||||
fade_timer_flags = TIMER_ACTIVE | TIMER_UP;
|
||||
|
||||
/*
|
||||
#ifdef GAME_DLL
|
||||
SetBroadcast();
|
||||
|
||||
@@ -1622,6 +1607,7 @@ void Hud::SetTimerUp( float time, float fade_at_time )
|
||||
gi.MSG_WriteBits( 1, 1 );
|
||||
gi.MSG_EndCGM();
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void Hud::SetVirtualSize( qboolean v )
|
||||
|
||||
+25
-16
@@ -38,7 +38,7 @@ void HudWriteNumber( int num )
|
||||
void HudDrawShader( int info, const char *name )
|
||||
{
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x1B);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_SHADER);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteString(name); // s = name (shader_name)
|
||||
gi.MSG_EndCGM();
|
||||
@@ -47,7 +47,7 @@ void HudDrawShader( int info, const char *name )
|
||||
void HudDrawAlign( int info, int horizontalAlign, int verticalAlign )
|
||||
{
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x1C);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_ALIGN);
|
||||
HudWriteNumber( info ); // c = probably "info"
|
||||
gi.MSG_WriteBits(horizontalAlign, 2); // value = 0,1,2 bits = 2
|
||||
// 0 - left \
|
||||
@@ -66,7 +66,7 @@ void HudDrawAlign( int info, int horizontalAlign, int verticalAlign )
|
||||
void HudDrawRect(int info, int x, int y, int width, int height)
|
||||
{
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x1D);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_RECT);
|
||||
HudWriteNumber( info ); // c = probably "info"
|
||||
gi.MSG_WriteShort(x); // c = probably "x"
|
||||
gi.MSG_WriteShort(y); // c = probably "y"
|
||||
@@ -79,7 +79,7 @@ void HudDrawRect(int info, int x, int y, int width, int height)
|
||||
void HudDrawVirtualSize(int info, int virtualScreen)
|
||||
{
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x1E);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_VIRTUALSIZE);
|
||||
HudWriteNumber( info ); // c = info
|
||||
|
||||
/*__asm
|
||||
@@ -116,7 +116,7 @@ void HudDrawColor(int info, float *color)
|
||||
|
||||
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x1F);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_COLOR);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteByte(temp[0]); // c = color[2]
|
||||
gi.MSG_WriteByte(temp[1]); // c = color[1] - Values can be messed up. To be tested.
|
||||
@@ -132,7 +132,7 @@ void HudDrawAlpha(int info, float alpha)
|
||||
temp = (long int)(alpha*255.0f);
|
||||
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x20);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_ALPHA);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteByte(temp); // c = alpha
|
||||
gi.MSG_EndCGM();
|
||||
@@ -144,7 +144,7 @@ void HudDrawAlpha(int info, float alpha)
|
||||
void HudDrawString(int info, const char *string)
|
||||
{
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x21);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_STRING);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteString(string); // s = string (to show)
|
||||
gi.MSG_EndCGM();
|
||||
@@ -154,7 +154,7 @@ void HudDrawString(int info, const char *string)
|
||||
void HudDrawFont(int info, const char *fontName)
|
||||
{
|
||||
gi.SetBroadcastAll();
|
||||
gi.MSG_StartCGM(0x22);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_FONT);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteString(fontName); // s = fontName (to use)
|
||||
gi.MSG_EndCGM();
|
||||
@@ -163,6 +163,8 @@ void HudDrawFont(int info, const char *fontName)
|
||||
|
||||
void HudDraw3d( int index, vec3_t vector, int ent_num, qboolean bAlwaysShow, qboolean depth )
|
||||
{
|
||||
// FIXME...
|
||||
/*
|
||||
gi.SetBroadcastAll();
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_3D );
|
||||
@@ -176,10 +178,12 @@ void HudDraw3d( int index, vec3_t vector, int ent_num, qboolean bAlwaysShow, qbo
|
||||
gi.MSG_WriteByte( bAlwaysShow );
|
||||
gi.MSG_WriteByte( depth );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void HudDrawTimer( int index, float duration, float fade_out_time )
|
||||
{
|
||||
/*
|
||||
gi.SetBroadcastAll();
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_TIMER );
|
||||
@@ -187,12 +191,13 @@ void HudDrawTimer( int index, float duration, float fade_out_time )
|
||||
gi.MSG_WriteFloat( duration );
|
||||
gi.MSG_WriteFloat( fade_out_time );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void iHudDrawShader( int cl_num, int info, const char *name )
|
||||
{
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x1B);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_SHADER);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteString(name); // s = name (shader_name)
|
||||
gi.MSG_EndCGM();
|
||||
@@ -202,7 +207,7 @@ void iHudDrawShader( int cl_num, int info, const char *name )
|
||||
void iHudDrawAlign(int cl_num, int info, int horizontalAlign, int verticalAlign )
|
||||
{
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x1C);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_ALIGN);
|
||||
HudWriteNumber( info ); // c = probably "info"
|
||||
gi.MSG_WriteBits(horizontalAlign, 2); // value = 0,1,2 bits = 2
|
||||
// 0 - left \
|
||||
@@ -221,7 +226,7 @@ void iHudDrawAlign(int cl_num, int info, int horizontalAlign, int verticalAlign
|
||||
void iHudDrawRect(int cl_num, int info, int x, int y, int width, int height)
|
||||
{
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x1D);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_RECT);
|
||||
HudWriteNumber( info ); // c = probably "info"
|
||||
gi.MSG_WriteShort(x); // c = probably "x"
|
||||
gi.MSG_WriteShort(y); // c = probably "y"
|
||||
@@ -232,6 +237,7 @@ void iHudDrawRect(int cl_num, int info, int x, int y, int width, int height)
|
||||
|
||||
void iHudDraw3d( int cl_num, int index, vec3_t vector, int ent_num, qboolean bAlwaysShow, qboolean depth )
|
||||
{
|
||||
/*
|
||||
gi.MSG_SetClient( cl_num );
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_3D );
|
||||
@@ -245,10 +251,12 @@ void iHudDraw3d( int cl_num, int index, vec3_t vector, int ent_num, qboolean bAl
|
||||
gi.MSG_WriteByte( bAlwaysShow );
|
||||
gi.MSG_WriteByte( depth );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void iHudDrawTimer( int cl_num, int index, float duration, float fade_out_time )
|
||||
{
|
||||
/*
|
||||
gi.MSG_SetClient( cl_num );
|
||||
|
||||
gi.MSG_StartCGM( CGM_HUDDRAW_TIMER );
|
||||
@@ -256,12 +264,13 @@ void iHudDrawTimer( int cl_num, int index, float duration, float fade_out_time )
|
||||
gi.MSG_WriteFloat( duration );
|
||||
gi.MSG_WriteFloat( fade_out_time );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void iHudDrawVirtualSize(int cl_num, int info, int virtualScreen)
|
||||
{
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x1E);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_VIRTUALSIZE);
|
||||
HudWriteNumber( info ); // c = info
|
||||
|
||||
gi.MSG_WriteBits(!!virtualScreen, 1); // value = ? bits = 1
|
||||
@@ -285,7 +294,7 @@ void iHudDrawColor(int cl_num, int info, float *color)
|
||||
temp[2] = (long int)(color[2]*255.0f);
|
||||
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x1F);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_COLOR);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteByte(temp[0]); // c = color[2]
|
||||
gi.MSG_WriteByte(temp[1]); // c = color[1] - Values can be messed up. To be tested.
|
||||
@@ -301,7 +310,7 @@ void iHudDrawAlpha(int cl_num, int info, float alpha)
|
||||
temp = (long int)(alpha*255.0f);
|
||||
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x20);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_ALPHA);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteByte(temp); // c = alpha
|
||||
gi.MSG_EndCGM();
|
||||
@@ -313,7 +322,7 @@ void iHudDrawAlpha(int cl_num, int info, float alpha)
|
||||
void iHudDrawString( int cl_num, int info, const char *string )
|
||||
{
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x21);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_STRING);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteString(string); // s = string (to show)
|
||||
gi.MSG_EndCGM();
|
||||
@@ -323,7 +332,7 @@ void iHudDrawString( int cl_num, int info, const char *string )
|
||||
void iHudDrawFont( int cl_num, int info, const char *fontName )
|
||||
{
|
||||
gi.MSG_SetClient(cl_num);
|
||||
gi.MSG_StartCGM(0x22);
|
||||
gi.MSG_StartCGM(CGM_HUDDRAW_FONT);
|
||||
HudWriteNumber( info ); // c = info
|
||||
gi.MSG_WriteString(fontName); // s = fontName (to use)
|
||||
gi.MSG_EndCGM();
|
||||
|
||||
@@ -1149,6 +1149,8 @@ void Item::updatePrefix
|
||||
return;
|
||||
}
|
||||
|
||||
// FIXME: delete
|
||||
/*
|
||||
Entity *ent = ev->GetEntity( 1 );
|
||||
|
||||
gi.MSG_SetClient( ent->edict - g_entities );
|
||||
@@ -1157,6 +1159,7 @@ void Item::updatePrefix
|
||||
gi.MSG_WriteString( item_name.c_str() );
|
||||
gi.MSG_WriteString( m_sVMprefix.c_str() );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
qboolean Item::IsItemCool
|
||||
|
||||
+102
-83
@@ -1907,11 +1907,11 @@ qboolean Player::checkattackleft
|
||||
return false;
|
||||
}
|
||||
|
||||
if( last_ucmd.buttons & BUTTON_ATTACK )
|
||||
if( last_ucmd.buttons & BUTTON_ATTACKLEFT )
|
||||
{
|
||||
Weapon *weapon;
|
||||
|
||||
last_attack_button = BUTTON_ATTACK;
|
||||
last_attack_button = BUTTON_ATTACKLEFT;
|
||||
|
||||
weapon = GetActiveWeapon( WEAPON_MAIN );
|
||||
if( weapon )
|
||||
@@ -1939,7 +1939,7 @@ qboolean Player::checkattackbuttonleft
|
||||
return false;
|
||||
}
|
||||
|
||||
return ( last_ucmd.buttons & BUTTON_ATTACK );
|
||||
return ( last_ucmd.buttons & BUTTON_ATTACKLEFT );
|
||||
}
|
||||
|
||||
|
||||
@@ -1954,11 +1954,11 @@ qboolean Player::checkattackright
|
||||
return false;
|
||||
}
|
||||
|
||||
if( last_ucmd.buttons & BUTTON_ATTACK2 )
|
||||
if( last_ucmd.buttons & BUTTON_ATTACKRIGHT )
|
||||
{
|
||||
Weapon *weapon;
|
||||
|
||||
last_attack_button = BUTTON_ATTACK2;
|
||||
last_attack_button = BUTTON_ATTACKRIGHT;
|
||||
|
||||
weapon = GetActiveWeapon( WEAPON_MAIN );
|
||||
if( weapon )
|
||||
@@ -1986,7 +1986,7 @@ qboolean Player::checkattackbuttonright
|
||||
return false;
|
||||
}
|
||||
|
||||
return ( last_ucmd.buttons & BUTTON_ATTACK2 );
|
||||
return ( last_ucmd.buttons & BUTTON_ATTACKRIGHT );
|
||||
}
|
||||
|
||||
qboolean Player::checksneak
|
||||
@@ -2007,15 +2007,6 @@ qboolean Player::checkrun
|
||||
return ( last_ucmd.buttons & BUTTON_RUN ) != 0;
|
||||
}
|
||||
|
||||
qboolean Player::checkholsterweapon
|
||||
(
|
||||
Conditional &condition
|
||||
)
|
||||
|
||||
{
|
||||
return ( last_ucmd.buttons & BUTTON_HOLSTER ) != 0;
|
||||
}
|
||||
|
||||
qboolean Player::checkuse
|
||||
(
|
||||
Conditional &condition
|
||||
@@ -3666,6 +3657,49 @@ qboolean Player::checkimmediateswitch( Conditional &condition )
|
||||
return ( g_gametype->integer && g_immediateswitch->integer );
|
||||
}
|
||||
|
||||
|
||||
qboolean Player::checkmovementspeed(Conditional& condition)
|
||||
{
|
||||
int speed = atoi(condition.getParm(1));
|
||||
return client->ps.speed >= speed;
|
||||
}
|
||||
|
||||
qboolean Player::checkabletodefuse(Conditional& condition)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return true;
|
||||
}
|
||||
|
||||
qboolean Player::checkonlandmine(Conditional& condition)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return false;
|
||||
}
|
||||
|
||||
qboolean Player::checknearlandmine(Conditional& condition)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return false;
|
||||
}
|
||||
|
||||
qboolean Player::CondCanPlaceLandmine(Conditional& condition)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return false;
|
||||
}
|
||||
|
||||
qboolean Player::CondWeaponCurrentFireAnim(Conditional& condition)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return false;
|
||||
}
|
||||
|
||||
qboolean Player::CondVehicleType(Conditional& condition)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return false;
|
||||
}
|
||||
|
||||
qboolean Player::CondAnimDoneVM( Conditional &condition )
|
||||
{
|
||||
return animDoneVM;
|
||||
@@ -3921,7 +3955,6 @@ Condition<Player> Player::Conditions[] =
|
||||
{ "default", &Player::returntrue },
|
||||
{ "SNEAK", &Player::checksneak },
|
||||
{ "RUN", &Player::checkrun },
|
||||
{ "HOLSTERWEAPON", &Player::checkholsterweapon },
|
||||
{ "USE", &Player::checkuse },
|
||||
{ "LEFT", &Player::checkturnleft },
|
||||
{ "RIGHT", &Player::checkturnright },
|
||||
@@ -4024,6 +4057,13 @@ Condition<Player> Player::Conditions[] =
|
||||
{ "MIN_CHARGE_TIME_MET", &Player::checkminchargetimemet },
|
||||
{ "MAX_CHARGE_TIME_MET", &Player::checkmaxchargetimemet },
|
||||
{ "IMMEDIATE_SWITCH", &Player::checkimmediateswitch },
|
||||
{ "CHECK_MOVEMENT_SPEED", &Player::checkmovementspeed },
|
||||
{ "ABLE_TO_DEFUSE", &Player::checkabletodefuse },
|
||||
{ "ON_LANDMINE", &Player::checkonlandmine },
|
||||
{ "NEAR_LANDMINE", &Player::checknearlandmine },
|
||||
{ "CAN_PLACE_LANDMINE", &Player::CondCanPlaceLandmine },
|
||||
{ "WEAPON_CURRENT_FIRE_ANIM", &Player::CondWeaponCurrentFireAnim },
|
||||
{ "VEHICLE_TYPE", &Player::CondVehicleType },
|
||||
{ "ANIMDONE_VM", &Player::CondAnimDoneVM },
|
||||
{ "CLIENT_COMMAND", &Player::CondClientCommand },
|
||||
{ "IS_VM_ANIM", &Player::CondVMAnim },
|
||||
@@ -5740,9 +5780,9 @@ void Player::Pain
|
||||
{
|
||||
gi.MSG_SetClient( attacker->edict - g_entities );
|
||||
if( IsDead() )
|
||||
gi.MSG_StartCGM( 36 );
|
||||
gi.MSG_StartCGM(CGM_NOTIFY_KILL);
|
||||
else
|
||||
gi.MSG_StartCGM( 35 );
|
||||
gi.MSG_StartCGM(CGM_NOTIFY_HIT);
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
|
||||
@@ -6478,6 +6518,8 @@ void Player::ClientMove
|
||||
{
|
||||
m_bShowingHint = false;
|
||||
|
||||
// FIXME: delete
|
||||
/*
|
||||
if (sv_reborn->integer)
|
||||
{
|
||||
gi.MSG_SetClient(edict - g_entities);
|
||||
@@ -6487,6 +6529,7 @@ void Player::ClientMove
|
||||
gi.MSG_WriteString("");
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
oldorigin = origin;
|
||||
@@ -6957,7 +7000,7 @@ void Player::ClientThink
|
||||
client->ps.pm_flags |= PMF_FROZEN;
|
||||
client->ps.pm_flags |= PMF_INTERMISSION;
|
||||
|
||||
if( level.time - level.intermissiontime > 5.0f && ( new_buttons & ( BUTTON_ATTACK | BUTTON_ATTACK2 ) ) )
|
||||
if( level.time - level.intermissiontime > 5.0f && ( new_buttons & ( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT ) ) )
|
||||
{
|
||||
level.exitintermission = true;
|
||||
}
|
||||
@@ -6998,7 +7041,7 @@ void Player::ClientThink
|
||||
{
|
||||
if( level.intermissiontype )
|
||||
{
|
||||
if( ( new_buttons & BUTTON_ATTACK ) || ( new_buttons & BUTTON_ATTACK2 ) )
|
||||
if( ( new_buttons & BUTTON_ATTACKLEFT ) || ( new_buttons & BUTTON_ATTACKRIGHT ) )
|
||||
{
|
||||
if( level.intermissiontype == TRANS_MISSION_FAILED )
|
||||
{
|
||||
@@ -7044,7 +7087,7 @@ void Player::ClientThink
|
||||
return;
|
||||
}
|
||||
|
||||
if( new_buttons & BUTTON_ATTACK2 )
|
||||
if( new_buttons & BUTTON_ATTACKRIGHT )
|
||||
{
|
||||
Weapon *weapon = GetActiveWeapon( WEAPON_MAIN );
|
||||
|
||||
@@ -7252,7 +7295,7 @@ void Player::Think
|
||||
if (g_gametype->integer == GT_SINGLE_PLAYER)
|
||||
{
|
||||
|
||||
if (((server_new_buttons & BUTTON_ATTACK) || (server_new_buttons & BUTTON_ATTACK2)) &&
|
||||
if (((server_new_buttons & BUTTON_ATTACKLEFT) || (server_new_buttons & BUTTON_ATTACKRIGHT)) &&
|
||||
(!GetActiveWeapon(WEAPON_MAIN)) &&
|
||||
(!IsDead()) &&
|
||||
(!IsNewActiveWeapon()) &&
|
||||
@@ -7270,7 +7313,7 @@ void Player::Think
|
||||
{
|
||||
if (dmManager.AllowRespawn())
|
||||
{
|
||||
if (((server_new_buttons & BUTTON_ATTACK) || (server_new_buttons & BUTTON_ATTACK2)) ||
|
||||
if (((server_new_buttons & BUTTON_ATTACKLEFT) || (server_new_buttons & BUTTON_ATTACKRIGHT)) ||
|
||||
(g_forcerespawn->integer > 0 && level.time > g_forcerespawn->integer + respawn_time))
|
||||
{
|
||||
m_bSpectator = false;
|
||||
@@ -7288,7 +7331,7 @@ void Player::Think
|
||||
|
||||
if (IsSpectator() && !m_bTempSpectator)
|
||||
{
|
||||
if (level.time <= respawn_time || !((server_new_buttons & BUTTON_ATTACK) || (server_new_buttons & BUTTON_ATTACK2)))
|
||||
if (level.time <= respawn_time || !((server_new_buttons & BUTTON_ATTACKLEFT) || (server_new_buttons & BUTTON_ATTACKRIGHT)))
|
||||
{
|
||||
if (level.time - 10.0f > m_fWeapSelectTime)
|
||||
{
|
||||
@@ -11544,7 +11587,7 @@ void Player::EventGetFireHeld
|
||||
)
|
||||
|
||||
{
|
||||
ev->AddInteger( buttons & ( BUTTON_ATTACK | BUTTON_ATTACK2 ) ? qtrue : qfalse );
|
||||
ev->AddInteger( buttons & ( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT ) ? qtrue : qfalse );
|
||||
}
|
||||
|
||||
void Player::Score
|
||||
@@ -13171,7 +13214,7 @@ void Player::EventDMMessage
|
||||
if( bInstaMessage )
|
||||
{
|
||||
gi.MSG_SetClient( i );
|
||||
gi.MSG_StartCGM( 37 );
|
||||
gi.MSG_StartCGM(CGM_VOICE_CHAT);
|
||||
gi.MSG_WriteCoord( m_vViewPos[ 0 ] );
|
||||
gi.MSG_WriteCoord( m_vViewPos[ 1 ] );
|
||||
gi.MSG_WriteCoord( m_vViewPos[ 2 ] );
|
||||
@@ -13263,35 +13306,27 @@ qboolean Player::ViewModelAnim( str anim, qboolean force_restart, qboolean bFull
|
||||
}
|
||||
|
||||
if ( Q_stricmp( anim, "charge" ) == 0 ) {
|
||||
viewModelAnim = VMA_CHARGE;
|
||||
viewModelAnim = VM_ANIM_CHARGE;
|
||||
} else if ( Q_stricmp( anim, "fire" ) == 0 ) {
|
||||
viewModelAnim = VMA_FIRE;
|
||||
viewModelAnim = VM_ANIM_FIRE;
|
||||
} else if ( Q_stricmp( anim, "fire_secondary" ) == 0 ) {
|
||||
viewModelAnim = VMA_FIRE_SECONDARY;
|
||||
viewModelAnim = VM_ANIM_FIRE_SECONDARY;
|
||||
} else if ( Q_stricmp( anim, "rechamber" ) == 0 ) {
|
||||
viewModelAnim = VMA_RECHAMBER;
|
||||
viewModelAnim = VM_ANIM_RECHAMBER;
|
||||
} else if ( Q_stricmp( anim, "reload" ) == 0 ) {
|
||||
viewModelAnim = VMA_RELOAD;
|
||||
viewModelAnim = VM_ANIM_RELOAD;
|
||||
} else if ( Q_stricmp( anim, "reload_single" ) == 0 ) {
|
||||
viewModelAnim = VMA_RELOAD_SINGLE;
|
||||
viewModelAnim = VM_ANIM_RELOAD_SINGLE;
|
||||
} else if ( Q_stricmp( anim, "reload_end" ) == 0 ) {
|
||||
viewModelAnim = VMA_RELOAD_END;
|
||||
viewModelAnim = VM_ANIM_RELOAD_END;
|
||||
} else if ( Q_stricmp( anim, "pullout" ) == 0 ) {
|
||||
viewModelAnim = VMA_PULLOUT;
|
||||
viewModelAnim = VM_ANIM_PULLOUT;
|
||||
} else if ( Q_stricmp( anim, "putaway" ) == 0 ) {
|
||||
viewModelAnim = VMA_PUTAWAY;
|
||||
viewModelAnim = VM_ANIM_PUTAWAY;
|
||||
} else if ( Q_stricmp( anim, "ladderstep" ) == 0 ) {
|
||||
viewModelAnim = VMA_LADDERSTEP;
|
||||
viewModelAnim = VM_ANIM_LADDERSTEP;
|
||||
} else if ( Q_stricmp( anim, "idle" ) == 0 ) {
|
||||
viewModelAnim = VMA_IDLE;
|
||||
}
|
||||
else if ( level.reborn )
|
||||
{
|
||||
if ( !anim.icmp( "enable" ) ) {
|
||||
viewModelAnim = VMA_ENABLE;
|
||||
} else {
|
||||
viewModelAnim = VMA_CUSTOMANIMATION;
|
||||
}
|
||||
viewModelAnim = VM_ANIM_IDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -13319,16 +13354,6 @@ qboolean Player::ViewModelAnim( str anim, qboolean force_restart, qboolean bFull
|
||||
|
||||
m_sVMcurrent = anim;
|
||||
|
||||
if ( level.reborn && viewModelAnim == VMA_CUSTOMANIMATION )
|
||||
{
|
||||
gi.MSG_SetClient( edict - g_entities );
|
||||
|
||||
gi.MSG_StartCGM( CGM_VIEWMODELANIM );
|
||||
gi.MSG_WriteString( anim.c_str() );
|
||||
gi.MSG_WriteByte( bFullAnim );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
|
||||
if ( viewModelAnim != playerState->iViewModelAnim || force_restart ) {
|
||||
playerState->iViewModelAnimChanged = ( playerState->iViewModelAnimChanged + 1 ) & 3;
|
||||
}
|
||||
@@ -14202,7 +14227,7 @@ void Player::LeanLeftHeld
|
||||
|
||||
player = ( Player * )this;
|
||||
|
||||
buttonheld = !!( player->buttons & BUTTON_LEANLEFT );
|
||||
buttonheld = !!( player->buttons & BUTTON_LEAN_LEFT );
|
||||
|
||||
ev->AddInteger( buttonheld );
|
||||
}
|
||||
@@ -14218,7 +14243,7 @@ void Player::LeanRightHeld
|
||||
|
||||
player = ( Player * )this;
|
||||
|
||||
buttonheld = !!( player->buttons & BUTTON_LEANRIGHT );
|
||||
buttonheld = !!( player->buttons & BUTTON_LEAN_RIGHT );
|
||||
|
||||
ev->AddInteger( buttonheld );
|
||||
}
|
||||
@@ -14256,15 +14281,15 @@ void Player::ModifyHeightFloat
|
||||
|
||||
client->ps.pm_flags &= ~( PMF_DUCKED | PMF_VIEW_PRONE | PMF_VIEW_DUCK_RUN | PMF_VIEW_JUMP_START );
|
||||
|
||||
if( sv_reborn->integer )
|
||||
{
|
||||
gi.MSG_SetClient( edict - g_entities);
|
||||
// FIXME...
|
||||
/*
|
||||
gi.MSG_SetClient(edict - g_entities);
|
||||
|
||||
gi.MSG_StartCGM( CGM_MODHEIGHTFLOAT );
|
||||
gi.MSG_WriteLong( height );
|
||||
gi.MSG_WriteFloat( max_z );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
gi.MSG_StartCGM(CGM_MODHEIGHTFLOAT);
|
||||
gi.MSG_WriteLong(height);
|
||||
gi.MSG_WriteFloat(max_z);
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void Player::PlayLocalSound
|
||||
@@ -14298,8 +14323,8 @@ void Player::PlayLocalSound
|
||||
return;
|
||||
}
|
||||
|
||||
if( sv_reborn->integer )
|
||||
{
|
||||
// FIXME...
|
||||
/*
|
||||
gi.MSG_SetClient( client->ps.clientNum );
|
||||
|
||||
gi.MSG_StartCGM( CGM_PLAYLOCALSOUND );
|
||||
@@ -14310,7 +14335,7 @@ void Player::PlayLocalSound
|
||||
gi.MSG_EndCGM();
|
||||
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
if( loop )
|
||||
{
|
||||
@@ -14362,7 +14387,7 @@ void Player::SecFireHeld
|
||||
|
||||
player = ( Player * )this;
|
||||
|
||||
buttonheld = !!( player->buttons & BUTTON_ATTACK2 );
|
||||
buttonheld = !!( player->buttons & BUTTON_ATTACKRIGHT );
|
||||
|
||||
ev->AddInteger( buttonheld );
|
||||
}
|
||||
@@ -14467,11 +14492,14 @@ void Player::SetLocalSoundRate
|
||||
|
||||
gi.MSG_SetClient( client->ps.clientNum );
|
||||
|
||||
// FIXME...
|
||||
/*
|
||||
gi.MSG_StartCGM( CGM_SETLOCALSOUNDRATE );
|
||||
gi.MSG_WriteString( found );
|
||||
gi.MSG_WriteFloat( rate );
|
||||
gi.MSG_WriteFloat( time );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void Player::SetSpeed
|
||||
@@ -14556,12 +14584,15 @@ void Player::SetVMASpeed
|
||||
vma->name = name;
|
||||
vma->speed = speed;
|
||||
|
||||
// FIXME...
|
||||
/*
|
||||
gi.MSG_SetClient( edict - g_entities );
|
||||
|
||||
gi.MSG_StartCGM( CGM_SETVMASPEED );
|
||||
gi.MSG_WriteString( name );
|
||||
gi.MSG_WriteFloat( speed );
|
||||
gi.MSG_EndCGM();
|
||||
*/
|
||||
}
|
||||
|
||||
void Player::StopLocalSound
|
||||
@@ -14589,20 +14620,8 @@ void Player::StopLocalSound
|
||||
return;
|
||||
}
|
||||
|
||||
if( level.reborn )
|
||||
{
|
||||
gi.MSG_SetClient( client->ps.clientNum );
|
||||
|
||||
gi.MSG_StartCGM( CGM_STOPLOCALSOUND );
|
||||
gi.MSG_WriteString( found );
|
||||
gi.MSG_WriteFloat( time );
|
||||
gi.MSG_EndCGM();
|
||||
}
|
||||
else
|
||||
{
|
||||
edict->s.loopSound = 0;
|
||||
gi.StopSound( entnum, CHAN_LOCAL );
|
||||
}
|
||||
edict->s.loopSound = 0;
|
||||
gi.StopSound(entnum, CHAN_LOCAL);
|
||||
}
|
||||
|
||||
void Player::UseHeld
|
||||
|
||||
+7
-1
@@ -354,7 +354,6 @@ public:
|
||||
qboolean checkattackbuttonright( Conditional &condition );
|
||||
qboolean checksneak( Conditional &condition );
|
||||
qboolean checkrun( Conditional &condition );
|
||||
qboolean checkholsterweapon( Conditional &condition );
|
||||
qboolean checkuse( Conditional &condition );
|
||||
qboolean checkcanturn( Conditional &condition );
|
||||
qboolean checkcanmoveright( Conditional &condition );
|
||||
@@ -443,6 +442,13 @@ public:
|
||||
qboolean checkminchargetimemet( Conditional &condition );
|
||||
qboolean checkmaxchargetimemet( Conditional &condition );
|
||||
qboolean checkimmediateswitch( Conditional &condition );
|
||||
qboolean checkmovementspeed( Conditional &condition );
|
||||
qboolean checkabletodefuse( Conditional &condition );
|
||||
qboolean checkonlandmine( Conditional &condition );
|
||||
qboolean checknearlandmine( Conditional &condition );
|
||||
qboolean CondCanPlaceLandmine( Conditional &condition );
|
||||
qboolean CondWeaponCurrentFireAnim( Conditional &condition );
|
||||
qboolean CondVehicleType( Conditional &condition );
|
||||
qboolean CondAnimDoneVM( Conditional &condition );
|
||||
qboolean CondClientCommand( Conditional &condition );
|
||||
qboolean CondVMAnim( Conditional &condition );
|
||||
|
||||
+12
-12
@@ -503,7 +503,7 @@ void PlayerBot::UpdateBotStates
|
||||
if( IsDead() )
|
||||
{
|
||||
// The bot should respawn
|
||||
m_botCmd.buttons ^= BUTTON_ATTACK;
|
||||
m_botCmd.buttons ^= BUTTON_ATTACKLEFT;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1419,7 +1419,7 @@ void PlayerBot::State_EndAttack
|
||||
)
|
||||
|
||||
{
|
||||
m_botCmd.buttons &= ~( BUTTON_ATTACK | BUTTON_ATTACK2 );
|
||||
m_botCmd.buttons &= ~( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT );
|
||||
}
|
||||
|
||||
void PlayerBot::State_Attack
|
||||
@@ -1470,16 +1470,16 @@ void PlayerBot::State_Attack
|
||||
{
|
||||
if( pWeap->IsSemiAuto() )
|
||||
{
|
||||
m_botCmd.buttons ^= BUTTON_ATTACK;
|
||||
m_botCmd.buttons ^= BUTTON_ATTACKLEFT;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_botCmd.buttons |= BUTTON_ATTACK;
|
||||
m_botCmd.buttons |= BUTTON_ATTACKLEFT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_botCmd.buttons &= ~BUTTON_ATTACK;
|
||||
m_botCmd.buttons &= ~BUTTON_ATTACKLEFT;
|
||||
}
|
||||
}
|
||||
else if( pWeap->GetFireType( FIRE_SECONDARY ) == FT_MELEE )
|
||||
@@ -1488,21 +1488,21 @@ void PlayerBot::State_Attack
|
||||
|
||||
if( fDistanceSquared <= fSecondaryBulletRangeSquared )
|
||||
{
|
||||
m_botCmd.buttons ^= BUTTON_ATTACK2;
|
||||
m_botCmd.buttons ^= BUTTON_ATTACKRIGHT;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_botCmd.buttons &= ~BUTTON_ATTACK2;
|
||||
m_botCmd.buttons &= ~BUTTON_ATTACKRIGHT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_botCmd.buttons &= ~( BUTTON_ATTACK | BUTTON_ATTACK2 );
|
||||
m_botCmd.buttons &= ~( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_botCmd.buttons &= ~( BUTTON_ATTACK | BUTTON_ATTACK2 );
|
||||
m_botCmd.buttons &= ~( BUTTON_ATTACKLEFT | BUTTON_ATTACKRIGHT );
|
||||
fMinDistanceSquared = 0;
|
||||
}
|
||||
|
||||
@@ -1634,10 +1634,10 @@ void PlayerBot::Killed
|
||||
Player::Killed( ev );
|
||||
|
||||
// send the respawn buttons
|
||||
if( !( m_botCmd.buttons & BUTTON_ATTACK ) )
|
||||
m_botCmd.buttons |= BUTTON_ATTACK;
|
||||
if( !( m_botCmd.buttons & BUTTON_ATTACKLEFT ) )
|
||||
m_botCmd.buttons |= BUTTON_ATTACKLEFT;
|
||||
else
|
||||
m_botCmd.buttons &= ~BUTTON_ATTACK;
|
||||
m_botCmd.buttons &= ~BUTTON_ATTACKLEFT;
|
||||
|
||||
m_botEyes.ofs[ 0 ] = 0;
|
||||
m_botEyes.ofs[ 1 ] = 0;
|
||||
|
||||
@@ -772,7 +772,7 @@ qboolean TurretGun::UserAim
|
||||
|
||||
m_vUserLastCmdAng = vNewCmdAng;
|
||||
|
||||
if( ( ucmd->buttons & BUTTON_ATTACK ) || ( ucmd->buttons & BUTTON_ATTACK2 ) )
|
||||
if( ( ucmd->buttons & BUTTON_ATTACKLEFT ) || ( ucmd->buttons & BUTTON_ATTACKRIGHT ) )
|
||||
{
|
||||
if( !m_iFiring ) {
|
||||
m_iFiring = 1;
|
||||
|
||||
+12
-12
@@ -1785,11 +1785,11 @@ void Explosion::MakeExplosionEffect
|
||||
|
||||
if( !sEffect.icmp( "grenade" ) )
|
||||
{
|
||||
gi.MSG_StartCGM( 12 );
|
||||
gi.MSG_StartCGM(CGM_EXPLOSION_EFFECT_1);
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 13 );
|
||||
gi.MSG_StartCGM(CGM_EXPLOSION_EFFECT_2);
|
||||
}
|
||||
|
||||
gi.MSG_WriteCoord( origin[ 0 ] );
|
||||
@@ -2034,7 +2034,7 @@ float BulletAttack
|
||||
if( ent->edict->solid == 3 && trace.shaderNum >= 0 )
|
||||
{
|
||||
gi.SetBroadcastVisible( trace.endpos, 0 );
|
||||
gi.MSG_StartCGM( 6 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_6);
|
||||
gi.MSG_WriteCoord( trace.endpos[ 0 ] );
|
||||
gi.MSG_WriteCoord( trace.endpos[ 1 ] );
|
||||
gi.MSG_WriteCoord( trace.endpos[ 2 ] );
|
||||
@@ -2192,7 +2192,7 @@ float BulletAttack
|
||||
if( trace.contents > 0 && trace.surfaceFlags & 0xFFFE000 )
|
||||
{
|
||||
gi.SetBroadcastVisible( trace.endpos, NULL );
|
||||
gi.MSG_StartCGM( 6 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_6);
|
||||
gi.MSG_WriteCoord( trace.endpos[ 0 ] );
|
||||
gi.MSG_WriteCoord( trace.endpos[ 1 ] );
|
||||
gi.MSG_WriteCoord( trace.endpos[ 2 ] );
|
||||
@@ -2203,7 +2203,7 @@ float BulletAttack
|
||||
else if( trace.location >= 0 && ent->IsSubclassOfPlayer() )
|
||||
{
|
||||
gi.SetBroadcastVisible( trace.endpos, NULL );
|
||||
gi.MSG_StartCGM( 7 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_7);
|
||||
gi.MSG_WriteCoord( trace.endpos[ 0 ] );
|
||||
gi.MSG_WriteCoord( trace.endpos[ 1 ] );
|
||||
gi.MSG_WriteCoord( trace.endpos[ 2 ] );
|
||||
@@ -2250,7 +2250,7 @@ float BulletAttack
|
||||
{
|
||||
if( iTracerCount )
|
||||
{
|
||||
gi.MSG_StartCGM( 1 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_1);
|
||||
|
||||
gi.MSG_WriteCoord( vBarrel[ 0 ] );
|
||||
gi.MSG_WriteCoord( vBarrel[ 1 ] );
|
||||
@@ -2258,7 +2258,7 @@ float BulletAttack
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 2 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_2);
|
||||
}
|
||||
|
||||
gi.MSG_WriteCoord( start[ 0 ] );
|
||||
@@ -2273,7 +2273,7 @@ float BulletAttack
|
||||
{
|
||||
if( iTracerCount )
|
||||
{
|
||||
gi.MSG_StartCGM( 3 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_3);
|
||||
|
||||
gi.MSG_WriteCoord( vBarrel[ 0 ] );
|
||||
gi.MSG_WriteCoord( vBarrel[ 1 ] );
|
||||
@@ -2286,7 +2286,7 @@ float BulletAttack
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 4 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_4);
|
||||
}
|
||||
|
||||
gi.MSG_WriteCoord( start[ 0 ] );
|
||||
@@ -2349,7 +2349,7 @@ void FakeBulletAttack
|
||||
( *piTracerCount )++;
|
||||
if( *piTracerCount == iTracerFrequency )
|
||||
{
|
||||
gi.MSG_StartCGM( 25 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_NO_BARREL_1);
|
||||
gi.MSG_WriteCoord( vBarrel[ 0 ] );
|
||||
gi.MSG_WriteCoord( vBarrel[ 1 ] );
|
||||
gi.MSG_WriteCoord( vBarrel[ 2 ] );
|
||||
@@ -2357,12 +2357,12 @@ void FakeBulletAttack
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 26 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_NO_BARREL_2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gi.MSG_StartCGM( 26 );
|
||||
gi.MSG_StartCGM(CGM_BULLET_NO_BARREL_2);
|
||||
}
|
||||
|
||||
gi.MSG_WriteCoord( start[ 0 ] );
|
||||
|
||||
@@ -151,7 +151,7 @@ void WindowObject::WindowKilled( Event *ev )
|
||||
vCenter = origin + mins + maxs;
|
||||
|
||||
gi.SetBroadcastVisible( vCenter, vCenter );
|
||||
gi.MSG_StartCGM( 24 );
|
||||
gi.MSG_StartCGM(CGM_MAKE_WINDOW_DEBRIS);
|
||||
gi.MSG_WriteCoord( vCenter[ 0 ] );
|
||||
gi.MSG_WriteCoord( vCenter[ 1 ] );
|
||||
gi.MSG_WriteCoord( vCenter[ 2 ] );
|
||||
|
||||
+55
-26
@@ -391,9 +391,6 @@ ConSimple *World::GetTargetList( const_str targetname )
|
||||
return &m_targetList.addKeyValue( targetname );
|
||||
}
|
||||
|
||||
|
||||
#ifdef GAME_DLL
|
||||
|
||||
World::World()
|
||||
{
|
||||
world = this;
|
||||
@@ -424,11 +421,30 @@ World::World()
|
||||
|
||||
// set the default farplane parameters
|
||||
farplane_distance = 0;
|
||||
farplane_color = "0 0 0";
|
||||
farplane_bias = 0.0;
|
||||
farplane_color = vec_zero;
|
||||
farplane_cull = qtrue;
|
||||
skybox_farplane = 0.0;
|
||||
render_terrain = qtrue;
|
||||
skybox_speed = 0.0;
|
||||
farclip_override = 0.f;
|
||||
farplane_color_override = Vector(-1, -1, -1);
|
||||
animated_farplane_start = 0.0;
|
||||
animated_farplane_end = 0.0;
|
||||
animated_farplane_start_z = 8192.0;
|
||||
animated_farplane_end_z = 0.0;
|
||||
animated_farplane_bias_start = 0.0;
|
||||
animated_farplane_bias_end = 0.0;
|
||||
animated_farplane_bias_start_z = 8192.0;
|
||||
animated_farplane_bias_end_z = 0.0;
|
||||
animated_farplane_color_start = vec_zero;
|
||||
animated_farplane_color_end = vec_zero;
|
||||
animated_farplane_color_start_z = 8192.0;
|
||||
animated_farplane_color_end_z = 0.0;
|
||||
|
||||
UpdateFog();
|
||||
|
||||
sky_alpha = 1.0f;
|
||||
sky_portal = qtrue;
|
||||
UpdateSky();
|
||||
|
||||
@@ -472,19 +488,12 @@ void World::UpdateConfigStrings( void )
|
||||
gi.SetConfigstring( CS_MESSAGE, level.level_name.c_str() );
|
||||
};
|
||||
|
||||
void World::UpdateFog( void )
|
||||
{
|
||||
gi.SetFarPlane( farplane_distance );
|
||||
gi.SetConfigstring( CS_FOGINFO, va( "%d %.0f %.4f %.4f %.4f", farplane_cull, farplane_distance, farplane_color.x, farplane_color.y, farplane_color.z ) );
|
||||
}
|
||||
|
||||
void World::UpdateSky( void )
|
||||
{
|
||||
gi.SetSkyPortal( sky_portal );
|
||||
gi.SetConfigstring( CS_SKYINFO, va( "%.4f %d", sky_alpha, sky_portal ) );
|
||||
}
|
||||
|
||||
|
||||
void World::SetSoundtrack( Event *ev )
|
||||
{
|
||||
const char *text;
|
||||
@@ -566,6 +575,41 @@ void World::SetNorthYaw( Event *ev )
|
||||
m_fNorth = anglemod( ev->GetFloat( 1 ) );
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
void World::UpdateFog(void)
|
||||
{
|
||||
gi.SetFarPlane(farplane_distance);
|
||||
gi.SetConfigstring(CS_FOGINFO, va(
|
||||
"%d %.0f %.0f %.0f %.6f %.4f %.4f %.4f %d %.0f %.2f %.2f %.2f",
|
||||
farplane_cull,
|
||||
farplane_distance,
|
||||
farplane_bias,
|
||||
skybox_farplane,
|
||||
skybox_speed,
|
||||
farplane_color.x,
|
||||
farplane_color.y,
|
||||
farplane_color.z,
|
||||
render_terrain,
|
||||
farclip_override,
|
||||
farplane_color_override.x,
|
||||
farplane_color_override.y,
|
||||
farplane_color_override.z
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void World::UpdateFog(void)
|
||||
{
|
||||
gi.SetFarPlane(farplane_distance);
|
||||
gi.SetConfigstring(CS_FOGINFO, va("%d %.0f %.4f %.4f %.4f", farplane_cull, farplane_distance, farplane_color.x, farplane_color.y, farplane_color.z));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
CLASS_DECLARATION( Entity, World, "worldspawn" )
|
||||
{
|
||||
{ &EV_World_SetSoundtrack, &World::SetSoundtrack },
|
||||
@@ -594,18 +638,3 @@ CLASS_DECLARATION( Entity, World, "worldspawn" )
|
||||
{ &EV_World_SetSunDiffuseColor, NULL },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
World::World()
|
||||
{
|
||||
world = this;
|
||||
world_dying = qfalse;
|
||||
}
|
||||
|
||||
CLASS_DECLARATION( SimpleEntity, World, "worldspawn" )
|
||||
{
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -51,8 +51,26 @@ class World : public SimpleEntity {
|
||||
public:
|
||||
// farplane variables
|
||||
float farplane_distance;
|
||||
float farplane_bias;
|
||||
Vector farplane_color;
|
||||
qboolean farplane_cull;
|
||||
float skybox_farplane;
|
||||
qboolean render_terrain;
|
||||
float skybox_speed;
|
||||
float farclip_override;
|
||||
Vector farplane_color_override;
|
||||
float animated_farplane_start;
|
||||
float animated_farplane_end;
|
||||
float animated_farplane_start_z;
|
||||
float animated_farplane_end_z;
|
||||
float animated_farplane_bias_start;
|
||||
float animated_farplane_bias_end;
|
||||
float animated_farplane_bias_start_z;
|
||||
float animated_farplane_bias_end_z;
|
||||
Vector animated_farplane_color_start;
|
||||
Vector animated_farplane_color_end;
|
||||
float animated_farplane_color_start_z;
|
||||
float animated_farplane_color_end_z;
|
||||
|
||||
// sky variables
|
||||
float sky_alpha;
|
||||
|
||||
+97
-159
@@ -200,168 +200,109 @@ void Alias_ListAddParms(AliasListNode_t* node, const char* parameters)
|
||||
return;
|
||||
}
|
||||
|
||||
while (1)
|
||||
for (;;)
|
||||
{
|
||||
while (1)
|
||||
token = nptr = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !token[0])
|
||||
{
|
||||
while (1)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(token, "stop"))
|
||||
{
|
||||
node->stop_flag = 1;
|
||||
}
|
||||
else if (!Q_stricmp(token, "soundparms"))
|
||||
{
|
||||
node->volume = getTokenFloat(¶meters, "volume", node);
|
||||
node->volumeMod = getTokenFloat(¶meters, "volumeMod", node);
|
||||
node->pitch = getTokenFloat(¶meters, "pitch", node);
|
||||
node->pitchMod = getTokenFloat(¶meters, "pitchMod", node);
|
||||
node->dist = getTokenFloat(¶meters, "dist", node);
|
||||
node->maxDist = getTokenFloat(¶meters, "maxDist", node);
|
||||
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
token = nptr = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "weight"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
node->stop_flag = 1;
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "weight"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)¶meters, 1);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
temp_float = atof(token);
|
||||
|
||||
if (temp_float < 0.0f)
|
||||
{
|
||||
Com_Printf("Weight value out of range in %s alias\n", node->alias_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
node->weight = temp_float;
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "soundparms"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
node->volume = getTokenFloat(¶meters, "volume", node);
|
||||
node->volumeMod = getTokenFloat(¶meters, "volumeMod", node);
|
||||
node->pitch = getTokenFloat(¶meters, "pitch", node);
|
||||
node->pitchMod = getTokenFloat(¶meters, "pitchMod", node);
|
||||
node->dist = getTokenFloat(¶meters, "dist", node);
|
||||
node->maxDist = getTokenFloat(¶meters, "maxDist", node);
|
||||
|
||||
token = COM_GetToken((char**)¶meters, 1);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
node->channel = S_ChannelNameToNum(token);
|
||||
if (node->channel == -1)
|
||||
{
|
||||
Com_Printf("%s is not avalid channel on %s alias.\n", token, node->alias_name);
|
||||
node->channel = 0;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)¶meters, 1);
|
||||
if (!token || !*token)
|
||||
{
|
||||
Com_Printf("ERROR: defaulting %s to not streamed - please setup alias properly.\n", node->alias_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(token, "streamed"))
|
||||
{
|
||||
node->streamed = 1;
|
||||
}
|
||||
else if (!Q_stricmp(token, "loaded"))
|
||||
{
|
||||
node->streamed = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Com_Printf("ERROR: Expecting streamed or loaded in ubersound and got %s on alias %s\n", token, node->alias_name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "subtitle"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
Com_Printf("NULL subtitle on %s alias.\n", node->alias_name);
|
||||
return;
|
||||
}
|
||||
|
||||
node->subtitle = Z_TagMalloc(strlen(token) + 1, TAG_TIKI);
|
||||
strcpy(node->subtitle, token);
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "pitch"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
temp_float = atof(token);
|
||||
if (temp_float < 0.0f)
|
||||
{
|
||||
Com_Printf("Pitch value out of range in %s alias\n", node->alias_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
node->pitch = temp_float;
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "pitchmod"))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
temp_float = atof(token);
|
||||
if (temp_float < 0.0f)
|
||||
{
|
||||
Com_Printf("PitchMod value out of range in %s alias\n", node->alias_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
node->pitchMod = temp_float;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Q_stricmp(nptr, "volumemod"))
|
||||
node->channel = S_ChannelNameToNum(token);
|
||||
if (node->channel == -1)
|
||||
{
|
||||
break;
|
||||
Com_Printf("%s is not avalid channel on %s alias.\n", token, node->alias_name);
|
||||
node->channel = 0;
|
||||
}
|
||||
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
Com_Printf("ERROR: defaulting %s to not streamed - please setup alias properly.\n", node->alias_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(token, "streamed"))
|
||||
{
|
||||
node->streamed = qtrue;
|
||||
}
|
||||
else if (!Q_stricmp(token, "loaded"))
|
||||
{
|
||||
node->streamed = qfalse;
|
||||
}
|
||||
else
|
||||
{
|
||||
Com_Printf("ERROR: Expecting streamed or loaded in ubersound and got %s on alias %s\n", token, node->alias_name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (!Q_stricmp(token, "subtitle"))
|
||||
{
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
Com_Printf("NULL subtitle on %s alias.\n", node->alias_name);
|
||||
return;
|
||||
}
|
||||
|
||||
node->subtitle = Z_TagMalloc(strlen(token) + 1, TAG_TIKI);
|
||||
strcpy(node->subtitle, token);
|
||||
}
|
||||
else if (!Q_stricmp(token, "pitch"))
|
||||
{
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
temp_float = atof(token);
|
||||
if (temp_float < 0.0f)
|
||||
{
|
||||
Com_Printf("Pitch value out of range in %s alias\n", node->alias_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
node->pitch = temp_float;
|
||||
}
|
||||
else if (!Q_stricmp(token, "pitchmod"))
|
||||
{
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
temp_float = atof(token);
|
||||
if (temp_float < 0.0f)
|
||||
{
|
||||
Com_Printf("PitchMod value out of range in %s alias\n", node->alias_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
node->pitchMod = temp_float;
|
||||
}
|
||||
else if (!Q_stricmp(token, "volumemod"))
|
||||
{
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
{
|
||||
@@ -377,8 +318,7 @@ void Alias_ListAddParms(AliasListNode_t* node, const char* parameters)
|
||||
|
||||
node->volumeMod = temp_float;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(nptr, "dist"))
|
||||
else if (!Q_stricmp(token, "dist"))
|
||||
{
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
@@ -396,7 +336,7 @@ void Alias_ListAddParms(AliasListNode_t* node, const char* parameters)
|
||||
|
||||
node->dist = temp_float;
|
||||
}
|
||||
else if (!Q_stricmp(nptr, "channel"))
|
||||
else if (!Q_stricmp(token, "channel"))
|
||||
{
|
||||
token = COM_GetToken((char**)¶meters, qtrue);
|
||||
if (!token || !*token)
|
||||
@@ -418,8 +358,6 @@ void Alias_ListAddParms(AliasListNode_t* node, const char* parameters)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: stub
|
||||
}
|
||||
|
||||
qboolean Alias_ListAdd(AliasList_t* list, const char* alias, const char* name, const char* parameters)
|
||||
|
||||
@@ -609,6 +609,7 @@ void CMod_LoadPatches( gamelump_t *surfs, gamelump_t *verts, int *shaderSubdivis
|
||||
vec3_t points[MAX_PATCH_VERTS];
|
||||
int width, height;
|
||||
int shaderNum;
|
||||
char tempName[MAX_QPATH + 1];
|
||||
|
||||
in = ( dsurface_t * )surfs->buffer;
|
||||
if( surfs->length % sizeof( *in ) )
|
||||
@@ -668,6 +669,9 @@ void CMod_LoadPatches( gamelump_t *surfs, gamelump_t *verts, int *shaderSubdivis
|
||||
|
||||
// create the internal facet structure
|
||||
patch->pc = CM_GeneratePatchCollide( width, height, points, patch->subdivisions );
|
||||
|
||||
sprintf(tempName, "s%d", i);
|
||||
UI_LoadResource(tempName);
|
||||
}
|
||||
|
||||
Hunk_FreeTempMemory( shaderSubdivisions );
|
||||
@@ -878,9 +882,9 @@ void CM_LoadMap( const char *name, qboolean clientload, int *checksum ) {
|
||||
((int *)&header)[i] = LittleLong ( ((int *)&header)[i]);
|
||||
}
|
||||
|
||||
if ( header.version != BSP_VERSION ) {
|
||||
Com_Error (ERR_DROP, "CM_LoadMap: %s has wrong version number (%i should be %i)"
|
||||
, name, header.version, BSP_VERSION );
|
||||
if ( header.version < BSP_MIN_VERSION || header.version > BSP_MAX_VERSION ) {
|
||||
Com_Error (ERR_DROP, "CM_LoadMap: %s has wrong version number (%i should be between %i and %i)"
|
||||
, name, header.version, BSP_MIN_VERSION, BSP_MAX_VERSION );
|
||||
}
|
||||
|
||||
cmod_base = ( byte * )&header;
|
||||
|
||||
@@ -284,7 +284,7 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
|
||||
static int errorCount;
|
||||
int currentTime;
|
||||
|
||||
#ifdef _DEBUG
|
||||
#ifdef COM_ERROR_ASSERT
|
||||
*( int * )0 = 0;
|
||||
assert( 0 );
|
||||
#endif
|
||||
|
||||
+12
-6
@@ -3068,7 +3068,7 @@ static void FS_ReorderPurePaks( void )
|
||||
FS_Startup
|
||||
================
|
||||
*/
|
||||
static void FS_Startup( const char *gameName )
|
||||
static void FS_Startup(const char* gameName, const char* extensionName)
|
||||
{
|
||||
const char* homePath;
|
||||
|
||||
@@ -3087,10 +3087,16 @@ static void FS_Startup( const char *gameName )
|
||||
fs_gamedirvar = Cvar_Get( "fs_game", "", CVAR_INIT | CVAR_SYSTEMINFO );
|
||||
fs_restrict = Cvar_Get( "fs_restrict", "", CVAR_INIT );
|
||||
|
||||
FS_AddGameDirectory( fs_basepath->string, gameName );
|
||||
if (gameName) {
|
||||
FS_AddGameDirectory(fs_basepath->string, gameName);
|
||||
}
|
||||
|
||||
if( *fs_gamedirvar->string && !Q_stricmp( gameName, "main" ) && Q_stricmp( fs_gamedirvar->string, gameName ) ) {
|
||||
FS_AddGameDirectory( fs_basepath->string, fs_gamedirvar->string );
|
||||
if (Q_stricmp(gameName, extensionName)) {
|
||||
FS_AddGameDirectory(fs_basepath->string, extensionName);
|
||||
}
|
||||
|
||||
if (*fs_gamedirvar->string && !Q_stricmp(gameName, GAME_EXTENSION_BASE) && Q_stricmp(fs_gamedirvar->string, gameName)) {
|
||||
FS_AddGameDirectory(fs_basepath->string, fs_gamedirvar->string);
|
||||
}
|
||||
|
||||
fs_mapdir = Cvar_Get( "mapdir", "", 0 );
|
||||
@@ -3594,7 +3600,7 @@ void FS_InitFilesystem( void ) {
|
||||
Com_StartupVariable( "fs_homepath" );
|
||||
|
||||
// try to start up normally
|
||||
FS_Startup( BASEGAME );
|
||||
FS_Startup( BASEGAME, GAME_EXTENSION_BASE);
|
||||
FS_SetRestrictions();
|
||||
|
||||
if( !silentStart ) {
|
||||
@@ -3640,7 +3646,7 @@ void FS_Restart( int checksumFeed ) {
|
||||
FS_ClearPakReferences(0);
|
||||
|
||||
// try to start up normally
|
||||
FS_Startup( BASEGAME );
|
||||
FS_Startup(BASEGAME, GAME_EXTENSION_BASE);
|
||||
|
||||
FS_CheckPak0( );
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ void* MEM_TempAlloc::CreateBlock(size_t len)
|
||||
// allocate a new block
|
||||
tempBlock_t* prev_block = m_CurrentMemoryBlock;
|
||||
m_CurrentMemoryBlock = (tempBlock_t*)MEM_TempAllocate(
|
||||
sizeof(tempBlock_t) + max(m_BlockSize, len));
|
||||
sizeof(tempBlock_t) + Q_max(m_BlockSize, len));
|
||||
m_CurrentMemoryBlock->prev = prev_block;
|
||||
return m_CurrentMemoryBlock->GetData();
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ void Z_Free( void *ptr )
|
||||
block->prev = block;
|
||||
block->next = block;
|
||||
|
||||
#if !defined(_DEBUG) && !defined(WIN32)
|
||||
#if !defined(_DEBUG) || !defined(WIN32)
|
||||
// free the block
|
||||
free( block );
|
||||
#else
|
||||
@@ -172,7 +172,7 @@ void *Z_TagMalloc( size_t size, int tag )
|
||||
#endif
|
||||
size = PAD( size, sizeof( intptr_t ) ); // align to 32/64 bit boundary
|
||||
|
||||
#if !defined(_DEBUG) && !defined(WIN32)
|
||||
#if !defined(_DEBUG) || !defined(WIN32)
|
||||
block = ( memblock_t * )malloc( size );
|
||||
#else
|
||||
block = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
|
||||
+560
-190
@@ -32,10 +32,10 @@ int oldsize = 0;
|
||||
// TA stuff
|
||||
//===================
|
||||
|
||||
static constexpr unsigned int MAX_PACKED_COORD = 65536;
|
||||
static constexpr unsigned int MAX_PACKED_COORD_HALF = MAX_PACKED_COORD / 2;
|
||||
static constexpr unsigned int MAX_PACKED_COORD_EXTRA = 262144;
|
||||
static constexpr unsigned int MAX_PACKED_COORD_EXTRA_HALF = MAX_PACKED_COORD_EXTRA / 2;
|
||||
static constexpr int MAX_PACKED_COORD = 65536;
|
||||
static constexpr int MAX_PACKED_COORD_HALF = MAX_PACKED_COORD / 2;
|
||||
static constexpr int MAX_PACKED_COORD_EXTRA = 262144;
|
||||
static constexpr int MAX_PACKED_COORD_EXTRA_HALF = MAX_PACKED_COORD_EXTRA / 2;
|
||||
|
||||
//===
|
||||
// Statistics for changes reporting
|
||||
@@ -161,7 +161,7 @@ int overflows;
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
int MSG_NegateValue(int value)
|
||||
int MSG_WriteNegateValue(int value, int bits)
|
||||
{
|
||||
if (value >= 0) {
|
||||
value <<= 1;
|
||||
@@ -173,13 +173,34 @@ int MSG_NegateValue(int value)
|
||||
return value;
|
||||
}
|
||||
|
||||
int MSG_ReadNegateValue(int value, int bits)
|
||||
{
|
||||
if (value & 1) {
|
||||
value = ~(value >> 1);
|
||||
}
|
||||
else {
|
||||
value >>= 1;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int MSG_NegateValue(int value)
|
||||
int MSG_WriteNegateValue(int value, int bits)
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
int MSG_ReadNegateValue(int value, int bits)
|
||||
{
|
||||
if (value & (1 << (bits - 1))) {
|
||||
value |= -1 ^ ((1 << bits) - 1);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// negative bit values include signs
|
||||
@@ -216,8 +237,9 @@ void MSG_WriteBits( msg_t *msg, int value, int bits ) {
|
||||
}
|
||||
if ( bits < 0 ) {
|
||||
bits = -bits;
|
||||
value = MSG_NegateValue(value);
|
||||
value = MSG_WriteNegateValue(value, bits);
|
||||
}
|
||||
|
||||
if (msg->oob) {
|
||||
if (msg->cursize + (bits >> 3) > msg->maxsize) {
|
||||
msg->overflowed = qtrue;
|
||||
@@ -326,10 +348,9 @@ int MSG_ReadBits( msg_t *msg, int bits ) {
|
||||
}
|
||||
msg->readcount = (msg->bit>>3)+1;
|
||||
}
|
||||
|
||||
if (sgn) {
|
||||
if (value & (1 << (bits - 1))) {
|
||||
value |= -1 ^ ((1 << bits) - 1);
|
||||
}
|
||||
value = MSG_ReadNegateValue(value, bits);
|
||||
}
|
||||
|
||||
return value;
|
||||
@@ -417,6 +438,32 @@ void MSG_WriteString( msg_t *sb, const char *s ) {
|
||||
}
|
||||
}
|
||||
|
||||
void MSG_WriteBigString( msg_t *sb, const char *s ) {
|
||||
if ( !s ) {
|
||||
MSG_WriteByte(sb, 0);
|
||||
} else {
|
||||
size_t l;
|
||||
int i;
|
||||
char string[BIG_INFO_STRING];
|
||||
|
||||
l = strlen( s );
|
||||
if ( l >= BIG_INFO_STRING ) {
|
||||
Com_Printf("MSG_WriteString: BIG_INFO_STRING");
|
||||
MSG_WriteByte(sb, 0);
|
||||
return;
|
||||
}
|
||||
Q_strncpyz( string, s, sizeof( string ) );
|
||||
|
||||
for ( i = 0 ; i <= l ; i++ ) {
|
||||
MSG_WriteByte(sb, string[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
void MSG_WriteScrambledString(msg_t* sb, const char* s) {
|
||||
if (!s) {
|
||||
strstats[0]++;
|
||||
@@ -444,28 +491,6 @@ void MSG_WriteScrambledString(msg_t* sb, const char* s) {
|
||||
}
|
||||
}
|
||||
|
||||
void MSG_WriteBigString( msg_t *sb, const char *s ) {
|
||||
if ( !s ) {
|
||||
MSG_WriteByte(sb, 0);
|
||||
} else {
|
||||
size_t l;
|
||||
int i;
|
||||
char string[BIG_INFO_STRING];
|
||||
|
||||
l = strlen( s );
|
||||
if ( l >= BIG_INFO_STRING ) {
|
||||
Com_Printf("MSG_WriteString: BIG_INFO_STRING");
|
||||
MSG_WriteByte(sb, 0);
|
||||
return;
|
||||
}
|
||||
Q_strncpyz( string, s, sizeof( string ) );
|
||||
|
||||
for ( i = 0 ; i <= l ; i++ ) {
|
||||
MSG_WriteByte(sb, string[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MSG_WriteScrambledBigString(msg_t* sb, const char* s) {
|
||||
if (!s) {
|
||||
strstats[0]++;
|
||||
@@ -493,6 +518,18 @@ void MSG_WriteScrambledBigString(msg_t* sb, const char* s) {
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void MSG_WriteScrambledString(msg_t* sb, const char* s) {
|
||||
return MSG_WriteString(sb, s);
|
||||
}
|
||||
|
||||
void MSG_WriteScrambledBigString(msg_t* sb, const char* s) {
|
||||
return MSG_WriteBigString(sb, s);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void MSG_WriteAngle( msg_t *sb, float f ) {
|
||||
MSG_WriteByte (sb, (int)(f*256/360) & 255);
|
||||
}
|
||||
@@ -598,6 +635,8 @@ float MSG_ReadFloat( msg_t *msg ) {
|
||||
return dat.f;
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
char* MSG_ReadScrambledString(msg_t* msg) {
|
||||
static char string[MAX_STRING_CHARS];
|
||||
int l, c;
|
||||
@@ -610,6 +649,9 @@ char* MSG_ReadScrambledString(msg_t* msg) {
|
||||
}
|
||||
|
||||
c = NetByteToStrChar[c];
|
||||
if (!c) {
|
||||
break;
|
||||
}
|
||||
// translate all fmt spec to avoid crash bugs
|
||||
if (c == '%') {
|
||||
c = '.';
|
||||
@@ -629,6 +671,52 @@ char* MSG_ReadScrambledString(msg_t* msg) {
|
||||
return string;
|
||||
}
|
||||
|
||||
char* MSG_ReadScrambledBigString(msg_t* msg) {
|
||||
static char string[BIG_INFO_STRING];
|
||||
int l, c;
|
||||
|
||||
l = 0;
|
||||
do {
|
||||
c = MSG_ReadByte(msg); // use ReadByte so -1 is out of bounds
|
||||
if (c == -1) {
|
||||
break;
|
||||
}
|
||||
|
||||
c = NetByteToStrChar[c];
|
||||
if (!c) {
|
||||
break;
|
||||
}
|
||||
// translate all fmt spec to avoid crash bugs
|
||||
if (c == '%') {
|
||||
c = '.';
|
||||
}
|
||||
// don't allow higher ascii values
|
||||
// (su44: this check is missing in MoHAA)
|
||||
if (c > 127) {
|
||||
c = '.';
|
||||
}
|
||||
|
||||
string[l] = c;
|
||||
l++;
|
||||
} while (l < sizeof(string) - 1);
|
||||
|
||||
string[l] = 0;
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
char* MSG_ReadScrambledString(msg_t* msg) {
|
||||
return MSG_ReadString(msg);
|
||||
}
|
||||
|
||||
char* MSG_ReadScrambledBigString(msg_t* msg) {
|
||||
return MSG_ReadBigString(msg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
char *MSG_ReadString( msg_t *msg ) {
|
||||
static char string[MAX_STRING_CHARS];
|
||||
int l,c;
|
||||
@@ -721,7 +809,6 @@ void MSG_GetNullEntityState(entityState_t *nullState) {
|
||||
nullState->alpha = 1.0f;
|
||||
nullState->scale = 1.0f;
|
||||
nullState->parent = ENTITYNUM_NONE;
|
||||
nullState->tag_num = -1; // su44
|
||||
nullState->constantLight = 0xffffff;
|
||||
nullState->renderfx = 16;
|
||||
nullState->bone_tag[4] = -1;
|
||||
@@ -1171,6 +1258,157 @@ typedef struct {
|
||||
// using the stringizing operator to save typing...
|
||||
#define NETF(x) #x,(size_t)&((entityState_t*)0)->x
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
netField_t entityStateFields[] =
|
||||
{
|
||||
{ NETF(netorigin[0]), 0, netFieldType_t::coord },
|
||||
{ NETF(netorigin[1]), 0, netFieldType_t::coord },
|
||||
{ NETF(netangles[1]), 12, netFieldType_t::angle },
|
||||
{ NETF(frameInfo[0].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[1].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(bone_angles[0][0]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[3][0]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[1][0]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[2][0]), -13, netFieldType_t::angle },
|
||||
{ NETF(netorigin[2]), 0, netFieldType_t::coord },
|
||||
{ NETF(frameInfo[0].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[1].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[2].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[3].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[0].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[1].index), 12, netFieldType_t::regular },
|
||||
{ NETF(actionWeight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[2].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[3].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[2].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[3].index), 12, netFieldType_t::regular },
|
||||
{ NETF(eType), 8, netFieldType_t::regular },
|
||||
{ NETF(modelindex), 16, netFieldType_t::regular },
|
||||
{ NETF(parent), 16, netFieldType_t::regular },
|
||||
{ NETF(constantLight), 32, netFieldType_t::regular },
|
||||
{ NETF(renderfx), 32, netFieldType_t::regular },
|
||||
{ NETF(bone_tag[0]), -8, netFieldType_t::regular },
|
||||
{ NETF(bone_tag[1]), -8, netFieldType_t::regular },
|
||||
{ NETF(bone_tag[2]), -8, netFieldType_t::regular },
|
||||
{ NETF(bone_tag[3]), -8, netFieldType_t::regular },
|
||||
{ NETF(bone_tag[4]), -8, netFieldType_t::regular },
|
||||
{ NETF(scale), 10, netFieldType_t::scale },
|
||||
{ NETF(alpha), 8, netFieldType_t::alpha },
|
||||
{ NETF(usageIndex), 16, netFieldType_t::regular },
|
||||
{ NETF(eFlags), 16, netFieldType_t::regular },
|
||||
{ NETF(solid), 32, netFieldType_t::regular },
|
||||
{ NETF(netangles[2]), 12, netFieldType_t::angle },
|
||||
{ NETF(netangles[0]), 12, netFieldType_t::angle },
|
||||
{ NETF(tag_num), 10, netFieldType_t::regular },
|
||||
{ NETF(bone_angles[1][2]), -13, netFieldType_t::angle },
|
||||
{ NETF(attach_use_angles), 1, netFieldType_t::regular },
|
||||
{ NETF(origin2[1]), 0, netFieldType_t::coord },
|
||||
{ NETF(origin2[0]), 0, netFieldType_t::coord },
|
||||
{ NETF(origin2[2]), 0, netFieldType_t::coord },
|
||||
{ NETF(bone_angles[0][2]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[2][2]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[3][2]), -13, netFieldType_t::angle },
|
||||
{ NETF(surfaces[0]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[1]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[2]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[3]), 8, netFieldType_t::regular },
|
||||
{ NETF(bone_angles[0][1]), -13, netFieldType_t::angle },
|
||||
{ NETF(surfaces[4]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[5]), 8, netFieldType_t::regular },
|
||||
{ NETF(pos.trTime), 32, netFieldType_t::regular },
|
||||
{ NETF(pos.trDelta[0]), 0, netFieldType_t::velocity },
|
||||
{ NETF(pos.trDelta[1]), 0, netFieldType_t::velocity },
|
||||
{ NETF(pos.trDelta[2]), 0, netFieldType_t::velocity },
|
||||
{ NETF(loopSound), 16, netFieldType_t::regular },
|
||||
{ NETF(loopSoundVolume), 0, netFieldType_t::regular },
|
||||
{ NETF(loopSoundMinDist), 0, netFieldType_t::regular },
|
||||
{ NETF(loopSoundMaxDist), 0, netFieldType_t::regular },
|
||||
{ NETF(loopSoundPitch), 0, netFieldType_t::regular },
|
||||
{ NETF(loopSoundFlags), 8, netFieldType_t::regular },
|
||||
{ NETF(attach_offset[0]), 0, netFieldType_t::regular },
|
||||
{ NETF(attach_offset[1]), 0, netFieldType_t::regular },
|
||||
{ NETF(attach_offset[2]), 0, netFieldType_t::regular },
|
||||
{ NETF(beam_entnum), 16, netFieldType_t::regular },
|
||||
{ NETF(skinNum), 16, netFieldType_t::regular },
|
||||
{ NETF(wasframe), 10, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[4].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[5].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[6].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[7].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[8].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[9].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[10].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[11].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[12].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[13].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[14].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[15].index), 12, netFieldType_t::regular },
|
||||
{ NETF(frameInfo[4].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[5].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[6].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[7].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[8].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[9].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[10].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[11].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[12].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[13].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[14].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[15].time), 15, netFieldType_t::animTime },
|
||||
{ NETF(frameInfo[4].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[5].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[6].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[7].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[8].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[9].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[10].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[11].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[12].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[13].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[14].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(frameInfo[15].weight), 8, netFieldType_t::animWeight },
|
||||
{ NETF(bone_angles[1][1]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[2][1]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[3][1]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[4][0]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[4][1]), -13, netFieldType_t::angle },
|
||||
{ NETF(bone_angles[4][2]), -13, netFieldType_t::angle },
|
||||
{ NETF(clientNum), 8, netFieldType_t::regular },
|
||||
{ NETF(groundEntityNum), GENTITYNUM_BITS, netFieldType_t::regular },
|
||||
{ NETF(shader_data[0]), 0, netFieldType_t::regular },
|
||||
{ NETF(shader_data[1]), 0, netFieldType_t::regular },
|
||||
{ NETF(shader_time), 0, netFieldType_t::regular },
|
||||
{ NETF(eyeVector[0]), 0, netFieldType_t::regular },
|
||||
{ NETF(eyeVector[1]), 0, netFieldType_t::regular },
|
||||
{ NETF(eyeVector[2]), 0, netFieldType_t::regular },
|
||||
{ NETF(surfaces[6]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[7]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[8]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[9]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[10]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[11]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[12]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[13]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[14]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[15]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[16]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[17]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[18]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[19]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[20]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[21]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[22]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[23]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[24]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[25]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[26]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[27]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[28]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[29]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[30]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[31]), 8, netFieldType_t::regular }
|
||||
};
|
||||
#else
|
||||
netField_t entityStateFields[] =
|
||||
{
|
||||
{ NETF(netorigin[0]), 0, netFieldType_t::coord },
|
||||
@@ -1320,6 +1558,7 @@ netField_t entityStateFields[] =
|
||||
{ NETF(surfaces[30]), 8, netFieldType_t::regular },
|
||||
{ NETF(surfaces[31]), 8, netFieldType_t::regular }
|
||||
};
|
||||
#endif
|
||||
static constexpr unsigned long numEntityFields = sizeof(entityStateFields) / sizeof(entityStateFields[0]);
|
||||
|
||||
// if (int)f == f and (int)f + ( 1<<(FLOAT_INT_BITS-1) ) < ( 1 << FLOAT_INT_BITS )
|
||||
@@ -1343,22 +1582,25 @@ void MSG_ReadRegular(msg_t* sb, int bits, void* toF)
|
||||
if (!MSG_ReadBits(sb, 1))
|
||||
{
|
||||
// integral float
|
||||
int32_t truncFloat = MSG_ReadBits(sb, -FLOAT_INT_BITS);
|
||||
// bias to allow equal parts positive and negative
|
||||
truncFloat -= FLOAT_INT_BIAS;
|
||||
*(float*)toF = (float)truncFloat;
|
||||
*(float*)toF = MSG_ReadBits(sb, -FLOAT_INT_BITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
// full floating point value
|
||||
*(float*)toF = MSG_ReadFloat(sb);
|
||||
unsigned int v = MSG_ReadBits(sb, 32);
|
||||
if (v & 1) {
|
||||
*(int*)toF = ((v + 0x7A000000) >> 1) | 0x80000000;
|
||||
}
|
||||
else {
|
||||
*(int*)toF = (v + 0x7A000000) >> 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MSG_ReadBits(msg, 1)) {
|
||||
*(int*)toF = MSG_ReadBits(msg, bits);
|
||||
if (MSG_ReadBits(sb, 1)) {
|
||||
*(int*)toF = MSG_ReadBits(sb, bits);
|
||||
}
|
||||
else {
|
||||
*(int*)toF = 0;
|
||||
@@ -1366,6 +1608,11 @@ void MSG_ReadRegular(msg_t* sb, int bits, void* toF)
|
||||
}
|
||||
}
|
||||
|
||||
void MSG_ReadRegularSimple(msg_t* sb, int bits, void* toF)
|
||||
{
|
||||
MSG_ReadRegular(sb, bits, toF);
|
||||
}
|
||||
|
||||
void MSG_WriteRegular(msg_t* sb, int bits, const void* toF)
|
||||
{
|
||||
float fullFloat;
|
||||
@@ -1382,16 +1629,19 @@ void MSG_WriteRegular(msg_t* sb, int bits, const void* toF)
|
||||
}
|
||||
else {
|
||||
MSG_WriteBits(sb, 1, 1);
|
||||
if (trunc == fullFloat && trunc + FLOAT_INT_BIAS >= 0 &&
|
||||
trunc + FLOAT_INT_BIAS < (1 << FLOAT_INT_BITS)) {
|
||||
if (trunc == fullFloat && trunc >= -4096 && trunc < 4096) {
|
||||
// send as small integer
|
||||
MSG_WriteBits(sb, 0, 1);
|
||||
MSG_WriteBits(sb, trunc + FLOAT_INT_BIAS, FLOAT_INT_BITS);
|
||||
MSG_WriteBits(sb, trunc, -FLOAT_INT_BITS);
|
||||
}
|
||||
else {
|
||||
// send as full floating point value
|
||||
int newvalue = *(int*)toF * 2 - 0x7A000000;
|
||||
if (*(int*)toF < 0) {
|
||||
newvalue |= 1;
|
||||
}
|
||||
MSG_WriteBits(sb, 1, 1);
|
||||
MSG_WriteBits(sb, *(int*)toF, 32);
|
||||
// send as full floating point value
|
||||
MSG_WriteBits(sb, newvalue, 32);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1418,9 +1668,9 @@ void MSG_WriteEntityNum(msg_t* sb, short number)
|
||||
MSG_WriteBits(sb, (number + 1) % MAX_GENTITIES, GENTITYNUM_BITS);
|
||||
}
|
||||
|
||||
short MSG_ReadEntityNum(msg_t* sb)
|
||||
unsigned short MSG_ReadEntityNum(msg_t* sb)
|
||||
{
|
||||
return (MSG_ReadBits(sb, GENTITYNUM_BITS) - 1) % MAX_GENTITIES;
|
||||
return (unsigned short)(MSG_ReadBits(sb, GENTITYNUM_BITS) - 1) % MAX_GENTITIES;
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -1436,7 +1686,7 @@ void MSG_ReadRegular(msg_t* sb, int bits, void* toF)
|
||||
else
|
||||
{
|
||||
if (!MSG_ReadBits(sb, 1)) {
|
||||
*(float*)toF = (float)MSG_ReadBits(sb, FLOAT_INT_BITS);
|
||||
*(float*)toF = (int)MSG_ReadBits(sb, FLOAT_INT_BITS) - FLOAT_INT_BIAS;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1456,6 +1706,28 @@ void MSG_ReadRegular(msg_t* sb, int bits, void* toF)
|
||||
}
|
||||
}
|
||||
|
||||
void MSG_ReadRegularSimple(msg_t* sb, int bits, void* toF)
|
||||
{
|
||||
if (bits == 0) {
|
||||
// float
|
||||
if (MSG_ReadBits(sb, 1) == 0) {
|
||||
// integral float
|
||||
int trunc = MSG_ReadBits(sb, FLOAT_INT_BITS);
|
||||
// bias to allow equal parts positive and negative
|
||||
trunc -= FLOAT_INT_BIAS;
|
||||
*(float*)toF = trunc;
|
||||
}
|
||||
else {
|
||||
// full floating point value
|
||||
*(int*)toF = MSG_ReadBits(sb, 32);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// integer
|
||||
*(int*)toF = MSG_ReadBits(sb, bits);
|
||||
}
|
||||
}
|
||||
|
||||
void MSG_WriteRegular(msg_t* sb, int bits, const void* toF)
|
||||
{
|
||||
float fullFloat;
|
||||
@@ -1530,7 +1802,7 @@ void MSG_WriteEntityNum(msg_t* sb, short number)
|
||||
MSG_WriteBits(sb, number % MAX_GENTITIES, GENTITYNUM_BITS);
|
||||
}
|
||||
|
||||
short MSG_ReadEntityNum(msg_t* sb)
|
||||
unsigned short MSG_ReadEntityNum(msg_t* sb)
|
||||
{
|
||||
return MSG_ReadBits(sb, GENTITYNUM_BITS) % MAX_GENTITIES;
|
||||
}
|
||||
@@ -1568,7 +1840,7 @@ void MSG_WriteDeltaEntity( msg_t *msg, struct entityState_s *from, struct entity
|
||||
if ( from == NULL ) {
|
||||
return;
|
||||
}
|
||||
MSG_WriteBits( msg, from->number, GENTITYNUM_BITS );
|
||||
MSG_WriteEntityNum(msg, from->number);
|
||||
MSG_WriteBits( msg, 1, 1 );
|
||||
return;
|
||||
}
|
||||
@@ -1813,19 +2085,69 @@ int MSG_PackCoordExtra(float coord)
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
float MSG_ReadPackedAngle(msg_t* msg, int bits)
|
||||
{
|
||||
int packed = MSG_ReadBits(msg, abs(bits));
|
||||
return MSG_UnpackAngle(packed, bits);
|
||||
}
|
||||
|
||||
float MSG_ReadPackedAnimTime(msg_t* msg, int bits, float fromValue, float frameTime)
|
||||
{
|
||||
int packed;
|
||||
if (!MSG_ReadBits(msg, 1)) {
|
||||
return fromValue + frameTime;
|
||||
}
|
||||
|
||||
packed = MSG_ReadBits(msg, bits);
|
||||
return MSG_UnpackAnimTime(packed);
|
||||
}
|
||||
|
||||
float MSG_ReadPackedAnimWeight(msg_t* msg, int bits)
|
||||
{
|
||||
int packed = MSG_ReadBits(msg, bits);
|
||||
return MSG_UnpackAnimWeight(packed, bits);
|
||||
}
|
||||
|
||||
float MSG_ReadPackedScale(msg_t* msg, int bits)
|
||||
{
|
||||
int packed = MSG_ReadBits(msg, bits);
|
||||
return MSG_UnpackScale(packed);
|
||||
}
|
||||
|
||||
float MSG_ReadPackedAlpha(msg_t* msg, int bits)
|
||||
{
|
||||
int packed = MSG_ReadBits(msg, bits);
|
||||
return MSG_UnpackAlpha(packed, bits);
|
||||
}
|
||||
|
||||
float MSG_ReadPackedCoord(msg_t* msg, float fromValue, int bits)
|
||||
{
|
||||
int packedFrom = MSG_PackCoord(fromValue);
|
||||
int packedTo = MSG_ReadDeltaCoord(msg, packedFrom);
|
||||
return MSG_UnpackCoord(packedTo, bits);
|
||||
}
|
||||
|
||||
float MSG_ReadPackedCoordExtra(msg_t* msg, float fromValue, int bits)
|
||||
{
|
||||
int packedFrom = MSG_PackCoordExtra(fromValue);
|
||||
int packedTo = MSG_ReadDeltaCoordExtra(msg, packedFrom);
|
||||
return MSG_UnpackCoordExtra(packedTo, bits);
|
||||
}
|
||||
|
||||
void MSG_WritePackedAngle(msg_t* msg, float value, int bits)
|
||||
{
|
||||
int packed = MSG_PackAngle(value, bits);
|
||||
MSG_WriteBits(msg, packed, bits);
|
||||
MSG_WriteBits(msg, packed, abs(bits));
|
||||
}
|
||||
|
||||
void MSG_WritePackedAnimTime(msg_t* msg, float fromValue, float toValue, float frameTime, int bits)
|
||||
{
|
||||
int packed;
|
||||
|
||||
if (abs(fromValue - toValue) < frameTime) {
|
||||
if (fabs(fromValue - toValue) < frameTime) {
|
||||
// below the frame time, don't send
|
||||
MSG_WriteBits(msg, 0, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
MSG_WriteBits(msg, 1, 1);
|
||||
@@ -1923,6 +2245,80 @@ qboolean MSG_DeltaNeeded(const void* fromField, const void* toField, int fieldTy
|
||||
|
||||
#else
|
||||
|
||||
float MSG_ReadPackedAngle(msg_t* msg, int bits)
|
||||
{
|
||||
int result;
|
||||
float tmp = 1.0f;
|
||||
if (bits < 0) {
|
||||
if (MSG_ReadBits(msg, 1))
|
||||
tmp = -1.0f;
|
||||
bits = ~bits;
|
||||
}
|
||||
|
||||
result = MSG_ReadBits(msg, bits);
|
||||
switch (bits)
|
||||
{
|
||||
case 8:
|
||||
return tmp * 360.f / 256.f;
|
||||
case 12:
|
||||
return tmp * result * 360.f / 4096.f;
|
||||
case 16:
|
||||
return tmp * result * 360.f / 65536.f;
|
||||
default:
|
||||
return tmp * 360.f / (1 << bits) * result;
|
||||
}
|
||||
}
|
||||
|
||||
float MSG_ReadPackedAnimTime(msg_t* msg, int bits, float fromValue, float frameTime)
|
||||
{
|
||||
return MSG_ReadBits(msg, 15) / 100.0f;
|
||||
}
|
||||
|
||||
float MSG_ReadPackedAnimWeight(msg_t* msg, int bits)
|
||||
{
|
||||
float tmp = MSG_ReadBits(msg, 8) / 255.0f;
|
||||
if (tmp < 0.0f)
|
||||
return 0.0f;
|
||||
else if (tmp > 1.0f)
|
||||
return 1.0f;
|
||||
else
|
||||
return tmp;
|
||||
}
|
||||
|
||||
float MSG_ReadPackedScale(msg_t* msg, int bits)
|
||||
{
|
||||
return MSG_ReadBits(msg, 10) / 100.0f;
|
||||
}
|
||||
|
||||
float MSG_ReadPackedAlpha(msg_t* msg, int bits)
|
||||
{
|
||||
float tmp = MSG_ReadBits(msg, 8) / 255.0f;
|
||||
if (tmp < 0.0f)
|
||||
return 0.0f;
|
||||
else if (tmp > 1.0f)
|
||||
return 1.0f;
|
||||
else
|
||||
return tmp;
|
||||
}
|
||||
|
||||
float MSG_ReadPackedCoord(msg_t* msg, float fromValue, int bits)
|
||||
{
|
||||
float tmp = 1.0f;
|
||||
int value = MSG_ReadBits(msg, 19);
|
||||
if (value & 262144) // test for 19th bit
|
||||
tmp = -1.0f;
|
||||
value &= ~262144; // remove that bit
|
||||
return tmp * value / 16.0f;
|
||||
}
|
||||
|
||||
float MSG_ReadPackedCoordExtra(msg_t* msg, float fromValue, int bits)
|
||||
{
|
||||
int packedFrom = MSG_PackCoordExtra(fromValue);
|
||||
int packedTo = MSG_ReadDeltaCoordExtra(msg, packedFrom);
|
||||
return MSG_UnpackCoordExtra(packedTo, bits);
|
||||
}
|
||||
|
||||
|
||||
void MSG_WritePackedAngle(msg_t* msg, float value, int bits)
|
||||
{
|
||||
// angles, what a mess! it wouldnt surprise me if something goes wrong here ;)
|
||||
@@ -2044,6 +2440,25 @@ qboolean MSG_DeltaNeeded(const void* fromField, const void* toField, int fieldTy
|
||||
|
||||
#endif
|
||||
|
||||
float MSG_ReadPackedVelocity(msg_t* msg, int bits)
|
||||
{
|
||||
float tmp = 1.0f;
|
||||
int value = MSG_ReadBits(msg, 17);
|
||||
if (value & 65536) // test for 17th bit
|
||||
tmp = -1.0f;
|
||||
value &= ~65536; // remove that bit
|
||||
return tmp * value / 8.0f;
|
||||
}
|
||||
|
||||
int MSG_ReadPackedSimple(msg_t* msg, int fromValue, int bits)
|
||||
{
|
||||
if (!MSG_ReadBits(msg, 1)) {
|
||||
return fromValue;
|
||||
}
|
||||
|
||||
return MSG_ReadBits(msg, bits);
|
||||
}
|
||||
|
||||
void MSG_WritePackedVelocity(msg_t* msg, float value, int bits)
|
||||
{
|
||||
int32_t packed = (uint32_t)(value * 8.0f);
|
||||
@@ -2159,99 +2574,34 @@ void MSG_ReadDeltaEntity( msg_t *msg, entityState_t *from, entityState_t *to,
|
||||
} else {
|
||||
switch (field->type) {
|
||||
case netFieldType_e::regular:
|
||||
if ( field->bits == 0 ) {
|
||||
// float
|
||||
if ( MSG_ReadBits( msg, 1 ) == 0 ) {
|
||||
*(float *)toF = 0.0f;
|
||||
} else {
|
||||
if ( MSG_ReadBits( msg, 1 ) == 0 ) {
|
||||
// integral float
|
||||
trunc = MSG_ReadBits( msg, FLOAT_INT_BITS );
|
||||
// bias to allow equal parts positive and negative
|
||||
trunc -= FLOAT_INT_BIAS;
|
||||
*(float *)toF = trunc;
|
||||
if ( print ) {
|
||||
Com_Printf( "%s:%i ", field->name, trunc );
|
||||
}
|
||||
} else {
|
||||
// full floating point value
|
||||
*toF = MSG_ReadBits( msg, 32 );
|
||||
if ( print ) {
|
||||
Com_Printf( "%s:%f ", field->name, *(float *)toF );
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ( MSG_ReadBits( msg, 1 ) == 0 ) {
|
||||
*toF = 0;
|
||||
} else {
|
||||
// integer
|
||||
*toF = MSG_ReadBits( msg, field->bits );
|
||||
if ( print ) {
|
||||
Com_Printf( "%s:%i ", field->name, *toF );
|
||||
}
|
||||
}
|
||||
}
|
||||
MSG_ReadRegular(msg, field->bits, toF);
|
||||
break;
|
||||
case netFieldType_e::angle: // angles, what a mess! it wouldnt surprise me if something goes wrong here ;)
|
||||
tmp = 1.0f;
|
||||
if ( field->bits < 0 ) {
|
||||
if ( MSG_ReadBits( msg, 1 ) )
|
||||
tmp = -1.0f;
|
||||
bits = ~field->bits;
|
||||
}
|
||||
else bits = field->bits;
|
||||
|
||||
result = MSG_ReadBits( msg, bits );
|
||||
if ( bits == 12 )
|
||||
*(float *)toF = result * 0.087890625f * tmp;
|
||||
else if ( bits == 8 )
|
||||
*(float *)toF = result * 1.411764705882353f * tmp;
|
||||
else if ( bits == 16 )
|
||||
*(float *)toF = result * 0.0054931640625f * tmp;
|
||||
else
|
||||
*(float *)toF = result * (1 << bits) * tmp / 360.0f;
|
||||
*(float*)toF = MSG_ReadPackedAngle(msg, field->bits);
|
||||
break;
|
||||
case netFieldType_e::animTime: // time
|
||||
*(float *)toF = MSG_ReadBits( msg, 15 ) * 0.0099999998f;
|
||||
*(float*)toF = MSG_ReadPackedAnimTime(msg, field->bits, *(float*)fromF, frameTime);
|
||||
break;
|
||||
case netFieldType_e::animWeight: // nasty!
|
||||
tmp = MSG_ReadBits( msg, 8 ) / 255.0f;
|
||||
if ( tmp < 0.0f )
|
||||
*(float *)toF = 0.0f;
|
||||
else if ( tmp > 1.0f )
|
||||
*(float *)toF = 1.0f;
|
||||
else
|
||||
*(float *)toF = tmp;
|
||||
// FPU instructions yay
|
||||
*(float*)toF = MSG_ReadPackedAnimWeight(msg, field->bits);
|
||||
break;
|
||||
case netFieldType_e::scale:
|
||||
*(float *)toF = MSG_ReadBits( msg, 10 ) *0.0099999998f;
|
||||
*(float*)toF = MSG_ReadPackedScale(msg, field->bits);
|
||||
break;
|
||||
case netFieldType_e::alpha:
|
||||
tmp = MSG_ReadBits( msg, 8 ) / 255.0f;
|
||||
if ( tmp < 0.0f )
|
||||
*(float *)toF = 0.0f;
|
||||
else if ( tmp > 1.0f )
|
||||
*(float *)toF = 1.0f;
|
||||
else
|
||||
*(float *)toF = tmp;
|
||||
*(float*)toF = MSG_ReadPackedAlpha(msg, field->bits);
|
||||
break;
|
||||
case netFieldType_e::coord:
|
||||
tmp = 1.0f;
|
||||
bits = MSG_ReadBits( msg, 19 );
|
||||
if ( bits & 262144 ) // test for 19th bit
|
||||
tmp = -1.0f;
|
||||
bits &= ~262144; // remove that bit
|
||||
*(float *)toF = tmp * bits / 16.0f;
|
||||
*(float*)toF = MSG_ReadPackedCoord(msg, *(float*)fromF, field->bits);
|
||||
break;
|
||||
case netFieldType_e::coordExtra:
|
||||
*(float*)toF = MSG_ReadPackedCoordExtra(msg, *(float*)fromF, field->bits);
|
||||
break;
|
||||
case netFieldType_e::velocity:
|
||||
tmp = 1.0f;
|
||||
bits = MSG_ReadBits( msg, 17 );
|
||||
if ( bits & 65536 ) // test for 17th bit
|
||||
tmp = -1.0f;
|
||||
bits &= ~65536; // remove that bit
|
||||
*(float *)toF = tmp * bits / 8.0f;
|
||||
*(float*)toF = MSG_ReadPackedVelocity(msg, field->bits);
|
||||
break;
|
||||
case netFieldType_e::simple:
|
||||
*(int*)toF = MSG_ReadPackedSimple(msg, *(int*)fromF, field->bits);
|
||||
break;
|
||||
default:
|
||||
Com_Error( ERR_DROP, "MSG_ReadDeltaEntity: unrecognized entity field type %i for field\n", i );
|
||||
@@ -2329,6 +2679,16 @@ float MSG_UnpackAnimTime(int packed)
|
||||
return packed / 100.f;
|
||||
}
|
||||
|
||||
float MSG_UnpackAnimWeight(int result, int bits)
|
||||
{
|
||||
const int32_t max = (1 << bits) - 1;
|
||||
const float tmp = (float)result / (float)max;
|
||||
|
||||
if (tmp < 0.0f) return 0.f;
|
||||
else if (tmp > 1.0f) return 1.f;
|
||||
else return tmp;
|
||||
}
|
||||
|
||||
float MSG_UnpackScale(int packed)
|
||||
{
|
||||
return packed / 100.f;
|
||||
@@ -2501,6 +2861,66 @@ plyer_state_t communication
|
||||
// using the stringizing operator to save typing...
|
||||
#define PSF(x) #x,(size_t)&((playerState_t*)0)->x
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
netField_t playerStateFields[] =
|
||||
{
|
||||
{ PSF(commandTime), 32, netFieldType_t::regular },
|
||||
{ PSF(origin[0]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(origin[1]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(viewangles[1]), 0, netFieldType_t::regular },
|
||||
{ PSF(velocity[1]), 0, netFieldType_t::velocity },
|
||||
{ PSF(velocity[0]), 0, netFieldType_t::velocity },
|
||||
{ PSF(viewangles[0]), 0, netFieldType_t::regular },
|
||||
{ PSF(origin[2]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(velocity[2]), 0, netFieldType_t::velocity },
|
||||
{ PSF(iViewModelAnimChanged), 2, netFieldType_t::regular },
|
||||
{ PSF(damage_angles[0]), -13, netFieldType_t::angle },
|
||||
{ PSF(damage_angles[1]), -13, netFieldType_t::angle },
|
||||
{ PSF(damage_angles[2]), -13, netFieldType_t::angle },
|
||||
{ PSF(speed), 16, netFieldType_t::regular },
|
||||
{ PSF(delta_angles[1]), 16, netFieldType_t::regular },
|
||||
{ PSF(viewheight), -8, netFieldType_t::regular },
|
||||
{ PSF(groundEntityNum), GENTITYNUM_BITS, netFieldType_t::regular },
|
||||
{ PSF(delta_angles[0]), 16, netFieldType_t::regular },
|
||||
{ PSF(iViewModelAnim), 4, netFieldType_t::regular },
|
||||
{ PSF(fov), 0, netFieldType_t::regular },
|
||||
{ PSF(current_music_mood), 8, netFieldType_t::regular },
|
||||
{ PSF(gravity), 16, netFieldType_t::regular },
|
||||
{ PSF(fallback_music_mood), 8, netFieldType_t::regular },
|
||||
{ PSF(music_volume), 0, netFieldType_t::regular },
|
||||
{ PSF(pm_flags), 16, netFieldType_t::regular },
|
||||
{ PSF(clientNum), 8, netFieldType_t::regular },
|
||||
{ PSF(fLeanAngle), 0, netFieldType_t::regular },
|
||||
{ PSF(blend[3]), 0, netFieldType_t::regular },
|
||||
{ PSF(blend[0]), 0, netFieldType_t::regular },
|
||||
{ PSF(pm_type), 8, netFieldType_t::regular },
|
||||
{ PSF(feetfalling), 8, netFieldType_t::regular },
|
||||
{ PSF(radarInfo), 26, netFieldType_t::regular },
|
||||
{ PSF(camera_angles[0]), 16, netFieldType_t::angle },
|
||||
{ PSF(camera_angles[1]), 16, netFieldType_t::angle },
|
||||
{ PSF(camera_angles[2]), 16, netFieldType_t::angle },
|
||||
{ PSF(camera_origin[0]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(camera_origin[1]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(camera_origin[2]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(camera_posofs[0]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(camera_posofs[2]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(camera_time), 0, netFieldType_t::regular },
|
||||
{ PSF(voted), 1, netFieldType_t::regular },
|
||||
{ PSF(bobCycle), 8, netFieldType_t::regular },
|
||||
{ PSF(delta_angles[2]), 16, netFieldType_t::regular },
|
||||
{ PSF(viewangles[2]), 0, netFieldType_t::regular },
|
||||
{ PSF(music_volume_fade_time), 0, netFieldType_t::regular },
|
||||
{ PSF(reverb_type), 6, netFieldType_t::regular },
|
||||
{ PSF(reverb_level), 0, netFieldType_t::regular },
|
||||
{ PSF(blend[1]), 0, netFieldType_t::regular },
|
||||
{ PSF(blend[2]), 0, netFieldType_t::regular },
|
||||
{ PSF(camera_offset[0]), 0, netFieldType_t::regular },
|
||||
{ PSF(camera_offset[1]), 0, netFieldType_t::regular },
|
||||
{ PSF(camera_offset[2]), 0, netFieldType_t::regular },
|
||||
{ PSF(camera_posofs[1]), 0, netFieldType_t::coordExtra },
|
||||
{ PSF(camera_flags), 16, netFieldType_t::regular }
|
||||
};
|
||||
#else
|
||||
netField_t playerStateFields[] =
|
||||
{
|
||||
{ PSF(commandTime), 32, netFieldType_t::regular },
|
||||
@@ -2559,6 +2979,7 @@ netField_t playerStateFields[] =
|
||||
{ PSF(camera_posofs[1]), 0, netFieldType_t::coord },
|
||||
{ PSF(camera_flags), 16, netFieldType_t::regular }
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
=============
|
||||
@@ -2793,80 +3214,29 @@ void MSG_ReadDeltaPlayerstate(msg_t *msg, playerState_t *from, playerState_t *to
|
||||
|
||||
numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] );
|
||||
lc = MSG_ReadByte(msg);
|
||||
//Com_DPrintf( "===\nMSG_ReadDeltaPlayerstate: count %i\n===\n", lc );
|
||||
assert(lc <= numFields);
|
||||
for ( i = 0, field = playerStateFields ; i < lc ; i++, field++ ) {
|
||||
fromF = (int *)( (byte *)from + field->offset );
|
||||
toF = (int *)( (byte *)to + field->offset );
|
||||
//Com_DPrintf( "field %s ", field->name );
|
||||
if ( ! MSG_ReadBits( msg, 1 ) ) {
|
||||
// no change
|
||||
*toF = *fromF;
|
||||
//Com_DPrintf( "NO CHANGE " );
|
||||
//Com_DPrintf( "value int %i, float %f\n", *toF, *(float *)toF );
|
||||
} else {
|
||||
//Com_DPrintf( "type %i, ", field->type );
|
||||
switch ( field->type ) {
|
||||
case netFieldType_e::regular:
|
||||
if ( field->bits == 0 ) {
|
||||
// float
|
||||
if ( MSG_ReadBits( msg, 1 ) == 0 ) {
|
||||
// integral float
|
||||
trunc = MSG_ReadBits( msg, FLOAT_INT_BITS );
|
||||
// bias to allow equal parts positive and negative
|
||||
trunc -= FLOAT_INT_BIAS;
|
||||
*(float *)toF = trunc;
|
||||
if ( print ) {
|
||||
Com_Printf( "%s:%i ", field->name, trunc );
|
||||
}
|
||||
} else {
|
||||
// full floating point value
|
||||
*toF = MSG_ReadBits( msg, 32 );
|
||||
if ( print ) {
|
||||
Com_Printf( "%s:%f ", field->name, *(float *)toF );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// integer
|
||||
*toF = MSG_ReadBits( msg, field->bits );
|
||||
if ( print ) {
|
||||
Com_Printf( "%s:%i ", field->name, *toF );
|
||||
}
|
||||
}
|
||||
MSG_ReadRegularSimple(msg, field->bits, toF);
|
||||
break;
|
||||
case netFieldType_e::angle:
|
||||
tmp = 1.0f;
|
||||
if ( field->bits < 0 ) {
|
||||
if ( MSG_ReadBits( msg, 1 ) )
|
||||
tmp = -1.0f;
|
||||
bits = - field->bits -1;
|
||||
}
|
||||
else bits = field->bits;
|
||||
|
||||
result = MSG_ReadBits( msg, bits );
|
||||
if ( field->bits == 12 )
|
||||
*(float *)toF = result * 0.087890625f * tmp;
|
||||
else if ( field->bits == 8 )
|
||||
*(float *)toF = result * 1.411764705882353f * tmp;
|
||||
else if ( field->bits == 16 )
|
||||
*(float *)toF = result * 0.0054931640625f * tmp;
|
||||
else
|
||||
*(float *)toF = result * (1 << bits) * tmp / 360.0f;
|
||||
*(float*)toF = MSG_ReadPackedAngle(msg, field->bits);
|
||||
break;
|
||||
case netFieldType_e::coord:
|
||||
tmp = 1.0f;
|
||||
bits = MSG_ReadBits( msg, 19 );
|
||||
if ( bits & 262144 ) // test for 19th bit
|
||||
tmp = -1.0f;
|
||||
bits &= ~262144; // 4294705151; // remove that bit
|
||||
*(float *)toF = tmp * bits / 16.0f;
|
||||
*(float*)toF = MSG_ReadPackedCoord(msg, *(float*)fromF, field->bits);
|
||||
break;
|
||||
case netFieldType_e::coordExtra:
|
||||
*(float*)toF = MSG_ReadPackedCoordExtra(msg, *(float*)fromF, field->bits);
|
||||
break;
|
||||
case netFieldType_e::velocity:
|
||||
tmp = 1.0f;
|
||||
bits = MSG_ReadBits( msg, 17 );
|
||||
if ( bits & 65536 ) // test for 17th bit
|
||||
tmp = -1.0f;
|
||||
bits &= ~65536; // 4294901759; // remove that bit
|
||||
*(float *)toF = tmp * bits / 8.0f;
|
||||
*(float*)toF = MSG_ReadPackedVelocity(msg, field->bits);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -346,6 +346,8 @@ short ShortSwapPtr(const void* l);
|
||||
int LongSwapPtr(const void* l);
|
||||
short ShortNoSwapPtr(const void* l);
|
||||
int LongNoSwapPtr(const void* l);
|
||||
float FloatSwapPtr(const void* l);
|
||||
float FloatNoSwapPtr(const void* l);
|
||||
|
||||
#if defined( Q3_BIG_ENDIAN ) && defined( Q3_LITTLE_ENDIAN )
|
||||
#error "Endianness defined as both big and little"
|
||||
@@ -354,11 +356,16 @@ int LongNoSwapPtr(const void* l);
|
||||
#define CopyLittleShort(dest, src) CopyShortSwap(dest, src)
|
||||
#define CopyLittleLong(dest, src) CopyLongSwap(dest, src)
|
||||
|
||||
//
|
||||
// Those Little*Ptr are used to avoid alignment problems
|
||||
//
|
||||
|
||||
#define LittleShort(x) ShortSwap(x)
|
||||
#define LittleLong(x) LongSwap(x)
|
||||
#define LittleFloat(x) FloatSwap(&x)
|
||||
#define LittleShortPtr(x) ShortSwapPtr(&x)
|
||||
#define LittleLongPtr(x) LongSwapPtr(&x)
|
||||
#define LittleFloatPtr(x) FloatSwapPtr(&x)
|
||||
|
||||
#define BigShort
|
||||
#define BigLong
|
||||
@@ -376,6 +383,7 @@ int LongNoSwapPtr(const void* l);
|
||||
#define LittleFloat
|
||||
#define LittleShortPtr(x) ShortNoSwapPtr(&x)
|
||||
#define LittleLongPtr(x) LongNoSwapPtr(&x)
|
||||
#define LittleFloatPtr(x) FloatNoSwapPtr(&x)
|
||||
|
||||
#define BigShort(x) ShortSwap(x)
|
||||
#define BigLong(x) LongSwap(x)
|
||||
|
||||
@@ -1552,6 +1552,20 @@ int LongNoSwapPtr(const void* l)
|
||||
return out;
|
||||
}
|
||||
|
||||
float FloatSwapPtr(const void* l)
|
||||
{
|
||||
float out;
|
||||
CopyLittleLong((int*)&out, l);
|
||||
return out;
|
||||
}
|
||||
|
||||
float FloatNoSwapPtr(const void* l)
|
||||
{
|
||||
float out;
|
||||
Com_Memcpy(&out, l, sizeof(float));
|
||||
return out;
|
||||
}
|
||||
|
||||
void Swap_Init(void)
|
||||
{
|
||||
// Endianness is now computed at compile time
|
||||
|
||||
+83
-100
@@ -29,14 +29,38 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define PRODUCT_NAME "OpenMoHAA"
|
||||
#define PRODUCT_VERSION "0.50-alpha"
|
||||
#define PRODUCT_DATE __DATE__
|
||||
#define PRODUCT_NAME "OpenMoHAA"
|
||||
|
||||
//
|
||||
// Version
|
||||
//
|
||||
// These values are the only one that must be set for the version
|
||||
#define PRODUCT_VERSION_MAJOR 0
|
||||
#define PRODUCT_VERSION_MINOR 53
|
||||
#define PRODUCT_VERSION_PATCH 2
|
||||
#define PRODUCT_VERSION_STAGE "alpha"
|
||||
|
||||
//
|
||||
// Version display
|
||||
//
|
||||
#define PRODUCT_VERSION_NUMBER_STRING XSTRING(PRODUCT_VERSION_MAJOR) "." XSTRING(PRODUCT_VERSION_MINOR) "." XSTRING(PRODUCT_VERSION_PATCH)
|
||||
#define PRODUCT_VERSION PRODUCT_VERSION_NUMBER_STRING "-" PRODUCT_VERSION_STAGE
|
||||
#define PRODUCT_DATE __DATE__
|
||||
|
||||
#define BASEGAME "main"
|
||||
|
||||
//
|
||||
// The target type specifies which content pack the engine targets.
|
||||
//
|
||||
// Note: An universal client is not currently possible without refactoring the network and the file system.
|
||||
// Pak files must be reloaded on-the-fly depending on the server the client is connecting to.
|
||||
//
|
||||
#if TARGET_GAME_TYPE == 1
|
||||
//
|
||||
// Team Assault
|
||||
#define BASEGAME "mainta"
|
||||
#define PRODUCT_EXTENSION "Spearhead"
|
||||
//
|
||||
#define GAME_EXTENSION_BASE "mainta"
|
||||
#define PRODUCT_EXTENSION "spearhead"
|
||||
// The version string must be equal or above 2.0 to be able to connect to spearhead servers
|
||||
#define TARGET_GAME_VERSION "2.16"
|
||||
#define TARGET_GAME_PROTOCOL 17
|
||||
@@ -46,10 +70,12 @@ extern "C" {
|
||||
#define HOMEPATH_NAME_WIN "mohta"
|
||||
#define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN
|
||||
#elif TARGET_GAME_TYPE == 2
|
||||
//
|
||||
// Team Tactics
|
||||
#define BASEGAME "maintt"
|
||||
#define PRODUCT_EXTENSION "Breakthrough"
|
||||
// The version string must be equal or above 2.0 to be able to connect to breakthrough servers
|
||||
//
|
||||
#define GAME_EXTENSION_BASE "maintt"
|
||||
#define PRODUCT_EXTENSION "breakthrough"
|
||||
// The version string must be equal or above 2.0 to be able to connect to breakthrough servers
|
||||
#define TARGET_GAME_VERSION "2.41"
|
||||
#define TARGET_GAME_PROTOCOL 17
|
||||
#define TARGET_GAME_NAME "mohaab"
|
||||
@@ -58,11 +84,13 @@ extern "C" {
|
||||
#define HOMEPATH_NAME_WIN "mohtt"
|
||||
#define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN
|
||||
#else
|
||||
// The default: the base game (no expansion)
|
||||
|
||||
#define BASEGAME "main"
|
||||
#define PRODUCT_EXTENSION "Base"
|
||||
// The version string must be below 1.12, otherwise it's not possible to connect
|
||||
//
|
||||
// Base game
|
||||
//
|
||||
|
||||
#define GAME_EXTENSION_BASE "main"
|
||||
#define PRODUCT_EXTENSION "base"
|
||||
// The version string must be 1.1x or below, otherwise it's not possible to connect
|
||||
#define TARGET_GAME_VERSION "1.12"
|
||||
#define TARGET_GAME_PROTOCOL 8
|
||||
#define TARGET_GAME_NAME "mohaa"
|
||||
@@ -72,11 +100,11 @@ extern "C" {
|
||||
#define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN
|
||||
#endif
|
||||
|
||||
#define PRODUCT_NAME_FULL PRODUCT_NAME ": " PRODUCT_EXTENSION
|
||||
#define PRODUCT_VERSION_FULL PRODUCT_VERSION " (for " TARGET_GAME_VERSION ")"
|
||||
#define PRODUCT_NAME_FULL PRODUCT_NAME " - v" PRODUCT_VERSION " - ext-" PRODUCT_EXTENSION
|
||||
#define PRODUCT_VERSION_FULL PRODUCT_NAME_FULL
|
||||
|
||||
#define CLIENT_WINDOW_TITLE "OpenMoHAA"
|
||||
#define CLIENT_WINDOW_MIN_TITLE "OpenMoHAA"
|
||||
#define CLIENT_WINDOW_TITLE PRODUCT_NAME
|
||||
#define CLIENT_WINDOW_MIN_TITLE PRODUCT_NAME
|
||||
|
||||
#define MAX_TEAMNAME 32
|
||||
|
||||
@@ -426,6 +454,7 @@ enum {
|
||||
MESSAGE_CHAT_WHITE,
|
||||
MESSAGE_WHITE,
|
||||
MESSAGE_CHAT_RED,
|
||||
MESSAGE_CHAT_GREEN,
|
||||
MESSAGE_MAX
|
||||
};
|
||||
|
||||
@@ -456,34 +485,6 @@ enum {
|
||||
#define HUD_MESSAGE_CHAT_WHITE "\x02"
|
||||
#define HUD_MESSAGE_CHAT_RED "\x04"
|
||||
|
||||
#define CGM_HUDDRAW_SHADER 27
|
||||
#define CGM_HUDDRAW_ALIGN 28
|
||||
#define CGM_HUDDRAW_RECT 29
|
||||
#define CGM_HUDDRAW_VIRTUALSIZE 30
|
||||
#define CGM_HUDDRAW_COLOR 31
|
||||
#define CGM_HUDDRAW_ALPHA 32
|
||||
#define CGM_HUDDRAW_STRING 33
|
||||
#define CGM_HUDDRAW_FONT 34
|
||||
#define CGM_HUDDRAW_TIMER 38
|
||||
#define CGM_HUDDRAW_3D 39
|
||||
#define CGM_HUDDRAW_BREAK3D 40
|
||||
#define CGM_HUDDRAW_FADE 41
|
||||
#define CGM_HUDDRAW_MOVE 42
|
||||
#define CGM_HUDDRAW_SCALE 43
|
||||
#define CGM_VIEWMODELANIM 44
|
||||
#define CGM_VIEWMODELPREFIX 45
|
||||
#define CGM_MODHEIGHTFLOAT 46
|
||||
#define CGM_SETVMASPEED 47
|
||||
#define CGM_HINTSTRING 48
|
||||
#define CGM_PLAYLOCALSOUND 49
|
||||
#define CGM_SETLOCALSOUNDRATE 50
|
||||
#define CGM_STOPLOCALSOUND 51
|
||||
#define CGM_HUDDRAW_RECTX 52
|
||||
#define CGM_HUDDRAW_RECTY 53
|
||||
#define CGM_HUDDRAW_RECTWH 54
|
||||
#define CGM_REPLICATION 55
|
||||
#define CGM_HUDDRAW_DELETE 56
|
||||
|
||||
extern vec4_t g_color_table[8];
|
||||
|
||||
#define MAKERGB( v, r, g, b ) v[0]=r;v[1]=g;v[2]=b
|
||||
@@ -501,11 +502,11 @@ extern vec4_t g_color_table[8];
|
||||
#define LERP( a, b, w ) ( ( a ) * ( 1.0f - ( w ) ) + ( b ) * ( w ) )
|
||||
#define LUMA( red, green, blue ) ( 0.2126f * ( red ) + 0.7152f * ( green ) + 0.0722f * ( blue ) )
|
||||
|
||||
#ifndef min
|
||||
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#ifndef Q_min
|
||||
#define Q_min(a,b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef max
|
||||
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#ifndef Q_max
|
||||
#define Q_max(a,b) (((a) > (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#define bound(a,minval,maxval) ( ((a) > (minval)) ? ( ((a) < (maxval)) ? (a) : (maxval) ) : (minval) )
|
||||
@@ -1597,7 +1598,7 @@ typedef enum
|
||||
|
||||
#define RESERVED_CONFIGSTRINGS 2 // game can't modify below this, only the system can
|
||||
|
||||
#define MAX_GAMESTATE_CHARS 32000
|
||||
#define MAX_GAMESTATE_CHARS 41952
|
||||
typedef struct {
|
||||
int stringOffsets[MAX_CONFIGSTRINGS];
|
||||
char stringData[MAX_GAMESTATE_CHARS];
|
||||
@@ -1608,7 +1609,7 @@ typedef struct {
|
||||
|
||||
// maybe this is better put somewhere else...
|
||||
typedef struct server_sound_s {
|
||||
float origin[3];
|
||||
vec3_t origin;
|
||||
int entity_number;
|
||||
int channel;
|
||||
short int sound_index;
|
||||
@@ -1703,6 +1704,11 @@ typedef struct playerState_s {
|
||||
float camera_posofs[3];
|
||||
int camera_flags;
|
||||
float damage_angles[3];
|
||||
// --
|
||||
// Team Assault
|
||||
int radarInfo;
|
||||
qboolean voted;
|
||||
// --
|
||||
|
||||
// not communicated over the net at all
|
||||
int ping; // server to game info for scoreboard
|
||||
@@ -1712,44 +1718,29 @@ typedef struct playerState_s {
|
||||
|
||||
//====================================================================
|
||||
|
||||
#define BUTTON_ATTACKRIGHT_BITINDEX 0
|
||||
#define BUTTON_ATTACKLEFT_BITINDEX 1
|
||||
#define BUTTON_SNEAK_BITINDEX 2
|
||||
#define BUTTON_RUN_BITINDEX 3
|
||||
#define BUTTON_HOLSTERWEAPON_BITINDEX 4
|
||||
#define BUTTON_USE_BITINDEX 5
|
||||
#define BUTTON_TALK_BITINDEX 6 // displays talk balloon and disables actions
|
||||
#define BUTTON_ANY_BITINDEX 11 // any key whatsoever
|
||||
#define BUTTON_MOUSE_BITINDEX 14 // mouse move
|
||||
|
||||
//
|
||||
// usercmd_t->button bits, many of which are generated by the client system,
|
||||
// so they aren't game/cgame only definitions
|
||||
// so they aren't game-only definitions
|
||||
//
|
||||
#define BUTTON_ATTACK 1 // +/-attackprimary
|
||||
#define BUTTON_ATTACK2 2 // +/-attacksecondary
|
||||
#define BUTTON_RUN 4 // +/-speed
|
||||
// walking can't just be infered from MOVE_RUN
|
||||
// because a key pressed late in the frame will
|
||||
// only generate a small move value for that frame
|
||||
// walking will use different animations and
|
||||
// won't generate footsteps
|
||||
#define BUTTON_ATTACKLEFT_BITINDEX 0
|
||||
#define BUTTON_ATTACKRIGHT_BITINDEX 1
|
||||
#define BUTTON_RUN_BITINDEX 2
|
||||
#define BUTTON_USE_BITINDEX 3
|
||||
#define BUTTON_LEAN_LEFT_BITINDEX 4
|
||||
#define BUTTON_LEAN_RIGHT_BITINDEX 5
|
||||
#define BUTTON_TALK_BITINDEX 6 // displays talk balloon and disables actions
|
||||
#define BUTTON_ANY_BITINDEX 14 // any key whatsoever
|
||||
#define BUTTON_MOUSE_BITINDEX 15 // mouse move
|
||||
|
||||
#define BUTTON_USE 8
|
||||
#define BUTTON_LEANLEFT 16 // +/-leanleft
|
||||
#define BUTTON_LEANRIGHT 32 // +/-leanright
|
||||
#define BUTTON_NEGATIVE 64
|
||||
|
||||
#define BUTTON_GETFLAG 128
|
||||
#define BUTTON_GUARDBASE 256
|
||||
#define BUTTON_PATROL 512
|
||||
#define BUTTON_FOLLOWME 1024
|
||||
|
||||
#define BUTTON_HOLSTER 32768
|
||||
|
||||
#define BUTTON_TALK ( 1 << BUTTON_TALK_BITINDEX ) // displays talk balloon and disables actions
|
||||
#define BUTTON_ANY ( 1 << BUTTON_ANY_BITINDEX ) // any key whatsoever
|
||||
#define BUTTON_MOUSE ( 1 << BUTTON_MOUSE_BITINDEX )
|
||||
#define BUTTON_ATTACKLEFT (1 << BUTTON_ATTACKLEFT_BITINDEX)
|
||||
#define BUTTON_ATTACKRIGHT (1 << BUTTON_ATTACKRIGHT_BITINDEX)
|
||||
#define BUTTON_RUN (1 << BUTTON_RUN_BITINDEX)
|
||||
#define BUTTON_USE (1 << BUTTON_USE_BITINDEX)
|
||||
#define BUTTON_LEAN_LEFT (1 << BUTTON_LEAN_LEFT_BITINDEX)
|
||||
#define BUTTON_LEAN_RIGHT (1 << BUTTON_LEAN_RIGHT_BITINDEX)
|
||||
#define BUTTON_TALK (1 << BUTTON_TALK_BITINDEX) // displays talk balloon and disables actions
|
||||
#define BUTTON_ANY (1 << BUTTON_ANY_BITINDEX) // any key whatsoever
|
||||
#define BUTTON_MOUSE (1 << BUTTON_MOUSE_BITINDEX)
|
||||
|
||||
#define WEAPON_COMMAND_USE_PISTOL 1
|
||||
#define WEAPON_COMMAND_USE_RIFLE 2
|
||||
@@ -1766,8 +1757,14 @@ typedef struct playerState_s {
|
||||
#define WEAPON_COMMAND_USE_LAST_WEAPON 13
|
||||
#define WEAPON_COMMAND_HOLSTER 14
|
||||
#define WEAPON_COMMAND_DROP 15
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
#define WEAPON_COMMAND_MAX 31
|
||||
#else
|
||||
#define WEAPON_COMMAND_MAX 15
|
||||
#define WEAPON_COMMAND_MASK WEAPON_COMMAND_MAX << 7
|
||||
#endif
|
||||
|
||||
#define WEAPON_COMMAND_MASK (WEAPON_COMMAND_MAX << 7)
|
||||
|
||||
|
||||
#define MOVE_RUN 120 // if forwardmove or rightmove are >= MOVE_RUN,
|
||||
@@ -2041,20 +2038,6 @@ typedef struct hdelement_s {
|
||||
struct fontheader_s *pFont;
|
||||
} hdelement_t;
|
||||
|
||||
enum vmAnim_e {
|
||||
VM_ANIM_IDLE,
|
||||
VM_ANIM_CHARGE,
|
||||
VM_ANIM_FIRE,
|
||||
VM_ANIM_FIRE_SECONDARY,
|
||||
VM_ANIM_RECHAMBER,
|
||||
VM_ANIM_RELOAD,
|
||||
VM_ANIM_RELOAD_SINGLE,
|
||||
VM_ANIM_RELOAD_END,
|
||||
VM_ANIM_PULLOUT,
|
||||
VM_ANIM_PUTAWAY,
|
||||
VM_ANIM_LADDERSTEP
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
frameInfo_t g_VMFrameInfo[MAX_FRAMEINFOS];
|
||||
|
||||
|
||||
@@ -83,7 +83,10 @@ void MSG_WriteLong (msg_t *sb, int c);
|
||||
void MSG_WriteFloat (msg_t *sb, float f);
|
||||
void MSG_WriteString (msg_t *sb, const char *s);
|
||||
void MSG_WriteBigString (msg_t *sb, const char *s);
|
||||
void MSG_WriteScrambledString(msg_t* sb, const char* s);
|
||||
void MSG_WriteScrambledBigString(msg_t* sb, const char* s);
|
||||
void MSG_WriteAngle16 (msg_t *sb, float f);
|
||||
void MSG_WriteEntityNum(msg_t* sb, short number);
|
||||
|
||||
void MSG_BeginReading (msg_t *sb);
|
||||
void MSG_BeginReadingOOB(msg_t *sb);
|
||||
@@ -104,9 +107,12 @@ float MSG_ReadFloat (msg_t *sb);
|
||||
char *MSG_ReadString (msg_t *sb);
|
||||
char *MSG_ReadBigString (msg_t *sb);
|
||||
char *MSG_ReadStringLine( msg_t *sb );
|
||||
char* MSG_ReadScrambledString(msg_t* msg);
|
||||
char* MSG_ReadScrambledBigString(msg_t* msg);
|
||||
float MSG_ReadAngle8( msg_t *sb );
|
||||
float MSG_ReadAngle16 (msg_t *sb);
|
||||
void MSG_ReadData (msg_t *sb, void *buffer, int size);
|
||||
unsigned short MSG_ReadEntityNum(msg_t* sb);
|
||||
|
||||
|
||||
void MSG_WriteDeltaUsercmd( msg_t *msg, struct usercmd_s *from, struct usercmd_s *to );
|
||||
@@ -158,6 +164,7 @@ void MSG_WritePackedSimple(msg_t* msg, int value, int bits);
|
||||
|
||||
float MSG_UnpackAngle(int value, int bits);
|
||||
float MSG_UnpackAnimTime(int packed);
|
||||
float MSG_UnpackAnimWeight(int result, int bits);
|
||||
float MSG_UnpackScale(int packed);
|
||||
float MSG_UnpackAlpha(int packed, int bits);
|
||||
float MSG_UnpackCoord(int packed, int bits);
|
||||
@@ -181,7 +188,7 @@ NET
|
||||
|
||||
#define PORT_ANY -1
|
||||
|
||||
#define MAX_RELIABLE_COMMANDS 64 // max string commands buffered for restransmit
|
||||
#define MAX_RELIABLE_COMMANDS 512 // max string commands buffered for restransmit
|
||||
|
||||
typedef enum {
|
||||
NA_BOT,
|
||||
|
||||
@@ -468,8 +468,8 @@ typedef struct {
|
||||
// little-endian "2015"
|
||||
|
||||
#define BSP_BETA_VERSION 18 // Beta Allied Assault
|
||||
#define BSP_BASE_VERSION 19 // vanilla Allied Assault
|
||||
#define BSP_VERSION 19 // current Allied Assault
|
||||
#define BSP_MIN_VERSION 18 // Beta Allied Assault
|
||||
#define BSP_MAX_VERSION 21 // Breakthrough
|
||||
|
||||
|
||||
// there shouldn't be any problem with increasing these values at the
|
||||
|
||||
@@ -582,7 +582,7 @@ const char* Script::GrabNextToken(qboolean crossline)
|
||||
*token_p++ = *script_p++;
|
||||
}
|
||||
|
||||
if (token_p == &token[MAXTOKEN]) {
|
||||
if (token_p == &token[SCRIPT_MAXTOKEN]) {
|
||||
FILE_Error(ERR_DROP, "Token too large on line %i in file %s\n",
|
||||
line, filename.c_str());
|
||||
}
|
||||
@@ -824,7 +824,7 @@ const char* Script::GetLine(qboolean crossline)
|
||||
start = script_p;
|
||||
SkipToEOL();
|
||||
size = script_p - start;
|
||||
if (size < (MAXTOKEN - 1)) {
|
||||
if (size < (SCRIPT_MAXTOKEN - 1)) {
|
||||
memcpy(token, start, size);
|
||||
token[size] = '\0';
|
||||
} else {
|
||||
@@ -859,7 +859,7 @@ const char* Script::GetRaw(void)
|
||||
start = script_p;
|
||||
SkipToEOL();
|
||||
size = script_p - start;
|
||||
if (size < (MAXTOKEN - 1)) {
|
||||
if (size < (SCRIPT_MAXTOKEN - 1)) {
|
||||
memset(token, 0, sizeof(token));
|
||||
memcpy(token, start, size);
|
||||
} else {
|
||||
@@ -946,7 +946,7 @@ const char* Script::GetString(qboolean crossline)
|
||||
startline, filename.c_str());
|
||||
}
|
||||
|
||||
if (token_p == &token[MAXTOKEN]) {
|
||||
if (token_p == &token[SCRIPT_MAXTOKEN]) {
|
||||
FILE_Error(ERR_DROP, "String too large on line %i in file %s\n",
|
||||
line, filename.c_str());
|
||||
}
|
||||
@@ -1075,7 +1075,7 @@ int Script::LinesInFile(void)
|
||||
qboolean temp_tokenready;
|
||||
const char* temp_script_p;
|
||||
int temp_line;
|
||||
char temp_token[MAXTOKEN];
|
||||
char temp_token[SCRIPT_MAXTOKEN];
|
||||
int numentries;
|
||||
|
||||
temp_tokenready = tokenready;
|
||||
|
||||
@@ -40,13 +40,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#define TOKENSPACE (' ')
|
||||
#define TOKENSPECIAL ('$')
|
||||
|
||||
#define MAXTOKEN 512
|
||||
#define SCRIPT_MAXTOKEN 512
|
||||
|
||||
typedef struct {
|
||||
qboolean tokenready;
|
||||
int offset;
|
||||
int line;
|
||||
char token[MAXTOKEN];
|
||||
char token[SCRIPT_MAXTOKEN];
|
||||
} scriptmarker_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -67,7 +67,7 @@ protected:
|
||||
Container<macro*> macrolist;
|
||||
|
||||
int line;
|
||||
char token[MAXTOKEN];
|
||||
char token[SCRIPT_MAXTOKEN];
|
||||
|
||||
qboolean releaseBuffer;
|
||||
qboolean hasError;
|
||||
|
||||
@@ -388,7 +388,7 @@ void TikiScript::AddMacro( const char *name, const char *expansion )
|
||||
return;
|
||||
}
|
||||
|
||||
if( nummacros >= MAXMACROS )
|
||||
if( nummacros >= TIKI_MAXMACROS )
|
||||
{
|
||||
TIKI_DPrintf( "Too many %cdefine in file %s\n", TOKENSPECIAL, Filename() );
|
||||
}
|
||||
@@ -420,7 +420,7 @@ qboolean TikiScript::ProcessCommand( qboolean crossline )
|
||||
char argument1[ 256 ];
|
||||
char argument2[ 256 ];
|
||||
|
||||
sscanf( script_p, "%c%s %s %s\n", &dummy, &command, &argument1, &argument2 );
|
||||
sscanf( script_p, "%c%s %s %s\n", &dummy, command, argument1, argument2 );
|
||||
|
||||
if( !stricmp( command, "define" ) )
|
||||
{
|
||||
@@ -760,7 +760,7 @@ const char *TikiScript::GetToken( qboolean crossline )
|
||||
*token_p++ = *i->script_p++;
|
||||
}
|
||||
|
||||
if( token_p == &i->token[ MAXTOKEN ] )
|
||||
if( token_p == &i->token[ TIKI_MAXTOKEN ] )
|
||||
{
|
||||
TIKI_DPrintf( "Token too large on line %i in file %s\n", i->line, i->Filename() );
|
||||
break;
|
||||
@@ -869,7 +869,7 @@ const char *TikiScript::GetLine( qboolean crossline )
|
||||
start = i->script_p;
|
||||
SkipToEOL();
|
||||
size = i->script_p - start;
|
||||
if( size < ( MAXTOKEN - 1 ) )
|
||||
if( size < ( TIKI_MAXTOKEN - 1 ) )
|
||||
{
|
||||
memcpy( i->token, start, size );
|
||||
i->token[ size ] = '\0';
|
||||
@@ -928,7 +928,7 @@ const char *TikiScript::GetAndIgnoreLine( qboolean crossline )
|
||||
start = script_p;
|
||||
SkipToEOL();
|
||||
size = script_p - start;
|
||||
if( size < ( MAXTOKEN - 1 ) )
|
||||
if( size < ( TIKI_MAXTOKEN - 1 ) )
|
||||
{
|
||||
memcpy( token, start, size );
|
||||
token[ size ] = '\0';
|
||||
@@ -981,7 +981,7 @@ const char *TikiScript::GetRaw( void )
|
||||
start = script_p;
|
||||
SkipToEOL();
|
||||
size = script_p - start;
|
||||
if( size < ( MAXTOKEN - 1 ) )
|
||||
if( size < ( TIKI_MAXTOKEN - 1 ) )
|
||||
{
|
||||
memset( token, 0, sizeof( token ) );
|
||||
memcpy( token, start, size );
|
||||
@@ -1086,7 +1086,7 @@ const char *TikiScript::GetString( qboolean crossline )
|
||||
"line %d in file %s\n", startline, i->filename );
|
||||
}
|
||||
|
||||
if( token_p == &i->token[ MAXTOKEN ] )
|
||||
if( token_p == &i->token[ TIKI_MAXTOKEN ] )
|
||||
{
|
||||
TIKI_DPrintf( "String too large on line %i in file %s\n", i->line, i->filename );
|
||||
}
|
||||
@@ -1192,7 +1192,7 @@ int TikiScript::LinesInFile( void )
|
||||
qboolean temp_tokenready;
|
||||
const char *temp_script_p;
|
||||
int temp_line;
|
||||
char temp_token[ MAXTOKEN ];
|
||||
char temp_token[ TIKI_MAXTOKEN ];
|
||||
int numentries;
|
||||
|
||||
temp_tokenready = tokenready;
|
||||
@@ -1232,7 +1232,7 @@ void TikiScript::Parse( char *data, int length, const char *name )
|
||||
Reset();
|
||||
this->length = length;
|
||||
end_p = script_p + length;
|
||||
strncpy( filename, name, MAXTOKEN );
|
||||
strncpy( filename, name, TIKI_MAXTOKEN );
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -32,21 +32,19 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#define TOKENSPACE (' ')
|
||||
#define TOKENSPECIAL ('$')
|
||||
|
||||
#ifndef MAXTOKEN
|
||||
#define MAXTOKEN 256
|
||||
#endif
|
||||
#define TIKI_MAXTOKEN 256
|
||||
|
||||
#define MAXMACROS 48
|
||||
#define TIKI_MAXMACROS 48
|
||||
|
||||
typedef struct {
|
||||
char name[ MAXTOKEN ];
|
||||
char macro[ MAXTOKEN ];
|
||||
char name[TIKI_MAXTOKEN];
|
||||
char macro[TIKI_MAXTOKEN];
|
||||
} tiki_macro_t;
|
||||
|
||||
typedef struct {
|
||||
const char *mark_script_p;
|
||||
qboolean mark_tokenready;
|
||||
char mark_token[ MAXTOKEN ];
|
||||
char mark_token[TIKI_MAXTOKEN];
|
||||
} tiki_mark_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -57,13 +55,13 @@ protected:
|
||||
qboolean tokenready;
|
||||
class TikiScript *include;
|
||||
class TikiScript *parent;
|
||||
char filename[ MAXTOKEN ];
|
||||
char filename[TIKI_MAXTOKEN];
|
||||
const char *script_p;
|
||||
const char *end_p;
|
||||
tiki_macro_t macros[ MAXMACROS ];
|
||||
tiki_macro_t macros[TIKI_MAXMACROS];
|
||||
int nummacros;
|
||||
int line;
|
||||
char token[ MAXTOKEN ];
|
||||
char token[TIKI_MAXTOKEN];
|
||||
qboolean releaseBuffer;
|
||||
tiki_mark_t mark[ 64 ];
|
||||
int mark_pos;
|
||||
|
||||
@@ -528,6 +528,34 @@ extern void ( APIENTRY * qglVertex4sv )(const GLshort *v);
|
||||
extern void ( APIENTRY * qglVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
|
||||
extern void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
|
||||
// GL_ARB_texture_compression
|
||||
extern void (APIENTRY* qglCompressedTexImage3DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
|
||||
extern void (APIENTRY* qglCompressedTexImage2DARB)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
|
||||
extern void (APIENTRY* qglCompressedTexSubImage3DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
|
||||
extern void (APIENTRY* qglCompressedTexSubImage2DARB)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
|
||||
extern void (APIENTRY* qglGetCompressedTexImageARB)(GLenum target, GLint lod, void* img);
|
||||
#ifndef GL_COMPRESSED_RGB_ARB
|
||||
#define GL_COMPRESSED_ALPHA_ARB 0x84E9
|
||||
#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
|
||||
#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
|
||||
#define GL_COMPRESSED_INTENSITY_ARB 0x84EC
|
||||
#define GL_COMPRESSED_RGB_ARB 0x84ED
|
||||
#define GL_COMPRESSED_RGBA_ARB 0x84EE
|
||||
#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
|
||||
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
|
||||
#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
|
||||
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
|
||||
#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
|
||||
#endif
|
||||
|
||||
// GL_EXT_texture_compression_s3tc
|
||||
#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
|
||||
#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
|
||||
#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
|
||||
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
|
||||
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
|
||||
#endif
|
||||
|
||||
#if defined( _WIN32 )
|
||||
|
||||
extern int ( WINAPI * qwglChoosePixelFormat )(HDC, CONST PIXELFORMATDESCRIPTOR *);
|
||||
|
||||
@@ -355,3 +355,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
#define qglVertexPointer glVertexPointer
|
||||
#define qglViewport glViewport
|
||||
|
||||
#define qglCompressedTexImage3DARB glCompressedTexImage3D
|
||||
#define qglCompressedTexImage2DARB glCompressedTexImage2D
|
||||
#define qglCompressedTexSubImage3DARB glCompressedTexSubImage3D
|
||||
#define qglCompressedTexSubImage2DARB glCompressedTexSubImage2D
|
||||
#define qglGetCompressedTexImageARB glGetCompressedTexImage
|
||||
+28
-30
@@ -717,7 +717,14 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
|
||||
continue;
|
||||
}
|
||||
oldSort = drawSurf->sort;
|
||||
R_DecomposeSort( drawSurf->sort, &entityNum, &shader, &dlightMap, &bStaticModel );
|
||||
if (*drawSurf->surface != SF_SPRITE) {
|
||||
R_DecomposeSort(drawSurf->sort, &entityNum, &shader, &dlightMap, &bStaticModel);
|
||||
} else {
|
||||
shader = tr.sortedShaders[((refSprite_t*)drawSurf->surface)->shaderNum];
|
||||
entityNum = ENTITYNUM_WORLD;
|
||||
dlightMap = 0;
|
||||
bStaticModel = qfalse;
|
||||
}
|
||||
|
||||
//
|
||||
// change the tess parameters if needed
|
||||
@@ -743,6 +750,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
|
||||
oldDlightMap = dlightMap;
|
||||
}
|
||||
|
||||
backEnd.currentSphere = &backEnd.spareSphere;
|
||||
//
|
||||
// change the modelview matrix if needed
|
||||
//
|
||||
@@ -799,7 +807,7 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
|
||||
if ( depthRange ) {
|
||||
qglDepthRange (0, 0.3);
|
||||
} else {
|
||||
qglDepthRange (0, 1);
|
||||
qglDepthRange (0, 1.875);
|
||||
}
|
||||
oldDepthRange = depthRange;
|
||||
}
|
||||
@@ -864,6 +872,10 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
|
||||
}
|
||||
}
|
||||
|
||||
if (*drawSurf->surface == SF_SPRITE) {
|
||||
backEnd.shaderStartTime = ((refSprite_t*)drawSurf->surface)->shaderTime;
|
||||
}
|
||||
|
||||
// add the triangles for this surface
|
||||
rb_surfaceTable[ *drawSurf->surface ]( drawSurf->surface );
|
||||
}
|
||||
@@ -878,7 +890,16 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
|
||||
// go back to the world modelview matrix
|
||||
qglLoadMatrixf( backEnd.viewParms.world.modelMatrix );
|
||||
if ( depthRange ) {
|
||||
qglDepthRange (0, 1);
|
||||
qglDepthRange (0, 1.875);
|
||||
}
|
||||
|
||||
RB_ShadowFinish();
|
||||
RB_RenderFlares();
|
||||
R_DrawLensFlares();
|
||||
if (g_bInfoworldtris)
|
||||
{
|
||||
g_bInfoworldtris = 0;
|
||||
R_PrintInfoWorldtris();
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -970,12 +991,12 @@ void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, int componen
|
||||
ri.Error (ERR_DROP, "Draw_StretchRaw: size not a power of 2: %i by %i", cols, rows);
|
||||
}
|
||||
|
||||
GL_Bind( tr.scratchImage[0] );
|
||||
GL_Bind( tr.scratchImage );
|
||||
|
||||
// if the scratchImage isn't in the format we want, specify it as a new texture
|
||||
if ( cols != tr.scratchImage[0]->width || rows != tr.scratchImage[0]->height ) {
|
||||
tr.scratchImage[0]->width = tr.scratchImage[0]->uploadWidth = cols;
|
||||
tr.scratchImage[0]->height = tr.scratchImage[0]->uploadHeight = rows;
|
||||
if ( cols != tr.scratchImage->width || rows != tr.scratchImage->height ) {
|
||||
tr.scratchImage->width = tr.scratchImage->uploadWidth = cols;
|
||||
tr.scratchImage->height = tr.scratchImage->uploadHeight = rows;
|
||||
qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||
@@ -1008,29 +1029,6 @@ void RE_StretchRaw (int x, int y, int w, int h, int cols, int rows, int componen
|
||||
qglEnd ();
|
||||
}
|
||||
|
||||
void RE_UploadCinematic (int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty) {
|
||||
|
||||
GL_Bind( tr.scratchImage[client] );
|
||||
|
||||
// if the scratchImage isn't in the format we want, specify it as a new texture
|
||||
if ( cols != tr.scratchImage[client]->width || rows != tr.scratchImage[client]->height ) {
|
||||
tr.scratchImage[client]->width = tr.scratchImage[client]->uploadWidth = cols;
|
||||
tr.scratchImage[client]->height = tr.scratchImage[client]->uploadHeight = rows;
|
||||
qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
|
||||
} else {
|
||||
if (dirty) {
|
||||
// otherwise, just subimage upload it so that drivers can tell we are going to be changing
|
||||
// it and don't try and do a texture compression
|
||||
qglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
RB_SetColor
|
||||
|
||||
+94
-147
@@ -261,6 +261,14 @@ static void R_LoadLightmaps(gamelump_t* l) {
|
||||
if ( r_lightmap->integer == 2 ) {
|
||||
ri.Printf( PRINT_ALL, "Brightest lightmap value: %d\n", ( int ) ( maxIntensity * 255 ) );
|
||||
}
|
||||
|
||||
if (r_fastdlights->integer) {
|
||||
s_worldData.lighting = NULL;
|
||||
}
|
||||
else {
|
||||
s_worldData.lighting = ri.Hunk_Alloc(l->length);
|
||||
Com_Memcpy(s_worldData.lighting, l->buffer, l->length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -478,7 +486,7 @@ void R_UnpackTerraPatch(cTerraPatch_t* pPacked, cTerraPatchUnpacked_t* pUnpacked
|
||||
pUnpacked->t = ((float)pPacked->t + 0.5) * 0.0078125;
|
||||
|
||||
if( s_worldData.lighting ) {
|
||||
pUnpacked->drawinfo.lmData = &s_worldData.lighting[ 3 * ( ( pPacked->t << 7 ) + pPacked->s + ( pPacked->iLightMap << 14 ) ) ];
|
||||
pUnpacked->drawinfo.lmData = &s_worldData.lighting[pPacked->iLightMap * (LIGHTMAP_SIZE * LIGHTMAP_SIZE * 3) + 3 * pPacked->s + 3 * 128 * pPacked->t];
|
||||
} else {
|
||||
pUnpacked->drawinfo.lmData = NULL;
|
||||
}
|
||||
@@ -607,9 +615,6 @@ static void ParseFace( dsurface_t *ds, drawVert_t *verts, msurface_t *surf, int
|
||||
|
||||
lightmapNum = LittleLong( ds->lightmapNum );
|
||||
|
||||
// get fog volume
|
||||
surf->fogIndex = LittleLong( ds->fogNum ) + 1;
|
||||
|
||||
// get shader value
|
||||
surf->shader = ShaderForShaderNum( ds->shaderNum, lightmapNum );
|
||||
if ( r_singleShader->integer && !surf->shader->isSky ) {
|
||||
@@ -661,6 +666,42 @@ static void ParseFace( dsurface_t *ds, drawVert_t *verts, msurface_t *surf, int
|
||||
SetPlaneSignbits( &cv->plane );
|
||||
cv->plane.type = PlaneTypeForNormal( cv->plane.normal );
|
||||
|
||||
if (tr.numLightmaps && lightmapNum != -1 && surf->shader->lightmapIndex >= 0)
|
||||
{
|
||||
float inv;
|
||||
|
||||
cv->lmX = LittleLong(ds->lightmapX);
|
||||
cv->lmY = LittleLong(ds->lightmapY);
|
||||
cv->lmWidth = LittleLong(ds->lightmapWidth);
|
||||
cv->lmHeight = LittleLong(ds->lightmapHeight);
|
||||
|
||||
if (s_worldData.lighting) {
|
||||
cv->lmData = &s_worldData.lighting[lightmapNum * (LIGHTMAP_SIZE * LIGHTMAP_SIZE * 3) + 3 * cv->lmX + 3 * 128 * cv->lmY];
|
||||
} else {
|
||||
cv->lmData = NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
cv->lmOrigin[j] = LittleFloat(ds->lightmapOrigin[j]);
|
||||
cv->lmVecs[0][j] = LittleFloat(ds->lightmapVecs[0][j]);
|
||||
cv->lmVecs[1][j] = LittleFloat(ds->lightmapVecs[1][j]);
|
||||
}
|
||||
|
||||
inv = VectorNormalize2(cv->lmVecs[0], cv->lmInverseVecs[0]);
|
||||
cv->lmInverseVecs[0][0] *= 1.0 / inv;
|
||||
cv->lmInverseVecs[0][1] *= 1.0 / inv;
|
||||
cv->lmInverseVecs[0][2] *= 1.0 / inv;
|
||||
|
||||
inv = VectorNormalize2(cv->lmVecs[1], cv->lmInverseVecs[1]);
|
||||
cv->lmInverseVecs[1][0] *= 1.0 / inv;
|
||||
cv->lmInverseVecs[1][1] *= 1.0 / inv;
|
||||
cv->lmInverseVecs[1][2] *= 1.0 / inv;
|
||||
}
|
||||
else
|
||||
{
|
||||
cv->lmData = NULL;
|
||||
}
|
||||
surf->data = (surfaceType_t *)cv;
|
||||
}
|
||||
|
||||
@@ -719,6 +760,19 @@ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, msurface_t *surf ) {
|
||||
grid = R_SubdividePatchToGrid( width, height, points );
|
||||
surf->data = (surfaceType_t *)grid;
|
||||
|
||||
if (tr.numLightmaps && lightmapNum != -1 && surf->shader->lightmapIndex >= 0)
|
||||
{
|
||||
grid->lmX = LittleLong(ds->lightmapX);
|
||||
grid->lmY = LittleLong(ds->lightmapY);
|
||||
grid->lmWidth = LittleLong(ds->lightmapWidth);
|
||||
grid->lmHeight = LittleLong(ds->lightmapHeight);
|
||||
if (s_worldData.lighting) {
|
||||
grid->lmData = &s_worldData.lighting[lightmapNum * (LIGHTMAP_SIZE * LIGHTMAP_SIZE * 3) + 3 * grid->lmX + 3 * 128 * grid->lmY];
|
||||
} else {
|
||||
grid->lmData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// copy the level of detail origin, which is the center
|
||||
// of the group of all curves that must subdivide the same
|
||||
// to avoid cracking
|
||||
@@ -1903,129 +1957,13 @@ static void R_LoadPlanes(gamelump_t* l) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_LoadFogs
|
||||
|
||||
=================
|
||||
*/
|
||||
static void R_LoadFogs(gamelump_t* l, gamelump_t* brushesLump, gamelump_t* sidesLump) {
|
||||
int i;
|
||||
fog_t* out;
|
||||
dfog_t* fogs;
|
||||
dbrush_t* brushes, * brush;
|
||||
dbrushside_t* sides;
|
||||
int count, brushesCount, sidesCount;
|
||||
int sideNum;
|
||||
int planeNum;
|
||||
shader_t* shader;
|
||||
float d;
|
||||
int firstSide;
|
||||
|
||||
fogs = l->buffer;
|
||||
if (l->length % sizeof(*fogs)) {
|
||||
ri.Error(ERR_DROP, "LoadMap: funny lump size in %s", s_worldData.name);
|
||||
}
|
||||
count = l->length / sizeof(*fogs);
|
||||
|
||||
// create fog strucutres for them
|
||||
s_worldData.numfogs = count + 1;
|
||||
s_worldData.fogs = ri.Hunk_Alloc(s_worldData.numfogs * sizeof(*out));
|
||||
out = s_worldData.fogs + 1;
|
||||
|
||||
if (!count) {
|
||||
return;
|
||||
}
|
||||
|
||||
brushes = brushesLump->buffer;
|
||||
if (brushesLump->length % sizeof(*brushes)) {
|
||||
ri.Error(ERR_DROP, "LoadMap: funny lump size in %s", s_worldData.name);
|
||||
}
|
||||
brushesCount = brushesLump->length / sizeof(*brushes);
|
||||
|
||||
sides = sidesLump->buffer;
|
||||
if (sidesLump->length % sizeof(*sides)) {
|
||||
ri.Error(ERR_DROP, "LoadMap: funny lump size in %s", s_worldData.name);
|
||||
}
|
||||
sidesCount = sidesLump->length / sizeof(*sides);
|
||||
|
||||
for (i = 0; i < count; i++, fogs++) {
|
||||
out->originalBrushNumber = LittleLong(fogs->brushNum);
|
||||
|
||||
if ((unsigned)out->originalBrushNumber >= brushesCount) {
|
||||
ri.Error(ERR_DROP, "fog brushNumber out of range");
|
||||
}
|
||||
brush = brushes + out->originalBrushNumber;
|
||||
|
||||
firstSide = LittleLong(brush->firstSide);
|
||||
|
||||
if ((unsigned)firstSide > sidesCount - 6) {
|
||||
ri.Error(ERR_DROP, "fog brush sideNumber out of range");
|
||||
}
|
||||
|
||||
// brushes are always sorted with the axial sides first
|
||||
sideNum = firstSide + 0;
|
||||
planeNum = LittleLong(sides[sideNum].planeNum);
|
||||
out->bounds[0][0] = -s_worldData.planes[planeNum].dist;
|
||||
|
||||
sideNum = firstSide + 1;
|
||||
planeNum = LittleLong(sides[sideNum].planeNum);
|
||||
out->bounds[1][0] = s_worldData.planes[planeNum].dist;
|
||||
|
||||
sideNum = firstSide + 2;
|
||||
planeNum = LittleLong(sides[sideNum].planeNum);
|
||||
out->bounds[0][1] = -s_worldData.planes[planeNum].dist;
|
||||
|
||||
sideNum = firstSide + 3;
|
||||
planeNum = LittleLong(sides[sideNum].planeNum);
|
||||
out->bounds[1][1] = s_worldData.planes[planeNum].dist;
|
||||
|
||||
sideNum = firstSide + 4;
|
||||
planeNum = LittleLong(sides[sideNum].planeNum);
|
||||
out->bounds[0][2] = -s_worldData.planes[planeNum].dist;
|
||||
|
||||
sideNum = firstSide + 5;
|
||||
planeNum = LittleLong(sides[sideNum].planeNum);
|
||||
out->bounds[1][2] = s_worldData.planes[planeNum].dist;
|
||||
|
||||
// get information from the shader for fog parameters
|
||||
shader = R_FindShader(fogs->shader, LIGHTMAP_NONE, qtrue, qtrue, qtrue, qtrue);
|
||||
|
||||
out->parms = shader->fogParms;
|
||||
|
||||
out->colorInt = ColorBytes4(shader->fogParms.color[0] * tr.identityLight,
|
||||
shader->fogParms.color[1] * tr.identityLight,
|
||||
shader->fogParms.color[2] * tr.identityLight, 1.0);
|
||||
|
||||
d = shader->fogParms.depthForOpaque < 1 ? 1 : shader->fogParms.depthForOpaque;
|
||||
out->tcScale = 1.0f / (d * 8);
|
||||
|
||||
// set the gradient vector
|
||||
sideNum = LittleLong(fogs->visibleSide);
|
||||
|
||||
if (sideNum == -1) {
|
||||
out->hasSurface = qfalse;
|
||||
}
|
||||
else {
|
||||
out->hasSurface = qtrue;
|
||||
planeNum = LittleLong(sides[firstSide + sideNum].planeNum);
|
||||
VectorSubtract(vec3_origin, s_worldData.planes[planeNum].normal, out->surface);
|
||||
out->surface[3] = -s_worldData.planes[planeNum].dist;
|
||||
}
|
||||
|
||||
out++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
R_LoadLightGrid
|
||||
|
||||
================
|
||||
*/
|
||||
void R_LoadLightGrid(gamelump_t* l) {
|
||||
void R_LoadLightGrid(gamelump_t* plPal, gamelump_t* plOffsets, gamelump_t* plData) {
|
||||
int i;
|
||||
vec3_t maxs;
|
||||
int numGridPoints;
|
||||
@@ -2034,35 +1972,51 @@ void R_LoadLightGrid(gamelump_t* l) {
|
||||
|
||||
w = &s_worldData;
|
||||
|
||||
w->lightGridInverseSize[0] = 1.0f / w->lightGridSize[0];
|
||||
w->lightGridInverseSize[1] = 1.0f / w->lightGridSize[1];
|
||||
w->lightGridInverseSize[2] = 1.0f / w->lightGridSize[2];
|
||||
if (!plPal->buffer || !plOffsets->buffer || !plData->buffer) {
|
||||
ri.Printf(PRINT_WARNING, "WARNING: No light grid data present\n");
|
||||
w->lightGridOffsets = 0;
|
||||
w->lightGridData = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
w->lightGridSize[0] = 32.0;
|
||||
w->lightGridSize[1] = 32.0;
|
||||
w->lightGridSize[2] = 32.0;
|
||||
w->lightGridOOSize[0] = 1.0f / w->lightGridSize[0];
|
||||
w->lightGridOOSize[1] = 1.0f / w->lightGridSize[1];
|
||||
w->lightGridOOSize[2] = 1.0f / w->lightGridSize[2];
|
||||
|
||||
wMins = w->bmodels[0].bounds[0];
|
||||
wMaxs = w->bmodels[0].bounds[1];
|
||||
|
||||
for ( i = 0 ; i < 3 ; i++ ) {
|
||||
w->lightGridOrigin[i] = w->lightGridSize[i] * ceil( wMins[i] / w->lightGridSize[i] );
|
||||
w->lightGridMins[i] = w->lightGridSize[i] * ceil( wMins[i] / w->lightGridSize[i] );
|
||||
maxs[i] = w->lightGridSize[i] * floor( wMaxs[i] / w->lightGridSize[i] );
|
||||
w->lightGridBounds[i] = (maxs[i] - w->lightGridOrigin[i])/w->lightGridSize[i] + 1;
|
||||
w->lightGridBounds[i] = (maxs[i] - w->lightGridMins[i])/w->lightGridSize[i] + 1;
|
||||
}
|
||||
|
||||
numGridPoints = w->lightGridBounds[0] * w->lightGridBounds[1] * w->lightGridBounds[2];
|
||||
numGridPoints = w->lightGridBounds[0] * w->lightGridBounds[1] + w->lightGridBounds[0];
|
||||
|
||||
if (l->length != numGridPoints * 8) {
|
||||
ri.Printf(PRINT_WARNING, "WARNING: light grid mismatch\n");
|
||||
if (plOffsets->length != numGridPoints * 2) {
|
||||
ri.Printf(PRINT_WARNING, "WARNING: light grid offset size mismatch\n");
|
||||
w->lightGridOffsets = NULL;
|
||||
w->lightGridData = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
w->lightGridData = ri.Hunk_Alloc(l->length);
|
||||
Com_Memcpy(w->lightGridData, (void*)l->buffer, l->length);
|
||||
|
||||
// deal with overbright bits
|
||||
for ( i = 0 ; i < numGridPoints ; i++ ) {
|
||||
R_ColorShiftLightingBytesAlpha( &w->lightGridData[i*8], &w->lightGridData[i*8] );
|
||||
R_ColorShiftLightingBytesAlpha( &w->lightGridData[i*8+3], &w->lightGridData[i*8+3] );
|
||||
if (plPal->length != 768) {
|
||||
ri.Printf(PRINT_WARNING, "WARNING: light grid palette size mismatch\n");
|
||||
w->lightGridOffsets = NULL;
|
||||
w->lightGridData = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
w->lightGridOffsets = ri.Hunk_Alloc(plOffsets->length);
|
||||
Com_Memcpy(w->lightGridOffsets, plOffsets->buffer, plOffsets->length);
|
||||
Com_Memcpy(w->lightGridPalette, plPal->buffer, sizeof(s_worldData.lightGridPalette));
|
||||
|
||||
w->lightGridData = ri.Hunk_Alloc(plData->length);
|
||||
Com_Memcpy(w->lightGridData, plData->buffer, plData->length);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2279,9 +2233,9 @@ void RE_LoadWorldMap( const char *name ) {
|
||||
c_gridVerts = 0;
|
||||
|
||||
i = LittleLong(header.version);
|
||||
if (i < BSP_BASE_VERSION || i > BSP_VERSION) {
|
||||
if (i < BSP_MIN_VERSION || i > BSP_MAX_VERSION) {
|
||||
ri.Error(ERR_DROP, "RE_LoadWorldMap: %s has wrong version number (%i should be between %i and %i)",
|
||||
name, i, BSP_BASE_VERSION, BSP_VERSION);
|
||||
name, i, BSP_MIN_VERSION, BSP_MAX_VERSION);
|
||||
}
|
||||
|
||||
// load into heap
|
||||
@@ -2339,13 +2293,7 @@ void RE_LoadWorldMap( const char *name ) {
|
||||
_R(75);
|
||||
R_FreeLump(&lump2);
|
||||
_R(76);
|
||||
numbrushsides = R_LoadLump(h, &header.lumps[LUMP_BRUSHSIDES], &lump2, sizeof(dbrushside_t));
|
||||
numbrushes = R_LoadLump(h, &header.lumps[LUMP_BRUSHES], &lump, sizeof(dbrush_t));
|
||||
numFogs = R_LoadLump(h, &header.lumps[LUMP_DUMMY10], &lump3, sizeof(dfog_t));
|
||||
R_LoadFogs(&lump3, &lump, &lump2);
|
||||
R_FreeLump(&lump);
|
||||
R_FreeLump(&lump2);
|
||||
R_FreeLump(&lump3);
|
||||
numFogs = 0;
|
||||
nummodels = R_LoadLump(h, &header.lumps[LUMP_MODELS], &lump, sizeof(bmodel_t));
|
||||
_R(77);
|
||||
R_LoadSubmodels(&lump);
|
||||
@@ -2364,8 +2312,7 @@ void RE_LoadWorldMap( const char *name ) {
|
||||
_R(84);
|
||||
g_iGridDataSize = R_LoadLump(h, &header.lumps[LUMP_LIGHTGRIDDATA], &lump3, sizeof(byte));
|
||||
_R(85);
|
||||
//R_LoadLightGrid( &lump, &lump2, &lump3 );
|
||||
R_LoadLightGrid(&lump3);
|
||||
R_LoadLightGrid( &lump, &lump2, &lump3 );
|
||||
_R(86);
|
||||
R_FreeLump(&lump);
|
||||
_R(87);
|
||||
|
||||
@@ -46,7 +46,7 @@ void R_PerformanceCounters( void ) {
|
||||
ri.SetPerformanceCounters(
|
||||
backEnd.pc.c_totalIndexes / 3,
|
||||
backEnd.pc.c_vertexes,
|
||||
R_SumOfUsedImages(pc_save.c_totalIndexes / 3, pc_save.c_vertexes),
|
||||
R_SumOfUsedImages(),
|
||||
pc_save.c_totalIndexes / 3,
|
||||
pc_save.c_vertexes,
|
||||
backEnd.pc.c_characterlights
|
||||
|
||||
@@ -236,17 +236,17 @@ void RE_DrawBackground_TexSubImage(int cols, int rows, int bgr, byte* data) {
|
||||
format = GL_RGB;
|
||||
}
|
||||
|
||||
GL_Bind(tr.scratchImage[0]);
|
||||
GL_Bind(tr.scratchImage);
|
||||
|
||||
if (cols == tr.scratchImage[0]->width && rows == tr.scratchImage[0]->height && format == tr.scratchImage[0]->internalFormat)
|
||||
if (cols == tr.scratchImage->width && rows == tr.scratchImage->height && format == tr.scratchImage->internalFormat)
|
||||
{
|
||||
qglTexSubImage2D(3553, 0, 0, 0, cols, rows, format, 5121, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
tr.scratchImage[0]->uploadWidth = cols;
|
||||
tr.scratchImage[0]->uploadHeight = rows;
|
||||
tr.scratchImage[0]->internalFormat = format;
|
||||
tr.scratchImage->uploadWidth = cols;
|
||||
tr.scratchImage->uploadHeight = rows;
|
||||
tr.scratchImage->internalFormat = format;
|
||||
qglTexImage2D(GL_TEXTURE_2D, 0, 3, cols, rows, 0, format, 5121, data);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 9729.0);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 9729.0);
|
||||
|
||||
@@ -197,32 +197,13 @@ RB_AddDlightFlares
|
||||
void RB_AddDlightFlares( void ) {
|
||||
dlight_t *l;
|
||||
int i, j, k;
|
||||
fog_t *fog;
|
||||
|
||||
if ( !r_flares->integer ) {
|
||||
return;
|
||||
}
|
||||
|
||||
l = backEnd.refdef.dlights;
|
||||
fog = tr.world->fogs;
|
||||
for (i=0 ; i<backEnd.refdef.num_dlights ; i++, l++) {
|
||||
|
||||
// find which fog volume the light is in
|
||||
for ( j = 1 ; j < tr.world->numfogs ; j++ ) {
|
||||
fog = &tr.world->fogs[j];
|
||||
for ( k = 0 ; k < 3 ; k++ ) {
|
||||
if ( l->origin[k] < fog->bounds[0][k] || l->origin[k] > fog->bounds[1][k] ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( k == 3 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( j == tr.world->numfogs ) {
|
||||
j = 0;
|
||||
}
|
||||
|
||||
RB_AddFlare( (void *)l, j, l->origin, l->color, NULL );
|
||||
}
|
||||
}
|
||||
|
||||
+652
-64
@@ -49,6 +49,8 @@ int gl_filter_max = GL_LINEAR;
|
||||
#define FILE_HASH_SIZE 1024
|
||||
static image_t* hashTable[FILE_HASH_SIZE];
|
||||
|
||||
extern qboolean scr_initialized;
|
||||
|
||||
/*
|
||||
** R_GammaCorrect
|
||||
*/
|
||||
@@ -297,6 +299,10 @@ lighting range
|
||||
*/
|
||||
void R_LightScaleTexture (unsigned *in, int inwidth, int inheight, qboolean only_gamma )
|
||||
{
|
||||
if (!tr.needsLightScale) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( only_gamma )
|
||||
{
|
||||
if ( !glConfig.deviceSupportsGamma )
|
||||
@@ -546,36 +552,62 @@ static void Upload32(
|
||||
// select proper internal format
|
||||
if ( samples == 3 )
|
||||
{
|
||||
if ( glConfig.textureCompression == TC_S3TC )
|
||||
if (!force32bit)
|
||||
{
|
||||
internalFormat = GL_RGB4_S3TC;
|
||||
}
|
||||
else if ( r_texturebits->integer == 16 )
|
||||
{
|
||||
internalFormat = GL_RGB5;
|
||||
}
|
||||
else if ( r_texturebits->integer == 32 )
|
||||
{
|
||||
internalFormat = GL_RGB8;
|
||||
if (r_texturebits->integer == 16)
|
||||
{
|
||||
internalFormat = GL_RGB5;
|
||||
}
|
||||
else if (r_texturebits->integer == 32)
|
||||
{
|
||||
internalFormat = GL_RGB8;
|
||||
}
|
||||
else if (r_colorbits->integer == 16)
|
||||
{
|
||||
internalFormat = GL_RGBA4;
|
||||
}
|
||||
else if (r_colorbits->integer == 32)
|
||||
{
|
||||
internalFormat = GL_RGBA8;
|
||||
}
|
||||
else
|
||||
{
|
||||
internalFormat = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
internalFormat = 3;
|
||||
internalFormat = GL_RGB8;
|
||||
}
|
||||
}
|
||||
else if ( samples == 4 )
|
||||
{
|
||||
if ( r_texturebits->integer == 16 )
|
||||
if (!force32bit)
|
||||
{
|
||||
internalFormat = GL_RGBA4;
|
||||
}
|
||||
else if ( r_texturebits->integer == 32 )
|
||||
{
|
||||
internalFormat = GL_RGBA8;
|
||||
if (r_texturebits->integer == 16)
|
||||
{
|
||||
internalFormat = GL_RGBA4;
|
||||
}
|
||||
else if (r_texturebits->integer == 32)
|
||||
{
|
||||
internalFormat = GL_RGBA8;
|
||||
}
|
||||
else if (r_colorbits->integer == 16)
|
||||
{
|
||||
internalFormat = GL_RGBA4;
|
||||
}
|
||||
else if (r_colorbits->integer == 32)
|
||||
{
|
||||
internalFormat = GL_RGBA8;
|
||||
}
|
||||
else
|
||||
{
|
||||
internalFormat = 4;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
internalFormat = 4;
|
||||
internalFormat = GL_RGB8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -664,6 +696,161 @@ done:
|
||||
ri.Hunk_FreeTempMemory( resampledBuffer );
|
||||
}
|
||||
|
||||
static void UploadCompressed(
|
||||
byte* data,
|
||||
int width,
|
||||
int height,
|
||||
int numMipmaps,
|
||||
int iMipmapsAvailable,
|
||||
qboolean picmip,
|
||||
int glCompressMode,
|
||||
int* format,
|
||||
int* pUploadWidth,
|
||||
int* pUploadHeight,
|
||||
int* pBytesUsed
|
||||
) {
|
||||
byte* offset;
|
||||
int i;
|
||||
int iStartImage;
|
||||
int size;
|
||||
int blockSize;
|
||||
int scaled_width, scaled_height;
|
||||
|
||||
offset = data;
|
||||
iStartImage = 0;
|
||||
if (picmip) {
|
||||
iStartImage = r_picmip->integer;
|
||||
}
|
||||
|
||||
if (iStartImage > 0 && iStartImage >= iMipmapsAvailable) {
|
||||
iStartImage = iMipmapsAvailable - 1;
|
||||
}
|
||||
|
||||
scaled_width = width;
|
||||
scaled_height = height;
|
||||
if (iStartImage)
|
||||
{
|
||||
scaled_width = width >> iStartImage;
|
||||
scaled_height = height >> iStartImage;
|
||||
}
|
||||
while (scaled_width > glConfig.maxTextureSize || scaled_height > glConfig.maxTextureSize)
|
||||
{
|
||||
scaled_width >>= 1;
|
||||
scaled_height >>= 1;
|
||||
++iStartImage;
|
||||
}
|
||||
if (iStartImage > 0 && iStartImage >= iMipmapsAvailable)
|
||||
{
|
||||
iStartImage = iMipmapsAvailable - 1;
|
||||
scaled_width = width >> (iMipmapsAvailable - 1);
|
||||
scaled_height = height >> (iMipmapsAvailable - 1);
|
||||
}
|
||||
|
||||
*pUploadWidth = scaled_width;
|
||||
*pUploadHeight = scaled_height;
|
||||
*format = glCompressMode;
|
||||
blockSize = 16;
|
||||
|
||||
if (glCompressMode == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || glCompressMode == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) {
|
||||
blockSize = 8;
|
||||
}
|
||||
|
||||
scaled_width = width;
|
||||
scaled_height = height;
|
||||
|
||||
for (i = iStartImage; i; i--) {
|
||||
int w, h;
|
||||
|
||||
w = scaled_width + 3;
|
||||
if (scaled_width + 3 < 0) {
|
||||
w = scaled_width + 6;
|
||||
}
|
||||
w >>= 2;
|
||||
|
||||
if (w > 1) {
|
||||
h = scaled_height + 3;
|
||||
if (scaled_height + 3 < 0) {
|
||||
h = scaled_height + 6;
|
||||
}
|
||||
|
||||
h >>= 2;
|
||||
if (h > 1) {
|
||||
offset += blockSize * w * h;
|
||||
}
|
||||
}
|
||||
|
||||
scaled_width >>= 1;
|
||||
scaled_height >>= 1;
|
||||
if (!scaled_width) scaled_width = 1;
|
||||
if (!scaled_height) scaled_height = 1;
|
||||
}
|
||||
|
||||
*pBytesUsed = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
while (scaled_width)
|
||||
{
|
||||
int w, h;
|
||||
|
||||
if (!scaled_height) scaled_height = 1;
|
||||
w = scaled_width + 3;
|
||||
if (scaled_width + 3 < 0) w = scaled_width + 6;
|
||||
w >>= 2;
|
||||
|
||||
h = scaled_height + 3;
|
||||
if (scaled_height + 3 < 0) h = scaled_height + 6;
|
||||
h >>= 2;
|
||||
|
||||
size = blockSize * w * h;
|
||||
if (w > 1 && h > 1) *pBytesUsed += size;
|
||||
|
||||
qglCompressedTexImage2DARB(3553, i - iStartImage, glCompressMode, scaled_width, scaled_height, 0, size, data);
|
||||
GL_CheckErrors();
|
||||
|
||||
if (i < iMipmapsAvailable)
|
||||
{
|
||||
w = scaled_width + 3;
|
||||
if (scaled_width + 3 < 0) {
|
||||
w = scaled_width + 6;
|
||||
}
|
||||
|
||||
if (w >> 2 > 1)
|
||||
{
|
||||
h = scaled_height + 3;
|
||||
if (scaled_height + 3 < 0) {
|
||||
h = scaled_height + 6;
|
||||
}
|
||||
|
||||
if (h >> 2 > 1)
|
||||
data += size;
|
||||
}
|
||||
}
|
||||
scaled_width >>= 1;
|
||||
scaled_height >>= 1;
|
||||
++i;
|
||||
}
|
||||
|
||||
if (!scaled_height) {
|
||||
break;
|
||||
}
|
||||
|
||||
scaled_width = 1;
|
||||
}
|
||||
|
||||
if (numMipmaps > 1) {
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
|
||||
}
|
||||
else
|
||||
{
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
}
|
||||
|
||||
GL_CheckErrors();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
@@ -727,6 +914,7 @@ image_t* R_CreateImage(
|
||||
image->allowPicmip = allowPicmip;
|
||||
image->dynamicallyUpdated = dynamicallyUpdated;
|
||||
image->force32bit = force32bit;
|
||||
image->UseCount = 0;
|
||||
|
||||
strcpy (image->imgName, name);
|
||||
|
||||
@@ -748,21 +936,37 @@ image_t* R_CreateImage(
|
||||
|
||||
GL_Bind(image);
|
||||
|
||||
Upload32(
|
||||
(unsigned*)pic,
|
||||
image->width,
|
||||
image->height,
|
||||
image->numMipmaps,
|
||||
allowPicmip,
|
||||
image->dynamicallyUpdated,
|
||||
force32bit,
|
||||
hasAlpha,
|
||||
&image->internalFormat,
|
||||
&image->uploadWidth,
|
||||
&image->uploadHeight,
|
||||
&image->bytesUsed,
|
||||
isLightmap
|
||||
);
|
||||
if (glCompressMode) {
|
||||
UploadCompressed(
|
||||
pic,
|
||||
image->width,
|
||||
image->height,
|
||||
image->numMipmaps,
|
||||
iMipmapsAvailable,
|
||||
allowPicmip,
|
||||
glCompressMode,
|
||||
&image->internalFormat,
|
||||
&image->uploadWidth,
|
||||
&image->uploadHeight,
|
||||
&image->bytesUsed
|
||||
);
|
||||
} else {
|
||||
Upload32(
|
||||
(unsigned*)pic,
|
||||
image->width,
|
||||
image->height,
|
||||
image->numMipmaps,
|
||||
allowPicmip,
|
||||
image->dynamicallyUpdated,
|
||||
force32bit,
|
||||
hasAlpha,
|
||||
&image->internalFormat,
|
||||
&image->uploadWidth,
|
||||
&image->uploadHeight,
|
||||
&image->bytesUsed,
|
||||
isLightmap
|
||||
);
|
||||
}
|
||||
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glWrapClampModeX );
|
||||
qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glWrapClampModeY );
|
||||
@@ -777,6 +981,7 @@ image_t* R_CreateImage(
|
||||
hash = generateHashValue(name);
|
||||
image->next = hashTable[hash];
|
||||
hashTable[hash] = image;
|
||||
image->r_sequence = r_sequencenumber;
|
||||
|
||||
return image;
|
||||
}
|
||||
@@ -1095,6 +1300,342 @@ static void LoadPCX32 ( const char *filename, byte **pic, int *width, int *heigh
|
||||
ri.Free (palette);
|
||||
}
|
||||
|
||||
//==========================
|
||||
//
|
||||
// DDS Loading
|
||||
//
|
||||
//==========================
|
||||
|
||||
typedef unsigned int ui32_t;
|
||||
|
||||
typedef struct ddsHeader_s
|
||||
{
|
||||
ui32_t headerSize;
|
||||
ui32_t flags;
|
||||
ui32_t height;
|
||||
ui32_t width;
|
||||
ui32_t pitchOrFirstMipSize;
|
||||
ui32_t volumeDepth;
|
||||
ui32_t numMips;
|
||||
ui32_t reserved1[11];
|
||||
ui32_t always_0x00000020;
|
||||
ui32_t pixelFormatFlags;
|
||||
ui32_t fourCC;
|
||||
ui32_t rgbBitCount;
|
||||
ui32_t rBitMask;
|
||||
ui32_t gBitMask;
|
||||
ui32_t bBitMask;
|
||||
ui32_t aBitMask;
|
||||
ui32_t caps;
|
||||
ui32_t caps2;
|
||||
ui32_t caps3;
|
||||
ui32_t caps4;
|
||||
ui32_t reserved2;
|
||||
}
|
||||
ddsHeader_t;
|
||||
|
||||
// flags:
|
||||
#define _DDSFLAGS_REQUIRED 0x001007
|
||||
#define _DDSFLAGS_PITCH 0x8
|
||||
#define _DDSFLAGS_MIPMAPCOUNT 0x20000
|
||||
#define _DDSFLAGS_FIRSTMIPSIZE 0x80000
|
||||
#define _DDSFLAGS_VOLUMEDEPTH 0x800000
|
||||
|
||||
// pixelFormatFlags:
|
||||
#define DDSPF_ALPHAPIXELS 0x1
|
||||
#define DDSPF_ALPHA 0x2
|
||||
#define DDSPF_FOURCC 0x4
|
||||
#define DDSPF_RGB 0x40
|
||||
#define DDSPF_YUV 0x200
|
||||
#define DDSPF_LUMINANCE 0x20000
|
||||
|
||||
// caps:
|
||||
#define DDSCAPS_COMPLEX 0x8
|
||||
#define DDSCAPS_MIPMAP 0x400000
|
||||
#define DDSCAPS_REQUIRED 0x1000
|
||||
|
||||
// caps2:
|
||||
#define DDSCAPS2_CUBEMAP 0xFE00
|
||||
#define DDSCAPS2_VOLUME 0x200000
|
||||
|
||||
typedef struct ddsHeaderDxt10_s
|
||||
{
|
||||
ui32_t dxgiFormat;
|
||||
ui32_t dimensions;
|
||||
ui32_t miscFlags;
|
||||
ui32_t arraySize;
|
||||
ui32_t miscFlags2;
|
||||
}
|
||||
ddsHeaderDxt10_t;
|
||||
|
||||
// dxgiFormat
|
||||
// from http://msdn.microsoft.com/en-us/library/windows/desktop/bb173059%28v=vs.85%29.aspx
|
||||
typedef enum DXGI_FORMAT {
|
||||
DXGI_FORMAT_UNKNOWN = 0,
|
||||
DXGI_FORMAT_R32G32B32A32_TYPELESS = 1,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT = 2,
|
||||
DXGI_FORMAT_R32G32B32A32_UINT = 3,
|
||||
DXGI_FORMAT_R32G32B32A32_SINT = 4,
|
||||
DXGI_FORMAT_R32G32B32_TYPELESS = 5,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT = 6,
|
||||
DXGI_FORMAT_R32G32B32_UINT = 7,
|
||||
DXGI_FORMAT_R32G32B32_SINT = 8,
|
||||
DXGI_FORMAT_R16G16B16A16_TYPELESS = 9,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT = 10,
|
||||
DXGI_FORMAT_R16G16B16A16_UNORM = 11,
|
||||
DXGI_FORMAT_R16G16B16A16_UINT = 12,
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM = 13,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT = 14,
|
||||
DXGI_FORMAT_R32G32_TYPELESS = 15,
|
||||
DXGI_FORMAT_R32G32_FLOAT = 16,
|
||||
DXGI_FORMAT_R32G32_UINT = 17,
|
||||
DXGI_FORMAT_R32G32_SINT = 18,
|
||||
DXGI_FORMAT_R32G8X24_TYPELESS = 19,
|
||||
DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20,
|
||||
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21,
|
||||
DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22,
|
||||
DXGI_FORMAT_R10G10B10A2_TYPELESS = 23,
|
||||
DXGI_FORMAT_R10G10B10A2_UNORM = 24,
|
||||
DXGI_FORMAT_R10G10B10A2_UINT = 25,
|
||||
DXGI_FORMAT_R11G11B10_FLOAT = 26,
|
||||
DXGI_FORMAT_R8G8B8A8_TYPELESS = 27,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM = 28,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT = 30,
|
||||
DXGI_FORMAT_R8G8B8A8_SNORM = 31,
|
||||
DXGI_FORMAT_R8G8B8A8_SINT = 32,
|
||||
DXGI_FORMAT_R16G16_TYPELESS = 33,
|
||||
DXGI_FORMAT_R16G16_FLOAT = 34,
|
||||
DXGI_FORMAT_R16G16_UNORM = 35,
|
||||
DXGI_FORMAT_R16G16_UINT = 36,
|
||||
DXGI_FORMAT_R16G16_SNORM = 37,
|
||||
DXGI_FORMAT_R16G16_SINT = 38,
|
||||
DXGI_FORMAT_R32_TYPELESS = 39,
|
||||
DXGI_FORMAT_D32_FLOAT = 40,
|
||||
DXGI_FORMAT_R32_FLOAT = 41,
|
||||
DXGI_FORMAT_R32_UINT = 42,
|
||||
DXGI_FORMAT_R32_SINT = 43,
|
||||
DXGI_FORMAT_R24G8_TYPELESS = 44,
|
||||
DXGI_FORMAT_D24_UNORM_S8_UINT = 45,
|
||||
DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46,
|
||||
DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47,
|
||||
DXGI_FORMAT_R8G8_TYPELESS = 48,
|
||||
DXGI_FORMAT_R8G8_UNORM = 49,
|
||||
DXGI_FORMAT_R8G8_UINT = 50,
|
||||
DXGI_FORMAT_R8G8_SNORM = 51,
|
||||
DXGI_FORMAT_R8G8_SINT = 52,
|
||||
DXGI_FORMAT_R16_TYPELESS = 53,
|
||||
DXGI_FORMAT_R16_FLOAT = 54,
|
||||
DXGI_FORMAT_D16_UNORM = 55,
|
||||
DXGI_FORMAT_R16_UNORM = 56,
|
||||
DXGI_FORMAT_R16_UINT = 57,
|
||||
DXGI_FORMAT_R16_SNORM = 58,
|
||||
DXGI_FORMAT_R16_SINT = 59,
|
||||
DXGI_FORMAT_R8_TYPELESS = 60,
|
||||
DXGI_FORMAT_R8_UNORM = 61,
|
||||
DXGI_FORMAT_R8_UINT = 62,
|
||||
DXGI_FORMAT_R8_SNORM = 63,
|
||||
DXGI_FORMAT_R8_SINT = 64,
|
||||
DXGI_FORMAT_A8_UNORM = 65,
|
||||
DXGI_FORMAT_R1_UNORM = 66,
|
||||
DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67,
|
||||
DXGI_FORMAT_R8G8_B8G8_UNORM = 68,
|
||||
DXGI_FORMAT_G8R8_G8B8_UNORM = 69,
|
||||
DXGI_FORMAT_BC1_TYPELESS = 70,
|
||||
DXGI_FORMAT_BC1_UNORM = 71,
|
||||
DXGI_FORMAT_BC1_UNORM_SRGB = 72,
|
||||
DXGI_FORMAT_BC2_TYPELESS = 73,
|
||||
DXGI_FORMAT_BC2_UNORM = 74,
|
||||
DXGI_FORMAT_BC2_UNORM_SRGB = 75,
|
||||
DXGI_FORMAT_BC3_TYPELESS = 76,
|
||||
DXGI_FORMAT_BC3_UNORM = 77,
|
||||
DXGI_FORMAT_BC3_UNORM_SRGB = 78,
|
||||
DXGI_FORMAT_BC4_TYPELESS = 79,
|
||||
DXGI_FORMAT_BC4_UNORM = 80,
|
||||
DXGI_FORMAT_BC4_SNORM = 81,
|
||||
DXGI_FORMAT_BC5_TYPELESS = 82,
|
||||
DXGI_FORMAT_BC5_UNORM = 83,
|
||||
DXGI_FORMAT_BC5_SNORM = 84,
|
||||
DXGI_FORMAT_B5G6R5_UNORM = 85,
|
||||
DXGI_FORMAT_B5G5R5A1_UNORM = 86,
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM = 87,
|
||||
DXGI_FORMAT_B8G8R8X8_UNORM = 88,
|
||||
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89,
|
||||
DXGI_FORMAT_B8G8R8A8_TYPELESS = 90,
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91,
|
||||
DXGI_FORMAT_B8G8R8X8_TYPELESS = 92,
|
||||
DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93,
|
||||
DXGI_FORMAT_BC6H_TYPELESS = 94,
|
||||
DXGI_FORMAT_BC6H_UF16 = 95,
|
||||
DXGI_FORMAT_BC6H_SF16 = 96,
|
||||
DXGI_FORMAT_BC7_TYPELESS = 97,
|
||||
DXGI_FORMAT_BC7_UNORM = 98,
|
||||
DXGI_FORMAT_BC7_UNORM_SRGB = 99,
|
||||
DXGI_FORMAT_AYUV = 100,
|
||||
DXGI_FORMAT_Y410 = 101,
|
||||
DXGI_FORMAT_Y416 = 102,
|
||||
DXGI_FORMAT_NV12 = 103,
|
||||
DXGI_FORMAT_P010 = 104,
|
||||
DXGI_FORMAT_P016 = 105,
|
||||
DXGI_FORMAT_420_OPAQUE = 106,
|
||||
DXGI_FORMAT_YUY2 = 107,
|
||||
DXGI_FORMAT_Y210 = 108,
|
||||
DXGI_FORMAT_Y216 = 109,
|
||||
DXGI_FORMAT_NV11 = 110,
|
||||
DXGI_FORMAT_AI44 = 111,
|
||||
DXGI_FORMAT_IA44 = 112,
|
||||
DXGI_FORMAT_P8 = 113,
|
||||
DXGI_FORMAT_A8P8 = 114,
|
||||
DXGI_FORMAT_B4G4R4A4_UNORM = 115,
|
||||
DXGI_FORMAT_FORCE_UINT = 0xffffffffUL
|
||||
} DXGI_FORMAT;
|
||||
|
||||
#define EncodeFourCC(x) ((((ui32_t)((x)[0])) ) | \
|
||||
(((ui32_t)((x)[1])) << 8 ) | \
|
||||
(((ui32_t)((x)[2])) << 16) | \
|
||||
(((ui32_t)((x)[3])) << 24) )
|
||||
|
||||
|
||||
static void LoadDDS(const char* name, byte** pic, int* width, int* height, qboolean* hasAlpha, int* glCompressMode, int* numMipmaps, int* piMipmapsAvailable) {
|
||||
union {
|
||||
byte* b;
|
||||
void* v;
|
||||
} buffer;
|
||||
int len;
|
||||
ddsHeader_t* ddsHeader = NULL;
|
||||
ddsHeaderDxt10_t* ddsHeaderDxt10 = NULL;
|
||||
byte* data;
|
||||
|
||||
*pic = 0;
|
||||
*piMipmapsAvailable = 0;
|
||||
|
||||
if (width)
|
||||
*width = 0;
|
||||
if (height)
|
||||
*height = 0;
|
||||
|
||||
*pic = NULL;
|
||||
|
||||
//
|
||||
// load the file
|
||||
//
|
||||
len = ri.FS_ReadFile((char*)name, &buffer.v);
|
||||
if (!buffer.b || len < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// reject files that are too small to hold even a header
|
||||
//
|
||||
if (len < 4 + sizeof(*ddsHeader))
|
||||
{
|
||||
ri.Printf(PRINT_ALL, "File %s is too small to be a DDS file.\n", name);
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// reject files that don't start with "DDS "
|
||||
//
|
||||
if (*((ui32_t*)(buffer.b)) != EncodeFourCC("DDS "))
|
||||
{
|
||||
ri.Printf(PRINT_ALL, "File %s is not a DDS file.\n", name);
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// parse header and dx10 header if available
|
||||
//
|
||||
ddsHeader = (ddsHeader_t*)(buffer.b + 4);
|
||||
if ((ddsHeader->pixelFormatFlags & DDSPF_FOURCC) && ddsHeader->fourCC == EncodeFourCC("DX10"))
|
||||
{
|
||||
if (len < 4 + sizeof(*ddsHeader) + sizeof(*ddsHeaderDxt10))
|
||||
{
|
||||
ri.Printf(PRINT_ALL, "File %s indicates a DX10 header it is too small to contain.\n", name);
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
return;
|
||||
}
|
||||
|
||||
ddsHeaderDxt10 = (ddsHeaderDxt10_t*)(buffer.b + 4 + sizeof(ddsHeader_t));
|
||||
data = buffer.b + 4 + sizeof(*ddsHeader) + sizeof(*ddsHeaderDxt10);
|
||||
len -= 4 + sizeof(*ddsHeader) + sizeof(*ddsHeaderDxt10);
|
||||
}
|
||||
else
|
||||
{
|
||||
data = buffer.b + 4 + sizeof(*ddsHeader);
|
||||
len -= 4 + sizeof(*ddsHeader);
|
||||
}
|
||||
|
||||
if (width)
|
||||
*width = ddsHeader->width;
|
||||
if (height)
|
||||
*height = ddsHeader->height;
|
||||
|
||||
if (piMipmapsAvailable)
|
||||
{
|
||||
if (ddsHeader->flags & _DDSFLAGS_MIPMAPCOUNT)
|
||||
*piMipmapsAvailable = ddsHeader->numMips;
|
||||
else
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
|
||||
// FIXME: handle cube map
|
||||
//if ((ddsHeader->caps2 & DDSCAPS2_CUBEMAP) == DDSCAPS2_CUBEMAP)
|
||||
|
||||
//
|
||||
// Convert DXGI format/FourCC into OpenGL format
|
||||
//
|
||||
if (ddsHeaderDxt10)
|
||||
{
|
||||
ri.Printf(PRINT_ALL, "DDS File %s has unsupported DXGI format %d.", name, ddsHeaderDxt10->dxgiFormat);
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ddsHeader->pixelFormatFlags & DDSPF_FOURCC)
|
||||
{
|
||||
if (ddsHeader->fourCC == EncodeFourCC("DXT1"))
|
||||
*glCompressMode = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||
else if (ddsHeader->fourCC == EncodeFourCC("DXT2"))
|
||||
*glCompressMode = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
||||
else if (ddsHeader->fourCC == EncodeFourCC("DXT3"))
|
||||
*glCompressMode = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
|
||||
else if (ddsHeader->fourCC == EncodeFourCC("DXT4"))
|
||||
*glCompressMode = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
|
||||
else if (ddsHeader->fourCC == EncodeFourCC("DXT5"))
|
||||
*glCompressMode = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
|
||||
else
|
||||
{
|
||||
ri.Printf(PRINT_ALL, "DDS File %s has unsupported FourCC.", name);
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (ddsHeader->pixelFormatFlags == (DDSPF_RGB | DDSPF_ALPHAPIXELS)
|
||||
&& ddsHeader->rgbBitCount == 32
|
||||
&& ddsHeader->rBitMask == 0x000000ff
|
||||
&& ddsHeader->gBitMask == 0x0000ff00
|
||||
&& ddsHeader->bBitMask == 0x00ff0000
|
||||
&& ddsHeader->aBitMask == 0xff000000)
|
||||
{
|
||||
*glCompressMode = GL_RGBA8;
|
||||
}
|
||||
else
|
||||
{
|
||||
ri.Printf(PRINT_ALL, "DDS File %s has unsupported RGBA format.", name);
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
*pic = ri.Malloc(len);
|
||||
Com_Memcpy(*pic, data, len);
|
||||
|
||||
ri.FS_FreeFile(buffer.v);
|
||||
}
|
||||
|
||||
/*
|
||||
=========================================================
|
||||
|
||||
@@ -1880,7 +2421,10 @@ Loads any of the supported image types into a cannonical
|
||||
=================
|
||||
*/
|
||||
static void R_LoadImage(const char* name, byte** pic, int* width, int* height, qboolean* hasAlpha, int* glCompressMode, int* numMipmaps, int* piMipmapsAvailable) {
|
||||
int len;
|
||||
size_t len;
|
||||
char tempName[MAX_STRING_TOKENS + 1];
|
||||
char altname[MAX_QPATH];
|
||||
|
||||
|
||||
*hasAlpha = qfalse;
|
||||
*glCompressMode = 0;
|
||||
@@ -1893,30 +2437,54 @@ static void R_LoadImage(const char* name, byte** pic, int* width, int* height, q
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Q_stricmp(name + len - 4, ".tga")) {
|
||||
LoadTGA(name, pic, width, height); // try tga first
|
||||
if (!*pic) { //
|
||||
char altname[MAX_QPATH]; // try jpg in place of tga
|
||||
strcpy(altname, name);
|
||||
len = strlen(altname);
|
||||
altname[len - 3] = 'j';
|
||||
altname[len - 2] = 'p';
|
||||
altname[len - 1] = 'g';
|
||||
LoadJPG(altname, pic, width, height);
|
||||
strcpy(altname, name);
|
||||
len = strlen(altname);
|
||||
if (glConfig.textureCompression == 1)
|
||||
{
|
||||
len = strlen(altname);
|
||||
altname[len - 3] = 'd';
|
||||
altname[len - 2] = 'd';
|
||||
altname[len - 1] = 's';
|
||||
LoadDDS(altname, pic, width, height, hasAlpha, glCompressMode, numMipmaps, piMipmapsAvailable);
|
||||
}
|
||||
|
||||
if (!*pic)
|
||||
{
|
||||
if (!Q_stricmp(name + len - 4, ".tga") || !Q_stricmp(name + len - 4, ".jpg")) {
|
||||
if (r_loadjpg->integer) {
|
||||
len = strlen(altname);
|
||||
altname[len - 3] = 'j';
|
||||
altname[len - 2] = 'p';
|
||||
altname[len - 1] = 'g';
|
||||
// try jpg first
|
||||
LoadJPG(altname, pic, width, height);
|
||||
}
|
||||
if (!*pic) {
|
||||
altname[len - 3] = 't';
|
||||
altname[len - 2] = 'g';
|
||||
altname[len - 1] = 'a';
|
||||
LoadTGA(altname, pic, width, height);
|
||||
}
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
else if (!Q_stricmp(name + len - 4, ".pcx")) {
|
||||
LoadPCX32(name, pic, width, height);
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
else if (!Q_stricmp(name + len - 4, ".bmp")) {
|
||||
LoadBMP(name, pic, width, height);
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
else if (!Q_stricmp(name + len - 4, ".jpg")) {
|
||||
LoadJPG(name, pic, width, height);
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
else if (!Q_stricmp(name + len - 4, ".pcx")) {
|
||||
LoadPCX32(name, pic, width, height);
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
else if (!Q_stricmp(name + len - 4, ".bmp")) {
|
||||
LoadBMP(name, pic, width, height);
|
||||
*piMipmapsAvailable = 1;
|
||||
}
|
||||
else if (!Q_stricmp(name + len - 4, ".jpg")) {
|
||||
LoadJPG(name, pic, width, height);
|
||||
*piMipmapsAvailable = 1;
|
||||
|
||||
if (scr_initialized)
|
||||
{
|
||||
sprintf(tempName, "n%s", name);
|
||||
UI_LoadResource(tempName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1959,7 +2527,7 @@ image_t* R_FindImageFile(const char* name, qboolean mipmap, qboolean allowPicmip
|
||||
if (image->allowPicmip != allowPicmip) {
|
||||
ri.Printf(PRINT_DEVELOPER, "WARNING: reused image %s with mixed allowPicmip parm\n", name);
|
||||
}
|
||||
if (image->wrapClampModeX != glWrapClampModeX || image != glWrapClampModeY) {
|
||||
if (image->wrapClampModeX != glWrapClampModeX || image->wrapClampModeY != glWrapClampModeY) {
|
||||
ri.Printf(PRINT_ALL, "WARNING: reused image %s with mixed glWrapClampMode parm\n", name);
|
||||
}
|
||||
}
|
||||
@@ -2091,6 +2659,7 @@ static void R_CreateDefaultImage( void ) {
|
||||
data[x][DEFAULT_SIZE-1][3] = 255;
|
||||
}
|
||||
tr.defaultImage = R_CreateImage("*default", (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, 1, 1, qfalse, qfalse, qfalse, qfalse, GL_REPEAT, GL_REPEAT);
|
||||
tr.defaultImage->r_sequence = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2100,6 +2669,8 @@ R_CreateBuiltinImages
|
||||
*/
|
||||
void R_CreateBuiltinImages( void ) {
|
||||
int x,y;
|
||||
int i;
|
||||
byte lightmap_buffer[128 * 128 * 4];
|
||||
byte data[DEFAULT_SIZE][DEFAULT_SIZE][4];
|
||||
|
||||
R_CreateDefaultImage();
|
||||
@@ -2107,6 +2678,7 @@ void R_CreateBuiltinImages( void ) {
|
||||
// we use a solid white image instead of disabling texturing
|
||||
Com_Memset( data, 255, sizeof( data ) );
|
||||
tr.whiteImage = R_CreateImage("*white", (byte *)data, 8, 8, 0, 1, qfalse, qfalse, qfalse, qfalse, GL_REPEAT, GL_REPEAT);
|
||||
tr.whiteImage->r_sequence = -1;
|
||||
|
||||
// with overbright bits active, we need an image which is some fraction of full color,
|
||||
// for default lightmaps, etc
|
||||
@@ -2119,14 +2691,18 @@ void R_CreateBuiltinImages( void ) {
|
||||
}
|
||||
}
|
||||
|
||||
tr.identityLightImage = R_CreateImage("*identityLight", (byte *)data, 8, 8, 0, 1, qfalse, qfalse, qfalse, qfalse, GL_REPEAT, GL_REPEAT);
|
||||
|
||||
|
||||
for(x=0;x<32;x++) {
|
||||
// scratchimage is usually used for cinematic drawing
|
||||
tr.scratchImage[x] = R_CreateImage("*scratch", (byte *)data, DEFAULT_SIZE, DEFAULT_SIZE, 0, 1, qtrue, qfalse, qfalse, qfalse, GL_REPEAT, GL_REPEAT);
|
||||
Com_Memset(lightmap_buffer, 0xFFFFFFFF, sizeof(lightmap_buffer));
|
||||
for (i = 0; i < 15; i++) {
|
||||
tr.dlightImages[i] = R_CreateImage("*lightmapD%i", lightmap_buffer, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, 1, qfalse, qfalse, qfalse, 0, GL_CLAMP, GL_CLAMP);
|
||||
tr.dlightImages[i]->r_sequence = -1;
|
||||
}
|
||||
|
||||
tr.identityLightImage = R_CreateImage("*identityLight", (byte *)data, 8, 8, 0, 1, qfalse, qfalse, qfalse, qfalse, GL_REPEAT, GL_REPEAT);
|
||||
tr.identityLightImage->r_sequence = -1;
|
||||
|
||||
tr.scratchImage = R_CreateImage("*scratch", (byte*)data, DEFAULT_SIZE, DEFAULT_SIZE, 0, 1, qtrue, qfalse, qfalse, qfalse, GL_CLAMP, GL_CLAMP);
|
||||
tr.scratchImage->r_sequence = -1;
|
||||
|
||||
R_CreateDlightImage();
|
||||
}
|
||||
|
||||
@@ -2173,7 +2749,6 @@ void R_SetColorMappings( void ) {
|
||||
tr.identityLight = 1.0f / (1 << tr.overbrightBits);
|
||||
tr.identityLightByte = 255 * tr.identityLight;
|
||||
|
||||
|
||||
if ( r_intensity->value <= 1 ) {
|
||||
ri.Cvar_Set( "r_intensity", "1" );
|
||||
}
|
||||
@@ -2185,6 +2760,15 @@ void R_SetColorMappings( void ) {
|
||||
}
|
||||
|
||||
g = r_gamma->value;
|
||||
if (!glConfig.deviceSupportsGamma && g != 1.0) {
|
||||
tr.needsLightScale = qtrue;
|
||||
}
|
||||
else if (r_intensity->value != 1.0) {
|
||||
tr.needsLightScale = qtrue;
|
||||
}
|
||||
else {
|
||||
tr.needsLightScale = qfalse;
|
||||
}
|
||||
|
||||
shift = tr.overbrightBits;
|
||||
|
||||
@@ -2225,6 +2809,10 @@ R_InitImages
|
||||
*/
|
||||
void R_InitImages( void ) {
|
||||
Com_Memset(hashTable, 0, sizeof(hashTable));
|
||||
// clear images
|
||||
Com_Memset(tr.images, 0, sizeof(tr.images));
|
||||
tr.numImages = 0;
|
||||
|
||||
// build brightness translation tables
|
||||
R_SetColorMappings();
|
||||
|
||||
|
||||
@@ -1016,7 +1016,7 @@ void R_Register( void )
|
||||
#else
|
||||
r_smp = ri.Cvar_Get( "r_smp", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
#endif
|
||||
r_ignoreFastPath = ri.Cvar_Get("r_ignoreFastPath", "1", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_ignoreFastPath = ri.Cvar_Get("r_ignoreFastPath", "0", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
r_subdivisions = ri.Cvar_Get("r_subdivisions", "4", CVAR_ARCHIVE | CVAR_LATCH);
|
||||
|
||||
//
|
||||
@@ -1462,6 +1462,7 @@ refexport_t *GetRefAPI ( int apiVersion, refimport_t *rimp ) {
|
||||
re.UnregisterServerModel = RE_UnregisterServerModel;
|
||||
re.RegisterShader = RE_RegisterShader;
|
||||
re.RegisterShaderNoMip = RE_RegisterShaderNoMip;
|
||||
re.RefreshShaderNoMip = RE_RefreshShaderNoMip;
|
||||
re.LoadWorld = RE_LoadWorldMap;
|
||||
re.PrintBSPFileSizes = RE_PrintBSPFileSizes;
|
||||
re.MapVersion = RE_MapVersion;
|
||||
|
||||
+264
-246
@@ -47,6 +47,8 @@ typedef struct {
|
||||
|
||||
dlightInfo_t dli;
|
||||
|
||||
void R_SetupEntityLightingGrid(trRefEntity_t* ent);
|
||||
|
||||
/*
|
||||
===============
|
||||
R_TransformDlights
|
||||
@@ -126,12 +128,17 @@ static byte* R_GetLightGridPalettedColor(int iColor)
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
void R_GetLightingGridValue(vec3_t vPos, vec3_t vLight)
|
||||
void R_GetLightingGridValue(const vec3_t vPos, vec3_t vLight)
|
||||
{
|
||||
if (!tr.world || !tr.world->lightGridData || !tr.world->lightGridOffsets) {
|
||||
vLight[0] = vLight[1] = vLight[2] = tr.identityLightByte;
|
||||
}
|
||||
|
||||
vLight[0] = vLight[1] = vLight[2] = tr.identityLightByte;
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
void R_GetLightingGridValueFast(vec3_t vPos, vec3_t vLight)
|
||||
void R_GetLightingGridValueFast(const vec3_t vPos, vec3_t vLight)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
@@ -146,6 +153,261 @@ void R_GetLightingForSmoke(vec3_t vLight, vec3_t vOrigin)
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
static int RB_GetEntityGridLighting()
|
||||
{
|
||||
int iColor;
|
||||
int i;
|
||||
dlight_t* dl;
|
||||
float power;
|
||||
vec3_t vLight;
|
||||
vec3_t dir;
|
||||
float d;
|
||||
float* lightOrigin;
|
||||
|
||||
lightOrigin = backEnd.currentSphere->traceOrigin;
|
||||
if (!(backEnd.refdef.rdflags & RDF_NOWORLDMODEL) && tr.world->lightGridData) {
|
||||
R_GetLightingGridValue(backEnd.currentSphere->traceOrigin, vLight);
|
||||
} else {
|
||||
vLight[0] = vLight[1] = vLight[2] = tr.identityLight * 150.0;
|
||||
}
|
||||
|
||||
for (i = 0; i < backEnd.refdef.num_dlights; i++) {
|
||||
dl = &backEnd.refdef.dlights[i];
|
||||
VectorSubtract(dl->origin, lightOrigin, dir);
|
||||
d = VectorLengthSquared(dir);
|
||||
|
||||
power = dl->radius * dl->radius;
|
||||
if (power >= d) {
|
||||
d = dl->radius * 7500.0 / d;
|
||||
VectorMA(vLight, d, dl->color, vLight);
|
||||
}
|
||||
}
|
||||
|
||||
if (tr.overbrightShift)
|
||||
{
|
||||
vLight[0] = tr.overbrightMult * vLight[0];
|
||||
vLight[1] = tr.overbrightMult * vLight[1];
|
||||
vLight[2] = tr.overbrightMult * vLight[2];
|
||||
}
|
||||
|
||||
// normalize
|
||||
if (vLight[0] < 255.0 || vLight[1] < 255.0 || vLight[2] < 255.0) {
|
||||
float scale = 255.0 / fmin(vLight[0], fmin(vLight[1], vLight[2]));
|
||||
VectorScale(vLight, scale, vLight);
|
||||
}
|
||||
|
||||
// clamp ambient
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (vLight[i] > tr.identityLightByte) {
|
||||
vLight[i] = tr.identityLightByte;
|
||||
}
|
||||
}
|
||||
|
||||
// save out the byte packet version
|
||||
((byte*)&iColor)[0] = myftol(vLight[0]);
|
||||
((byte*)&iColor)[1] = myftol(vLight[1]);
|
||||
((byte*)&iColor)[2] = myftol(vLight[2]);
|
||||
((byte*)&iColor)[3] = 0xff;
|
||||
|
||||
return iColor;
|
||||
|
||||
#if 0
|
||||
int i;
|
||||
dlight_t* dl;
|
||||
float power;
|
||||
vec3_t dir;
|
||||
float d;
|
||||
vec3_t lightDir;
|
||||
vec3_t lightOrigin;
|
||||
int ambientlightInt = 0;
|
||||
trRefEntity_t *ent = backEnd.currentEntity;
|
||||
trRefdef_t *refdef = &backEnd.refdef;
|
||||
|
||||
//
|
||||
// trace a sample point down to find ambient light
|
||||
//
|
||||
if (ent->e.renderfx & RF_LIGHTING_ORIGIN) {
|
||||
// seperate lightOrigins are needed so an object that is
|
||||
// sinking into the ground can still be lit, and so
|
||||
// multi-part models can be lit identically
|
||||
VectorCopy(ent->e.lightingOrigin, lightOrigin);
|
||||
}
|
||||
else {
|
||||
VectorCopy(ent->e.origin, lightOrigin);
|
||||
}
|
||||
|
||||
// if NOWORLDMODEL, only use dynamic lights (menu system, etc)
|
||||
if (!(refdef->rdflags & RDF_NOWORLDMODEL)
|
||||
&& tr.world->lightGridData) {
|
||||
R_SetupEntityLightingGrid(ent);
|
||||
}
|
||||
else {
|
||||
ent->ambientLight[0] = ent->ambientLight[1] =
|
||||
ent->ambientLight[2] = tr.identityLight * 150;
|
||||
ent->directedLight[0] = ent->directedLight[1] =
|
||||
ent->directedLight[2] = tr.identityLight * 150;
|
||||
VectorCopy(tr.sunDirection, ent->lightDir);
|
||||
}
|
||||
|
||||
// bonus items and view weapons have a fixed minimum add
|
||||
if (1 /* ent->e.renderfx & RF_MINLIGHT */) {
|
||||
// give everything a minimum light add
|
||||
ent->ambientLight[0] += tr.identityLight * 32;
|
||||
ent->ambientLight[1] += tr.identityLight * 32;
|
||||
ent->ambientLight[2] += tr.identityLight * 32;
|
||||
}
|
||||
|
||||
//
|
||||
// modify the light by dynamic lights
|
||||
//
|
||||
d = VectorLength(ent->directedLight);
|
||||
VectorScale(ent->lightDir, d, lightDir);
|
||||
|
||||
for (i = 0; i < refdef->num_dlights; i++) {
|
||||
dl = &refdef->dlights[i];
|
||||
VectorSubtract(dl->origin, lightOrigin, dir);
|
||||
d = VectorNormalize(dir);
|
||||
|
||||
power = DLIGHT_AT_RADIUS * (dl->radius * dl->radius);
|
||||
if (d < DLIGHT_MINIMUM_RADIUS) {
|
||||
d = DLIGHT_MINIMUM_RADIUS;
|
||||
}
|
||||
d = power / (d * d);
|
||||
|
||||
VectorMA(ent->directedLight, d, dl->color, ent->directedLight);
|
||||
VectorMA(lightDir, d, dir, lightDir);
|
||||
}
|
||||
|
||||
// clamp ambient
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (ent->ambientLight[i] > tr.identityLightByte) {
|
||||
ent->ambientLight[i] = tr.identityLightByte;
|
||||
}
|
||||
}
|
||||
|
||||
// save out the byte packet version
|
||||
((byte*)&ambientlightInt)[0] = myftol(ent->ambientLight[0]);
|
||||
((byte*)&ambientlightInt)[1] = myftol(ent->ambientLight[1]);
|
||||
((byte*)&ambientlightInt)[2] = myftol(ent->ambientLight[2]);
|
||||
((byte*)&ambientlightInt)[3] = 0xff;
|
||||
|
||||
// transform the direction to local space
|
||||
VectorNormalize(lightDir);
|
||||
ent->lightDir[0] = DotProduct(lightDir, ent->e.axis[0]);
|
||||
ent->lightDir[1] = DotProduct(lightDir, ent->e.axis[1]);
|
||||
ent->lightDir[2] = DotProduct(lightDir, ent->e.axis[2]);
|
||||
|
||||
return ambientlightInt;
|
||||
#endif
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
void RB_SetupEntityGridLighting()
|
||||
{
|
||||
trRefEntity_t* ent;
|
||||
int iColor;
|
||||
|
||||
if (backEnd.currentEntity->bLightGridCalculated) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (ent = backEnd.currentEntity; ent->e.parentEntity != ENTITYNUM_NONE; ent = &backEnd.refdef.entities[ent->e.parentEntity])
|
||||
{
|
||||
trRefEntity_t* newref = &backEnd.refdef.entities[ent->e.parentEntity];
|
||||
if (newref == ent) {
|
||||
assert(!"backEnd.refdef.entities[ent->e.parentEntity] refers to itself\n");
|
||||
iColor = newref->iGridLighting;
|
||||
break;
|
||||
}
|
||||
|
||||
if (newref->bLightGridCalculated) {
|
||||
iColor = newref->iGridLighting;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ent->e.parentEntity == ENTITYNUM_NONE) {
|
||||
iColor = RB_GetEntityGridLighting();
|
||||
}
|
||||
|
||||
ent = backEnd.currentEntity;
|
||||
for (;;)
|
||||
{
|
||||
ent->bLightGridCalculated = 1;
|
||||
ent->iGridLighting = iColor;
|
||||
if (ent->e.parentEntity == ENTITYNUM_NONE) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (ent == &backEnd.refdef.entities[ent->e.parentEntity]) {
|
||||
assert(!"backEnd.refdef.entities[ent->e.parentEntity] refers to itself\n");
|
||||
break;
|
||||
}
|
||||
|
||||
ent = &backEnd.refdef.entities[ent->e.parentEntity];
|
||||
}
|
||||
}
|
||||
|
||||
void RB_SetupStaticModelGridLighting(trRefdef_t* refdef, cStaticModelUnpacked_t* ent, const vec3_t lightOrigin)
|
||||
{
|
||||
int iColor;
|
||||
int i;
|
||||
dlight_t* dl;
|
||||
float power;
|
||||
vec3_t vLight;
|
||||
vec3_t dir;
|
||||
float d;
|
||||
|
||||
if (ent->bLightGridCalculated) {
|
||||
return;
|
||||
}
|
||||
ent->bLightGridCalculated = qtrue;
|
||||
|
||||
if (!(refdef->rdflags & RDF_NOWORLDMODEL) && tr.world->lightGridData) {
|
||||
R_GetLightingGridValue(backEnd.currentSphere->traceOrigin, vLight);
|
||||
}
|
||||
else {
|
||||
vLight[0] = vLight[1] = vLight[2] = tr.identityLight * 150.0;
|
||||
}
|
||||
|
||||
for (i = 0; i < refdef->num_dlights; i++) {
|
||||
dl = &refdef->dlights[i];
|
||||
VectorSubtract(dl->origin, lightOrigin, dir);
|
||||
d = VectorLengthSquared(dir);
|
||||
|
||||
power = dl->radius * dl->radius;
|
||||
if (power >= d) {
|
||||
d = dl->radius * 7500.0 / d;
|
||||
VectorMA(vLight, d, dl->color, vLight);
|
||||
}
|
||||
}
|
||||
|
||||
if (tr.overbrightShift)
|
||||
{
|
||||
vLight[0] = tr.overbrightMult * vLight[0];
|
||||
vLight[1] = tr.overbrightMult * vLight[1];
|
||||
vLight[2] = tr.overbrightMult * vLight[2];
|
||||
}
|
||||
|
||||
// normalize
|
||||
if (vLight[0] < 255.0 || vLight[1] < 255.0 || vLight[2] < 255.0) {
|
||||
float scale = 255.0 / fmin(vLight[0], fmin(vLight[1], vLight[2]));
|
||||
VectorScale(vLight, scale, vLight);
|
||||
}
|
||||
|
||||
// clamp ambient
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (vLight[i] > tr.identityLightByte) {
|
||||
vLight[i] = tr.identityLightByte;
|
||||
}
|
||||
}
|
||||
|
||||
// save out the byte packet version
|
||||
((byte*)&ent->iGridLighting)[0] = myftol(vLight[0]);
|
||||
((byte*)&ent->iGridLighting)[1] = myftol(vLight[1]);
|
||||
((byte*)&ent->iGridLighting)[2] = myftol(vLight[2]);
|
||||
((byte*)&ent->iGridLighting)[3] = 0xff;
|
||||
}
|
||||
|
||||
/*
|
||||
=============================================================================
|
||||
@@ -158,131 +420,6 @@ LIGHT SAMPLING
|
||||
extern cvar_t *r_ambientScale;
|
||||
extern cvar_t *r_directedScale;
|
||||
|
||||
/*
|
||||
=================
|
||||
R_SetupEntityLightingGrid
|
||||
|
||||
=================
|
||||
*/
|
||||
static void R_SetupEntityLightingGrid( trRefEntity_t *ent ) {
|
||||
vec3_t lightOrigin;
|
||||
int pos[3];
|
||||
int i, j;
|
||||
byte *gridData;
|
||||
float frac[3];
|
||||
int gridStep[3];
|
||||
vec3_t direction;
|
||||
float totalFactor;
|
||||
|
||||
if ( ent->e.renderfx & RF_LIGHTING_ORIGIN ) {
|
||||
// seperate lightOrigins are needed so an object that is
|
||||
// sinking into the ground can still be lit, and so
|
||||
// multi-part models can be lit identically
|
||||
VectorCopy( ent->e.lightingOrigin, lightOrigin );
|
||||
} else {
|
||||
VectorCopy( ent->e.origin, lightOrigin );
|
||||
}
|
||||
|
||||
VectorSubtract( lightOrigin, tr.world->lightGridOrigin, lightOrigin );
|
||||
for ( i = 0 ; i < 3 ; i++ ) {
|
||||
float v;
|
||||
|
||||
v = lightOrigin[i]*tr.world->lightGridInverseSize[i];
|
||||
pos[i] = floor( v );
|
||||
frac[i] = v - pos[i];
|
||||
if ( pos[i] < 0 ) {
|
||||
pos[i] = 0;
|
||||
} else if ( pos[i] >= tr.world->lightGridBounds[i] - 1 ) {
|
||||
pos[i] = tr.world->lightGridBounds[i] - 1;
|
||||
}
|
||||
}
|
||||
|
||||
VectorClear( ent->ambientLight );
|
||||
VectorClear( ent->directedLight );
|
||||
VectorClear( direction );
|
||||
|
||||
assert( tr.world->lightGridData ); // bk010103 - NULL with -nolight maps
|
||||
|
||||
// trilerp the light value
|
||||
gridStep[0] = 8;
|
||||
gridStep[1] = 8 * tr.world->lightGridBounds[0];
|
||||
gridStep[2] = 8 * tr.world->lightGridBounds[0] * tr.world->lightGridBounds[1];
|
||||
gridData = tr.world->lightGridData + pos[0] * gridStep[0]
|
||||
+ pos[1] * gridStep[1] + pos[2] * gridStep[2];
|
||||
|
||||
totalFactor = 0;
|
||||
for ( i = 0 ; i < 8 ; i++ ) {
|
||||
float factor;
|
||||
byte *data;
|
||||
int lat, lng;
|
||||
vec3_t normal;
|
||||
#if idppc
|
||||
float d0, d1, d2, d3, d4, d5;
|
||||
#endif
|
||||
factor = 1.0;
|
||||
data = gridData;
|
||||
for ( j = 0 ; j < 3 ; j++ ) {
|
||||
if ( i & (1<<j) ) {
|
||||
factor *= frac[j];
|
||||
data += gridStep[j];
|
||||
} else {
|
||||
factor *= (1.0f - frac[j]);
|
||||
}
|
||||
}
|
||||
|
||||
if ( !(data[0]+data[1]+data[2]) ) {
|
||||
continue; // ignore samples in walls
|
||||
}
|
||||
totalFactor += factor;
|
||||
#if idppc
|
||||
d0 = data[0]; d1 = data[1]; d2 = data[2];
|
||||
d3 = data[3]; d4 = data[4]; d5 = data[5];
|
||||
|
||||
ent->ambientLight[0] += factor * d0;
|
||||
ent->ambientLight[1] += factor * d1;
|
||||
ent->ambientLight[2] += factor * d2;
|
||||
|
||||
ent->directedLight[0] += factor * d3;
|
||||
ent->directedLight[1] += factor * d4;
|
||||
ent->directedLight[2] += factor * d5;
|
||||
#else
|
||||
ent->ambientLight[0] += factor * data[0];
|
||||
ent->ambientLight[1] += factor * data[1];
|
||||
ent->ambientLight[2] += factor * data[2];
|
||||
|
||||
ent->directedLight[0] += factor * data[3];
|
||||
ent->directedLight[1] += factor * data[4];
|
||||
ent->directedLight[2] += factor * data[5];
|
||||
#endif
|
||||
lat = data[7];
|
||||
lng = data[6];
|
||||
lat *= (FUNCTABLE_SIZE/256);
|
||||
lng *= (FUNCTABLE_SIZE/256);
|
||||
|
||||
// decode X as cos( lat ) * sin( long )
|
||||
// decode Y as sin( lat ) * sin( long )
|
||||
// decode Z as cos( long )
|
||||
|
||||
normal[0] = tr.sinTable[(lat+(FUNCTABLE_SIZE/4))&FUNCTABLE_MASK] * tr.sinTable[lng];
|
||||
normal[1] = tr.sinTable[lat] * tr.sinTable[lng];
|
||||
normal[2] = tr.sinTable[(lng+(FUNCTABLE_SIZE/4))&FUNCTABLE_MASK];
|
||||
|
||||
VectorMA( direction, factor, normal, direction );
|
||||
}
|
||||
|
||||
if ( totalFactor > 0 && totalFactor < 0.99 ) {
|
||||
totalFactor = 1.0f / totalFactor;
|
||||
VectorScale( ent->ambientLight, totalFactor, ent->ambientLight );
|
||||
VectorScale( ent->directedLight, totalFactor, ent->directedLight );
|
||||
}
|
||||
|
||||
VectorScale( ent->ambientLight, r_ambientScale->value, ent->ambientLight );
|
||||
VectorScale( ent->directedLight, r_directedScale->value, ent->directedLight );
|
||||
|
||||
VectorNormalize2( direction, ent->lightDir );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===============
|
||||
LogLight
|
||||
@@ -312,125 +449,6 @@ static void LogLight( trRefEntity_t *ent ) {
|
||||
ri.Printf( PRINT_ALL, "amb:%i dir:%i\n", max1, max2 );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_SetupEntityLighting
|
||||
|
||||
Calculates all the lighting values that will be used
|
||||
by the Calc_* functions
|
||||
=================
|
||||
*/
|
||||
void R_SetupEntityLighting( const trRefdef_t *refdef, trRefEntity_t *ent ) {
|
||||
int i;
|
||||
dlight_t *dl;
|
||||
float power;
|
||||
vec3_t dir;
|
||||
float d;
|
||||
vec3_t lightDir;
|
||||
vec3_t lightOrigin;
|
||||
|
||||
// lighting calculations
|
||||
if ( ent->bLightGridCalculated ) {
|
||||
return;
|
||||
}
|
||||
ent->bLightGridCalculated = qtrue;
|
||||
|
||||
//
|
||||
// trace a sample point down to find ambient light
|
||||
//
|
||||
if ( ent->e.renderfx & RF_LIGHTING_ORIGIN ) {
|
||||
// seperate lightOrigins are needed so an object that is
|
||||
// sinking into the ground can still be lit, and so
|
||||
// multi-part models can be lit identically
|
||||
VectorCopy( ent->e.lightingOrigin, lightOrigin );
|
||||
} else {
|
||||
VectorCopy( ent->e.origin, lightOrigin );
|
||||
}
|
||||
|
||||
// if NOWORLDMODEL, only use dynamic lights (menu system, etc)
|
||||
if ( !(refdef->rdflags & RDF_NOWORLDMODEL )
|
||||
&& tr.world->lightGridData ) {
|
||||
R_SetupEntityLightingGrid( ent );
|
||||
} else {
|
||||
ent->ambientLight[0] = ent->ambientLight[1] =
|
||||
ent->ambientLight[2] = tr.identityLight * 150;
|
||||
ent->directedLight[0] = ent->directedLight[1] =
|
||||
ent->directedLight[2] = tr.identityLight * 150;
|
||||
VectorCopy( tr.sunDirection, ent->lightDir );
|
||||
}
|
||||
|
||||
// bonus items and view weapons have a fixed minimum add
|
||||
if ( 1 /* ent->e.renderfx & RF_MINLIGHT */ ) {
|
||||
// give everything a minimum light add
|
||||
ent->ambientLight[0] += tr.identityLight * 32;
|
||||
ent->ambientLight[1] += tr.identityLight * 32;
|
||||
ent->ambientLight[2] += tr.identityLight * 32;
|
||||
}
|
||||
|
||||
//
|
||||
// modify the light by dynamic lights
|
||||
//
|
||||
d = VectorLength( ent->directedLight );
|
||||
VectorScale( ent->lightDir, d, lightDir );
|
||||
|
||||
for ( i = 0 ; i < refdef->num_dlights ; i++ ) {
|
||||
dl = &refdef->dlights[i];
|
||||
VectorSubtract( dl->origin, lightOrigin, dir );
|
||||
d = VectorNormalize( dir );
|
||||
|
||||
power = DLIGHT_AT_RADIUS * ( dl->radius * dl->radius );
|
||||
if ( d < DLIGHT_MINIMUM_RADIUS ) {
|
||||
d = DLIGHT_MINIMUM_RADIUS;
|
||||
}
|
||||
d = power / ( d * d );
|
||||
|
||||
VectorMA( ent->directedLight, d, dl->color, ent->directedLight );
|
||||
VectorMA( lightDir, d, dir, lightDir );
|
||||
}
|
||||
|
||||
// clamp ambient
|
||||
for ( i = 0 ; i < 3 ; i++ ) {
|
||||
if ( ent->ambientLight[i] > tr.identityLightByte ) {
|
||||
ent->ambientLight[i] = tr.identityLightByte;
|
||||
}
|
||||
}
|
||||
|
||||
// save out the byte packet version
|
||||
((byte *)&ent->ambientLightInt)[0] = myftol( ent->ambientLight[0] );
|
||||
((byte *)&ent->ambientLightInt)[1] = myftol( ent->ambientLight[1] );
|
||||
((byte *)&ent->ambientLightInt)[2] = myftol( ent->ambientLight[2] );
|
||||
((byte *)&ent->ambientLightInt)[3] = 0xff;
|
||||
|
||||
// transform the direction to local space
|
||||
VectorNormalize( lightDir );
|
||||
ent->lightDir[0] = DotProduct( lightDir, ent->e.axis[0] );
|
||||
ent->lightDir[1] = DotProduct( lightDir, ent->e.axis[1] );
|
||||
ent->lightDir[2] = DotProduct( lightDir, ent->e.axis[2] );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_LightForPoint
|
||||
=================
|
||||
*/
|
||||
int R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir )
|
||||
{
|
||||
trRefEntity_t ent;
|
||||
|
||||
// bk010103 - this segfaults with -nolight maps
|
||||
if ( tr.world->lightGridData == NULL )
|
||||
return qfalse;
|
||||
|
||||
Com_Memset(&ent, 0, sizeof(ent));
|
||||
VectorCopy( point, ent.e.origin );
|
||||
R_SetupEntityLightingGrid( &ent );
|
||||
VectorCopy(ent.ambientLight, ambientLight);
|
||||
VectorCopy(ent.directedLight, directedLight);
|
||||
VectorCopy(ent.lightDir, lightDir);
|
||||
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
void R_ClearRealDlights() {
|
||||
memset(dli.allocated, 0, sizeof(dli.allocated));
|
||||
dli.dlightMap = 0;
|
||||
|
||||
+24
-13
@@ -1050,13 +1050,11 @@ typedef struct {
|
||||
int nummarksurfaces;
|
||||
msurface_t **marksurfaces;
|
||||
|
||||
int numfogs;
|
||||
fog_t *fogs;
|
||||
|
||||
vec3_t lightGridOrigin;
|
||||
vec3_t lightGridMins;
|
||||
vec3_t lightGridSize;
|
||||
vec3_t lightGridInverseSize;
|
||||
vec3_t lightGridOOSize;
|
||||
int lightGridBounds[3];
|
||||
unsigned short* lightGridOffsets;
|
||||
byte *lightGridData;
|
||||
byte lightGridPalette[768];
|
||||
|
||||
@@ -1259,7 +1257,7 @@ typedef struct {
|
||||
const byte *externalVisData; // from RE_SetWorldVisData, shared with CM_Load
|
||||
|
||||
image_t *defaultImage;
|
||||
image_t *scratchImage[32];
|
||||
image_t *scratchImage;
|
||||
image_t *fogImage;
|
||||
image_t *dlightImage; // inverse-quare highlight for projective adding
|
||||
image_t *flareImage;
|
||||
@@ -1730,6 +1728,7 @@ skin_t *R_GetSkinByHandle( qhandle_t hSkin );
|
||||
//
|
||||
qhandle_t RE_RegisterShader( const char *name );
|
||||
qhandle_t RE_RegisterShaderNoMip( const char *name );
|
||||
qhandle_t RE_RefreshShaderNoMip(const char* name);
|
||||
qhandle_t RE_RegisterShaderFromImage(const char *name, int lightmapIndex, image_t *image, qboolean mipRawImage);
|
||||
|
||||
shader_t* R_FindShader(const char* name, int lightmapIndex, qboolean mipRawImage, qboolean picmip, qboolean wrapx, qboolean wrapy);
|
||||
@@ -1822,8 +1821,8 @@ void RB_CheckOverflow( int verts, int indexes );
|
||||
|
||||
void RB_StageIteratorGeneric( void );
|
||||
void RB_StageIteratorSky( void );
|
||||
void RB_StageIteratorVertexLitTexture( void );
|
||||
void RB_StageIteratorLightmappedMultitexture( void );
|
||||
void RB_StageIteratorVertexLitTextureUnfogged( void );
|
||||
void RB_StageIteratorLightmappedMultitextureUnfogged( void );
|
||||
|
||||
void RB_AddQuadStamp( vec3_t origin, vec3_t left, vec3_t up, byte *color );
|
||||
void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, byte *color, float s1, float t1, float s2, float t2 );
|
||||
@@ -1844,6 +1843,7 @@ extern terrainVert_t* g_pVert;
|
||||
|
||||
void R_AddBrushModelSurfaces( trRefEntity_t *e );
|
||||
void R_GetInlineModelBounds(int iIndex, vec3_t vMins, vec3_t vMaxs);
|
||||
int R_SphereInLeafs(vec_t* p, float r, mnode_t** nodes, int nMaxNodes);
|
||||
mnode_t* R_PointInLeaf(const vec3_t p);
|
||||
int R_DlightTerrain(cTerraPatchUnpacked_t* surf, int dlightBits);
|
||||
int R_CheckDlightTerrain(cTerraPatchUnpacked_t* surf, int dlightBits);
|
||||
@@ -1874,17 +1874,19 @@ LIGHTS
|
||||
*/
|
||||
|
||||
void R_DlightBmodel( bmodel_t *bmodel );
|
||||
void R_GetLightingGridValue(const vec3_t vPos, vec3_t vLight);
|
||||
void R_GetLightingForDecal(vec3_t vLight, vec3_t vFacing, vec3_t vOrigin);
|
||||
void R_GetLightingForSmoke(vec3_t vLight, vec3_t vOrigin);
|
||||
void R_SetupEntityLighting( const trRefdef_t *refdef, trRefEntity_t *ent );
|
||||
void RB_SetupEntityGridLighting();
|
||||
void RB_SetupStaticModelGridLighting(trRefdef_t* refdef, cStaticModelUnpacked_t* ent, const vec3_t lightOrigin);
|
||||
void R_TransformDlights( int count, dlight_t *dl, orientationr_t *ori );
|
||||
int R_LightForPoint( vec3_t point, vec3_t ambientLight, vec3_t directedLight, vec3_t lightDir );
|
||||
void RB_Light_Real(const color4ub_t colors);
|
||||
void RB_Light_Real(unsigned char* colors);
|
||||
void RB_Sphere_BuildDLights();
|
||||
void RB_Sphere_SetupEntity();
|
||||
void RB_Grid_SetupEntity();
|
||||
void RB_Grid_SetupStaticModel();
|
||||
void RB_Light_Fullbright(const color4ub_t colors);
|
||||
void RB_Light_Fullbright(unsigned char* colors);
|
||||
void R_Sphere_InitLights();
|
||||
int R_GatherLightSources(const vec3_t vPos, vec3_t* pvLightPos, vec3_t* pvLightIntensity, int iMaxLights);
|
||||
void R_UploadDlights();
|
||||
@@ -1964,7 +1966,7 @@ void RE_AddRefEntityToScene( const refEntity_t *ent, int parentEntityNumber);
|
||||
void RE_AddRefSpriteToScene(const refEntity_t* ent);
|
||||
void RE_AddTerrainMarkToScene(int iTerrainIndex, qhandle_t hShader, int numVerts, const polyVert_t* verts, int renderfx);
|
||||
refEntity_t* RE_GetRenderEntity(int entityNumber);
|
||||
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, polyVert_t* verts, int renderfx);
|
||||
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, const polyVert_t* verts, int renderfx);
|
||||
void RE_AddLightToScene( const vec3_t org, float intensity, float r, float g, float b, int type );
|
||||
void RE_AddAdditiveLightToScene( const vec3_t org, float intensity, float r, float g, float b );
|
||||
void RE_RenderScene( const refdef_t *fd );
|
||||
@@ -2036,6 +2038,7 @@ SUN FLARE
|
||||
=============================================================
|
||||
*/
|
||||
void R_InitLensFlare();
|
||||
void R_DrawLensFlares();
|
||||
|
||||
/*
|
||||
=============================================================
|
||||
@@ -2090,6 +2093,7 @@ void R_PrintInfoStaticModels();
|
||||
void R_AddSkelSurfaces(trRefEntity_t* ent);
|
||||
void R_AddStaticModelSurfaces(void);
|
||||
float R_CalcLod(const vec3_t origin, float radius);
|
||||
void R_PrintInfoWorldtris(void);
|
||||
|
||||
extern int g_nStaticSurfaces;
|
||||
extern qboolean g_bInfostaticmodels;
|
||||
@@ -2134,7 +2138,6 @@ void R_TransformClipToWindow( const vec4_t clip, const viewParms_t *view, vec4_t
|
||||
void RB_DeformTessGeometry( void );
|
||||
|
||||
void RB_CalcEnvironmentTexCoords( float *dstTexCoords );
|
||||
void RB_CalcFogTexCoords( float *dstTexCoords );
|
||||
void RB_CalcScrollTexCoords( const float scroll[2], float *dstTexCoords );
|
||||
void RB_CalcRotateTexCoords( float rotSpeed, float *dstTexCoords );
|
||||
void RB_CalcScaleTexCoords( const float scale[2], float *dstTexCoords );
|
||||
@@ -2182,6 +2185,14 @@ RENDERER BACK END COMMAND QUEUE
|
||||
|
||||
#define MAX_RENDER_COMMANDS 0x40000
|
||||
|
||||
typedef struct suninfo_s {
|
||||
vec3_t color;
|
||||
vec3_t direction;
|
||||
vec3_t flaredirection;
|
||||
char szFlareName[64];
|
||||
qboolean exists;
|
||||
} suninfo_t;
|
||||
|
||||
typedef struct {
|
||||
byte cmds[MAX_RENDER_COMMANDS];
|
||||
int used;
|
||||
|
||||
@@ -1094,39 +1094,6 @@ qboolean R_MirrorViewBySurface (drawSurf_t *drawSurf, int entityNum) {
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_SpriteFogNum
|
||||
|
||||
See if a sprite is inside a fog volume
|
||||
=================
|
||||
*/
|
||||
int R_SpriteFogNum( trRefEntity_t *ent ) {
|
||||
int i, j;
|
||||
fog_t *fog;
|
||||
|
||||
if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for ( i = 1 ; i < tr.world->numfogs ; i++ ) {
|
||||
fog = &tr.world->fogs[i];
|
||||
for ( j = 0 ; j < 3 ; j++ ) {
|
||||
if ( ent->e.origin[j] - ent->e.radius >= fog->bounds[1][j] ) {
|
||||
break;
|
||||
}
|
||||
if ( ent->e.origin[j] + ent->e.radius <= fog->bounds[0][j] ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( j == 3 ) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================================
|
||||
|
||||
|
||||
@@ -871,13 +871,6 @@ void R_AddSkelSurfaces( trRefEntity_t *ent ) {
|
||||
ent->e.hasMorph = qtrue;
|
||||
}
|
||||
|
||||
//
|
||||
// set up lighting now that we know we aren't culled
|
||||
//
|
||||
if( !personalModel || r_shadows->integer > 1 ) {
|
||||
R_SetupEntityLighting( &tr.refdef, ent );
|
||||
}
|
||||
|
||||
//
|
||||
// draw all meshes
|
||||
//
|
||||
|
||||
@@ -126,7 +126,7 @@ typedef struct {
|
||||
dtiki_t* (*R_Model_GetHandle)(qhandle_t handle);
|
||||
void (*DrawString)(fontheader_t* font, const char* text, float x, float y, int maxLen, qboolean virtualScreen);
|
||||
float (*GetFontHeight)(const fontheader_t* font);
|
||||
float (*GetFontStringWidth)(const fontheader_t* font, char* string);
|
||||
float (*GetFontStringWidth)(const fontheader_t* font, const char* string);
|
||||
fontheader_t* (*LoadFont)(const char* name);
|
||||
void (*SwipeBegin)(float thisTime, float life, qhandle_t hShader);
|
||||
void (*SwipePoint)(vec3_t point1, vec3_t point2, float time);
|
||||
|
||||
@@ -131,7 +131,7 @@ RE_AddPolyToScene
|
||||
|
||||
=====================
|
||||
*/
|
||||
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, polyVert_t* verts, int renderfx) {
|
||||
qboolean RE_AddPolyToScene(qhandle_t hShader, int numVerts, const polyVert_t* verts, int renderfx) {
|
||||
srfPoly_t *poly;
|
||||
|
||||
if ( !tr.registered ) {
|
||||
|
||||
+20
-71
@@ -306,7 +306,6 @@ to overflow.
|
||||
==============
|
||||
*/
|
||||
void RB_BeginSurface( shader_t *shader ) {
|
||||
|
||||
tess.numIndexes = 0;
|
||||
tess.numVertexes = 0;
|
||||
tess.shader = shader;
|
||||
@@ -316,12 +315,6 @@ void RB_BeginSurface( shader_t *shader ) {
|
||||
tess.numPasses = shader->numUnfoggedPasses;
|
||||
tess.currentStageIteratorFunc = shader->optimalStageIteratorFunc;
|
||||
|
||||
tess.shaderTime = backEnd.refdef.floatTime - tess.shader->timeOffset;
|
||||
if (tess.shader->clampTime && tess.shaderTime >= tess.shader->clampTime) {
|
||||
tess.shaderTime = tess.shader->clampTime;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -682,43 +675,6 @@ static void ProjectDlightTexture( void ) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
===================
|
||||
RB_FogPass
|
||||
|
||||
Blends a fog texture on top of everything else
|
||||
===================
|
||||
*/
|
||||
static void RB_FogPass( void ) {
|
||||
fog_t *fog;
|
||||
int i;
|
||||
|
||||
qglEnableClientState( GL_COLOR_ARRAY );
|
||||
qglColorPointer( 4, GL_UNSIGNED_BYTE, 0, tess.svars.colors );
|
||||
|
||||
qglEnableClientState( GL_TEXTURE_COORD_ARRAY);
|
||||
qglTexCoordPointer( 2, GL_FLOAT, 0, tess.svars.texcoords[0] );
|
||||
|
||||
fog = tr.world->fogs + tess.fogNum;
|
||||
|
||||
for ( i = 0; i < tess.numVertexes; i++ ) {
|
||||
* ( int * )&tess.svars.colors[i] = fog->colorInt;
|
||||
}
|
||||
|
||||
RB_CalcFogTexCoords( ( float * ) tess.svars.texcoords[0] );
|
||||
|
||||
GL_Bind( tr.fogImage );
|
||||
|
||||
if ( tess.shader->fogPass == FP_EQUAL ) {
|
||||
GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA | GLS_DEPTHFUNC_EQUAL );
|
||||
} else {
|
||||
GL_State( GLS_SRCBLEND_SRC_ALPHA | GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA );
|
||||
}
|
||||
|
||||
R_DrawElements( tess.numIndexes, tess.indexes );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
ComputeColors
|
||||
@@ -875,7 +831,7 @@ static void ComputeColors( shaderStage_t *pStage )
|
||||
{
|
||||
float t;
|
||||
|
||||
t = 255.0 / (float)max(r, max(g, b));
|
||||
t = 255.0 / (float)Q_max(r, Q_max(g, b));
|
||||
|
||||
r = (int)((float)r * t);
|
||||
g = (int)((float)g * t);
|
||||
@@ -1113,9 +1069,6 @@ static void ComputeTexCoords( shaderStage_t *pStage ) {
|
||||
tess.svars.texcoords[b][i][1] = DotProduct( tess.xyz[i], pStage->bundle[b].tcGenVectors[1] );
|
||||
}
|
||||
break;
|
||||
case TCGEN_FOG:
|
||||
RB_CalcFogTexCoords( ( float * ) tess.svars.texcoords[b] );
|
||||
break;
|
||||
case TCGEN_ENVIRONMENT_MAPPED:
|
||||
RB_CalcEnvironmentTexCoords( ( float * ) tess.svars.texcoords[b] );
|
||||
break;
|
||||
@@ -1373,7 +1326,7 @@ void RB_StageIteratorGeneric( void )
|
||||
/*
|
||||
** RB_StageIteratorVertexLitTexture
|
||||
*/
|
||||
void RB_StageIteratorVertexLitTexture( void )
|
||||
void RB_StageIteratorVertexLitTextureUnfogged( void )
|
||||
{
|
||||
shaderCommands_t *input;
|
||||
shader_t *shader;
|
||||
@@ -1382,10 +1335,16 @@ void RB_StageIteratorVertexLitTexture( void )
|
||||
|
||||
shader = input->shader;
|
||||
|
||||
//
|
||||
// compute colors
|
||||
//
|
||||
RB_CalcDiffuseColor( ( unsigned char * ) tess.svars.colors );
|
||||
if (backEnd.currentSphere->TessFunction && r_drawspherelights->integer) {
|
||||
backEnd.currentSphere->TessFunction((unsigned char*)tess.svars.colors);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// compute colors
|
||||
//
|
||||
RB_CalcLightGridColor((unsigned char*)tess.svars.colors);
|
||||
}
|
||||
|
||||
//
|
||||
// log this call
|
||||
@@ -1428,17 +1387,10 @@ void RB_StageIteratorVertexLitTexture( void )
|
||||
//
|
||||
// now do any dynamic lighting needed
|
||||
//
|
||||
if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE ) {
|
||||
if ( tess.dlightBits && !tess.dlightMap && tess.shader->sort <= SS_OPAQUE ) {
|
||||
ProjectDlightTexture();
|
||||
}
|
||||
|
||||
//
|
||||
// now do fog
|
||||
//
|
||||
if ( tess.fogNum && tess.shader->fogPass ) {
|
||||
RB_FogPass();
|
||||
}
|
||||
|
||||
//
|
||||
// unlock arrays
|
||||
//
|
||||
@@ -1451,7 +1403,7 @@ void RB_StageIteratorVertexLitTexture( void )
|
||||
|
||||
//define REPLACE_MODE
|
||||
|
||||
void RB_StageIteratorLightmappedMultitexture( void ) {
|
||||
void RB_StageIteratorLightmappedMultitextureUnfogged( void ) {
|
||||
shaderCommands_t *input;
|
||||
|
||||
input = &tess;
|
||||
@@ -1504,7 +1456,11 @@ void RB_StageIteratorLightmappedMultitexture( void ) {
|
||||
} else {
|
||||
GL_TexEnv( GL_MODULATE );
|
||||
}
|
||||
R_BindAnimatedImage( &tess.xstages[0]->bundle[1] );
|
||||
if (tess.dlightMap && tess.xstages[0]->bundle[1].isLightmap) {
|
||||
GL_Bind(&tr.identityLightImage[tess.dlightMap]);
|
||||
} else {
|
||||
R_BindAnimatedImage(&tess.xstages[0]->bundle[1]);
|
||||
}
|
||||
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
|
||||
qglTexCoordPointer( 2, GL_FLOAT, 16, tess.texCoords[0][1] );
|
||||
|
||||
@@ -1533,17 +1489,10 @@ void RB_StageIteratorLightmappedMultitexture( void ) {
|
||||
//
|
||||
// now do any dynamic lighting needed
|
||||
//
|
||||
if ( tess.dlightBits && tess.shader->sort <= SS_OPAQUE ) {
|
||||
if ( tess.dlightBits && !tess.dlightMap && tess.shader->sort <= SS_OPAQUE ) {
|
||||
ProjectDlightTexture();
|
||||
}
|
||||
|
||||
//
|
||||
// now do fog
|
||||
//
|
||||
if ( tess.fogNum && tess.shader->fogPass ) {
|
||||
RB_FogPass();
|
||||
}
|
||||
|
||||
//
|
||||
// unlock arrays
|
||||
//
|
||||
|
||||
@@ -619,7 +619,7 @@ void RB_CalcColorFromOneMinusEntity( unsigned char *dstColors )
|
||||
{
|
||||
int i;
|
||||
int *pColors = ( int * ) dstColors;
|
||||
unsigned char invModulate[3];
|
||||
unsigned char invModulate[4];
|
||||
int c;
|
||||
|
||||
if ( !backEnd.currentEntity )
|
||||
@@ -801,95 +801,6 @@ TEX COORDS
|
||||
====================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
========================
|
||||
RB_CalcFogTexCoords
|
||||
|
||||
To do the clipped fog plane really correctly, we should use
|
||||
projected textures, but I don't trust the drivers and it
|
||||
doesn't fit our shader data.
|
||||
========================
|
||||
*/
|
||||
void RB_CalcFogTexCoords( float *st ) {
|
||||
int i;
|
||||
float *v;
|
||||
float s, t;
|
||||
float eyeT;
|
||||
qboolean eyeOutside;
|
||||
fog_t *fog;
|
||||
vec3_t local;
|
||||
vec4_t fogDistanceVector, fogDepthVector;
|
||||
|
||||
fog = tr.world->fogs + tess.fogNum;
|
||||
|
||||
// all fogging distance is based on world Z units
|
||||
VectorSubtract( backEnd.ori.origin, backEnd.viewParms.ori.origin, local );
|
||||
fogDistanceVector[0] = -backEnd.ori.modelMatrix[2];
|
||||
fogDistanceVector[1] = -backEnd.ori.modelMatrix[6];
|
||||
fogDistanceVector[2] = -backEnd.ori.modelMatrix[10];
|
||||
fogDistanceVector[3] = DotProduct( local, backEnd.viewParms.ori.axis[0] );
|
||||
|
||||
// scale the fog vectors based on the fog's thickness
|
||||
fogDistanceVector[0] *= fog->tcScale;
|
||||
fogDistanceVector[1] *= fog->tcScale;
|
||||
fogDistanceVector[2] *= fog->tcScale;
|
||||
fogDistanceVector[3] *= fog->tcScale;
|
||||
|
||||
// rotate the gradient vector for this orientation
|
||||
if ( fog->hasSurface ) {
|
||||
fogDepthVector[0] = fog->surface[0] * backEnd.ori.axis[0][0] +
|
||||
fog->surface[1] * backEnd.ori.axis[0][1] + fog->surface[2] * backEnd.ori.axis[0][2];
|
||||
fogDepthVector[1] = fog->surface[0] * backEnd.ori.axis[1][0] +
|
||||
fog->surface[1] * backEnd.ori.axis[1][1] + fog->surface[2] * backEnd.ori.axis[1][2];
|
||||
fogDepthVector[2] = fog->surface[0] * backEnd.ori.axis[2][0] +
|
||||
fog->surface[1] * backEnd.ori.axis[2][1] + fog->surface[2] * backEnd.ori.axis[2][2];
|
||||
fogDepthVector[3] = -fog->surface[3] + DotProduct( backEnd.ori.origin, fog->surface );
|
||||
|
||||
eyeT = DotProduct( backEnd.ori.viewOrigin, fogDepthVector ) + fogDepthVector[3];
|
||||
} else {
|
||||
eyeT = 1; // non-surface fog always has eye inside
|
||||
}
|
||||
|
||||
// see if the viewpoint is outside
|
||||
// this is needed for clipping distance even for constant fog
|
||||
|
||||
if ( eyeT < 0 ) {
|
||||
eyeOutside = qtrue;
|
||||
} else {
|
||||
eyeOutside = qfalse;
|
||||
}
|
||||
|
||||
fogDistanceVector[3] += 1.0/512;
|
||||
|
||||
// calculate density for each point
|
||||
for (i = 0, v = tess.xyz[0] ; i < tess.numVertexes ; i++, v += 4) {
|
||||
// calculate the length in fog
|
||||
s = DotProduct( v, fogDistanceVector ) + fogDistanceVector[3];
|
||||
t = DotProduct( v, fogDepthVector ) + fogDepthVector[3];
|
||||
|
||||
// partially clipped fogs use the T axis
|
||||
if ( eyeOutside ) {
|
||||
if ( t < 1.0 ) {
|
||||
t = 1.0/32; // point is outside, so no fogging
|
||||
} else {
|
||||
t = 1.0/32 + 30.0/32 * t / ( t - eyeT ); // cut the distance at the fog plane
|
||||
}
|
||||
} else {
|
||||
if ( t < 0 ) {
|
||||
t = 1.0/32; // point is outside, so no fogging
|
||||
} else {
|
||||
t = 31.0/32;
|
||||
}
|
||||
}
|
||||
|
||||
st[0] = s;
|
||||
st[1] = t;
|
||||
st += 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** RB_CalcEnvironmentTexCoords
|
||||
*/
|
||||
@@ -1099,7 +1010,36 @@ void RB_CalcSpecularAlpha(unsigned char* alphas, float alphaMax, vec3_t lightOri
|
||||
|
||||
void RB_CalcLightGridColor(unsigned char* colors)
|
||||
{
|
||||
// FIXME/ unimplemented
|
||||
int i;
|
||||
|
||||
if (!backEnd.currentEntity) {
|
||||
for (i = 0; i < tess.numVertexes; i++) {
|
||||
colors[i * 4] = backEnd.currentStaticModel->iGridLighting;
|
||||
colors[i * 4 + 1] = backEnd.currentStaticModel->iGridLighting;
|
||||
colors[i * 4 + 2] = backEnd.currentStaticModel->iGridLighting;
|
||||
colors[i * 4 + 3] = backEnd.currentStaticModel->iGridLighting;
|
||||
}
|
||||
}
|
||||
else if (backEnd.currentEntity != &tr.worldEntity) {
|
||||
for (i = 0; i < tess.numVertexes; i++) {
|
||||
colors[i * 4] = backEnd.currentEntity->iGridLighting;
|
||||
colors[i * 4 + 1] = backEnd.currentEntity->iGridLighting;
|
||||
colors[i * 4 + 2] = backEnd.currentEntity->iGridLighting;
|
||||
colors[i * 4 + 3] = backEnd.currentEntity->iGridLighting;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Com_Printf(
|
||||
"##### shader '%s' incorrectly uses rgbGen lightingGrid or lightingSpherical; was rgbGen vertex intended?\n",
|
||||
tess.shader->name);
|
||||
|
||||
for (i = 0; i < tess.numVertexes; i++) {
|
||||
colors[i * 4] = 0xFF;
|
||||
colors[i * 4 + 1] = 0xFF;
|
||||
colors[i * 4 + 2] = 0xFF;
|
||||
colors[i * 4 + 3] = 0xFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RB_CalcAlphaFromDotView(unsigned char* colors, float alphaMin, float alphaMax)
|
||||
|
||||
+242
-103
@@ -625,7 +625,7 @@ static void ParseTexMod( char *_text, shaderStage_t *stage, int cntBundle )
|
||||
}
|
||||
else
|
||||
{
|
||||
ri.Printf( PRINT_WARNING, "WARNING: unknown tcMod '%s' in shader '%s'\n", token, shader.name );
|
||||
ri.Printf(PRINT_WARNING, "WARNING: unknown tcMod '%s' in shader '%s'\n", token, shader.name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -635,9 +635,9 @@ static void ParseTexMod( char *_text, shaderStage_t *stage, int cntBundle )
|
||||
ParseStage
|
||||
===================
|
||||
*/
|
||||
static qboolean ParseStage( shaderStage_t *stage, char **text )
|
||||
static qboolean ParseStage(shaderStage_t* stage, char** text)
|
||||
{
|
||||
char *token;
|
||||
char* token;
|
||||
int depthMaskBits = GLS_DEPTHMASK_TRUE, blendSrcBits = 0, blendDstBits = 0, atestBits = 0, depthFuncBits = 0;
|
||||
qboolean depthMaskExplicit = qfalse;
|
||||
int cntBundle = 0;
|
||||
@@ -649,33 +649,33 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
||||
stage->noPicMip = shader_noPicMip;
|
||||
stage->force32bit = shader_force32bit;
|
||||
|
||||
while ( 1 )
|
||||
while (1)
|
||||
{
|
||||
token = COM_ParseExt( text, qtrue );
|
||||
if ( !token[0] )
|
||||
token = COM_ParseExt(text, qtrue);
|
||||
if (!token[0])
|
||||
{
|
||||
ri.Printf( PRINT_WARNING, "WARNING: no matching '}' found\n" );
|
||||
ri.Printf(PRINT_WARNING, "WARNING: no matching '}' found\n");
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if ( token[0] == '}' )
|
||||
if (token[0] == '}')
|
||||
{
|
||||
break;
|
||||
}
|
||||
// no picmip adjustment
|
||||
else if ( !Q_stricmp( token, "nomipmaps" ) )
|
||||
else if (!Q_stricmp(token, "nomipmaps"))
|
||||
{
|
||||
stage->noMipMaps = qtrue;
|
||||
continue;
|
||||
}
|
||||
// no picmip adjustment
|
||||
else if ( !Q_stricmp( token, "nopicmip" ) )
|
||||
else if (!Q_stricmp(token, "nopicmip"))
|
||||
{
|
||||
stage->noPicMip = qtrue;
|
||||
continue;
|
||||
}
|
||||
// no picmip adjustment
|
||||
else if ( !Q_stricmp( token, "nofog" ) )
|
||||
else if (!Q_stricmp(token, "nofog"))
|
||||
{
|
||||
fogBits = GLS_FOG;
|
||||
continue;
|
||||
@@ -683,36 +683,37 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
||||
//
|
||||
// map <name>
|
||||
//
|
||||
else if ( !Q_stricmp( token, "map" ) )
|
||||
else if (!Q_stricmp(token, "map"))
|
||||
{
|
||||
token = COM_ParseExt( text, qfalse );
|
||||
if ( !token[0] )
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (!token[0])
|
||||
{
|
||||
ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'map' keyword in shader '%s'\n", shader.name );
|
||||
ri.Printf(PRINT_WARNING, "WARNING: missing parameter for 'map' keyword in shader '%s'\n", shader.name);
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if ( !Q_stricmp( token, "$whiteimage" ) )
|
||||
if (!Q_stricmp(token, "$whiteimage"))
|
||||
{
|
||||
stage->bundle[cntBundle].image[0] = tr.whiteImage;
|
||||
continue;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "$lightmap" ) )
|
||||
else if (!Q_stricmp(token, "$lightmap"))
|
||||
{
|
||||
stage->bundle[cntBundle].isLightmap = qtrue;
|
||||
if ( shader.lightmapIndex < 0 ) {
|
||||
if (shader.lightmapIndex < 0) {
|
||||
stage->bundle[cntBundle].image[0] = tr.whiteImage;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
stage->bundle[cntBundle].image[0] = tr.lightmaps[shader.lightmapIndex];
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
stage->bundle[cntBundle].image[0] = R_FindImageFile( token, !stage->noMipMaps, !stage->noPicMip, qfalse, GL_REPEAT, GL_REPEAT );
|
||||
if ( !stage->bundle[cntBundle].image[0] )
|
||||
stage->bundle[cntBundle].image[0] = R_FindImageFile(token, !stage->noMipMaps, !stage->noPicMip, qfalse, GL_REPEAT, GL_REPEAT);
|
||||
if (!stage->bundle[cntBundle].image[0])
|
||||
{
|
||||
ri.Printf( PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name );
|
||||
ri.Printf(PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name);
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
@@ -720,19 +721,58 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
||||
//
|
||||
// clampmap <name>
|
||||
//
|
||||
else if ( !Q_stricmp( token, "clampmap" ) )
|
||||
else if (!Q_stricmpn(token, "clampmap", 8))
|
||||
{
|
||||
token = COM_ParseExt( text, qfalse );
|
||||
if ( !token[0] )
|
||||
int clampx, clampy;
|
||||
|
||||
if (!token[8]) {
|
||||
if (!r_forceClampToEdge->value) {
|
||||
clampx = GL_CLAMP;
|
||||
clampy = GL_CLAMP;
|
||||
}
|
||||
else {
|
||||
clampx = GL_CLAMP_TO_EDGE;
|
||||
clampy = GL_CLAMP_TO_EDGE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (token[8] == 'x')
|
||||
{
|
||||
if (!r_forceClampToEdge->value) {
|
||||
clampx = GL_CLAMP;
|
||||
}
|
||||
else {
|
||||
clampx = GL_CLAMP_TO_EDGE;
|
||||
}
|
||||
clampy = GL_CLAMP;
|
||||
}
|
||||
else if (token[8] == 'y')
|
||||
{
|
||||
clampx = GL_CLAMP;
|
||||
if (!r_forceClampToEdge->value) {
|
||||
clampy = GL_CLAMP;
|
||||
}
|
||||
else {
|
||||
clampy = GL_CLAMP_TO_EDGE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ri.Printf(PRINT_WARNING, "WARNING: Converting unknown clampmap type to clampmap\n");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (!token[0])
|
||||
{
|
||||
ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'clampmap' keyword in shader '%s'\n", shader.name );
|
||||
ri.Printf(PRINT_WARNING, "WARNING: missing parameter for 'clampmap' keyword in shader '%s'\n", shader.name);
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
stage->bundle[cntBundle].image[0] = R_FindImageFile(token, !stage->noMipMaps, !stage->noPicMip, qfalse, r_forceClampToEdge->value ? GL_CLAMP_TO_EDGE : GL_CLAMP, r_forceClampToEdge->value ? GL_CLAMP_TO_EDGE : GL_CLAMP);
|
||||
if ( !stage->bundle[cntBundle].image[0] )
|
||||
stage->bundle[cntBundle].image[0] = R_FindImageFile(token, !stage->noMipMaps, !stage->noPicMip, qfalse, clampx, clampy);
|
||||
if (!stage->bundle[cntBundle].image[0])
|
||||
{
|
||||
ri.Printf( PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name );
|
||||
ri.Printf(PRINT_WARNING, "WARNING: R_FindImageFile could not find '%s' in shader '%s'\n", token, shader.name);
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
@@ -871,6 +911,60 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
||||
ParseWaveForm( text, &stage->rgbWave );
|
||||
stage->rgbGen = CGEN_WAVEFORM;
|
||||
}
|
||||
else if (!Q_stricmp(token, "colorwave"))
|
||||
{
|
||||
vec3_t v;
|
||||
|
||||
ParseVector(text, 3, v);
|
||||
stage->colorConst[0] = v[0] * 255.0;
|
||||
stage->colorConst[1] = v[1] * 255.0;
|
||||
stage->colorConst[2] = v[2] * 255.0;
|
||||
stage->rgbGen = CGEN_MULTIPLY_BY_WAVEFORM;
|
||||
shader.flags |= 2;
|
||||
}
|
||||
else if (!Q_stricmp(token, "identity"))
|
||||
{
|
||||
stage->rgbGen = CGEN_IDENTITY;
|
||||
}
|
||||
else if (!Q_stricmp(token, "identityLighting"))
|
||||
{
|
||||
stage->rgbGen = CGEN_IDENTITY_LIGHTING;
|
||||
}
|
||||
else if (!Q_stricmp(token, "global"))
|
||||
{
|
||||
stage->rgbGen = CGEN_GLOBAL_COLOR;
|
||||
}
|
||||
else if (!Q_stricmp(token, "entity") || !Q_stricmp(token, "fromentity"))
|
||||
{
|
||||
stage->rgbGen = CGEN_ENTITY;
|
||||
}
|
||||
else if (!Q_stricmp(token, "oneMinusEntity"))
|
||||
{
|
||||
stage->rgbGen = CGEN_ONE_MINUS_ENTITY;
|
||||
}
|
||||
else if (!Q_stricmp(token, "vertex") || !Q_stricmp(token, "fromclient"))
|
||||
{
|
||||
stage->rgbGen = CGEN_VERTEX;
|
||||
if (stage->alphaGen == 0) {
|
||||
stage->alphaGen = AGEN_VERTEX;
|
||||
}
|
||||
}
|
||||
else if (!Q_stricmp(token, "exactVertex"))
|
||||
{
|
||||
stage->rgbGen = CGEN_EXACT_VERTEX;
|
||||
}
|
||||
else if (!Q_stricmp(token, "lightingGrid"))
|
||||
{
|
||||
stage->rgbGen = CGEN_LIGHTING_GRID;
|
||||
}
|
||||
else if (!Q_stricmp(token, "lightingSpherical"))
|
||||
{
|
||||
stage->rgbGen = CGEN_LIGHTING_SPHERICAL;
|
||||
}
|
||||
else if (!Q_stricmp(token, "oneMinusVertex"))
|
||||
{
|
||||
stage->rgbGen = CGEN_ONE_MINUS_VERTEX;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "const" ) || !Q_stricmp(token, "constant"))
|
||||
{
|
||||
vec3_t color;
|
||||
@@ -882,44 +976,91 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
||||
|
||||
stage->rgbGen = CGEN_CONSTANT;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "identity" ) )
|
||||
else if (!Q_stricmp(token, "static"))
|
||||
{
|
||||
stage->rgbGen = CGEN_IDENTITY;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "identityLighting" ) )
|
||||
{
|
||||
stage->rgbGen = CGEN_IDENTITY_LIGHTING;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "entity" ) )
|
||||
{
|
||||
stage->rgbGen = CGEN_ENTITY;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "oneMinusEntity" ) )
|
||||
{
|
||||
stage->rgbGen = CGEN_ONE_MINUS_ENTITY;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "vertex" ) )
|
||||
{
|
||||
stage->rgbGen = CGEN_VERTEX;
|
||||
if ( stage->alphaGen == 0 ) {
|
||||
stage->rgbGen = CGEN_STATIC;
|
||||
if (stage->alphaGen == AGEN_IDENTITY) {
|
||||
stage->alphaGen = AGEN_VERTEX;
|
||||
}
|
||||
}
|
||||
else if ( !Q_stricmp( token, "exactVertex" ) )
|
||||
else if (!Q_stricmp(token, "sCoord") || !Q_stricmp(token, "tCoord"))
|
||||
{
|
||||
stage->rgbGen = CGEN_EXACT_VERTEX;
|
||||
if (!Q_stricmp(token, "sCoord")) {
|
||||
stage->rgbGen = CGEN_SCOORD;
|
||||
}
|
||||
else {
|
||||
stage->rgbGen = CGEN_TCOORD;
|
||||
}
|
||||
|
||||
stage->alphaMin = 0.0;
|
||||
stage->alphaMax = 1.0;
|
||||
stage->alphaConstMin = 0;
|
||||
stage->alphaConst = -1;
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
stage->alphaMin = atof(token);
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
stage->alphaMax = atof(token);
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
stage->alphaConstMin = atof(token) * 255.0;
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
ri.Printf(PRINT_WARNING, "WARNING: missing rgbGen sCoord or tCoord parm 'max' in shader '%s'\n", shader.name);
|
||||
continue;
|
||||
}
|
||||
|
||||
stage->alphaConst = atof(token) * 255.0;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "lightingGrid" ) )
|
||||
else if (!Q_stricmp(token, "dot"))
|
||||
{
|
||||
stage->rgbGen = CGEN_LIGHTING_GRID;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "lightingSpherical" ) )
|
||||
stage->rgbGen = CGEN_DOT;
|
||||
stage->alphaMin = 0.0;
|
||||
stage->alphaMax = 1.0;
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
stage->alphaMin = atof(token);
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
stage->alphaMax = atof(token);
|
||||
}
|
||||
else if (!Q_stricmp(token, "oneminusdot"))
|
||||
{
|
||||
stage->rgbGen = CGEN_LIGHTING_SPHERICAL;
|
||||
}
|
||||
else if ( !Q_stricmp( token, "oneMinusVertex" ) )
|
||||
{
|
||||
stage->rgbGen = CGEN_ONE_MINUS_VERTEX;
|
||||
stage->rgbGen = CGEN_ONE_MINUS_DOT;
|
||||
stage->alphaMin = 0.0;
|
||||
stage->alphaMax = 1.0;
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
stage->alphaMin = atof(token);
|
||||
|
||||
token = COM_ParseExt(text, qfalse);
|
||||
if (token[0] == 0) {
|
||||
continue;
|
||||
}
|
||||
stage->alphaMax = atof(token);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1539,7 +1680,12 @@ static void ParseSkyParms( char **text ) {
|
||||
for (i=0 ; i<6 ; i++) {
|
||||
Com_sprintf( pathname, sizeof(pathname), "%s_%s.tga"
|
||||
, token, suf[i] );
|
||||
shader.sky.outerbox[i] = R_FindImageFile( ( char * ) pathname, qtrue, qtrue, qfalse, GL_CLAMP, GL_CLAMP );
|
||||
if (!r_forceClampToEdge->integer) {
|
||||
shader.sky.outerbox[i] = R_FindImageFile((char*)pathname, qtrue, qtrue, shader_force32bit, GL_CLAMP, GL_CLAMP);
|
||||
}
|
||||
else {
|
||||
shader.sky.outerbox[i] = R_FindImageFile((char*)pathname, qtrue, qtrue, shader_force32bit, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
|
||||
}
|
||||
if ( !shader.sky.outerbox[i] ) {
|
||||
shader.sky.outerbox[i] = tr.defaultImage;
|
||||
}
|
||||
@@ -1569,7 +1715,7 @@ static void ParseSkyParms( char **text ) {
|
||||
for (i=0 ; i<6 ; i++) {
|
||||
Com_sprintf( pathname, sizeof(pathname), "%s_%s.tga"
|
||||
, token, suf[i] );
|
||||
shader.sky.outerbox[i] = R_FindImageFile( ( char * ) pathname, qtrue, qtrue, qfalse, GL_REPEAT, GL_REPEAT );
|
||||
shader.sky.outerbox[i] = R_FindImageFile( ( char * ) pathname, qtrue, qtrue, shader_force32bit, GL_REPEAT, GL_REPEAT );
|
||||
if ( !shader.sky.innerbox[i] ) {
|
||||
shader.sky.innerbox[i] = tr.defaultImage;
|
||||
}
|
||||
@@ -1953,6 +2099,14 @@ static qboolean ParseShader( char **text )
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
if (!(shader.flags & 2)) {
|
||||
shader.flags &= ~1;
|
||||
}
|
||||
|
||||
if ((shader.contentFlags & CONTENTS_FENCE) != 0 && shader.cullType == CT_TWO_SIDED) {
|
||||
shader.cullType = CT_FRONT_SIDED;
|
||||
}
|
||||
|
||||
shader.explicitlyDefined = qtrue;
|
||||
|
||||
return qtrue;
|
||||
@@ -2009,7 +2163,7 @@ static void ComputeStageIteratorFunc( void )
|
||||
{
|
||||
if ( !shader.numDeforms )
|
||||
{
|
||||
shader.optimalStageIteratorFunc = RB_StageIteratorVertexLitTexture;
|
||||
shader.optimalStageIteratorFunc = RB_StageIteratorVertexLitTextureUnfogged;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@@ -2035,7 +2189,7 @@ static void ComputeStageIteratorFunc( void )
|
||||
{
|
||||
if (unfoggedStages[0].multitextureEnv )
|
||||
{
|
||||
shader.optimalStageIteratorFunc = RB_StageIteratorLightmappedMultitexture;
|
||||
shader.optimalStageIteratorFunc = RB_StageIteratorLightmappedMultitextureUnfogged;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@@ -2530,16 +2684,16 @@ static shader_t *FinishShader( void ) {
|
||||
//
|
||||
// default texture coordinate generation
|
||||
//
|
||||
for (bundle = 2; bundle > 0; bundle--) {
|
||||
if (pStage->bundle[bundle - 1].isLightmap) {
|
||||
if (pStage->bundle[bundle - 1].tcGen == TCGEN_BAD) {
|
||||
pStage->bundle[bundle - 1].tcGen = TCGEN_LIGHTMAP;
|
||||
for (bundle = 0; bundle < 2; bundle++) {
|
||||
if (pStage->bundle[bundle].isLightmap) {
|
||||
if (pStage->bundle[bundle].tcGen == TCGEN_BAD) {
|
||||
pStage->bundle[bundle].tcGen = TCGEN_LIGHTMAP;
|
||||
}
|
||||
hasLightmapStage = qtrue;
|
||||
}
|
||||
else {
|
||||
if (pStage->bundle[bundle - 1].tcGen == TCGEN_BAD) {
|
||||
pStage->bundle[bundle - 1].tcGen = TCGEN_TEXTURE;
|
||||
if (pStage->bundle[bundle].tcGen == TCGEN_BAD) {
|
||||
pStage->bundle[bundle].tcGen = TCGEN_TEXTURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2552,31 +2706,6 @@ static shader_t *FinishShader( void ) {
|
||||
pStage->bundle[0] = pStage->bundle[1];
|
||||
pStage->bundle[1] = tmpBundle;
|
||||
}
|
||||
|
||||
//
|
||||
// determine sort order and fog color adjustment
|
||||
//
|
||||
if ( ( pStage->stateBits & ( GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS ) ) &&
|
||||
( unfoggedStages[0].stateBits & ( GLS_SRCBLEND_BITS | GLS_DSTBLEND_BITS ) ) ) {
|
||||
int blendSrcBits = pStage->stateBits & GLS_SRCBLEND_BITS;
|
||||
int blendDstBits = pStage->stateBits & GLS_DSTBLEND_BITS;
|
||||
|
||||
// don't screw with sort order if this is a portal or environment
|
||||
if ( !shader.sort ) {
|
||||
// see through item, like a grill or grate
|
||||
if ( pStage->stateBits & GLS_DEPTHMASK_TRUE ) {
|
||||
shader.sort = SS_SEE_THROUGH;
|
||||
} else {
|
||||
shader.sort = SS_BLEND0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// there are times when you will need to manually apply a sort to
|
||||
// opaque alpha tested shaders that have later blend passes
|
||||
if ( !shader.sort ) {
|
||||
shader.sort = SS_OPAQUE;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -2645,7 +2774,7 @@ static shader_t *FinishShader( void ) {
|
||||
}
|
||||
|
||||
// fogonly shaders don't have any normal passes
|
||||
if (shader.sort == SS_BAD) {
|
||||
if (!shader.sort) {
|
||||
shader.sort = SS_OPAQUE;
|
||||
}
|
||||
|
||||
@@ -2735,17 +2864,22 @@ shader_t* R_FindShader(const char* name, int lightmapIndex, qboolean mipRawImage
|
||||
// with that same strippedName a new default shader is created.
|
||||
if (!Q_stricmp(currentShader->name, strippedName))
|
||||
{
|
||||
if (currentShader->shader && (currentShader->shader->lightmapIndex == lightmapIndex || currentShader->shader->defaultShader))
|
||||
{
|
||||
// match found
|
||||
return currentShader->shader;
|
||||
}
|
||||
// shader text found, but it has no shared assigned
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!currentShader) {
|
||||
if (currentShader)
|
||||
{
|
||||
for (sh = currentShader->shader; sh; sh = sh->next)
|
||||
{
|
||||
if (sh->lightmapIndex == lightmapIndex || sh == tr.defaultShader) {
|
||||
return sh;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// create a new shader text
|
||||
currentShader = AddShaderTextToHash(strippedName, hash);
|
||||
}
|
||||
@@ -2940,6 +3074,11 @@ qhandle_t RE_RegisterShaderNoMip( const char *name ) {
|
||||
return sh->index;
|
||||
}
|
||||
|
||||
qhandle_t RE_RefreshShaderNoMip(const char* name) {
|
||||
// FIXME: unimplemented
|
||||
// Workaround
|
||||
return RE_RegisterShaderNoMip(name);
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
@@ -3016,9 +3155,9 @@ void R_ShaderList_f (void) {
|
||||
ri.Printf( PRINT_ALL, "gen " );
|
||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorSky ) {
|
||||
ri.Printf( PRINT_ALL, "sky " );
|
||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorLightmappedMultitexture ) {
|
||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorLightmappedMultitextureUnfogged ) {
|
||||
ri.Printf( PRINT_ALL, "lmmt" );
|
||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorVertexLitTexture ) {
|
||||
} else if ( shader->optimalStageIteratorFunc == RB_StageIteratorVertexLitTextureUnfogged ) {
|
||||
ri.Printf( PRINT_ALL, "vlt " );
|
||||
} else {
|
||||
ri.Printf( PRINT_ALL, " " );
|
||||
|
||||
@@ -811,7 +811,7 @@ void RB_StageIteratorSky( void ) {
|
||||
if ( r_showsky->integer ) {
|
||||
qglDepthRange( 0.0, 0.0 );
|
||||
} else {
|
||||
qglDepthRange( 1.0, 1.0 );
|
||||
qglDepthRange( 1.875, 1.875 );
|
||||
}
|
||||
|
||||
// draw the outer skybox
|
||||
|
||||
@@ -24,13 +24,40 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
#include "tr_local.h"
|
||||
|
||||
vec3_t spheredef[6];
|
||||
suninfo_t s_sun;
|
||||
static vec3_t ambientlight;
|
||||
static qboolean bEntityOverbright;
|
||||
static int iEntityLightingMax;
|
||||
static int light_reference_count = 0;
|
||||
|
||||
int compare_light_intensities(const void* p1, const void* p2)
|
||||
{
|
||||
return ((const reallightinfo_t*)p2)->fIntensity - ((const reallightinfo_t*)p1)->fIntensity;
|
||||
}
|
||||
|
||||
static void RB_OptimizeLights()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
static void RB_Light_CubeMap(const color4ub_t colors)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
void RB_Light_Real(const color4ub_t colors)
|
||||
void RB_Light_Real(unsigned char* colors)
|
||||
{
|
||||
int i, j;
|
||||
float* normal;
|
||||
float* xyz;
|
||||
unsigned char* color;
|
||||
vec3_t v;
|
||||
vec3_t colorout;
|
||||
float fDot;
|
||||
reallightinfo_t* pLight;
|
||||
|
||||
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
@@ -42,16 +69,90 @@ static void RB_Sphere_Light_Sun()
|
||||
static qboolean RB_Sphere_CalculateSphereOrigin()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
static bool RB_Sphere_SetupGlobals()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
int i;
|
||||
|
||||
if (backEnd.refdef.rdflags & RDF_NOWORLDMODEL) {
|
||||
if (!(backEnd.refdef.rdflags & RDF_FULLBRIGHT)) {
|
||||
backEnd.currentSphere->TessFunction = &RB_Light_Fullbright;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (!(backEnd.refdef.rdflags & RDF_FULLBRIGHT)) {
|
||||
if (!RB_Sphere_CalculateSphereOrigin()) {
|
||||
backEnd.currentSphere->TessFunction = &RB_CalcLightGridColor;
|
||||
|
||||
if (!backEnd.currentEntity->bLightGridCalculated) {
|
||||
RB_SetupEntityGridLighting();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (backEnd.refdef.vieworg[0] == 0 && backEnd.refdef.vieworg[1] == 0 && backEnd.refdef.vieworg[2] == 0) {
|
||||
backEnd.currentSphere->TessFunction = &RB_Light_Fullbright;
|
||||
return false;
|
||||
}
|
||||
|
||||
VectorCopy(backEnd.refdef.vieworg, backEnd.currentSphere->worldOrigin);
|
||||
VectorClear(backEnd.currentSphere->origin);
|
||||
backEnd.currentSphere->radius = 2.0;
|
||||
}
|
||||
|
||||
light_reference_count++;
|
||||
for (i = 0; i < 8; i++) {
|
||||
backEnd.currentSphere->leaves[i] = 0;
|
||||
}
|
||||
|
||||
R_SphereInLeafs(backEnd.currentSphere->worldOrigin, backEnd.currentSphere->radius, backEnd.currentSphere->leaves, 8);
|
||||
|
||||
backEnd.currentSphere->TessFunction = &RB_Light_Real;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool RB_Sphere_ResetPointColors()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
vec3_t light_offset, amb;
|
||||
|
||||
R_GetLightingGridValue(backEnd.currentSphere->worldOrigin, light_offset);
|
||||
light_offset[0] = ambientlight[0] + light_offset[0] * 0.18;
|
||||
light_offset[1] = ambientlight[1] + light_offset[1] * 0.18;
|
||||
light_offset[2] = ambientlight[2] + light_offset[2] * 0.18;
|
||||
if (tr.refdef.rdflags & RDF_FULLBRIGHT)
|
||||
{
|
||||
float fMin = tr.identityLight * 20.0;
|
||||
|
||||
if (fMin <= light_offset[0] || fMin <= light_offset[1] || fMin <= light_offset[2]) {
|
||||
light_offset[0] += fMin;
|
||||
light_offset[1] += fMin;
|
||||
light_offset[2] += fMin;
|
||||
}
|
||||
}
|
||||
|
||||
backEnd.currentSphere->ambient.level[0] = r_entlight_scale->value * tr.overbrightMult * light_offset[0];
|
||||
if (backEnd.currentSphere->ambient.level[0] >= 255.0) {
|
||||
backEnd.currentSphere->ambient.level[0] = -1;
|
||||
}
|
||||
|
||||
backEnd.currentSphere->ambient.level[1] = r_entlight_scale->value * tr.overbrightMult * light_offset[0];
|
||||
if (backEnd.currentSphere->ambient.level[1] >= 255.0) {
|
||||
backEnd.currentSphere->ambient.level[1] = -1;
|
||||
}
|
||||
|
||||
backEnd.currentSphere->ambient.level[2] = r_entlight_scale->value * tr.overbrightMult * light_offset[0];
|
||||
if (backEnd.currentSphere->ambient.level[2] >= 255.0) {
|
||||
backEnd.currentSphere->ambient.level[2] = -1;
|
||||
}
|
||||
|
||||
backEnd.currentSphere->ambient.level[3] = -1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void RB_Sphere_DrawDebugLine(const spherel_t* thislight, float falloff, const vec3_t origin)
|
||||
@@ -81,7 +182,19 @@ void RB_Sphere_BuildDLights()
|
||||
|
||||
void RB_Sphere_SetupEntity()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
if (r_light_nolight->integer)
|
||||
{
|
||||
backEnd.currentSphere->TessFunction = &RB_Light_Fullbright;
|
||||
}
|
||||
else if (RB_Sphere_SetupGlobals() && RB_Sphere_ResetPointColors())
|
||||
{
|
||||
backEnd.currentSphere->numRealLights = 0;
|
||||
RB_Sphere_Light_Sun();
|
||||
RB_Sphere_BuildStaticLights();
|
||||
RB_Sphere_BuildDLights();
|
||||
backEnd.pc.c_characterlights += backEnd.currentSphere->numRealLights;
|
||||
RB_OptimizeLights();
|
||||
}
|
||||
}
|
||||
|
||||
void RB_Grid_SetupEntity()
|
||||
@@ -91,17 +204,103 @@ void RB_Grid_SetupEntity()
|
||||
|
||||
void RB_Grid_SetupStaticModel()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
RB_SetupStaticModelGridLighting(&tr.refdef, backEnd.currentStaticModel, backEnd.currentStaticModel->origin);
|
||||
}
|
||||
|
||||
void RB_Light_Fullbright(const color4ub_t colors)
|
||||
void RB_Light_Fullbright(unsigned char* colors)
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
memset((void*)colors, 0xFF, tess.numVertexes);
|
||||
}
|
||||
|
||||
void R_Sphere_InitLights()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
const char* ents;
|
||||
const char* ret;
|
||||
qboolean bFlareDirSet;
|
||||
|
||||
ents = ri.CM_EntityString();
|
||||
bFlareDirSet = qfalse;
|
||||
s_sun.szFlareName[0] = 0;
|
||||
s_sun.exists = qfalse;
|
||||
|
||||
for (int i = 0; i < 128; i++) {
|
||||
backEnd.spheres[i].TessFunction = &RB_Light_Real;
|
||||
}
|
||||
|
||||
VectorClear(ambientlight);
|
||||
backEnd.spareSphere.TessFunction = &RB_Light_Real;
|
||||
backEnd.currentSphere = &backEnd.spareSphere;
|
||||
bEntityOverbright = qfalse;
|
||||
iEntityLightingMax = tr.identityLightByte;
|
||||
s_sun.color[0] = s_sun.color[1] = s_sun.color[2] = tr.overbrightMult * 70;
|
||||
|
||||
while (ents)
|
||||
{
|
||||
ret = COM_Parse((char**)&ents);
|
||||
if (*ret == '{' || *ret == '}') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp(ret, "suncolor") || !strcmp(ret, "sunlight"))
|
||||
{
|
||||
sscanf(COM_Parse((char**)&ents), "%f %f %f", &s_sun.color[0], &s_sun.color[1], &s_sun.color[2]);
|
||||
s_sun.color[0] *= tr.overbrightMult;
|
||||
s_sun.color[1] *= tr.overbrightMult;
|
||||
s_sun.color[2] *= tr.overbrightMult;
|
||||
s_sun.exists = qtrue;
|
||||
}
|
||||
else if (!strcmp(ret, "sundirection"))
|
||||
{
|
||||
vec3_t dir;
|
||||
|
||||
sscanf(COM_Parse((char**)&ents), "%f %f %f", &dir[0], &dir[1], &dir[2]);
|
||||
AngleVectorsLeft(dir, s_sun.direction, 0, 0);
|
||||
|
||||
s_sun.exists = qtrue;
|
||||
if (!bFlareDirSet)
|
||||
{
|
||||
s_sun.flaredirection[0] = s_sun.direction[0];
|
||||
s_sun.flaredirection[1] = s_sun.direction[1];
|
||||
s_sun.flaredirection[2] = s_sun.direction[2];
|
||||
}
|
||||
}
|
||||
else if (!strcmp(ret, "sunflaredirection"))
|
||||
{
|
||||
vec3_t dir;
|
||||
|
||||
sscanf(COM_Parse((char**)&ents), "%f %f %f", &dir[0], &dir[1], &dir[2]);
|
||||
AngleVectorsLeft(dir, s_sun.flaredirection, 0, 0);
|
||||
bFlareDirSet = qtrue;
|
||||
}
|
||||
else if (!strcmp(ret, "sunflarename"))
|
||||
{
|
||||
strcpy(s_sun.szFlareName, COM_Parse((char**)&ents));
|
||||
}
|
||||
else if (!strcmp(ret, "ambientlight"))
|
||||
{
|
||||
sscanf(COM_Parse((char**)&ents), "%f %f %f", &ambientlight[0], &ambientlight[1], &ambientlight[2]);
|
||||
}
|
||||
else if (!strcmp(ret, "overbright"))
|
||||
{
|
||||
ret = COM_Parse((char**)&ents);
|
||||
if (strcmp(ret, "world") || strcmp(ret, "none"))
|
||||
{
|
||||
bEntityOverbright = qtrue;
|
||||
iEntityLightingMax = 0xFF;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
COM_Parse((char**)&ents);
|
||||
}
|
||||
}
|
||||
|
||||
if (s_sun.exists)
|
||||
{
|
||||
if (!s_sun.szFlareName[0]) {
|
||||
strcpy(s_sun.szFlareName, "sun");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int R_GatherLightSources(const vec3_t vPos, vec3_t* pvLightPos, vec3_t* pvLightIntensity, int iMaxLights)
|
||||
|
||||
@@ -60,7 +60,7 @@ void R_InitStaticModels(void) {
|
||||
{
|
||||
float t;
|
||||
|
||||
t = 255.0 / (float)max(r, max(g, b));
|
||||
t = 255.0 / (float)Q_max(r, Q_max(g, b));
|
||||
|
||||
r = (int)((float)r * t);
|
||||
g = (int)((float)g * t);
|
||||
@@ -114,7 +114,7 @@ void R_InitStaticModels(void) {
|
||||
surf->hShader[k] = sh->index;
|
||||
}
|
||||
else {
|
||||
surf->hShader[k] = NULL;
|
||||
surf->hShader[k] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -390,7 +390,34 @@ void R_AddStaticModelSurfaces(void) {
|
||||
|
||||
void RB_Static_BuildDLights()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
int i;
|
||||
|
||||
backEnd.currentStaticModel->useSpecialLighting = backEnd.refdef.num_dlights > 0;
|
||||
backEnd.currentStaticModel->numdlights = 0;
|
||||
|
||||
if (!backEnd.currentStaticModel->useSpecialLighting) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < backEnd.refdef.num_dlights && backEnd.currentStaticModel->numdlights != 32; i++) {
|
||||
vec3_t lightorigin, delta;
|
||||
|
||||
VectorCopy(backEnd.refdef.dlights[i].origin, lightorigin);
|
||||
VectorSubtract(lightorigin, backEnd.currentStaticModel->origin, delta);
|
||||
if (backEnd.refdef.dlights[i].radius * 2.0 >= VectorLength(delta)) {
|
||||
MatrixTransformVectorRight(
|
||||
backEnd.currentStaticModel->axis,
|
||||
delta,
|
||||
backEnd.currentStaticModel->dlights[backEnd.currentStaticModel->numdlights].transformed
|
||||
);
|
||||
|
||||
backEnd.currentStaticModel->dlights[backEnd.currentStaticModel->numdlights++].index = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (!backEnd.currentStaticModel->numdlights) {
|
||||
backEnd.currentStaticModel->useSpecialLighting = qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
void R_InfoStaticModels_f()
|
||||
@@ -476,7 +503,9 @@ void RB_StaticMesh(staticSurface_t* staticSurf) {
|
||||
Vector4Copy(surf->pStaticXyz[j], tess.xyz[baseVertex + j]);
|
||||
Vector4Copy(surf->pStaticNormal[j], tess.normal[baseVertex + j]);
|
||||
tess.texCoords[baseVertex + j][0][0] = surf->pStaticTexCoords[j][0][0];
|
||||
tess.texCoords[baseVertex + j][0][1] = surf->pStaticTexCoords[j][0][1];
|
||||
tess.texCoords[baseVertex + j][0][1] = surf->pStaticTexCoords[j][0][1];
|
||||
tess.texCoords[baseVertex + j][1][0] = surf->pStaticTexCoords[j][1][0];
|
||||
tess.texCoords[baseVertex + j][1][1] = surf->pStaticTexCoords[j][1][1];
|
||||
}
|
||||
|
||||
if (backEndData[backEnd.smpFrame]->staticModelData) {
|
||||
|
||||
@@ -28,3 +28,8 @@ void R_InitLensFlare()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
|
||||
void R_DrawLensFlares()
|
||||
{
|
||||
// FIXME: unimplemented
|
||||
}
|
||||
+33
-11
@@ -343,6 +343,7 @@ RB_SurfaceFace
|
||||
*/
|
||||
void RB_SurfaceFace( srfSurfaceFace_t *surf ) {
|
||||
int i;
|
||||
qboolean needsNormal;
|
||||
unsigned *indices, *tessIndexes;
|
||||
float *v;
|
||||
float *normal;
|
||||
@@ -366,27 +367,48 @@ void RB_SurfaceFace( srfSurfaceFace_t *surf ) {
|
||||
|
||||
tess.numIndexes += surf->numIndices;
|
||||
|
||||
numPoints = surf->numPoints;
|
||||
|
||||
needsNormal = qfalse;
|
||||
if (tess.shader->needsNormal || tess.shader->needsLSpherical || tr.refdef.num_dlights) {
|
||||
needsNormal = qtrue;
|
||||
}
|
||||
|
||||
v = surf->points[0];
|
||||
|
||||
ndx = tess.numVertexes;
|
||||
|
||||
numPoints = surf->numPoints;
|
||||
|
||||
if ( tess.shader->needsNormal || tess.shader->needsLSpherical || tr.refdef.num_dlights ) {
|
||||
if (needsNormal) {
|
||||
normal = surf->plane.normal;
|
||||
for ( i = 0, ndx = tess.numVertexes; i < numPoints; i++, ndx++ ) {
|
||||
VectorCopy( normal, tess.normal[ndx] );
|
||||
}
|
||||
}
|
||||
|
||||
for ( i = 0, v = surf->points[0], ndx = tess.numVertexes; i < numPoints; i++, v += VERTEXSIZE, ndx++ ) {
|
||||
VectorCopy( v, tess.xyz[ndx]);
|
||||
tess.texCoords[ndx][0][0] = v[3];
|
||||
tess.texCoords[ndx][0][1] = v[4];
|
||||
tess.texCoords[ndx][1][0] = v[5];
|
||||
tess.texCoords[ndx][1][1] = v[6];
|
||||
* ( unsigned int * ) &tess.vertexColors[ndx] = * ( unsigned int * ) &v[7];
|
||||
tess.vertexDlightBits[ndx] = dlightBits;
|
||||
if (tess.dlightMap)
|
||||
{
|
||||
|
||||
for (i = 0, v = surf->points[0], ndx = tess.numVertexes; i < numPoints; i++, v += VERTEXSIZE, ndx++) {
|
||||
VectorCopy(v, tess.xyz[ndx]);
|
||||
tess.texCoords[ndx][0][0] = v[3];
|
||||
tess.texCoords[ndx][0][1] = v[4];
|
||||
tess.texCoords[ndx][1][0] = v[5] + surf->lightmapOffset[0];
|
||||
tess.texCoords[ndx][1][1] = v[6] + surf->lightmapOffset[1];
|
||||
*(unsigned int*)&tess.vertexColors[ndx] = *(unsigned int*)&v[7];
|
||||
tess.vertexDlightBits[ndx] = dlightBits;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0, v = surf->points[0], ndx = tess.numVertexes; i < numPoints; i++, v += VERTEXSIZE, ndx++) {
|
||||
VectorCopy(v, tess.xyz[ndx]);
|
||||
tess.texCoords[ndx][0][0] = v[3];
|
||||
tess.texCoords[ndx][0][1] = v[4];
|
||||
tess.texCoords[ndx][1][0] = v[5];
|
||||
tess.texCoords[ndx][1][1] = v[6];
|
||||
*(unsigned int*)&tess.vertexColors[ndx] = *(unsigned int*)&v[7];
|
||||
tess.vertexDlightBits[ndx] = dlightBits;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ static void R_ValidateHeightmapForVertex(terraTri_t* pTri)
|
||||
}
|
||||
}
|
||||
|
||||
static int R_AllocateVert(cTerraPatchUnpacked_t* patch)
|
||||
static terraInt R_AllocateVert(cTerraPatchUnpacked_t* patch)
|
||||
{
|
||||
terraInt iVert = g_vert.iFreeHead;
|
||||
|
||||
@@ -227,12 +227,13 @@ static void R_ReleaseTri(cTerraPatchUnpacked_t* patch, terraInt iTri)
|
||||
|
||||
static int R_ConstChecksForTri(terraTri_t* pTri)
|
||||
{
|
||||
varnodeUnpacked_t vn = *pTri->varnode;
|
||||
varnodeUnpacked_t vn;
|
||||
|
||||
if (pTri->lod == MAX_TERRAIN_LOD) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
vn = *pTri->varnode;
|
||||
vn.s.flags &= 0xF0u;
|
||||
|
||||
if (vn.fVariance == 0.0 && !(pTri->varnode->s.flags & 8)) {
|
||||
@@ -340,7 +341,7 @@ void R_SplitTri(terraInt iSplit, terraInt iNewPt, terraInt iLeft, terraInt iRigh
|
||||
|
||||
int iNextLod = pSplit->lod + 1;
|
||||
int index = pSplit->index;
|
||||
varnodeUnpacked_t* varnode = pSplit->varnode + index;
|
||||
varnodeUnpacked_t* varnode = &pSplit->varnode[index];
|
||||
|
||||
if (pLeft)
|
||||
{
|
||||
@@ -747,8 +748,8 @@ static void R_PreTessellateTerrain()
|
||||
const float t11 = patch->texCoord[1][1][1] - tMin;
|
||||
|
||||
const float lmapSize = (float)(patch->drawinfo.lmapSize - 1) / TERRAIN_LIGHTMAP_SIZE;
|
||||
const float ls = patch->s * lmapSize;
|
||||
const float lt = patch->t * lmapSize;
|
||||
const float ls = patch->s + lmapSize;
|
||||
const float lt = patch->t + lmapSize;
|
||||
|
||||
terraInt iTri0 = R_AllocateTri(patch, qfalse);
|
||||
terraInt iTri1 = R_AllocateTri(patch, qfalse);
|
||||
@@ -1316,8 +1317,8 @@ void R_AddTerrainSurfaces()
|
||||
{
|
||||
Com_DPrintf(
|
||||
"%5d tris / %5d verts / %4d splits / %4d merges\n",
|
||||
g_nTris + ~g_tri.nFree,
|
||||
g_nVerts + ~g_vert.nFree,
|
||||
g_nTris - g_tri.nFree,
|
||||
g_nVerts - g_vert.nFree,
|
||||
g_nSplit,
|
||||
g_nMerge);
|
||||
}
|
||||
|
||||
@@ -539,7 +539,10 @@ static void R_RecursiveWorldNode( mnode_t *node, int planeBits, int dlightBits )
|
||||
|
||||
}
|
||||
|
||||
|
||||
int R_SphereInLeafs(vec_t* p, float r, mnode_t** nodes, int nMaxNodes) {
|
||||
// FIXME: unimplemented
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
===============
|
||||
R_PointInLeaf
|
||||
|
||||
+30
-7
@@ -225,7 +225,8 @@ void SV_DirectConnect( netadr_t from ) {
|
||||
char userinfo[MAX_INFO_STRING];
|
||||
int i;
|
||||
client_t *cl, *newcl;
|
||||
client_t temp;
|
||||
// Make this a temp variable to avoid stack overflow issues
|
||||
static client_t temp;
|
||||
gentity_t *ent;
|
||||
int clientNum;
|
||||
int version;
|
||||
@@ -439,9 +440,15 @@ gotnewcl:
|
||||
Com_DPrintf( "Going from CS_FREE to CS_CONNECTED for %s\n", newcl->name );
|
||||
|
||||
newcl->state = CS_CONNECTED;
|
||||
newcl->nextSnapshotTime = svs.time;
|
||||
newcl->lastPacketTime = svs.time;
|
||||
newcl->lastConnectTime = svs.time;
|
||||
if (sv_maxclients->integer > 1) {
|
||||
newcl->nextSnapshotTime = svs.time + 800;
|
||||
newcl->lastPacketTime = svs.time + 800;
|
||||
newcl->lastConnectTime = svs.time + 800;
|
||||
} else {
|
||||
newcl->nextSnapshotTime = svs.time + 300;
|
||||
newcl->lastPacketTime = svs.time + 300;
|
||||
newcl->lastConnectTime = svs.time + 300;
|
||||
}
|
||||
|
||||
// when we receive the first packet from the client, we will
|
||||
// notice that it is from a different serverid and that the
|
||||
@@ -530,6 +537,19 @@ void SV_DropClient( client_t *drop, const char *reason ) {
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_GAME_PROTOCOL >= 15
|
||||
|
||||
void MSG_WriteServerFrameTime(msg_t* msg, float f) {
|
||||
MSG_WriteFloat(msg, f);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void MSG_WriteServerFrameTime(msg_t* msg, float f) {
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
================
|
||||
SV_SendClientGameState
|
||||
@@ -583,7 +603,7 @@ void SV_SendClientGameState( client_t *client ) {
|
||||
if (sv.configstrings[start][0]) {
|
||||
MSG_WriteSVC( &msg, svc_configstring );
|
||||
MSG_WriteShort( &msg, start );
|
||||
MSG_WriteString( &msg, sv.configstrings[start] );
|
||||
MSG_WriteScrambledBigString( &msg, sv.configstrings[start] );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,7 +624,10 @@ void SV_SendClientGameState( client_t *client ) {
|
||||
MSG_WriteLong( &msg, client - svs.clients);
|
||||
|
||||
// write the checksum feed
|
||||
MSG_WriteLong( &msg, sv.checksumFeed);
|
||||
MSG_WriteLong( &msg, 0);
|
||||
|
||||
// write the server frametime to the client (only on TA/TT)
|
||||
MSG_WriteServerFrameTime(&msg, sv.frameTime);
|
||||
|
||||
// deliver this to the client
|
||||
SV_SendMessageToClient( &msg, client );
|
||||
@@ -1310,7 +1333,7 @@ static qboolean SV_ClientCommand( client_t *cl, msg_t *msg ) {
|
||||
qboolean clientOk = qtrue;
|
||||
|
||||
seq = MSG_ReadLong( msg );
|
||||
s = MSG_ReadString( msg );
|
||||
s = MSG_ReadScrambledString( msg );
|
||||
|
||||
// see if we have already executed it
|
||||
if ( cl->lastClientCommand >= seq ) {
|
||||
|
||||
@@ -521,6 +521,7 @@ void SV_ClearServer(void) {
|
||||
}
|
||||
}
|
||||
Com_Memset (&sv, 0, sizeof(sv));
|
||||
sv.frameTime = 1.0 / sv_fps->value;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1012,7 +1013,7 @@ void SV_Init( void ) {
|
||||
sv_showloss = Cvar_Get ("sv_showloss", "0", 0);
|
||||
sv_padPackets = Cvar_Get ("sv_padPackets", "0", 0);
|
||||
sv_killserver = Cvar_Get ("sv_killserver", "0", 0);
|
||||
sv_mapChecksum = Cvar_Get ("sv_mapChecksum", "", CVAR_ROM);
|
||||
sv_mapChecksum = Cvar_Get ("sv_mapChecksum", "", CVAR_ROM | CVAR_SERVERINFO);
|
||||
sv_drawentities = Cvar_Get( "sv_drawentities", "1", 0 );
|
||||
sv_deeptracedebug = Cvar_Get( "sv_deeptracedebug", "0", 0 );
|
||||
sv_chatter = Cvar_Get( "sv_chatter", "0", 0 );
|
||||
|
||||
@@ -109,7 +109,7 @@ static void SV_EmitPacketEntities( clientSnapshot_t *from, clientSnapshot_t *to,
|
||||
}
|
||||
}
|
||||
|
||||
MSG_WriteBits( msg, (MAX_GENTITIES-1), GENTITYNUM_BITS ); // end of packetentities
|
||||
MSG_WriteEntityNum(msg, (MAX_GENTITIES - 1)); // end of packetentities
|
||||
}
|
||||
|
||||
|
||||
@@ -217,11 +217,11 @@ static void SV_WriteSnapshotToClient( client_t *client, msg_t *msg ) {
|
||||
MSG_WriteSVC( msg, svc_locprint );
|
||||
MSG_WriteShort( msg, client->XOffset );
|
||||
MSG_WriteShort( msg, client->YOffset );
|
||||
MSG_WriteString( msg, client->centerprint );
|
||||
MSG_WriteScrambledString( msg, client->centerprint );
|
||||
}
|
||||
else {
|
||||
MSG_WriteSVC( msg, svc_centerprint );
|
||||
MSG_WriteString( msg, client->centerprint );
|
||||
MSG_WriteScrambledString( msg, client->centerprint );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ void SV_UpdateServerCommandsToClient( client_t *client, msg_t *msg ) {
|
||||
for ( i = client->reliableAcknowledge + 1 ; i <= client->reliableSequence ; i++ ) {
|
||||
MSG_WriteSVC( msg, svc_serverCommand );
|
||||
MSG_WriteLong( msg, i );
|
||||
MSG_WriteString( msg, client->reliableCommands[ i & (MAX_RELIABLE_COMMANDS-1) ] );
|
||||
MSG_WriteScrambledString( msg, client->reliableCommands[ i & (MAX_RELIABLE_COMMANDS-1) ] );
|
||||
}
|
||||
client->reliableSent = client->reliableSequence;
|
||||
}
|
||||
|
||||
+26
-16
@@ -328,13 +328,24 @@ TIKI_ParseIncludes
|
||||
*/
|
||||
qboolean TIKI_ParseIncludes( dloaddef_t *ld )
|
||||
{
|
||||
const char *token;
|
||||
const char* token;
|
||||
qboolean b_incl = false;
|
||||
const char *mapname;
|
||||
const char* mapname;
|
||||
const char* servertype;
|
||||
int depth = 0;
|
||||
|
||||
token = ld->tikiFile.GetToken( true );
|
||||
if( sv_mapname )
|
||||
static cvar_t* pServerType = Cvar_Get("g_servertype", "2", 0);
|
||||
static cvar_t* pGameType = Cvar_Get("cg_gametype", "0", CVAR_SERVERINFO | CVAR_LATCH);
|
||||
|
||||
if (pGameType->integer && pServerType->integer == 1) {
|
||||
servertype = "spearheadserver";
|
||||
}
|
||||
else {
|
||||
servertype = "breakthroughserver";
|
||||
}
|
||||
|
||||
token = ld->tikiFile.GetToken(true);
|
||||
if (sv_mapname)
|
||||
{
|
||||
mapname = sv_mapname->string;
|
||||
}
|
||||
@@ -343,38 +354,37 @@ qboolean TIKI_ParseIncludes( dloaddef_t *ld )
|
||||
mapname = "utils";
|
||||
}
|
||||
|
||||
while( 1 )
|
||||
while (1)
|
||||
{
|
||||
if( !strncmp( token, mapname, strlen( token ) )
|
||||
|| !strncmp( token, "spearheadserver", strlen( token ) )
|
||||
|| !strncmp( token, "breakthroughserver", strlen( token ) ) )
|
||||
if (!strncmp(token, mapname, strlen(token))
|
||||
|| !strncmp(token, servertype, strlen(token)))
|
||||
{
|
||||
b_incl = true;
|
||||
}
|
||||
else if( ( !stricmp( token, "{" ) || !ld->tikiFile.TokenAvailable( true ) ) )
|
||||
else if ((!stricmp(token, "{") || !ld->tikiFile.TokenAvailable(true)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
token = ld->tikiFile.GetToken( true );
|
||||
token = ld->tikiFile.GetToken(true);
|
||||
}
|
||||
|
||||
if( b_incl )
|
||||
if (b_incl)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
while( ld->tikiFile.TokenAvailable( true ) )
|
||||
while (ld->tikiFile.TokenAvailable(true))
|
||||
{
|
||||
token = ld->tikiFile.GetAndIgnoreLine( false );
|
||||
if( strstr( token, "{" ) )
|
||||
token = ld->tikiFile.GetAndIgnoreLine(false);
|
||||
if (strstr(token, "{"))
|
||||
{
|
||||
depth++;
|
||||
}
|
||||
|
||||
if( strstr( token, "}" ) )
|
||||
if (strstr(token, "}"))
|
||||
{
|
||||
if( !depth )
|
||||
if (!depth)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
+14
-14
@@ -371,11 +371,11 @@ void TIKI_CacheFileSkel( skelHeader_t *pHeader, skelcache_t *cache, int length )
|
||||
iOffset += sizeof(skelWeight_t) * numWeights;
|
||||
iOffset += sizeof(skeletorVertex_t);
|
||||
|
||||
skelVert->normal[0] = LittleFloat(pVert->normal[0]);
|
||||
skelVert->normal[1] = LittleFloat(pVert->normal[1]);
|
||||
skelVert->normal[2] = LittleFloat(pVert->normal[2]);
|
||||
skelVert->texCoords[0] = LittleFloat(pVert->texCoords[0]);
|
||||
skelVert->texCoords[1] = LittleFloat(pVert->texCoords[1]);
|
||||
skelVert->normal[0] = LittleFloatPtr(pVert->normal[0]);
|
||||
skelVert->normal[1] = LittleFloatPtr(pVert->normal[1]);
|
||||
skelVert->normal[2] = LittleFloatPtr(pVert->normal[2]);
|
||||
skelVert->texCoords[0] = LittleFloatPtr(pVert->texCoords[0]);
|
||||
skelVert->texCoords[1] = LittleFloatPtr(pVert->texCoords[1]);
|
||||
skelVert->numWeights = numWeights;
|
||||
skelVert->numMorphs = numMorphs;
|
||||
|
||||
@@ -384,21 +384,21 @@ void TIKI_CacheFileSkel( skelHeader_t *pHeader, skelcache_t *cache, int length )
|
||||
skeletorMorph_t* skelMorph = (skeletorMorph_t*)((byte*)skelVert + sizeof(skeletorVertex_t));
|
||||
for (k = 0; k < pVert->numMorphs; k++, pMorph++, skelMorph++)
|
||||
{
|
||||
skelMorph->morphIndex = pMorph->morphIndex;
|
||||
skelMorph->offset[0] = LittleFloat(pMorph->offset[0]);
|
||||
skelMorph->offset[1] = LittleFloat(pMorph->offset[1]);
|
||||
skelMorph->offset[2] = LittleFloat(pMorph->offset[2]);
|
||||
skelMorph->morphIndex = LittleLongPtr(pMorph->morphIndex);
|
||||
skelMorph->offset[0] = LittleFloatPtr(pMorph->offset[0]);
|
||||
skelMorph->offset[1] = LittleFloatPtr(pMorph->offset[1]);
|
||||
skelMorph->offset[2] = LittleFloatPtr(pMorph->offset[2]);
|
||||
}
|
||||
|
||||
skelWeight_t* pWeight = (skelWeight_t * )((byte*)pMorph);
|
||||
skelWeight_t* skelWeight = (skelWeight_t*)((byte*)skelMorph);
|
||||
for (k = 0; k < pVert->numWeights; k++, skelWeight++, pWeight++)
|
||||
{
|
||||
skelWeight->boneIndex = LittleLong(pWeight->boneIndex);
|
||||
skelWeight->boneWeight = LittleLong(pWeight->boneWeight);
|
||||
skelWeight->offset[0] = LittleFloat(pWeight->offset[0]);
|
||||
skelWeight->offset[1] = LittleFloat(pWeight->offset[1]);
|
||||
skelWeight->offset[2] = LittleFloat(pWeight->offset[2]);
|
||||
skelWeight->boneIndex = LittleLongPtr(pWeight->boneIndex);
|
||||
skelWeight->boneWeight = LittleFloatPtr(pWeight->boneWeight);
|
||||
skelWeight->offset[0] = LittleFloatPtr(pWeight->offset[0]);
|
||||
skelWeight->offset[1] = LittleFloatPtr(pWeight->offset[1]);
|
||||
skelWeight->offset[2] = LittleFloatPtr(pWeight->offset[2]);
|
||||
}
|
||||
|
||||
pVert = (skeletorVertex_t*)((byte*)pVert + iOffset);
|
||||
|
||||
@@ -98,7 +98,7 @@ typedef struct uiimport_s {
|
||||
const char *( *Client_TranslateWidgetName )( const char *widget );
|
||||
void( *Connect )( const char *server );
|
||||
const char *( *Key_GetKeynameForCommand )( const char *command );
|
||||
char *( *Key_GetCommandForKey )( int keynum );
|
||||
const char *( *Key_GetCommandForKey )( int keynum );
|
||||
void ( *Key_SetBinding )( int keynum, const char *binding );
|
||||
void ( *Key_GetKeysForCommand )( const char *command, int *key1, int *key2 );
|
||||
const char *( *Key_KeynumToString )( int keynum );
|
||||
@@ -216,7 +216,11 @@ extern uidef_t uid;
|
||||
extern uiexport_t uie;
|
||||
extern uiimport_t uii;
|
||||
|
||||
|
||||
void UI_Init(void);
|
||||
void UI_Shutdown(void);
|
||||
void UI_InitExports();
|
||||
qboolean CL_FinishedIntro(void);
|
||||
void UI_StartStageKeyEvent(void);
|
||||
void UI_GetMouseState( int *mouseX, int *mouseY, int *flags );
|
||||
int UI_GetCvarInt( const char *name, int def );
|
||||
float UI_GetCvarFloat( const char *name, float def );
|
||||
@@ -226,8 +230,7 @@ void UI_SetCvarInt( const char *cvar, int value );
|
||||
void UI_SetCvarFloat( const char *cvar, float value );
|
||||
void UI_ListFiles( const char *filespec );
|
||||
const char *UI_ConfigString( int index );
|
||||
void UI_Init( void );
|
||||
void UI_Shutdown( void );
|
||||
void UI_InitExports();
|
||||
void UI_UpdateCenterPrint(const char* s, float alpha);
|
||||
void UI_UpdateLocationPrint(int x, int y, const char* s, float alpha);
|
||||
|
||||
#endif
|
||||
+2
-2
@@ -44,8 +44,8 @@ public:
|
||||
void Pressed( void );
|
||||
void SetCommand( Event *ev );
|
||||
void SetCommand( str s );
|
||||
void DrawUnpressed( void );
|
||||
void DrawPressed( void );
|
||||
void DrawUnpressed( void ) override;
|
||||
void DrawPressed( void ) override;
|
||||
void Clear( void );
|
||||
qboolean KeyEvent( int key, unsigned int time ) override;
|
||||
void SetAlternate( qboolean a );
|
||||
|
||||
+14
-40
@@ -233,26 +233,13 @@ void UIButton::DrawPressed
|
||||
clientFrame.pos.x += 1;
|
||||
clientFrame.pos.y += 1;
|
||||
|
||||
if (m_bVirtual)
|
||||
{
|
||||
m_font->PrintJustified(
|
||||
clientFrame,
|
||||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(m_title.c_str()),
|
||||
NULL
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_font->PrintJustified(
|
||||
clientFrame,
|
||||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(m_title.c_str()),
|
||||
m_vVirtualScale
|
||||
);
|
||||
}
|
||||
m_font->PrintJustified(
|
||||
clientFrame,
|
||||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(m_title.c_str()),
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
);
|
||||
}
|
||||
|
||||
void UIButton::DrawUnpressed
|
||||
@@ -266,26 +253,13 @@ void UIButton::DrawUnpressed
|
||||
|
||||
UIRect2D clientFrame = getClientFrame();
|
||||
|
||||
if (m_bVirtual)
|
||||
{
|
||||
m_font->PrintJustified(
|
||||
clientFrame,
|
||||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(m_title.c_str()),
|
||||
NULL
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_font->PrintJustified(
|
||||
clientFrame,
|
||||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(m_title.c_str()),
|
||||
m_vVirtualScale
|
||||
);
|
||||
}
|
||||
m_font->PrintJustified(
|
||||
clientFrame,
|
||||
m_iFontAlignmentHorizontal,
|
||||
m_iFontAlignmentVertical,
|
||||
Sys_LV_CL_ConvertString(m_title.c_str()),
|
||||
m_bVirtual ? m_vVirtualScale : NULL
|
||||
);
|
||||
}
|
||||
|
||||
qboolean UIButton::KeyEvent
|
||||
|
||||
Loaded 100 of 130 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user