X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2FMain.qc;h=c7a66a8680271478e17323116cc577a02fec1272;hb=3a8bdd72b8ea8d11d5ce54c78a3b7a6afe2a7a05;hp=71cbbba7fc776fa948d4c3577bc4bb3ee6ab7440;hpb=d22bc9f10d71a13faf06446df3feaa577cdf22a7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 71cbbba7f..c7a66a868 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -2,6 +2,19 @@ // 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() { @@ -74,7 +87,6 @@ void ConsoleCommand_macro_init(); void CSQC_Init(void) { prvm_language = cvar_string("prvm_language"); - #ifdef USE_FTE #pragma target ID __engine_check = checkextension("DP_SV_WRITEPICTURE"); @@ -105,7 +117,7 @@ void CSQC_Init(void) 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; @@ -140,8 +152,8 @@ void CSQC_Init(void) 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(); @@ -165,7 +177,7 @@ void CSQC_Init(void) DamageInfo_Precache(); Vehicles_Precache(); turrets_precache(); - Announcer_Precache(); + Announcer_Precache(); Tuba_Precache(); if(autocvar_cl_reticle) @@ -197,9 +209,6 @@ void CSQC_Init(void) hud_configure_prev = -1; tab_panel = -1; - - precache_model("models/null.md3"); - draw_currentSkin = strzone(strcat("gfx/menu/", cvar_string("menu_skin"))); } @@ -662,7 +671,7 @@ void Ent_ReadAccuracy(void) 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) { @@ -674,6 +683,10 @@ void Ent_ReadAccuracy(void) else weapon_accuracy[w] = (b - 1.0) / 100.0; } + if(f == 0x800000) + f = 1; + else + f *= 2; } } @@ -688,6 +701,9 @@ void CSQC_Ent_Update(float bIsNewEntity) 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) @@ -709,6 +725,7 @@ void CSQC_Ent_Update(float bIsNewEntity) //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; } } @@ -755,7 +772,9 @@ void CSQC_Ent_Update(float bIsNewEntity) 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)); @@ -781,6 +800,14 @@ void Ent_Remove() // 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); @@ -790,24 +817,34 @@ void Gamemode_Init() { 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); } @@ -883,6 +920,7 @@ void Ent_Init() hagar_maxrockets = ReadByte(); g_trueaim_minrange = ReadCoord(); + g_balance_porto_secondary = ReadByte(); if(!postinit) PostInit(); @@ -1093,6 +1131,9 @@ float CSQC_Parse_TempEntity() 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) { @@ -1163,6 +1204,10 @@ float CSQC_Parse_TempEntity() 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;