1
0
mirror of https://git.ngram.ca/OpenJam/rc-servers synced 2026-08-23 23:08:52 +00:00

Add minimal Pit implementation (without win conditions) #34

This commit is contained in:
NG (Graham)
2025-09-09 23:36:34 -04:00
parent e33a499415
commit f2de67b338
13 changed files with 427 additions and 49 deletions

View File

@@ -317,6 +317,11 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
((now - game_start) as f32) / duration as f32
}
/// seconds since Unix epoch
pub(super) fn game_end(&self) -> i64 {
self.game_start.load(std::sync::atomic::Ordering::Relaxed) + self.game_duration.as_secs() as i64
}
/*pub(super) async fn send_to_player<T: byteserde::ser_heap::ByteSerializeHeap + ?Sized>(&self, player_id: u8, code: rlnl::event_code::NetworkEvent, property: literustlib::packet::Property, data: &T) {
if let Some(player) = self.users.read().await.get(&player_id) {
crate::events::log_lnl_send_failure(player.connection.rlnl().send_data(
@@ -364,13 +369,7 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
self.on_load_complete(user_id).await;
},
super::GameMessage::SpotVehicle { user_id, remote_player } => {
self.rebroadcast(
user_id,
rlnl::event_code::NetworkEvent::RemoteEnemySpotted,
literustlib::packet::Property::ReliableOrdered,
&rlnl::events::ingame::PlayerId { player: remote_player },
true
).await;
self.on_spot_vehicle(user_id, remote_player).await;
},
super::GameMessage::DestroyVehicle { user_id, remote_player, killer_player } => {
self.on_destroy_vehicle(user_id, remote_player, killer_player).await;
@@ -405,6 +404,9 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
super::GameMessage::CustomLogicRlnl { user_id, event, property, data } => {
self.custom_logic_handler.on_custom(&self, user_id, event, property, data).await;
},
super::GameMessage::PlayerInputChanged { user_id, data } => {
self.on_player_input_changed(user_id, data).await;
},
super::GameMessage::Motion { user_id, motion } => {
self.on_motion(user_id, motion).await;
},
@@ -706,6 +708,18 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
}
}
async fn on_spot_vehicle(&self, user_id: i32, remote_player: u8) {
if self.custom_logic_handler.on_spot_vehicle(self, user_id, remote_player).await {
self.rebroadcast(
user_id,
rlnl::event_code::NetworkEvent::RemoteEnemySpotted,
literustlib::packet::Property::ReliableOrdered,
&rlnl::events::ingame::PlayerId { player: remote_player },
true
).await;
}
}
async fn on_destroy_vehicle(&self,
user_id: i32,
remote_player: u8,
@@ -798,24 +812,26 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
shootee: u8,
shooter: u8,
) {
if let Some(to_reward) = self.users.read().await.get(&shooter) {
to_reward.counters.kills.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
crate::events::log_lnl_send_failure(to_reward.connection.rlnl().send_data(
&rlnl::events::ingame::Kill {
killee_player_id: shootee,
killer_player_id: shooter,
},
rlnl::event_code::NetworkEvent::ConfirmedKill,
literustlib::packet::Property::ReliableOrdered,
&to_reward.connection.connection
).await);
let data = to_reward.counters.get_generic_packet(shooter, rlnl::types::IngameStatId::Kill, None);
self.broadcast(
rlnl::event_code::NetworkEvent::UpdateGameStats,
literustlib::packet::Property::ReliableOrdered,
&data,
true,
).await;
if self.custom_logic_handler.on_kill_bonus(self, shooter, shootee).await {
if let Some(to_reward) = self.users.read().await.get(&shooter) {
to_reward.counters.kills.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
crate::events::log_lnl_send_failure(to_reward.connection.rlnl().send_data(
&rlnl::events::ingame::Kill {
killee_player_id: shootee,
killer_player_id: shooter,
},
rlnl::event_code::NetworkEvent::ConfirmedKill,
literustlib::packet::Property::ReliableOrdered,
&to_reward.connection.connection
).await);
let data = to_reward.counters.get_generic_packet(shooter, rlnl::types::IngameStatId::Kill, None);
self.broadcast(
rlnl::event_code::NetworkEvent::UpdateGameStats,
literustlib::packet::Property::ReliableOrdered,
&data,
true,
).await;
}
}
}
@@ -936,6 +952,20 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
}
}
async fn on_player_input_changed(&self, user_id: i32, input: rlnl::events::ingame::PlayerIdAndInputData) {
let full_payload = rlnl::events::ingame::MultiPlayerInputChanged {
num_players: 1,
changes: vec![input],
};
self.rebroadcast(
user_id,
rlnl::event_code::NetworkEvent::OnServerReceivedInputChange,
literustlib::packet::Property::ReliableOrdered,
&full_payload,
true,
).await;
}
async fn on_motion(&self, user_id: i32, motion: rlnl::machine_motion::MachineMotion) {
//let (looking_at_x, looking_at_y, looking_at_z) = motion.target_point.clone().into();
//log::info!("Player {} looking at ({}, {}, {})", motion.player_id, looking_at_x, looking_at_y, looking_at_z);