Track player's location

This commit is contained in:
Nobody 2022-02-04 22:58:19 +05:00
parent 1c70db7459
commit 3cf1b4719b

View File

@ -1,36 +1,79 @@
use std::sync::{mpsc, Arc}; use std::sync::{mpsc::{self, Sender, Receiver}, Arc, Mutex};
use std::thread;
use std::collections::HashMap; use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};
use crate::server::IpcMessage; use crate::server::IpcMessage;
use prost::Message; use prost::Message;
use proto; use proto;
use proto::{PacketId, CombatTypeArgument, ForwardType}; use proto::{PacketId, CombatTypeArgument, ForwardType, ProtEntityType};
use packet_processor_macro::*; use packet_processor_macro::*;
#[macro_use] #[macro_use]
use packet_processor::*; use packet_processor::*;
use crate::utils::IdManager;
#[derive(Debug, Clone)]
struct Player {
player_id: u32,
pos: proto::Vector,
current_block: u32,
}
#[derive(Debug)]
pub struct Entity {
health: i32,
entity_id: u32,
}
#[packet_processor( #[packet_processor(
CombatInvocationsNotify, CombatInvocationsNotify,
)] )]
pub struct EntitySubsystem { pub struct EntitySubsystem {
packets_to_send_tx: mpsc::Sender<IpcMessage>, packets_to_send_tx: Sender<IpcMessage>,
players: Arc<Mutex<HashMap<u32, Player>>>,
players_moved: Sender<u32>,
} }
impl EntitySubsystem { impl EntitySubsystem {
pub fn new(packets_to_send_tx: mpsc::Sender<IpcMessage>) -> EntitySubsystem { pub fn new(packets_to_send_tx: Sender<IpcMessage>) -> EntitySubsystem {
let (tx, rx): (Sender<u32>, Receiver<u32>) = mpsc::channel();
let mut es = EntitySubsystem { let mut es = EntitySubsystem {
packets_to_send_tx: packets_to_send_tx, packets_to_send_tx: packets_to_send_tx,
packet_callbacks: HashMap::new(), packet_callbacks: HashMap::new(),
players_moved: tx,
players: Arc::new(Mutex::new(HashMap::new())),
}; };
es.register(); es.register();
es.run(rx);
return es; return es;
} }
fn run(&mut self, mut rx: Receiver<u32>) {
let players = self.players.clone();
thread::spawn(move|| {
loop {
let player_id = rx.recv().unwrap();
let mut player = match players.lock() {
Ok(mut players) => players.get_mut(&player_id).unwrap().clone(),
Err(_) => panic!("Failed to grab player data!"),
};
println!("Player {:?} moved!", player);
// TODO: get block!
}
});
}
fn process_combat_invocations(&self, user_id: u32, metadata: &proto::PacketHead, notify: &proto::CombatInvocationsNotify) { fn process_combat_invocations(&self, user_id: u32, metadata: &proto::PacketHead, notify: &proto::CombatInvocationsNotify) {
for invoke in notify.invoke_list.iter() { for invoke in notify.invoke_list.iter() {
self.handle_invoke(user_id, metadata, invoke); self.handle_invoke(user_id, metadata, invoke);
@ -68,7 +111,40 @@ impl EntitySubsystem {
} }
fn ih_entity_move(&self, user_id: u32, metadata: &proto::PacketHead, invoke: &proto::EntityMoveInfo) { fn ih_entity_move(&self, user_id: u32, metadata: &proto::PacketHead, invoke: &proto::EntityMoveInfo) {
if IdManager::get_entity_type_by_id(invoke.entity_id) == ProtEntityType::ProtEntityAvatar {
// Avatar moved => update player's position
let pos = if let Some(motion_info) = invoke.motion_info.as_ref() {
if let Some(pos) = motion_info.pos.as_ref() {
pos.clone()
} else {
return;
}
} else {
return;
};
match self.players.lock()
{
Ok(mut players) => match players.entry(user_id) {
Occupied(mut player) => {
player.into_mut().pos = pos;
},
Vacant(entry) => {
// TODO: must panic!() here!
let player = Player {
player_id: user_id,
pos: pos,
current_block: 0,
};
entry.insert(player);
},
},
Err(_) => panic!("Failed to grab player data!"),
};
self.players_moved.send(user_id).unwrap();
}
} }
fn ih_set_attack_target(&self, user_id: u32, metadata: &proto::PacketHead, invoke: &proto::EvtSetAttackTargetInfo) { fn ih_set_attack_target(&self, user_id: u32, metadata: &proto::PacketHead, invoke: &proto::EvtSetAttackTargetInfo) {