mirror of
https://github.com/griffi-gh/kubi.git
synced 2024-11-13 19:08:41 -06:00
player move events
This commit is contained in:
parent
71154b07bc
commit
f5a4bd9603
|
@ -1,8 +1,9 @@
|
||||||
use shipyard::{UniqueViewMut, UniqueView, View, IntoIter};
|
use shipyard::{UniqueViewMut, UniqueView, View, IntoIter, ViewMut, EntitiesViewMut};
|
||||||
use crate::{
|
use crate::{
|
||||||
player::MainPlayer,
|
player::MainPlayer,
|
||||||
world::{raycast::LookingAtBlock, ChunkStorage, block::Block},
|
world::{raycast::LookingAtBlock, ChunkStorage, block::Block},
|
||||||
input::{Inputs, PrevInputs}
|
input::{Inputs, PrevInputs},
|
||||||
|
events::{EventComponent, player_actions::PlayerActionEvent},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn block_placement_system(
|
pub fn block_placement_system(
|
||||||
|
@ -10,7 +11,10 @@ pub fn block_placement_system(
|
||||||
raycast: View<LookingAtBlock>,
|
raycast: View<LookingAtBlock>,
|
||||||
input: UniqueView<Inputs>,
|
input: UniqueView<Inputs>,
|
||||||
prev_input: UniqueView<PrevInputs>,
|
prev_input: UniqueView<PrevInputs>,
|
||||||
mut world: UniqueViewMut<ChunkStorage>
|
mut world: UniqueViewMut<ChunkStorage>,
|
||||||
|
mut entities: EntitiesViewMut,
|
||||||
|
mut events: ViewMut<EventComponent>,
|
||||||
|
mut player_events: ViewMut<PlayerActionEvent>,
|
||||||
) {
|
) {
|
||||||
let action_place = input.action_b && !prev_input.0.action_b;
|
let action_place = input.action_b && !prev_input.0.action_b;
|
||||||
let action_break = input.action_a && !prev_input.0.action_a;
|
let action_break = input.action_a && !prev_input.0.action_a;
|
||||||
|
@ -18,19 +22,27 @@ pub fn block_placement_system(
|
||||||
//get raycast info
|
//get raycast info
|
||||||
let Some(ray) = (&main_player, &raycast).iter().next().unwrap().1/**/.0 else { return };
|
let Some(ray) = (&main_player, &raycast).iter().next().unwrap().1/**/.0 else { return };
|
||||||
//update block
|
//update block
|
||||||
let place_position = if action_place {
|
let (place_position, place_block) = if action_place {
|
||||||
let position = (ray.position - ray.direction * 0.5).floor().as_ivec3();
|
let position = (ray.position - ray.direction * 0.5).floor().as_ivec3();
|
||||||
let Some(block) = world.get_block_mut(position) else { return };
|
let Some(block) = world.get_block_mut(position) else { return };
|
||||||
*block = Block::Dirt;
|
*block = Block::Dirt;
|
||||||
position
|
(position, *block)
|
||||||
} else {
|
} else {
|
||||||
let Some(block) = world.get_block_mut(ray.block_position) else { return };
|
let Some(block) = world.get_block_mut(ray.block_position) else { return };
|
||||||
*block = Block::Air;
|
*block = Block::Air;
|
||||||
ray.block_position
|
(ray.block_position, *block)
|
||||||
};
|
};
|
||||||
//mark chunk as dirty
|
//mark chunk as dirty
|
||||||
let (chunk_pos, _) = ChunkStorage::to_chunk_coords(place_position);
|
let (chunk_pos, _) = ChunkStorage::to_chunk_coords(place_position);
|
||||||
let chunk = world.chunks.get_mut(&chunk_pos).unwrap();
|
let chunk = world.chunks.get_mut(&chunk_pos).unwrap();
|
||||||
chunk.dirty = true;
|
chunk.dirty = true;
|
||||||
|
//send event
|
||||||
|
entities.add_entity(
|
||||||
|
(&mut events, &mut player_events),
|
||||||
|
(EventComponent, PlayerActionEvent::UpdatedBlock {
|
||||||
|
position: place_position,
|
||||||
|
block: place_block,
|
||||||
|
})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ use glam::UVec2;
|
||||||
use shipyard::{World, Component, AllStoragesViewMut, SparseSet};
|
use shipyard::{World, Component, AllStoragesViewMut, SparseSet};
|
||||||
use glium::glutin::event::{Event, DeviceEvent, DeviceId, WindowEvent};
|
use glium::glutin::event::{Event, DeviceEvent, DeviceId, WindowEvent};
|
||||||
|
|
||||||
|
pub mod player_actions;
|
||||||
|
|
||||||
#[derive(Component, Clone, Copy, Debug, Default)]
|
#[derive(Component, Clone, Copy, Debug, Default)]
|
||||||
pub struct EventComponent;
|
pub struct EventComponent;
|
||||||
|
|
||||||
|
|
36
src/events/player_actions.rs
Normal file
36
src/events/player_actions.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
use shipyard::{Component, View, ViewMut, EntitiesViewMut, IntoIter};
|
||||||
|
use glam::{IVec3, Quat, Vec3};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
world::block::Block,
|
||||||
|
player::MainPlayer,
|
||||||
|
transform::Transform
|
||||||
|
};
|
||||||
|
use super::EventComponent;
|
||||||
|
|
||||||
|
#[derive(Component, Clone, Copy, Debug)]
|
||||||
|
pub enum PlayerActionEvent {
|
||||||
|
PositionChanged {
|
||||||
|
position: Vec3,
|
||||||
|
direction: Quat
|
||||||
|
},
|
||||||
|
UpdatedBlock {
|
||||||
|
position: IVec3,
|
||||||
|
block: Block,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_move_events(
|
||||||
|
transforms: View<Transform>,
|
||||||
|
player: View<MainPlayer>,
|
||||||
|
mut entities: EntitiesViewMut,
|
||||||
|
mut events: ViewMut<EventComponent>,
|
||||||
|
mut actions: ViewMut<PlayerActionEvent>,
|
||||||
|
) {
|
||||||
|
let Some((_, transform)) = (&player, transforms.inserted_or_modified()).iter().next() else { return };
|
||||||
|
let (_, direction, position) = transform.0.to_scale_rotation_translation();
|
||||||
|
entities.add_entity(
|
||||||
|
(&mut events, &mut actions),
|
||||||
|
(EventComponent, PlayerActionEvent::PositionChanged { position, direction })
|
||||||
|
);
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
// allowed because systems often need a lot of arguments
|
||||||
|
#![allow(clippy::too_many_arguments)]
|
||||||
|
|
||||||
use shipyard::{
|
use shipyard::{
|
||||||
World, Workload, IntoWorkload,
|
World, Workload, IntoWorkload,
|
||||||
UniqueView, UniqueViewMut,
|
UniqueView, UniqueViewMut,
|
||||||
|
@ -44,7 +47,10 @@ use player::spawn_player;
|
||||||
use prefabs::load_prefabs;
|
use prefabs::load_prefabs;
|
||||||
use settings::load_settings;
|
use settings::load_settings;
|
||||||
use camera::compute_cameras;
|
use camera::compute_cameras;
|
||||||
use events::{clear_events, process_glutin_events};
|
use events::{
|
||||||
|
clear_events, process_glutin_events,
|
||||||
|
player_actions::generate_move_events
|
||||||
|
};
|
||||||
use input::{init_input, process_inputs};
|
use input::{init_input, process_inputs};
|
||||||
use fly_controller::update_controllers;
|
use fly_controller::update_controllers;
|
||||||
use rendering::{
|
use rendering::{
|
||||||
|
@ -74,6 +80,7 @@ fn update() -> Workload {
|
||||||
(
|
(
|
||||||
process_inputs,
|
process_inputs,
|
||||||
update_controllers,
|
update_controllers,
|
||||||
|
generate_move_events,
|
||||||
update_loaded_world_around_player,
|
update_loaded_world_around_player,
|
||||||
update_raycasts,
|
update_raycasts,
|
||||||
block_placement_system,
|
block_placement_system,
|
||||||
|
|
Loading…
Reference in a new issue