mirror of
https://git.ngram.ca/OpenJam/rc-servers
synced 2026-08-23 23:08:52 +00:00
Count TDM kills using same debounced method as scoreboard; fix #116
This commit is contained in:
@@ -1111,8 +1111,9 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
|
|||||||
shootee: u8,
|
shootee: u8,
|
||||||
shooter: u8,
|
shooter: u8,
|
||||||
) {
|
) {
|
||||||
if self.custom_logic_handler.on_kill_bonus(self, shooter, shootee).await {
|
let debounce_result = self.unclaimed.debounce_kill(KillAttribution { killer: shooter, victim: shootee }).await;
|
||||||
if self.unclaimed.debounce_kill(KillAttribution { killer: shooter, victim: shootee }).await {
|
if debounce_result {
|
||||||
|
if self.custom_logic_handler.on_kill_bonus(self, shooter, shootee).await {
|
||||||
if let Some(to_reward) = self.users.read().await.get(&shooter) {
|
if let Some(to_reward) = self.users.read().await.get(&shooter) {
|
||||||
let to_reward_desc = self.user_descriptor(shooter).unwrap();
|
let to_reward_desc = self.user_descriptor(shooter).unwrap();
|
||||||
to_reward_desc.counters.kills.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
to_reward_desc.counters.kills.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
|
|||||||
@@ -22,29 +22,35 @@ impl ScoreTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn on_destruction(&self, killer: u8, victim: u8) {
|
fn on_destruction(&self, killer: u8, victim: u8) {
|
||||||
if let Some(killer_team) = self.teams.get(&killer) {
|
if killer == victim {
|
||||||
if killer == victim {
|
self.on_self_destruct(killer);
|
||||||
if !self.self_destruct_is_kill { return; }
|
} else {
|
||||||
let other_teams: Vec<u8> = self.scores.keys().copied().filter(|x| x != killer_team).collect();
|
if let Some(killer_team) = self.teams.get(&killer) {
|
||||||
let team_to_award = if other_teams.is_empty() {
|
|
||||||
log::warn!("Only one team in team death match, cannot award self-destruct point to other team");
|
|
||||||
return;
|
|
||||||
} else if other_teams.len() == 1 {
|
|
||||||
other_teams[0]
|
|
||||||
} else {
|
|
||||||
use rand::Rng;
|
|
||||||
let index = rand::rng().random_range(0..other_teams.len());
|
|
||||||
other_teams[index]
|
|
||||||
};
|
|
||||||
self.scores[&team_to_award].fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
|
||||||
log::debug!("Team {} awarded 1 point", team_to_award);
|
|
||||||
} else {
|
|
||||||
self.scores[killer_team].fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
self.scores[killer_team].fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
log::debug!("Team {} awarded 1 point", killer_team);
|
log::debug!("Team {} awarded 1 point for player {} killed by player {}", killer_team, victim, killer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn on_self_destruct(&self, player: u8) {
|
||||||
|
if !self.self_destruct_is_kill { return; }
|
||||||
|
if let Some(player_team) = self.teams.get(&player) {
|
||||||
|
let other_teams: Vec<u8> = self.scores.keys().copied().filter(|x| x != player_team).collect();
|
||||||
|
let team_to_award = if other_teams.is_empty() {
|
||||||
|
log::warn!("Only one team in team death match, cannot award self-destruct point to other team");
|
||||||
|
return;
|
||||||
|
} else if other_teams.len() == 1 {
|
||||||
|
other_teams[0]
|
||||||
|
} else {
|
||||||
|
use rand::Rng;
|
||||||
|
let index = rand::rng().random_range(0..other_teams.len());
|
||||||
|
other_teams[index]
|
||||||
|
};
|
||||||
|
self.scores[&team_to_award].fetch_add(1, std::sync::atomic::Ordering::Relaxed);
|
||||||
|
log::debug!("Team {} awarded 1 point for self-destruct", team_to_award);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn leading_team(&self) -> Option<u8> {
|
fn leading_team(&self) -> Option<u8> {
|
||||||
let mut max = None;
|
let mut max = None;
|
||||||
for (team, score) in self.scores.iter() {
|
for (team, score) in self.scores.iter() {
|
||||||
@@ -339,17 +345,20 @@ impl CustomGameLogic for TeamDeathMatchLogic {
|
|||||||
|
|
||||||
async fn on_vehicle_destroyed(&self, generic: &crate::matches::GenericGamemodeEngine<Self>, killer: u8, victim: u8) -> bool {
|
async fn on_vehicle_destroyed(&self, generic: &crate::matches::GenericGamemodeEngine<Self>, killer: u8, victim: u8) -> bool {
|
||||||
self.do_respawn_tasks(generic, victim).await;
|
self.do_respawn_tasks(generic, victim).await;
|
||||||
self.score_tracking.on_destruction(killer, victim);
|
if killer == victim {
|
||||||
|
self.score_tracking.on_self_destruct(killer);
|
||||||
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn on_vehicle_self_destruct(&self, generic: &crate::matches::GenericGamemodeEngine<Self>, user: u8, _is_classic: bool) -> bool {
|
async fn on_vehicle_self_destruct(&self, generic: &crate::matches::GenericGamemodeEngine<Self>, user: u8, _is_classic: bool) -> bool {
|
||||||
self.do_respawn_tasks(generic, user).await;
|
self.do_respawn_tasks(generic, user).await;
|
||||||
self.score_tracking.on_destruction(user, user);
|
self.score_tracking.on_self_destruct(user);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn on_kill_bonus(&self, _generic: &crate::matches::GenericGamemodeEngine<Self>, _killer: u8, _victim: u8) -> bool {
|
async fn on_kill_bonus(&self, _generic: &crate::matches::GenericGamemodeEngine<Self>, killer: u8, victim: u8) -> bool {
|
||||||
|
self.score_tracking.on_destruction(killer, victim);
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user