Q2 works, models are depth sorted (the same time as particles).

some extra macros added. We have a full set of dp te effect builtins (but not parsing them all yet... so not advertising them either).
Dedicated server does not build. I need to add some functions to svmodel.c
sound should work properly with roq/cin/avi playback.
gl_detail should work like in ezquake. there's also a new gl_detalscale cvar
bss size should be a small ammount smaller.
all the dp te builtins will send something. But fte can't parse all of them yet.


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1145 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2005-07-14 01:57:34 +00:00
parent c69d233c71
commit f1ea7c0c06
32 changed files with 1059 additions and 305 deletions

View File

@ -767,7 +767,7 @@ entity_state_t *CL_FindOldPacketEntity(int num)
// bits2 > 0
#define E5_EXTEND4 (1<<31)
static entity_state_t defaultstate;
entity_state_t defaultstate;
void DP5_ParseDelta(entity_state_t *s)
{
int bits;
@ -787,6 +787,7 @@ void DP5_ParseDelta(entity_state_t *s)
int num;
num = s->number;
*s = defaultstate;
s->trans = 255;
s->number = num;
// s->active = true;
}

View File

@ -191,6 +191,17 @@ char soundlist_name[] =
{ 's'^0xff, 'o'^0xff, 'u'^0xff, 'n'^0xff, 'd'^0xff, 'l'^0xff, 'i'^0xff, 's'^0xff, 't'^0xff,
' '^0xff, '%'^0xff, 'i'^0xff, ' '^0xff, '%'^0xff, 'i'^0xff, 0 };
void CL_MakeActive(char *gamename)
{
cls.state = ca_active;
if (VID_SetWindowCaption)
VID_SetWindowCaption(va("FTE %s: %s", gamename, cls.servername));
SCR_EndLoadingPlaque();
TP_ExecTrigger("f_spawn");
}
/*
==================
CL_Quit_f
@ -198,6 +209,9 @@ CL_Quit_f
*/
void CL_Quit_f (void)
{
TP_ExecTrigger("f_quit");
Cbuf_Execute();
#ifndef CLIENTONLY
if (!isDedicated)
#endif
@ -2751,11 +2765,7 @@ void Host_Frame (float time)
if (cls.state == ca_onserver && cl.validsequence && cl.worldmodel)
{ // first update is the final signon stage
cls.state = ca_active;
if (VID_SetWindowCaption)
VID_SetWindowCaption(va("FTE QuakeWorld: %s", cls.servername));
SCR_EndLoadingPlaque();
CL_MakeActive("QuakeWorld");
}
}

View File

@ -1425,7 +1425,7 @@ void CLQ2_ParseServerData (void)
if (!Media_PlayFilm(str))
Con_TPrintf (TLC_NOQ2CINEMATICSSUPPORT, cl.servercount);
else
cls.state = ca_active;
CL_MakeActive("Quake2");
}
else
{
@ -2614,6 +2614,17 @@ void CL_SetStat (int pnum, int stat, int value)
cl.gametimemark = realtime;
}
if (stat == STAT_WEAPON)
{
if (cl.stats[pnum][stat] != value)
{
if (value == 0)
TP_ExecTrigger ("f_reloadstart");
else if (cl.stats[pnum][stat] == 0)
TP_ExecTrigger ("f_reloadend");
}
}
cl.stats[pnum][stat] = value;
if (pnum == 0)
@ -3436,6 +3447,8 @@ void CL_ParseServerMessage (void)
break;
case svc_intermission:
if (!cl.intermission)
TP_ExecTrigger ("f_mapend");
cl.intermission = 1;
cl.completed_time = realtime;
vid.recalc_refdef = true; // go to full screen
@ -4008,6 +4021,8 @@ void CLNQ_ParseServerMessage (void)
break;
case svc_intermission:
if (!cl.intermission)
TP_ExecTrigger ("f_mapend");
cl.intermission = 1;
cl.completed_time = cl.time;
vid.recalc_refdef = true; // go to full screen

View File

@ -176,6 +176,20 @@ sfx_t *cl_sfx_r_exp3;
cvar_t cl_expsprite = {"cl_expsprite", "0"};
cvar_t cl_truelightning = {"cl_truelightning", "0", NULL, CVAR_SEMICHEAT};
typedef struct {
sfx_t **sfx;
char *efname;
} tentsfx_t;
tentsfx_t tentsfx[] =
{
{&cl_sfx_wizhit, "wizard/hit.wav"},
{&cl_sfx_knighthit, "hknight/hit.wav"},
{&cl_sfx_tink1, "weapons/tink1.wav"},
{&cl_sfx_ric1, "weapons/ric1.wav"},
{&cl_sfx_ric2, "weapons/ric2.wav"},
{&cl_sfx_ric3, "weapons/ric3.wav"},
{&cl_sfx_r_exp3, "weapons/r_exp3.wav"}
};
/*
=================
CL_ParseTEnts
@ -183,13 +197,14 @@ CL_ParseTEnts
*/
void CL_InitTEnts (void)
{
cl_sfx_wizhit = S_PrecacheSound ("wizard/hit.wav");
cl_sfx_knighthit = S_PrecacheSound ("hknight/hit.wav");
cl_sfx_tink1 = S_PrecacheSound ("weapons/tink1.wav");
cl_sfx_ric1 = S_PrecacheSound ("weapons/ric1.wav");
cl_sfx_ric2 = S_PrecacheSound ("weapons/ric2.wav");
cl_sfx_ric3 = S_PrecacheSound ("weapons/ric3.wav");
cl_sfx_r_exp3 = S_PrecacheSound ("weapons/r_exp3.wav");
int i;
for (i = 0; i < sizeof(tentsfx)/sizeof(tentsfx[0]); i++)
{
if (COM_FCheckExists(tentsfx[i].efname))
*tentsfx[i].sfx = S_PrecacheSound (tentsfx[i].efname);
else
*tentsfx[i].sfx = NULL;
}
Cvar_Register (&cl_expsprite, "Temporary entity control");
Cvar_Register (&cl_truelightning, "Temporary entity control");
@ -815,7 +830,7 @@ void CL_ParseTEnt (void)
S_StartSound (-2, 0, cl_sfx_r_exp3, pos, 1, 1);
// sprite
if (cl_expsprite.value) // temp hopefully
if (cl_expsprite.value && !nqprot) // temp hopefully
{
explosion_t *ex = CL_AllocExplosion ();
VectorCopy (pos, ex->origin);
@ -823,6 +838,52 @@ void CL_ParseTEnt (void)
ex->model = Mod_ForName ("progs/s_explod.spr", true);
}
break;
case DPTE_EXPLOSIONRGB:
pos[0] = MSG_ReadCoord ();
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
P_ParticleExplosion (pos);
// light
dl = CL_AllocDlight (0);
VectorCopy (pos, dl->origin);
dl->radius = 350;
dl->die = cl.time + 1;
dl->decay = 700;
dl->color[0] = 0.4f*MSG_ReadByte()/255.0f;
dl->color[1] = 0.4f*MSG_ReadByte()/255.0f;
dl->color[2] = 0.4f*MSG_ReadByte()/255.0f;
dl->channelfade[0] = 0;
dl->channelfade[1] = 0;
dl->channelfade[2] = 0;
S_StartSound (-2, 0, cl_sfx_r_exp3, pos, 1, 1);
break;
case DPTE_TEI_BIGEXPLOSION:
pos[0] = MSG_ReadCoord ();
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
P_ParticleExplosion (pos);
// light
dl = CL_AllocDlight (0);
VectorCopy (pos, dl->origin);
dl->radius = 500;
dl->die = cl.time + 1;
dl->decay = 500;
dl->color[0] = 0.4f;
dl->color[1] = 0.3f;
dl->color[2] = 0.15f;
dl->channelfade[0] = 0;
dl->channelfade[1] = 0;
dl->channelfade[2] = 0;
S_StartSound (-2, 0, cl_sfx_r_exp3, pos, 1, 1);
break;
case TE_TAREXPLOSION: // tarbaby explosion
pos[0] = MSG_ReadCoord ();
@ -981,13 +1042,9 @@ void CL_ParseTEnt (void)
cnt = MSG_ReadShort ();
{
#pragma message("CL_ParseTEnt: effect DPTE_BLOODSHOWER not implemented")
/*
extern int pt_bloodshower;
VectorAdd(pos, pos2, pos);
VectorScale(pos, 0.5, pos);
P_RunParticleEffectType(pos, NULL, cnt, pt_bloodshower);
*/
P_RunParticleEffectTypeString(pos, NULL, cnt, "te_bloodshower");
}
break;
@ -1121,6 +1178,13 @@ void CL_ParseTEnt (void)
}
break;
case DPTE_PARTICLECUBE:
#pragma message("CL_ParseTEnt: effect DPTE_PARTICLECUBE not implemented")
case DPTE_PARTICLERAIN:
#pragma message("CL_ParseTEnt: effect DPTE_PARTICLERAIN not implemented")
case DPTE_PARTICLESNOW:
#pragma message("CL_ParseTEnt: effect DPTE_PARTICLESNOW not implemented")
default:
Host_EndGame ("CL_ParseTEnt: bad type - %i", type);
}

View File

@ -93,6 +93,8 @@ void CIN_FinishCinematic (void)
{
CL_SendClientCommand(true, "nextserver %i", cl.servercount);
}
S_RawAudio(0, NULL, 0, 0, 0, 0);
}
//==========================================================================

View File

@ -1230,10 +1230,8 @@ void CLQ2_ParseFrame (void)
// getting a valid frame message ends the connection process
if (cls.state != ca_active)
{
if (VID_SetWindowCaption)
VID_SetWindowCaption(va("FTE QuakeWorld: %s (Q2)", cls.servername));
CL_MakeActive("Quake2");
cls.state = ca_active;
// cl.force_refdef = true;
cl.predicted_origin[0] = cl.q2frame.playerstate.pmove.origin[0]*0.125;
cl.predicted_origin[1] = cl.q2frame.playerstate.pmove.origin[1]*0.125;
@ -1938,6 +1936,8 @@ void CLQ2_CalcViewValues (void)
q2frame_t *oldframe;
q2player_state_t *ps, *ops;
r_refdef.useperspective = true;
r_refdef.currentplayernum = 0;
// find the previous frame to interpolate from

View File

@ -1160,7 +1160,25 @@ qboolean Media_ShowFilm(void)
if (roqfilm->audio_channels && sndcardinfo && roqfilm->aud_pos < roqfilm->vid_pos)
if (roq_read_audio(roqfilm)>0)
S_RawAudio(-1, roqfilm->audio, 22050, roqfilm->audio_size/roqfilm->audio_channels/2, roqfilm->audio_channels, 2);
{
/* FILE *f;
char wav[] = "\x52\x49\x46\x46\xea\x5f\x04\x00\x57\x41\x56\x45\x66\x6d\x74\x20\x12\x00\x00\x00\x01\x00\x02\x00\x22\x56\x00\x00\x88\x58\x01\x00\x04\x00\x10\x00\x00\x00\x66\x61\x63\x74\x04\x00\x00\x00\xee\x17\x01\x00\x64\x61\x74\x61\xb8\x5f\x04\x00";
int size;
f = fopen("d:/quake/id1/sound/raw.wav", "r+b");
if (!f)
f = fopen("d:/quake/id1/sound/raw.wav", "w+b");
fseek(f, 0, SEEK_SET);
fwrite(&wav, sizeof(wav), 1, f);
fseek(f, 0, SEEK_END);
fwrite(roqfilm->audio, roqfilm->audio_size, 2, f);
size = ftell(f) - sizeof(wav);
fseek(f, 54, SEEK_SET);
fwrite(&size, sizeof(size), 1, f);
fclose(f);
*/
S_RawAudio(-1, roqfilm->audio, 22050, roqfilm->audio_size/roqfilm->audio_channels/2, roqfilm->audio_channels, 2);
}
return true;
}

