aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2019-05-15 04:49:15 +0200
committerDaniel Schadt <kingdread@gmx.de>2019-05-15 04:49:15 +0200
commit32bf6396a65e9aa83f746b964ed822fd5f839773 (patch)
tree6d1c0c5ce693b1f4f862be2e5d03cef34670408e
parent59e18747cbb50f78d79a19e2edf8ba0f634161c3 (diff)
downloadevtclib-32bf6396a65e9aa83f746b964ed822fd5f839773.tar.gz
evtclib-32bf6396a65e9aa83f746b964ed822fd5f839773.tar.bz2
evtclib-32bf6396a65e9aa83f746b964ed822fd5f839773.zip
add support for Event::Guild parsing
-rw-r--r--src/event.rs38
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 {