diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/event.rs | 38 | 
1 files changed, 37 insertions, 1 deletions
| diff --git a/src/event.rs b/src/event.rs index bafa43c..ce4f815 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,6 +1,9 @@  use super::raw; +use std::io; +  use num_traits::FromPrimitive; +use byteorder::{BigEndian, WriteBytesExt};  /// A rusty enum for all possible combat events.  /// @@ -102,6 +105,13 @@ pub enum EventKind {          longest_stack: i32,          removal: raw::CbtBuffRemove,      }, + +    /// Guild identification +    Guild { +        source_agent_addr: u64, +        raw_bytes: [u8; 16], +        api_guild_id: Option<String>, +    },  }  /// A higher-level representation of a combat event. @@ -199,8 +209,13 @@ impl Event {                  reward_id: raw_event.dst_agent,                  reward_type: raw_event.value,              }, +            CbtStateChange::Guild => EventKind::Guild { +                source_agent_addr: raw_event.src_agent, +                raw_bytes: get_guild_id_bytes(raw_event), +                api_guild_id: get_api_guild_string(&get_guild_id_bytes(raw_event)), +            },              // XXX: implement proper handling of those events! -            CbtStateChange::BuffInitial | CbtStateChange::Position | CbtStateChange::Velocity | CbtStateChange::Facing | CbtStateChange::TeamChange | CbtStateChange::AttackTarget | CbtStateChange::Targetable | CbtStateChange::MapId | CbtStateChange::ReplInfo | CbtStateChange::StackActive | CbtStateChange::StackReset | CbtStateChange::Guild=> { +            CbtStateChange::BuffInitial | CbtStateChange::Position | CbtStateChange::Velocity | CbtStateChange::Facing | CbtStateChange::TeamChange | CbtStateChange::AttackTarget | CbtStateChange::Targetable | CbtStateChange::MapId | CbtStateChange::ReplInfo | CbtStateChange::StackActive | CbtStateChange::StackReset => {                  return None              } @@ -298,6 +313,27 @@ fn check_damage(raw_event: &raw::CbtEvent) -> Option<EventKind> {      }  } +fn get_guild_id_bytes(raw_event: &raw::CbtEvent) -> [u8; 16] { +    let mut result = [0; 16]; +    let mut cursor = io::Cursor::new(&mut result as &mut [u8]); +    cursor.write_u64::<BigEndian>(raw_event.dst_agent).unwrap(); +    cursor.write_i32::<BigEndian>(raw_event.value).unwrap(); +    cursor.write_i32::<BigEndian>(raw_event.buff_dmg).unwrap(); +    result +} + +fn get_api_guild_string(bytes: &[u8; 16]) -> Option<String> { +    if bytes == &[0; 16] { +        return None; +    } +    let result = format!( +        "{:02X}{:02X}{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}-{:02X}{:02X}{:02X}{:02X}{:02X}{:02X}", +        bytes[4], bytes[5], bytes[6], bytes[7], bytes[2], bytes[3], bytes[0], bytes[1], bytes[11], +        bytes[10], bytes[9], bytes[8], bytes[15], bytes[14], bytes[13], bytes[12] +    ); +    Some(result) +} +  /// The different weapon-sets in game.  #[derive(Clone, Copy, Debug, PartialEq, Eq)]  pub enum WeaponSet { | 
