// BEGIN REQUIRED CSQC FUNCTIONS
//include "main.qh"
+entity clearentity_ent;
+void clearentity(entity e)
+{
+ if not(clearentity_ent)
+ {
+ clearentity_ent = spawn();
+ clearentity_ent.classname = "clearentity";
+ }
+ float n = e.entnum;
+ copyentity(clearentity_ent, e);
+ e.entnum = n;
+}
+
#define DP_CSQC_ENTITY_REMOVE_IS_B0RKED
void menu_show_error()
{
void CSQC_Init(void)
{
prvm_language = cvar_string("prvm_language");
-
#ifdef USE_FTE
#pragma target ID
__engine_check = checkextension("DP_SV_WRITEPICTURE");
check_unacceptable_compiler_bugs();
#ifdef WATERMARK
- print(sprintf(_("^4CSQC Build information: ^1%s\n"), WATERMARK()));
+ print(sprintf(_("^4CSQC Build information: ^1%s\n"), WATERMARK));
#endif
float i;
ClientProgsDB = db_load("client.db");
compressShortVector_init();
- drawfont = FONT_USER+1;
+ draw_endBoldFont();
menu_visible = FALSE;
menu_show = menu_show_error;
- menu_action = menu_sub_null;
+ menu_action = func_null;
for(i = 0; i < 255; ++i)
if(getplayerkeyvalue(i, "viewentity") == "")
GetTeam(COLOR_SPECTATOR, true); // add specs first
// needs to be done so early because of the constants they create
- RegisterWeapons();
- RegisterGametypes();
+ CALL_ACCUMULATED_FUNCTION(RegisterWeapons);
+ CALL_ACCUMULATED_FUNCTION(RegisterGametypes);
WaypointSprite_Load();
DamageInfo_Precache();
Vehicles_Precache();
turrets_precache();
- Announcer_Precache();
+ Announcer_Precache();
Tuba_Precache();
+ CSQCPlayer_Precache();
if(autocvar_cl_reticle)
{
// CSQC_InputEvent : Used to perform actions based on any key pressed, key released and mouse on the client.
// Return value should be 1 if CSQC handled the input, otherwise return 0 to have the input passed to the engine.
// All keys are in ascii.
-// bInputType = 0 is key pressed, 1 is key released, 2 is mouse input.
+// bInputType = 0 is key pressed, 1 is key released, 2 and 3 are mouse input.
// In the case of keyboard input, nPrimary is the ascii code, and nSecondary is 0.
// In the case of mouse input, nPrimary is xdelta, nSecondary is ydelta.
+// In the case of mouse input after a setcursormode(1) call, nPrimary is xpos, nSecondary is ypos.
float CSQC_InputEvent(float bInputType, float nPrimary, float nSecondary)
{
float bSkipKey;
if (MapVote_InputEvent(bInputType, nPrimary, nSecondary))
return true;
- if(menu_visible)
+ if(menu_visible && menu_action)
if(menu_action(bInputType, nPrimary, nSecondary))
return TRUE;
self.origin_x = ReadShort();
self.origin_y = ReadShort();
self.origin_z = ReadShort();
+ setorigin(self, self.origin);
}
if(sf & 4)
{
return;
}
- for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
+ for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w)
{
if(sf & f)
{
else
weapon_accuracy[w] = (b - 1.0) / 100.0;
}
+ if(f == 0x800000)
+ f = 1;
+ else
+ f *= 2;
}
}
float savetime;
t = ReadByte();
+ if(autocvar_developer_csqcentities)
+ print(sprintf("CSQC_Ent_Update(%d) with self=%i self.entnum=%d self.enttype=%d t=%d\n", bIsNewEntity, self, self.entnum, self.enttype, t));
+
// set up the "time" global for received entities to be correct for interpolation purposes
savetime = time;
if(servertime)
//print(_("A CSQC entity changed its type!\n"));
print(sprintf(_("A CSQC entity changed its type! (edict: %d, server: %d, type: %d -> %d)\n"), num_for_edict(self), self.entnum, self.enttype, t));
Ent_Remove();
+ clearentity(self);
bIsNewEntity = 1;
}
}
case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
case ENT_CLIENT_TURRET: ent_turret(); break;
- case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break;
+ case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break;
+ case ENT_CLIENT_ITEM: ItemRead(bIsNewEntity); break;
+ case ENT_CLIENT_BUMBLE_RAYGUN: bumble_raygun_read(bIsNewEntity); break;
default:
//error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
error(sprintf(_("Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %s)\n"), self.enttype, num_for_edict(self), self.classname));
if(self.entremove)
self.entremove();
+ if(self.skeletonindex)
+ {
+ skel_delete(self.skeletonindex);
+ self.skeletonindex = 0;
+ }
+
+ if(self.snd_looping > 0)
+ {
+ sound(self, self.snd_looping, "misc/null.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+ self.snd_looping = 0;
+ }
+
self.enttype = 0;
self.classname = "";
self.draw = menu_sub_null;
// CSQC_Ent_Remove : Called when the server requests a SSQC / CSQC entity to be removed. Essentially call remove(self) as well.
void CSQC_Ent_Remove()
{
+ if(autocvar_developer_csqcentities)
+ print(sprintf("CSQC_Ent_Remove() with self=%i self.entnum=%d self.enttype=%d\n", self, self.entnum, self.enttype));
+
+ if(wasfreed(self))
+ {
+ print("WARNING: CSQC_Ent_Remove called for already removed entity. Packet loss?\n");
+ return;
+ }
if(self.enttype)
Ent_Remove();
remove(self);
{
if not(isdemo())
{
- localcmd("\n_cl_hook_gamestart ", MapInfo_Type_ToString(gametype), "\n");
+ if(!(calledhooks & HOOK_START))
+ localcmd("\n_cl_hook_gamestart ", MapInfo_Type_ToString(gametype), "\n");
calledhooks |= HOOK_START;
}
}
// CSQC_Parse_StuffCmd : Provides the stuffcmd string in the first parameter that the server provided. To execute standard behavior, simply execute localcmd with the string.
void CSQC_Parse_StuffCmd(string strMessage)
{
+ if(autocvar_developer_csqcentities)
+ print(sprintf("CSQC_Parse_StuffCmd(\"%s\")\n", strMessage));
+
localcmd(strMessage);
}
// CSQC_Parse_Print : Provides the print string in the first parameter that the server provided. To execute standard behavior, simply execute print with the string.
void CSQC_Parse_Print(string strMessage)
{
+ if(autocvar_developer_csqcentities)
+ print(sprintf("CSQC_Parse_Print(\"%s\")\n", strMessage));
+
print(ColorTranslateRGB(strMessage));
}
// CSQC_Parse_CenterPrint : Provides the centerprint_hud string in the first parameter that the server provided.
void CSQC_Parse_CenterPrint(string strMessage)
{
+ if(autocvar_developer_csqcentities)
+ print(sprintf("CSQC_Parse_CenterPrint(\"%s\")\n", strMessage));
+
centerprint_hud(strMessage);
}
hagar_maxrockets = ReadByte();
g_trueaim_minrange = ReadCoord();
+ g_balance_porto_secondary = ReadByte();
if(!postinit)
PostInit();
void Net_ReadSpawn()
{
zoomin_effect = 1;
- current_viewzoom = 0.6;
+ current_viewzoom = (1 / bound(1, autocvar_cl_spawnzoom_factor, 16));
}
void Net_TeamNagger()
float nTEID;
nTEID = ReadByte();
+ if(autocvar_developer_csqcentities)
+ print(sprintf("CSQC_Parse_TempEntity() with nTEID=%d\n", nTEID));
+
// NOTE: Could just do return instead of break...
switch(nTEID)
{
Net_VehicleSetup();
bHandled = true;
break;
+ case TE_CSQC_SVNOTICE:
+ cl_notice_read();
+ bHandled = true;
+ break;
default:
// No special logic for this temporary entity; return 0 so the engine can handle it
bHandled = false;
string getcommandkey(string text, string command)
{
string keys;
- float n, j, k, l;
+ float n, j, k, l = 0;
if (!autocvar_hud_showbinds)
return text;
keys = db_get(binddb, command);
- if (!keys)
+ if (keys == "")
{
n = tokenize(findkeysforcommand(command, 0)); // uses '...' strings
for(j = 0; j < n; ++j)
keys = strcat(keys, ", ", keynumtostring(k));
++l;
- if (autocvar_hud_showbinds_limit > 0 && autocvar_hud_showbinds_limit >= l) break;
+ if (autocvar_hud_showbinds_limit > 0 && autocvar_hud_showbinds_limit <= l)
+ break;
}
}
+ if (keys == "")
+ keys = "NO_KEY";
db_put(binddb, command, keys);
}
- if ("" == keys) {
+ if (keys == "NO_KEY") {
if (autocvar_hud_showbinds > 1)
return sprintf(_("%s (not bound)"), text);
else