Skip to content

Commit

Permalink
Switch from importing prims to importing alocs
Browse files Browse the repository at this point in the history
  • Loading branch information
dbierek committed Aug 8, 2024
1 parent 3589606 commit 8c60618
Show file tree
Hide file tree
Showing 10 changed files with 107 additions and 161 deletions.
4 changes: 2 additions & 2 deletions examples/connect_to_game.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ use glacier2obj::connect::game_connection::GameConnection;
pub fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("Usage: cargo run -- example connect_to_game <path to a to_find.json file> <path to an output prims.json file> <path to an output pfBoxes.json file>");
eprintln!("Usage: cargo run -- example connect_to_game <path to an output prims.json file> <path to an output pfBoxes.json file>");
return;
}
GameConnection::get_entity_list_from_game(args[1].as_str(), args[2].as_str(), args[2].as_str());
GameConnection::get_entity_list_from_game(args[1].as_str(), args[2].as_str());
}
21 changes: 7 additions & 14 deletions examples/export_scenario.rs
Original file line number Diff line number Diff line change
@@ -1,30 +1,23 @@
use std::env;

use glacier2obj::{connect::game_connection::GameConnection, extract::prim_extraction::PrimExtraction, json_serde::entities_json::EntitiesJson, package::package_scan::PackageScan, scene::scene_scan::SceneScan};
use glacier2obj::{connect::game_connection::GameConnection, extract::aloc_extraction::AlocExtraction, json_serde::entities_json::EntitiesJson, package::package_scan::PackageScan};

// Based on mount_game_files example from rpkg-rs
pub fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 9 {
eprintln!("Usage: cargo run -- example export_scenario <path to a Retail directory> <game version (H2016 | HM2 | HM3)> <path to a hashlist> <path to toFind file> <path to prims.json file> <path to pfBoxes.json file> <path to a Runtime directory> <path to output prims directory>");
if args.len() < 7 {
eprintln!("Usage: cargo run -- example export_scenario <path to a Retail directory> <game version (H2016 | HM2 | HM3)> <path to prims.json file> <path to pfBoxes.json file> <path to a Runtime directory> <path to output prims directory>");
return;
}
let brick_tblu_hashes: Vec<String> = EntitiesJson::get_brick_tblu_hashes(GameConnection::get_brick_hashes_from_game());
println!("Scene tblu hashes: {:?}", brick_tblu_hashes);
let mut scan: SceneScan = SceneScan::new(brick_tblu_hashes, args[3].clone());
let partition_manager = PackageScan::scan_packages(args[1].clone(), args[2].clone()).unwrap();

//scan.scan_scenario(&partition_manager);
//scan.output_to_file(args[4].clone());

GameConnection::get_entity_list_from_game(args[4].as_str(), args[5].as_str(), args[6].as_str());
let prims_json = EntitiesJson::build_from_prims_file(args[5].clone());
let needed_prim_hashes = PrimExtraction::get_needed_prim_hashes(&prims_json, args[8].clone());
GameConnection::get_entity_list_from_game(args[3].as_str(), args[4].as_str());
let prims_json = EntitiesJson::build_from_alocs_file(args[3].clone());
let needed_prim_hashes = AlocExtraction::get_all_aloc_hashes(&prims_json, args[6].clone());
if needed_prim_hashes.is_empty() {
println!("All prim files already exist. Skipping extraction.");
} else {
println!("Extracting {} prims.", needed_prim_hashes.len());
PrimExtraction::extract_prims(args[7].clone(), needed_prim_hashes, &partition_manager, args[8].clone());
AlocExtraction::extract_alocs(args[5].clone(), needed_prim_hashes, &partition_manager, args[6].clone());
}
println!("Done building prims.json and extracting prims from scenario.")
}
13 changes: 7 additions & 6 deletions examples/extract_prims.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use glacier2obj::extract::prim_extraction::PrimExtraction;
use glacier2obj::extract::aloc_extraction::AlocExtraction;
use glacier2obj::json_serde::entities_json::EntitiesJson;
use glacier2obj::package::package_scan::PackageScan;
use std::env;
Expand All @@ -10,13 +10,14 @@ fn main() {
eprintln!("Usage: cargo run --example extract_prims -- <path to a Retail directory> <path to a Runtime directory> <game version (H2016 | HM2 | HM3)> <path to a prims.json file> <path to output directory>");
return;
}
let prims_json = EntitiesJson::build_from_prims_file(args[4].clone());
let needed_prim_hashes = PrimExtraction::get_needed_prim_hashes(&prims_json, args[5].clone());
if needed_prim_hashes.is_empty() {
let partition_manager = PackageScan::scan_packages(args[1].clone(), args[3].clone()).unwrap();
let prims_json = EntitiesJson::build_from_alocs_file(args[4].clone());
let needed_aloc_hashes = AlocExtraction::get_all_aloc_hashes(&prims_json, args[5].clone());
if needed_aloc_hashes.is_empty() {
println!("All prim files already exist. Skipping extraction.");
return;
}
println!("Extracting {} prims.", needed_prim_hashes.len());
println!("Extracting {} prims.", needed_aloc_hashes.len());
let partition_manager = PackageScan::scan_packages(args[1].clone(), args[3].clone()).unwrap();
PrimExtraction::extract_prims(args[2].clone(), needed_prim_hashes, &partition_manager, args[5].clone());
AlocExtraction::extract_alocs(args[2].clone(), needed_aloc_hashes, &partition_manager, args[5].clone());
}
2 changes: 1 addition & 1 deletion examples/read_prims.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ fn main() {
eprintln!("Usage: cargo run --example read_prims -- <path to a prims.json file>");
return;
}
let mut prims_json: EntitiesJson = EntitiesJson::build_from_prims_file(args[1].clone());
let mut prims_json: EntitiesJson = EntitiesJson::build_from_alocs_file(args[1].clone());
prims_json.output_entities();
}
96 changes: 24 additions & 72 deletions src/connect/game_connection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,65 +7,24 @@ use url::Url;

