Browse Source

don't give full exp for not last hit

pbs
jake 5 years ago
parent
commit
32bb021a94
  1. 15
      src/ship/packet/handler/message.rs

15
src/ship/packet/handler/message.rs

@ -29,20 +29,27 @@ pub async fn request_exp<EG: EntityGateway>(id: ClientId,
let monster = room.maps.enemy_by_id(request_exp.enemy_id as usize)?; let monster = room.maps.enemy_by_id(request_exp.enemy_id as usize)?;
let monster_stats = room.monster_stats.get(&monster.monster).unwrap(); let monster_stats = room.monster_stats.get(&monster.monster).unwrap();
let exp_gain = if request_exp.last_hitter == 1 {
monster_stats.exp
}
else {
((monster_stats.exp as f32) * 0.8) as u32
};
let clients_in_area = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?; let clients_in_area = client_location.get_clients_in_room(room_id).map_err(|err| -> ClientLocationError { err.into() })?;
let gain_exp_pkt = builder::message::character_gained_exp(area_client, monster_stats.exp);
let gain_exp_pkt = builder::message::character_gained_exp(area_client, exp_gain);
let mut exp_pkts: Box<dyn Iterator<Item = _> + Send> = Box::new(clients_in_area.clone().into_iter() let mut exp_pkts: Box<dyn Iterator<Item = _> + Send> = Box::new(clients_in_area.clone().into_iter()
.map(move |c| { .map(move |c| {
(c.client, SendShipPacket::Message(Message::new(GameMessage::GiveCharacterExp(gain_exp_pkt.clone())))) (c.client, SendShipPacket::Message(Message::new(GameMessage::GiveCharacterExp(gain_exp_pkt.clone()))))
})); }));
let before_level = level_table.get_level_from_exp(client.character.char_class, client.character.exp); let before_level = level_table.get_level_from_exp(client.character.char_class, client.character.exp);
let after_level = level_table.get_level_from_exp(client.character.char_class, client.character.exp + monster_stats.exp);
let after_level = level_table.get_level_from_exp(client.character.char_class, client.character.exp + exp_gain);
let level_up = before_level != after_level; let level_up = before_level != after_level;
if level_up { if level_up {
let (_, before_stats) = level_table.get_stats_from_exp(client.character.char_class, client.character.exp); let (_, before_stats) = level_table.get_stats_from_exp(client.character.char_class, client.character.exp);
let (after_level, after_stats) = level_table.get_stats_from_exp(client.character.char_class, client.character.exp + monster_stats.exp);
let (after_level, after_stats) = level_table.get_stats_from_exp(client.character.char_class, client.character.exp + exp_gain);
let level_up_pkt = builder::message::character_leveled_up(area_client, after_level, before_stats, after_stats); let level_up_pkt = builder::message::character_leveled_up(area_client, after_level, before_stats, after_stats);
exp_pkts = Box::new(exp_pkts.chain(clients_in_area.into_iter() exp_pkts = Box::new(exp_pkts.chain(clients_in_area.into_iter()
@ -51,7 +58,7 @@ pub async fn request_exp<EG: EntityGateway>(id: ClientId,
}))) })))
} }
client.character.exp += monster_stats.exp;
client.character.exp += exp_gain;
entity_gateway.save_character(&client.character).await; entity_gateway.save_character(&client.character).await;
Ok(exp_pkts) Ok(exp_pkts)

Loading…
Cancel
Save