hexen2 infoplaque.

splitscreen controls now on the menu.
Fixed splitscreen panorama.
Pause automatically when at the console/menus.
Attempting to clean up replacement texture paths (internal textures are still an issue).
Fixed a crash when playing oversized demos.
gl_bloom/ffov should now work again without bugging out.
H2 Demoness's staff should no longer generate errors when shooting with the tome of power. Some other related changes.
Server should compile now.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3585 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2010-08-16 02:03:02 +00:00
parent 18564b98f6
commit 918833a763
38 changed files with 753 additions and 290 deletions

View File

@ -879,7 +879,7 @@ static qintptr_t CG_SystemCallsEx(void *offset, quintptr_t mask, qintptr_t fn, c
case CG_KEY_GETKEY:
{
int ret[2];
M_FindKeysForCommand (VM_POINTER(arg[0]), ret);
M_FindKeysForCommand (0, VM_POINTER(arg[0]), ret);
return ret[0];
}
break;

View File

@ -1866,6 +1866,7 @@ void CL_LinkPacketEntities (void)
cl_numvisedicts++;
ent->externalmodelview = 0;
ent->forcedshader = NULL;
ent->visframe = 0;
@ -2051,6 +2052,8 @@ void CL_LinkPacketEntities (void)
else if (model->flags & EFH2_ACIDBALL)
{
rad = 120 - (rand() % 20);
dclr[0] = 0.1;
dclr[1] = 0.2;
}
else if (model->flags & EFH2_SPIT)
{
@ -2750,8 +2753,11 @@ void CL_LinkPlayers (void)
VectorCopy(state->origin, org);
for (pnum = 0; pnum < cl.splitclients; pnum++)
VectorCopy(cl.simorg[pnum], org);
org[2] -= model->mins[2];
org[2] += 24;
if (model)
{
org[2] -= model->mins[2];
org[2] += 24;
}
radius += r_lightflicker.value?(rand()&31):0;
CL_NewDlightRGB(j+1, org, radius, 0.1, colour[0], colour[1], colour[2])->flags &= ~LFLAG_ALLOW_FLASH;
}
@ -2803,6 +2809,7 @@ void CL_LinkPlayers (void)
angles[ROLL] = 0;
angles[ROLL] = V_CalcRoll (angles, state->velocity)*4;
ent->externalmodelview = 0;
// the player object gets added with flags | 2
for (pnum = 0; pnum < cl.splitclients; pnum++)
{
@ -2819,9 +2826,11 @@ void CL_LinkPlayers (void)
ent->origin[0] = cl.simorg[pnum][0];
ent->origin[1] = cl.simorg[pnum][1];
ent->origin[2] = cl.simorg[pnum][2]+cl.crouch[pnum];
}
if (j == (cl.viewentity[pnum]?cl.viewentity[pnum]:cl.playernum[pnum]))
{
ent->flags |= Q2RF_EXTERNALMODEL;
ent->externalmodelview = (1<<pnum);
break;
ent->externalmodelview |= (1<<pnum);
}
}

View File

@ -674,7 +674,7 @@ void CL_FinishMove (usercmd_t *cmd, int msecs, int pnum)
for (i=0 ; i<3 ; i++)
cmd->angles[i] = ((int)(cl.viewangles[pnum][i]*65536.0/360)&65535);
if (in_impulsespending[pnum])
if (in_impulsespending[pnum] && !cl.paused)
{
in_nextimpulse[pnum]++;
in_impulsespending[pnum]--;

View File

@ -1004,6 +1004,7 @@ void CL_ClearState (void)
CL_ClearParseState();
CL_ClearTEnts();
CL_ClearCustomTEnts();
T_FreeInfoStrings();
SCR_ShowPic_Clear();
if (cl.playernum[0] == -1)

View File

@ -2139,8 +2139,6 @@ void CL_ParseServerData (void)
if (!sv.state)
#endif
Wads_Flush();
T_FreeStrings();
}
if (cls.demoplayback == DPB_MVD || cls.demoplayback == DPB_EZTV)
@ -2399,15 +2397,15 @@ void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caution.
cls.protocol_nq = 0;
cls.z_ext = 0;
if (protover == 250)
if (protover == NEHD_PROTOCOL_VERSION)
Host_EndGame ("Nehahra demo net protocol is not supported\n");
else if (protover == 666)
else if (protover == FITZ_PROTOCOL_VERSION)
{
//fitzquake 0.85
cls.protocol_nq = CPNQ_FITZ666;
Con_DPrintf("FitzQuake 666 protocol\n");
}
else if (protover == 3502)
else if (protover == DP5_PROTOCOL_VERSION)
{
//darkplaces5
cls.protocol_nq = CPNQ_DP5;
@ -2438,6 +2436,10 @@ void CLNQ_ParseServerData(void) //Doesn't change gamedir - use with caution.
Con_DPrintf("DP7 protocols\n");
}
else if (protover == H2_PROTOCOL_VERSION)
{
Host_EndGame ("\nUnable to connect to Hexen2 servers.\n");
}
else if (protover != NQ_PROTOCOL_VERSION)
{
Host_EndGame ("Server returned version %i, not %i\nYou will need to use a different client.", protover, NQ_PROTOCOL_VERSION);
@ -4692,7 +4694,7 @@ void CL_DumpPacket(void)
for (i = 0; i < 16; i++)
{
if (pos >= net_message.cursize)
Con_Printf(" X ");
Con_Printf(" - ");
else
Con_Printf("%2x ", (unsigned char)packet[pos]);
pos++;
@ -5490,6 +5492,65 @@ void CLNQ_ParseProQuakeMessage (char *s)
}
}
static enum {
CLNQPP_NONE,
CLNQPP_PINGS
} cl_nqparseprint;
qboolean CLNQ_ParseNQPrints(char *s)
{
int i;
char *start = s;
if (cl_nqparseprint == CLNQPP_PINGS)
{
char *pingstart;
cl_nqparseprint = CLNQPP_NONE;
while(*s == ' ')
s++;
pingstart = s;
if (*s == '-')
s++;
if (*s >= '0' && *s <= '9')
{
while(*s >= '0' && *s <= '9')
s++;
if (*s == ' ' && s-start >= 4)
{
s++;
start = s;
s = strchr(s, '\n');
if (!s)
return false;
*s = 0;
for (i = 0; i < MAX_CLIENTS; i++)
{
if (!strcmp(start, cl.players[i].name))
break;
}
if (i == MAX_CLIENTS)
{
}
if (i != MAX_CLIENTS)
{
cl.players[i].ping = atoi(pingstart);
}
cl_nqparseprint = CLNQPP_PINGS;
return true;
}
}
s = start;
}
if (!strcmp(s, "Client ping times:\n"))
{
cl_nqparseprint = CLNQPP_PINGS;
return true;
}
return false;
}
void CLNQ_ParseServerMessage (void)
{
@ -5572,6 +5633,8 @@ void CLNQ_ParseServerMessage (void)
}
else
{
if (CLNQ_ParseNQPrints(s))
break;
#ifdef PLUGINS
if (Plug_ServerMessage(s, PRINT_HIGH))
#endif

View File

@ -1382,6 +1382,9 @@ void SCR_DrawPause (void)
if (!cl.paused)
return;
if (key_dest == key_menu)
return;
pic = Draw_SafeCachePic ("gfx/pause.lmp");
if (pic)
{

View File

@ -170,19 +170,6 @@ typedef enum
#define Q2SPLASH_BLOOD 6
#endif
// hexen 2
#define TE_STREAM_CHAIN 25
#define TE_STREAM_SUNSTAFF1 26
#define TE_STREAM_SUNSTAFF2 27
#define TE_STREAM_LIGHTNING 28
#define TE_STREAM_COLORBEAM 29
#define TE_STREAM_ICECHUNKS 30
#define TE_STREAM_GAZE 31
#define TE_STREAM_FAMINE 32
#define MAX_BEAMS 64
typedef struct
{
@ -620,7 +607,7 @@ void CL_ParseStream (int type)
flags-=tag;
duration = (float)MSG_ReadByte()*0.05;
skin = 0;
if(type == TE_STREAM_COLORBEAM)
if(type == TEH2_STREAM_COLORBEAM)
{
skin = MSG_ReadByte();
}
@ -649,13 +636,23 @@ void CL_ParseStream (int type)
switch(type)
{
case TE_STREAM_ICECHUNKS:
case TEH2_STREAM_LIGHTNING_SMALL:
b->model = Mod_ForName("models/stltng2.mdl", true);
b->flags |= 2;
b->particleeffect = P_FindParticleType("te_stream_lightning_small");
break;
case TEH2_STREAM_LIGHTNING:
b->model = Mod_ForName("models/stlghtng.mdl", true);
b->flags |= 2;
b->particleeffect = P_FindParticleType("te_stream_lightning");
break;
case TEH2_STREAM_ICECHUNKS:
b->model = Mod_ForName("models/stice.mdl", true);
b->flags |= 2;
b->particleeffect = P_FindParticleType("te_stream_icechunks");
R_AddStain(end, -10, -10, 0, 20);
break;
case TE_STREAM_SUNSTAFF1:
case TEH2_STREAM_SUNSTAFF1:
b->model = Mod_ForName("models/stsunsf1.mdl", true);
b->particleeffect = P_FindParticleType("te_stream_sunstaff1");
if (b->particleeffect < 0)
@ -669,11 +666,14 @@ void CL_ParseStream (int type)
}
}
break;
case TE_STREAM_SUNSTAFF2:
case TEH2_STREAM_SUNSTAFF2:
b->model = Mod_ForName("models/stsunsf1.mdl", true);
b->particleeffect = P_FindParticleType("te_stream_sunstaff2");
R_AddStain(end, -10, -10, -10, 20);
break;
default:
Con_Printf("Oh noes! type %i\n", type);
break;
}
}
@ -1142,14 +1142,15 @@ void CL_ParseTEnt (void)
P_ParticleTrailIndex(pos, pos2, 208, 8, NULL);
break;
case TE_STREAM_CHAIN:
case TE_STREAM_SUNSTAFF1:
case TE_STREAM_SUNSTAFF2:
case TE_STREAM_LIGHTNING:
case TE_STREAM_COLORBEAM:
case TE_STREAM_ICECHUNKS:
case TE_STREAM_GAZE:
case TE_STREAM_FAMINE:
case TEH2_STREAM_LIGHTNING_SMALL:
case TEH2_STREAM_CHAIN:
case TEH2_STREAM_SUNSTAFF1:
case TEH2_STREAM_SUNSTAFF2:
case TEH2_STREAM_LIGHTNING:
case TEH2_STREAM_COLORBEAM:
case TEH2_STREAM_ICECHUNKS:
case TEH2_STREAM_GAZE:
case TEH2_STREAM_FAMINE:
CL_ParseStream (type);
break;

