1
0
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:
NG (Graham)
2026-04-25 17:19:22 -04:00
parent 68bdb40c10
commit 5e8bc15477
2 changed files with 33 additions and 23 deletions

View File

@@ -1111,8 +1111,9 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
shootee: u8,
shooter: u8,
) {
if self.custom_logic_handler.on_kill_bonus(self, shooter, shootee).await {
if self.unclaimed.debounce_kill(KillAttribution { killer: shooter, victim: shootee }).await {
let debounce_result = 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) {
let to_reward_desc = self.user_descriptor(shooter).unwrap();
to_reward_desc.counters.kills.fetch_add(1, std::sync::atomic::Ordering::Relaxed);

View File

@@ -22,29 +22,35 @@ impl ScoreTracker {
}
fn on_destruction(&self, killer: u8, victim: u8) {
if let Some(killer_team) = self.teams.get(&killer) {
if killer == victim {
if !self.self_destruct_is_kill { return; }
let other_teams: Vec<u8> = self.scores.keys().copied().filter(|x| x != killer_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", team_to_award);
} else {
if killer == victim {
self.on_self_destruct(killer);
} else {
if let Some(killer_team) = self.teams.get(&killer) {
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> {
let mut max = None;
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 {
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
}
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.score_tracking.on_destruction(user, user);
self.score_tracking.on_self_destruct(user);
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
}