X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fclient.qc;h=513a79678075668f3753857df65fd0716ee1a961;hb=050fb0011ae5fb2b36c7c7f3d560f9453807a8ab;hp=aa19f060e4298ad2c239fd0da3179964796c01a5;hpb=5eff9f77362d5e4e55390e34c0ccd4abd2b66b93;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index aa19f060e..513a79678 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -110,9 +110,9 @@ bool ClientData_Send(entity this, entity to, int sf) if (IS_SPEC(e)) e = e.enemy; sf = 0; - if (e.race_completed) sf |= 1; // forced scoreboard - if (to.spectatee_status) sf |= 2; // spectator ent number follows - if (e.zoomstate) sf |= 4; // zoomed + if (CS(e).race_completed) sf |= 1; // forced scoreboard + if (CS(to).spectatee_status) sf |= 2; // spectator ent number follows + if (CS(e).zoomstate) sf |= 4; // zoomed if (autocvar_sv_showspectators) sf |= 16; // show spectators WriteHeader(MSG_ENTITY, ENT_CLIENT_CLIENTDATA); @@ -120,7 +120,7 @@ bool ClientData_Send(entity this, entity to, int sf) if (sf & 2) { - WriteByte(MSG_ENTITY, to.spectatee_status); + WriteByte(MSG_ENTITY, CS(to).spectatee_status); } if(sf & 16) @@ -135,27 +135,25 @@ bool ClientData_Send(entity this, entity to, int sf) void ClientData_Attach(entity this) { - Net_LinkEntity(this.clientdata = new_pure(clientdata), false, 0, ClientData_Send); - this.clientdata.drawonlytoclient = this; - this.clientdata.owner = this; + Net_LinkEntity(CS(this).clientdata = new_pure(clientdata), false, 0, ClientData_Send); + CS(this).clientdata.drawonlytoclient = this; + CS(this).clientdata.owner = this; } void ClientData_Detach(entity this) { - delete(this.clientdata); - this.clientdata = NULL; + delete(CS(this).clientdata); + CS(this).clientdata = NULL; } void ClientData_Touch(entity e) { - e.clientdata.SendFlags = 1; + CS(e).clientdata.SendFlags = 1; // make it spectatable - FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != e && IS_SPEC(it) && it.enemy == e, LAMBDA(it.clientdata.SendFlags = 1)); + FOREACH_CLIENT(IS_REAL_CLIENT(it) && it != e && IS_SPEC(it) && it.enemy == e, LAMBDA(CS(it).clientdata.SendFlags = 1)); } -.string netname_previous; - void SetSpectatee(entity this, entity spectatee); void SetSpectatee_status(entity this, int spectatee_num); @@ -227,12 +225,10 @@ void PutObserverInServer(entity this) { entity spot = SelectSpawnPoint(this, true); if (!spot) LOG_FATAL("No spawnpoints for observers?!?"); - this.angles = spot.angles; - this.angles_z = 0; + this.angles = vec2(spot.angles); this.fixangle = true; // offset it so that the spectator spawns higher off the ground, looks better this way setorigin(this, spot.origin + STAT(PL_VIEW_OFS, this)); - this.prevorigin = this.origin; if (IS_REAL_CLIENT(this)) { msg_entity = this; @@ -271,27 +267,29 @@ void PutObserverInServer(entity this) if (mutator_returnvalue) { // mutator prevents resetting teams+score } else { + int oldteam = this.team; this.team = -1; // move this as it is needed to log the player spectating in eventlog + MUTATOR_CALLHOOK(Player_ChangedTeam, this, oldteam, this.team); this.frags = FRAGS_SPECTATOR; PlayerScore_Clear(this); // clear scores when needed } - if (this.killcount != FRAGS_SPECTATOR) + if (CS(this).killcount != FRAGS_SPECTATOR) { Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_QUIT_SPECTATE, this.netname); if(!game_stopped) if(autocvar_g_chat_nospectators == 1 || (!warmup_stage && autocvar_g_chat_nospectators == 2)) Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_CHAT_NOSPECTATORS); - if(this.just_joined == false) { + if(!CS(this).just_joined) LogTeamchange(this.playerid, -1, 4); - } else - this.just_joined = false; + else + CS(this).just_joined = false; } accuracy_resend(this); - this.spectatortime = time; + CS(this).spectatortime = time; if(this.bot_attack) IL_REMOVE(g_bot_targets, this); this.bot_attack = false; @@ -338,7 +336,6 @@ void PutObserverInServer(entity this) this.items = 0; this.weapons = '0 0 0'; - this.dual_weapons = '0 0 0'; this.drawonlytoclient = this; this.weaponmodel = ""; @@ -347,7 +344,7 @@ void PutObserverInServer(entity this) this.weaponentities[slot] = NULL; } this.exteriorweaponentity = NULL; - this.killcount = FRAGS_SPECTATOR; + CS(this).killcount = FRAGS_SPECTATOR; this.velocity = '0 0 0'; this.avelocity = '0 0 0'; this.punchangle = '0 0 0'; @@ -402,7 +399,7 @@ void FixPlayermodel(entity player) int n = tokenize_console(defaultmodel); if(n > 0) { - defaultmodel = argv(floor(n * player.model_randomizer)); + defaultmodel = argv(floor(n * CS(player).model_randomizer)); // However, do NOT randomize if the player-selected model is in the list. for (int i = 0; i < n; ++i) if ((argv(i) == player.playermodel && defaultskin == stof(player.playerskin)) || argv(i) == strcat(player.playermodel, ":", player.playerskin)) @@ -506,7 +503,7 @@ void PutPlayerInServer(entity this) TRANSMUTE(Player, this); - this.wasplayer = true; + CS(this).wasplayer = true; this.iscreature = true; this.teleportable = TELEPORT_NORMAL; if(!this.damagedbycontents) @@ -551,7 +548,7 @@ void PutPlayerInServer(entity this) } SetSpectatee_status(this, 0); - this.dual_weapons = '0 0 0'; + PS(this).dual_weapons = '0 0 0'; this.superweapons_finished = (this.weapons & WEPSET_SUPERWEAPONS) ? time + autocvar_g_balance_superweapons_time : 0; @@ -583,7 +580,7 @@ void PutPlayerInServer(entity this) setthink(this, func_null); // players have no think function this.nextthink = 0; this.dmg_team = 0; - this.ballistics_density = autocvar_g_ballistics_density_player; + PS(this).ballistics_density = autocvar_g_ballistics_density_player; this.deadflag = DEAD_NO; @@ -624,7 +621,6 @@ void PutPlayerInServer(entity this) setorigin(this, spot.origin + '0 0 1' * (1 - this.mins.z - 24)); // don't reset back to last position, even if new position is stuck in solid this.oldorigin = this.origin; - this.prevorigin = this.origin; this.lastteleporttime = time; // prevent insane speeds due to changing origin if(this.conveyor) IL_REMOVE(g_conveyed, this); @@ -643,9 +639,9 @@ void PutPlayerInServer(entity this) PHYS_INPUT_BUTTON_ATCK(this) = PHYS_INPUT_BUTTON_JUMP(this) = PHYS_INPUT_BUTTON_ATCK2(this) = false; - if (this.killcount == FRAGS_SPECTATOR) { + if (CS(this).killcount == FRAGS_SPECTATOR) { PlayerScore_Clear(this); - this.killcount = 0; + CS(this).killcount = 0; } for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) @@ -731,7 +727,8 @@ void PutClientInServer(entity this) SetSpectatee(this, NULL); // reset player keys - this.itemkeys = 0; + if(PS(this)) + PS(this).itemkeys = 0; MUTATOR_CALLHOOK(PutClientInServer, this); @@ -777,6 +774,7 @@ void ClientInit_misc(entity this) else WriteString(channel, ""); WriteByte(channel, this.count * 255.0); // g_balance_armor_blockpercent + WriteByte(channel, this.cnt * 255.0); // g_balance_damagepush_speedfactor WriteByte(channel, serverflags); WriteCoord(channel, autocvar_g_trueaim_minrange); } @@ -789,6 +787,11 @@ void ClientInit_CheckUpdate(entity this) this.count = autocvar_g_balance_armor_blockpercent; this.SendFlags |= 1; } + if(this.cnt != autocvar_g_balance_damagepush_speedfactor) + { + this.cnt = autocvar_g_balance_damagepush_speedfactor; + this.SendFlags |= 1; + } } void ClientInit_Spawn() @@ -890,8 +893,10 @@ void ClientKill_Now(entity this) if(CS(this).killindicator_teamchange) ClientKill_Now_TeamChange(this); - if(!IS_SPEC(this) && !IS_OBSERVER(this)) + if (!IS_SPEC(this) && !IS_OBSERVER(this) && MUTATOR_CALLHOOK(ClientKill_Now, this) == false) + { Damage(this, this, this, 100000, DEATH_KILL.m_id, this.origin, '0 0 0'); + } // now I am sure the player IS dead } @@ -1055,6 +1060,9 @@ void FixClientCvars(entity e) bool findinlist_abbrev(string tofind, string list) { + if(list == "" || tofind == "") + return false; // empty list or search, just return + // this function allows abbreviated strings! FOREACH_WORD(list, it == substring(tofind, 0, strlen(it)), { @@ -1084,7 +1092,7 @@ bool PlayerInIDList(entity p, string idlist) bool PlayerInList(entity player, string list) { - return PlayerInIDList(player, list) || PlayerInIPList(player, list); + return boolean(PlayerInIDList(player, list) || PlayerInIPList(player, list)); } #ifdef DP_EXT_PRECONNECT @@ -1125,8 +1133,8 @@ void ClientConnect(entity this) #ifdef WATERMARK Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_WATERMARK, WATERMARK); #endif - this.version_nagtime = time + 10 + random() * 10; TRANSMUTE(Client, this); + CS(this).version_nagtime = time + 10 + random() * 10; // identify the right forced team if (autocvar_g_campaign) @@ -1189,9 +1197,9 @@ void ClientConnect(entity this) LogTeamchange(this.playerid, this.team, 1); - this.just_joined = true; // stop spamming the eventlog with additional lines when the client connects + CS(this).just_joined = true; // stop spamming the eventlog with additional lines when the client connects - this.netname_previous = strzone(this.netname); + CS(this).netname_previous = strzone(this.netname); if(teamplay && IS_PLAYER(this)) Send_Notification(NOTIF_ALL, NULL, MSG_INFO, APP_TEAM_NUM(this.team, INFO_JOIN_CONNECT_TEAM), this.netname); @@ -1224,14 +1232,14 @@ void ClientConnect(entity this) bot_relinkplayerlist(); - this.spectatortime = time; + CS(this).spectatortime = time; if (blockSpectators) { Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_SPECTATE_WARNING, autocvar_g_maxplayers_spectator_blocktime); } CS(this).jointime = time; - this.allowed_timeouts = autocvar_sv_timeout_number; + CS(this).allowed_timeouts = autocvar_sv_timeout_number; if (IS_REAL_CLIENT(this)) { @@ -1248,15 +1256,13 @@ void ClientConnect(entity this) CSQCMODEL_AUTOINIT(this); - this.model_randomizer = random(); + CS(this).model_randomizer = random(); if (IS_REAL_CLIENT(this)) sv_notice_join(this); // update physics stats (players can spawn before physics runs) - STAT(MOVEVARS_HIGHSPEED, this) = autocvar_g_movement_highspeed; - MUTATOR_CALLHOOK(PlayerPhysics_UpdateStats, this); // do it BEFORE the function so we can modify highspeed! - Physics_UpdateStats(this, PHYS_HIGHSPEED(this)); + Physics_UpdateStats(this); IL_EACH(g_initforplayer, it.init_for_player, { it.init_for_player(it, this); @@ -1288,7 +1294,7 @@ void ClientDisconnect(entity this) PlayerStats_GameReport_FinalizePlayer(this); if (this.vehicle) vehicles_exit(this.vehicle, VHEF_RELEASE); - if (this.active_minigame) part_minigame(this); + if (CS(this).active_minigame) part_minigame(this); if (IS_PLAYER(this)) Send_Effect(EFFECT_SPAWN_NEUTRAL, this.origin, '0 0 0', 1); if (autocvar_sv_eventlog) @@ -1301,6 +1307,7 @@ void ClientDisconnect(entity this) MUTATOR_CALLHOOK(ClientDisconnect, this); + if (CS(this).netname_previous) strunzone(CS(this).netname_previous); // needs to be before the CS entity is removed! ClientState_detach(this); Portal_ClearAll(this); @@ -1320,7 +1327,6 @@ void ClientDisconnect(entity this) bot_relinkplayerlist(); - if (this.netname_previous) strunzone(this.netname_previous); if (this.clientstatus) strunzone(this.clientstatus); if (this.weaponorder_byimpulse) strunzone(this.weaponorder_byimpulse); if (this.personal) delete(this.personal); @@ -1347,7 +1353,7 @@ void ChatBubbleThink(entity this) if ( !IS_DEAD(this.owner) && IS_PLAYER(this.owner) ) { - if ( this.owner.active_minigame ) + if ( CS(this.owner).active_minigame ) this.mdl = "models/sprites/minigame_busy.iqm"; else if (PHYS_INPUT_BUTTON_CHAT(this.owner)) this.mdl = "models/misc/chatbubble.spr"; @@ -1661,9 +1667,9 @@ void player_regen(entity this) bool zoomstate_set; void SetZoomState(entity this, float newzoom) { - if(newzoom != this.zoomstate) + if(newzoom != CS(this).zoomstate) { - this.zoomstate = newzoom; + CS(this).zoomstate = newzoom; ClientData_Touch(this); } zoomstate_set = true; @@ -1720,7 +1726,6 @@ void SpectateCopy(entity this, entity spectatee) this.superweapons_finished = spectatee.superweapons_finished; STAT(PRESSED_KEYS, this) = STAT(PRESSED_KEYS, spectatee); this.weapons = spectatee.weapons; - this.dual_weapons = spectatee.dual_weapons; this.vortex_charge = spectatee.vortex_charge; this.vortex_chargepool_ammo = spectatee.vortex_chargepool_ammo; this.hagar_load = spectatee.hagar_load; @@ -1741,7 +1746,7 @@ void SpectateCopy(entity this, entity spectatee) this.fixangle = true; setorigin(this, spectatee.origin); setsize(this, spectatee.mins, spectatee.maxs); - SetZoomState(this, spectatee.zoomstate); + SetZoomState(this, CS(spectatee).zoomstate); for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { @@ -1821,10 +1826,10 @@ bool SpectateSet(entity this) void SetSpectatee_status(entity this, int spectatee_num) { - int oldspectatee_status = this.spectatee_status; - this.spectatee_status = spectatee_num; + int oldspectatee_status = CS(this).spectatee_status; + CS(this).spectatee_status = spectatee_num; - if (this.spectatee_status != oldspectatee_status) + if (CS(this).spectatee_status != oldspectatee_status) { ClientData_Touch(this); if (g_race || g_cts) race_InitSpectator(); @@ -1956,7 +1961,7 @@ void ShowRespawnCountdown(entity this) .bool team_selected; bool ShowTeamSelection(entity this) { - if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || this.team_selected || (this.wasplayer && autocvar_g_changeteam_banned) || this.team_forced > 0) + if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || this.team_selected || (CS(this).wasplayer && autocvar_g_changeteam_banned) || this.team_forced > 0) return false; stuffcmd(this, "menu_showteamselect\n"); return true; @@ -2042,7 +2047,7 @@ void checkSpectatorBlock(entity this) if(!this.caplayer) if(IS_REAL_CLIENT(this)) { - if( time > (this.spectatortime + autocvar_g_maxplayers_spectator_blocktime) ) { + if( time > (CS(this).spectatortime + autocvar_g_maxplayers_spectator_blocktime) ) { Send_Notification(NOTIF_ONE_ONLY, this, MSG_INFO, INFO_QUIT_KICK_SPECTATING); dropclient(this); } @@ -2098,7 +2103,7 @@ void PrintWelcomeMessage(entity this) bool joinAllowed(entity this) { - if (this.version_mismatch) return false; + if (CS(this).version_mismatch) return false; if (!nJoinAllowed(this, this)) return false; if (teamplay && lockteams) return false; if (ShowTeamSelection(this)) return false; @@ -2109,8 +2114,6 @@ bool joinAllowed(entity this) .int items_added; bool PlayerThink(entity this) { - CheckRules_Player(this); - if (game_stopped || intermission_running) { this.modelflags &= ~MF_ROCKET; if(intermission_running) @@ -2204,8 +2207,6 @@ bool PlayerThink(entity this) return false; } - this.prevorigin = this.origin; - bool have_hook = false; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { @@ -2263,7 +2264,7 @@ bool PlayerThink(entity this) } this.items_added = 0; - if (this.items & ITEM_Jetpack.m_itemid && (this.items & ITEM_JetpackRegen.m_itemid || this.ammo_fuel >= 0.01)) + if ((this.items & ITEM_Jetpack.m_itemid) && ((this.items & ITEM_JetpackRegen.m_itemid) || this.ammo_fuel >= 0.01)) this.items_added |= IT_FUEL; this.items |= this.items_added; @@ -2305,7 +2306,7 @@ void ObserverThink(entity this) if (PHYS_INPUT_BUTTON_JUMP(this) && joinAllowed(this)) { this.flags &= ~FL_JUMPRELEASED; this.flags |= FL_SPAWNING; - } else if(PHYS_INPUT_BUTTON_ATCK(this) && !this.version_mismatch) { + } else if(PHYS_INPUT_BUTTON_ATCK(this) && !CS(this).version_mismatch) { this.flags &= ~FL_JUMPRELEASED; if(SpectateNext(this)) { TRANSMUTE(Spectator, this); @@ -2451,13 +2452,6 @@ void PlayerPreThink (entity this) { WarpZone_PlayerPhysics_FixVAngle(this); - STAT(GAMESTARTTIME, this) = game_starttime; - STAT(ROUNDSTARTTIME, this) = round_starttime; - STAT(ALLOW_OLDVORTEXBEAM, this) = autocvar_g_allow_oldvortexbeam; - STAT(LEADLIMIT, this) = autocvar_leadlimit; - - STAT(WEAPONSINMAP, this) = weaponsInMap; - if (frametime) { // physics frames: update anticheat stuff anticheat_prethink(this); @@ -2476,17 +2470,17 @@ void PlayerPreThink (entity this) this.netname = strzone(sprintf("Player#%d", this.playerid)); // stuffcmd(this, strcat("name ", this.netname, "\n")); // maybe? } - if (this.netname != this.netname_previous) { + if (this.netname != CS(this).netname_previous) { if (autocvar_sv_eventlog) { GameLogEcho(strcat(":name:", ftos(this.playerid), ":", playername(this, false))); } - if (this.netname_previous) strunzone(this.netname_previous); - this.netname_previous = strzone(this.netname); + if (CS(this).netname_previous) strunzone(CS(this).netname_previous); + CS(this).netname_previous = strzone(this.netname); } // version nagging - if (this.version_nagtime && this.cvar_g_xonoticversion && time > this.version_nagtime) { - this.version_nagtime = 0; + if (CS(this).version_nagtime && this.cvar_g_xonoticversion && time > CS(this).version_nagtime) { + CS(this).version_nagtime = 0; if (strstrofs(this.cvar_g_xonoticversion, "git", 0) >= 0 || strstrofs(this.cvar_g_xonoticversion, "autobuild", 0) >= 0) { // git client } else if (strstrofs(autocvar_g_xonoticversion, "git", 0) >= 0 || strstrofs(autocvar_g_xonoticversion, "autobuild", 0) >= 0) { @@ -2509,29 +2503,32 @@ void PlayerPreThink (entity this) this.max_armorvalue = 0; } - if (STAT(FROZEN, this) == 2) - { - this.revive_progress = bound(0, this.revive_progress + frametime * this.revive_speed, 1); - this.health = max(1, this.revive_progress * start_health); - this.iceblock.alpha = bound(0.2, 1 - this.revive_progress, 1); - - if (this.revive_progress >= 1) - Unfreeze(this); - } - else if (STAT(FROZEN, this) == 3) + if(IS_PLAYER(this)) { - this.revive_progress = bound(0, this.revive_progress - frametime * this.revive_speed, 1); - this.health = max(0, autocvar_g_nades_ice_health + (start_health-autocvar_g_nades_ice_health) * this.revive_progress ); + if (STAT(FROZEN, this) == 2) + { + this.revive_progress = bound(0, this.revive_progress + frametime * this.revive_speed, 1); + this.health = max(1, this.revive_progress * start_health); + this.iceblock.alpha = bound(0.2, 1 - this.revive_progress, 1); - if (this.health < 1) + if (this.revive_progress >= 1) + Unfreeze(this); + } + else if (STAT(FROZEN, this) == 3) { - if (this.vehicle) - vehicles_exit(this.vehicle, VHEF_RELEASE); - if(this.event_damage) - this.event_damage(this, this, this.frozen_by, 1, DEATH_NADE_ICE_FREEZE.m_id, this.origin, '0 0 0'); + this.revive_progress = bound(0, this.revive_progress - frametime * this.revive_speed, 1); + this.health = max(0, autocvar_g_nades_ice_health + (start_health-autocvar_g_nades_ice_health) * this.revive_progress ); + + if (this.health < 1) + { + if (this.vehicle) + vehicles_exit(this.vehicle, VHEF_RELEASE); + if(this.event_damage) + this.event_damage(this, this, this.frozen_by, 1, DEATH_NADE_ICE_FREEZE.m_id, this.origin, '0 0 0'); + } + else if (this.revive_progress <= 0) + Unfreeze(this); } - else if (this.revive_progress <= 0) - Unfreeze(this); } MUTATOR_CALLHOOK(PlayerPreThink, this); @@ -2608,8 +2605,8 @@ void PlayerPreThink (entity this) e.pusher = oldpusher; } - if (this.taunt_soundtime && time > this.taunt_soundtime) { - this.taunt_soundtime = 0; + if (CS(this).taunt_soundtime && time > CS(this).taunt_soundtime) { + CS(this).taunt_soundtime = 0; PlayerSound(this, playersound_taunt, CH_VOICE, VOL_BASEVOICE, VOICETYPE_AUTOTAUNT); } @@ -2722,7 +2719,6 @@ void PlayerPostThink (entity this) CheatFrame(this); - //CheckPlayerJump(); if (game_stopped) { this.solid = SOLID_NOT; @@ -2732,7 +2728,6 @@ void PlayerPostThink (entity this) if (IS_PLAYER(this)) { DrownPlayer(this); - CheckRules_Player(this); UpdateChatBubble(this); if (CS(this).impulse) ImpulseCommands(this); if (game_stopped)