View File

@ -2012,17 +2012,21 @@ texid_t R_LoadHiResTexture(char *name, char *subpath, unsigned int flags)
*data = '#';
}
tex = R_FindTexture(name);
snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name);
tex = R_FindTexture(fname);
if (TEXVALID(tex)) //don't bother if it already exists.
return tex;
if (subpath && *subpath)
{
snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name);
tex = R_FindTexture(fname);
tex = R_FindTexture(name);
if (TEXVALID(tex)) //don't bother if it already exists.
return tex;
}
tex = R_LoadCompressed(fname);
if (TEXVALID(tex))
return tex;
tex = R_LoadCompressed(name);
if (TEXVALID(tex))
return tex;
@ -2067,7 +2071,7 @@ texid_t R_LoadHiResTexture(char *name, char *subpath, unsigned int flags)
if (!(flags&IF_NOGAMMA) && !vid_hardwaregamma.value)
BoostGamma(data, image_width, image_height);
TRACE(("dbg: Mod_LoadHiResTexture: %s loaded\n", name));
if (i == 1)
if (tex_path[i].args >= 3)
{ //if it came from a special subpath (eg: map specific), upload it using the subpath prefix
snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name);
tex = R_LoadTexture32 (fname, image_width, image_height, data, flags);

View File

@ -540,9 +540,10 @@ void MenuDrawItems(int xpos, int ypos, menuoption_t *option, menu_t *menu)
Draw_FunString(x, y, option->bind.caption);
x += strlen(option->bind.caption)*8+28;
{
extern cvar_t cl_forcesplitclient;
l = strlen (option->bind.command);
M_FindKeysForCommand (option->bind.command, keys);
M_FindKeysForCommand (cl_forcesplitclient.ival, option->bind.command, keys);
if (bindingactive && menu->selecteditem == option)
{

View File

@ -64,7 +64,7 @@ qboolean M_Options_InvertMouse (menucheck_t *option, struct menu_s *menu, chk_se
//options menu.
void M_Menu_Options_f (void)
{
extern cvar_t cl_standardchat;
extern cvar_t cl_standardchat, cl_splitscreen;
extern cvar_t cl_standardmsg, crosshair;
#ifdef _WIN32
extern qboolean vid_isfullscreen;
@ -77,6 +77,7 @@ void M_Menu_Options_f (void)
MC_AddConsoleCommand(menu, 16, y, " Customize controls", "menu_keys\n"); y+=8;
MC_AddConsoleCommand(menu, 16, y, " Go to console", "toggleconsole\nplay misc/menu2.wav\n"); y+=8;
MC_AddConsoleCommand(menu, 16, y, " Reset to defaults", "exec default.cfg\nplay misc/menu2.wav\n"); y+=8;
MC_AddConsoleCommand(menu, 16, y, " Save all settings", "cfg_save\n"); y+=8;
MC_AddSlider(menu, 16, y, " Mouse Speed", &sensitivity, 1, 10, 0.5); y+=8;
MC_AddSlider(menu, 16, y, " Crosshair", &crosshair, 0, 22, 1); y+=8;
@ -85,6 +86,7 @@ void M_Menu_Options_f (void)
MC_AddCheckBox(menu, 16, y, " Invert Mouse", NULL,0)->func = M_Options_InvertMouse; y+=8;
MC_AddCheckBox(menu, 16, y, " Lookspring", &lookspring,0); y+=8;
MC_AddCheckBox(menu, 16, y, " Lookstrafe", &lookstrafe,0); y+=8;
MC_AddCheckBox(menu, 16, y, " Splitscreen", &cl_splitscreen,0); y+=8;
MC_AddCheckBox(menu, 16, y, " Use old status bar", &cl_sbar,0); y+=8;
MC_AddCheckBox(menu, 16, y, " HUD on left side", &cl_hudswap,0); y+=8;
MC_AddCheckBox(menu, 16, y, " Old-style chatting", &cl_standardchat,0);y+=8;

View File

@ -165,40 +165,121 @@ void M_Menu_SinglePlayer_f (void)
else if (mgt == MGT_HEXEN2)
{ //h2
int y;
int i;
cvar_t *pc;
qboolean havemp;
static char *classlist[] = {
"Random",
"Paladin",
"Crusader",
"Necromancer",
"Assasin",
NULL
};
static char *classlistmp[] = {
"Paladin",
"Crusader",
"Necromancer",
"Assasin",
"Demoness",
NULL
};
static char *classvalues[] = {
"",
"1",
"2",
"3",
"4",
"5",
NULL
"Demoness"
};
menubutton_t *b;
havemp = COM_FCheckExists("maps/keep1.bsp");
menu = M_CreateMenu(0);
MC_AddPicture(menu, 16, 0, 35, 176, "gfx/menu/hplaque.lmp");
MC_AddCenterPicture(menu, 0, 60, "gfx/menu/title1.lmp");
y = 64-8;
y = 64-20;
if (!strncmp(Cmd_Argv(1), "class", 5))
{
int pnum;
extern cvar_t cl_splitscreen;
pnum = atoi(Cmd_Argv(1)+5);
if (!pnum)
pnum = 1;
MC_AddCenterPicture(menu, 0, 60, "gfx/menu/title2.lmp");
if (cl_splitscreen.ival)
MC_AddBufferedText(menu, 80, (y+=8)+12, va("Player %i\n", pnum), false, true);
for (i = 0; i < 4+havemp; i++)
{
b = MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, classlistmp[i],
va("p%i setinfo cl_playerclass %i; menu_single %s %s\n",
pnum,
i+1,
((pnum+1 > cl_splitscreen.ival+1)?"skill":va("class%i",pnum+1)),
Cmd_Argv(2)));
if (!menu->selecteditem)
menu->selecteditem = (menuoption_t*)b;
}
}
else if (!strncmp(Cmd_Argv(1), "skill", 5))
{
static char *skillnames[6][4] =
{
{
"Easy",
"Medium",
"Hard",
"Nightmare"
},
{
"Apprentice",
"Squire",
"Adept",
"Lord"
},
{
"Gallant",
"Holy Avenger",
"Divine Hero",
"Legend"
},
{
"Sorcerer",
"Dark Servant",
"Warlock",
"Lich King"
},
{
"Rogue",
"Cutthroat",
"Executioner",
"Widow Maker"
},
{
"Larva",
"Spawn",
"Fiend",
"She Bitch"
}
};
char **sn = skillnames[0];
pc = Cvar_Get("cl_playerclass", "1", CVAR_USERINFO|CVAR_ARCHIVE, "Hexen2");
if (pc && (unsigned)pc->ival <= 5)
sn = skillnames[pc->ival];
MC_AddCenterPicture(menu, 0, 60, "gfx/menu/title5.lmp");
for (i = 0; i < 4; i++)
{
b = MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, sn[i], va("skill %i; closemenu; disconnect; deathmatch 0; coop 0;wait;map %s\n", i, Cmd_Argv(2)));
if (!menu->selecteditem)
menu->selecteditem = (menuoption_t*)b;
}
}
else
{
MC_AddCenterPicture(menu, 0, 60, "gfx/menu/title1.lmp");
if (havemp)
{
menu->selecteditem = (menuoption_t*)
MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, "New Mission", "menu_single class keep1\n");
MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, "Old Mission", "menu_single class demo1\n");
}
else
{
menu->selecteditem = (menuoption_t*)
MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, "New Game", "menu_single class demo1\n");
}
MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, "Save Game", "menu_save\n");
MC_AddConsoleCommandHexen2BigFont(menu, 80, y+=20, "Load Game", "menu_load\n");
}
/*
pc = Cvar_Get("cl_playerclass", "1", CVAR_USERINFO|CVAR_ARCHIVE, "Hexen2");
if (pc)
MC_AddCvarCombo (menu, 64, y+=8, "Player class", pc, havemp?(const char **)classlistmp:(const char **)classlist, (const char **)(classvalues+havemp));
@ -220,6 +301,9 @@ void M_Menu_SinglePlayer_f (void)
MC_AddConsoleCommand (menu, 64, y+=8, "Load Game", "menu_load\n");
MC_AddConsoleCommand (menu, 64, y+=8, "Save Game", "menu_save\n");
*/
menu->cursoritem = (menuoption_t *)MC_AddCursor(menu, 56, menu->selecteditem?menu->selecteditem->common.posy:0);
return;
}

