Implement vehicle validation before match

This commit is contained in:
NG (Graham) committed 2026-02-28 10:51:12 -05:00
1 parent 5d4123026d
commit 3d2b7078e4
27 files changed
+468 -54

No files matched your search

@@ -19,7 +19,7 @@ impl <C: Send + 'static> SimpleOperation<C> for BattleArenaConfigurer {
async fn handle(&self, params: ParameterTable<C>, user: &Self::User) -> Result<ParameterTable<C>, SimpleOpError> {
let user_info = user.user()?;
log::warn!("Retrieved ba config");
//log::warn!("Retrieved ba config");
let data = self.ba_conf.resolve_typed(user_info.as_ref().as_ref(), self.factory.as_ref(), &self.weapon_list, &self.cpu_counter).await?;
let mut params = params.to_dict();
params.insert(PARAM_KEY, data);
+4 -3
View File
@@ -75,7 +75,8 @@ mod reconnect_game;
mod regen_config;
mod pageantry;
mod signup_time;
mod validate_machine;
mod validate_vehicle_by_lobby;
mod validate_vehicle_by_campaign;
mod game_mode_config;
mod score_multipliers_config;
mod player_robot_rank;
@@ -202,11 +203,11 @@ pub fn handler(init_ctx: &crate::InitConfig) -> OperationsHandler<crate::UserTy>
.add(regen_config::auto_regen_config_provider(&init_ctx.cubes))
.add(pageantry::after_battle_vote_thresholds_provider(&init_ctx.cubes))
.add(signup_time::user_signup_date_provider())
.add(validate_machine::validate_robot_provider())
.add(validate_vehicle_by_lobby::validate_robot_provider(&init_ctx.vehicle_validators))
.add(game_mode_config::game_mode_config_provider(&init_ctx.cubes))
.add(score_multipliers_config::tdm_ai_score_config_provider())
.add(player_robot_rank::player_robot_rank_provider())
.add(validate_machine::validate_campaign_robot_provider())
.add(validate_vehicle_by_campaign::validate_campaign_robot_provider(&init_ctx.vehicle_validators))
.add(singleplayer_campaigns::singleplayer_complete_campaign_provider(init_ctx))
.add(campaign_save_result::campaign_save_awards_provider())
.add(singleplayer_campaigns::singleplayer_save_complete_campaign_provider()) // TODO handle UpdatePlayerCompletedCampaignWaveRequest saving
@@ -1,46 +0,0 @@
use polariton_server::operations::SimpleFunc;
use polariton::operation::{ParameterTable, Typed};
const LOBBY_PARAM_KEY: u8 = 134;
const VALIDATE_ROBOT_RESULT_PARAM_KEY: u8 = 111;
// possible codes
#[allow(dead_code)]
#[repr(u8)]
enum ValidateMachineResult {
Invalid = 0,
Ok = 1,
NoWeapon = 2,
NoMovement = 3,
Sanctioned = 4,
}
pub(super) fn validate_robot_provider() -> SimpleFunc<102, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result<ParameterTable, i16>) + Sync + Sync> {
SimpleFunc::new(|params, _user: &crate::UserTy| {
let mut params = params.to_dict();
if let Some(Typed::Int(lobby_ty)) = params.get(&LOBBY_PARAM_KEY) {
log::info!("Got lobby type {} ({:?})", lobby_ty, oj_rc_core::data::lobby::LobbyType::from_int(*lobby_ty));
}
// let lock = user.read().unwrap();
// let user_info = lock.user()?;
// TODO actually validate the vehicle
params.insert(VALIDATE_ROBOT_RESULT_PARAM_KEY, Typed::Int(ValidateMachineResult::Ok as _));
Ok(params.into())
})
}
const CAMPAIGN_ID_PARAM_KEY: u8 = 22;
pub(super) fn validate_campaign_robot_provider() -> SimpleFunc<59, crate::UserTy, impl (Fn(ParameterTable, &crate::UserTy) -> Result<ParameterTable, i16>) + Sync + Sync> {
SimpleFunc::new(|params, _user: &crate::UserTy| {
let mut params = params.to_dict();
if let Some(Typed::Str(campaign_id)) = params.get(&CAMPAIGN_ID_PARAM_KEY) {
log::info!("Got campaign id {}", campaign_id.string);
}
// let lock = user.read().unwrap();
// let user_info = lock.user()?;
// TODO actually validate the vehicle
params.insert(VALIDATE_ROBOT_RESULT_PARAM_KEY, Typed::Int(ValidateMachineResult::Ok as _)); // this is ignored
Ok(params.into())
})
}
@@ -0,0 +1,48 @@
use polariton_server::operations::{SimpleOpError, SimpleOperation, SimpleOpImpl};
use polariton::operation::{ParameterTable, Typed};
use crate::data::vehicle_validation::*;
const VALIDATE_CAMPAIGN_ROBOT_CODE: u8 = 59;
const CAMPAIGN_ID_PARAM_KEY: u8 = 22;
const VALIDATE_ROBOT_RESULT_PARAM_KEY: u8 = 111;
pub(super) struct CampaignVehicleValidator {
campaign_map: std::sync::Arc<std::collections::HashMap<String, crate::vehicle_validators::InitedVehicleValidator>>,
}
#[async_trait::async_trait]
impl <C: Send + 'static> SimpleOperation<C> for CampaignVehicleValidator {
type User = crate::UserTy;
const CODE: u8 = VALIDATE_CAMPAIGN_ROBOT_CODE;
async fn handle(&self, params: ParameterTable<C>, user: &Self::User) -> Result<ParameterTable<C>, SimpleOpError> {
let mut params = params.to_dict();
if let Some(Typed::Str(campaign_id)) = params.get(&CAMPAIGN_ID_PARAM_KEY) {
log::debug!("Got campaign id {}", campaign_id.string);
if let Some(campaign_validator) = self.campaign_map.get(&campaign_id.string) {
let user_info = user.user()?;
let vehicle_data = user_info.selected_vehicle_data().await?;
let result_code = ValidateMachineResult::from_plugin(campaign_validator.validate(
&vehicle_data.robot_data,
&vehicle_data.colour_data,
));
params.insert(VALIDATE_ROBOT_RESULT_PARAM_KEY, Typed::Int(result_code as _));
} else {
// bad state, assume user is doing something sketchy
log::warn!("Failed to find vehicle validator for campaign {}", campaign_id.string);
params.insert(VALIDATE_ROBOT_RESULT_PARAM_KEY, Typed::Int(ValidateMachineResult::Sanctioned as _));
}
} else {
log::warn!("No campaign ID provided for campaign vehicle validator");
}
Ok(params.into())
}
}
pub(super) fn validate_campaign_robot_provider<C: Send + 'static>(validators: &crate::vehicle_validators::InitedVehicleValidators) -> SimpleOpImpl<C, crate::UserTy, CampaignVehicleValidator> {
SimpleOpImpl::new(CampaignVehicleValidator {
campaign_map: validators.campaigns.clone(),
})
}
@@ -0,0 +1,58 @@
use polariton_server::operations::{SimpleOpError, SimpleOperation, SimpleOpImpl};
use polariton::operation::{ParameterTable, Typed};
use crate::data::vehicle_validation::*;
const VALIDATE_LOBBY_ROBOT_CODE: u8 = 102;
const LOBBY_PARAM_KEY: u8 = 134;
const VALIDATE_ROBOT_RESULT_PARAM_KEY: u8 = 111;
pub(super) struct MultiplayerVehicleValidator {
multiplayer: std::sync::Arc<crate::vehicle_validators::InitedVehicleValidator>,
custom_game: std::sync::Arc<crate::vehicle_validators::InitedVehicleValidator>,
singleplayer: std::sync::Arc<crate::vehicle_validators::InitedVehicleValidator>,
}
#[async_trait::async_trait]
impl <C: Send + 'static> SimpleOperation<C> for MultiplayerVehicleValidator {
type User = crate::UserTy;
const CODE: u8 = VALIDATE_LOBBY_ROBOT_CODE;
async fn handle(&self, params: ParameterTable<C>, user: &Self::User) -> Result<ParameterTable<C>, SimpleOpError> {
let mut params = params.to_dict();
if let Some(Typed::Int(lobby_ty)) = params.get(&LOBBY_PARAM_KEY) {
let lobby_ty = oj_rc_core::data::lobby::LobbyType::from_int(*lobby_ty)?;
log::debug!("Got lobby type {:?}", lobby_ty);
let user_info = user.user()?;
let vehicle_data = user_info.selected_vehicle_data().await?;
let result_code = match lobby_ty {
oj_rc_core::data::lobby::LobbyType::None => ValidateMachineResult::Ok,
oj_rc_core::data::lobby::LobbyType::CustomGame => ValidateMachineResult::from_plugin(self.custom_game.validate(
&vehicle_data.robot_data,
&vehicle_data.colour_data,
)),
oj_rc_core::data::lobby::LobbyType::QuickPlay => ValidateMachineResult::from_plugin(self.multiplayer.validate(
&vehicle_data.robot_data,
&vehicle_data.colour_data,
)),
oj_rc_core::data::lobby::LobbyType::Solo => ValidateMachineResult::from_plugin(self.singleplayer.validate(
&vehicle_data.robot_data,
&vehicle_data.colour_data,
)),
};
params.insert(VALIDATE_ROBOT_RESULT_PARAM_KEY, Typed::Int(result_code as _));
} else {
log::warn!("No lobby type provided for vehicle validator");
}
Ok(params.into())
}
}
pub(super) fn validate_robot_provider<C: Send + 'static>(validators: &crate::vehicle_validators::InitedVehicleValidators) -> SimpleOpImpl<C, crate::UserTy, MultiplayerVehicleValidator> {
SimpleOpImpl::new(MultiplayerVehicleValidator {
multiplayer: validators.multiplayer.clone(),
custom_game: validators.custom_game.clone(),
singleplayer: validators.singleplayer.clone(),
})
}