Skip to content

Commit

Permalink
documentation improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Snowiiii committed Aug 5, 2024
1 parent 9e63429 commit 530a5c8
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 45 deletions.
51 changes: 40 additions & 11 deletions pumpkin-protocol/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,43 @@ Packets in the Pumpkin protocol are organized by functionality and state.
### How to add a Packet ?
You can find all Minecraft Java packets at https://wiki.vg/Protocol. There you also can see in which [State](State) they are.
You also can see all the information the Packets has which we can either Write or Read depending if its Serverbound or Clientbound
#### Adding a Serverbound Packet
Serverbound Packets do use the trait `ServerPacket` which has an packet id (use hex) and can read incoming Client packets.
https://wiki.vg/Protocol gives you the Packet structure which you can than read. Feel free to orientate on already existing Packets.
Please use a name structure like `SPacketName` for the struct, The 'S' representing its Serverbound.
Registering: Don't forget to register the Packet. All Packets before the Player is created so before the Play state. Are using the `ClientPacketProcessor` which calls the packet at `Client::handle_packet` (both in the pumpkin crate)
#### Adding a Clientbound Packet
Clientbound Packets do use the trait `ClientPacket` which has an packet id (use hex) and can write outgoining Server packets.
https://wiki.vg/Protocol gives you the Packet structure which you can than write. Feel free to orientate on already existing Packets.
Please use a name structure like `CPacketName` for the struct, The 'C' representing its Clientbound.
You don't need to register the Packet anywhere, You should just be able now to send it via `Client::send_packet` this will get a result. You should kick the client when an important Packet could't been send. Otherwise
just log an warn.
#### Adding a Packet
Adding a Packet is easy. First you have to dereive serde Serialize.
```rust
#[derive(Serialize)]
```
Next you have set the packet id using the packet macro
```rust
#[packet(0x1D)]
```
Now you can create the Field. Please start the Packet name with "C" if its Clientbound and with "S" if its Serverbound.
Example:
```rust
pub struct CPlayDisconnect {
reason: TextComponent,
more fields...
}
```
Also don't forgot to impl a new function for Clientbound Packets so we can actaully send then by putting in the values :D
Example:
```rust
impl CPlayDisconnect {
pub fn new(reason: TextComponent) -> Self {
Self { reason }
}
}
```
At the End everything should come together
```rust
#[derive(Serialize)]
#[packet(0x1D)]
pub struct CPlayDisconnect {
reason: TextComponent,
}

impl CPlayDisconnect {
pub fn new(reason: TextComponent) -> Self {
Self { reason }
}
}
``
8 changes: 4 additions & 4 deletions pumpkin-protocol/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,14 @@ pub enum ConnectionState {
Play,
}

impl ConnectionState {
pub fn from_varint(var_int: VarInt) -> Self {
match var_int {
impl From<VarInt> for ConnectionState {
fn from(value: VarInt) -> Self {
match value {
1 => Self::Status,
2 => Self::Login,
3 => Self::Transfer,
_ => {
log::info!("Unexpected Status {}", var_int);
log::info!("Unexpected Status {}", value);
Self::Status
}
}
Expand Down
2 changes: 1 addition & 1 deletion pumpkin-protocol/src/server/handshake/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ impl ServerPacket for SHandShake {
protocol_version: bytebuf.get_var_int(),
server_address: bytebuf.get_string_len(255).unwrap(),
server_port: bytebuf.get_u16(),
next_state: ConnectionState::from_varint(bytebuf.get_var_int()),
next_state: bytebuf.get_var_int().into(),
}
}
}
2 changes: 1 addition & 1 deletion pumpkin-protocol/src/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use core::str;
use fastnbt::SerOpts;
use serde::Deserialize;

// represents a text component
// Fepresents a Text component
// Reference: https://wiki.vg/Text_formatting#Text_components
#[derive(Clone, PartialEq, Default, Debug, Deserialize)]
pub struct TextComponent {
Expand Down
50 changes: 23 additions & 27 deletions pumpkin/src/configuration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,49 +29,45 @@ impl Default for AdvancedConfiguration {
}
}

#[derive(Deserialize, Serialize)]
#[derive(Serialize, Deserialize)]
pub struct BasicConfiguration {
/// DO NOT CHANGE
/// Generated to see if config may have been updated with an new Update
/// A version identifier for the configuration format.
pub config_version: String,
/// The Server Address to bind
/// The address to bind the server to.
pub server_address: String,
/// The Server Port to bind
/// Minecraft java editon uses 25565 by default
/// The port to listen on.
pub server_port: u16,
/// The World sent to the Client
/// The seed for world generation.
pub seed: String,
/// The Maximum amout of player which can join the Server
/// The maximum number of players allowed on the server.
pub max_players: u32,
/// The Maximum view distance
pub view_distances: u8,
/// The Maximum simulated view distance
/// The maximum view distance for players.
pub view_distance: u8,
/// The maximum simulated view distance.
pub simulation_distance: u8,
/// Path for resource pack
/// The path to the resource pack.
pub resource_pack: String,
/// Sha1 hash of resource pack, when present
/// The SHA1 hash of the resource pack.
pub resource_pack_sha1: String,
/// default difficulty
/// The default game difficulty.
pub default_difficulty: Difficulty,
/// allow nether dimension
/// Whether the Nether dimension is enabled.
pub allow_nether: bool,
/// is the server hardcore mode?
/// Whether the server is in hardcore mode.
pub hardcore: bool,
/// Online Mode, Require a valid Minecraft account to join the Server, Also adds support for Skins and Capes
/// IMPORTANT: Be carefull when turning this off, Everyone could join your server and use any Nickname or UUID they want
/// Whether online mode is enabled. Requires valid Minecraft accounts.
pub online_mode: bool,
/// Enable encryption for Packets send & received.
/// IMPORTANT: When Online mode is enabled, encryption MUST be enabled also
/// Whether packet encryption is enabled. Required when online mode is enabled.
pub encryption: bool,
/// When enabled, Client can't use a diffrent ip to login as they use for the Authentication Server
/// Usally preventing proxy connections
/// Whether to prevent proxy connections.
pub prevent_proxy_connections: bool,
/// The description send when Client performs a Status request, (e.g Multiplayer Screen)
/// The server's description displayed on the status screen.
pub motd: String,
/// default gamemode (e.g. Survival, Creative...)
/// The default game mode for players.
pub default_gamemode: GameMode,
}


impl Default for BasicConfiguration {
fn default() -> Self {
Self {
Expand All @@ -80,7 +76,7 @@ impl Default for BasicConfiguration {
server_port: 25565,
seed: "".to_string(),
max_players: 100000,
view_distances: 10,
view_distance: 10,
simulation_distance: 10,
resource_pack: "".to_string(),
resource_pack_sha1: "".to_string(),
Expand Down Expand Up @@ -129,9 +125,9 @@ impl BasicConfiguration {
self.config_version, CURRENT_BASE_VERSION,
"Config version does not match used Config version. Please update your config"
);
assert!(self.view_distances >= 2, "View distance must be atleast 2");
assert!(self.view_distance >= 2, "View distance must be atleast 2");
assert!(
self.view_distances <= 32,
self.view_distance <= 32,
"View distance must be less than 32"
);
if self.online_mode {
Expand Down
2 changes: 1 addition & 1 deletion pumpkin/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ impl Server {
self.base_config.hardcore,
vec!["minecraft:overworld".into()],
self.base_config.max_players as VarInt,
self.base_config.view_distances as VarInt, // view distance todo
self.base_config.view_distance as VarInt, // view distance todo
self.base_config.simulation_distance as VarInt, // sim view dinstance todo
false,
false,
Expand Down

0 comments on commit 530a5c8

Please sign in to comment.