View File

@ -309,7 +309,7 @@ bindnames_t h2bindnames[] =
{"+showinfo", "full inventory"},
{"+showdm", "info / frags "},
//{"toggle_dm", "toggle frags "},
//{"+infoplaque", "objectives "}, //requires pulling info out of the mod... on the client.
{"+infoplaque", "objectives "}, //requires pulling info out of the mod... on the client.
{"invleft", "inv move left "},
{"invright", "inv move right"},
{"impulse 100", "inv:torch "},
@ -341,26 +341,58 @@ void M_Menu_Keys_f (void)
int y;
menu_t *menu;
int mgt;
extern cvar_t cl_splitscreen, cl_forcesplitclient;
key_dest = key_menu;
m_state = m_complex;
menu = M_CreateMenu(0);
MC_AddCenterPicture(menu, 4, 24, "gfx/ttl_cstm.lmp");
mgt = M_GameType();
#ifdef Q2CLIENT
if (mgt == MGT_QUAKE2) //quake2 main menu.
{
y = 48;
bindnames = q2bindnames;
}
else
#endif
if (mgt == MGT_HEXEN2)
{
MC_AddCenterPicture(menu, 0, 60, "gfx/menu/title6.lmp");
y = 64;
bindnames = h2bindnames;
}
else
bindnames = qwbindnames;
{
MC_AddCenterPicture(menu, 4, 24, "gfx/ttl_cstm.lmp");
y = 48;
bindnames = qwbindnames;
}
if (cl_splitscreen.ival)
{
static char *texts[MAX_SPLITS+2] =
{
"Depends on device",
"Player 1",
"Player 2",
"Player 3",
"Player 4",
NULL
};
static char *values[MAX_SPLITS+1] =
{
"0",
"1",
"2",
"3",
"4"
};
MC_AddCvarCombo(menu, 16, y, "Force client", &cl_forcesplitclient, texts, values);
y+=8;
}
y = 48;
while (bindnames->name)
{
MC_AddBind(menu, 16, y, bindnames->name, bindnames->command);
@ -370,15 +402,15 @@ void M_Menu_Keys_f (void)
}
}
void M_FindKeysForCommand (char *command, int *twokeys)
int M_FindKeysForBind (char *command, int *keylist, int total)
{
int count;
int j;
int l;
char *b;
twokeys[0] = twokeys[1] = -1;
for (count = 0; count < total; count++)
keylist[count] = -1;
l = strlen(command);
count = 0;
@ -389,12 +421,44 @@ void M_FindKeysForCommand (char *command, int *twokeys)
continue;
if (!strncmp (b, command, l) )
{
twokeys[count] = j;
keylist[count] = j;
count++;
if (count == 2)
if (count == total)
break;
}
}
return count;
}
void M_FindKeysForCommand (int pnum, char *command, int *twokeys)
{
char prefix[5];
if (*command == '+' || *command == '-')
{
prefix[0] = *command;
prefix[1] = 0;
if (pnum != 0)
{
prefix[1] = 'p';
prefix[2] = '0'+pnum;
prefix[3] = ' ';
prefix[4] = 0;
}
command++;
}
else
{
prefix[0] = 0;
if (pnum != 0)
{
prefix[0] = 'p';
prefix[1] = '0'+pnum;
prefix[2] = ' ';
prefix[3] = 0;
}
}
M_FindKeysForBind(va("%s%s", prefix, command), twokeys, 2);
}
void M_UnbindCommand (char *command)

View File

@ -388,7 +388,7 @@ void M_PrintWhite (int cx, int cy, qbyte *str);
void M_DrawScalePic (int x, int y, int w, int h, mpic_t *pic);
void M_FindKeysForCommand (char *command, int *twokeys);
void M_FindKeysForCommand (int pnum, char *command, int *twokeys);
void M_UnbindCommand (char *command);
qboolean MP_Init (void);

View File

@ -848,8 +848,6 @@ void NET_SendPollPacket(int len, void *data, netadr_t to)
int NET_CheckPollSockets(void)
{
#define MAX_UDP_PACKET 8192 // one more than msg + header
extern qbyte net_message_buffer[MAX_UDP_PACKET];
int sock;
SOCKET usesocket;
char adr[MAX_ADR_SIZE];

View File

@ -221,7 +221,7 @@ void PF_cl_findkeysforcommand (progfuncs_t *prinst, struct globalvars_s *pr_glob
int keynums[2];
char keyname[512];
M_FindKeysForCommand(cmdname, keynums);
M_FindKeysForCommand(0, cmdname, keynums);
keyname[0] = '\0';

View File

@ -395,6 +395,7 @@ void R2D_PolyBlend (void)
R2D_ImageColours (sw_blend[0], sw_blend[1], sw_blend[2], sw_blend[3]);
R2D_ScalePic(0, 0, vid.width, vid.height, shader_polyblend);
R2D_ImageColours (1, 1, 1, 1);
}
//for lack of hardware gamma
@ -422,6 +423,7 @@ void R2D_BrightenScreen (void)
R2D_ScalePic(0, 0, vid.width, vid.height, shader_brighten);
f *= 0.5;
}
R2D_ImageColours (1, 1, 1, 1);
RSpeedEnd(RSPEED_PALETTEFLASHES);
}

View File

