mirror of
https://github.com/italicsjenga/valence.git
synced 2024-12-23 22:41:30 +11:00
Add custom sound effect packet and sound example to conway (#12)
* Add custom sound effect packet, sound example * Small logic cleanup * More sound packets * fmt * Apply suggestions
This commit is contained in:
parent
cac348a4b6
commit
df3e5b12bb
|
@ -13,9 +13,11 @@ use valence::dimension::{Dimension, DimensionId};
|
|||
use valence::entity::types::Pose;
|
||||
use valence::entity::{EntityId, EntityKind, TrackedData};
|
||||
use valence::player_list::PlayerListId;
|
||||
use valence::protocol::packets::s2c::play::SoundCategory;
|
||||
use valence::server::{Server, SharedServer, ShutdownResult};
|
||||
use valence::text::{Color, TextFormat};
|
||||
use valence::{async_trait, ident};
|
||||
use vek::Vec3;
|
||||
|
||||
pub fn main() -> ShutdownResult {
|
||||
env_logger::Builder::new()
|
||||
|
@ -121,8 +123,6 @@ impl Config for Game {
|
|||
SIZE_Z as f64 / 2.0,
|
||||
];
|
||||
|
||||
server.state.paused = false;
|
||||
|
||||
server.clients.retain(|_, client| {
|
||||
if client.created_this_tick() {
|
||||
if self
|
||||
|
@ -192,8 +192,21 @@ impl Config for Game {
|
|||
&& (0..SIZE_Z as i32).contains(&position.z)
|
||||
&& position.y == BOARD_Y
|
||||
{
|
||||
server.state.board
|
||||
[position.x as usize + position.z as usize * SIZE_X] = true;
|
||||
let index = position.x as usize + position.z as usize * SIZE_X;
|
||||
|
||||
let normal_position = Into::<Vec3<i32>>::into(position);
|
||||
|
||||
if !server.state.board[index] {
|
||||
client.play_sound(
|
||||
ident!("minecraft:block.note_block.banjo"),
|
||||
SoundCategory::Block,
|
||||
Vec3::<f64>::new(normal_position.x.into(), normal_position.y.into(), normal_position.z.into()),
|
||||
0.5f32,
|
||||
1f32,
|
||||
);
|
||||
}
|
||||
|
||||
server.state.board[index] = true;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
|
@ -201,7 +214,17 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
if let TrackedData::Player(data) = player.data() {
|
||||
server.state.paused = data.get_pose() == Pose::Sneaking;
|
||||
let sneaking = data.get_pose() == Pose::Sneaking;
|
||||
if sneaking != server.state.paused {
|
||||
server.state.paused = sneaking;
|
||||
client.play_sound(
|
||||
ident!("minecraft:block.note_block.pling"),
|
||||
SoundCategory::Block,
|
||||
client.position().into(),
|
||||
0.5f32,
|
||||
if sneaking { 0.5f32 } else { 1f32 },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
true
|
||||
|
|
|
@ -21,6 +21,7 @@ use crate::entity::data::Player;
|
|||
use crate::entity::{
|
||||
velocity_to_packet_units, Entities, EntityEvent, EntityId, EntityKind, StatusOrAnimation,
|
||||
};
|
||||
use crate::ident::Ident;
|
||||
use crate::player_list::{PlayerListId, PlayerLists};
|
||||
use crate::player_textures::SignedPlayerTextures;
|
||||
use crate::protocol::packets::c2s::play::{
|
||||
|
@ -32,9 +33,10 @@ use crate::protocol::packets::s2c::play::{
|
|||
DimensionTypeRegistry, DimensionTypeRegistryEntry, Disconnect, EntitiesDestroy,
|
||||
EntityAnimation, EntityAttributes, EntityAttributesProperty, EntityPosition, EntitySetHeadYaw,
|
||||
EntityStatus, EntityTrackerUpdate, EntityVelocityUpdate, GameJoin, GameMessage,
|
||||
GameStateChange, GameStateChangeReason, KeepAlive, MoveRelative, PlayerActionResponse,
|
||||
PlayerPositionLook, PlayerPositionLookFlags, PlayerRespawn, PlayerSpawnPosition, RegistryCodec,
|
||||
Rotate, RotateAndMoveRelative, S2cPlayPacket, UnloadChunk, UpdateSubtitle, UpdateTitle,
|
||||
GameStateChange, GameStateChangeReason, KeepAlive, MoveRelative, PlaySoundId,
|
||||
PlayerActionResponse, PlayerPositionLook, PlayerPositionLookFlags, PlayerRespawn,
|
||||
PlayerSpawnPosition, RegistryCodec, Rotate, RotateAndMoveRelative, S2cPlayPacket,
|
||||
SoundCategory, UnloadChunk, UpdateSubtitle, UpdateTitle,
|
||||
};
|
||||
use crate::protocol::{BoundedInt, ByteAngle, NbtBridge, RawBytes, VarInt};
|
||||
use crate::server::{C2sPacketChannels, NewClientData, S2cPlayMessage, SharedServer};
|
||||
|
@ -457,6 +459,25 @@ impl<C: Config> Client<C> {
|
|||
self.new_game_mode = game_mode;
|
||||
}
|
||||
|
||||
/// Plays a sound to the client at a given position.
|
||||
pub fn play_sound(
|
||||
&mut self,
|
||||
name: Ident,
|
||||
category: SoundCategory,
|
||||
pos: Vec3<f64>,
|
||||
volume: f32,
|
||||
pitch: f32,
|
||||
) {
|
||||
self.send_packet(PlaySoundId {
|
||||
name,
|
||||
category,
|
||||
position: pos.iter().map(|x| *x as i32 * 8).collect(),
|
||||
volume,
|
||||
pitch,
|
||||
seed: 0,
|
||||
});
|
||||
}
|
||||
|
||||
/// Sets the title this client sees.
|
||||
///
|
||||
/// A title is a large piece of text displayed in the center of the screen
|
||||
|
|
|
@ -227,6 +227,32 @@ pub mod play {
|
|||
}
|
||||
}
|
||||
|
||||
def_enum! {
|
||||
SoundCategory: VarInt {
|
||||
Master = 0,
|
||||
Music = 1,
|
||||
Record = 2,
|
||||
Weather = 3,
|
||||
Block = 4,
|
||||
Hostile = 5,
|
||||
Neutral = 6,
|
||||
Player = 7,
|
||||
Ambient = 8,
|
||||
Voice = 9,
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
PlaySoundId {
|
||||
name: Ident,
|
||||
category: SoundCategory,
|
||||
position: Vec3<i32>,
|
||||
volume: f32,
|
||||
pitch: f32,
|
||||
seed: i64,
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
Disconnect {
|
||||
reason: Text,
|
||||
|
@ -704,6 +730,27 @@ pub mod play {
|
|||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
PlaySoundFromEntity {
|
||||
id: VarInt,
|
||||
category: SoundCategory,
|
||||
entity_id: VarInt,
|
||||
volume: f32,
|
||||
pitch: f32
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
PlaySound {
|
||||
id: VarInt,
|
||||
category: SoundCategory,
|
||||
position: Vec3<i32>,
|
||||
volume: f32,
|
||||
pitch: f32,
|
||||
seed: i64
|
||||
}
|
||||
}
|
||||
|
||||
def_struct! {
|
||||
GameMessage {
|
||||
chat: Text,
|
||||
|
@ -765,6 +812,7 @@ pub mod play {
|
|||
BlockUpdate = 9,
|
||||
BossBar = 10,
|
||||
ClearTitles = 13,
|
||||
PlaySoundId = 23,
|
||||
Disconnect = 25,
|
||||
EntityStatus = 26,
|
||||
UnloadChunk = 28,
|
||||
|
@ -792,6 +840,8 @@ pub mod play {
|
|||
WorldTimeUpdate = 92,
|
||||
UpdateTitle = 93,
|
||||
TitleFade = 94,
|
||||
PlaySoundFromEntity = 95,
|
||||
PlaySound = 96,
|
||||
GameMessage = 98,
|
||||
PlayerListHeaderFooter = 99,
|
||||
EntityPosition = 102,
|
||||
|
|
Loading…
Reference in a new issue