X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fcommon%2Fphysics%2Fplayer.qc;h=1b80655026dcf4b2fdc00a7cf79b4bd5e628d7ed;hb=f20db00cafb75a05d5a4ee80957d3d8b351eddea;hp=6f83e76b9020255bd0a65745493e434999b559f2;hpb=12ad79a6e66bd40fb5afea8618a4c8960892b129;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index 6f83e76b9..1b8065502 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -21,7 +21,7 @@ float Physics_ClientOption(entity this, string option, float defaultval) if(cvar_type(s) & CVAR_TYPEFLAG_EXISTS) return cvar(s); } - if(autocvar_g_physics_clientselect && autocvar_g_physics_clientselect_default) + if(autocvar_g_physics_clientselect && autocvar_g_physics_clientselect_default && autocvar_g_physics_clientselect_default != "") { string s = strcat("g_physics_", autocvar_g_physics_clientselect_default, "_", option); if(cvar_type(s) & CVAR_TYPEFLAG_EXISTS) @@ -75,6 +75,7 @@ void Physics_UpdateStats(entity this) STAT(MOVEVARS_AIRACCELERATE, this) = Physics_ClientOption(this, "airaccelerate", autocvar_sv_airaccelerate); STAT(MOVEVARS_AIRSTOPACCELERATE, this) = Physics_ClientOption(this, "airstopaccelerate", autocvar_sv_airstopaccelerate); STAT(MOVEVARS_JUMPVELOCITY, this) = Physics_ClientOption(this, "jumpvelocity", autocvar_sv_jumpvelocity); + STAT(MOVEVARS_JUMPVELOCITY_CROUCH, this) = Physics_ClientOption(this, "jumpvelocity_crouch", autocvar_sv_jumpvelocity_crouch); STAT(MOVEVARS_TRACK_CANJUMP, this) = Physics_ClientOption(this, "track_canjump", autocvar_sv_track_canjump); } #endif @@ -97,42 +98,51 @@ float GeomLerp(float a, float _lerp, float b) void PM_ClientMovement_UpdateStatus(entity this) { -#ifdef CSQC if(!IS_PLAYER(this)) return; - // set crouched - bool do_crouch = PHYS_INPUT_BUTTON_CROUCH(this); + bool have_hook = false; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { - entity wep = viewmodels[slot]; - if(wep.hook && !wasfreed(wep.hook)) + #if defined(CSQC) + entity wepent = viewmodels[slot]; + #elif defined(SVQC) + .entity weaponentity = weaponentities[slot]; + entity wepent = this.(weaponentity); + #endif + if(wepent.hook && !wasfreed(wepent.hook)) { - do_crouch = false; - break; // don't bother checking the others + have_hook = true; + break; } } - if(this.waterlevel >= WATERLEVEL_SWIMMING) + bool do_crouch = PHYS_INPUT_BUTTON_CROUCH(this); + if (have_hook) { do_crouch = false; - if(hud != HUD_NORMAL) + //} else if (this.waterlevel >= WATERLEVEL_SWIMMING) { + //do_crouch = false; + } else if (PHYS_INVEHICLE(this)) { do_crouch = false; - if(STAT(FROZEN, this)) + } else if (STAT(FROZEN, this)) { do_crouch = false; + } - if (do_crouch) - { - // wants to crouch, this always works - if (!IS_DUCKED(this)) SET_DUCKED(this); - } - else - { - // wants to stand, if currently crouching we need to check for a low ceiling first - if (IS_DUCKED(this)) - { - tracebox(this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), this.origin, MOVE_NORMAL, this); - if (!trace_startsolid) UNSET_DUCKED(this); + if (do_crouch) { + if (!IS_DUCKED(this)) { + SET_DUCKED(this); + this.view_ofs = STAT(PL_CROUCH_VIEW_OFS, this); + setsize(this, STAT(PL_CROUCH_MIN, this), STAT(PL_CROUCH_MAX, this)); + // setanim(this, this.anim_duck, false, true, true); // this anim is BROKEN anyway } + } else if (IS_DUCKED(this)) { + tracebox(this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), this.origin, false, this); + if (!trace_startsolid) { + UNSET_DUCKED(this); + this.view_ofs = STAT(PL_VIEW_OFS, this); + setsize(this, STAT(PL_MIN, this), STAT(PL_MAX, this)); + } } +#ifdef CSQC if (IS_ONGROUND(this) || this.velocity.z <= 0 || PHYS_WATERJUMP_TIME(this) <= 0) PHYS_WATERJUMP_TIME(this) = 0; @@ -303,7 +313,7 @@ bool PlayerJump(entity this) #endif bool doublejump = false; - float mjumpheight = PHYS_JUMPVELOCITY(this); + float mjumpheight = ((PHYS_JUMPVELOCITY_CROUCH(this) && IS_DUCKED(this)) ? PHYS_JUMPVELOCITY_CROUCH(this) : PHYS_JUMPVELOCITY(this)); bool track_jump = PHYS_CL_TRACK_CANJUMP(this); if (MUTATOR_CALLHOOK(PlayerJump, this, mjumpheight, doublejump)) @@ -488,8 +498,13 @@ string specialcommand = "xwxwxsxsxaxdxaxdx1x "; .float specialcommand_pos; void SpecialCommand(entity this) { - if (!CheatImpulse(this, CHIMPULSE_GIVE_ALL.impulse)) - LOG_INFO("A hollow voice says \"Plugh\".\n"); + if(autocvar_sv_cheats || this.maycheat) + { + if (!CheatImpulse(this, CHIMPULSE_GIVE_ALL.impulse)) + LOG_INFO("A hollow voice says \"Plugh\"."); + } + else + STAT(MOVEVARS_SPECIALCOMMAND, this) = true; } #endif @@ -514,18 +529,18 @@ bool PM_check_specialcommand(entity this, int buttons) else c = "?"; - if (c == substring(specialcommand, this.specialcommand_pos, 1)) + if (c == substring(specialcommand, CS(this).specialcommand_pos, 1)) { - this.specialcommand_pos += 1; - if (this.specialcommand_pos >= strlen(specialcommand)) + CS(this).specialcommand_pos += 1; + if (CS(this).specialcommand_pos >= strlen(specialcommand)) { - this.specialcommand_pos = 0; + CS(this).specialcommand_pos = 0; SpecialCommand(this); return true; } } - else if (this.specialcommand_pos && (c != substring(specialcommand, this.specialcommand_pos - 1, 1))) - this.specialcommand_pos = 0; + else if (CS(this).specialcommand_pos && (c != substring(specialcommand, CS(this).specialcommand_pos - 1, 1))) + CS(this).specialcommand_pos = 0; #endif return false; } @@ -808,7 +823,8 @@ void CSQC_ClientMovement_PlayerMove_Frame(entity this) { #ifdef SVQC // needs to be called before physics are run! - PM_UpdateButtons(this, CS(this)); + if(IS_REAL_CLIENT(this)) + PM_UpdateButtons(this, CS(this)); #endif sys_phys_update(this, PHYS_INPUT_TIMELENGTH);