@ -80,6 +80,7 @@ cvar_t sbar_teamstatus = SCVAR("sbar_teamstatus", "1");
int sb_updates; // if >= vid.numpages, no update needed
int sb_hexen2_cur_item;//hexen2 hud
qboolean sb_hexen2_extra_info;//show the extra stuff
qboolean sb_hexen2_infoplaque;
float sb_hexen2_item_time;
qboolean sbar_parsingteamstatuses; //so we don't eat it if its not displayed
@ -688,16 +689,22 @@ void Sbar_Hexen2InvUse_f(void)
{
Cbuf_AddText(va("impulse %d\n", 100+sb_hexen2_cur_item), Cmd_ExecLevel);
}
void Sbar_Hexen2ShowInfo_f(void)
{
sb_hexen2_extra_info = true;
}
void Sbar_Hexen2DontShowInfo_f(void)
{
sb_hexen2_extra_info = false;
}
void Sbar_Hexen2PInfoPlaque_f(void)
{
sb_hexen2_infoplaque = true;
}
void Sbar_Hexen2MInfoPlaque_f(void)
{
sb_hexen2_infoplaque = false;
}
/*
===============
@ -913,6 +920,8 @@ void Sbar_Init (void)
Cmd_AddCommand ("invuse", Sbar_Hexen2InvUse_f);
Cmd_AddCommand ("+showinfo", Sbar_Hexen2ShowInfo_f);
Cmd_AddCommand ("-showinfo", Sbar_Hexen2DontShowInfo_f);
Cmd_AddCommand ("+infoplaque", Sbar_Hexen2PInfoPlaque_f);
Cmd_AddCommand ("-infoplaque", Sbar_Hexen2MInfoPlaque_f);
Cbuf_AddText("alias +crouch \"impulse 22\"\n", RESTRICT_LOCAL);
Cbuf_AddText("alias -crouch \"impulse 22\"\n", RESTRICT_LOCAL);
}
@ -1848,6 +1857,18 @@ void Sbar_Hexen2DrawExtra (int pnum)
"Demoness"
};
if (sb_hexen2_infoplaque)
{
int i;
Con_Printf("Objectives:\n");
for (i = 0; i < 64; i++)
{
if (cl.stats[pnum][STAT_H2_OBJECTIVE1 + i/32] & (1<<(i&31)))
Con_Printf("%s\n", T_GetInfoString(i));
}
sb_hexen2_infoplaque = false;
}
if (!sb_hexen2_extra_info)
{
sbar_rect.y -= 46-SBAR_HEIGHT;
@ -2556,10 +2577,18 @@ void Sbar_DeathmatchOverlay (int start)
skip = 8;
// request new ping times every two second
if (realtime - cl.last_ping_request > 2 && cls.protocol == CP_QUAKEWORLD && cls.demoplayback != DPB_EZTV)
if (realtime - cl.last_ping_request > 2 && cls.demoplayback != DPB_EZTV)
{
cl.last_ping_request = realtime;
CL_SendClientCommand(true, "pings");
if (cls.protocol == CP_QUAKEWORLD)
{
cl.last_ping_request = realtime;
CL_SendClientCommand(true, "pings");
}
else if (cls.protocol == CP_NETQUAKE)
{
cl.last_ping_request = realtime;
CL_SendClientCommand(true, "ping");
}
}
if (start)
@ -2604,8 +2633,11 @@ void Sbar_DeathmatchOverlay (int start)
//columns are listed here in priority order (if the screen is too narrow, later ones will be hidden)
COLUMN_NAME
COLUMN_PING
COLUMN_PL
COLUMN_TIME
if (cls.protocol == CP_QUAKEWORLD)
{
COLUMN_PL
COLUMN_TIME
}
COLUMN_FRAGS
if (cl.teamplay)
{

View File

@ -1139,7 +1139,7 @@ void SCR_VRectForPlayer(vrect_t *vrect, int pnum)
case 2: //horizontal bands
case 3:
#ifdef GLQUAKE
if (qrenderer == QR_OPENGL && vid.pixelwidth > vid.pixelheight * 2)
if (qrenderer == QR_OPENGL && vid.pixelwidth > vid.pixelheight * 2 && ffov.value >= 0)
{ //over twice as wide as high, assume duel moniter, horizontal.
vrect->width = vid.width/cl.splitclients;
vrect->height = vid.height;
@ -1261,10 +1261,8 @@ void V_RenderPlayerViews(int plnum)
CL_LinkViewModel ();
Cam_SelfTrack(plnum);
{
R_RenderView ();
R_DrawNameTags();
}
R_RenderView ();
R_DrawNameTags();
cl_numvisedicts = oldnuments;

View File

@ -536,6 +536,9 @@ STAT_H2_MAXMANA,
STAT_H2_FLAGS,
STAT_H2_PLAYERCLASS,
STAT_H2_OBJECTIVE1,
STAT_H2_OBJECTIVE2,
STAT_MOVEVARS_WALLFRICTION = 237, // DP

View File

@ -434,6 +434,8 @@ int build_number( void );
void TL_InitLanguages(void);
void T_FreeStrings(void);
char *T_GetString(int num);
void T_FreeInfoStrings(void);
char *T_GetInfoString(int num);
//
// log.c

View File

@ -1834,6 +1834,7 @@ const gamemode_info_t gamemode_info[] = {
{"FTE-Quake2", "q2", "-q2", "baseq2/pak0.pak", NULL, {"baseq2", "fteq2"}, "Quake II"},
{"FTE-Quake3", "q3", "-q3", "baseq3/pak0.pk3", NULL, {"baseq3", "fteq3"}, "Quake III Arena"},
{"FTE-Quake4", "q4", "-q4", "q4base/pak00.pk4", NULL, {"q4base", "fteq4"}, "Quake 4"},
{"FTE-EnemyTerritory", "et", "-et", "etmain/pak0.pk3", NULL, {"etmain", "fteet"}, "Wolfenstein - Enemy Territory"},
{"FTE-JK2", "jk2", "-jk2", "base/assets0.pk3", NULL, {"base", "fte"}, "Jedi Knight II: Jedi Outcast"},
@ -2039,6 +2040,29 @@ void FS_ReloadPackFiles_f(void)
#define byte BYTE //some versions of mingw headers are broken slightly. this lets it compile.
#endif
#include <shlobj.h>
static qboolean Sys_SteamHasFile(char *basepath, int basepathlen, char *steamdir, char *fname)
{
/*
Find where Valve's Steam distribution platform is installed.
Then take a look at that location for the relevent installed app.
*/
FILE *f;
DWORD resultlen;
HKEY key = NULL;
if (!FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Valve\\Steam", 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &key)))
{
resultlen = basepathlen;
RegQueryValueEx(key, "InstallPath", NULL, NULL, basepath, &resultlen);
RegCloseKey(key);
Q_strncatz(basepath, va("/SteamApps/common/%s", steamdir), basepathlen);
if (f = fopen(va("%s/%s", basepath, fname), "rb"))
{
fclose(f);
return true;
}
}
return false;
}
qboolean Sys_FindGameData(const char *poshname, const char *gamename, char *basepath, int basepathlen)
{
DWORD resultlen;
@ -2067,23 +2091,14 @@ qboolean Sys_FindGameData(const char *poshname, const char *gamename, char *base
if (!strcmp(gamename, "q1"))
{
FILE *f;
//try and find it via steam
//reads HKEY_LOCAL_MACHINE\SOFTWARE\Valve\Steam\InstallPath
//append SteamApps\common\quake
//use it if we find winquake.exe there
FILE *f;
if (!FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Valve\\Steam", 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &key)))
{
resultlen = basepathlen;
RegQueryValueEx(key, "InstallPath", NULL, NULL, basepath, &resultlen);
RegCloseKey(key);
Q_strncatz(basepath, "/SteamApps/common/quake", basepathlen);
if (f = fopen(va("%s/Winquake.exe", basepath), "rb"))
{
fclose(f);
return true;
}
}
if (Sys_SteamHasFile(basepath, basepathlen, "quake", "Winquake.exe"))
return true;
//well, okay, so they don't have quake installed from steam.
//quite a lot of people have it in c:\quake, as that's the default install location from the quake cd.
@ -2098,26 +2113,9 @@ qboolean Sys_FindGameData(const char *poshname, const char *gamename, char *base
if (!strcmp(gamename, "q2"))
{
//try and find it via steam
//reads HKEY_LOCAL_MACHINE\SOFTWARE\Valve\Steam\InstallPath
//append SteamApps\common\quake 2
//use it if we find quake2.exe there
FILE *f;
DWORD resultlen;
HKEY key = NULL;
if (!FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Valve\\Steam", 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &key)))
{
resultlen = basepathlen;
RegQueryValueEx(key, "InstallPath", NULL, NULL, basepath, &resultlen);
RegCloseKey(key);
Q_strncatz(basepath, "/SteamApps/common/quake 2", basepathlen);
if (f = fopen(va("%s/quake2.exe", basepath), "rb"))
{
fclose(f);
return true;
}
}
//well, okay, so they don't have quake2 installed from steam.
//look for HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Quake2_exe\Path
if (!FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Quake2_exe", 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &key)))
@ -2131,20 +2129,54 @@ qboolean Sys_FindGameData(const char *poshname, const char *gamename, char *base
return true;
}
}
if (Sys_SteamHasFile(basepath, basepathlen, "quake 2", "quake2.exe"))
return true;
}
if (!strcmp(gamename, "et"))
{
FILE *f;
DWORD resultlen;
HKEY key = NULL;
//reads HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Wolfenstein - Enemy Territory
if (!FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Activision\\Wolfenstein - Enemy Territory", 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &key)))
{
resultlen = basepathlen;
RegQueryValueEx(key, "InstallPath", NULL, NULL, basepath, &resultlen);
RegCloseKey(key);
if (f = fopen(va("%s/ET.exe", basepath), "rb"))
{
fclose(f);
return true;
}
return true;
}
}
if (!strcmp(gamename, "q3"))
{
FILE *f;
DWORD resultlen;
HKEY key = NULL;
//reads HKEY_LOCAL_MACHINE\SOFTWARE\id\Quake III Arena\InstallPath
if (!FAILED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\id\\Quake III Arena", 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE, &key)))
{
resultlen = basepathlen;
RegQueryValueEx(key, "InstallPath", NULL, NULL, basepath, &resultlen);
RegCloseKey(key);
return true;
if (f = fopen(va("%s/quake3.exe", basepath), "rb"))
{
fclose(f);
return true;
}
}
if (Sys_SteamHasFile(basepath, basepathlen, "quake 3 arena", "quake3.exe"))
return true;
}
if (!strcmp(gamename, "wop"))
@ -2179,9 +2211,9 @@ qboolean Sys_FindGameData(const char *poshname, const char *gamename, char *base
if (!strcmp(gamename, "h2"))
{
//try and find it via steam
//reads HKEY_LOCAL_MACHINE\SOFTWARE\Valve\Steam\InstallPath
//append SteamApps\common\hexen 2
if (Sys_SteamHasFile(basepath, basepathlen, "hexen 2", "h2.exe"))
return true;
}
#if !defined(NPQTV) && !defined(SERVERONLY) //this is *really* unfortunate, but doing this crashes the browser
@ -2265,6 +2297,77 @@ void FS_Shutdown(void)
}
void FS_StartupWithGame(int gamenum)
{
int i;
Cvar_Set(&com_gamename, gamemode_info[gamenum].protocolname);
//
// start up with id1 by default
//
i = COM_CheckParm ("-basegame");
if (i && i < com_argc-1)
{
do //use multiple -basegames
{
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_quakedir, com_argv[i+1]), ~0);
if (*com_homedir)
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_homedir, com_argv[i+1]), ~0);
i = COM_CheckNextParm ("-basegame", i);
}
while (i && i < com_argc-1);
}
else
{
for (i = 0; i < sizeof(gamemode_info[gamenum].dir)/sizeof(gamemode_info[gamenum].dir[0]); i++)
{
if (gamemode_info[gamenum].dir[i])
{
FS_AddGameDirectory (gamemode_info[gamenum].dir[i], va("%s%s", com_quakedir, gamemode_info[gamenum].dir[i]), ~0);
if (*com_homedir)
FS_AddGameDirectory (gamemode_info[gamenum].dir[i], va("%s%s", com_homedir, gamemode_info[gamenum].dir[i]), ~0);
}
}
}
i = COM_CheckParm ("-addbasegame");
while (i && i < com_argc-1) //use multiple -addbasegames (this is so the basic dirs don't die)
{
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_quakedir, com_argv[i+1]), ~0);
if (*com_homedir)
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_homedir, com_argv[i+1]), ~0);
i = COM_CheckNextParm ("-addbasegame", i);
}
// any set gamedirs will be freed up to here
com_base_searchpaths = com_searchpaths;
//-game specifies the mod gamedir to use in NQ
i = COM_CheckParm ("-game"); //effectivly replace with +gamedir x (But overridable)
if (i && i < com_argc-1)
{
COM_Gamedir(com_argv[i+1]);
}
//+gamedir specifies the mod gamedir to use in QW
//hack - we parse the commandline after the config so commandline always overrides
//but this means ktpro/server.cfg (for example) is not found
//so if they specify a gamedir on the commandline, let the default configs be loaded from that gamedir
//note that -game +gamedir will result in both being loaded. but hey, who cares
i = COM_CheckParm ("+gamedir"); //effectivly replace with +gamedir x (But overridable)
if (i && i < com_argc-1)
{
COM_Gamedir(com_argv[i+1]);
}
if (gamemode_info[gamenum].customexec)
Cbuf_AddText(gamemode_info[gamenum].customexec, RESTRICT_LOCAL);
}
/*
================
COM_InitFilesystem
@ -2375,11 +2478,6 @@ void COM_InitFilesystem (void)
}
}
Cvar_Set(&com_gamename, gamemode_info[gamenum].protocolname);
if (gamemode_info[gamenum].customexec)
Cbuf_AddText(gamemode_info[gamenum].customexec, RESTRICT_LOCAL);
usehome = false;
#ifdef _WIN32
@ -2414,6 +2512,7 @@ void COM_InitFilesystem (void)
//as a browser plugin, always use their home directory
usehome = true;
#else
/*would it not be better to just check to see if we have write permission to the basedir?*/
if (winver >= 0x6) // Windows Vista and above
usehome = true; // always use home directory by default, as Vista+ mimics this behavior anyway
else if (winver >= 0x5) // Windows 2000/XP/2003
@ -2488,67 +2587,8 @@ void COM_InitFilesystem (void)
if (*com_homedir)
Con_Printf("Using home directory \"%s\"\n", com_homedir);
//
// start up with id1 by default
//
i = COM_CheckParm ("-basegame");
if (i && i < com_argc-1)
{
do //use multiple -basegames
{
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_quakedir, com_argv[i+1]), ~0);
if (*com_homedir)
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_homedir, com_argv[i+1]), ~0);
i = COM_CheckNextParm ("-basegame", i);
}
while (i && i < com_argc-1);
}
else
{
for (i = 0; i < sizeof(gamemode_info[gamenum].dir)/sizeof(gamemode_info[gamenum].dir[0]); i++)
{
if (gamemode_info[gamenum].dir[i])
{
FS_AddGameDirectory (gamemode_info[gamenum].dir[i], va("%s%s", com_quakedir, gamemode_info[gamenum].dir[i]), ~0);
if (*com_homedir)
FS_AddGameDirectory (gamemode_info[gamenum].dir[i], va("%s%s", com_homedir, gamemode_info[gamenum].dir[i]), ~0);
}
}
}
i = COM_CheckParm ("-addbasegame");
while (i && i < com_argc-1) //use multiple -addbasegames (this is so the basic dirs don't die)
{
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_quakedir, com_argv[i+1]), ~0);
if (*com_homedir)
FS_AddGameDirectory (com_argv[i+1], va("%s%s", com_homedir, com_argv[i+1]), ~0);
i = COM_CheckNextParm ("-addbasegame", i);
}
// any set gamedirs will be freed up to here
com_base_searchpaths = com_searchpaths;
//-game specifies the mod gamedir to use in NQ
i = COM_CheckParm ("-game"); //effectivly replace with +gamedir x (But overridable)
if (i && i < com_argc-1)
{
COM_Gamedir(com_argv[i+1]);
}
//+gamedir specifies the mod gamedir to use in QW
//hack - we parse the commandline after the config so commandline always overrides
//but this means ktpro/server.cfg (for example) is not found
//so if they specify a gamedir on the commandline, let the default configs be loaded from that gamedir
//note that -game +gamedir will result in both being loaded. but hey, who cares
i = COM_CheckParm ("+gamedir"); //effectivly replace with +gamedir x (But overridable)
if (i && i < com_argc-1)
{
COM_Gamedir(com_argv[i+1]);
}
FS_StartupWithGame(gamenum);
}

View File

@ -65,7 +65,7 @@ extern netadr_t net_from; // address of who sent the packet
extern sizebuf_t net_message;
//#define MAX_UDP_PACKET (MAX_MSGLEN*2) // one more than msg + header
#define MAX_UDP_PACKET 8192 // one more than msg + header
extern qbyte net_message_buffer[MAX_UDP_PACKET];
extern qbyte net_message_buffer[MAX_OVERALLMSGLEN];
extern cvar_t hostname;
@ -228,6 +228,9 @@ void Huff_EmitByte(int ch, qbyte *buffer, int *count);
//server->client protocol info
#define NQ_PROTOCOL_VERSION 15
#define H2_PROTOCOL_VERSION 19
#define NEHD_PROTOCOL_VERSION 250
#define FITZ_PROTOCOL_VERSION 666
#define DP5_PROTOCOL_VERSION 3502
#define DP6_PROTOCOL_VERSION 3503
#define DP7_PROTOCOL_VERSION 3504

View File

@ -31,7 +31,7 @@ sizebuf_t net_message;
//#define MAX_UDP_PACKET (MAX_MSGLEN*2) // one more than msg + header
#define MAX_UDP_PACKET 8192 // one more than msg + header
qbyte net_message_buffer[MAX_UDP_PACKET];
qbyte net_message_buffer[MAX_OVERALLMSGLEN];
#ifdef _WIN32
WSADATA winsockdata;
#endif

View File

@ -646,7 +646,8 @@ enum {
TE_RAILTRAIL = 17,
// hexen 2
// hexen 2
TEH2_STREAM_LIGHTNING_SMALL = 24,
TEH2_STREAM_CHAIN = 25,
TEH2_STREAM_SUNSTAFF1 = 26,
TEH2_STREAM_SUNSTAFF2 = 27,

View File

@ -757,12 +757,13 @@ void TL_InitLanguages(void)
#ifndef CLIENTONLY
//this stuff is for hexen2 translation strings.
//(hexen2 is uuuuggllyyyy...)
char *strings_list;
char **strings_table;
int strings_count;
qboolean strings_loaded;
static char *strings_list;
static char **strings_table;
static int strings_count;
static qboolean strings_loaded;
void T_FreeStrings(void)
{ //on map change, following gamedir change
if (strings_loaded)
@ -822,4 +823,70 @@ char *T_GetString(int num)
return strings_table[num];
}
#endif
#ifndef SERVERONLY
static char *info_strings_list;
static char **info_strings_table;
static int info_strings_count;
static qboolean info_strings_loaded;
void T_FreeInfoStrings(void)
{ //on map change, following gamedir change
if (info_strings_loaded)
{
BZ_Free(info_strings_list);
BZ_Free(info_strings_table);
info_strings_count = 0;
info_strings_loaded = false;
}
}
void T_LoadInfoString(void)
{
int i;
char *s, *s2;
//count new lines
info_strings_loaded = true;
info_strings_count = 0;
info_strings_list = FS_LoadMallocFile("infolist.txt");
if (!info_strings_list)
return;
for (s = info_strings_list; *s; s++)
{
if (*s == '\n')
info_strings_count++;
}
info_strings_table = BZ_Malloc(sizeof(char*)*info_strings_count);
s = info_strings_list;
for (i = 0; i < info_strings_count; i++)
{
info_strings_table[i] = s;
s2 = strchr(s, '\n');
if (!s2)
break;
while (s < s2)
{
if (*s == '\r')
*s = '\0';
else if (*s == '^' || *s == '@') //becomes new line
*s = '\n';
s++;
}
s = s2+1;
*s2 = '\0';
}
}
char *T_GetInfoString(int num)
{
if (!info_strings_loaded)
{
T_LoadInfoString();
}
if (num<0 || num >= info_strings_count)
return "BAD STRING";
return info_strings_table[num];
}
#endif

View File

@ -846,7 +846,7 @@ static qboolean R_CalcModelLighting(entity_t *e, model_t *clmodel, unsigned int
if ((e->drawflags & MLS_MASKIN) == MLS_ABSLIGHT)
{
shadelight[0] = shadelight[1] = shadelight[2] = e->abslight;
ambientlight[0] = ambientlight[1] = ambientlight[2] = 0;
ambientlight[0] = ambientlight[1] = ambientlight[2] = e->abslight;
}
//#define SHOWLIGHTDIR

View File

@ -664,6 +664,9 @@ static void RevertToKnownState(void)
shaderstate.shaderbits &= ~(SBITS_MISC_DEPTHEQUALONLY|SBITS_MISC_DEPTHCLOSERONLY);
shaderstate.shaderbits |= SBITS_MISC_DEPTHWRITE;
shaderstate.shaderbits &= ~(SBITS_BLEND_BITS);
qglDisable(GL_BLEND);
qglDepthFunc(GL_LEQUAL);
qglDepthMask(GL_TRUE);
@ -2631,6 +2634,12 @@ static void BaseBrushTextures(entity_t *ent)
for (s = model->surfaces+model->firstmodelsurface,i = 0; i < model->nummodelsurfaces; i++, s++)
Surf_RenderAmbientLightmaps (s, shift, ent->abslight);
}
else if (ent->drawflags & DRF_TRANSLUCENT)
{
//update lightmaps.
for (s = model->surfaces+model->firstmodelsurface,i = 0; i < model->nummodelsurfaces; i++, s++)
Surf_RenderAmbientLightmaps (s, shift, 255);
}
else
{
//update lightmaps.

View File

@ -1616,22 +1616,28 @@ qboolean R_RenderScene_Fish(void)
vec3_t saveang;
int rot45 = 0;
#pragma message("backend fixme")
Con_Printf("fisheye/panorama is not updated for the backend\n");
vrect_t vrect;
vrect_t prect;
SCR_VRectForPlayer(&vrect, r_refdef.currentplayernum);
prect.x = (vrect.x * vid.pixelwidth)/vid.width;
prect.width = (vrect.width * vid.pixelwidth)/vid.width;
prect.y = (vrect.y * vid.pixelheight)/vid.height;
prect.height = (vrect.height * vid.pixelheight)/vid.height;
if (!scenepp_panorama_program)
return false;
if (gl_config.arb_texture_non_power_of_two)
{
if (vid.pixelwidth < vid.pixelheight)
cmapsize = vid.pixelwidth;
if (prect.width < prect.height)
cmapsize = prect.width;
else
cmapsize = vid.pixelheight;
cmapsize = prect.height;
}
else
{
while (cmapsize > vid.pixelwidth || cmapsize > vid.pixelheight)
while (cmapsize > prect.width || cmapsize > prect.height)
{
cmapsize /= 2;
}
@ -1684,8 +1690,6 @@ qboolean R_RenderScene_Fish(void)
order[5] = 5;
}
qglViewport (0, vid.pixelheight - cmapsize, cmapsize, cmapsize);
if (!TEXVALID(scenepp_fisheye_texture))
{
scenepp_fisheye_texture = GL_AllocNewTexture();
@ -1705,10 +1709,10 @@ qboolean R_RenderScene_Fish(void)
qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
}
r_refdef.vrect.width = (cmapsize+0.99)*vid.width/vid.pixelwidth;
r_refdef.vrect.height = (cmapsize+0.99)*vid.height/vid.pixelheight;
r_refdef.vrect.width = cmapsize;
r_refdef.vrect.height = cmapsize;
r_refdef.vrect.x = 0;
r_refdef.vrect.y = vid.height - r_refdef.vrect.height;
r_refdef.vrect.y = prect.y;
ang[0][0] = -saveang[0];
ang[0][1] = -90;
@ -1738,13 +1742,13 @@ qboolean R_RenderScene_Fish(void)
qglDisable(GL_TEXTURE_2D);
qglEnable(GL_TEXTURE_CUBE_MAP_ARB);
GL_BindType(GL_TEXTURE_CUBE_MAP_ARB, scenepp_fisheye_texture);
qglCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + order[i], 0, 0, 0, 0, 0, cmapsize, cmapsize);
qglCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + order[i], 0, 0, 0, 0, vid.pixelheight - (prect.y + cmapsize), cmapsize, cmapsize);
qglEnable(GL_TEXTURE_2D);
qglDisable(GL_TEXTURE_CUBE_MAP_ARB);
}
//qglClear (GL_COLOR_BUFFER_BIT);
qglViewport (0, 0, vid.pixelwidth, vid.pixelheight);
qglViewport (prect.x, vid.pixelheight - (prect.y+prect.height), prect.width, prect.height);
qglDisable(GL_TEXTURE_2D);
GL_BindType(GL_TEXTURE_CUBE_MAP_ARB, scenepp_fisheye_texture);
@ -1766,7 +1770,7 @@ qboolean R_RenderScene_Fish(void)
qglMatrixMode(GL_PROJECTION);
qglPushMatrix();
qglLoadIdentity ();
qglOrtho (0, vid.pixelwidth, 0, vid.pixelheight, -99999, 99999);
qglOrtho (0, vid.width, vid.height, 0, -99999, 99999);
qglMatrixMode(GL_MODELVIEW);
qglPushMatrix();
qglLoadIdentity ();
@ -1776,14 +1780,14 @@ qboolean R_RenderScene_Fish(void)
qglDisable (GL_ALPHA_TEST);
qglDisable(GL_BLEND);
qglBegin(GL_QUADS);
qglTexCoord2f(-0.5, -0.5);
qglVertex2f(0, 0);
qglTexCoord2f(0.5, -0.5);
qglVertex2f(vid.pixelwidth, 0);
qglTexCoord2f(0.5, 0.5);
qglVertex2f(vid.pixelwidth, vid.pixelheight);
qglTexCoord2f(-0.5, 0.5);
qglVertex2f(0, vid.pixelheight);
qglVertex2f(0, 0);
qglTexCoord2f(0.5, 0.5);
qglVertex2f(vid.width, 0);
qglTexCoord2f(0.5, -0.5);
qglVertex2f(vid.width, vid.height);
qglTexCoord2f(-0.5, -0.5);
qglVertex2f(0, vid.height);
qglEnd();
qglMatrixMode(GL_PROJECTION);
@ -1796,6 +1800,9 @@ qboolean R_RenderScene_Fish(void)
GLSlang_UseProgram(0);
qglEnable (GL_DEPTH_TEST);
PPL_RevertToKnownState();
return true;
}
#endif

