2009-04-14 21:39:15 +00:00
|
|
|
#ifdef WORKINDP
|
|
|
|
#define show_scoreboard sb_showscores
|
|
|
|
#endif
|
|
|
|
|
2020-08-24 07:45:18 +00:00
|
|
|
#define RSES_NOLERP 1
|
|
|
|
#define RSES_NOROTATE 2
|
|
|
|
#define RSES_NOTRAILS 4
|
|
|
|
#define RSES_NOLIGHTS 8
|
|
|
|
|
2009-04-14 21:39:15 +00:00
|
|
|
float show_scoreboard;
|
2009-06-07 15:46:12 +00:00
|
|
|
string dbgstr;
|
2021-04-14 05:21:04 +00:00
|
|
|
vector mousepos;
|
2009-04-14 21:39:15 +00:00
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
void() CSQC_Shutdown = {};
|
|
|
|
|
2009-04-14 21:39:15 +00:00
|
|
|
//check engine extensions, and give suitable warning
|
|
|
|
void() checkengineversion =
|
|
|
|
{
|
|
|
|
if (checkextension("FTE_STRINGS"))
|
|
|
|
{
|
|
|
|
isdp = substring(" ", 0, -1) == "";
|
|
|
|
if (isdp)
|
|
|
|
print("broken FTE_STRINGS support\n");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
print("no FTE_STRINGS support, this mod might crash... sorry\n");
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2020-08-24 07:45:18 +00:00
|
|
|
float(float isnew) RefreshOther =
|
2009-04-14 21:39:15 +00:00
|
|
|
{
|
|
|
|
self.drawmask = MASK_ENGINE;
|
|
|
|
setmodelindex(self, self.modelindex);
|
|
|
|
|
|
|
|
if (self.entnum <= maxclients)
|
|
|
|
RefreshPlayer(isnew);
|
|
|
|
else if (self.colormap)
|
|
|
|
self.modelindex = 0; //don't show dead bodies, we do dying ourselves.
|
2020-08-24 07:45:18 +00:00
|
|
|
|
|
|
|
return PREDRAW_AUTOADD;
|
2009-04-14 21:39:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
float(string centertext) centerprinted =
|
|
|
|
{
|
|
|
|
//warning!
|
|
|
|
//centertext is a temporary string!
|
|
|
|
//warning!
|
|
|
|
|
|
|
|
return false; //we don't want to handle it, let the engine do it.
|
|
|
|
};
|
|
|
|
|
|
|
|
.float classnum;
|
|
|
|
|
|
|
|
void(float isnew) CSQC_Ent_Update =
|
|
|
|
{
|
|
|
|
local float classtype;
|
|
|
|
local var void(float isnew) fnc;
|
|
|
|
|
|
|
|
classtype = readbyte();
|
|
|
|
|
|
|
|
//remove if the class changed.
|
|
|
|
if (self.classnum != classtype)
|
|
|
|
{
|
|
|
|
if (self.removefunc)
|
|
|
|
self.removefunc();
|
|
|
|
isnew = true;
|
|
|
|
self.classnum = classtype;
|
|
|
|
}
|
|
|
|
|
|
|
|
fnc = ParseEntityClass[classtype];
|
|
|
|
if (!fnc)
|
|
|
|
error("Unrecognised entity class: Your csqc needs updating");
|
|
|
|
fnc(isnew);
|
|
|
|
|
|
|
|
// if (isnew)
|
|
|
|
// print("csqc ", self.model, " updated at ", vtos(self.origin), "\n");
|
|
|
|
};
|
|
|
|
|
|
|
|
void() regcommands =
|
|
|
|
{
|
|
|
|
registercommand("tetris");
|
|
|
|
registercommand("skinchooser");
|
|
|
|
registercommand("randomskin");
|
|
|
|
registercommand("test");
|
|
|
|
registercommand("+showscores");
|
|
|
|
registercommand("-showscores");
|
|
|
|
registercommand("+showteamscores");
|
|
|
|
registercommand("-showteamscores");
|
|
|
|
|
|
|
|
registercommand("osgk");
|
2009-04-14 21:39:15 +00:00
|
|
|
registercommand("osgk_command");
|
|
|
|
registercommand("osgk_resize");
|
|
|
|
registercommand("osgk_mousemove");
|
|
|
|
registercommand("osgk_keypress");
|
2020-08-24 07:45:18 +00:00
|
|
|
|
|
|
|
registercommand("test_viewinfo");
|
2008-10-16 22:00:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
float(string str) CSQC_ConsoleCommand =
|
|
|
|
{
|
|
|
|
local float args;
|
|
|
|
args = tokenize(str);
|
|
|
|
switch(argv(0))
|
|
|
|
{
|
2009-06-07 15:46:12 +00:00
|
|
|
case "test":
|
|
|
|
sendevent("testevent", "fsev", 64, "hello world", player_local, '73 72 71');
|
|
|
|
break;
|
2008-10-16 22:00:54 +00:00
|
|
|
case "tetris":
|
|
|
|
Menu_Tetris();
|
|
|
|
break;
|
|
|
|
case "skinchooser":
|
|
|
|
Menu_SkinChooser();
|
|
|
|
break;
|
|
|
|
case "randomskin":
|
|
|
|
SelectRandomSkin();
|
|
|
|
break;
|
|
|
|
case "+showscores":
|
2009-04-14 21:39:15 +00:00
|
|
|
show_scoreboard = 1;
|
|
|
|
return false;
|
2008-10-16 22:00:54 +00:00
|
|
|
case "+showteamscores":
|
2009-04-14 21:39:15 +00:00
|
|
|
show_scoreboard = 2;
|
|
|
|
return false;
|
|
|
|
case "-showscores":
|
2008-10-16 22:00:54 +00:00
|
|
|
case "-showteamscores":
|
2009-04-14 21:39:15 +00:00
|
|
|
show_scoreboard = 0;
|
|
|
|
return false;
|
2008-10-16 22:00:54 +00:00
|
|
|
case "osgk":
|
|
|
|
Menu_OSGK(argv(1));
|
|
|
|
break;
|
2009-04-14 21:39:15 +00:00
|
|
|
case "osgk_command":
|
2008-10-16 22:00:54 +00:00
|
|
|
gecko_navigate(argv(1), argv(2));
|
|
|
|
break;
|
2009-04-14 21:39:15 +00:00
|
|
|
case "osgk_keypress":
|
2008-10-16 22:00:54 +00:00
|
|
|
gecko_keyevent(argv(1), stof(argv(2)), 2);
|
|
|
|
break;
|
2009-04-14 21:39:15 +00:00
|
|
|
case "osgk_resize":
|
2008-10-16 22:00:54 +00:00
|
|
|
gecko_resize(argv(1), stof(argv(2)), stof(argv(3)));
|
|
|
|
break;
|
2009-04-14 21:39:15 +00:00
|
|
|
case "osgk_mousemove":
|
2008-10-16 22:00:54 +00:00
|
|
|
gecko_mousemove(argv(1), stof(argv(2)), stof(argv(3)));
|
|
|
|
break;
|
2020-08-24 07:45:18 +00:00
|
|
|
case "test_viewinfo":
|
|
|
|
if (player_local)
|
|
|
|
{
|
|
|
|
print(sprintf("View origin is at %v\n", vieworg));
|
|
|
|
print(sprintf("local player entity %i is num %g on server, at %v\n", player_local, player_local.entnum, player_local.origin));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
print("Local player entity is not known. Engine is providing the default view origin.\n");
|
|
|
|
break;
|
2008-10-16 22:00:54 +00:00
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
2020-08-24 07:45:18 +00:00
|
|
|
void(string line) CSQC_Parse_StuffCmd =
|
|
|
|
{
|
|
|
|
print("stufftext: ", line);
|
|
|
|
localcmd(line);
|
|
|
|
};
|
|
|
|
float(string msg) CSQC_Parse_CenterPrint =
|
|
|
|
{
|
|
|
|
print("centerprint: ");
|
|
|
|
print(msg);
|
|
|
|
print("\n");
|
|
|
|
cprint(msg);
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2009-06-07 15:46:12 +00:00
|
|
|
void(string msg, float type) CSQC_Parse_Print =
|
|
|
|
{
|
2020-08-24 07:45:18 +00:00
|
|
|
print("print: ");
|
|
|
|
print(msg);
|
2009-06-07 15:46:12 +00:00
|
|
|
|
2020-08-24 07:45:18 +00:00
|
|
|
/* if (dbgstr)
|
2009-06-07 15:46:12 +00:00
|
|
|
strunzone(dbgstr);
|
|
|
|
dbgstr = strzone(msg);
|
2020-08-24 07:45:18 +00:00
|
|
|
*/
|
2009-06-07 15:46:12 +00:00
|
|
|
};
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
void() CSQC_Ent_Remove = //the ent disappeared on the server.
|
|
|
|
{
|
|
|
|
if (self.removefunc)
|
|
|
|
self.removefunc();
|
|
|
|
remove(self);
|
|
|
|
};
|
|
|
|
|
|
|
|
entity viewentity;
|
|
|
|
//note that a better way of animating weapon firing would be as a response to an event, or as a clientside predicted thing.
|
|
|
|
void(entity ve) DoThatViewModelThing =
|
|
|
|
{
|
|
|
|
float newframe, newmodel;
|
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
newframe = getstatf(STAT_WEAPONFRAME);
|
|
|
|
newmodel = getstatf(STAT_WEAPONMODEL);
|
2008-10-16 22:00:54 +00:00
|
|
|
|
|
|
|
if (newmodel != ve.modelindex)
|
|
|
|
{ //changed entirly.
|
|
|
|
ve.modelindex = newmodel;
|
|
|
|
ve.frame2 = ve.frame = newframe;
|
|
|
|
ve.lerptime = time;
|
|
|
|
}
|
|
|
|
else if (newframe != ve.frame)
|
|
|
|
{
|
|
|
|
ve.frame2 = ve.frame;
|
|
|
|
ve.frame = newframe;
|
|
|
|
ve.lerptime = time;
|
|
|
|
}
|
|
|
|
ve.lerpfrac = 1-(time-ve.lerptime)*10;
|
|
|
|
|
|
|
|
ve.origin = '0 0 0';
|
|
|
|
ve.angles = '0 0 0';
|
|
|
|
};
|
|
|
|
|
|
|
|
void() drawloadingscreen =
|
|
|
|
{
|
|
|
|
//work in progress here
|
|
|
|
// drawfill('0 0', '320 240', '1 1 1', 1);
|
|
|
|
// drawstring('0 0', "loading screen", '1 1', '1 1 1', 1);
|
|
|
|
};
|
|
|
|
|
2020-08-24 07:45:18 +00:00
|
|
|
void(float apilevel, string enginename, float engineversion) CSQC_Init =
|
2008-10-16 22:00:54 +00:00
|
|
|
{
|
2021-04-14 05:21:04 +00:00
|
|
|
__using renderflags;
|
|
|
|
|
2009-04-14 21:39:15 +00:00
|
|
|
checkengineversion();
|
2020-08-24 07:45:18 +00:00
|
|
|
|
|
|
|
precache_model("progs/eyes.mdl");
|
|
|
|
precache_model("progs/player.mdl");
|
|
|
|
precache_model("progs/missile.mdl");
|
|
|
|
precache_sound("zombie/z_gib.wav");
|
|
|
|
precache_sound("player/udeath.wav");
|
|
|
|
precache_sound("weapons/r_exp3.wav");
|
2009-04-14 21:39:15 +00:00
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
viewentity = spawn();
|
2009-04-14 21:39:15 +00:00
|
|
|
viewentity.renderflags = RF_VIEWMODEL|RF_DEPTHHACK;
|
2008-10-16 22:00:54 +00:00
|
|
|
|
|
|
|
drawloadingscreen ();
|
|
|
|
|
|
|
|
regcommands();
|
2009-04-14 21:39:15 +00:00
|
|
|
|
|
|
|
if (checkextension("EXT_CSQC_1"))
|
|
|
|
{
|
|
|
|
// deltalisten("*", RefreshOther, 0); //catch-all
|
|
|
|
deltalisten("progs/player.mdl", RefreshPlayer, RSES_NOLERP|RSES_NOROTATE); //animate players/player-corpses
|
|
|
|
}
|
2008-10-16 22:00:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void(entity ent) CSQC_DrawViewModel =
|
|
|
|
{
|
2021-04-14 05:21:04 +00:00
|
|
|
__using shaderforname, checkbuiltin, forceshader;
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
if (player_local.sveffects & SVE_INVIS)
|
2020-08-24 07:45:18 +00:00
|
|
|
{
|
|
|
|
if (!checkbuiltin(shaderforname))
|
|
|
|
return;
|
2008-10-16 22:00:54 +00:00
|
|
|
ent.forceshader = shaderforname("powerups/invisibility");
|
2020-08-24 07:45:18 +00:00
|
|
|
}
|
2008-10-16 22:00:54 +00:00
|
|
|
else
|
|
|
|
ent.forceshader = 0;
|
|
|
|
|
|
|
|
ent.fatness = 0;
|
|
|
|
DoThatViewModelThing(ent);
|
2009-04-14 21:39:15 +00:00
|
|
|
|
|
|
|
#ifdef WORKINDP
|
|
|
|
//DP doesn't support RF_VIEWMODEL
|
|
|
|
//so hack around that
|
|
|
|
ent.renderflags = RF_DEPTHHACK; //nope, not a view model, that just breaks things
|
|
|
|
ent.origin = vieworg;
|
|
|
|
ent.angles = input_angles;
|
2020-08-24 07:45:18 +00:00
|
|
|
ent.angles_x *= autocvar(r_meshpitch, -1);
|
2009-04-14 21:39:15 +00:00
|
|
|
#endif
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
addentity(ent);
|
2020-08-24 07:45:18 +00:00
|
|
|
if ((player_local.sveffects & SVE_QUAD) && checkbuiltin(shaderforname))
|
2008-10-16 22:00:54 +00:00
|
|
|
{
|
|
|
|
ent.fatness = -2;
|
|
|
|
ent.forceshader = shaderforname("powerups/quad");
|
|
|
|
addentity(ent);
|
|
|
|
}
|
2020-08-24 07:45:18 +00:00
|
|
|
if ((player_local.sveffects & SVE_GOD) && checkbuiltin(shaderforname))
|
2008-10-16 22:00:54 +00:00
|
|
|
{
|
|
|
|
ent.fatness = -2.8;
|
|
|
|
ent.forceshader = shaderforname("powerups/regen");
|
|
|
|
addentity(ent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//a bit of fun
|
|
|
|
void() CSQC_Input_Frame =
|
|
|
|
{
|
|
|
|
/* if (input_buttons == 1)
|
|
|
|
input_buttons = 2;
|
|
|
|
else if (input_buttons == 2)
|
|
|
|
input_buttons = 1;*/
|
|
|
|
};
|
|
|
|
|
|
|
|
void() CSQC_Delta_Remove =
|
|
|
|
{
|
|
|
|
if (self == player_local)
|
|
|
|
player_local = world;
|
|
|
|
|
|
|
|
// print("delt ", ftos(self.modelindex), "(", self.model, ") removed\n");
|
|
|
|
if (self.removefunc)
|
|
|
|
self.removefunc();
|
|
|
|
remove(self);
|
|
|
|
};
|
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
|
2020-08-24 07:45:18 +00:00
|
|
|
float (float event, float parama, float paramb, float paramc) CSQC_InputEvent =
|
2011-05-20 04:10:59 +00:00
|
|
|
{
|
2020-08-24 07:45:18 +00:00
|
|
|
if (event == IE_KEYDOWN)
|
2011-05-20 04:10:59 +00:00
|
|
|
{
|
|
|
|
switch(CVARF(cg_editor))
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
if (editor_lights_key(parama, paramb))
|
|
|
|
return true;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (editor_terrain_key(parama, paramb))
|
|
|
|
return true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-04-14 05:21:04 +00:00
|
|
|
else if (event == IE_MOUSEABS)
|
|
|
|
mousepos = [parama, paramb];
|
|
|
|
else if (event == IE_MOUSEDELTA)
|
|
|
|
{ //move it...
|
|
|
|
mousepos += [parama, paramb];
|
|
|
|
|
|
|
|
//bound it.
|
|
|
|
vector ssize = getviewprop(VF_SCREENVSIZE);
|
|
|
|
mousepos_x = bound(0, mousepos_x, ssize_x);
|
|
|
|
mousepos_y = bound(0, mousepos_y, ssize_y);
|
|
|
|
}
|
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
return Menu_InputEvent(event, parama, paramb);
|
|
|
|
};
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
void(float width, float height, float do2d) CSQC_UpdateView =
|
|
|
|
{
|
2011-05-20 04:10:59 +00:00
|
|
|
float hudtype = CVARF(cg_hudtype);
|
2008-10-16 22:00:54 +00:00
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
chasecam = CVARF(cg_thirdPerson);
|
|
|
|
if (getstatf(STAT_HEALTH) <= 0)
|
2008-10-16 22:00:54 +00:00
|
|
|
chasecam = 1;
|
|
|
|
|
|
|
|
clearscene();
|
|
|
|
|
2009-04-14 21:39:15 +00:00
|
|
|
//force fullscreen views (ignore viewsize).
|
|
|
|
setviewprop(VF_MIN, '0 0 0');
|
|
|
|
setviewprop(VF_SIZE_X, width);
|
|
|
|
setviewprop(VF_SIZE_Y, height);
|
2009-06-07 15:46:12 +00:00
|
|
|
#if 0
|
|
|
|
setviewprop(VF_MIN_X, width/2);
|
|
|
|
setviewprop(VF_MIN_Y, height/2);
|
|
|
|
setviewprop(VF_SIZE_X, width/2);
|
|
|
|
setviewprop(VF_SIZE_Y, height/2);
|
|
|
|
#endif
|
2011-05-20 04:10:59 +00:00
|
|
|
|
|
|
|
if (hudtype != 1)
|
|
|
|
{
|
|
|
|
setviewprop(VF_DRAWENGINESBAR, 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setviewprop(VF_DRAWENGINESBAR, 1);
|
|
|
|
}
|
2021-04-14 05:21:04 +00:00
|
|
|
setviewprop(VF_DRAWCROSSHAIR, !player_local || !checkbuiltin(project));
|
2011-05-20 04:10:59 +00:00
|
|
|
|
2009-04-14 21:39:15 +00:00
|
|
|
addentities(MASK_NORMAL|MASK_ENGINE);
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
if (player_local)
|
|
|
|
{
|
|
|
|
setviewprop(VF_ORIGIN, vieworg);
|
|
|
|
setviewprop(VF_ANGLES, view_angles);
|
|
|
|
|
|
|
|
makevectors(view_angles);
|
|
|
|
SetListener(vieworg, v_forward, v_right, v_up);
|
|
|
|
|
|
|
|
if (!chasecam)
|
2009-04-14 21:39:15 +00:00
|
|
|
{
|
2008-10-16 22:00:54 +00:00
|
|
|
CSQC_DrawViewModel(viewentity);
|
2009-04-14 21:39:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//engine didn't tell us about our player entity. that's not right...
|
|
|
|
addentities(MASK_ENGINEVIEWMODEL);
|
2008-10-16 22:00:54 +00:00
|
|
|
}
|
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
switch(CVARF(cg_editor))
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
/*add light ents*/
|
|
|
|
editor_lights_add();
|
|
|
|
hudtype = 0;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
renderscene();
|
2011-05-20 04:10:59 +00:00
|
|
|
|
2008-10-16 22:00:54 +00:00
|
|
|
if (do2d)
|
|
|
|
{
|
2011-05-20 04:10:59 +00:00
|
|
|
switch(CVARF(cg_editor))
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
/*add light ents*/
|
|
|
|
editor_lights_overlay();
|
|
|
|
hudtype = 0;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (hudtype)
|
|
|
|
Hud_Draw(hudtype, show_scoreboard, width, height);
|
2021-04-14 05:21:04 +00:00
|
|
|
//quicky `project` test
|
|
|
|
if (player_local)
|
|
|
|
{
|
|
|
|
if (checkbuiltin(project))
|
|
|
|
{
|
|
|
|
setviewprop(VF_DRAWCROSSHAIR, 0);
|
|
|
|
vector shotorg = player_local.origin+'0 0 16'; //quake is weird.
|
|
|
|
traceline(shotorg, shotorg + v_forward*8192, FALSE, player_local);
|
|
|
|
drawcharacter(project(trace_endpos)-'4 4', '+', '8 8', '1 1 1',1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (autocvar(cg_unprojecttest, FALSE))
|
|
|
|
{
|
|
|
|
static float nexttime;
|
|
|
|
nexttime += clframetime;
|
|
|
|
drawcharacter(mousepos-'4 4', '+', '8 8', '1 1 1',1);
|
|
|
|
if (nexttime > 1)
|
|
|
|
{
|
|
|
|
vector near = unproject([mousepos_x,mousepos_y,0]);
|
|
|
|
vector far = unproject([mousepos_x,mousepos_y,1]);
|
|
|
|
traceline(near, far, FALSE, player_local);
|
|
|
|
te_explosion(trace_endpos);
|
|
|
|
nexttime-=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-20 04:10:59 +00:00
|
|
|
break;
|
|
|
|
}
|
2008-10-16 22:00:54 +00:00
|
|
|
|
|
|
|
Menu_Think();
|
|
|
|
}
|
2009-06-07 15:46:12 +00:00
|
|
|
|
|
|
|
if (dbgstr)
|
|
|
|
{
|
2011-05-20 04:10:59 +00:00
|
|
|
// drawrawstring('16 64 0', dbgstr, '16 16 16', '1 1 1', 0.5);
|
|
|
|
// drawstring('16 80 0', dbgstr, '16 16 16', 0.5);
|
2009-06-07 15:46:12 +00:00
|
|
|
}
|
2008-10-16 22:00:54 +00:00
|
|
|
};
|
|
|
|
|