Implements support for receiving chat messages from the server, the
first step towards #63 chat support. Long way to go, but is a start.
* server: handle ServerMessage_* packets, on_servermessage
* format: get the with arguments of translations
* format: hardcode chat types
* format: support bare strings, used in chat.type.text
* format: use extra text if present, fixes missing username on 1.16.5
* console/main/server: activate on receiving chat messages
Replace std::time with the `instant` crate, which bridges to std::time on
native but on wasm calls performance.now() instead of panicking.
A step towards 🕸️ Web support #446
* logo: replace SystemTime/UNIX_EPOCH with Instant
A small step for #446🕸️ Web support, use web-sys to interface to the web.
Previously, we would try to use glutin on the web, which is not supported;
now glutin is only used on native: fixes#171 could not find Context in platform_impl.
winit is still used on both, but the GL context is created with web-sys and glow
(on the web), and created with glutin and used with glow (on native). stdweb is
no longer used, being replaced by web-sys.
Substantial refactoring to allow reusing the code between web/native:
* settings: use VirtualKeyCode from winit, not reexported from glutin
* std_or_web: remove broken localstoragefs/stdweb, add File placeholder
* render: disable skin_thread on wasm since we don't have threads
* gl: use glow types in gl wrapper (integers in native, but Web*Key in web)
* gl: web-sys WebGlUniformLocation does not implement Copy trait, so glow::UniformLocation doesn't so gl::Uniform can't
* gl: refactor context initialization, pass glow::Context to gl::init for consistency between native/web
* gl: update to glow with panicking tex_image_2d_multisample web-sys wrapper
* glsl: use shader version in GLSL for WebGL 2 and OpenGL 3.2
* shaders: add explicit float/int type conversions, required for WebGL
* shaders: specify mediump precision, required for WebGL
* shaders: specify fragment shader output locations for WebGL
* main: refactor handle_window_event to take a winit window, not glutin context
* main: handle resize outside of handle_window_event since it updates the glutin window (the only event which does this)
* main: use winit events in handle_window_event not reexported glutin events
* main: refactor game loop handling into tick_all()
* main: create winit window for WebGL, and use winit_window from glutin
* main: restore console_error_panic_hook, mistakingly removed in (#260)
* main: remove force setting env RUST_BACKTRACE=1, no longer can set env on web
* www: index.js: fix wasm import path
* www: npm update, npm audit fix
* www: update readme to link to status on #446🕸️ Web support
Closes#425 build(deps): bump wasm-bindgen from 0.2.68 to 0.2.69
Closes#426 build(deps): bump structopt from 0.3.20 to 0.3.21
Closes#427 build(deps): bump serde_json from 1.0.59 to 1.0.60
Closes#428 build(deps): bump serde from 1.0.117 to 1.0.118
Closes#433 build(deps): bump reqwest from 0.10.9 to 0.10.10
Fixes#408 1.16.1: EntityEquipment_VarInt : Main thread panic: Failed to read all of packet 0x47, had 363 bytes left - enchants
Fixes#421 1.16.1: EntityEquipment_VarInt : Player heads break things. (Failed to read all of packet 0x47, had 1292 bytes left)
Bump cfg-if to 1.0.0 (closes#412)
Bump serde to 1.0.117 (closes#416)
Bump serde_json to 1.0.59 (closes#413)
Bump structopt to 0.3.20 (closes#414)
Bump flate2 to 1.0.19 (closes#420)
Bump reqwest to 0.10.9 (closes#423)
Adds support for 1.16.4 (754) / 1.16.3 (753) / 1.16.2 (751) protocols
* Update packet IDs and readme
* Add and handle ChunkData_Biomes3D_VarInt variant
* Support world chunk data padded bit map array
* Add and handle JoinGame_WorldNames_IsHard variant
* Add and handle MultiBlockChange_Packed variant
* Add UnlockRecipes_WithBlastSmoker variant
* Add SetDisplayedRecipe and SetRecipeBookState packets
Closes#372 bump log from 0.4.8 to 0.4.11
Closes#387 bump reqwest from 0.10.6 to 0.10.8
Closes#391 bump wasm-bindgen from 0.2.64 to 0.2.68
Closes#403 bump serde_json from 1.0.56 to 1.0.58
Closes#405 bump flate2 from 1.0.16 to 1.0.18
Closes#409 bump structopt from 0.3.15 to 0.3.19
* Minor change: Don't consume self when writing packet to a writer. Mutability is not affected.
* Further decrease packet write requirements
Co-authored-by: Terminator <terminator@nonexistent.com>
Bump flate2 to 1.0.16, closes#350
Bump serde_json to 1.0.56, closes#349
Bump wasm-bindgen to 0.2.64, closes#348
gl: Bump libc to 0.2.71
protocol: Bump hex to 0.4.2
protocol: Bump aes to 0.4.0
protocol: Bump cfb8 to 0.4.0
protocol: Bump num-traits to 0.2.12
* Update shifted packet ids
* Add new smithing recipe type
* Also support 1.16 (735), same packets as 1.16.1 (736)
New packets:
* GenerateStructure
New packet variants:
* UseEntity_Sneakflag, split from UseEntity_Hand
* ClientAbilities_u8, split from ClientAbilities_f32
* UpdateJigsawBlock_Joint, split from UpdateJigsawBlock_Type
* ServerMessage_Sender, split from ServerMessage_Position
* ChunkData_Biomes3D_bool, split from ChunkData_Biomes3D
* JoinGame_WorldNames, split from JoinGame_HashedSeed_Respawn
* Respawn_WorldName, split from Respawn_Gamemode
* EntityEquipment_VarInt renamed
* UpdateLight_WithTrust, split from UpdateLight_NoTrust
* LoginSuccess_UUID, split from LoginSuccess_String
Update to structopt 0.3.15, closes#330
Update to base64 0.12.2, closes#329
Update to zip 0.5.6, closes#328
Update to serde_json 1.0.55, closes#327
Update to reqwest 0.10.6, closes#321
Update to flate2 1.0.14, closes#303
Update to byteorder 1.3.4, closes#285
Closes#276 Bump serde_json from 1.0.44 to 1.0.45
Closes#274 Bump structopt from 0.3.7 to 0.3.8
Closes#273 Bump image from 0.22.3 to 0.22.4
Closes#272 Bump rand from 0.7.2 to 0.7.3
Closes#270 Bump num-traits from 0.2.10 to 0.2.11
Closes#269 Bump reqwest from 0.10.0 to 0.10.1
Completes the move of the protocol implementation into a new
crate, named steven_protocol, in the protocol/ subdirectory.
* Add Cargo.toml for steven_protocol
* Add steven_protocol entrypoint in protocol/src/lib.rs
* Use steven_protocol in main
* Remove protocol in main, replaced by steven_protocol
* Remove unused dependencies moved into steven_protocol
The Display trait is already implemented, so this is only a code
deletion. Fixes 1.42-nightly warning:
warning: use of deprecated item 'std::error::Error::description': use the Display impl or to_string()
--> src/protocol/mod.rs:981:40
|
981 | Error::IOError(ref e) => e.description(),
| ^^^^^^^^^^^
|
= note: `#[warn(deprecated)]` on by default
The first in support for modded content, a simple custom block: "rockwool" from the Thermal Expansion and Thermal Foundation mods for Forge:
https://ftb.gamepedia.com/Rockwool_(Thermal_Expansion_3)
This makes use of the Forge handshake (#88#134#144), matching the mod block names from the negotiation to numeric identifiers in the world to steven_blocks. Rockwool was chosen due to ease of implementation, it looks like wool from vanilla (except is fire-proof), and by supporting it the groundwork necessary is laid for more sophisticated mod support.
Tested with Thermal Expansion on 1.7.10, 1.10.2 (FTB Beyond), and 1.12.2 Forge servers.
* Add `modid` macro token, skipped from vanilla mappings
* Add ThermalExpansionRockwool block (1.7.10)
* Register modded blocks by modid->[data], and lookup block metadata
* Save block IDs from ModIdData/RegistryData to World modded_block_ids
* Add namespaced mod ids for ModIdData, \u{1}=block \u{2}=item
* Add ThermalFoundation's Rockwool (1.12.2)
Leave the advancements packet as an opaque blob for now instead of trying to deserialize it, because it apparently is changed on some modded servers - see https://github.com/iceiix/stevenarella/issues/148
See c1692e950a
There are two more instances, encountered when debugging #148
> Instead of read_to_string(), use read_to_end() to read into a buffer,
> then convert using String::from_utf8() and unwrap it. This gives a
> better error message when UTF-8 fails to decode.
which includes the offending bytes that can't be converted
See c1692e950a
There are two more instances, encountered when debugging #148
> Instead of read_to_string(), use read_to_end() to read into a buffer,
> then convert using String::from_utf8() and unwrap it. This gives a
> better error message when UTF-8 fails to decode.
which includes the offending bytes that can't be converted
Previously, the zlib compressor was initialized once, lazily, then reused for each packet by resetting the stream. This didn't properly emit the zlib headers, so packet compression was broken and caused "java.util.zip.DataFormatException: incorrect header check" on the server. Since packets are only compressed above a threshold, this problem manifested itself only on larger servers, such as 1.10.2 FTB Beyond and Skyfactory 3, and 1.12.2 SevTech: Ages, which require sending a large ModList above the compression threshold enabled by the server. Change to instead recreate the zlib compressor, each time it is used as to capture the full header. For symmetry, the decompressor is also recreated each time.
* Removes self.compression_write and self.compression_read instance variables
* Remove self.compression_write, initialize with cursor
* Log compressing/decompressing packets in network debug mode
Adds support for connecting to Forge servers from 1.8.9 up to 1.12.2.
(1.7.10 was already supported with #134#88)
Tested on:
- 1.8.9 + forge 11.15.1.2318 + ironchest
- 1.10.2 + forge 12.18.3.2511 + ironchest
- 1.11.2 + forge 13.20.1.2588 + ironchest
- 1.12.2 + forge 14.23.5.2837 + ironchest
Changes:
* Parse and handle FmlHs::RegistryData packet for 1.8+
* Fix RegistryData acknowledgement phase WaitingServerComplete
* Fix acknowledgement phase for 1.7.10 ModIdData too, somehow it worked accidentally
* Append \0FML\0 to end of server hostname if Forge mods detected
https://wiki.vg/Minecraft_Forge_Handshake#Connection_to_a_forge_server
Movement packets were handled incorrectly, because although the fields are specified as integers they are actually fixed-point values, which need to be converted to floating-point before use. These fields were converted with `as f64`, but they actually need to be scaled. To fix this add several new types, FixedPoint5 for 5-bit fractional fixed-point and FixedPoint12 for 12-bit. Both are parameterized by an integer type: FixedPoint5<i32> and FixedPoint5<i8> for 1.7.10/1.8.9, FixedPoint12<i16> for 1.9+. This moves the calculation into the packet field parsing, so it no longer has to be calculated in src/server/mod.rs since the scaling is taken care of as part of the field type. This fixes the long-standing invisible or actually misplaced players bug on 1.7.10 and 1.8.9, closes#139.
* Add new FixedPoint5<T> type for 1.7/8, https://wiki.vg/Data_types#Fixed-point_numbers
* Add FixedPoint12<i16> for 1.9+, moving type conversion into packet type
https://wiki.vg/index.php?title=Protocol#Entity_Relative_Move
* Add num-traits 0.2.6 dependency for NumCast to use instead of From
* Use FixedPoint5<i32> in spawn object, experience orb, global entity, mob, player, teleport
* Use FixedPoint5<i8> and FixedPoint12<i16> in entity move, look and move
* Update packet handling bouncer functions, using f64::from for each conversion
std::convert::From<usize> cannot be used here because we cannot
implement bool<->usize conversions, due to Rust's orphan rules:
http://smallcultfollowing.com/babysteps/blog/2015/01/14/little-orphan-impls/
"prevent you from implementing external traits for external types"
Nonetheless, Lengthable used the same methods as From. This is allowed
but can require disambiguation if both are used, no longer strictly
needed for #140 but to reduce confusion and improve clarity, renamed
`from` to `from_len` and `into` to `into_len`.
src/format.rs Component from_string() attempts JSON deserialization
using serde_json::from_str, and if it fails falls back to a literal text
string. Call from_string() instead of deserializing in format::Component
read_from() and then from_value(). Note the from_string() comment:
// Sometimes mojang sends a literal string, so we should interpret it literally
Adds support for connecting to 1.7.10 modded servers using the FML|HS protocol:
https://wiki.vg/Minecraft_Forge_Handshake
* Handle client-bound plugin message packets
* Parse FML|HS plugin channel messages
* Add ModList serialization using Mod serializable, LenPrefixed<VarInt, Mod>
* Save forge_mods from server ping and send in FML|HS ModList packet
* Show Forge mod count in server ping listing
* Send acknowledgements, completing the handshake
* Add VarShort to custom payload len prefix replaces i16, fixes OOM on large modded servers
* Add custom CoFHLib's SendUUID packet -26
See explanation at https://github.com/SpigotMC/BungeeCord/issues/1437
This packet is defined by CoFHLib in https://github.com/CoFH/CoFHLib/blob/1.7.10/src/main/java/cofh/lib/util/helpers/SecurityHelper.java#L40
Fixes thread '' panicked at 'bad packet id 0xffffffe6 in Clientbound Play' with FTB:IE
Pass -n or --network-debug to print out the packets from the server as
they are received, as well as write to last-packet for later analysis.
Useful when debugging network protocol issues. Builds on #90#114.
Adds 1.14 (477) protocol support, based on:
https://wiki.vg/index.php?title=Pre-release_protocol&oldid=14723
* New packets: SetDifficulty, LockDifficulty, UpdateJigsawBlock, UpdateViewPosition, UpdateViewDistance
* New metadata: Optional VarInt (17) and Pose (18)
* Add new join game variant with view distance, without difficulty
* Add new server difficulty variant, with locked boolean
* Implement recipe parsing changes, add stonecutting recipe type
Adds 1.14 (477) protocol support, based on:
https://wiki.vg/index.php?title=Pre-release_protocol&oldid=14723
* New packets: SetDifficulty, LockDifficulty, UpdateJigsawBlock, UpdateViewPosition, UpdateViewDistance
* New metadata: Optional VarInt (17) and Pose (18)
* Add new join game variant with view distance, without difficulty
* Add new server difficulty variant, with locked boolean
* Implement recipe parsing changes, add stonecutting recipe type
Note this only is the first step in web support, although the project compiles, it doesn't run!
Merging now to avoid branch divergence, until dependencies can be updated for wasm support.
* Add instructions to build for wasm32-unknown-unknown with wasm-pack in www/
* Update to rust-clipboard fork to compile with emscripten
https://github.com/aweinstock314/rust-clipboard/pull/62
* Exclude reqwest dependency in wasm32
* Exclude compiling clipboard pasting on wasm32
* Exclude reqwest-using code from wasm32
* Install wasm target with rustup in Travis CI
* Update to collision 0.19.0
Fixes wasm incompatibility in deprecated rustc-serialize crate: https://github.com/rustgd/collision-rs/issues/106
error[E0046]: not all trait items implemented, missing: `encode`
--> github.com-1ecc6299db9ec823/rustc-serialize-0.3.24/src/serialize.rs:1358:1
* Increase travis_wait time even further, try 120 minutes
* Set RUST_BACKTRACE=1 in main
* Remove unused unneeded bzip2 features in zip crate
To fix wasm32-unknown-unknown target compile error:
error[E0432]: unresolved imports `libc::c_int`, `libc::c_uint`, `libc::c_void`, `libc::c_char`
--> src/github.com-1ecc6299db9ec823/bzip2-sys-0.1.7/lib.rs:5:12
|
5 | use libc::{c_int, c_uint, c_void, c_char};
| ^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ no `c_char` in the root
| | | |
| | | no `c_void` in the root
| | no `c_uint` in the root
| no `c_int` in the root
* flate2 use Rust backend
* Add console_error_panic_hook module for wasm backtraces
* Build using wasm-pack, wasm-bindgen, run with wasm-app
* Update to miniz_oxide 0.2.1, remove patch for https://github.com/Frommi/miniz_oxide/issues/42
* Update to official clipboard crate since https://github.com/aweinstock314/rust-clipboard/pull/62 was merged, but git revision pending release
* Update to branch of glutin attempting to build for wasm
https://github.com/iceiix/glutin/pull/1
* Update winit dependency of glutin to git master
https://github.com/iceiix/winit/pull/2
* Update to glutin branch with working (compiles, doesn't run) wasm_stub
* Add app name in title on web page
* Add wasm to Travis-CI test matrix
* Update glutin to fix Windows EGL compilation on AppVeyor
97797352b5