unset local player

This commit is contained in:
Robin Appelman 2022-06-09 23:53:12 +02:00
commit 104e68fc59
2 changed files with 25 additions and 46 deletions

View file

@ -31,9 +31,6 @@ fn set_panic_hook() {
console_error_panic_hook::set_once(); console_error_panic_hook::set_once();
} }
const LOCAL_PROP: SendPropIdentifier = SendPropIdentifier::new("DT_LocalPlayerExclusive", "m_nTickBase");
const EYE_X_PROP: SendPropIdentifier = SendPropIdentifier::new("DT_TFLocalPlayerExclusive", "m_angEyeAngles[0]");
const EYE_Y_PROP: SendPropIdentifier = SendPropIdentifier::new("DT_TFLocalPlayerExclusive", "m_angEyeAngles[1]");
#[wasm_bindgen] #[wasm_bindgen]
pub fn unlock(input: &[u8]) -> Vec<u8> { pub fn unlock(input: &[u8]) -> Vec<u8> {
@ -51,9 +48,15 @@ pub fn unlock(input: &[u8]) -> Vec<u8> {
let mut handler = DemoHandler::default(); let mut handler = DemoHandler::default();
handler.handle_header(&header); handler.handle_header(&header);
let mut local_player_entity_id = None;
let mut mutators = MutatorList::new(); let mut mutators = MutatorList::new();
mutators.push_message_mutator(|message: &mut Message| {
if let Message::ServerInfo(info) = message {
info.player_slot = 0;
}
});
mutators.push_message_filter(|message: &Message| {
!matches!(message, Message::SetView(_))
});
mutators.push_message_filter(|message: &Message| { mutators.push_message_filter(|message: &Message| {
if let Message::UserMessage(usr_message) = message { if let Message::UserMessage(usr_message) = message {
UserMessageType::CloseCaption != usr_message.message_type() UserMessageType::CloseCaption != usr_message.message_type()
@ -65,36 +68,6 @@ pub fn unlock(input: &[u8]) -> Vec<u8> {
while let Some(mut packet) = packets.next(&handler.state_handler).unwrap() { while let Some(mut packet) = packets.next(&handler.state_handler).unwrap() {
match &mut packet { match &mut packet {
Packet::Signon(message_packet) | Packet::Message(message_packet) => { Packet::Signon(message_packet) | Packet::Message(message_packet) => {
for msg in &mut message_packet
.messages {
if let Message::PacketEntities(PacketEntitiesMessage { entities, .. }) = msg {
for entity in entities {
if local_player_entity_id.is_none() && entity.get_prop_by_identifier(&LOCAL_PROP).is_some() {
dbg!(entity.entity_index);
local_player_entity_id = Some(entity.entity_index);
}
if Some(entity.entity_index) == local_player_entity_id {
let index_x = handler.state_handler.index_for_prop(entity.server_class, EYE_X_PROP).expect("index_x not found");
let index_y = handler.state_handler.index_for_prop(entity.server_class, EYE_Y_PROP).expect("index_y not found");
entity.apply_update(&[
SendProp {
index: index_x,
identifier: EYE_X_PROP,
value: SendPropValue::Float(message_packet.meta.view_angles[0].local_angles.x),
},
SendProp {
index: index_y,
identifier: EYE_Y_PROP,
value: SendPropValue::Float(message_packet.meta.view_angles[0].local_angles.y),
},
])
}
}
}
}
message_packet.meta.view_angles = Default::default(); message_packet.meta.view_angles = Default::default();
message_packet message_packet
.messages .messages

View file

@ -21,11 +21,14 @@ struct PacketMessageMutator<T: MessageMutator> {
impl<T: MessageMutator> PacketMutator for PacketMessageMutator<T> { impl<T: MessageMutator> PacketMutator for PacketMessageMutator<T> {
fn mutate_packet(&self, packet: &mut Packet) { fn mutate_packet(&self, packet: &mut Packet) {
if let Packet::Message(msg_packet) = packet { match packet {
Packet::Message(msg_packet) | Packet::Signon(msg_packet) => {
msg_packet msg_packet
.messages .messages
.iter_mut() .iter_mut()
.for_each(|msg| self.mutator.mutate_message(msg)); .for_each(|msg| self.mutator.mutate_message(msg));
},
_ => {}
} }
} }
} }
@ -54,13 +57,16 @@ struct PacketMessageFilter<T: MessageFilter> {
impl<T: MessageFilter> PacketMutator for PacketMessageFilter<T> { impl<T: MessageFilter> PacketMutator for PacketMessageFilter<T> {
fn mutate_packet(&self, packet: &mut Packet) { fn mutate_packet(&self, packet: &mut Packet) {
if let Packet::Message(msg_packet) = packet { match packet {
Packet::Message(msg_packet) | Packet::Signon(msg_packet) => {
let messages = take(&mut msg_packet.messages); let messages = take(&mut msg_packet.messages);
msg_packet.messages = messages msg_packet.messages = messages
.into_iter() .into_iter()
.filter(|msg| self.filter.filter(msg)) .filter(|msg| self.filter.filter(msg))
.collect(); .collect();
} }
_ => {}
}
} }
} }