pub struct GameConnection;
impl GameConnection {
pub fn get_brick_hashes_from_game() -> Vec<String> {
pub fn get_entity_list_from_game(alocs_file_path: &str, pf_boxes_file_path: &str) {
println!("Connecting to EditorServer on port 46735...");
io::stdout().flush().unwrap();

let mut socket = GameConnection::connect_to_game();

GameConnection::send_hello_message(&mut socket);
GameConnection::send_message(&mut socket, "{\"type\":\"rebuildEntityTree\"}".to_string());
GameConnection::send_message(&mut socket, "{\"type\":\"getBrickHashes\"}".to_string());
return GameConnection::receive_brick_hashes_from_game(socket);
}

fn receive_brick_hashes_from_game(mut socket: tungstenite::WebSocket<tungstenite::stream::MaybeTlsStream<std::net::TcpStream>>) -> Vec<String> {
let mut welcome_received: bool = false;
let mut brick_messages: Vec<String> = Vec::new();
loop {
let msg = socket.read_message().expect("Error reading message");
if msg.to_string().as_str() == "Done sending brick hashes." {
println!("Received scene hash. Closing connection to EditorServer and returning scene hash.");
io::stdout().flush().unwrap();
break
}
if msg.to_string().as_str() == "{\"type\":\"entityTreeRebuilt\"}" {
println!("Entity Tree rebuilt. Sending prims to game...");
io::stdout().flush().unwrap();
continue
}
if welcome_received {
println!("Received scene hash from EditorServer: {}", msg);
io::stdout().flush().unwrap();
brick_messages.push(msg.to_string());
} else {
println!("Connected to EditorServer.");
println!("Rebuilding entity tree...");
io::stdout().flush().unwrap();
welcome_received = true;
}
}
return brick_messages;
}

pub fn get_entity_list_from_game(prims_file_path: &str, pf_boxes_file_path: &str) {
println!("Connecting to EditorServer on port 46735...");
io::stdout().flush().unwrap();

let mut socket = GameConnection::connect_to_game();

GameConnection::send_hello_message(&mut socket);

GameConnection::send_message(&mut socket, r#"{"type":"listPrimEntities", "prims":[]}"#.to_string());
GameConnection::send_message(&mut socket, r#"{"type":"listAlocEntities"}"#.to_string());
GameConnection::send_message(&mut socket, r#"{"type":"listPfBoxEntities"}"#.to_string());

GameConnection::clear_file(prims_file_path);
GameConnection::clear_file(alocs_file_path);
GameConnection::clear_file(pf_boxes_file_path);

let prims_file = OpenOptions::new()
let alocs_file = OpenOptions::new()
.write(true)
.append(true)
.open(prims_file_path)
.open(alocs_file_path)
.unwrap();

let pf_boxes_file = OpenOptions::new()
Expand All @@ -75,7 +34,7 @@ impl GameConnection {
.unwrap();


GameConnection::build_entity_list(socket, prims_file, pf_boxes_file);
GameConnection::build_entity_list(socket, alocs_file, pf_boxes_file);
}

fn connect_to_game() -> tungstenite::WebSocket<tungstenite::stream::MaybeTlsStream<std::net::TcpStream>> {
Expand All @@ -94,33 +53,26 @@ impl GameConnection {
let _ = socket.write_message(Message::Text(message.into()));
}

fn get_input_file_contents(in_file_path: &str) -> String {
println!("Loading toFind.json file...");
io::stdout().flush().unwrap();
let in_file_contents = fs::read_to_string(in_file_path).expect(format!("Error opening {}. Run a scan to generate this file", in_file_path).as_str());
in_file_contents
}

fn send_hello_message(socket: &mut tungstenite::WebSocket<tungstenite::stream::MaybeTlsStream<std::net::TcpStream>>) {
println!("Sending hello message...");
io::stdout().flush().unwrap();
let _ = socket.write_message(Message::Text(r#"{"type":"hello","identifier":"glacier2obj"}"#.into()));
}

fn build_entity_list(mut socket: tungstenite::WebSocket<tungstenite::stream::MaybeTlsStream<std::net::TcpStream>>, mut prims_file: fs::File, mut pf_boxes_file: fs::File) {
fn build_entity_list(mut socket: tungstenite::WebSocket<tungstenite::stream::MaybeTlsStream<std::net::TcpStream>>, mut alocs_file: fs::File, mut pf_boxes_file: fs::File) {
let mut welcome_received: bool = false;
let mut is_first: bool = true;
let mut reading_prims: bool = true;
let mut reading_alocs: bool = true;

loop {
let msg = socket.read_message().expect("Error reading message");
if msg.to_string().as_str() == "Done sending entities." {
if reading_prims {
reading_prims = false;
println!("Received Done message for prims. Finalizing prims.json output and getting pf boxes.");
if reading_alocs {
reading_alocs = false;
println!("Received Done message for alocs. Finalizing alocs.json output and getting pf boxes.");
io::stdout().flush().unwrap();
if let Err(e) = writeln!(prims_file, "]}}") {
eprintln!("Couldn't write to prims file: {}", e);
if let Err(e) = writeln!(alocs_file, "]}}") {
eprintln!("Couldn't write to alocs file: {}", e);
io::stdout().flush().unwrap();
}
is_first = true;
Expand All @@ -136,15 +88,15 @@ impl GameConnection {
}
}
if msg.to_string().as_str() == "{\"type\":\"entityTreeRebuilt\"}" {
println!("Entity Tree rebuilt. Sending prims to game...");
println!("Entity Tree rebuilt.");
io::stdout().flush().unwrap();
continue
}
if welcome_received {
if !is_first {
if reading_prims {
if let Err(e) = writeln!(prims_file, ",") {
eprintln!("Couldn't write to prims file: {}", e);
if reading_alocs {
if let Err(e) = writeln!(alocs_file, ",") {
eprintln!("Couldn't write to alocs file: {}", e);
io::stdout().flush().unwrap();
}
} else {
Expand All @@ -155,17 +107,17 @@ impl GameConnection {
}
} else {
is_first = false;
if reading_prims {
println!("Received first PRIM transform from EditorServer. Continuing to process PRIM transforms...");
if reading_alocs {
println!("Received first ALOC transform from EditorServer. Continuing to process ALOC transforms...");
io::stdout().flush().unwrap();
} else {
println!("Received first pf box transform from EditorServer. Continuing to process pf box transforms...");
io::stdout().flush().unwrap();
}
}
if reading_prims {
if let Err(e) = write!(prims_file, "{}", msg) {
eprintln!("Couldn't write to prims file: {}", e);
if reading_alocs {
if let Err(e) = write!(alocs_file, "{}", msg) {
eprintln!("Couldn't write to alocs file: {}", e);
}
}
else {
Expand All @@ -174,8 +126,8 @@ impl GameConnection {
}
}
} else {
if let Err(e) = write!(prims_file, r#"{{"entities":["#) {
eprintln!("Couldn't write to prims file: {}", e);
if let Err(e) = write!(alocs_file, r#"{{"entities":["#) {
eprintln!("Couldn't write to alocs file: {}", e);
}
if let Err(e) = write!(pf_boxes_file, r#"{{"entities":["#) {
eprintln!("Couldn't write to pf boxes file: {}", e);
Expand Down
Loading

0 comments on commit 8c60618

Please sign in to comment.