View File

@ -8,8 +8,19 @@
static progfuncs_t *csqcprogs;
typedef struct csqctreadstate_s {
float resumetime;
struct qcthread_s *thread;
int self;
int other;
struct csqctreadstate_s *next;
} csqctreadstate_t;
static unsigned int csqcchecksum;
static qboolean csqcwantskeys;
static csqctreadstate_t *csqcthreads;
qboolean csqc_resortfrags;
cvar_t pr_csmaxedicts = {"pr_csmaxedicts", "3072"};
cvar_t cl_csqcdebug = {"cl_csqcdebug", "0"}; //prints entity numbers which arrive (so I can tell people not to apply it to players...)
@ -30,6 +41,7 @@ cvar_t cl_csqcdebug = {"cl_csqcdebug", "0"}; //prints entity numbers which arriv
/*These are pointers to the csqc's globals.*/ \
globalfloat(time, "time"); /*float Written before entering most qc functions*/ \
globalentity(self, "self"); /*entity Written before entering most qc functions*/ \
globalentity(other, "other"); /*entity Written before entering most qc functions*/ \
\
globalfloat(maxclients, "maxclients"); /*float */ \
\
@ -135,6 +147,7 @@ static void CSQC_FindGlobals(void)
fieldfloat(skin); \
fieldfloat(colormap); \
fieldfloat(frame); \
fieldfloat(flags); \
fieldfloat(oldframe); \
fieldfloat(lerpfrac); \
fieldfloat(renderflags);\
@ -149,6 +162,7 @@ static void CSQC_FindGlobals(void)
fieldfloat(pitch_speed);\
\
fieldentity(chain); \
fieldentity(groundentity); \
\
fieldvector(solid); \
fieldvector(mins); \
@ -266,8 +280,15 @@ void PF_coredump (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_traceon (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_traceoff (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_eprint (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_bitshift(progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_registercvar (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_Abort(progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_externcall (progfuncs_t *prinst, globalvars_t *pr_globals);
void PF_externrefcall (progfuncs_t *prinst, globalvars_t *pr_globals);
void PF_externvalue (progfuncs_t *prinst, globalvars_t *pr_globals);
void PF_externset (progfuncs_t *prinst, globalvars_t *pr_globals);
void PF_instr (progfuncs_t *prinst, globalvars_t *pr_globals);
void PF_strstrofs (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_str2chr (progfuncs_t *prinst, struct globalvars_s *pr_globals);
@ -678,136 +699,114 @@ static void PF_R_ClearScene (progfuncs_t *prinst, struct globalvars_s *pr_global
*/
}
typedef enum
{
VF_MIN = 1,
VF_MIN_X = 2,
VF_MIN_Y = 3,
VF_SIZE = 4,
VF_SIZE_Y = 5,
VF_SIZE_X = 6,
VF_VIEWPORT = 7,
VF_FOV = 8,
VF_FOVX = 9,
VF_FOVY = 10,
VF_ORIGIN = 11,
VF_ORIGIN_X = 12,
VF_ORIGIN_Y = 13,
VF_ORIGIN_Z = 14,
VF_ANGLES = 15,
VF_ANGLES_X = 16,
VF_ANGLES_Y = 17,
VF_ANGLES_Z = 18,
VF_PERSPECTIVE = 200
} viewflags;
static void PF_R_SetViewFlag(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
char *s = PR_GetStringOfs(prinst, OFS_PARM0);
viewflags parametertype = G_FLOAT(OFS_PARM0);
float *p = G_VECTOR(OFS_PARM1);
G_FLOAT(OFS_RETURN) = 1;
switch(*s)
switch(parametertype)
{
case 'F':
if (!strcmp(s, "FOV")) //set both fov numbers
{
r_refdef.fov_x = p[0];
r_refdef.fov_y = p[1];
return;
}
if (!strcmp(s, "FOV_X"))
{
r_refdef.fov_x = *p;
return;
}
if (!strcmp(s, "FOV_Y"))
{
r_refdef.fov_y = *p;
return;
}
case VF_FOV:
r_refdef.fov_x = p[0];
r_refdef.fov_y = p[1];
break;
case 'O':
if (!strcmp(s, "ORIGIN"))
{
VectorCopy(p, r_refdef.vieworg);
return;
}
if (!strcmp(s, "ORIGIN_X"))
{
r_refdef.vieworg[0] = *p;
return;
}
if (!strcmp(s, "ORIGIN_Y"))
{
r_refdef.vieworg[1] = *p;
return;
}
if (!strcmp(s, "ORIGIN_Z"))
{
r_refdef.vieworg[2] = *p;
return;
}
case VF_FOVX:
r_refdef.fov_x = *p;
break;
case 'A':
if (!strcmp(s, "ANGLES"))
{
VectorCopy(p, r_refdef.viewangles);
return;
}
if (!strcmp(s, "ANGLES_X"))
{
r_refdef.viewangles[0] = *p;
return;
}
if (!strcmp(s, "ANGLES_Y"))
{
r_refdef.viewangles[1] = *p;
return;
}
if (!strcmp(s, "ANGLES_Z"))
{
r_refdef.viewangles[2] = *p;
return;
}
case VF_FOVY:
r_refdef.fov_y = *p;
break;
case VF_ORIGIN:
VectorCopy(p, r_refdef.vieworg);
break;
case VF_ORIGIN_X:
case VF_ORIGIN_Y:
case VF_ORIGIN_Z:
r_refdef.vieworg[parametertype-VF_ORIGIN_X] = *p;
break;
case VF_ANGLES:
VectorCopy(p, r_refdef.viewangles);
break;
case VF_ANGLES_X:
case VF_ANGLES_Y:
case VF_ANGLES_Z:
r_refdef.viewangles[parametertype-VF_ANGLES_X] = *p;
break;
case 'W':
if (!strcmp(s, "WIDTH"))
{
r_refdef.vrect.width = *p;
return;
}
case VF_VIEWPORT:
r_refdef.vrect.x = p[0];
r_refdef.vrect.y = p[1];
p+=3;
r_refdef.vrect.width = p[0];
r_refdef.vrect.height = p[1];
break;
case 'H':
if (!strcmp(s, "HEIGHT"))
{
r_refdef.vrect.height = *p;
return;
}
case VF_SIZE_X:
r_refdef.vrect.width = *p;
break;
case 'S':
if (!strcmp(s, "SIZE"))
{
r_refdef.vrect.width = p[0];
r_refdef.vrect.height = p[1];
return;
}
case VF_SIZE_Y:
r_refdef.vrect.height = *p;
break;
case 'M':
if (!strcmp(s, "MIN_X"))
{
r_refdef.vrect.x = *p;
return;
}
if (!strcmp(s, "MIN_Y"))
{
r_refdef.vrect.y = *p;
return;
}
if (!strcmp(s, "MIN"))
{
r_refdef.vrect.x = p[0];
r_refdef.vrect.y = p[1];
return;
}
case VF_SIZE:
r_refdef.vrect.width = p[0];
r_refdef.vrect.height = p[1];
break;
case VF_MIN_X:
r_refdef.vrect.x = *p;
break;
case VF_MIN_Y:
r_refdef.vrect.y = *p;
break;
case VF_MIN:
r_refdef.vrect.x = p[0];
r_refdef.vrect.y = p[1];
break;
case VF_PERSPECTIVE:
r_refdef.useperspective = *p;
break;
default:
Con_DPrintf("SetViewFlag: %i not recognised\n", parametertype);
G_FLOAT(OFS_RETURN) = 0;
break;
}
Con_DPrintf("SetViewFlag: %s not recognised\n", s);
G_FLOAT(OFS_RETURN) = 0;
}
static void PF_R_RenderScene(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
if (cl.worldmodel)
R_PushDlights ();
/*
if (cl_csqcdebug.value)
Con_Printf("%f %f %f\n", r_refdef.vieworg[0],
r_refdef.vieworg[1],
r_refdef.vieworg[2]);
*/
#ifdef RGLQUAKE
if (qrenderer == QR_OPENGL)
@ -1089,6 +1088,8 @@ static void PF_cs_PrecacheModel(progfuncs_t *prinst, struct globalvars_s *pr_glo
cl.model_csqcprecache[-freei] = Mod_ForName(cl.model_csqcname[-freei], false);
}
G_FLOAT(OFS_RETURN) = modelindex;
}
static void PF_cs_PrecacheSound(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
@ -1354,7 +1355,11 @@ static void PF_cs_getplayerkey (progfuncs_t *prinst, struct globalvars_s *pr_glo
char *keyname = PR_GetStringOfs(prinst, OFS_PARM1);
if (pnum < 0)
{
Sbar_SortFrags(false);
if (csqc_resortfrags)
{
Sbar_SortFrags(false);
csqc_resortfrags = false;
}
if (pnum >= -scoreboardlines)
{//sort by
pnum = fragsort[-(pnum+1)];
@ -1454,6 +1459,56 @@ static void PF_cs_particle(progfuncs_t *prinst, struct globalvars_s *pr_globals)
P_RunParticleEffect(org, dir, colour, count);
}
static void PF_cs_particle2(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *org, *dmin, *dmax;
float colour;
float count;
float effect;
org = G_VECTOR(OFS_PARM0);
dmin = G_VECTOR(OFS_PARM1);
dmax = G_VECTOR(OFS_PARM2);
colour = G_FLOAT(OFS_PARM3);
effect = G_FLOAT(OFS_PARM4);
count = G_FLOAT(OFS_PARM5);
P_RunParticleEffect2 (org, dmin, dmax, colour, effect, count);
}
static void PF_cs_particle3(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *org, *box;
float colour;
float count;
float effect;
org = G_VECTOR(OFS_PARM0);
box = G_VECTOR(OFS_PARM1);
colour = G_FLOAT(OFS_PARM2);
effect = G_FLOAT(OFS_PARM3);
count = G_FLOAT(OFS_PARM4);
P_RunParticleEffect3(org, box, colour, effect, count);
}
static void PF_cs_particle4(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *org;
float radius;
float colour;
float count;
float effect;
org = G_VECTOR(OFS_PARM0);
radius = G_FLOAT(OFS_PARM1);
colour = G_FLOAT(OFS_PARM2);
effect = G_FLOAT(OFS_PARM3);
count = G_FLOAT(OFS_PARM4);
P_RunParticleEffect4(org, radius, colour, effect, count);
}
void CL_SpawnSpriteEffect(vec3_t org, model_t *model, int startframe, int framecount, int framerate);
void PF_cl_effect(progfuncs_t *prinst, struct globalvars_s *pr_globals)
@ -1614,11 +1669,36 @@ static void PF_cs_findradius (progfuncs_t *prinst, struct globalvars_s *pr_globa
RETURN_EDICT(prinst, (void*)chain);
}
void PF_WasFreed (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
edict_t *ent;
ent = (edict_t*)G_EDICT(prinst, OFS_PARM0);
G_FLOAT(OFS_RETURN) = ent->isfree;
}
static void PF_cl_te_gunshot (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *pos = G_VECTOR(OFS_PARM0);
if (P_RunParticleEffectType(pos, NULL, 1, pt_gunshot))
P_RunParticleEffect (pos, vec3_origin, 0, 20);
float scaler = 1;
if (*prinst->callargc >= 2) //fte is a quakeworld engine
scaler = G_FLOAT(OFS_PARM1);
if (P_RunParticleEffectType(pos, NULL, scaler, pt_gunshot))
P_RunParticleEffect (pos, vec3_origin, 0, 20*scaler);
}
static void PF_cl_te_blood (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *pos = G_VECTOR(OFS_PARM0);
float scaler = 1;
if (*prinst->callargc >= 2) //fte is a quakeworld engine
scaler = G_FLOAT(OFS_PARM1);
if (P_RunParticleEffectType(pos, NULL, scaler, pt_blood))
P_RunParticleEffect (pos, vec3_origin, 73, 20*scaler);
}
static void PF_cl_te_lightningblood (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *pos = G_VECTOR(OFS_PARM0);
if (P_RunParticleEffectType(pos, NULL, 1, pt_lightningblood))
P_RunParticleEffect (pos, vec3_origin, 225, 50);
}
static void PF_cl_te_spike (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
@ -1701,17 +1781,115 @@ static void PF_cl_te_explosionquad (progfuncs_t *prinst, struct globalvars_s *pr
}
}
//void(vector org, float radius, float lifetime, vector color) te_customflash
static void PF_cl_te_customflash (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *org = G_VECTOR(OFS_PARM0);
float radius = G_FLOAT(OFS_PARM1);
float lifetime = G_FLOAT(OFS_PARM2);
float *colour = G_VECTOR(OFS_PARM3);
dlight_t *dl;
// light
dl = CL_AllocDlight (0);
VectorCopy (org, dl->origin);
dl->radius = radius;
dl->die = cl.time + lifetime;
dl->decay = dl->radius / lifetime;
dl->color[0] = colour[0]*0.5f;
dl->color[1] = colour[1]*0.5f;
dl->color[2] = colour[2]*0.5f;
}
void CSQC_RunThreads(void)
{
csqctreadstate_t *state = csqcthreads, *next;
float ctime = Sys_DoubleTime();
csqcthreads = NULL;
while(state)
{
next = state->next;
if (state->resumetime > ctime)
{ //not time yet, reform origional list.
state->next = csqcthreads;
csqcthreads = state;
}
else
{ //call it and forget it ever happened. The Sleep biltin will recreate if needed.
*csqcg.self = EDICT_TO_PROG(csqcprogs, EDICT_NUM(csqcprogs, state->self));
*csqcg.other = EDICT_TO_PROG(csqcprogs, EDICT_NUM(csqcprogs, state->other));
csqcprogs->RunThread(csqcprogs, state->thread);
csqcprogs->parms->memfree(state->thread);
csqcprogs->parms->memfree(state);
}
state = next;
}
}
static void PF_cs_addprogs (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
char *s = PR_GetStringOfs(prinst, OFS_PARM0);
if (!s || !*s)
G_FLOAT(OFS_RETURN) = -1;
else
G_FLOAT(OFS_RETURN) = PR_LoadProgs(prinst, s, 0, NULL, 0);
}
static void PF_cs_OpenPortal (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
if (sv.worldmodel->fromgame == fg_quake2)
CMQ2_SetAreaPortalState(G_FLOAT(OFS_PARM0), G_FLOAT(OFS_PARM1));
}
void PF_cs_droptofloor (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
csqcedict_t *ent;
vec3_t end;
vec3_t start;
trace_t trace;
ent = (csqcedict_t*)PROG_TO_EDICT(prinst, *csqcg.self);
VectorCopy (ent->v->origin, end);
end[2] -= 512;
VectorCopy (ent->v->origin, start);
trace = CL_Move (start, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent);
if (trace.fraction == 1 || trace.allsolid)
G_FLOAT(OFS_RETURN) = 0;
else
{
VectorCopy (trace.endpos, ent->v->origin);
SV_LinkEdict (ent, false);
ent->v->flags = (int)ent->v->flags | FL_ONGROUND;
ent->v->groundentity = EDICT_TO_PROG(prinst, trace.ent);
G_FLOAT(OFS_RETURN) = 1;
}
}
static void PF_cs_copyentity (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
csqcedict_t *in, *out;
in = (csqcedict_t*)G_EDICT(prinst, OFS_PARM0);
out = (csqcedict_t*)G_EDICT(prinst, OFS_PARM1);
memcpy(out->v, in->v, csqcentsize);
}
//these are the builtins that still need to be added.
#define PF_cs_droptofloor PF_Fixme
#define PF_cs_tracetoss PF_Fixme
#define PF_cs_makestatic PF_Fixme
#define PF_cs_copyentity PF_Fixme
#define PF_cl_te_blood PF_Fixme
#define PF_cl_te_bloodshower PF_Fixme
#define PF_cl_te_particlecube PF_Fixme
#define PF_cl_te_spark PF_Fixme
#define PF_cl_te_smallflash PF_Fixme
#define PF_cl_te_customflash PF_Fixme
#define PF_cl_te_explosion2 PF_Fixme
#define PF_cl_te_lightning1 PF_Fixme
#define PF_cl_te_lightning2 PF_Fixme
@ -1727,11 +1905,28 @@ static void PF_cl_te_explosionquad (progfuncs_t *prinst, struct globalvars_s *pr
#define PF_cs_break PF_Fixme
#define PF_cs_walkmove PF_Fixme
#define PF_cs_checkbottom PF_Fixme
#define PF_cl_playingdemo PF_Fixme
#define PF_cl_runningserver PF_Fixme
#define PF_cl_getlight PF_Fixme
#define PF_findfloat PF_Fixme
#define PF_cl_getlight PF_Fixme
static void PF_cl_playingdemo (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
G_FLOAT(OFS_RETURN) = !!cls.demoplayback;
}
static void PF_cl_runningserver (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
G_FLOAT(OFS_RETURN) = !!sv.active;
}
static void PF_cl_getlight (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
vec3_t ambient, diffuse, dir;
cl.worldmodel->funcs.LightPointValues(G_VECTOR(OFS_PARM0), ambient, diffuse, dir);
VectorMA(ambient, 0.5, diffuse, G_VECTOR(OFS_RETURN));
}
static void PF_Stub (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
Con_Printf("Obsolete csqc builtin (%i) executed\n", prinst->lastcalledbuiltinnumber);
}
#define PF_FixTen PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme
@ -1834,6 +2029,7 @@ PF_cs_PrecacheSound, // #76 void(string str) precache_sound2 (QUAKE)
PF_NoCSQC, // #77 void(string str) precache_file2 (QUAKE)
PF_NoCSQC, // #78 void() setspawnparms (QUAKE) (don't support)
PF_NoCSQC, // #79 void(entity killer, entity killee) logfrag (QW_ENGINE) (don't support)
//80
PF_NoCSQC, // #80 string(entity e, string keyname) infokey (QW_ENGINE) (don't support)
PF_stof, // #81 float(string s) stof (FRIK_FILE or QW_ENGINE)
@ -1846,6 +2042,7 @@ PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//90
PF_cs_tracebox,
PF_randomvector, // #91 vector() randomvec (DP_QC_RANDOMVEC)
@ -1856,8 +2053,9 @@ PF_min, // #94 float(float a, floats) min (DP_QC_MINMAXBOUND)
PF_max, // #95 float(float a, floats) max (DP_QC_MINMAXBOUND)
PF_bound, // #96 float(float minimum, float val, float maximum) bound (DP_QC_MINMAXBOUND)
PF_pow, // #97 float(float value) pow (DP_QC_SINCOSSQRTPOW)
PF_findfloat, // #98 entity(entity start, .float fld, float match) findfloat (DP_QC_FINDFLOAT)
PF_FindFloat, // #98 entity(entity start, .float fld, float match) findfloat (DP_QC_FINDFLOAT)
PF_checkextension, // #99 float(string extname) checkextension (EXT_CSQC)
//100
PF_Fixme,
PF_Fixme,
@ -1870,6 +2068,7 @@ PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//110
PF_fopen, // #110 float(string strname, float accessmode) fopen (FRIK_FILE)
PF_fclose, // #111 void(float fnum) fclose (FRIK_FILE)
@ -1883,7 +2082,6 @@ PF_stov, // #117 vector(string str) stov (FRIK_FILE)
PF_dupstring, // #118 string(string str) dupstring (FRIK_FILE)
PF_forgetstring, // #119 void(string str) freestring (FRIK_FILE)
//120
PF_Fixme,
PF_Fixme,
@ -1905,7 +2103,7 @@ PF_R_SetViewFlag, // #???
PF_R_RenderScene, // #???
PF_R_AddDynamicLight, // #???
PF_Fixme,
PF_Stub,
PF_Fixme,
PF_Fixme,
PF_CL_drawline, // #???
@ -1937,7 +2135,7 @@ PF_cs_particlesloaded, // #??? float(string effectname) particleeffectnum (EXT_
//160
PF_cs_getinputstate, // #??? float(float framenum) getinputstate (EXT_CSQC)
PF_cs_runplayerphysics, // #???
PF_cs_runplayerphysics, // #??? void() runstandardplayerphysics (EXT_CSQC)
PF_cs_getplayerkey, // #??? string(float playernum, string keyname) getplayerkeyvalue (EXT_CSQC)
PF_cs_setwantskeys, // #??? void(float wants) setwantskeys (EXT_CSQC)
PF_cs_getmousepos, // #??? vector() getmousepos (EXT_CSQC)
@ -1959,7 +2157,7 @@ PF_ReadCoord, // #??? float() readcoord (EXT_CSQC)
PF_ReadAngle, // #??? float() readangle (EXT_CSQC)
PF_ReadString, // #??? string() readstring (EXT_CSQC)
PF_ReadFloat, // #??? string() readfloat (EXT_CSQC)
PF_Fixme,
PF_WasFreed, // #??? float(entity) wasfreed (EXT_CSQC) (should be availabe on server too)
PF_Fixme,
//180
@ -1969,13 +2167,35 @@ PF_FixTen,
PF_FixTen,
//200
PF_FixTen,
PF_cs_PrecacheModel,
PF_externcall,
PF_cs_addprogs,
PF_externvalue,
PF_externset,
PF_externrefcall,
PF_instr,
PF_cs_OpenPortal, //q2bsps
PF_NoCSQC,//{"RegisterTempEnt", PF_RegisterTEnt, 0, 0, 0, 208},
PF_NoCSQC,//{"CustomTempEnt", PF_CustomTEnt, 0, 0, 0, 209},
//210
PF_FixTen,
PF_Fixme,//{"fork", PF_Fork, 0, 0, 0, 210},
PF_Abort, //#211 void() abort (FTE_MULTITHREADED)
PF_Fixme,//{"sleep", PF_Sleep, 0, 0, 0, 212},
PF_NoCSQC,//{"forceinfokey", PF_ForceInfoKey, 0, 0, 0, 213},
PF_NoCSQC,//{"chat", PF_chat, 0, 0, 0, 214},// #214 void(string filename, float starttag, entity edict) SV_Chat (FTE_NPCCHAT)
PF_cs_particle2, //215 (FTE_PEXT_HEXEN2)
PF_cs_particle3, //216 (FTE_PEXT_HEXEN2)
PF_cs_particle4, //217 (FTE_PEXT_HEXEN2)
//EXT_DIMENSION_PLANES
PF_bitshift, //#218 bitshift (EXT_DIMENSION_PLANES)
//I guess this should go under DP_TE_STANDARDEFFECTBUILTINS...
PF_cl_te_lightningblood,// #219 te_lightningblood
//220
PF_Fixme, // #220
PF_Fixme, //{"map_builtin", PF_builtinsupported,0, 0, 0, 220}, //like #100 - takes 2 args. arg0 is builtinname, 1 is number to map to.
PF_strstrofs, // #221 float(string s1, string sub) strstrofs (FTE_STRINGS)
PF_str2chr, // #222 float(string str, float index) str2chr (FTE_STRINGS)
PF_chr2str, // #223 string(float chr, ...) chr2str (FTE_STRINGS)
@ -2155,11 +2375,27 @@ void VARGS CSQC_Abort (char *format, ...) //an error occured.
Host_EndGame("csqc error");
}
void CSQC_ForgetThreads(void)
{
csqctreadstate_t *state = csqcthreads, *next;
csqcthreads = NULL;
while(state)
{
next = state->next;
csqcprogs->parms->memfree(state->thread);
csqcprogs->parms->memfree(state);
state = next;
}
}
void CSQC_Shutdown(void)
{
search_close_progs(csqcprogs, false);
if (csqcprogs)
{
CSQC_ForgetThreads();
CloseProgs(csqcprogs);
Con_Printf("Closed csqc\n");
}
@ -2294,6 +2530,8 @@ qboolean CSQC_DrawView(void)
if (cl.worldmodel)
R_LessenStains();
csqc_resortfrags = true;
if (csqcg.clientcommandframe)
*csqcg.clientcommandframe = cls.netchan.outgoing_sequence;
if (csqcg.servercommandframe)
@ -2302,6 +2540,8 @@ qboolean CSQC_DrawView(void)
if (csqcg.time)
*csqcg.time = Sys_DoubleTime();
CSQC_RunThreads(); //wake up any qc threads
PR_ExecuteProgram(csqcprogs, csqcg.draw_function);
return true;
@ -2338,7 +2578,7 @@ qboolean CSQC_ConsoleCommand(char *cmd)
(((string_t *)pr_globals)[OFS_PARM0] = PR_SetString(csqcprogs, str));
PR_ExecuteProgram (csqcprogs, csqcg.console_command);
return true;
return G_FLOAT(OFS_RETURN);
}
qboolean CSQC_StuffCmd(char *cmd)

View File

@ -461,6 +461,25 @@ void PF_CL_drawresetcliparea (progfuncs_t *prinst, struct globalvars_s *pr_globa
//void (float width, vector rgb, float alpha, float flags, vector pos1, ...) drawline;
void PF_CL_drawline (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float width = G_FLOAT(OFS_PARM0);
float *rgb = G_VECTOR(OFS_PARM1);
float alpha = G_FLOAT(OFS_PARM2);
float flags = G_FLOAT(OFS_PARM3);
float *pos = G_VECTOR(OFS_PARM4);
int numpoints = *prinst->callargc-4;
if (qrenderer == QR_OPENGL)
{
qglColor4f(rgb[0], rgb[1], rgb[2], alpha);
qglBegin(GL_LINES);
while (numpoints-->0)
{
qglVertex3fv(pos);
pos += 3;
}
qglEnd();
}
}
//vector drawgetimagesize(string pic) = #460;
@ -1291,10 +1310,12 @@ void VARGS Menu_Abort (char *format, ...)
{
static char buffer[1024*1024*8];
int size = sizeof buffer;
char *buffer;
int size = 1024*1024*8;
buffer = Z_Malloc(size);
menuprogs->save_ents(menuprogs, buffer, &size, 3);
COM_WriteFile("menucore.txt", buffer, size);
Z_Free(buffer);
}
MP_Shutdown();

View File

@ -3926,6 +3926,16 @@ void DrawParticleTypes (void texturedparticles(particle_t *,part_type_t*), void
particletime += pframetime;
}
void P_FlushRenderer(void)
{
qglDepthMask(0); //primarily to stop close particles from obscuring each other
qglDisable(GL_ALPHA_TEST);
qglEnable (GL_BLEND);
GL_TexEnv(GL_MODULATE);
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
lasttype = NULL;
}
/*
===============
R_DrawParticles
@ -3940,12 +3950,8 @@ void P_DrawParticles (void)
if (qrenderer == QR_OPENGL)
{
extern cvar_t r_drawflat;
qglDepthMask(0);
qglDisable(GL_ALPHA_TEST);
qglEnable (GL_BLEND);
GL_TexEnv(GL_MODULATE);
qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
P_FlushRenderer();
if (qglPolygonOffset)
qglPolygonOffset(-1, 0);
@ -3976,6 +3982,7 @@ void P_DrawParticles (void)
#ifdef SWQUAKE
if (qrenderer == QR_SOFTWARE)
{
lasttype = NULL;
DrawParticleTypes(SWD_DrawParticleBlob, SWD_DrawParticleSpark, SWD_DrawParticleSpark, SWD_DrawParticleSpark, SWD_DrawParticleBeam, SWD_DrawParticleBeam, NULL);
RSpeedRemark();

View File

@ -133,6 +133,8 @@ typedef struct
int currentplayernum;
float time;
qboolean useperspective;
} refdef_t;

View File

@ -121,6 +121,7 @@ extern cvar_t gl_maxdist;
cvar_t gl_specular = {"gl_specular", "0"};
#endif
cvar_t gl_detail = {"gl_detail", "0", NULL, CVAR_ARCHIVE};
cvar_t gl_detailscale = {"gl_detailscale", "5"};
cvar_t gl_overbright = {"gl_overbright", "0", NULL, CVAR_ARCHIVE};
cvar_t r_shadows = {"r_shadows", "0", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH};
cvar_t r_shadow_realtime_world = {"r_shadow_realtime_world", "0", NULL, CVAR_CHEAT};
@ -302,6 +303,7 @@ void GLRenderer_Init(void)
Cvar_Register (&gl_compress, GLRENDEREROPTIONS);
Cvar_Register (&gl_driver, GLRENDEREROPTIONS);
Cvar_Register (&gl_detail, GRAPHICALNICETIES);
Cvar_Register (&gl_detailscale, GRAPHICALNICETIES);
Cvar_Register (&gl_overbright, GRAPHICALNICETIES);
Cvar_Register (&gl_dither, GRAPHICALNICETIES);
Cvar_Register (&r_fb_models, GRAPHICALNICETIES);

View File

@ -62,6 +62,7 @@ void RQ_RenderDistAndClear(void)
int i;
renderque_t *rq;
for (i = rqmaxgrad; i>=rqmingrad; i--)
// for (i = rqmingrad; i<=rqmaxgrad; i++)
{
for (rq = distrque[i]; rq; rq=rq->next)
{

View File

@ -587,7 +587,7 @@ int i, snd_left, snd_right;
snd_left = chunk_arg;
for(i = 0; i < chunk_size; i++)
{
snd_left += ri->snd_sqr_arr[fgetc(fp)];
snd_left += ri->snd_sqr_arr[(unsigned)fgetc(fp)];
ri->audio[i * 2] = snd_left & 0xff;
ri->audio[i * 2 + 1] = (snd_left & 0xff00) >> 8;
}
@ -602,8 +602,8 @@ int i, snd_left, snd_right;
snd_right = (chunk_arg & 0xFF) << 8;
for(i = 0; i < chunk_size; i += 2)
{
snd_left += ri->snd_sqr_arr[fgetc(fp)];
snd_right += ri->snd_sqr_arr[fgetc(fp)];
snd_left += ri->snd_sqr_arr[(unsigned)fgetc(fp)];
snd_right += ri->snd_sqr_arr[(unsigned)fgetc(fp)];
ri->audio[i * 2] = snd_left & 0xff;
ri->audio[i * 2 + 1] = (snd_left & 0xff00) >> 8;
ri->audio[i * 2 + 2] = snd_right & 0xff;

View File

@ -201,6 +201,7 @@ S_Startup
================
*/
void S_ClearRaw(void);
void S_Startup (void)
{
int cardnum, drivernum;
@ -308,6 +309,8 @@ void S_Startup (void)
}
sound_started = 1;
S_ClearRaw();
}
void SNDDMA_SetUnderWater(qboolean underwater)
@ -1537,17 +1540,22 @@ qboolean S_IsPlayingSomewhere(sfx_t *s)
}*/
#undef free
void S_ClearRaw(void)
{
memset(s_streamers, 0, sizeof(s_streamers));
}
//streaming audio. //this is useful when there is one source, and the sound is to be played with no attenuation
void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels, int width)
{
soundcardinfo_t *si;
int i;
int prepadl;
int oldlength;
int spare;
float speedfactor;
sfxcache_t *newcache;
streaming_t *s, *free=NULL;
samples/=channels;
for (s = s_streamers, i = 0; i < MAX_RAW_SOURCES; i++, s++)
{
if (!s->inuse)
@ -1558,6 +1566,24 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
if (s->id == sourceid)
break;
}
if (!data)
{
if (i == MAX_RAW_SOURCES)
return; //wierd, it wasn't even playing.
s->sfxcache->loopstart = -1; //stop mixing it
s->inuse = false;
for (si = sndcardinfo; si; si=si->next)
for (i = 0; i < MAX_CHANNELS; i++)
if (si->channel[i].sfx == &s->sfx)
{
si->channel[i].sfx = NULL;
break;
}
BZ_Free(s->sfxcache);
return;
}
samples/=channels;
if (i == MAX_RAW_SOURCES) //whoops.
{
if (!free)
@ -1577,6 +1603,7 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
free->sfxcache->width = width;
free->sfxcache->loopstart = -1;
free->sfxcache->length = 0;
// Con_Printf("Added new raw stream\n");
}
if (s->sfxcache->width != width || s->sfxcache->stereo != channels-1 || s->sfxcache->speed != snd_speed)
{
@ -1584,32 +1611,46 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
s->sfxcache->stereo = channels-1;
s->sfxcache->speed = snd_speed;
s->sfxcache->length = 0;
// Con_Printf("Restarting raw stream\n");
}
prepadl = -0x7fffffff;
oldlength = s->sfxcache->length;
prepadl = 0x7fffffff;
for (si = sndcardinfo; si; si=si->next) //make sure all cards are playing, and that we still get a prepad if just one is.
{
for (i = 0; i < MAX_CHANNELS; i++)
if (si->channel[i].sfx == &s->sfx)
{
if (prepadl < si->channel[i].pos)
if (prepadl > si->channel[i].pos)
prepadl = si->channel[i].pos;
break;
}
}
if (prepadl == -0x7fffffff)
if (prepadl == 0x7fffffff)
{
if (snd_show.value)
Con_Printf("Wasn't playing\n");
prepadl = 0;
spare = s->sfxcache->length;
if (spare > snd_speed)
{
Con_Printf("Sacrificed raw sound stream\n");
spare = 0; //too far out. sacrifice it all
}
}
else
{
spare = s->sfxcache->length - prepadl;
if (spare < 0)
if (spare < 0) //remaining samples since last time
spare = 0;
if (s->sfxcache->length > snd_speed) //more than a second already buffered
{
Con_Printf("Sacrificed raw sound stream\n");
spare = 0; //too far out. sacrifice it all
}
}
/* else if (spare > snd_speed)
@ -1732,6 +1773,8 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
Sys_Error("Width isn't 2\n");
}
s->sfxcache->loopstart = s->sfxcache->length;
for (si = sndcardinfo; si; si=si->next)
{
@ -1739,10 +1782,22 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
if (si->channel[i].sfx == &s->sfx)
{
si->channel[i].pos -= prepadl;
si->channel[i].end += samples - prepadl;
// si->channel[i].end -= prepadl;
si->channel[i].end += samples;
if (si->channel[i].end < si->paintedtime)
{
si->channel[i].pos = 0;
si->channel[i].end = si->paintedtime + s->sfxcache->length;
}
break;
}
if (i == MAX_CHANNELS) //this one wasn't playing.
S_StartSoundCard(si, -1, 0, &s->sfx, r_origin, 1, 32767, 0);
{
S_StartSoundCard(si, -1, 0, &s->sfx, r_origin, 1, 32767, 500);
// Con_Printf("Restarted\n");
}
}
// Con_Printf("Stripped %i, added %i (length %i)\n", prepadl, samples, s->sfxcache->length);
}

View File

@ -533,6 +533,11 @@ void S_PaintChannels(soundcardinfo_t *sc, int endtime)
{
if (scache->loopstart >= 0)
{
if (scache->length == scache->loopstart)
{
// Con_Printf("Looped to end %i\n", ch->pos);
break; //don't bother restarting it it
}
ch->pos = scache->loopstart;
ch->end = ltime + scache->length - ch->pos;
if (!scache->length)

View File

@ -1118,6 +1118,7 @@ void V_CalcRefdef (int pnum)
// refresh position from simulated origin
VectorCopy (cl.simorg[pnum], r_refdef.vieworg);
r_refdef.useperspective = true;
r_refdef.vieworg[2] += bob;
// never let it sit exactly on a node line, because a water plane can

View File

@ -282,7 +282,7 @@ typedef struct item_vis_s {
// TRIGGERS
//===========================================================================
static void TP_ExecTrigger (char *s)
void TP_ExecTrigger (char *s)
{
char *astr;

View File

@ -343,8 +343,6 @@ typedef struct q2miptex_s
#define MAX_Q2MAP_MODELS 1024
#define MAX_Q2MAP_BRUSHES MAX_MAP_BRUSHES
#define MAX_Q2MAP_ENTITIES 2048
#define MAX_Q2MAP_ENTSTRING 0x40000
#define MAX_Q2MAP_TEXINFO 8192
#define MAX_Q2MAP_AREAS 256
#define MAX_Q2MAP_AREAPORTALS 1024

View File

@ -1711,11 +1711,6 @@ void Cmd_ExecuteString (char *text, int level)
return;
}
#ifdef PLUGINS
if (Plugin_ExecuteString())
return;
#endif
#ifndef SERVERONLY
#ifdef CSQC_DAT
if (CSQC_ConsoleCommand(text))
@ -1723,6 +1718,11 @@ void Cmd_ExecuteString (char *text, int level)
#endif
#endif
#ifdef PLUGINS
if (Plugin_ExecuteString())
return;
#endif
#ifndef CLIENTONLY
if (sv.state)
{

View File

@ -263,7 +263,7 @@ int numbrushsides;
q2cbrushside_t map_brushsides[MAX_Q2MAP_BRUSHSIDES];
int numtexinfo;
q2mapsurface_t map_surfaces[MAX_Q2MAP_TEXINFO];
q2mapsurface_t *map_surfaces;
int numplanes;
mplane_t map_planes[MAX_Q2MAP_PLANES+6]; // extra for box hull
@ -292,7 +292,7 @@ qbyte map_hearability[MAX_Q2MAP_VISIBILITY];
q3dvis_t *map_q3phs = (q3dvis_t *)map_hearability;
int numentitychars;
char map_entitystring[MAX_Q2MAP_ENTSTRING];
char *map_entitystring;
int numareas = 1;
q2carea_t map_q2areas[MAX_Q2MAP_AREAS];
@ -959,11 +959,11 @@ void CMod_LoadSurfaces (lump_t *l)
count = l->filelen / sizeof(*in);
if (count < 1)
Host_Error ("Map with no surfaces");
if (count > MAX_Q2MAP_TEXINFO)
Host_Error ("Map has too many surfaces");
// if (count > MAX_Q2MAP_TEXINFO)
// Host_Error ("Map has too many surfaces");
numtexinfo = count;
out = map_surfaces;
out = map_surfaces = Hunk_Alloc(count * sizeof(*map_surfaces));
for ( i=0 ; i<count ; i++, in++, out++)
{
@ -1797,9 +1797,10 @@ CMod_LoadEntityString
void CMod_LoadEntityString (lump_t *l)
{
numentitychars = l->filelen;
if (l->filelen > MAX_Q2MAP_ENTSTRING)
Host_Error ("Map has too large entity lump");
// if (l->filelen > MAX_Q2MAP_ENTSTRING)
// Host_Error ("Map has too large entity lump");
map_entitystring = Hunk_Alloc(l->filelen+1);
memcpy (map_entitystring, cmod_base + l->fileofs, l->filelen);
loadmodel->entities = map_entitystring;
@ -1905,11 +1906,11 @@ void CModQ3_LoadShaders (lump_t *l, qboolean useshaders)
if (count < 1)
Host_Error ("Map with no shaders");
else if (count > MAX_Q2MAP_TEXINFO)
Host_Error ("Map has too many shaders");
// else if (count > MAX_Q2MAP_TEXINFO)
// Host_Error ("Map has too many shaders");
numtexinfo = count;
out = map_surfaces;
out = map_surfaces = Hunk_Alloc(count*sizeof(*out));
#if !defined(SERVERONLY) && defined(RGLQUAKE)
skytexturenum = -1;
@ -3443,7 +3444,7 @@ q2cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned
numcmodels = 0;
numvisibility = 0;
numentitychars = 0;
map_entitystring[0] = 0;
map_entitystring = NULL;
map_name[0] = 0;
loadmodel->type = mod_brush;

View File

@ -607,6 +607,8 @@ enum {
#define DPTE_BLOODSHOWER 52
#define DPTE_EXPLOSIONRGB 53
#define DPTE_PARTICLECUBE 54
#define DPTE_PARTICLERAIN 55 // [vector] min [vector] max [vector] dir [short] count [byte] color
#define DPTE_PARTICLESNOW 56 // [vector] min [vector] max [vector] dir [short] count [byte] color
#define DPTE_GUNSHOTQUAD 57 // [vector] origin
#define DPTE_SPIKEQUAD 58 // [vector] origin
#define DPTE_SUPERSPIKEQUAD 59 // [vector] origin

View File

@ -1531,6 +1531,7 @@ void R_DrawGAliasModel (entity_t *e)
if (e->flags & Q2RF_ADDATIVE && skin->shader->numpasses)
{ //hack the shader into submition.
skin->shader->passes[0].blenddst = GL_ONE;
skin->shader->passes[0].flags &= ~SHADER_PASS_DEPTHWRITE;
}
mb.entity = &r_worldentity;

View File

@ -1065,7 +1065,7 @@ TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n"));
if (!draw_backtile)
draw_backtile = Draw_SafeCachePic ("gfx/menu/backtile.lmp");
detailtexture = Mod_LoadReplacementTexture("textures/detail", NULL, true, false, false);
detailtexture = Mod_LoadHiResTexture("textures/detail", NULL, true, false, false);
inited15to8 = false;

View File

@ -15,6 +15,7 @@ extern int *lightmap_textures;
extern int lightmap_bytes; // 1, 2, or 4
extern cvar_t gl_detail;
extern cvar_t gl_detailscale;
extern cvar_t gl_overbright;
extern cvar_t r_fb_bmodels;
extern cvar_t gl_part_flame;
@ -165,6 +166,34 @@ static void PPL_GenerateArrays(msurface_t *surf)
varray_vc = surf->mesh->numvertexes;
varray_ic = surf->mesh->numindexes;
}
static void PPL_GenerateDetailArrays(msurface_t *surf)
{
int vi;
if (!surf->mesh)
return;
if (surf->mesh->numindexes > MAXARRAYVERTS)
return;
if (surf->mesh->numvertexes > MAXARRAYVERTS)
return;
if (!surf->mesh->st_array)
return;
if (!surf->mesh->lmst_array)
return;
if (varray_ic) //FIXME: go muuuch faster please
PPL_FlushArrays();
for (vi = 0; vi < surf->mesh->numindexes; vi++)
varray_i[vi] = surf->mesh->indexes[vi];
for (vi = 0; vi < surf->mesh->numvertexes; vi++)
{
VectorCopy(surf->mesh->xyz_array[vi], varray_v[vi].xyz);
varray_v[vi].stw[0] = surf->mesh->st_array[vi][0]*gl_detailscale.value;
varray_v[vi].stw[1] = surf->mesh->st_array[vi][1]*gl_detailscale.value;
}
varray_vc = surf->mesh->numvertexes;
varray_ic = surf->mesh->numindexes;
}
/*
static void PPL_BaseChain_NoLightmap(msurface_t *first, texture_t *tex)
@ -1505,7 +1534,7 @@ static void PPL_FullBrightTextureChain(msurface_t *first)
qglTexCoordPointer(2, GL_FLOAT, sizeof(surfvertexarray_t), varray_v->stw);
for (s = first; s ; s=s->texturechain)
{
PPL_GenerateArrays(s);
PPL_GenerateDetailArrays(s);
}
PPL_FlushArrays();
}
@ -1748,6 +1777,18 @@ void R_DrawBeam( entity_t *e )
qglDepthMask( GL_TRUE );
}
void PPL_DrawEnt(entity_t *e, void *parm)
{
qglEnd();
currententity = e;
R_IBrokeTheArrays();
R_DrawGAliasModel (currententity);
P_FlushRenderer();
qglBegin(GL_QUADS);
}
void PPL_BaseEntTextures(void)
{
extern qboolean r_inmirror;
@ -1791,9 +1832,7 @@ void PPL_BaseEntTextures(void)
switch (currententity->model->type)
{
case mod_alias:
if (!varrayactive)
R_IBrokeTheArrays();
R_DrawGAliasModel (currententity);
RQ_AddDistReorder(PPL_DrawEnt, currententity, NULL, currententity->origin);
break;
case mod_brush:

View File

@ -512,7 +512,7 @@ void R_DrawSpriteModel (entity_t *e)
{
extern int gldepthfunc;
qglDepthFunc(gldepthfunc);
qglDepthMask(1);
qglDepthMask(0);
if (gldepthmin == 0.5)
qglCullFace ( GL_BACK );
else
@ -734,6 +734,17 @@ void GLR_AddDecals(vec3_t org)
//==================================================================================
void GLR_DrawSprite(entity_t *e, void *parm)
{
qglEnd();
currententity = e;
R_DrawSpriteModel (currententity);
P_FlushRenderer();
qglBegin(GL_QUADS);
}
/*
=============
R_DrawEntitiesOnList
@ -816,60 +827,10 @@ void GLR_DrawEntitiesOnList (void)
PPL_BaseBModelTextures (currententity);
break;
default:
break;
}
}
for (i=0 ; i<cl_numvisedicts ; i++)
{
currententity = &cl_visedicts[i];
if (r_inmirror)
{
if (currententity->flags & Q2RF_WEAPONMODEL)
continue;
}
else
{
if (currententity->keynum == (cl.viewentity[r_refdef.currentplayernum]?cl.viewentity[r_refdef.currentplayernum]:(cl.playernum[r_refdef.currentplayernum]+1)))
continue;
// if (cl.viewentity[r_refdef.currentplayernum] && currententity->keynum == cl.viewentity[r_refdef.currentplayernum])
// continue;
if (!Cam_DrawPlayer(0, currententity->keynum-1))
continue;
}
if (currententity->flags & Q2RF_BEAM)
{
R_DrawBeam(currententity);
continue;
}
if (!currententity->model)
continue;
if (cls.allow_anyparticles || currententity->visframe) //allowed or static
{
if (currententity->model->particleeffect>=0)
{
if (currententity->model->particleengulphs)
{
if (gl_part_flame.value)
{
continue;
}
}
}
}
switch (currententity->model->type)
{
case mod_sprite:
R_DrawSpriteModel (currententity);
break;
RQ_AddDistReorder(GLR_DrawSprite, currententity, NULL, currententity->origin);
default :
default:
break;
}
}
@ -1369,6 +1330,29 @@ void GL_InfinatePerspective( GLdouble fovy, GLdouble aspect,
r_projection_matrix[15] = 0;
}
void GL_ParallelPerspective(GLdouble xmin, GLdouble xmax, GLdouble ymax, GLdouble ymin,
GLdouble znear, GLdouble zfar)
{
r_projection_matrix[0] = 2/(xmax-xmin);
r_projection_matrix[4] = 0;
r_projection_matrix[8] = 0;
r_projection_matrix[12] = (xmax+xmin)/(xmax-xmin);
r_projection_matrix[1] = 0;
r_projection_matrix[5] = 2/(ymax-ymin);
r_projection_matrix[9] = 0;
r_projection_matrix[13] = (ymax+ymin)/(ymax-ymin);
r_projection_matrix[2] = 0;
r_projection_matrix[6] = 0;
r_projection_matrix[10] = -2/(zfar-znear);
r_projection_matrix[14] = (zfar+znear)/(zfar-znear);
r_projection_matrix[3] = 0;
r_projection_matrix[7] = 0;
r_projection_matrix[11] = 0;
r_projection_matrix[15] = 1;
}
/*
=============
@ -1412,17 +1396,27 @@ void R_SetupGL (void)
qglMatrixMode(GL_PROJECTION);
screenaspect = (float)r_refdef.vrect.width/r_refdef.vrect.height;
if ((!r_shadows.value || !gl_canstencil) && gl_maxdist.value>256)//gl_nv_range_clamp)
if (r_refdef.useperspective)
{
// yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*180/M_PI;
// yfov = (2.0 * tan (scr_fov.value/360*M_PI)) / screenaspect;
// yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*(scr_fov.value*2)/M_PI;
// MYgluPerspective (yfov, screenaspect, 4, 4096);
MYgluPerspective (r_refdef.fov_y, screenaspect, 4, gl_maxdist.value);
if ((!r_shadows.value || !gl_canstencil) && gl_maxdist.value>256)//gl_nv_range_clamp)
{
// yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*180/M_PI;
// yfov = (2.0 * tan (scr_fov.value/360*M_PI)) / screenaspect;
// yfov = 2*atan((float)r_refdef.vrect.height/r_refdef.vrect.width)*(scr_fov.value*2)/M_PI;
// MYgluPerspective (yfov, screenaspect, 4, 4096);
MYgluPerspective (r_refdef.fov_y, screenaspect, 4, gl_maxdist.value);
}
else
{
GL_InfinatePerspective(r_refdef.fov_y, screenaspect, 4);
}
}
else
{
GL_InfinatePerspective(r_refdef.fov_y, screenaspect, 4);
if (gl_maxdist.value>=1)
GL_ParallelPerspective(-45, 45, 45, -45, -gl_maxdist.value, gl_maxdist.value);
else
GL_ParallelPerspective(0, r_refdef.vrect.width, 0, r_refdef.vrect.height, -9999, 9999);
}
qglLoadMatrixf(r_projection_matrix);

View File

@ -229,6 +229,21 @@ eval_t *PR_FindGlobal(progfuncs_t *progfuncs, char *globname, progsnum_t pnum)
ddef32_t *var32;
if (pnum == PR_CURRENT)
pnum = pr_typecurrent;
if (pnum == PR_ANY)
{
eval_t *ev;
for (pnum = 0; pnum < maxprogs; pnum++)
{
if (!pr_progstate[pnum].progs)
continue;
ev = PR_FindGlobal(progfuncs, globname, pnum);
if (ev)
return ev;
}
return NULL;
}
if (pnum < 0 || pnum >= maxprogs || !pr_progstate[pnum].progs)
return NULL;
switch(pr_progstate[pnum].intsize)
{
case 16:

View File

@ -255,7 +255,6 @@ typedef union eval_s
#define G_EDICTNUM(pf, o) NUM_FOR_EDICT(pf, G_EDICT(pf, o))
#define G_VECTOR(o) (&((float *)pr_globals)[o])
#define G_FUNCTION(o) (*(func_t *)&((float *)pr_globals)[o])
#define G_PROG(o) (*(progsnum_t *)&((float *)pr_globals)[o]) //simply so it's nice and easy to change...
#define PR_GetString(p,s) (s?s + p->stringtable:"")
#define PR_GetStringOfs(p,o) (G_INT(o)?G_INT(o) + p->stringtable:"")

View File

@ -20,6 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "qwsvdef.h"
#define G_PROG G_FLOAT
#ifndef CLIENTONLY
//okay, so these are a quick but easy hack
@ -1530,7 +1532,7 @@ void PF_externvalue (progfuncs_t *prinst, globalvars_t *pr_globals) //return a v
char *varname = PF_VarString(prinst, 1, pr_globals);
eval_t *var;
var = svprogfuncs->FindGlobal(prinst, varname, n);
var = prinst->FindGlobal(prinst, varname, n);
if (var)
G_INT(OFS_RETURN) = var->_int;
@ -1545,20 +1547,10 @@ void PF_externset (progfuncs_t *prinst, globalvars_t *pr_globals) //set a value
char *varname = PF_VarString(prinst, 2, pr_globals);
eval_t *var;
if (n < 0)
{
for (n = 0; n < svs.numprogs; n++)
{
var = svprogfuncs->FindGlobal(prinst, varname, svs.progsnum[n]);
if (var)
var->_int = v;
}
return;
}
var = svprogfuncs->FindGlobal(prinst, varname, n);
var = prinst->FindGlobal(prinst, varname, n);
if (var)
var->_int = v;
var->_int = v;
}
void PF_instr (progfuncs_t *prinst, globalvars_t *pr_globals)
@ -3189,6 +3181,24 @@ void PF_registercvar (progfuncs_t *prinst, struct globalvars_s *pr_globals)
}
}
void PF_sv_getlight (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *point = G_VECTOR(OFS_PARM0);
vec3_t diffuse, ambient, dir;
if (sv.worldmodel && sv.worldmodel->funcs.LightPointValues)
{
sv.worldmodel->funcs.LightPointValues(point, diffuse, ambient, dir);
VectorMA(ambient, 0.5, diffuse, G_VECTOR(OFS_RETURN));
}
else
{
G_FLOAT(OFS_RETURN+0) = 0.5;
G_FLOAT(OFS_RETURN+1) = 0.5;
G_FLOAT(OFS_RETURN+2) = 0.5;
return;
}
}
/*
=================
PF_findradius
@ -7567,7 +7577,7 @@ void PF_CustomTEnt(progfuncs_t *prinst, struct globalvars_s *pr_globals)
void PF_Abort(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
svprogfuncs->AbortStack(svprogfuncs);
prinst->AbortStack(prinst);
}
typedef struct qcstate_s {
@ -7968,6 +7978,144 @@ void PF_te_particlecube(progfuncs_t *prinst, struct globalvars_s *pr_globals)
SV_Multicast(org, MULTICAST_PVS);
}
void PF_te_explosionrgb(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *org = G_VECTOR(OFS_PARM0);
float *colour = G_VECTOR(OFS_PARM0);
MSG_WriteByte(&sv.multicast, svc_temp_entity);
MSG_WriteByte(&sv.multicast, DPTE_EXPLOSIONRGB);
// origin
MSG_WriteCoord(&sv.multicast, org[0]);
MSG_WriteCoord(&sv.multicast, org[1]);
MSG_WriteCoord(&sv.multicast, org[2]);
// color
MSG_WriteByte(&sv.multicast, bound(0, (int) (colour[0] * 255), 255));
MSG_WriteByte(&sv.multicast, bound(0, (int) (colour[1] * 255), 255));
MSG_WriteByte(&sv.multicast, bound(0, (int) (colour[2] * 255), 255));
#ifdef NQPROT
MSG_WriteByte(&sv.nqmulticast, svc_temp_entity);
MSG_WriteByte(&sv.nqmulticast, DPTE_EXPLOSIONRGB);
// origin
MSG_WriteCoord(&sv.nqmulticast, org[0]);
MSG_WriteCoord(&sv.nqmulticast, org[1]);
MSG_WriteCoord(&sv.nqmulticast, org[2]);
// color
MSG_WriteByte(&sv.nqmulticast, bound(0, (int) (colour[0] * 255), 255));
MSG_WriteByte(&sv.nqmulticast, bound(0, (int) (colour[1] * 255), 255));
MSG_WriteByte(&sv.nqmulticast, bound(0, (int) (colour[2] * 255), 255));
#endif
SV_Multicast(org, MULTICAST_PVS);
}
void PF_te_particlerain(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *min = G_VECTOR(OFS_PARM0);
float *max = G_VECTOR(OFS_PARM1);
float *velocity = G_VECTOR(OFS_PARM2);
float count = G_FLOAT(OFS_PARM3);
float colour = G_FLOAT(OFS_PARM4);
if (count < 1)
return;
MSG_WriteByte(&sv.multicast, svc_temp_entity);
MSG_WriteByte(&sv.multicast, DPTE_PARTICLERAIN);
// min
MSG_WriteCoord(&sv.multicast, min[0]);
MSG_WriteCoord(&sv.multicast, min[1]);
MSG_WriteCoord(&sv.multicast, min[2]);
// max
MSG_WriteCoord(&sv.multicast, max[0]);
MSG_WriteCoord(&sv.multicast, max[1]);
MSG_WriteCoord(&sv.multicast, max[2]);
// velocity
MSG_WriteCoord(&sv.multicast, velocity[0]);
MSG_WriteCoord(&sv.multicast, velocity[1]);
MSG_WriteCoord(&sv.multicast, velocity[2]);
// count
MSG_WriteShort(&sv.multicast, max(count, 65535));
// colour
MSG_WriteByte(&sv.multicast, colour);
#ifdef NQPROT
MSG_WriteByte(&sv.nqmulticast, svc_temp_entity);
MSG_WriteByte(&sv.nqmulticast, DPTE_PARTICLERAIN);
// min
MSG_WriteCoord(&sv.nqmulticast, min[0]);
MSG_WriteCoord(&sv.nqmulticast, min[1]);
MSG_WriteCoord(&sv.nqmulticast, min[2]);
// max
MSG_WriteCoord(&sv.nqmulticast, max[0]);
MSG_WriteCoord(&sv.nqmulticast, max[1]);
MSG_WriteCoord(&sv.nqmulticast, max[2]);
// velocity
MSG_WriteCoord(&sv.nqmulticast, velocity[0]);
MSG_WriteCoord(&sv.nqmulticast, velocity[1]);
MSG_WriteCoord(&sv.nqmulticast, velocity[2]);
// count
MSG_WriteShort(&sv.nqmulticast, max(count, 65535));
// colour
MSG_WriteByte(&sv.nqmulticast, colour);
#endif
SV_Multicast(NULL, MULTICAST_ALL);
}
void PF_te_particlesnow(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float *min = G_VECTOR(OFS_PARM0);
float *max = G_VECTOR(OFS_PARM1);
float *velocity = G_VECTOR(OFS_PARM2);
float count = G_FLOAT(OFS_PARM3);
float colour = G_FLOAT(OFS_PARM4);
if (count < 1)
return;
MSG_WriteByte(&sv.multicast, svc_temp_entity);
MSG_WriteByte(&sv.multicast, DPTE_PARTICLESNOW);
// min
MSG_WriteCoord(&sv.multicast, min[0]);
MSG_WriteCoord(&sv.multicast, min[1]);
MSG_WriteCoord(&sv.multicast, min[2]);
// max
MSG_WriteCoord(&sv.multicast, max[0]);
MSG_WriteCoord(&sv.multicast, max[1]);
MSG_WriteCoord(&sv.multicast, max[2]);
// velocity
MSG_WriteCoord(&sv.multicast, velocity[0]);
MSG_WriteCoord(&sv.multicast, velocity[1]);
MSG_WriteCoord(&sv.multicast, velocity[2]);
// count
MSG_WriteShort(&sv.multicast, max(count, 65535));
// colour
MSG_WriteByte(&sv.multicast, colour);
#ifdef NQPROT
MSG_WriteByte(&sv.nqmulticast, svc_temp_entity);
MSG_WriteByte(&sv.nqmulticast, DPTE_PARTICLESNOW);
// min
MSG_WriteCoord(&sv.nqmulticast, min[0]);
MSG_WriteCoord(&sv.nqmulticast, min[1]);
MSG_WriteCoord(&sv.nqmulticast, min[2]);
// max
MSG_WriteCoord(&sv.nqmulticast, max[0]);
MSG_WriteCoord(&sv.nqmulticast, max[1]);
MSG_WriteCoord(&sv.nqmulticast, max[2]);
// velocity
MSG_WriteCoord(&sv.nqmulticast, velocity[0]);
MSG_WriteCoord(&sv.nqmulticast, velocity[1]);
MSG_WriteCoord(&sv.nqmulticast, velocity[2]);
// count
MSG_WriteShort(&sv.nqmulticast, max(count, 65535));
// colour
MSG_WriteByte(&sv.nqmulticast, colour);
#endif
SV_Multicast(NULL, MULTICAST_ALL);
}
// #406 void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower (DP_TE_BLOODSHOWER)
void PF_te_bloodshower(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
@ -8362,7 +8510,7 @@ void PF_ChangePic(progfuncs_t *prinst, struct globalvars_s *pr_globals)
#if 0
typedef struct {
int ident;
int version;
@ -8423,9 +8571,18 @@ typedef struct zymbone_s
int flags;
int parent; // parent bone number
} zymbone_t;
#endif
int SV_TagForName(int modelindex, char *tagname)
{
#if 1
model_t *model = sv.models[modelindex];
if (!model)
model = Mod_ForName(sv.model_precache[modelindex], false);
if (!model)
return 0;
return Mod_TagNumForName(model, tagname);
#else
int i;
unsigned int *file;
@ -8469,6 +8626,7 @@ int SV_TagForName(int modelindex, char *tagname)
else
Con_DPrintf("setattachment: %s not supported\n", sv.model_precache[modelindex]);
return 0;
#endif
}
void PF_setattachment(progfuncs_t *prinst, struct globalvars_s *pr_globals)
@ -8501,6 +8659,78 @@ void PF_setattachment(progfuncs_t *prinst, struct globalvars_s *pr_globals)
e->v->tag_index = tagidx;
}
// #451 float(entity ent, string tagname) gettagindex (DP_MD3_TAGSINFO)
void PF_gettagindex(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
edict_t *e = G_EDICT(prinst, OFS_PARM0);
char *tagname = PR_GetStringOfs(prinst, OFS_PARM1);
int modelindex;
int tagidx;
tagidx = 0;
if (tagname && tagname[0])
{
modelindex = (int)e->v->modelindex;
if (modelindex > 0 && modelindex < MAX_MODELS && sv.model_precache[modelindex])
{
tagidx = SV_TagForName(modelindex, tagname);
if (tagidx == 0)
Con_DPrintf("PF_gettagindex(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i (model \"%s\") but could not find it\n", NUM_FOR_EDICT(prinst, e), NUM_FOR_EDICT(prinst, e), tagname, tagname, NUM_FOR_EDICT(prinst, e), sv.models[modelindex]->name);
}
else
Con_DPrintf("PF_gettagindex(edict %i, edict %i, string \"%s\"): tried to find tag named \"%s\" on entity %i but it has no model\n", NUM_FOR_EDICT(prinst, e), NUM_FOR_EDICT(prinst, e), tagname, tagname, NUM_FOR_EDICT(prinst, e));
}
G_FLOAT(OFS_RETURN) = tagidx;
}
void EdictToTransform(edict_t *ed, float *trans)
{
AngleVectors(ed->v->angles, trans+0, trans+4, trans+8);
trans[3] = ed->v->origin[0];
trans[7] = ed->v->origin[1];
trans[11] = ed->v->origin[2];
}
// #452 vector(entity ent, float tagindex) gettaginfo (DP_MD3_TAGSINFO)
void PF_gettaginfo(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
float transtag[12];
float transent[12];
float result[12];
edict_t *ent = G_EDICT(prinst, OFS_PARM0);
int tagnum = G_FLOAT(OFS_PARM1);
model_t *model = sv.models[(int)ent->v->modelindex];
float *origin = G_VECTOR(OFS_RETURN);
float *axis[3];
axis[0] = P_VEC(v_forward);
axis[1] = P_VEC(v_up);
axis[2] = P_VEC(v_right);
if (!model)
model = Mod_FindName(sv.model_precache[(int)ent->v->modelindex]);
if (!Mod_GetTag(model, tagnum, ent->v->frame, ent->v->frame, 0, 0, 0, transtag))
{
return;
}
EdictToTransform(ent, transent);
R_ConcatTransforms((void*)transent, (void*)transtag, (void*)result);
origin[0] = result[3];
origin[1] = result[7];
origin[2] = result[11];
VectorCopy((result+0), axis[0]);
VectorCopy((result+4), axis[1]);
VectorCopy((result+8), axis[2]);
}
void PF_clientstat(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
char *name = PF_VarString(prinst, 2, pr_globals);
@ -8724,6 +8954,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"tracebox", PF_traceboxdp, 0, 0, 0, 90},
{"randomvec", PF_randomvector, 0, 0, 0, 91},
{"getlight", PF_sv_getlight, 0, 0, 0, 92},// #92 vector(vector org) getlight (DP_QC_GETLIGHT),
{"registercvar", PF_registercvar, 0, 0, 0, 93},
{"min", PF_min, 0, 0, 0, 94},// #94 float(float a, floats) min (DP_QC_MINMAXBOUND)
{"max", PF_max, 0, 0, 0, 95}, // #95 float(float a, floats) max (DP_QC_MINMAXBOUND)
@ -8838,15 +9069,20 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"te_blood", PF_te_blood, 0, 0, 0, 405},// #405 te_blood
//DP_TE_BLOODSHOWER
{"te_bloodshower", PF_te_bloodshower, 0, 0, 0, 406},// #406 void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower (DP_TE_BLOODSHOWER)
//DP_TE_EXPLOSIONRGB
{"te_explosionrgb", PF_te_explosionrgb, 0, 0, 0, 407},// #407 void(vector org, vector color) te_explosionrgb (DP_TE_EXPLOSIONRGB)
//DP_TE_PARTICLECUBE
{"te_particlecube", PF_te_particlecube, 0, 0, 0, 408},// #408 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color, float gravityflag, float randomveljitter) te_particlecube (DP_TE_PARTICLECUBE)
//DP_TE_PARTICLERAIN
{"te_particlerain", PF_te_particlerain, 0, 0, 0, 409},// #409 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlerain (DP_TE_PARTICLERAIN)
//DP_TE_PARTICLESNOW
{"te_particlesnow", PF_te_particlesnow, 0, 0, 0, 410},// #410 void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlesnow (DP_TE_PARTICLESNOW)
//DP_TE_SPARK
{"te_spark", PF_te_spark, 0, 0, 0, 411},// #411 void(vector org, vector vel, float howmany) te_spark (DP_TE_SPARK)
//DP_TE_QUADEFFECTS1
{"te_gunshotquad", PF_te_gunshotquad, 0, 0, 0, 412},// #412 void(vector org) te_gunshotquad (DP_TE_QUADEFFECTS1)
{"te_spikequad", PF_te_spikequad, 0, 0, 0, 413},// #413 void(vector org) te_spikequad (DP_TE_QUADEFFECTS1)
{"te_superspikequad",PF_te_superspikequad, 0, 0, 0, 414},// #414 void(vector org) te_superspikequad (DP_TE_QUADEFFECTS1)
{"te_superspikequad",PF_te_superspikequad,0, 0, 0, 414},// #414 void(vector org) te_superspikequad (DP_TE_QUADEFFECTS1)
{"te_explosionquad",PF_te_explosionquad,0, 0, 0, 415},// #415 void(vector org) te_explosionquad (DP_TE_QUADEFFECTS1)
//DP_TE_SMALLFLASH
{"te_smallflash", PF_te_smallflash, 0, 0, 0, 416},// #416 void(vector org) te_smallflash (DP_TE_SMALLFLASH)
@ -8872,12 +9108,20 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"vectorvectors", PF_vectorvectors, 0, 0, 0, 432},// #432 void(vector dir) vectorvectors (DP_QC_VECTORVECTORS)
{"te_plasmaburn", PF_te_plasmaburn, 0, 0, 0, 433},// #433 void(vector org) te_plasmaburn (DP_TE_PLASMABURN)
/*
{"getsurfacenumpoints",PF_getsurfacenumpoints,0,0, 0, 434},// #434 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACE)
{"getsurfacepoint",PF_getsurfacepoint, 0, 0, 0, 435},// #435 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACE)
{"getsurfacenormal",PF_getsurfacenormal,0, 0, 0, 436},// #436 vector(entity e, float s) getsurfacenormal (DP_QC_GETSURFACE)
{"getsurfacetexture",PF_getsurfacetexture,0, 0, 0, 437},// #437 string(entity e, float s) getsurfacetexture (DP_QC_GETSURFACE)
{"getsurfacenearpoint",PF_getsurfacenearpoint,0,0, 0, 438},// #438 float(entity e, vector p) getsurfacenearpoint (DP_QC_GETSURFACE)
{"getsurfaceclippedpoint",PF_getsurfaceclippedpoint,0,0,0, 439},// #439 vector(entity e, float s, vector p) getsurfaceclippedpoint (DP_QC_GETSURFACE)
*/
//KRIMZON_SV_PARSECLIENTCOMMAND
{"clientcommand", PF_clientcommand, 0, 0, 0, 440},// #440 void(entity e, string s) clientcommand (KRIMZON_SV_PARSECLIENTCOMMAND)
{"tokenize", PF_Tokenize, 0, 0, 0, 441},// #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND)
{"argv", PF_ArgV, 0, 0, 0, 442},// #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND
//DP_GFX_QUAKE3MODELTAGS
{"setattachment", PF_setattachment, 0, 0, 0, 443},// #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS)
{"search_begin", PF_search_begin, 0, 0, 0, 444},
@ -8891,7 +9135,10 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"findflags", PF_FindFlags, 0, 0, 0, 449},// #449 entity(entity start, .entity fld, float match) findflags
//DP_QC_FINDCHAINFLAGS
{"findchainflags", PF_findchainflags, 0, 0, 0, 450},// #450 entity(.float fld, float match) findchainflags
//DP_MD3_TAGSINFO
{"gettagindex", PF_gettagindex, 0, 0, 0, 451},// #451 float(entity ent, string tagname) gettagindex (DP_MD3_TAGSINFO)
{"gettaginfo", PF_gettaginfo, 0, 0, 0, 452},// #452 vector(entity ent, float tagindex) gettaginfo (DP_MD3_TAGSINFO)
//DP_QC_BOTCLIENT
{"dropclient", PF_dropclient, 0, 0, 0, 453},// #453 void(entity player) dropclient
{"spawnclient", PF_spawnclient, 0, 0, 0, 454}, //entity() spawnclient = #454;

View File

@ -1177,7 +1177,7 @@ void SV_AcceptMessage(int protocol)
case SCP_QUAKE2:
default:
strcpy(string, "print\n");
strcpy(string, "client_connect\n");
len = strlen(string);
break;

View File

@ -560,6 +560,17 @@ void SV_MulticastProtExt(vec3_t origin, multicast_t to, int dimension_mask, int
else
SZ_Write (&client->datagram, sv.nqmulticast.data, sv.nqmulticast.cursize);
break;
#endif
#ifdef Q2SERVER
case SCP_QUAKE2:
if (reliable)
{
ClientReliableCheckBlock(client, sv.q2multicast.cursize);
ClientReliableWrite_SZ(client, sv.q2multicast.data, sv.q2multicast.cursize);
}
else
SZ_Write (&client->datagram, sv.q2multicast.data, sv.q2multicast.cursize);
break;
#endif
case SCP_QUAKEWORLD:
if (reliable)
@ -685,6 +696,9 @@ void SV_MulticastProtExt(vec3_t origin, multicast_t to, int dimension_mask, int
#ifdef NQPROT
SZ_Clear (&sv.nqmulticast);
#endif
#ifdef Q2SERVER
SZ_Clear (&sv.q2multicast);
#endif
SZ_Clear (&sv.multicast);
}

View File

@ -44,11 +44,11 @@ static void VARGS PFQ2_Unicast (q2edict_t *ent, qboolean reliable)
return;
if (reliable)
SZ_Write (&client->netchan.message, sv.multicast.data, sv.multicast.cursize);
SZ_Write (&client->netchan.message, sv.q2multicast.data, sv.q2multicast.cursize);
else
SZ_Write (&client->datagram, sv.multicast.data, sv.multicast.cursize);
SZ_Write (&client->datagram, sv.q2multicast.data, sv.q2multicast.cursize);
SZ_Clear (&sv.multicast);
SZ_Clear (&sv.q2multicast);
}
@ -136,8 +136,8 @@ static void VARGS PFQ2_centerprintf (q2edict_t *ent, char *fmt, ...)
vsprintf (msg, fmt, argptr);
va_end (argptr);
MSG_WriteByte (&sv.multicast,svcq2_centerprint);
MSG_WriteString (&sv.multicast,msg);
MSG_WriteByte (&sv.q2multicast,svcq2_centerprint);
MSG_WriteString (&sv.q2multicast,msg);
PFQ2_Unicast (ent, true);
}
@ -224,10 +224,10 @@ static void VARGS PFQ2_Configstring (int i, char *val)
if (sv.state != ss_loading)
{ // send the update to everyone
SZ_Clear (&sv.multicast);
MSG_WriteChar (&sv.multicast, svcq2_configstring);
MSG_WriteShort (&sv.multicast, i);
MSG_WriteString (&sv.multicast, val);
SZ_Clear (&sv.q2multicast);
MSG_WriteChar (&sv.q2multicast, svcq2_configstring);
MSG_WriteShort (&sv.q2multicast, i);
MSG_WriteString (&sv.q2multicast, val);
SV_Multicast (vec3_origin, MULTICAST_ALL_R);
}
@ -316,18 +316,18 @@ static qboolean CMQ2_Q1BSP_SetAreaPortalState (int portalnum, qboolean open)
return true;
}*/
static void VARGS PFQ2_WriteChar (int c) {MSG_WriteChar (&sv.multicast, c);}
static void VARGS PFQ2_WriteByte (int c) {MSG_WriteByte (&sv.multicast, c);}
static void VARGS PFQ2_WriteShort (int c) {MSG_WriteShort (&sv.multicast, c);}
static void VARGS PFQ2_WriteLong (int c) {MSG_WriteLong (&sv.multicast, c);}
static void VARGS PFQ2_WriteFloat (float f) {MSG_WriteFloat (&sv.multicast, f);}
static void VARGS PFQ2_WriteString (char *s) {MSG_WriteString (&sv.multicast, s);}
static void VARGS PFQ2_WriteAngle (float f) {MSG_WriteAngle (&sv.multicast, f);}
static void VARGS PFQ2_WritePos (vec3_t pos) { MSG_WriteCoord (&sv.multicast, pos[0]);
MSG_WriteCoord (&sv.multicast, pos[1]);
MSG_WriteCoord (&sv.multicast, pos[2]);
static void VARGS PFQ2_WriteChar (int c) {MSG_WriteChar (&sv.q2multicast, c);}
static void VARGS PFQ2_WriteByte (int c) {MSG_WriteByte (&sv.q2multicast, c);}
static void VARGS PFQ2_WriteShort (int c) {MSG_WriteShort (&sv.q2multicast, c);}
static void VARGS PFQ2_WriteLong (int c) {MSG_WriteLong (&sv.q2multicast, c);}
static void VARGS PFQ2_WriteFloat (float f) {MSG_WriteFloat (&sv.q2multicast, f);}
static void VARGS PFQ2_WriteString (char *s) {MSG_WriteString (&sv.q2multicast, s);}
static void VARGS PFQ2_WriteAngle (float f) {MSG_WriteAngle (&sv.q2multicast, f);}
static void VARGS PFQ2_WritePos (vec3_t pos) { MSG_WriteCoord (&sv.q2multicast, pos[0]);
MSG_WriteCoord (&sv.q2multicast, pos[1]);
MSG_WriteCoord (&sv.q2multicast, pos[2]);
}
static void VARGS PFQ2_WriteDir (vec3_t dir) {MSG_WriteDir (&sv.multicast, dir);}
static void VARGS PFQ2_WriteDir (vec3_t dir) {MSG_WriteDir (&sv.q2multicast, dir);}
/*
=================
@ -479,25 +479,25 @@ void VARGS SVQ2_StartSound (vec3_t origin, q2edict_t *entity, int channel,
}
}
MSG_WriteByte (&sv.multicast, svcq2_sound);
MSG_WriteByte (&sv.multicast, flags);
MSG_WriteByte (&sv.multicast, soundindex);
MSG_WriteByte (&sv.q2multicast, svcq2_sound);
MSG_WriteByte (&sv.q2multicast, flags);
MSG_WriteByte (&sv.q2multicast, soundindex);
if (flags & Q2SND_VOLUME)
MSG_WriteByte (&sv.multicast, volume*255);
MSG_WriteByte (&sv.q2multicast, volume*255);
if (flags & Q2SND_ATTENUATION)
MSG_WriteByte (&sv.multicast, attenuation*64);
MSG_WriteByte (&sv.q2multicast, attenuation*64);
if (flags & Q2SND_OFFSET)
MSG_WriteByte (&sv.multicast, timeofs*1000);
MSG_WriteByte (&sv.q2multicast, timeofs*1000);
if (flags & Q2SND_ENT)
MSG_WriteShort (&sv.multicast, sendchan);
MSG_WriteShort (&sv.q2multicast, sendchan);
if (flags & Q2SND_POS)
{
MSG_WriteCoord (&sv.multicast, origin[0]);
MSG_WriteCoord (&sv.multicast, origin[1]);
MSG_WriteCoord (&sv.multicast, origin[2]);
MSG_WriteCoord (&sv.q2multicast, origin[0]);
MSG_WriteCoord (&sv.q2multicast, origin[1]);
MSG_WriteCoord (&sv.q2multicast, origin[2]);
}
// if the sound doesn't attenuate,send it to everyone