From 554d42a90432d70f4893e1403c4c26b0a02c3b89 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 28 Jun 2025 10:44:25 -0400 Subject: [PATCH] Equip the correct starting weapon for your selected classjob This prevents all sorts of oopsies because the client will refuse to equip certain items, if you happen to be using a Gladiator weapon on an Archer or vice-versa. See #50 --- src/inventory/mod.rs | 26 +++++++++++++++++--------- src/world/custom_ipc_handler.rs | 2 ++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/inventory/mod.rs b/src/inventory/mod.rs index b3a39b0..9029619 100644 --- a/src/inventory/mod.rs +++ b/src/inventory/mod.rs @@ -1,4 +1,4 @@ -use icarus::Race::RaceSheet; +use icarus::{ClassJob::ClassJobSheet, Race::RaceSheet}; use physis::common::Language; use serde::{Deserialize, Serialize}; @@ -129,6 +129,22 @@ impl<'a> Iterator for InventoryIterator<'a> { } impl Inventory { + /// Equip the starting items for a given classjob + pub fn equip_classjob_items(&mut self, classjob_id: u16, game_data: &mut GameData) { + let sheet = ClassJobSheet::read_from(&mut game_data.game_data, Language::English).unwrap(); + let row = sheet.get_row(classjob_id as u32).unwrap(); + + self.equipped.main_hand = + Item::new(1, *row.ItemStartingWeapon().into_i32().unwrap() as u32); + + // TODO: don't hardcode + self.equipped.ears = Item::new(1, 0x00003b1b); + self.equipped.neck = Item::new(1, 0x00003b1a); + self.equipped.wrists = Item::new(1, 0x00003b1c); + self.equipped.right_ring = Item::new(1, 0x0000114a); + self.equipped.left_ring = Item::new(1, 0x00003b1d); + } + /// Equip the starting items for a given race pub fn equip_racial_items(&mut self, race_id: u8, gender: u8, game_data: &mut GameData) { let sheet = RaceSheet::read_from(&mut game_data.game_data, Language::English).unwrap(); @@ -145,14 +161,6 @@ impl Inventory { self.equipped.legs = Item::new(1, *row.RSEFLegs().into_i32().unwrap() as u32); self.equipped.feet = Item::new(1, *row.RSEFFeet().into_i32().unwrap() as u32); } - - // TODO: don't hardcode - self.equipped.main_hand = Item::new(1, 0x00000641); - self.equipped.ears = Item::new(1, 0x00003b1b); - self.equipped.neck = Item::new(1, 0x00003b1a); - self.equipped.wrists = Item::new(1, 0x00003b1c); - self.equipped.right_ring = Item::new(1, 0x0000114a); - self.equipped.left_ring = Item::new(1, 0x00003b1d); } pub fn process_action(&mut self, action: &ItemOperation) { diff --git a/src/world/custom_ipc_handler.rs b/src/world/custom_ipc_handler.rs index 9c16892..c93ccf0 100644 --- a/src/world/custom_ipc_handler.rs +++ b/src/world/custom_ipc_handler.rs @@ -37,6 +37,8 @@ pub async fn handle_custom_ipc(connection: &mut ZoneConnection, data: &CustomIpc { let mut game_data = connection.gamedata.lock().unwrap(); + inventory.equip_classjob_items(chara_make.classjob_id as u16, &mut game_data); + // fill inventory inventory.equip_racial_items( chara_make.customize.race,