X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2FMain.qc;h=d7130197e6e979e58843300f06a29f0b3ed79231;hb=9226d2a17f8329b6964cf4be5c5433e7e763c240;hp=23a15ac10a3a5bae71e830c8b0abba1adf638b54;hpb=8f0f47ad72cb8977d36e9690cd958f37825097d2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index 23a15ac10..d7130197e 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -149,14 +149,15 @@ void CSQC_Init(void) teams = Sort_Spawn(); players = Sort_Spawn(); - GetTeam(FL_SPECTATOR, true); // add specs first + GetTeam(NUM_SPECTATOR, true); // add specs first // needs to be done so early because of the constants they create CALL_ACCUMULATED_FUNCTION(RegisterWeapons); CALL_ACCUMULATED_FUNCTION(RegisterGametypes); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); - + CALL_ACCUMULATED_FUNCTION(RegisterHUD_Panels); + WaypointSprite_Load(); // precaches @@ -179,7 +180,6 @@ void CSQC_Init(void) DamageInfo_Precache(); Vehicles_Precache(); turrets_precache(); - Announcer_Precache(); Tuba_Precache(); CSQCPlayer_Precache(); @@ -209,8 +209,8 @@ void CSQC_Init(void) WarpZone_Init(); + hud_skin_path = strzone(strcat("gfx/hud/", autocvar_hud_skin)); hud_configure_prev = -1; - tab_panel = -1; draw_currentSkin = strzone(strcat("gfx/menu/", cvar_string("menu_skin"))); } @@ -262,16 +262,16 @@ float SetTeam(entity o, float Team) switch(Team) { case -1: - case FL_TEAM_1: - case FL_TEAM_2: - case FL_TEAM_3: - case FL_TEAM_4: + case NUM_TEAM_1: + case NUM_TEAM_2: + case NUM_TEAM_3: + case NUM_TEAM_4: break; default: if(GetTeam(Team, false) == world) { print(sprintf(_("trying to switch to unsupported team %d\n"), Team)); - Team = FL_SPECTATOR; + Team = NUM_SPECTATOR; } break; } @@ -287,7 +287,7 @@ float SetTeam(entity o, float Team) if(GetTeam(Team, false) == world) { print(sprintf(_("trying to switch to unsupported team %d\n"), Team)); - Team = FL_SPECTATOR; + Team = NUM_SPECTATOR; } break; } @@ -446,6 +446,7 @@ void Ent_ReadEntCS() entcs_receiver[self.sv_entnum] = self; self.entremove = Ent_RemoveEntCS; + self.iflags |= IFLAG_ORIGIN; InterpolateOrigin_Note(); } @@ -479,8 +480,8 @@ void Ent_ReadPlayerScore() #ifdef DP_CSQC_ENTITY_REMOVE_IS_B0RKED if(!isNew && n != self.sv_entnum) { - //print(_("A CSQC entity changed its owner!\n")); - print(sprintf(_("A CSQC entity changed its owner! (edict: %d, classname: %s)\n"), num_for_edict(self), self.classname)); + //print("A CSQC entity changed its owner!\n"); + print(sprintf("A CSQC entity changed its owner! (edict: %d, classname: %s)\n", num_for_edict(self), self.classname)); isNew = true; Ent_Remove(); self.enttype = ENT_CLIENT_SCORES; @@ -695,6 +696,108 @@ void Ent_ReadAccuracy(void) } } +void Spawn_Draw(void) +{ + pointparticles(self.cnt, self.origin + '0 0 28', '0 0 2', bound(0, frametime, 0.1)); +} + +void Ent_ReadSpawnPoint(float is_new) // entity for spawnpoint +{ + float teamnum = (ReadByte() - 1); + vector spn_origin; + spn_origin_x = ReadShort(); + spn_origin_y = ReadShort(); + spn_origin_z = ReadShort(); + + if(is_new) + { + self.origin = spn_origin; + setsize(self, PL_MIN, PL_MAX); + droptofloor(); + + /*if(autocvar_cl_spawn_point_model) // needs a model first + { + self.mdl = "models/spawnpoint.md3"; + self.colormod = Team_ColorRGB(teamnum); + precache_model(self.mdl); + setmodel(self, self.mdl); + self.drawmask = MASK_NORMAL; + //self.movetype = MOVETYPE_NOCLIP; + //self.draw = Spawn_Draw; + }*/ + if(autocvar_cl_spawn_point_particles) + { + if((serverflags & SERVERFLAG_TEAMPLAY)) + { + switch(teamnum) + { + case NUM_TEAM_1: self.cnt = particleeffectnum("spawn_point_red"); break; + case NUM_TEAM_2: self.cnt = particleeffectnum("spawn_point_blue"); break; + case NUM_TEAM_3: self.cnt = particleeffectnum("spawn_point_yellow"); break; + case NUM_TEAM_4: self.cnt = particleeffectnum("spawn_point_pink"); break; + default: self.cnt = particleeffectnum("spawn_point_neutral"); break; + } + } + else { self.cnt = particleeffectnum("spawn_point_neutral"); } + + self.draw = Spawn_Draw; + } + } + + //print(sprintf("Ent_ReadSpawnPoint(is_new = %d); origin = %s, team = %d, effect = %d\n", is_new, vtos(self.origin), teamnum, self.cnt)); +} + +void Ent_ReadSpawnEvent(float is_new) +{ + // If entnum is 0, ONLY do the local spawn actions + // this way the server can disable the sending of + // spawn origin or such to clients if wanted. + float entnum = ReadByte(); + + if(entnum) + { + self.origin_x = ReadShort(); + self.origin_y = ReadShort(); + self.origin_z = ReadShort(); + + if(is_new) + { + float teamnum = GetPlayerColor(entnum - 1); + + if(autocvar_cl_spawn_event_particles) + { + switch(teamnum) + { + case NUM_TEAM_1: pointparticles(particleeffectnum("spawn_event_red"), self.origin, '0 0 0', 1); break; + case NUM_TEAM_2: pointparticles(particleeffectnum("spawn_event_blue"), self.origin, '0 0 0', 1); break; + case NUM_TEAM_3: pointparticles(particleeffectnum("spawn_event_yellow"), self.origin, '0 0 0', 1); break; + case NUM_TEAM_4: pointparticles(particleeffectnum("spawn_event_pink"), self.origin, '0 0 0', 1); break; + default: pointparticles(particleeffectnum("spawn_event_neutral"), self.origin, '0 0 0', 1); break; + } + } + if(autocvar_cl_spawn_event_sound) + { + sound(self, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM); + } + } + } + + // local spawn actions + if(is_new && (!entnum || (entnum == player_localentnum))) + { + zoomin_effect = 1; + current_viewzoom = (1 / bound(1, autocvar_cl_spawnzoom_factor, 16)); + + if(autocvar_cl_unpress_zoom_on_spawn) + { + localcmd("-zoom\n"); + button_zoom = FALSE; + } + } + + //print(sprintf("Ent_ReadSpawnEvent(is_new = %d); origin = %s, entnum = %d, localentnum = %d\n", is_new, vtos(self.origin), entnum, player_localentnum)); +} + // CSQC_Ent_Update : Called every frame that the server has indicated an update to the SSQC / CSQC entity has occured. // The only parameter reflects if the entity is "new" to the client, meaning it just came into the client's PVS. void Ent_RadarLink(); @@ -727,8 +830,8 @@ void CSQC_Ent_Update(float bIsNewEntity) { if(t != self.enttype || 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)); + //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; @@ -738,7 +841,7 @@ void CSQC_Ent_Update(float bIsNewEntity) { if(!bIsNewEntity) { - print(sprintf(_("A CSQC entity appeared out of nowhere! (edict: %d, server: %d, type: %d)\n"), num_for_edict(self), self.entnum, t)); + print(sprintf("A CSQC entity appeared out of nowhere! (edict: %d, server: %d, type: %d)\n", num_for_edict(self), self.entnum, t)); bIsNewEntity = 1; } } @@ -772,7 +875,8 @@ void CSQC_Ent_Update(float bIsNewEntity) case ENT_CLIENT_WARPZONE_TELEPORTED: WarpZone_Teleported_Read(bIsNewEntity); break; case ENT_CLIENT_TRIGGER_MUSIC: Ent_ReadTriggerMusic(); break; case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break; - case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break; + case ENT_CLIENT_ELECTRO_BEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_ELECTRO_BEAM); break; + case ENT_CLIENT_LIGHTNING_BEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LIGHTNING_BEAM); break; case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break; case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break; case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break; @@ -780,7 +884,10 @@ void CSQC_Ent_Update(float bIsNewEntity) 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; + case ENT_CLIENT_SPAWNPOINT: Ent_ReadSpawnPoint(bIsNewEntity); break; + case ENT_CLIENT_SPAWNEVENT: Ent_ReadSpawnEvent(bIsNewEntity); break; case ENT_CLIENT_NOTIFICATION: Read_Notification(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)); @@ -910,6 +1017,10 @@ void Ent_Init() electro_shotorigin[1] = decompressShotOrigin(ReadInt24_t()); electro_shotorigin[2] = decompressShotOrigin(ReadInt24_t()); electro_shotorigin[3] = decompressShotOrigin(ReadInt24_t()); + lightning_shotorigin[0] = decompressShotOrigin(ReadInt24_t()); + lightning_shotorigin[1] = decompressShotOrigin(ReadInt24_t()); + lightning_shotorigin[2] = decompressShotOrigin(ReadInt24_t()); + lightning_shotorigin[3] = decompressShotOrigin(ReadInt24_t()); gauntlet_shotorigin[0] = decompressShotOrigin(ReadInt24_t()); gauntlet_shotorigin[1] = decompressShotOrigin(ReadInt24_t()); gauntlet_shotorigin[2] = decompressShotOrigin(ReadInt24_t()); @@ -921,8 +1032,6 @@ void Ent_Init() armorblockpercent = ReadByte() / 255.0; - g_weaponswitchdelay = ReadByte() / 255.0; - g_balance_grenadelauncher_bouncefactor = ReadCoord(); g_balance_grenadelauncher_bouncestop = ReadCoord(); g_balance_electro_secondary_bouncefactor = ReadCoord(); @@ -1100,12 +1209,6 @@ void Net_ReadRace() } } -void Net_ReadSpawn() -{ - zoomin_effect = 1; - current_viewzoom = (1 / bound(1, autocvar_cl_spawnzoom_factor, 16)); -} - void Net_TeamNagger() { teamnagger = 1; @@ -1125,7 +1228,8 @@ void Net_ReadPingPLReport() playerslots[e].ping_movementloss = ml / 255.0; } -void Net_WeaponComplain() { +void Net_WeaponComplain() +{ complain_weapon = ReadByte(); if(complain_weapon_name) @@ -1136,6 +1240,13 @@ void Net_WeaponComplain() { complain_weapon_time = time; weapontime = time; // ping the weapon panel + + switch(complain_weapon_type) + { + case 0: Local_Notification(MSG_MULTI, ITEM_WEAPON_NOAMMO, complain_weapon); break; + case 1: Local_Notification(MSG_MULTI, ITEM_WEAPON_DONTHAVE, complain_weapon); break; + default: Local_Notification(MSG_MULTI, ITEM_WEAPON_UNAVAILABLE, complain_weapon); break; + } } // CSQC_Parse_TempEntity : Handles all temporary entity network data in the CSQC layer. @@ -1167,10 +1278,6 @@ float CSQC_Parse_TempEntity() Net_ReadRace(); bHandled = true; break; - case TE_CSQC_SPAWN: - Net_ReadSpawn(); - bHandled = true; - break; case TE_CSQC_ZCURVEPARTICLES: Net_ReadZCurveParticles(); bHandled = true; @@ -1191,25 +1298,6 @@ float CSQC_Parse_TempEntity() Net_ReadPingPLReport(); bHandled = true; break; - case TE_CSQC_ANNOUNCE: - Announcer_Play(ReadString()); - bHandled = true; - break; - case TE_CSQC_KILLNOTIFY: - HUD_KillNotify(ReadString(), ReadString(), ReadString(), ReadShort(), ReadByte()); - bHandled = true; - break; - case TE_CSQC_CENTERPRINT_GENERIC: - float id; - string s; - id = ReadByte(); - s = ReadString(); - if (id != 0 && s != "") - centerprint_generic(id, s, ReadByte(), ReadByte()); - else - centerprint_generic(id, s, 0, 0); - bHandled = true; - break; case TE_CSQC_WEAPONCOMPLAIN: Net_WeaponComplain(); bHandled = true;