X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fclient.qc;h=c42288c6fd801e0261d0506f11507dcaf72ffef1;hp=0dadf0652c0aad0c1c7342528bfa8086f8700153;hb=5ba208651f878003e17ac7fbb72fd5183e9e9b33;hpb=6cdbef0347b560188fd0d7ce374f1c43373ad28c diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 0dadf0652c..c42288c6fd 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -25,6 +25,7 @@ #include "campaign.qh" #include "command/common.qh" #include "scores_rules.qh" +#include "weapons/common.qh" #include "bot/api.qh" @@ -336,6 +337,7 @@ void PutObserverInServer(entity this) this.strength_finished = 0; this.invincible_finished = 0; this.superweapons_finished = 0; + this.air_finished = 0; //this.dphitcontentsmask = 0; this.dphitcontentsmask = DPCONTENTS_SOLID; if (autocvar_g_playerclip_collisions) @@ -610,7 +612,8 @@ void PutPlayerInServer(entity this) this.respawn_flags = 0; this.respawn_time = 0; STAT(RESPAWN_TIME, this) = 0; - this.scale = autocvar_sv_player_scale; + bool q3dfcompat = autocvar_sv_q3defragcompat && autocvar_sv_q3defragcompat_changehitbox; + this.scale = ((q3dfcompat) ? 0.9 : autocvar_sv_player_scale); this.fade_time = 0; this.pain_frame = 0; this.pain_finished = 0; @@ -645,7 +648,7 @@ void PutPlayerInServer(entity this) STAT(BUFFS, this) = 0; STAT(BUFF_TIME, this) = 0; - this.air_finished = time + 12; + this.air_finished = 0; this.waterlevel = WATERLEVEL_NONE; this.watertype = CONTENT_EMPTY; @@ -713,10 +716,7 @@ void PutPlayerInServer(entity this) for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { .entity weaponentity = weaponentities[slot]; - entity oldwep = this.(weaponentity); CL_SpawnWeaponentity(this, weaponentity); - if(oldwep && oldwep.owner == this) - this.(weaponentity).m_gunalign = oldwep.m_gunalign; } this.alpha = default_player_alpha; this.colormod = '1 1 1' * autocvar_g_player_brightness; @@ -778,6 +778,7 @@ void PutPlayerInServer(entity this) if (CS(this).impulse) ImpulseCommands(this); + W_ResetGunAlign(this, CS(this).cvar_cl_gunalign); for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { .entity weaponentity = weaponentities[slot]; @@ -1041,7 +1042,9 @@ string getwelcomemessage(entity this) modifications = substring(modifications, 2, strlen(modifications) - 2); string versionmessage = GetClientVersionMessage(this); - string s = strcat(versionmessage, "^8\n^8\nmatch type is ^1", gamemode_name, "^8\n"); + string s = strcat(versionmessage, "^8\n^8\nhost is ^9", autocvar_hostname, "^8\n"); + + s = strcat(s, "^8\nmatch type is ^1", gamemode_name, "^8\n"); if(modifications != "") s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n"); @@ -1108,7 +1111,7 @@ void ClientConnect(entity this) CS(this).allowed_timeouts = autocvar_sv_timeout_number; if (autocvar_sv_eventlog) - GameLogEcho(strcat(":join:", ftos(this.playerid), ":", ftos(etof(this)), ":", ((IS_REAL_CLIENT(this)) ? this.netaddress : "bot"), ":", playername(this, false))); + GameLogEcho(strcat(":join:", ftos(this.playerid), ":", ftos(etof(this)), ":", ((IS_REAL_CLIENT(this)) ? GameLog_ProcessIP(this.netaddress) : "bot"), ":", playername(this, false))); CS(this).just_joined = true; // stop spamming the eventlog with additional lines when the client connects @@ -1339,7 +1342,7 @@ void PrintToChat(entity client, string text) ERASEABLE void DebugPrintToChat(entity client, string text) { - if (autocvar_developer) + if (autocvar_developer > 0) { PrintToChat(client, text); } @@ -1355,7 +1358,7 @@ void PrintToChatAll(string text) ERASEABLE void DebugPrintToChatAll(string text) { - if (autocvar_developer) + if (autocvar_developer > 0) { PrintToChatAll(text); } @@ -1377,7 +1380,7 @@ void PrintToChatTeam(int team_num, string text) ERASEABLE void DebugPrintToChatTeam(int team_num, string text) { - if (autocvar_developer) + if (autocvar_developer > 0) { PrintToChatTeam(team_num, text); } @@ -1536,8 +1539,10 @@ float CalcRot(float current, float stable, float rotfactor, float rotframetime) return max(stable, current + (stable - current) * rotfactor * rotframetime); } -float CalcRotRegen(float current, float regenstable, float regenfactor, float regenlinear, float regenframetime, float rotstable, float rotfactor, float rotlinear, float rotframetime, float limit) +void RotRegen(entity this, int res, float regenstable, float regenfactor, float regenlinear, float regenframetime, float rotstable, float rotfactor, float rotlinear, float rotframetime, float limit_mod) { + float old = GetResource(this, res); + float current = old; if(current > rotstable) { if(rotframetime > 0) @@ -1555,10 +1560,12 @@ float CalcRotRegen(float current, float regenstable, float regenfactor, float re } } + float limit = GetResourceLimit(this, res) * limit_mod; if(current > limit) current = limit; - return current; + if (current != old) + SetResource(this, res, current); } void player_regen(entity this) @@ -1588,23 +1595,16 @@ void player_regen(entity this) if(!mutator_returnvalue) if(!STAT(FROZEN, this)) { - float mina, maxa, limith, limita; - maxa = autocvar_g_balance_armor_rotstable; - mina = autocvar_g_balance_armor_regenstable; - limith = GetResourceLimit(this, RES_HEALTH); - limita = GetResourceLimit(this, RES_ARMOR); + float maxa = autocvar_g_balance_armor_rotstable; + float mina = autocvar_g_balance_armor_regenstable; - regen_health_rotstable = regen_health_rotstable * max_mod; - regen_health_stable = regen_health_stable * max_mod; - limith = limith * limit_mod; - limita = limita * limit_mod; + RotRegen(this, RES_ARMOR, mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, + regen_mod * frametime * (time > this.pauseregen_finished), maxa, autocvar_g_balance_armor_rot, autocvar_g_balance_armor_rotlinear, + rot_mod * frametime * (time > this.pauserotarmor_finished), limit_mod); - SetResource(this, RES_ARMOR, CalcRotRegen(GetResource(this, RES_ARMOR), mina, autocvar_g_balance_armor_regen, autocvar_g_balance_armor_regenlinear, - regen_mod * frametime * (time > this.pauseregen_finished), maxa, autocvar_g_balance_armor_rot, autocvar_g_balance_armor_rotlinear, - rot_mod * frametime * (time > this.pauserotarmor_finished), limita)); - SetResource(this, RES_HEALTH, CalcRotRegen(GetResource(this, RES_HEALTH), regen_health_stable, regen_health, regen_health_linear, - regen_mod * frametime * (time > this.pauseregen_finished), regen_health_rotstable, regen_health_rot, regen_health_rotlinear, - rot_mod * frametime * (time > this.pauserothealth_finished), limith)); + RotRegen(this, RES_HEALTH, regen_health_stable * max_mod, regen_health, regen_health_linear, + regen_mod * frametime * (time > this.pauseregen_finished), regen_health_rotstable * max_mod, regen_health_rot, regen_health_rotlinear, + rot_mod * frametime * (time > this.pauserothealth_finished), limit_mod); } // if player rotted to death... die! @@ -1617,17 +1617,14 @@ void player_regen(entity this) this.event_damage(this, this, this, 1, DEATH_ROT.m_id, DMG_NOWEP, this.origin, '0 0 0'); } - if (!(this.items & IT_UNLIMITED_WEAPON_AMMO)) + if (!(this.items & IT_UNLIMITED_AMMO)) { - float minf, maxf, limitf; - - maxf = autocvar_g_balance_fuel_rotstable; - minf = autocvar_g_balance_fuel_regenstable; - limitf = GetResourceLimit(this, RES_FUEL); + float maxf = autocvar_g_balance_fuel_rotstable; + float minf = autocvar_g_balance_fuel_regenstable; - SetResource(this, RES_FUEL, CalcRotRegen(GetResource(this, RES_FUEL), minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, - frametime * (time > this.pauseregen_finished) * ((this.items & ITEM_JetpackRegen.m_itemid) != 0), - maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > this.pauserotfuel_finished), limitf)); + RotRegen(this, RES_FUEL, minf, autocvar_g_balance_fuel_regen, autocvar_g_balance_fuel_regenlinear, + frametime * (time > this.pauseregen_finished) * ((this.items & ITEM_JetpackRegen.m_itemid) != 0), + maxf, autocvar_g_balance_fuel_rot, autocvar_g_balance_fuel_rotlinear, frametime * (time > this.pauserotfuel_finished), 1); } } @@ -1690,6 +1687,7 @@ void SpectateCopy(entity this, entity spectatee) this.strength_finished = spectatee.strength_finished; this.invincible_finished = spectatee.invincible_finished; this.superweapons_finished = spectatee.superweapons_finished; + this.air_finished = spectatee.air_finished; STAT(PRESSED_KEYS, this) = STAT(PRESSED_KEYS, spectatee); STAT(WEAPONS, this) = STAT(WEAPONS, spectatee); this.punchangle = spectatee.punchangle; @@ -1781,6 +1779,11 @@ void SetSpectatee_status(entity this, int spectatee_num) if (CS(this).spectatee_status != oldspectatee_status) { + if (STAT(PRESSED_KEYS, this)) + { + CS(this).pressedkeys = 0; + STAT(PRESSED_KEYS, this) = 0; + } ClientData_Touch(this); if (g_race || g_cts) race_InitSpectator(); } @@ -2022,7 +2025,7 @@ void PrintWelcomeMessage(entity this) if (autocvar_g_campaign) { if ((IS_PLAYER(this) && PHYS_INPUT_BUTTON_INFO(this)) || (!IS_PLAYER(this))) { CS(this).motd_actived_time = time; - Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_MOTD, campaign_message); + Send_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CENTER_CAMPAIGN_MESSAGE, Campaign_GetMessage(), Campaign_GetLevelNum()); } } else { if (PHYS_INPUT_BUTTON_INFO(this)) { @@ -2038,7 +2041,7 @@ void PrintWelcomeMessage(entity this) CS(this).motd_actived_time = time; else if ((time - CS(this).motd_actived_time > 2) && IS_PLAYER(this)) { // hide it some seconds after BUTTON_INFO has been released CS(this).motd_actived_time = 0; - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); + Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_CAMPAIGN_MESSAGE); } } else { if (PHYS_INPUT_BUTTON_INFO(this)) @@ -2057,7 +2060,10 @@ void PrintWelcomeMessage(entity this) { // instantly hide MOTD CS(this).motd_actived_time = 0; - Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); + if (autocvar_g_campaign) + Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_CAMPAIGN_MESSAGE); + else + Kill_Notification(NOTIF_ONE_ONLY, this, MSG_CENTER, CPID_MOTD); } else if (IS_PLAYER(this) || IS_SPEC(this)) { @@ -2085,6 +2091,7 @@ bool joinAllowed(entity this) .int items_added; .string shootfromfixedorigin; +.bool dualwielding_prev; bool PlayerThink(entity this) { if (game_stopped || intermission_running) { @@ -2187,6 +2194,15 @@ bool PlayerThink(entity this) stuffcmd(this, sprintf("\ncl_shootfromfixedorigin \"%s\"\n", autocvar_g_shootfromfixedorigin)); } + // reset gun alignment when dual wielding status changes + // to ensure guns are always aligned right and left + bool dualwielding = W_DualWielding(this); + if(this.dualwielding_prev != dualwielding) + { + W_ResetGunAlign(this, CS(this).cvar_cl_gunalign); + this.dualwielding_prev = dualwielding; + } + // LordHavoc: allow firing on move frames (sub-ticrate), this gives better timing on slow servers //if(frametime) { @@ -2207,27 +2223,25 @@ bool PlayerThink(entity this) this.items |= this.items_added; } - player_regen(this); - - // WEAPONTODO: Add a weapon request for this - // rot vortex charge to the charge limit - for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + if (frametime) { - .entity weaponentity = weaponentities[slot]; - if (WEP_CVAR(vortex, charge_rot_rate) && this.(weaponentity).vortex_charge > WEP_CVAR(vortex, charge_limit) && this.(weaponentity).vortex_charge_rottime < time) - this.(weaponentity).vortex_charge = bound(WEP_CVAR(vortex, charge_limit), this.(weaponentity).vortex_charge - WEP_CVAR(vortex, charge_rot_rate) * frametime / W_TICSPERFRAME, 1); - } + // WEAPONTODO: Add a weapon request for this + // rot vortex charge to the charge limit + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + if (WEP_CVAR(vortex, charge_rot_rate) && this.(weaponentity).vortex_charge > WEP_CVAR(vortex, charge_limit) && this.(weaponentity).vortex_charge_rottime < time) + this.(weaponentity).vortex_charge = bound(WEP_CVAR(vortex, charge_limit), this.(weaponentity).vortex_charge - WEP_CVAR(vortex, charge_rot_rate) * frametime / W_TICSPERFRAME, 1); + } - if (frametime) player_anim(this); + player_regen(this); + player_anim(this); + this.dmg_team = max(0, this.dmg_team - autocvar_g_teamdamage_resetspeed * frametime); + } - // secret status secrets_setstatus(this); - - // monsters status monsters_setstatus(this); - this.dmg_team = max(0, this.dmg_team - autocvar_g_teamdamage_resetspeed * frametime); - return true; } @@ -2259,7 +2273,8 @@ void ObserverThink(entity this) if(this.flags & FL_SPAWNING) { this.flags &= ~FL_SPAWNING; - Join(this); + if(joinAllowed(this)) + Join(this); return; } } @@ -2457,7 +2472,7 @@ void PlayerPreThink (entity this) this.max_armorvalue = 0; } - if(IS_PLAYER(this)) + if (frametime && IS_PLAYER(this)) { if (STAT(FROZEN, this) == FROZEN_TEMP_REVIVING) { @@ -2598,16 +2613,21 @@ void DrownPlayer(entity this) if (this.waterlevel != WATERLEVEL_SUBMERGED || this.vehicle) { - if(this.air_finished < time) + if(this.air_finished && this.air_finished < time) PlayerSound(this, playersound_gasp, CH_PLAYER, VOL_BASE, VOICETYPE_PLAYERSOUND); - this.air_finished = time + autocvar_g_balance_contents_drowndelay; + this.air_finished = 0; } - else if (this.air_finished < time) - { // drown! - if (this.pain_finished < time) - { - Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_drowning * autocvar_g_balance_contents_damagerate, DEATH_DROWN.m_id, DMG_NOWEP, this.origin, '0 0 0'); - this.pain_finished = time + 0.5; + else + { + if (!this.air_finished) + this.air_finished = time + autocvar_g_balance_contents_drowndelay; + if (this.air_finished < time) + { // drown! + if (this.pain_finished < time) + { + Damage (this, NULL, NULL, autocvar_g_balance_contents_playerdamage_drowning * autocvar_g_balance_contents_damagerate, DEATH_DROWN.m_id, DMG_NOWEP, this.origin, '0 0 0'); + this.pain_finished = time + 0.5; + } } } } @@ -2712,6 +2732,11 @@ void PlayerPostThink (entity this) } GetPressedKeys(this); } + else if (IS_OBSERVER(this) && STAT(PRESSED_KEYS, this)) + { + CS(this).pressedkeys = 0; + STAT(PRESSED_KEYS, this) = 0; + } if (this.waypointsprite_attachedforcarrier) { float hp = healtharmor_maxdamage(GetResource(this, RES_HEALTH), GetResource(this, RES_ARMOR), autocvar_g_balance_armor_blockpercent, DEATH_WEAPON.m_id).x;