1use serde::Serialize;
15use serde_json::{Value, json};
16use yog_ids::client_op as op;
17
18use crate::client::op::{ask, call};
19
20#[derive(Serialize, Debug, Clone, Copy, PartialEq, Default)]
22pub struct Drive {
23 pub forward: f32,
25 pub strafe: f32,
27 pub jump: bool,
28 pub sneak: bool,
29 pub sprint: bool,
30 pub use_item: bool,
32}
33
34pub fn drive(keys: Drive) {
36 call(op::DRIVE, json!(keys));
37}
38
39pub fn release() {
41 call(op::RELEASE, Value::Null);
42}
43
44pub fn look(yaw: f32, pitch: f32) {
46 call(op::LOOK, json!({ "yaw": yaw, "pitch": pitch }));
47}
48
49pub fn attack(uuid: Option<&str>) {
51 call(op::ATTACK, json!({ "entity": uuid }));
52}
53
54pub fn use_item(off_hand: bool) {
56 call(op::USE, json!({ "off_hand": off_hand }));
57}
58
59#[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq)]
61#[serde(rename_all = "lowercase")]
62pub enum Face {
63 Down,
64 Up,
65 North,
66 South,
67 West,
68 East,
69}
70
71pub fn mine(pos: [i32; 3], face: Face) -> bool {
73 ask(op::MINE, json!({ "x": pos[0], "y": pos[1], "z": pos[2], "face": face })).unwrap_or(false)
74}
75
76pub fn stop_mining() {
78 call(op::MINE, json!({ "stop": true }));
79}
80
81pub fn place(pos: [i32; 3], face: Face) -> bool {
83 ask(op::PLACE, json!({ "x": pos[0], "y": pos[1], "z": pos[2], "face": face })).unwrap_or(false)
84}
85
86pub fn select_slot(slot: u8) {
88 call(op::SLOT, json!({ "slot": slot }));
89}
90
91pub fn click(slot: i32, button: i32, mode: &str) {
93 call(op::CLICK, json!({ "slot": slot, "button": button, "mode": mode }));
94}
95
96pub fn chat(text: &str) {
98 call(op::CHAT, json!({ "text": text }));
99}