2025-07-01 20:04:11 -04:00
pub struct LnlEventHandler {
2025-07-03 21:53:34 -04:00
event_handlers : std ::collections ::HashMap < i16 , Box < dyn super ::EventCodeHandler > > ,
2025-07-06 17:36:52 -04:00
motion_handler : Box < dyn super ::RobotMotionHandler > ,
user_provider : std ::sync ::Arc < oj_rc_core ::persist ::user ::UserImpl >
2025-07-01 20:04:11 -04:00
}
impl LnlEventHandler {
2025-07-06 17:36:52 -04:00
pub fn new < M : super ::RobotMotionHandler + 'static > ( user_provider : std ::sync ::Arc < oj_rc_core ::persist ::user ::UserImpl > , motion_handler : M ) -> Self {
2025-07-01 20:04:11 -04:00
Self {
2025-07-03 21:53:34 -04:00
event_handlers : std ::collections ::HashMap ::new ( ) ,
2025-07-06 17:36:52 -04:00
motion_handler : Box ::new ( motion_handler ) ,
user_provider ,
2025-07-01 20:04:11 -04:00
}
}
2025-07-03 21:53:34 -04:00
pub fn add < H : super ::EventCode + super ::EventCodeHandler + 'static > ( mut self , handler : H ) -> Self {
2025-07-06 17:36:52 -04:00
if self . event_handlers . insert ( H ::CODE , Box ::new ( handler ) ) . is_some ( ) {
log ::warn! ( " Replaced event handler {} with new handler " , H ::CODE ) ;
}
2025-07-03 21:53:34 -04:00
self
}
2025-07-01 20:04:11 -04:00
}
#[ async_trait::async_trait ]
impl literustlib_server ::EventHandler for LnlEventHandler {
type PacketData = super ::PacketData ;
type UserData = super ::UserData ;
2025-07-06 17:36:52 -04:00
async fn on_receive ( & self , data : Self ::PacketData , _header : & literustlib ::packet ::Header , peer : & std ::sync ::Arc < literustlib_server ::Connection < Self ::PacketData > > , user : & Self ::UserData , sender : & std ::sync ::Arc < literustlib_server ::DataSender < Self ::PacketData > > ) {
log ::debug! ( " Got message {:?} (len: {}) from connection id {} " , data . message_ty , data . data . len ( ) , peer . id ( ) ) ;
match data . message_ty {
crate ::data ::MessageType ::ClientMsg = > {
if let Some ( handler ) = self . event_handlers . get ( & data . variant ) {
handler . handle ( & data . data , peer , user , sender ) . await ;
} else {
let variant_pretty = i16_to_event ( data . variant ) . map ( | x | format! ( " {:?} " , x ) ) . unwrap_or_else ( | | " ??? " . to_owned ( ) ) ;
#[ cfg(debug_assertions) ]
{
panic! ( " Unsupported event variant {} ( {} ), pls fix!!! \n {:?} " , variant_pretty , data . variant , & data . data [ .. ] ) ;
}
#[ cfg(not(debug_assertions)) ]
{
log ::warn! ( " Unsupported event variant {} ({}), pls fix!!! " , variant_pretty , data . variant ) ;
}
}
} ,
crate ::data ::MessageType ::ServerMsg = > {
log ::debug! ( " Got message from server but I'm the server??? (ignoring) " ) ;
} ,
crate ::data ::MessageType ::RobotMotion = > {
self . motion_handler . handle ( & data . data , user ) . await ;
//log::warn!("Ignoring robot motion message");
} ,
2025-07-01 20:04:11 -04:00
}
2025-07-06 17:36:52 -04:00
2025-07-01 20:04:11 -04:00
}
2025-07-03 18:07:08 -04:00
async fn on_connect_start ( & self , addr : & core ::net ::SocketAddr , key : String , peer : & std ::sync ::Arc < literustlib_server ::Connection < Self ::PacketData > > ) -> Option < Self ::UserData > {
2025-07-01 20:04:11 -04:00
log ::debug! ( " New connection started from {}!!! (key:{}, id:{}) " , addr , key , peer . id ( ) ) ;
//let mut buf = Vec::new();
//literustlib::packet::Packet::with_data(literustlib::packet::Property::Reliable, &[9, 0, 0, 0, 0, 0]).dump(&mut buf).unwrap_or_default();
//socket.send_to(&buf, addr).await.unwrap_or_default();
2025-07-06 17:36:52 -04:00
Some ( crate ::UserData ::new ( self . user_provider . clone ( ) ) )
2025-07-01 20:04:11 -04:00
}
2025-07-06 17:36:52 -04:00
async fn on_connect_done ( & self , peer : & std ::sync ::Arc < literustlib_server ::Connection < Self ::PacketData > > , _user : & Self ::UserData , sender : & std ::sync ::Arc < literustlib_server ::DataSender < Self ::PacketData > > ) {
2025-07-01 20:04:11 -04:00
log ::debug! ( " New connection completed (id:{}) " , peer . id ( ) ) ;
2025-07-06 17:36:52 -04:00
let data = EventData ::without_data (
crate ::data ::MessageType ::ServerMsg ,
rlnl ::event_code ::NetworkEvent ::OnConnectedToGameServer ,
) ;
if let Err ( e ) = sender . send_data ( data , literustlib ::packet ::Property ::Reliable , peer ) . await {
2025-07-01 20:04:11 -04:00
log ::error! ( " Failed to send rlnl OnConnectedToGameServer event: {} " , e ) ;
}
}
}
#[ derive(Debug) ]
pub struct EventData {
pub message_ty : crate ::data ::MessageType ,
2025-07-06 17:36:52 -04:00
pub variant : i16 ,
2025-07-01 20:04:11 -04:00
pub data_size : u16 ,
pub data : bytes ::Bytes ,
}
2025-07-06 17:36:52 -04:00
impl EventData {
pub fn with_data ( message_ty : crate ::data ::MessageType , event : rlnl ::event_code ::NetworkEvent , data : bytes ::Bytes ) -> Self {
Self {
message_ty ,
variant : event as i16 ,
data_size : data . len ( ) . try_into ( ) . expect ( " Event data too large " ) ,
data ,
}
}
pub fn without_data ( message_ty : crate ::data ::MessageType , event : rlnl ::event_code ::NetworkEvent ) -> Self {
Self {
message_ty ,
variant : event as i16 ,
data_size : 0 ,
data : bytes ::Bytes ::new ( ) ,
}
}
}
2025-07-01 20:04:11 -04:00
impl literustlib ::packet ::PacketData for EventData {
fn parse ( bytes : bytes ::Bytes , _header : & literustlib ::packet ::Header ) -> std ::io ::Result < Self > {
2025-07-06 17:36:52 -04:00
log ::debug! ( " Got packet data ({}) {:?} " , bytes . len ( ) , & bytes [ .. ] ) ;
2025-07-01 20:04:11 -04:00
if bytes . len ( ) > = 6 {
let data = bytes . slice ( 6 .. ) ;
let net_message_num = i16 ::from_le_bytes ( [ bytes [ 0 ] , bytes [ 1 ] ] ) ;
let net_message_type = crate ::data ::MessageType ::from_i16 ( net_message_num ) . ok_or_else ( | | std ::io ::Error ::new ( std ::io ::ErrorKind ::Unsupported , format! ( " Unsupported message type {} " , net_message_num ) ) ) ? ;
2025-07-06 17:36:52 -04:00
let variant = i16 ::from_le_bytes ( [ bytes [ 2 ] , bytes [ 3 ] ] ) ;
2025-07-01 20:04:11 -04:00
let data_size = u16 ::from_le_bytes ( [ bytes [ 4 ] , bytes [ 5 ] ] ) ;
2025-07-06 17:36:52 -04:00
Ok ( Self {
message_ty : net_message_type ,
variant ,
data_size ,
data ,
} )
2025-07-01 20:04:11 -04:00
} else {
2025-07-06 17:36:52 -04:00
Err ( std ::io ::Error ::new ( std ::io ::ErrorKind ::InvalidData , " Packet data is too short " ) )
2025-07-01 20:04:11 -04:00
}
}
2025-07-06 17:36:52 -04:00
fn dump ( & self ) -> bytes ::Bytes {
2025-07-01 20:04:11 -04:00
use std ::io ::Write ;
let mut buf = Vec ::new ( ) ;
2025-07-06 17:36:52 -04:00
buf . write_all ( & ( self . message_ty as i16 ) . to_le_bytes ( ) ) . unwrap ( ) ;
buf . write_all ( & ( self . variant as i16 ) . to_le_bytes ( ) ) . unwrap ( ) ;
buf . write_all ( & ( self . data_size as u16 ) . to_le_bytes ( ) ) . unwrap ( ) ;
2025-07-01 20:04:11 -04:00
buf . write_all ( & self . data ) . unwrap ( ) ;
2025-07-06 17:36:52 -04:00
buf . into ( )
2025-07-01 20:04:11 -04:00
}
}
fn i16_to_event ( num : i16 ) -> Option < rlnl ::event_code ::NetworkEvent > {
match num {
0 = > Some ( rlnl ::event_code ::NetworkEvent ::OnFailedToConnectToMasterServer ) ,
1 = > Some ( rlnl ::event_code ::NetworkEvent ::OnConnectingToLobbyServer ) ,
2 = > Some ( rlnl ::event_code ::NetworkEvent ::OnConnectedToLobbyServer ) ,
3 = > Some ( rlnl ::event_code ::NetworkEvent ::OnDisconnectingFromLobbyServer ) ,
4 = > Some ( rlnl ::event_code ::NetworkEvent ::OnDisconnectedFromLobbyServer ) ,
5 = > Some ( rlnl ::event_code ::NetworkEvent ::OnConnectedToServer ) ,
6 = > Some ( rlnl ::event_code ::NetworkEvent ::OnFailedToConnectToServer ) ,
7 = > Some ( rlnl ::event_code ::NetworkEvent ::OnConnectionLost ) ,
8 = > Some ( rlnl ::event_code ::NetworkEvent ::OnDisconnectedFromServer ) ,
9 = > Some ( rlnl ::event_code ::NetworkEvent ::OnConnectedToGameServer ) ,
10 = > Some ( rlnl ::event_code ::NetworkEvent ::OnServerStarted ) ,
11 = > Some ( rlnl ::event_code ::NetworkEvent ::OnServerStopped ) ,
12 = > Some ( rlnl ::event_code ::NetworkEvent ::OnPlayerConnectedToServer ) ,
13 = > Some ( rlnl ::event_code ::NetworkEvent ::OnPlayerDisconnectedFromServer ) ,
14 = > Some ( rlnl ::event_code ::NetworkEvent ::RequestRespawnPoint ) ,
15 = > Some ( rlnl ::event_code ::NetworkEvent ::FreeSpawnPoint ) ,
16 = > Some ( rlnl ::event_code ::NetworkEvent ::RequestTeamBaseModel ) ,
17 = > Some ( rlnl ::event_code ::NetworkEvent ::RequestCapturePoints ) ,
18 = > Some ( rlnl ::event_code ::NetworkEvent ::RequestEqualizerModel ) ,
19 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBase ) ,
20 = > Some ( rlnl ::event_code ::NetworkEvent ::RegisterCapturePoints ) ,
21 = > Some ( rlnl ::event_code ::NetworkEvent ::RegisterEqualizer ) ,
22 = > Some ( rlnl ::event_code ::NetworkEvent ::FreeRespawnPoint ) ,
23 = > Some ( rlnl ::event_code ::NetworkEvent ::PlayerIDs ) ,
24 = > Some ( rlnl ::event_code ::NetworkEvent ::SyncMachineCubes ) ,
25 = > Some ( rlnl ::event_code ::NetworkEvent ::MachineDestroyed ) ,
26 = > Some ( rlnl ::event_code ::NetworkEvent ::GameStarted ) ,
27 = > Some ( rlnl ::event_code ::NetworkEvent ::OnPlayerInputChanged ) ,
28 = > Some ( rlnl ::event_code ::NetworkEvent ::OnServerReceivedInputChange ) ,
29 = > Some ( rlnl ::event_code ::NetworkEvent ::ClientUnregistered ) ,
30 = > Some ( rlnl ::event_code ::NetworkEvent ::OnAnotherClientDisconnected ) ,
31 = > Some ( rlnl ::event_code ::NetworkEvent ::OnClientReconnected ) ,
32 = > Some ( rlnl ::event_code ::NetworkEvent ::DamageCube ) ,
33 = > Some ( rlnl ::event_code ::NetworkEvent ::FireWeaponEffect ) ,
35 = > Some ( rlnl ::event_code ::NetworkEvent ::FireMiss ) ,
36 = > Some ( rlnl ::event_code ::NetworkEvent ::MultipleFireMisses ) ,
37 = > Some ( rlnl ::event_code ::NetworkEvent ::CurrentGameTime ) ,
38 = > Some ( rlnl ::event_code ::NetworkEvent ::EndGame ) ,
39 = > Some ( rlnl ::event_code ::NetworkEvent ::GameWon ) ,
40 = > Some ( rlnl ::event_code ::NetworkEvent ::GameLost ) ,
41 = > Some ( rlnl ::event_code ::NetworkEvent ::GameWonBaseDestroyed ) ,
42 = > Some ( rlnl ::event_code ::NetworkEvent ::GameLostBaseDestroyed ) ,
43 = > Some ( rlnl ::event_code ::NetworkEvent ::BuffTeamPlayers ) ,
44 = > Some ( rlnl ::event_code ::NetworkEvent ::PlayerThreateningBase ) ,
45 = > Some ( rlnl ::event_code ::NetworkEvent ::TimeToGameStart ) ,
46 = > Some ( rlnl ::event_code ::NetworkEvent ::SetRespawnWaitingTime ) ,
47 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseState ) ,
48 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseCaptureStart ) ,
49 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseCaptureReset ) ,
50 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseCaptureStop ) ,
51 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseSectionComplete ) ,
52 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseFinalSectionComplete ) ,
53 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseInitialise ) ,
54 = > Some ( rlnl ::event_code ::NetworkEvent ::GetClientPings ) ,
55 = > Some ( rlnl ::event_code ::NetworkEvent ::SetClientPing ) ,
56 = > Some ( rlnl ::event_code ::NetworkEvent ::WarnPlayer ) ,
57 = > Some ( rlnl ::event_code ::NetworkEvent ::EnemySpotted ) ,
58 = > Some ( rlnl ::event_code ::NetworkEvent ::RemoteEnemySpotted ) ,
59 = > Some ( rlnl ::event_code ::NetworkEvent ::AssistBonusRequest ) ,
60 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseContested ) ,
61 = > Some ( rlnl ::event_code ::NetworkEvent ::AcquireRemoteAI ) ,
63 = > Some ( rlnl ::event_code ::NetworkEvent ::KillBonusRequest ) ,
64 = > Some ( rlnl ::event_code ::NetworkEvent ::EACRegisterToken ) ,
65 = > Some ( rlnl ::event_code ::NetworkEvent ::HeallingAssistBonusRequest ) ,
66 = > Some ( rlnl ::event_code ::NetworkEvent ::ProtectTeamMateBonusRequest ) ,
67 = > Some ( rlnl ::event_code ::NetworkEvent ::DefendTheBaseBonusRequest ) ,
68 = > Some ( rlnl ::event_code ::NetworkEvent ::DestroyCubesBonusRequest ) ,
69 = > Some ( rlnl ::event_code ::NetworkEvent ::DestroyHealCubesPointsAwarded ) ,
70 = > Some ( rlnl ::event_code ::NetworkEvent ::ConfirmedKill ) ,
71 = > Some ( rlnl ::event_code ::NetworkEvent ::BonusesFlushDone ) ,
72 = > Some ( rlnl ::event_code ::NetworkEvent ::AlignmentRectifierStarted ) ,
73 = > Some ( rlnl ::event_code ::NetworkEvent ::HealCubesBonusRequest ) ,
74 = > Some ( rlnl ::event_code ::NetworkEvent ::SetShieldState ) ,
75 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamBaseLowHealth ) ,
76 = > Some ( rlnl ::event_code ::NetworkEvent ::AwardTeamBaseProtoniumDestroyedRequest ) ,
77 = > Some ( rlnl ::event_code ::NetworkEvent ::InitialiseGameStats ) ,
78 = > Some ( rlnl ::event_code ::NetworkEvent ::UpdateGameStats ) ,
79 = > Some ( rlnl ::event_code ::NetworkEvent ::MapPingEvent ) ,
80 = > Some ( rlnl ::event_code ::NetworkEvent ::SurrenderRequest ) ,
81 = > Some ( rlnl ::event_code ::NetworkEvent ::HealSelf ) ,
82 = > Some ( rlnl ::event_code ::NetworkEvent ::HealSelfResponse ) ,
83 = > Some ( rlnl ::event_code ::NetworkEvent ::SurrenderVoteStarted ) ,
84 = > Some ( rlnl ::event_code ::NetworkEvent ::SurrenderVoteCast ) ,
85 = > Some ( rlnl ::event_code ::NetworkEvent ::CurrentSurrenderVotes ) ,
86 = > Some ( rlnl ::event_code ::NetworkEvent ::SurrenderAccepted ) ,
87 = > Some ( rlnl ::event_code ::NetworkEvent ::SurrenderDeclined ) ,
88 = > Some ( rlnl ::event_code ::NetworkEvent ::SetSurrenderTimes ) ,
89 = > Some ( rlnl ::event_code ::NetworkEvent ::SetFinalGameScore ) ,
90 = > Some ( rlnl ::event_code ::NetworkEvent ::PitLeaderBoardUpdate ) ,
91 = > Some ( rlnl ::event_code ::NetworkEvent ::PitModeState ) ,
93 = > Some ( rlnl ::event_code ::NetworkEvent ::ValidateGameGuid ) ,
94 = > Some ( rlnl ::event_code ::NetworkEvent ::GameGuidValidated ) ,
95 = > Some ( rlnl ::event_code ::NetworkEvent ::PlayerInsideBase ) ,
97 = > Some ( rlnl ::event_code ::NetworkEvent ::ConfirmedAssist ) ,
98 = > Some ( rlnl ::event_code ::NetworkEvent ::LockOnNotification ) ,
99 = > Some ( rlnl ::event_code ::NetworkEvent ::LockOnNotificationBroadcast ) ,
100 = > Some ( rlnl ::event_code ::NetworkEvent ::ShieldSpawned ) ,
101 = > Some ( rlnl ::event_code ::NetworkEvent ::SpawnShield ) ,
102 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastOpenShield ) ,
103 = > Some ( rlnl ::event_code ::NetworkEvent ::OpenShield ) ,
104 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastInvisible ) ,
105 = > Some ( rlnl ::event_code ::NetworkEvent ::MakeInvisible ) ,
106 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastVisible ) ,
107 = > Some ( rlnl ::event_code ::NetworkEvent ::MakeVisible ) ,
108 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastActivateTeleportEffect ) ,
109 = > Some ( rlnl ::event_code ::NetworkEvent ::ActivateTeleportEffect ) ,
110 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastActivateReadyEffect ) ,
111 = > Some ( rlnl ::event_code ::NetworkEvent ::ActivateReadyEffect ) ,
112 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastSpawnEmpLocator ) ,
113 = > Some ( rlnl ::event_code ::NetworkEvent ::SpawnEmpLocator ) ,
114 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastSpawnEmpMachineEffect ) ,
115 = > Some ( rlnl ::event_code ::NetworkEvent ::SpawnEmpMachineEffect ) ,
116 = > Some ( rlnl ::event_code ::NetworkEvent ::WeaponSelect ) ,
117 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastWeaponSelect ) ,
118 = > Some ( rlnl ::event_code ::NetworkEvent ::HostAIs ) ,
119 = > Some ( rlnl ::event_code ::NetworkEvent ::HealAlly ) ,
120 = > Some ( rlnl ::event_code ::NetworkEvent ::HealAllyResponse ) ,
121 = > Some ( rlnl ::event_code ::NetworkEvent ::SelfDestructClassicMode ) ,
122 = > Some ( rlnl ::event_code ::NetworkEvent ::GameModeSettings ) ,
123 = > Some ( rlnl ::event_code ::NetworkEvent ::TeamDeathMatchState ) ,
124 = > Some ( rlnl ::event_code ::NetworkEvent ::ClientDisconnecting ) ,
125 = > Some ( rlnl ::event_code ::NetworkEvent ::SendBonus ) ,
126 = > Some ( rlnl ::event_code ::NetworkEvent ::TestConnection ) ,
127 = > Some ( rlnl ::event_code ::NetworkEvent ::MachineDestroyedConfirmed ) ,
128 = > Some ( rlnl ::event_code ::NetworkEvent ::EnergyModuleActivated ) ,
129 = > Some ( rlnl ::event_code ::NetworkEvent ::BroadcastLoadingProgress ) ,
130 = > Some ( rlnl ::event_code ::NetworkEvent ::RequestLoadingProgressAllUsers ) ,
131 = > Some ( rlnl ::event_code ::NetworkEvent ::LoadingComplete ) ,
132 = > Some ( rlnl ::event_code ::NetworkEvent ::GameAborted ) ,
134 = > Some ( rlnl ::event_code ::NetworkEvent ::SendDamagedByEnemyShield ) ,
135 = > Some ( rlnl ::event_code ::NetworkEvent ::DamagedByEnemyShield ) ,
136 = > Some ( rlnl ::event_code ::NetworkEvent ::EqualizerNotification ) ,
137 = > Some ( rlnl ::event_code ::NetworkEvent ::CapturePointProgress ) ,
138 = > Some ( rlnl ::event_code ::NetworkEvent ::CapturePointNotification ) ,
140 = > Some ( rlnl ::event_code ::NetworkEvent ::RadarModuleActivated ) ,
141 = > Some ( rlnl ::event_code ::NetworkEvent ::RemoteRadarModuleActivated ) ,
142 = > Some ( rlnl ::event_code ::NetworkEvent ::EACMessage ) ,
143 = > Some ( rlnl ::event_code ::NetworkEvent ::Taunt ) ,
144 = > Some ( rlnl ::event_code ::NetworkEvent ::MachineFullHealth ) ,
145 = > Some ( rlnl ::event_code ::NetworkEvent ::RequestSync ) ,
146 = > Some ( rlnl ::event_code ::NetworkEvent ::BeginSync ) ,
147 = > Some ( rlnl ::event_code ::NetworkEvent ::EndOfSync ) ,
148 = > Some ( rlnl ::event_code ::NetworkEvent ::SyncTeamBaseCubes ) ,
150 = > Some ( rlnl ::event_code ::NetworkEvent ::SyncEqualizerNotification ) ,
151 = > Some ( rlnl ::event_code ::NetworkEvent ::PlayerQuitRequest ) ,
152 = > Some ( rlnl ::event_code ::NetworkEvent ::PlayerQuitRequestComplete ) ,
153 = > Some ( rlnl ::event_code ::NetworkEvent ::DamageCubeEffectOnly ) ,
154 = > Some ( rlnl ::event_code ::NetworkEvent ::DamageCubeNoEffect ) ,
155 = > Some ( rlnl ::event_code ::NetworkEvent ::DestroyCubeEffectOnly ) ,
156 = > Some ( rlnl ::event_code ::NetworkEvent ::DestroyCubeNoEffect ) ,
157 = > Some ( rlnl ::event_code ::NetworkEvent ::DestroyCubesFull ) ,
170 = > Some ( rlnl ::event_code ::NetworkEvent ::LongPlayValue ) ,
171 = > Some ( rlnl ::event_code ::NetworkEvent ::UpdateVotingAfterBattle ) ,
172 = > Some ( rlnl ::event_code ::NetworkEvent ::CosmeticAction ) ,
_ = > None ,
}
}