mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Add block breaking
This commit is contained in:
parent
a702f7258a
commit
42a4cc8095
@ -7,9 +7,7 @@ use common::{
|
||||
comp,
|
||||
msg::ServerMsg,
|
||||
npc::{get_npc_name, NpcKind},
|
||||
state::{TerrainChange, TimeOfDay},
|
||||
terrain::Block,
|
||||
vol::Vox,
|
||||
state::TimeOfDay,
|
||||
};
|
||||
use specs::{Builder, Entity as EcsEntity, Join};
|
||||
use vek::*;
|
||||
@ -106,18 +104,6 @@ lazy_static! {
|
||||
"/players : Show the online players list",
|
||||
handle_players,
|
||||
),
|
||||
ChatCommand::new(
|
||||
"solid",
|
||||
"{}",
|
||||
"/solid : Make the blocks around you solid",
|
||||
handle_solid,
|
||||
),
|
||||
ChatCommand::new(
|
||||
"empty",
|
||||
"{}",
|
||||
"/empty : Make the blocks around you empty",
|
||||
handle_empty,
|
||||
),
|
||||
ChatCommand::new(
|
||||
"help", "", "/help: Display this message", handle_help),
|
||||
ChatCommand::new(
|
||||
@ -365,44 +351,6 @@ fn handle_players(server: &mut Server, entity: EcsEntity, _args: String, _action
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_solid(server: &mut Server, entity: EcsEntity, _args: String, _action: &ChatCommand) {
|
||||
match server.state.read_component_cloned::<comp::Pos>(entity) {
|
||||
Some(current_pos) => {
|
||||
server.state.ecs().write_resource::<TerrainChange>().set(
|
||||
current_pos.0.map(|e| e.floor() as i32),
|
||||
Block::new(1, Rgb::broadcast(255)),
|
||||
);
|
||||
}
|
||||
None => server.clients.notify(
|
||||
entity,
|
||||
ServerMsg::Chat(String::from("You have no position!")),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_empty(server: &mut Server, entity: EcsEntity, _args: String, _action: &ChatCommand) {
|
||||
match server.state.read_component_cloned::<comp::Pos>(entity) {
|
||||
Some(current_pos) => {
|
||||
let mut terrain_change = server.state.ecs().write_resource::<TerrainChange>();
|
||||
|
||||
for i in -1..2 {
|
||||
for j in -1..2 {
|
||||
for k in -2..1 {
|
||||
terrain_change.set(
|
||||
current_pos.0.map(|e| e.floor() as i32) + Vec3::new(i, j, k),
|
||||
Block::empty(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
None => server.clients.notify(
|
||||
entity,
|
||||
ServerMsg::Chat(String::from("You have no position!")),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_build(server: &mut Server, entity: EcsEntity, _args: String, _action: &ChatCommand) {
|
||||
match server.state.read_component_cloned::<comp::CanBuild>(entity) {
|
||||
Some(_build_perms) => {
|
||||
|
@ -118,8 +118,6 @@ impl PlayState for SessionState {
|
||||
.read_component_cloned::<comp::CanBuild>(client.entity())
|
||||
{
|
||||
Some(_build_perms) => {
|
||||
println!("Placing block");
|
||||
|
||||
let (view_mat, _, cam_pos) =
|
||||
self.scene.camera().compute_dependents(&client);
|
||||
let cam_dir =
|
||||
@ -132,11 +130,14 @@ impl PlayState for SessionState {
|
||||
(ray.0, if let Ok(Some(_)) = ray.1 { true } else { false })
|
||||
};
|
||||
|
||||
if state {
|
||||
if b {
|
||||
let pos = (cam_pos + cam_dir * d).map(|e| e.floor() as i32);
|
||||
let pos = (cam_pos + cam_dir * (d - 0.01))
|
||||
.map(|e| e.floor() as i32);
|
||||
client.place_block(pos, Block::new(1, Rgb::broadcast(255))); // TODO: Handle block color with a command
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {
|
||||
if state {
|
||||
if let ClientState::Character = current_client_state {
|
||||
@ -152,13 +153,31 @@ impl PlayState for SessionState {
|
||||
}
|
||||
}
|
||||
Event::InputUpdate(GameInput::SecondAttack, state) => {
|
||||
match self
|
||||
.client
|
||||
.borrow()
|
||||
let mut client = self.client.borrow_mut();
|
||||
match client
|
||||
.state()
|
||||
.read_component_cloned::<comp::CanBuild>(self.client.borrow().entity())
|
||||
.read_component_cloned::<comp::CanBuild>(client.entity())
|
||||
{
|
||||
Some(_build_perms) => {}
|
||||
Some(_build_perms) => {
|
||||
let (view_mat, _, cam_pos) =
|
||||
self.scene.camera().compute_dependents(&client);
|
||||
let cam_dir =
|
||||
(self.scene.camera().get_focus_pos() - cam_pos).normalized();
|
||||
|
||||
let (d, b) = {
|
||||
let terrain = client.state().terrain();
|
||||
let ray =
|
||||
terrain.ray(cam_pos, cam_pos + cam_dir * 100.0).cast();
|
||||
(ray.0, if let Ok(Some(_)) = ray.1 { true } else { false })
|
||||
};
|
||||
|
||||
if state {
|
||||
if b {
|
||||
let pos = (cam_pos + cam_dir * d).map(|e| e.floor() as i32);
|
||||
client.remove_block(pos); // TODO: Handle block color with a command
|
||||
}
|
||||
}
|
||||
}
|
||||
None => {
|
||||
// TODO: Handle secondary attack here
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user