@@ 15,12 15,13 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::component::{PartType, PlanetType};
+use bevy::ecs::system::Resource;
use bevy_rapier2d::rapier::dynamics::IntegrationParameters;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::net::IpAddr;
-#[derive(Serialize, Deserialize, Debug, Clone)]
+#[derive(Resource, Serialize, Deserialize, Debug, Clone)]
pub struct StkConfig {
pub security: SecurityConfig,
pub server: ServerConfig,
@@ 65,7 66,7 @@ pub enum PhysicsSolver {
OldPGS,
}
-#[derive(Serialize, Deserialize, Debug, Clone)]
+#[derive(Resource, Serialize, Deserialize, Debug, Clone)]
pub struct PlanetsConfig {
pub planets: HashMap<PlanetType, PlanetConfig>,
}
@@ 75,7 76,7 @@ pub struct PlanetConfig {
pub mass: f32,
}
-#[derive(Serialize, Deserialize, Debug, Clone)]
+#[derive(Resource, Deserialize, Debug, Clone)]
pub struct PartsConfig {
pub parts: HashMap<PartType, PartConfig>,
}
@@ 58,6 58,22 @@ struct StkPluginGroup;
pub static CLIENT_SCALE: f32 = 50.0;
pub static PART_HALF_SIZE: f32 = 25.0;
+static _SERVER_CONFIG: OnceLock<StkConfig> = OnceLock::new();
+#[inline]
+pub fn server_config() -> StkConfig {
+ _SERVER_CONFIG.get().unwrap().clone()
+}
+static _PARTS_CONFIG: OnceLock<PartsConfig> = OnceLock::new();
+#[inline]
+pub fn parts_config() -> PartsConfig {
+ _PARTS_CONFIG.get().unwrap().clone()
+}
+static _PLANETS_CONFIG: OnceLock<PlanetsConfig> = OnceLock::new();
+#[inline]
+pub fn planets_config() -> PlanetsConfig {
+ _PLANETS_CONFIG.get().unwrap().clone()
+}
+
#[cfg(debug_assertions)]
impl PluginGroup for StkPluginGroup {
fn build(self) -> PluginGroupBuilder {
@@ 97,47 113,30 @@ pub struct UserToken {
pub expires: std::time::SystemTime,
}
-static _SERVER_CONFIG: OnceLock<StkConfig> = OnceLock::new();
-#[inline]
-pub fn server_config() -> StkConfig {
- _SERVER_CONFIG.get().unwrap().clone()
-}
-static _PARTS_CONFIG: OnceLock<PartsConfig> = OnceLock::new();
-#[inline]
-pub fn parts_config() -> PartsConfig {
- _PARTS_CONFIG.get().unwrap().clone()
-}
-static _PLANETS_CONFIG: OnceLock<PlanetsConfig> = OnceLock::new();
-#[inline]
-pub fn planets_config() -> PlanetsConfig {
- _PLANETS_CONFIG.get().unwrap().clone()
-}
-
fn main() {
- {
- // read the server main config
- let server_config = fs::read_to_string("/etc/starkingdoms/config.toml").unwrap();
- let parts_config = fs::read_to_string("/etc/starkingdoms/parts.toml").unwrap();
- let planets_config = fs::read_to_string("/etc/starkingdoms/planets.toml").unwrap();
-
- let server_config: StkConfig = toml::from_str(&server_config).unwrap();
- _SERVER_CONFIG.set(server_config).unwrap();
- let parts_config: PartsConfig = toml::from_str(&parts_config).unwrap();
- _PARTS_CONFIG.set(parts_config).unwrap();
- let planets_config: PlanetsConfig = toml::from_str(&planets_config).unwrap();
- _PLANETS_CONFIG.set(planets_config).unwrap();
- }
-
- let cfg = server_config();
+ // read the server main config
+ let server_config = fs::read_to_string("/etc/starkingdoms/config.toml").unwrap();
+ let parts_config = fs::read_to_string("/etc/starkingdoms/parts.toml").unwrap();
+ let planets_config = fs::read_to_string("/etc/starkingdoms/planets.toml").unwrap();
+
+ let server_config: StkConfig = toml::from_str(&server_config).unwrap();
+ _SERVER_CONFIG.set(server_config.clone()).unwrap();
+ let parts_config: PartsConfig = toml::from_str(&parts_config).unwrap();
+ _PARTS_CONFIG.set(parts_config.clone()).unwrap();
+ let planets_config: PlanetsConfig = toml::from_str(&planets_config).unwrap();
+ _PLANETS_CONFIG.set(planets_config.clone()).unwrap();
App::new()
.insert_resource(AppKeys {
- app_key: cfg.security.app_key.as_bytes().to_vec(),
+ app_key: server_config.security.app_key.as_bytes().to_vec(),
})
.insert_resource(StkTungsteniteServerConfig {
- addr: cfg.server.bind.ip,
- port: cfg.server.bind.port,
+ addr: server_config.server.bind.ip,
+ port: server_config.server.bind.port,
})
+ .insert_resource(server_config.clone())
+ .insert_resource(parts_config)
+ .insert_resource(planets_config)
.add_plugins(StkPluginGroup)
.insert_resource(RapierConfiguration {
gravity: Vect { x: 0.0, y: 0.0 },
@@ 145,7 144,7 @@ fn main() {
})
.init_resource::<ModuleTimer>()
.add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(
- cfg.world.pixels_per_meter,
+ server_config.world.pixels_per_meter,
))
.add_plugins(StkTungsteniteServerPlugin)
.add_systems(Startup, setup_integration_parameters)
@@ 161,16 160,16 @@ fn main() {
)
.add_systems(FixedUpdate, save_eligibility)
.add_systems(FixedUpdate, convert_modules)
- .insert_resource(Time::<Fixed>::from_seconds(cfg.server.world_fixed_timestep))
+ .insert_resource(Time::<Fixed>::from_seconds(server_config.server.world_fixed_timestep))
.run();
info!("Goodbye!");
}
-fn setup_integration_parameters(mut context: ResMut<RapierContext>) {
- context.integration_parameters = server_config().physics.parameters;
+fn setup_integration_parameters(mut context: ResMut<RapierContext>, server_config: Res<StkConfig>) {
+ context.integration_parameters = server_config.physics.parameters;
- match server_config().physics.solver {
+ match server_config.physics.solver {
PhysicsSolver::SmallstepPGS => {
context
.integration_parameters
@@ 246,9 245,10 @@ fn module_spawn(
mut module_timer: ResMut<ModuleTimer>,
part_query: Query<&PartType, Without<Attach>>,
mut packet_send: EventWriter<WsEvent>,
+ server_config: Res<StkConfig>,
) {
if module_timer.0.tick(time.delta()).just_finished()
- && part_query.iter().count() < server_config().server.max_free_parts
+ && part_query.iter().count() < server_config.server.max_free_parts
{
let angle: f32 = {
let mut rng = rand::thread_rng();
@@ 335,6 335,7 @@ fn on_message(
mut packet_recv: Local<ManualEventReader<WsEvent>>,
mut packet_event_send: ResMut<Events<WsEvent>>,
app_keys: Res<AppKeys>,
+ server_config: Res<StkConfig>,
) {
let mut event_queue = Vec::new();
for ev in packet_recv.read(&packet_event_send) {
@@ 364,11 365,11 @@ fn on_message(
};
if claims.permission_level
- < server_config().security.required_permission_level
+ < server_config.security.required_permission_level
{
event_queue.push(WsEvent::Send {
to: *from,
- message: Packet::Message { message_type: MessageType::Error, actor: "SERVER".to_string(), content: format!("Permission level {} is too low, {} is required. If your permissions were just changed, you need to log out and log back in for the change to take effect. If you believe this is a mistake, contact StarKingdoms staff.", claims.permission_level, server_config().security.required_permission_level) }.into(),
+ message: Packet::Message { message_type: MessageType::Error, actor: "SERVER".to_string(), content: format!("Permission level {} is too low, {} is required. If your permissions were just changed, you need to log out and log back in for the change to take effect. If you believe this is a mistake, contact StarKingdoms staff.", claims.permission_level, server_config.security.required_permission_level) }.into(),
});
event_queue.push(WsEvent::Close { addr: *from });
continue;
@@ 378,7 379,7 @@ fn on_message(
to: *from,
message: Packet::Message { message_type: MessageType::Server, actor: "StarKingdoms Team".to_string(), content: "Thank you for participating in the StarKingdoms private alpha! Your feedback is essential to improving the game, so please give us any feedback you have in the Discord! <3".to_string() }.into(),
});
- } else if server_config().security.required_permission_level != 0 {
+ } else if server_config.security.required_permission_level != 0 {
event_queue.push(WsEvent::Send {
to: *from,
message: Packet::Message { message_type: MessageType::Error, actor: "SERVER".to_string(), content: "Authentication is required to join this server at the moment. Log in and try again, or try again later.".to_string() }.into(),
@@ 2135,6 2136,7 @@ fn gravity_update(
With<PartType>,
>,
planet_query: Query<(&Transform, &ReadMassProperties), With<PlanetType>>,
+ server_config: Res<StkConfig>,
) {
for (part_transform, part_mp, mut forces, mut impulses) in &mut part_query {
impulses.impulse = Vec2::ZERO;
@@ 2149,7 2151,7 @@ fn gravity_update(
let planet_translate = planet_transform.translation;
let distance = planet_translate.distance(part_translate);
let force =
- server_config().world.gravity * ((part_mass * planet_mass) / (distance * distance));
+ server_config.world.gravity * ((part_mass * planet_mass) / (distance * distance));
let direction = (planet_translate - part_translate).normalize() * force;
/*let gravity_force = ExternalForce::at_point(
direction.xy(),
@@ 308,6 308,12 @@
function load_save_data(save: any) {
grid = new Map();
+ for (let [type, count] of save[1]) {
+ part_counts.set(<PartType>type, {
+ used: 0,
+ available: count,
+ });
+ }
place(0, 0, [PartType.Hearty, save[0]], 2);
}
@@ 410,7 416,7 @@
let packed_savefile = __pack_save_for_api(save_data);
- let r = await fetch(config.environments[3].apiBaseUrl + "/sign_save", {
+ let r = await fetch(config.environments[2].apiBaseUrl + "/sign_save", {
method: "POST",
headers: {
"Content-Type": "application/json",