X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=data%2Fqcsrc%2Fserver%2Fcl_client.qc;h=ea0cee0d810fe7c091002cebe5239e6ade066f57;hb=b1dd36a05bd64d582353def5142bbe98ec7dc2a5;hp=6fb96a71a52c372b58e395f905d704677c981774;hpb=6b19b6344e615371602a8fb2eab8a63b47811089;p=voretournament%2Fvoretournament.git diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index 6fb96a71..ea0cee0d 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -396,7 +396,7 @@ Checks if the argument string can be a valid playermodel. Returns a valid one in doubt. ============= */ -string FallbackPlayerModel = "models/player/vixen.zym"; +string FallbackPlayerModel = "models/player/fox.iqm"; string CheckPlayerModel(string plyermodel) { if(strlen(plyermodel) < 4) return FallbackPlayerModel; @@ -521,7 +521,7 @@ float Client_customizeentityforclient() // now change the predator's player model into a stomach model for the prey // in other words, when a player is swallowed by another player, the predator becomes an inward stomach model so the prey can see theirself in the stomach // this is only visible to the prey however, otherwise players would appear as a floating stomach to everyone (ewww) - stomachmodel = strcat(substring(self.playermodel, 0, strlen(self.playermodel) - 4), "_stomach.md3"); // 4 is the extension length + stomachmodel = strcat(substring(self.playermodel, 0, strlen(self.playermodel) - 4), "_stomach.iqm"); // 4 is the extension length float chase; chase = other.cvar_chase_active; @@ -534,15 +534,27 @@ float Client_customizeentityforclient() if(other.predator == self) { Client_setmodel(stomachmodel); + self.angles_x = self.angles_z = 0; // don't apply player leaning to stomach models self.effects |= EF_NODEPTHTEST; // don't hide behind walls self.alpha = other.cvar_cl_vore_stomachmodel; return TRUE; } Client_setmodel(setmodel_state()); - self.effects &~= EF_NODEPTHTEST; + if(cvar("g_nodepthtestplayers")) + self.effects |= EF_NODEPTHTEST; + else + self.effects &~= EF_NODEPTHTEST; + if(cvar("g_fullbrightplayers")) + self.effects |= EF_FULLBRIGHT; + if not(self.stat_eaten) + { self.alpha = default_player_alpha; + if(cvar("g_vore_swallowfade")) + if not(other == self && !chase) + self.alpha *= 1 - self.swallow_progress_prey; // fade players out as they are swallowed, to better simulate their disappearing + } else if(cvar("g_vore_neighborprey_distance") && self.predator == other.predator && !(chase || other.classname == "observer")) { self.alpha = default_player_alpha; // allow seeing neighboring prey @@ -579,7 +591,7 @@ void PutObserverInServer (void) WriteEntity(MSG_ONE, self); } - Vore_Disconnect(); + Vore_Disconnect(TRUE); kh_Key_DropAll(self, TRUE); @@ -615,7 +627,7 @@ void PutObserverInServer (void) self.health = -666; self.takedamage = DAMAGE_NO; self.solid = SOLID_NOT; - self.movetype = MOVETYPE_NOCLIP; + self.movetype = MOVETYPE_FLY_WORLDONLY; // user preference is controlled by playerprethink self.flags = FL_CLIENT | FL_NOTARGET; self.armorvalue = 666; self.effects = 0; @@ -644,9 +656,9 @@ void PutObserverInServer (void) self.fixangle = TRUE; self.crouch = FALSE; - self.view_ofs = PL_VIEW_OFS; + self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS" setorigin (self, spot.origin); - setsize (self, '0 0 0', '0 0 0'); + setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY self.prevorigin = self.origin; self.items = 0; self.weapons = 0; @@ -802,6 +814,8 @@ Called when a client spawns in the server //void() ctf_playerchanged; void PutClientInServer (void) { + entity e; + if(clienttype(self) == CLIENTTYPE_BOT) { self.classname = "player"; @@ -846,7 +860,7 @@ void PutClientInServer (void) RemoveGrabber(self); // Wazat's Grabber - Vore_Disconnect(); + Vore_Disconnect(TRUE); self.swallow_progress_pred = self.swallow_progress_prey = 0; self.classname = "player"; @@ -928,7 +942,6 @@ void PutClientInServer (void) self.angles_z = 0; // never spawn tilted even if the spot says to self.fixangle = TRUE; // turn this way immediately - self.leanangle_damage_force = '0 0 0'; self.velocity = '0 0 0'; self.avelocity = '0 0 0'; self.punchangle = '0 0 0'; @@ -1017,7 +1030,6 @@ void PutClientInServer (void) weapon_action(j, WR_RESETPLAYER); // all weapons must be fully loaded when we spawn - entity e; e = get_weaponinfo(j); if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars self.(weapon_load[j]) = cvar(strcat("g_balance_", e.netname, "_reload_ammo")); @@ -1073,6 +1085,7 @@ float ClientInit_SendEntity(entity to, float sf) WriteShort(MSG_ENTITY, cvar("g_power")); WriteShort(MSG_ENTITY, cvar("g_power_reboot")); + WriteByte(MSG_ENTITY, cvar("g_power_reboot_spawn")); return TRUE; } @@ -1372,6 +1385,7 @@ void FixClientCvars(entity e) stuffcmd(e, strcat("cl_movement_maxairspeed ", ftos(cvar("sv_maxairspeed")), "\n")); stuffcmd(e, strcat("cl_movement_stopspeed ", ftos(cvar("sv_stopspeed")), "\n")); stuffcmd(e, strcat("cl_movement_jumpvelocity ", ftos(cvar("sv_jumpvelocity")), "\n")); + stuffcmd(e, strcat("cl_movement_crouchvelocity ", ftos(cvar("sv_crouchvelocity")), "\n")); stuffcmd(e, strcat("cl_movement_stepheight ", ftos(cvar("sv_stepheight")), "\n")); stuffcmd(e, strcat("set cl_movement_friction_on_land ", ftos(cvar("sv_friction_on_land")), "\n")); stuffcmd(e, strcat("set cl_movement_airaccel_qw ", ftos(cvar("sv_airaccel_qw")), "\n")); @@ -1616,7 +1630,7 @@ void ClientDisconnect (void) return; } - Vore_Disconnect(); + Vore_Disconnect(TRUE); CheatShutdownClient(); @@ -1887,12 +1901,6 @@ void player_powerups (void) } } - if(cvar("g_nodepthtestplayers")) - self.effects = self.effects | EF_NODEPTHTEST; - - if(cvar("g_fullbrightplayers")) - self.effects = self.effects | EF_FULLBRIGHT; - // midair gamemode: damage only while in the air // if in midair mode, being on ground grants temporary invulnerability // (this is so that multishot weapon don't clear the ground flag on the @@ -1952,7 +1960,7 @@ float CalcRotRegen(float current, float regenstable, float regenfactor, float re { msg_entity = self; if(clienttype(msg_entity) == CLIENTTYPE_REAL) - soundto(MSG_ONE, self, CHAN_AUTO, regensound, VOL_BASE, ATTN_NONE); + soundto(MSG_ONE, self, CHAN_AUTO, regensound, VOL_BASE, ATTN_NONE, 0); } self.regen_soundtime = time + 1; // only replay the sound if regen was paused for one second } @@ -2018,7 +2026,92 @@ void SetZoomState(float z) zoomstate_set = 1; } +// get pressed keys for PlayerDodge +void PlayerDodge_GetPressedKeys() +{ + float length; + float tap_direction_x; + float tap_direction_y; + float dodge_detected; + + // first check if the last dodge is far enough back in time so we can dodge again + if ((time - self.last_dodging_time) < cvar("sv_dodging_delay")) + return; + + if (check_close_to_ground(cvar("sv_dodging_height_threshold")) != 1 + && check_close_to_wall(cvar("sv_dodging_wall_distance_threshold")) != 1) + return; + + if (self.movement_x > 0) { + // is this a state change? + if (!(self.pressedkeys & KEY_FORWARD)) { + if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) { + tap_direction_x = 1.0; + dodge_detected = 1; + } + self.last_FORWARD_KEY_time = time; + } + } + + if (self.movement_x < 0) { + // is this a state change? + if (!(self.pressedkeys & KEY_BACKWARD)) { + tap_direction_x = -1.0; + if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout) { + dodge_detected = 1; + } + self.last_BACKWARD_KEY_time = time; + } + } + + if (self.movement_y > 0) { + // is this a state change? + if (!(self.pressedkeys & KEY_RIGHT)) { + tap_direction_y = 1.0; + if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout) { + dodge_detected = 1; + } + self.last_RIGHT_KEY_time = time; + } + } + + if (self.movement_y < 0) { + // is this a state change? + if (!(self.pressedkeys & KEY_LEFT)) { + tap_direction_y = -1.0; + if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout) { + dodge_detected = 1; + } + self.last_LEFT_KEY_time = time; + } + } + + if (dodge_detected == 1) { + self.last_dodging_time = time; + + self.dodging_action = 1; + self.dodging_single_action = 1; + + self.dodging_velocity_gain = cvar("sv_dodging_horiz_speed"); + + self.dodging_direction_x = tap_direction_x; + self.dodging_direction_y = tap_direction_y; + + // normalize the dodging_direction vector.. (unlike UT99) XD + length = self.dodging_direction_x * self.dodging_direction_x; + length = length + self.dodging_direction_y * self.dodging_direction_y; + length = sqrt(length); + + self.dodging_direction_x = self.dodging_direction_x * 1.0 / length; + self.dodging_direction_y = self.dodging_direction_y * 1.0 / length; + } +} + void GetPressedKeys(void) { + // get keys for dodging + if(cvar("g_dodging")) + PlayerDodge_GetPressedKeys(); + if (self.movement_x > 0) // get if movement keys are pressed { // forward key pressed self.pressedkeys |= KEY_FORWARD; @@ -2117,8 +2210,10 @@ void SpectateCopy(entity spectatee) { self.fixangle = TRUE; self.stomach_load = spectatee.stomach_load; self.stat_eaten = spectatee.stat_eaten; + self.swallow_progress_prey = spectatee.swallow_progress_prey; + self.swallow_progress_pred = spectatee.swallow_progress_pred; self.stat_stomachload = spectatee.stat_stomachload; - self.stat_stomachmaxload = spectatee.stomach_maxload; + self.stat_stomachmaxload = spectatee.stat_stomachmaxload; self.stat_digesting = spectatee.stat_digesting; self.stat_canleave = spectatee.stat_canleave; self.stat_canswallow = spectatee.stat_canswallow; @@ -2126,10 +2221,14 @@ void SpectateCopy(entity spectatee) { self.stat_sbring1_clip = spectatee.stat_sbring1_clip; self.stat_sbring2_type = spectatee.stat_sbring2_type; self.stat_sbring2_clip = spectatee.stat_sbring2_clip; + self.stat_respawn_time = spectatee.stat_respawn_time; setorigin(self, spectatee.origin); setsize(self, spectatee.mins, spectatee.maxs); SetZoomState(spectatee.zoomstate); + // copy necessary flags + if(spectatee.flags & FL_ONGROUND) self.flags |= FL_ONGROUND; else self.flags &~= FL_ONGROUND; + anticheat_spectatecopy(spectatee); } @@ -2342,7 +2441,7 @@ void SetPlayerSize() { //setsize (self, PL_MIN * self.scale, PL_MAX * self.scale); if(!self.stat_eaten) - self.view_ofs = PL_VIEW_OFS * self.scale; + self.view_ofs = PL_VIEW_OFS * pow(self.scale, cvar("g_healthsize_viewfactor")); } self.last_alive_scale = self.scale; @@ -2365,17 +2464,20 @@ void SetPlayerSize() void ObserverThink() { + float prefered_movetype; if (self.flags & FL_JUMPRELEASED) { if (self.BUTTON_JUMP && !self.version_mismatch) { - self.welcomemessage_time = 0; self.flags &~= FL_JUMPRELEASED; self.flags |= FL_SPAWNING; } else if(self.BUTTON_ATCK && !self.version_mismatch) { - self.welcomemessage_time = 0; self.flags &~= FL_JUMPRELEASED; if(SpectateNext() == 1) { self.classname = "spectator"; } + } else { + prefered_movetype = ((!self.BUTTON_USE ? self.cvar_cl_clippedspectating : !self.cvar_cl_clippedspectating) ? MOVETYPE_FLY_WORLDONLY : MOVETYPE_NOCLIP); + if (self.movetype != prefered_movetype) + self.movetype = prefered_movetype; } } else { if (!(self.BUTTON_ATCK || self.BUTTON_JUMP)) { @@ -2388,6 +2490,7 @@ void ObserverThink() } } } + PrintWelcomeMessage(self); } @@ -2453,6 +2556,11 @@ void PlayerPreThink (void) self.stat_allow_oldnexbeam = cvar("g_allow_oldnexbeam"); self.stat_leadlimit = cvar("leadlimit"); + if(g_arena || (g_ca && !allowed_to_spawn)) + self.stat_respawn_time = 0; + else + self.stat_respawn_time = self.death_time; + if(frametime) { // physics frames: update anticheat stuff @@ -2563,61 +2671,11 @@ void PlayerPreThink (void) self.fixangle = TRUE; } - if(self.deadflag == DEAD_NO && !self.stat_eaten) // prevents bugs - { - // lean the player with damage and acceleration - // credits go to divVerent for these maths :) - vector L0, L1, LF, LA; - - LA = AnglesTransform_FromAngles(self.angles); - - // acceleration leaning - if(cvar("g_leanplayer_acceleration")) - { - // average velocity to obtain a smooth acceleration - float f; - f = frametime * cvar("g_leanplayer_acceleration_fade"); - self.avg_vel = self.avg_vel * (1 - f) + self.velocity * f; - } - - vector accel; - accel = self.velocity - self.avg_vel * cvar("g_leanplayer_acceleration"); // acceleration - - // bound angles to the specified limit - accel_x = bound(-cvar("g_leanplayer_acceleration_max"), accel_x, cvar("g_leanplayer_acceleration_max")); - accel_y = bound(-cvar("g_leanplayer_acceleration_max"), accel_y, cvar("g_leanplayer_acceleration_max")); - accel_z = bound(-cvar("g_leanplayer_acceleration_max"), accel_z, cvar("g_leanplayer_acceleration_max")); - - L0_x = vlen(accel); - L0_y = L1_y = vectoyaw(accel); - - L0 = AnglesTransform_FromAngles(L0); - L1 = AnglesTransform_FromAngles(L1); - LF = AnglesTransform_Multiply(AnglesTransform_Invert(L1), L0); - LA = AnglesTransform_Multiply(LA, LF); - // end of acceleration leaning - - // damage leaning - L0 = vectoangles(self.leanangle_damage_loc); - L1 = vectoangles(self.leanangle_damage_loc + self.leanangle_damage_force); - - L0 = AnglesTransform_FromAngles(L0); - L1 = AnglesTransform_FromAngles(L1); - LF = AnglesTransform_Multiply(AnglesTransform_Invert(L1), L0); - - LA = AnglesTransform_Multiply(LA, LF); - - // fade the player back to normal rotation each frame - self.leanangle_damage_force = self.leanangle_damage_force * cvar("g_leanplayer_damage_fade"); - // end of damage leaning - - self.angles = AnglesTransform_Normalize(AnglesTransform_ToAngles(LA), TRUE); - } - SetPlayerSize(); if(frametime) { + vector glowcolor = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; if(self.health <= 0 && cvar("g_deathglow")) { if(self.glowmod_x > 0) @@ -2636,12 +2694,16 @@ void PlayerPreThink (void) else { // set weapon and player glowmod - self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2; + self.glowmod = glowcolor; if(self.armorvalue < cvar("g_power")) - self.glowmod = self.glowmod * random(); // make glow flicker when power is down - self.weaponentity_glowmod = self.glowmod; + self.glowmod = '-1 -1 -1'; // turn glow off when power is down + else if(self.armorvalue < cvar("g_armorglow")) + self.glowmod = glowcolor * (self.armorvalue / cvar("g_armorglow")); // glow intensity reflects armor charge } + if(cvar("g_weaponloadglow") && self.clip_size) + self.weaponentity_glowmod = glowcolor * (self.clip_load / self.clip_size); // glow intensity reflects weapon load + player_powerups(); } @@ -2690,6 +2752,11 @@ void PlayerPreThink (void) } ShowRespawnCountdown(); } + + // if respawning, invert stat_respawn_time to indicate this, the client translates it + if(self.deadflag == DEAD_RESPAWNING && self.stat_respawn_time > 0) + self.stat_respawn_time *= -1; + return; }