View File

@ -992,6 +992,7 @@ void NPP_NQWriteByte(int dest, qbyte data) //replacement write func (nq to qw)
multicastpos=2;
multicasttype=MULTICAST_PHS;
break;
case TEH2_STREAM_LIGHTNING_SMALL:
case TEH2_STREAM_CHAIN:
case TEH2_STREAM_SUNSTAFF1:
case TEH2_STREAM_SUNSTAFF2:

View File

@ -93,6 +93,7 @@ cvar_t sql_defaultdb = SCVARF("sv_sql_defaultdb", "", CVAR_NOUNSAFEEXPAND);
evalc_t evalc_idealpitch, evalc_pitch_speed;
int pr_teamfield;
unsigned int h2infoplaque[2]; /*hexen2 stat*/
void PR_ClearThreads(void);
void PR_fclose_progs(progfuncs_t*);
@ -700,6 +701,9 @@ void PR_LoadGlabalStruct(void)
SV_QCStatName(ev_float, "max_mana", STAT_H2_MAXMANA);
SV_QCStatName(ev_float, "flags", STAT_H2_FLAGS);
SV_QCStatName(ev_float, "playerclass", STAT_H2_PLAYERCLASS);
SV_QCStatPtr(ev_integer, &h2infoplaque[0], STAT_H2_OBJECTIVE1);
SV_QCStatPtr(ev_integer, &h2infoplaque[1], STAT_H2_OBJECTIVE2);
}
}
@ -7141,86 +7145,116 @@ void PF_h2matchAngleToSlope(progfuncs_t *prinst, struct globalvars_s *pr_globals
actor->v->angles[0] = dot*pitch;
actor->v->angles[2] = (1-fabs(dot))*pitch*mod;
}
void PF_h2updateinfoplaque(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
unsigned int idx = G_FLOAT(OFS_PARM0);
int mode = G_FLOAT(OFS_PARM1); /*0=toggle, 1=force, 2=clear*/
if (idx >= sizeof(h2infoplaque)*8)
return;
if ((mode & 3) == 3)
/*idiot*/;
else if (mode & 1)
h2infoplaque[idx/32] |= 1<<(idx&31);
else if (mode & 2)
h2infoplaque[idx/32] &=~(1<<(idx&31));
else
h2infoplaque[idx/32] ^= 1<<(idx&31);
}
void PF_h2starteffect(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
switch((int)G_FLOAT(OFS_PARM0))
{
case 4:
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/whtsmk1.spr"), 0, 5, 20);
case 4: //white_smoke
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/whtsmk1.spr"), 0, 5, 1/G_FLOAT(OFS_PARM3));
break;
case 6:
case 6: //yellowspark
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/spark.spr"), 0, 10, 20);
break;
case 7:
case 7: //sm_circle
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/fcircle.spr"), 0, 6, 20);
break;
case 9:
case 9: //sm_white_flash
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/sm_white.spr"), 0, 3, 20);
break;
case 11:
case 11: //yellowred_flash
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/yr_flash.spr"), 0, 21, 20);
break;
case 13:
case 13: //sm_blue_flash
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/bluflash.spr"), 0, 5, 20);
break;
case 14:
case 14: //red_flash
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/redspt.spr"), 0, 5, 20);
break;
case 15:
case 15: //sm_explosion
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/sm_expld.spr"), 0, 12, 20);
break;
case 16:
case 16: //lg_explosion
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/bg_expld.spr"), 0, 12, 20);
break;
case 17:
case 17: //floor_explosion
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/fl_expld.spr"), 0, 20, 20);
break;
case 24:
case 20: //green_smoke
//parm1 = vel
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/grnsmk1.spr"), 0, 8, 1/G_FLOAT(OFS_PARM3));
break;
case 24: //redspark
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/rspark.spr"), 0, 10, 20);
break;
case 25:
case 25: //greenspark
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/gspark.spr"), 0, 10, 20);
break;
case 26:
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/telesmk1.spr"), 0, 4, 20);
case 26: //telesmk1
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/telesmk1.spr"), 0, 4, 1/G_FLOAT(OFS_PARM3));
break;
case 28:
case 28: //icehit
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/icehit.spr"), 0, 6, 20);
break;
case 33:
case 33: //new_explosion
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/gen_expl.spr"), 0, 14, 20);
break;
case 34:
case 34: //magic_missile_explosion
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/mm_explod.spr"), 0, 50, 20);
break;
case 42:
case 42: //flamestream
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/flamestr.spr"), 0, 12, 20);
break;
case 45:
case 45: //bldrn_expl
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/xplsn_1.spr"), 0, 7, 20);
break;
case 47:
case 47: //acid_hit
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/axplsn_2.spr"), 0, 14, 20);
break;
case 48:
case 48: //firewall_small
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/firewal1.spr"), 0, 18, 20);
break;
case 49:
case 49: //firewall_medium
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/firewal5.spr"), 0, 30, 20);
break;
case 50:
case 50: //firewall_large
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/firewal4.spr"), 0, 29, 20);
break;
case 56:
case 54: //fboom
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/fboom.spr"), 0, 14, 20);
break;
case 56: //bomb
SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/pow.spr"), 0, 6, 20);
break;
case 40:
case 46:
case 52:
case 53:
case 57:
break;
case 40: //boneshard
// SV_Effect(G_VECTOR(OFS_PARM1), PF_precache_model_Internal(prinst, "models/boneshot.mdl"), 0, 50, 20);
// break;
case 2:
case 55:
case 2: //fountain
case 55: //chunk
Con_DPrintf("Start unsupported effect %i\n", (int)G_FLOAT(OFS_PARM0));
break;
@ -7248,6 +7282,10 @@ void PF_h2updatesoundpos(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
}
void PF_h2whiteflash(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
}
void PF_h2getstring(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
char *s = T_GetString(G_FLOAT(OFS_PARM0)-1);
@ -9286,11 +9324,11 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"precache_sound3", PF_precache_sound, 0, 0, 96, 0},
{"precache_model3", PF_precache_model, 0, 0, 97, 0},//please don't use...
{"matchangletoslope",PF_h2matchAngleToSlope,0, 0, 99, 0},
{"updateinfoplaque",PF_h2updateinfoplaque,0, 0, 100, 0},
{"precache_sound4", PF_precache_sound, 0, 0, 101, 0},
{"precache_model4", PF_precache_model, 0, 0, 102, 0},
{"precache_file4", PF_precache_file, 0, 0, 103, 0},
{"dowhiteflash", PF_Fixme, 0, 0, 104, 0},
{"dowhiteflash", PF_h2whiteflash, 0, 0, 104, 0},
{"updatesoundpos", PF_h2updatesoundpos,0, 0, 105, 0},
{"stopsound", PF_h2StopSound, 0, 0, 106, 0},

View File

@ -1224,18 +1224,6 @@ Con_DPrintf("PF_readcmd: %s\n%s", s, output);
break; //nothing changed, ignore it.
sv.paused = pause;
sv.pausedstart = Sys_DoubleTime();
// send out notifications
for (i=0, cl = svs.clients ; i<MAX_CLIENTS ; i++, cl++)
{
if (!cl->state)
continue;
if ((ISQWCLIENT(cl) || ISNQCLIENT(cl)) && !cl->controller)
{
ClientReliableWrite_Begin (cl, svc_setpause, 2);
ClientReliableWrite_Byte (cl, sv.paused);
}
}
}
break;

View File

@ -1012,6 +1012,7 @@ qboolean SV_ChallengePasses(int challenge);
void SV_QCStatName(int type, char *name, int statnum);
void SV_QCStatFieldIdx(int type, unsigned int fieldindex, int statnum);
void SV_QCStatGlobal(int type, char *globalname, int statnum);
void SV_QCStatPtr(int type, void *ptr, int statnum);
void SV_ClearQCStats(void);
void SV_SendClientMessages (void);

View File

@ -1077,12 +1077,14 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
ent = EDICT_NUM(svprogfuncs, 0);
ent->isfree = false;
#ifndef SERVERONLY
/*force coop 1 if splitscreen and not deathmatch*/
{
extern cvar_t cl_splitscreen;
if (cl_splitscreen.value && !deathmatch.value && !coop.value)
Cvar_Set(&coop, "1");
}
#endif
/*only make one slot for single-player*/
if (!isDedicated && !deathmatch.value && !coop.value)
sv.allocated_client_slots = 1;
@ -1454,6 +1456,7 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
SCR_ImageName(server);
#endif
/*DP_BOTCLIENT bots should move over to the new map too*/
if (svs.gametype == GT_PROGS || svs.gametype == GT_Q1QVM)
{
for (i = 0; i < sv.allocated_client_slots; i++)

View File

@ -3321,6 +3321,23 @@ void SV_Impulse_f (void)
svs.clients[i].state = cs_free;
}
static void SV_PauseChanged(void)
{
int i;
client_t *cl;
// send notification to all clients
for (i=0, cl = svs.clients ; i<MAX_CLIENTS ; i++, cl++)
{
if (!cl->state)
continue;
if ((ISQWCLIENT(cl) || ISNQCLIENT(cl)) && !cl->controller)
{
ClientReliableWrite_Begin (cl, svc_setpause, 2);
ClientReliableWrite_Byte (cl, sv.paused!=0);
}
}
}
/*
==================
SV_Frame
@ -3333,6 +3350,7 @@ void SV_Frame (void)
static double start, end;
float oldtime;
qboolean isidle;
static int oldpaused;
start = Sys_DoubleTime ();
svs.stats.idle += start - end;
@ -3345,6 +3363,16 @@ void SV_Frame (void)
if (!sv.gamespeed)
sv.gamespeed = 1;
#ifndef SERVERONLY
sv.paused = (sv.paused & ~4) | ((!isDedicated && sv.allocated_client_slots == 1 && key_dest != key_game)?4:0);
#endif
if (oldpaused != sv.paused)
{
SV_PauseChanged();
oldpaused = sv.paused;
}
// decide the simulation time
{
oldtime = sv.time;
@ -3358,9 +3386,7 @@ void SV_Frame (void)
sv.time = oldtime; //and keep time as it was.
}
#ifndef SERVERONLY
if (isDedicated)
#endif
realtime += sv.time - oldtime;
}

View File

@ -1180,12 +1180,23 @@ FIXME: is this true?
static void SV_Physics_Step (edict_t *ent)
{
qboolean hitsound;
qboolean freefall;
int fl = ent->v->flags;
if (ent->v->velocity[2] >= (1.0 / 32.0) && ((int)ent->v->flags & FL_ONGROUND))
ent->v->flags = (int)ent->v->flags & ~FL_ONGROUND;
if (ent->v->velocity[2] >= (1.0 / 32.0) && (fl & FL_ONGROUND))
{
fl &= ~FL_ONGROUND;
ent->v->flags = fl;
}
// frefall if not onground
if ( ! ((int)ent->v->flags & (FL_ONGROUND | FL_FLY | FL_SWIM) ) )
if (fl & (FL_ONGROUND | FL_FLY))
freefall = false;
else
freefall = true;
if (fl & FL_SWIM)
freefall = ent->v->waterlevel > 0;
if (freefall)
{
hitsound = ent->v->velocity[2] < movevars.gravity*-0.1;
@ -1858,12 +1869,12 @@ void SV_RunEntity (edict_t *ent)
case MOVETYPE_FOLLOW:
SV_Physics_Follow (ent);
break;
case MOVETYPE_FLY:
case MOVETYPE_H2SWIM:
case MOVETYPE_TOSS:
case MOVETYPE_BOUNCE:
case MOVETYPE_BOUNCEMISSILE:
case MOVETYPE_FLY:
case MOVETYPE_FLYMISSILE:
case MOVETYPE_H2SWIM:
SV_Physics_Toss (ent);
break;
case MOVETYPE_WALK:

View File

@ -689,7 +689,9 @@ void SV_MulticastProtExt(vec3_t origin, multicast_t to, int dimension_mask, int
// -1 is because pvs rows are 1 based, not 0 based like leafs
if (mask != sv.pvs)
{
leafnum = sv.world.worldmodel->funcs.LeafnumForPoint (sv.world.worldmodel, client->edict->v->origin)-1;
vec3_t pos;
VectorAdd(client->edict->v->origin, client->edict->v->view_ofs, pos);
leafnum = sv.world.worldmodel->funcs.LeafnumForPoint (sv.world.worldmodel, pos)-1;
if ( !(mask[leafnum>>3] & (1<<(leafnum&7)) ) )
{
// Con_Printf ("PVS supressed multicast\n");
@ -1280,13 +1282,21 @@ void SV_QCStatGlobal(int type, char *globalname, int statnum)
{
eval_t *glob;
if (type < 0)
return;
glob = svprogfuncs->FindGlobal(svprogfuncs, globalname, PR_ANY);
if (!glob)
{
Con_Printf("couldn't find named global for csqc stat (%s)\n", globalname);
return;
}
SV_QCStatEval(type, globalname, NULL, glob, statnum);
SV_QCStatEval(-type, globalname, NULL, glob, statnum);
}
void SV_QCStatPtr(int type, void *ptr, int statnum)
{
SV_QCStatEval(-type, "", NULL, ptr, statnum);
}
void SV_QCStatName(int type, char *name, int statnum)

View File

@ -1423,9 +1423,9 @@ void SV_Spawn_f (void)
//
// force stats to be updated
//
memset (host_client->statsi, 0, sizeof(host_client->statsi));
memset (host_client->statsf, 0, sizeof(host_client->statsf));
memset (host_client->statss, 0, sizeof(host_client->statss));
memset (split->statsi, 0, sizeof(split->statsi));
memset (split->statsf, 0, sizeof(split->statsf));
memset (split->statss, 0, sizeof(split->statss));
}
secret_total = pr_global_struct->total_secrets;
@ -1693,7 +1693,7 @@ void SV_Begin_f (void)
if (!ISQ2CLIENT(host_client))
{
ClientReliableWrite_Begin (host_client, svc_setpause, 2);
ClientReliableWrite_Byte (host_client, sv.paused);
ClientReliableWrite_Byte (host_client, sv.paused!=0);
}
SV_ClientTPrintf(host_client, PRINT_HIGH, STL_SERVERPAUSED);
}
@ -2893,8 +2893,6 @@ SV_TogglePause
*/
qboolean SV_TogglePause (client_t *initiator)
{
int i;
client_t *cl;
int newv;
newv = sv.paused^1;
@ -2906,18 +2904,6 @@ qboolean SV_TogglePause (client_t *initiator)
sv.pausedstart = Sys_DoubleTime();
// send notification to all clients
for (i=0, cl = svs.clients ; i<MAX_CLIENTS ; i++, cl++)
{
if (!cl->state)
continue;
if (!ISQ2CLIENT(cl) && !cl->controller)
{
ClientReliableWrite_Begin (cl, svc_setpause, 2);
ClientReliableWrite_Byte (cl, sv.paused);
}
}
return true;
}
@ -4299,9 +4285,9 @@ void SVNQ_Begin_f (void)
if (!ISQ2CLIENT(host_client))
{
ClientReliableWrite_Begin (host_client, svc_setpause, 2);
ClientReliableWrite_Byte (host_client, sv.paused);
ClientReliableWrite_Byte (host_client, sv.paused!=0);
}
SV_ClientTPrintf(host_client, PRINT_HIGH, STL_SERVERPAUSED);
SV_ClientTPrintf(host_client, PRINT_HIGH, STL_SERVERPAUSED!=0);
}
if (sendangles)
@ -5778,6 +5764,11 @@ haveannothergo:
SV_PostRunCmd();
}
else
{
if (newcmd.impulse)// && SV_FiltureImpulse(newcmd.impulse, host_client->trustlevel))
sv_player->v->impulse = newcmd.impulse;
}
cl->lastcmd = newcmd;
cl->lastcmd.buttons = 0; // avoid multiple fires on lag

View File

@ -1024,7 +1024,7 @@ void SVHL_Physics_Toss (hledict_t *ent)
if (ent->v.movetype != MOVETYPE_FLY
&& ent->v.movetype != MOVETYPE_FLYMISSILE
&& ent->v.movetype != MOVETYPE_BOUNCEMISSILE
&& ent->v.movetype != MOVETYPE_SWIM)
&& ent->v.movetype != MOVETYPE_H2SWIM)
SVHL_AddGravity (ent, 1.0);
// move angles