bool autocvar_g_br_ring_exitvehicle = false;
float autocvar_g_br_squad_waypoint_distance = 1500;
-.vector br_drop_velocity;
-.vector br_drop_angles;
-
MUTATOR_HOOKFUNCTION(br, reset_map_global)
{
dropship_path_length = 0; // this should kill the dropship
{
const float inital_dropangle = 60; // 0 = straight down
player.effects &= ~EF_NODRAW;
- set_movetype(player, MOVETYPE_WALK);
Kill_Notification(NOTIF_ONE_ONLY, player, MSG_CENTER, CPID_BR_DROP);
STAT(DROP, player) = DROP_FALLING;
player.br_drop_detached = 0;
float maxdropspeed = PHYS_MAXAIRSPEED(player) * max(autocvar_g_br_drop_speed_max, 0); // no maxspeed_mod available here
- player.br_drop_velocity.x = cos(player.angles.y * DEG2RAD);
- player.br_drop_velocity.y = sin(player.angles.y * DEG2RAD);
- player.br_drop_velocity.z = tan((inital_dropangle - 90) * DEG2RAD);
-
- player.br_drop_velocity = normalize(player.br_drop_velocity) * maxdropspeed;
+ player.velocity.x = cos(player.angles.y * DEG2RAD);
+ player.velocity.y = sin(player.angles.y * DEG2RAD);
+ player.velocity.z = tan((inital_dropangle - 90) * DEG2RAD);
- player.br_drop_angles.x = br_CalculatePlayerDropAngle(player) - 90;
- player.br_drop_angles.y = vectoangles(vec2(player.br_drop_velocity)).y + 180;
- player.br_drop_angles.z = 180;
+ player.velocity = normalize(player.velocity) * maxdropspeed;
- // the .br_drop values aren't modified by physics and will be used by other squad members
- player.velocity = player.br_drop_velocity;
- player.angles = player.br_drop_angles;
+ player.angles.x = br_CalculatePlayerDropAngle(player) - 90;
+ player.angles.y = vectoangles(vec2(player.velocity)).y + 180;
+ player.angles.z = 180;
if(IN_SQUAD(player) && ((IS_REAL_CLIENT(player) && (player.br_drop_launch == 2)) || br_SquadIsBotsOnly(player.br_squad)))
{
FOREACH_CLIENT(IS_PLAYER(it) && (it != player) && SAME_SQUAD(it, player) && (STAT(DROP, it) == DROP_TRANSPORT), {
it.effects &= ~EF_NODRAW;
- set_movetype(it, MOVETYPE_WALK);
Kill_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CPID_BR_DROP);
STAT(DROP, it) = DROP_FALLING;
it.br_drop_detached = 0;
setorigin(it, player.origin + drop_offset); // FIXME: this can teleport players into brushes/void
drop_offset += drop_base_offset;
- it.velocity = it.br_drop_velocity = player.velocity;
- it.angles = it.br_drop_angles = player.angles;
+ it.velocity = player.velocity;
+ it.angles = player.angles;
});
}
}
bool player_is_drop_leader = has_drop_leader && (player == player.br_squad.br_squad_drop_leader);
if(player_is_drop_leader || !has_drop_leader)
{
- player.br_drop_velocity = eZ * player.br_drop_velocity.z + vec2(player.velocity); // use real horizontal velocity in case of collisions
-
const float vertical_max = 0.9;
float maxairspeed = PHYS_MAXAIRSPEED(player) * max(maxspeed_mod, 1);
float maxdropspeed = maxairspeed * max(autocvar_g_br_drop_speed_max, 0);
float mindropspeed_ratio = bound(0, autocvar_g_br_drop_speed_vertical_min, vertical_max);
float accel_dive = max(autocvar_g_br_drop_accel_dive, 0);
float accel_turn = max(autocvar_g_br_drop_accel_turn, 0);
- float dropspeed = vlen(player.br_drop_velocity);
- float dropspeed_xy = vlen(vec2(player.br_drop_velocity));
+ float dropspeed = vlen(player.velocity);
+ float dropspeed_xy = vlen(vec2(player.velocity));
float pitch_current = br_CalculatePlayerDropAngle(player);
float pitch_view = player.v_angle.x;
wishvel.x *= accel_turn;
wishvel.y *= accel_turn;
wishvel.z *= accel_turn;
- player.br_drop_velocity += wishvel * dt;
- player.br_drop_velocity = normalize(eZ * player.br_drop_velocity.z + normalize(vec2(player.br_drop_velocity)) * dropspeed_xy);
+ player.velocity += wishvel * dt;
+ player.velocity = normalize(eZ * player.velocity.z + normalize(vec2(player.velocity)) * dropspeed_xy);
// if there is no horizontal movement point the horizontal vector towards the view direction
- if(vlen(vec2(player.br_drop_velocity)) == 0)
- player.br_drop_velocity += (eX * cos(player.angles.y * DEG2RAD) + eY * sin(player.angles.y * DEG2RAD)) * sqrt(1 - pow(maxdropspeed_ratio, 2));
+ if(vlen(vec2(player.velocity)) == 0)
+ player.velocity += (eX * cos(player.angles.y * DEG2RAD) + eY * sin(player.angles.y * DEG2RAD)) * sqrt(1 - pow(maxdropspeed_ratio, 2));
// modify mindropspeed_ratio and maxdropspeed_ratio so that the player does not rotate beyond the view angle
float vpitch_ratio = sin(pitch_view * DEG2RAD);
maxdropspeed_ratio = bound(mindropspeed_ratio, vpitch_ratio, maxdropspeed_ratio);
// constrain to vertical min/maxdropspeed
- if(player.br_drop_velocity.z > -mindropspeed_ratio)
- player.br_drop_velocity.z = -mindropspeed_ratio;
- if(player.br_drop_velocity.z < -maxdropspeed_ratio)
- player.br_drop_velocity.z = -maxdropspeed_ratio;
+ if(player.velocity.z > -mindropspeed_ratio)
+ player.velocity.z = -mindropspeed_ratio;
+ if(player.velocity.z < -maxdropspeed_ratio)
+ player.velocity.z = -maxdropspeed_ratio;
// adjust horizontal speed so that vertical speed + horizontal speed = maxdropspeed
float dropangle = br_CalculatePlayerDropAngle(player);
const float accelangle = 20;
dropspeed = bound(mindropspeed, dropspeed + accel_dive * (dropangle - accelangle) / accelangle * dt, maxdropspeed);
- player.br_drop_velocity = normalize(player.br_drop_velocity) * dropspeed;
+ player.velocity = normalize(player.velocity) * dropspeed;
- player.br_drop_angles.x = dropangle - 90;
- player.br_drop_angles.y = vectoangles(vec2(player.br_drop_velocity)).y + 180;
- player.br_drop_angles.z = 180;
-
- // the .br_drop values aren't modified by physics and will be used by other squad members
- player.velocity = player.br_drop_velocity;
- player.angles = player.br_drop_angles;
+ player.angles.x = dropangle - 90;
+ player.angles.y = vectoangles(vec2(player.velocity)).y + 180;
+ player.angles.z = 180;
if(player_is_drop_leader)
{
FOREACH_CLIENT(IS_PLAYER(it) && (it != player) && SAME_SQUAD(it, player) && (it.br_drop_detached != 2) && (STAT(DROP, it) == DROP_FALLING), {
- it.velocity = it.br_drop_velocity = player.br_drop_velocity;
- it.angles = it.br_drop_angles = player.br_drop_angles;
+ it.velocity = player.velocity;
+ it.angles = player.angles;
});
}
else if((player.br_drop_detached != 2) && IN_SQUAD(player) && !has_drop_leader)
}
else
{
- player.velocity = player.br_drop_velocity;
- player.angles = player.br_drop_angles; // no fixangles, only moves the player model not the player view
+ player.velocity = player.br_squad.br_squad_drop_leader.velocity;
+ player.angles = player.br_squad.br_squad_drop_leader.angles; // no fixangles, only moves the player model not the player view
}
return true;
}
STAT(DROP, player) = DROP_LANDING;
+ set_movetype(player, MOVETYPE_WALK);
ITEMS_STAT(player) &= ~IT_USING_JETPACK;
player.flags |= FL_PICKUPITEMS;
player.dphitcontentsmask |= DPCONTENTS_BODY;
if(STAT(DROP, frag_target) == DROP_TRANSPORT)
{
frag_target.effects &= ~EF_NODRAW;
- set_movetype(frag_target, MOVETYPE_WALK);
Kill_Notification(NOTIF_ONE_ONLY, frag_target, MSG_CENTER, CPID_BR_DROP);
}
if(STAT(DROP, frag_target) != DROP_LANDED)
{
+ set_movetype(frag_target, MOVETYPE_WALK);
frag_target.dphitcontentsmask |= DPCONTENTS_BODY;
STAT(DROP, frag_target) = DROP_LANDED;
}
float br_CalculatePlayerDropAngle(entity this)
{
- if(this.br_drop_velocity.z < 0)
+ if(this.velocity.z < 0)
{
- float dropspeed_xy = vlen(vec2(this.br_drop_velocity));
- float dropspeed_z = fabs(this.br_drop_velocity.z);
+ float dropspeed_xy = vlen(vec2(this.velocity));
+ float dropspeed_z = fabs(this.velocity.z);
return 90 - atan(dropspeed_xy / dropspeed_z) * RAD2DEG;
}