1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
use crate::network::*; use crate::packet::*; use basin2_lib::result::*; use bytes::BytesMut; #[derive(PartialEq, Clone, Debug)] pub struct PlayerCombatPacket { pub event: PlayerCombatPacketEvent, pub playerId: i32, pub killerId: i32, pub duration: i32, pub message: Option<ChatComponent>, } impl CodablePacket for PlayerCombatPacket { fn encode(self, buf: &mut BytesMut) { use PlayerCombatPacketEvent::*; buf.set_mc_var_int(self.event as i32); match self.event { EndCombat => { buf.set_mc_var_int(self.duration); buf.set_mc_i32(self.killerId); } EntityDied => { buf.set_mc_var_int(self.playerId); buf.set_mc_i32(self.killerId); buf.set_mc_chat_component( self.message.unwrap_or(ChatComponent::from("".to_string())), ); } _ => (), } } fn decode(buf: &mut BytesMut) -> Result<Self> where Self: Sized, { use PlayerCombatPacketEvent::*; let event: PlayerCombatPacketEvent = buf.get_mc_enum()?; let (playerId, killerId, duration, message) = match event { EndCombat => { let duration = buf.get_mc_var_int()?; let killerId = buf.get_mc_i32()?; (0, killerId, duration, None) } EntityDied => ( buf.get_mc_var_int()?, buf.get_mc_i32()?, 0, Some(buf.get_mc_chat_component()?), ), EnterCombat => (0, 0, 0, None), }; return Ok(PlayerCombatPacket { event, playerId, killerId, duration, message, }); } } #[cfg(test)] mod tests { use super::*; use crate::packet::test::*; #[test] fn test_cycle_end() -> Result<()> { cycle(PlayerCombatPacket { event: PlayerCombatPacketEvent::EndCombat, playerId: 0, killerId: 3453, duration: 65435, message: None, }) } #[test] fn test_cycle_died() -> Result<()> { cycle(PlayerCombatPacket { event: PlayerCombatPacketEvent::EntityDied, playerId: 3453, killerId: 65435, duration: 0, message: Some(ChatComponent::from("test".to_string())), }) } #[test] fn test_cycle_enter() -> Result<()> { cycle(PlayerCombatPacket { event: PlayerCombatPacketEvent::EnterCombat, playerId: 0, killerId: 0, duration: 0, message: None, }) } }