implement exiting vehicles
This commit is contained in:
parent
8c3fa09b5c
commit
8bc80b3c6c
105
src/actor.rs
105
src/actor.rs
|
@ -18,10 +18,12 @@ impl Plugin for ActorPlugin {
|
||||||
handle_conversations,
|
handle_conversations,
|
||||||
handle_input,
|
handle_input,
|
||||||
handle_chat_scripts,
|
handle_chat_scripts,
|
||||||
|
handle_vehicle_enter_exit,
|
||||||
));
|
));
|
||||||
app.add_event::<StartConversationEvent>();
|
app.add_event::<StartConversationEvent>();
|
||||||
app.add_event::<SendMessageEvent>();
|
app.add_event::<SendMessageEvent>();
|
||||||
app.add_event::<ChatScriptEvent>();
|
app.add_event::<ChatScriptEvent>();
|
||||||
|
app.add_event::<VehicleEnterExitEvent>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +46,14 @@ pub struct ChatScriptEvent {
|
||||||
param2: String,
|
param2: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Event)]
|
||||||
|
pub struct VehicleEnterExitEvent {
|
||||||
|
vehicle: Entity,
|
||||||
|
driver: Entity,
|
||||||
|
is_entering: bool,
|
||||||
|
is_player: bool
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct Actor {
|
pub struct Actor {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
@ -71,6 +81,8 @@ impl Default for Actor {
|
||||||
#[derive(Component)] pub struct PlayerDrivesThis;
|
#[derive(Component)] pub struct PlayerDrivesThis;
|
||||||
#[derive(Component)] pub struct PlayerInConversation;
|
#[derive(Component)] pub struct PlayerInConversation;
|
||||||
#[derive(Component)] pub struct InConversationWithPlayer;
|
#[derive(Component)] pub struct InConversationWithPlayer;
|
||||||
|
#[derive(Component)] pub struct ActorEnteringVehicle;
|
||||||
|
#[derive(Component)] pub struct ActorVehicleBeingEntered;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[derive(Component, Reflect, Default)]
|
#[derive(Component, Reflect, Default)]
|
||||||
|
@ -225,15 +237,15 @@ pub fn handle_input(
|
||||||
keyboard_input: Res<ButtonInput<KeyCode>>,
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
||||||
settings: ResMut<settings::Settings>,
|
settings: ResMut<settings::Settings>,
|
||||||
q_talker: Query<(&Talker, &Transform), Without<actor::Player>>,
|
q_talker: Query<(&Talker, &Transform), Without<actor::Player>>,
|
||||||
mut player: Query<(&mut Actor, &mut Transform), With<actor::Player>>,
|
mut player: Query<(Entity, &mut Actor, &mut Transform), With<actor::Player>>,
|
||||||
mut q_vehicles: Query<(Entity, &mut Visibility, &Transform), (With<actor::Vehicle>, Without<actor::Player>)>,
|
mut q_vehicles: Query<(Entity, &mut Visibility, &Transform), (With<actor::Vehicle>, Without<actor::Player>)>,
|
||||||
mut ew_conv: EventWriter<StartConversationEvent>,
|
mut ew_conv: EventWriter<StartConversationEvent>,
|
||||||
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
mut ew_vehicle: EventWriter<VehicleEnterExitEvent>,
|
||||||
)
|
q_player_drives: Query<Entity, With<PlayerDrivesThis>>,
|
||||||
{
|
) {
|
||||||
let mindist = MIN_INTERACT_DISTANCE * MIN_INTERACT_DISTANCE;
|
let mindist = MIN_INTERACT_DISTANCE * MIN_INTERACT_DISTANCE;
|
||||||
if keyboard_input.just_pressed(settings.key_interact) {
|
if keyboard_input.just_pressed(settings.key_interact) {
|
||||||
if let Ok((_player_actor, player)) = player.get_single() {
|
if let Ok((_player_entity, _player_actor, player)) = player.get_single() {
|
||||||
for (talker, transform) in &q_talker {
|
for (talker, transform) in &q_talker {
|
||||||
if transform.translation.distance_squared(player.translation) <= mindist {
|
if transform.translation.distance_squared(player.translation) <= mindist {
|
||||||
ew_conv.send(StartConversationEvent{talker: talker.clone()});
|
ew_conv.send(StartConversationEvent{talker: talker.clone()});
|
||||||
|
@ -243,19 +255,88 @@ pub fn handle_input(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if keyboard_input.just_pressed(settings.key_vehicle) {
|
else if keyboard_input.just_pressed(settings.key_vehicle) {
|
||||||
if let Ok((mut player_actor, mut player)) = player.get_single_mut() {
|
// Entering Vehicles
|
||||||
for (entity, mut visibility, vehicle_transform) in q_vehicles.iter_mut() {
|
if q_player_drives.is_empty() {
|
||||||
|
if let Ok((player_entity, _player_actor, player)) = player.get_single_mut() {
|
||||||
|
for (vehicle_entity, _visibility, vehicle_transform) in q_vehicles.iter_mut() {
|
||||||
if vehicle_transform.translation.distance_squared(player.translation) <= mindist {
|
if vehicle_transform.translation.distance_squared(player.translation) <= mindist {
|
||||||
player_actor.inside_entity = entity.index();
|
commands.entity(vehicle_entity).insert(ActorVehicleBeingEntered);
|
||||||
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::EnterVehicle));
|
commands.entity(player_entity).insert(ActorEnteringVehicle);
|
||||||
*player = *vehicle_transform;
|
ew_vehicle.send(VehicleEnterExitEvent{
|
||||||
*visibility = Visibility::Hidden;
|
vehicle: vehicle_entity,
|
||||||
commands.entity(entity).insert(PlayerDrivesThis);
|
driver: player_entity,
|
||||||
|
is_entering: q_player_drives.is_empty(),
|
||||||
|
is_player: true,
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Exiting Vehicles
|
||||||
|
else {
|
||||||
|
if let Ok((player_entity, _player_actor, _player)) = player.get_single_mut() {
|
||||||
|
for vehicle_entity in &q_player_drives {
|
||||||
|
commands.entity(vehicle_entity).insert(ActorVehicleBeingEntered);
|
||||||
|
commands.entity(player_entity).insert(ActorEnteringVehicle);
|
||||||
|
ew_vehicle.send(VehicleEnterExitEvent{
|
||||||
|
vehicle: vehicle_entity,
|
||||||
|
driver: player_entity,
|
||||||
|
is_entering: false,
|
||||||
|
is_player: true,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn handle_vehicle_enter_exit(
|
||||||
|
mut commands: Commands,
|
||||||
|
mut er_vehicle: EventReader<VehicleEnterExitEvent>,
|
||||||
|
mut q_drivers: Query<(Entity, &mut Actor, &mut Visibility, &mut Transform), (Without<ActorVehicleBeingEntered>, With<ActorEnteringVehicle>)>,
|
||||||
|
mut q_vehicles: Query<(Entity, &mut Actor, &mut Visibility, &mut Transform), (With<ActorVehicleBeingEntered>, Without<ActorEnteringVehicle>)>,
|
||||||
|
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
||||||
|
) {
|
||||||
|
for event in er_vehicle.read() {
|
||||||
|
for (driver, mut driver_actor, mut driver_vis, mut driver_trans) in q_drivers.iter_mut() {
|
||||||
|
if driver == event.driver {
|
||||||
|
for (vehicle, mut vehicle_actor, mut vehicle_vis, mut vehicle_trans) in q_vehicles.iter_mut() {
|
||||||
|
if vehicle == event.vehicle {
|
||||||
|
if event.is_entering {
|
||||||
|
// Entering Vehicle
|
||||||
|
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::EnterVehicle));
|
||||||
|
*driver_vis = Visibility::Hidden;
|
||||||
|
*driver_trans = vehicle_trans.clone();
|
||||||
|
if event.is_player {
|
||||||
|
//player_actor.inside_entity = entity.index();
|
||||||
|
*vehicle_vis = Visibility::Hidden;
|
||||||
|
driver_actor.v = vehicle_actor.v;
|
||||||
|
commands.entity(vehicle).insert(PlayerDrivesThis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Exiting Vehicle
|
||||||
|
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Switch));
|
||||||
|
*driver_vis = Visibility::Inherited;
|
||||||
|
if event.is_player {
|
||||||
|
*vehicle_vis = Visibility::Inherited;
|
||||||
|
vehicle_actor.v = driver_actor.v;
|
||||||
|
vehicle_actor.angular_momentum = driver_actor.angular_momentum;
|
||||||
|
*vehicle_trans = driver_trans.clone();
|
||||||
|
commands.entity(vehicle).remove::<PlayerDrivesThis>();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*driver_trans = vehicle_trans.clone();
|
||||||
|
*driver_trans = vehicle_trans.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_new_conversations(
|
pub fn handle_new_conversations(
|
||||||
|
|
|
@ -94,6 +94,7 @@ pub fn setup(
|
||||||
thrust_forward: 1.2,
|
thrust_forward: 1.2,
|
||||||
..default()
|
..default()
|
||||||
},
|
},
|
||||||
|
Visibility::Visible,
|
||||||
Camera3dBundle {
|
Camera3dBundle {
|
||||||
camera: Camera {
|
camera: Camera {
|
||||||
hdr: true, // HDR is required for bloom
|
hdr: true, // HDR is required for bloom
|
||||||
|
|
Loading…
Reference in a new issue