mirror of
https://github.com/IntQuant/noita_entangled_worlds.git
synced 2025-10-19 07:03:16 +00:00
Refactor player cosmetics handling a bit, properly create temp model if one wasn't sent.
This commit is contained in:
parent
603c56c2d0
commit
17103adc97
5 changed files with 77 additions and 48 deletions
2
noita-proxy/Cargo.lock
generated
2
noita-proxy/Cargo.lock
generated
|
@ -1949,7 +1949,7 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
|
|||
|
||||
[[package]]
|
||||
name = "noita-proxy"
|
||||
version = "0.26.2"
|
||||
version = "0.26.3"
|
||||
dependencies = [
|
||||
"argh",
|
||||
"bincode",
|
||||
|
|
|
@ -19,6 +19,7 @@ use net::{
|
|||
steam_networking::{ExtraPeerState, PerPeerStatusEntry},
|
||||
NetManagerInit, RunInfo,
|
||||
};
|
||||
use player_cosmetics::PlayerPngDesc;
|
||||
use self_update::SelfUpdateManager;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::str::FromStr;
|
||||
|
@ -395,6 +396,10 @@ impl App {
|
|||
mod_path,
|
||||
player_path: player_path(self.modmanager_settings.mod_path()),
|
||||
modmanager_settings: self.modmanager_settings.clone(),
|
||||
player_png_desc: PlayerPngDesc {
|
||||
cosmetics: cosmetics.into(),
|
||||
colors: self.appearance.player_color,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1274,6 +1279,10 @@ fn cli_setup() -> (steam_helper::SteamState, NetManagerInit) {
|
|||
mod_path: mod_manager.mod_path(),
|
||||
player_path,
|
||||
modmanager_settings: mod_manager,
|
||||
player_png_desc: PlayerPngDesc {
|
||||
cosmetics: cosmetics.into(),
|
||||
colors: PlayerColor::default(),
|
||||
},
|
||||
};
|
||||
(state, netmaninit)
|
||||
}
|
||||
|
|
|
@ -23,13 +23,13 @@ use tangled::Reliability;
|
|||
use tracing::{error, info, warn};
|
||||
use tungstenite::{accept, WebSocket};
|
||||
|
||||
use crate::player_cosmetics::create_player_png;
|
||||
use crate::mod_manager::ModmanagerSettings;
|
||||
use crate::player_cosmetics::{create_player_png, PlayerPngDesc};
|
||||
use crate::{
|
||||
bookkeeping::save_state::{SaveState, SaveStateEntry},
|
||||
recorder::Recorder,
|
||||
GameSettings, PlayerColor,
|
||||
};
|
||||
use crate::mod_manager::ModmanagerSettings;
|
||||
pub mod messages;
|
||||
mod proxy_opt;
|
||||
pub mod steam_networking;
|
||||
|
@ -110,7 +110,8 @@ pub struct NetManagerInit {
|
|||
pub cosmetics: (bool, bool, bool),
|
||||
pub mod_path: PathBuf,
|
||||
pub player_path: PathBuf,
|
||||
pub modmanager_settings: ModmanagerSettings
|
||||
pub modmanager_settings: ModmanagerSettings,
|
||||
pub player_png_desc: PlayerPngDesc,
|
||||
}
|
||||
|
||||
pub struct NetManager {
|
||||
|
@ -170,7 +171,11 @@ impl NetManager {
|
|||
create_dir(tmp).unwrap();
|
||||
}
|
||||
|
||||
pub(crate) fn start_inner(self: Arc<NetManager>, player_path: PathBuf, mut cli: bool) -> io::Result<()> {
|
||||
pub(crate) fn start_inner(
|
||||
self: Arc<NetManager>,
|
||||
player_path: PathBuf,
|
||||
mut cli: bool,
|
||||
) -> io::Result<()> {
|
||||
Self::clean_dir(player_path.clone());
|
||||
if !self.init_settings.cosmetics.0 {
|
||||
File::create(player_path.parent().unwrap().join("tmp/no_crown"))?;
|
||||
|
@ -227,15 +232,13 @@ impl NetManager {
|
|||
),
|
||||
};
|
||||
let mut last_iter = Instant::now();
|
||||
// Create appearance files for local player.
|
||||
create_player_png(
|
||||
self.peer.my_id().unwrap(),
|
||||
&self.init_settings.mod_path,
|
||||
&self.init_settings.player_path,
|
||||
(
|
||||
self.peer.my_id().unwrap().to_string(),
|
||||
self.init_settings.cosmetics,
|
||||
self.init_settings.player_color,
|
||||
),
|
||||
self.is_host()
|
||||
&self.init_settings.player_png_desc,
|
||||
self.is_host(),
|
||||
);
|
||||
while self.continue_running.load(atomic::Ordering::Relaxed) {
|
||||
if cli {
|
||||
|
@ -283,7 +286,7 @@ impl NetManager {
|
|||
match net_event {
|
||||
omni::OmniNetworkEvent::PeerConnected(id) => {
|
||||
self.broadcast(&NetMsg::Welcome, Reliability::Reliable);
|
||||
info!("Peer connected");
|
||||
info!("Peer connected {id}");
|
||||
if self.peer.my_id() == Some(self.peer.host_id()) {
|
||||
info!("Sending start game message");
|
||||
self.send(
|
||||
|
@ -293,25 +296,23 @@ impl NetManager {
|
|||
},
|
||||
Reliability::Reliable,
|
||||
);
|
||||
}
|
||||
if id != self.peer.my_id().unwrap() {
|
||||
// Create temporary appearance files for new player.
|
||||
create_player_png(
|
||||
id,
|
||||
&self.init_settings.mod_path,
|
||||
&self.init_settings.player_path,
|
||||
(
|
||||
self.peer.my_id().unwrap().to_string(),
|
||||
self.init_settings.cosmetics,
|
||||
self.init_settings.player_color,
|
||||
),
|
||||
self.is_host()
|
||||
&PlayerPngDesc::default(),
|
||||
self.is_host(),
|
||||
);
|
||||
}
|
||||
state.try_ws_write(ws_encode_proxy("join", id.as_hex()));
|
||||
self.send(
|
||||
id,
|
||||
&NetMsg::PlayerColor((
|
||||
self.peer.my_id().unwrap().to_string(),
|
||||
self.init_settings.cosmetics,
|
||||
self.init_settings.player_color),
|
||||
self.is_host()
|
||||
&NetMsg::PlayerColor(
|
||||
self.init_settings.player_png_desc,
|
||||
self.is_host(),
|
||||
),
|
||||
Reliability::Reliable,
|
||||
);
|
||||
|
@ -350,11 +351,14 @@ impl NetManager {
|
|||
}
|
||||
NetMsg::WorldMessage(msg) => state.world.handle_msg(src, msg),
|
||||
NetMsg::PlayerColor(rgb, host) => {
|
||||
info!("Player appearance created for {}", src);
|
||||
// Create proper appearance files for new player.
|
||||
create_player_png(
|
||||
src,
|
||||
&self.init_settings.mod_path,
|
||||
&self.init_settings.player_path,
|
||||
rgb,
|
||||
host
|
||||
&rgb,
|
||||
host,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -458,7 +462,10 @@ impl NetManager {
|
|||
state.try_ws_write_option("health_per_player", settings.health_per_player);
|
||||
state.try_ws_write_option("enemy_sync_interval", settings.enemy_sync_interval);
|
||||
let rgb = self.init_settings.player_color.player_main;
|
||||
state.try_ws_write_option("mina_color", rgb[0] as u32 + ((rgb[1] as u32) << 8) + ((rgb[2] as u32) << 16));
|
||||
state.try_ws_write_option(
|
||||
"mina_color",
|
||||
rgb[0] as u32 + ((rgb[1] as u32) << 8) + ((rgb[2] as u32) << 16),
|
||||
);
|
||||
let progress = settings.progress.join(",");
|
||||
state.try_ws_write_option("progress", progress.as_str());
|
||||
|
||||
|
@ -572,9 +579,9 @@ impl NetManager {
|
|||
1 => {
|
||||
let pos = if data.len() > 1 {
|
||||
let pos = data[1..]
|
||||
.split(|b| *b == b':')
|
||||
.map(|s| String::from_utf8_lossy(s).parse::<i32>().unwrap_or(0))
|
||||
.collect::<Vec<i32>>();
|
||||
.split(|b| *b == b':')
|
||||
.map(|s| String::from_utf8_lossy(s).parse::<i32>().unwrap_or(0))
|
||||
.collect::<Vec<i32>>();
|
||||
Some(pos)
|
||||
} else {
|
||||
None
|
||||
|
@ -595,7 +602,11 @@ impl NetManager {
|
|||
settings.seed = rand::random();
|
||||
}
|
||||
info!("New seed: {}", settings.seed);
|
||||
settings.progress = self.init_settings.modmanager_settings.get_progress().unwrap_or_default();
|
||||
settings.progress = self
|
||||
.init_settings
|
||||
.modmanager_settings
|
||||
.get_progress()
|
||||
.unwrap_or_default();
|
||||
*self.settings.lock().unwrap() = settings;
|
||||
state.world.reset()
|
||||
}
|
||||
|
@ -615,4 +626,4 @@ impl Drop for NetManager {
|
|||
info!("Skip saving run info: not a host");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use bitcode::{Decode, Encode};
|
||||
|
||||
use crate::{GameSettings, PlayerColor};
|
||||
use crate::{player_cosmetics::PlayerPngDesc, GameSettings};
|
||||
|
||||
use super::{omni::OmniPeerId, world::WorldNetMessage};
|
||||
|
||||
|
@ -25,7 +25,7 @@ pub(crate) enum NetMsg {
|
|||
ModRaw { data: Vec<u8> },
|
||||
ModCompressed { data: Vec<u8> },
|
||||
WorldMessage(WorldNetMessage),
|
||||
PlayerColor((String, (bool, bool, bool), PlayerColor), bool),
|
||||
PlayerColor(PlayerPngDesc, bool),
|
||||
}
|
||||
|
||||
impl From<MessageRequest<WorldNetMessage>> for MessageRequest<NetMsg> {
|
||||
|
@ -36,4 +36,4 @@ impl From<MessageRequest<WorldNetMessage>> for MessageRequest<NetMsg> {
|
|||
dst: value.dst,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
use crate::lang::tr;
|
||||
use crate::net::omni::OmniPeerId;
|
||||
use crate::{App, PlayerColor, PlayerPicker};
|
||||
use bitcode::{Decode, Encode};
|
||||
use eframe::egui;
|
||||
use eframe::egui::color_picker::{color_picker_color32, Alpha};
|
||||
use eframe::egui::{Color32, TextureHandle, TextureOptions, Ui};
|
||||
|
@ -25,7 +27,11 @@ pub fn arrows_path(path: PathBuf, is_host: bool) -> PathBuf {
|
|||
}
|
||||
|
||||
pub fn cursor_path(path: PathBuf) -> PathBuf {
|
||||
path.parent().unwrap().parent().unwrap().join("resource/sprites/cursor.png")
|
||||
path.parent()
|
||||
.unwrap()
|
||||
.parent()
|
||||
.unwrap()
|
||||
.join("resource/sprites/cursor.png")
|
||||
}
|
||||
|
||||
pub fn replace_color(image: &mut RgbaImage, main: Rgba<u8>, alt: Rgba<u8>, arm: Rgba<u8>) {
|
||||
|
@ -228,19 +234,22 @@ pub fn create_arm(arm: Rgba<u8>) -> RgbaImage {
|
|||
img
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Decode, Encode, Default)]
|
||||
pub struct PlayerPngDesc {
|
||||
pub(crate) cosmetics: [bool; 3],
|
||||
pub(crate) colors: PlayerColor,
|
||||
}
|
||||
|
||||
pub fn create_player_png(
|
||||
peer: OmniPeerId,
|
||||
mod_path: &Path,
|
||||
player_path: &Path,
|
||||
rgb: (String, (bool, bool, bool), PlayerColor),
|
||||
is_host: bool
|
||||
rgb: &PlayerPngDesc,
|
||||
is_host: bool,
|
||||
) {
|
||||
let id = if rgb.0.len() < 5 {
|
||||
format!("{:01$}", rgb.0.parse::<usize>().unwrap(), 16)
|
||||
} else {
|
||||
format!("{:01$X}", rgb.0.parse::<u64>().unwrap(), 16).to_ascii_lowercase()
|
||||
};
|
||||
let cosmetics = rgb.1;
|
||||
let rgb = rgb.2;
|
||||
let id = peer.as_hex();
|
||||
let cosmetics = rgb.cosmetics;
|
||||
let rgb = rgb.colors;
|
||||
let tmp_path = player_path.parent().unwrap();
|
||||
let arrows_path = arrows_path(tmp_path.into(), is_host);
|
||||
let cursor_path = cursor_path(tmp_path.into());
|
||||
|
@ -303,7 +312,7 @@ pub fn create_player_png(
|
|||
&[
|
||||
(
|
||||
"MARKER_HAT2_ENABLED",
|
||||
(if cosmetics.0 {
|
||||
(if cosmetics[0] {
|
||||
"image_file=\"data/enemies_gfx/player_hat2.xml\""
|
||||
} else {
|
||||
""
|
||||
|
@ -312,7 +321,7 @@ pub fn create_player_png(
|
|||
),
|
||||
(
|
||||
"MARKER_AMULET_ENABLED",
|
||||
(if cosmetics.1 {
|
||||
(if cosmetics[1] {
|
||||
"image_file=\"data/enemies_gfx/player_amulet.xml\""
|
||||
} else {
|
||||
""
|
||||
|
@ -321,7 +330,7 @@ pub fn create_player_png(
|
|||
),
|
||||
(
|
||||
"MARKER_AMULET_GEM_ENABLED",
|
||||
(if cosmetics.2 {
|
||||
(if cosmetics[2] {
|
||||
"image_file=\"data/enemies_gfx/player_amulet_gem.xml\""
|
||||
} else {
|
||||
""
|
||||
|
@ -391,4 +400,4 @@ fn edit_by_replacing(
|
|||
|
||||
fn rgb_to_hex(rgb: [u8; 4]) -> String {
|
||||
format!("{:02X}{:02X}{:02X}", rgb[0], rgb[1], rgb[2])
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue