mirror of
https://github.com/redstrate/Kawari.git
synced 2025-04-28 09:27:45 +00:00
Remove hardcoded initial zone, derive it from selected City-State
This currently might spawn you in the ground in Ul'dah and probably Limsa too, until I determine the correct spawn location.
This commit is contained in:
parent
15ed586fd0
commit
4b740068d4
5 changed files with 38 additions and 20 deletions
|
@ -1,7 +1,8 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use kawari::common::custom_ipc::{CustomIpcData, CustomIpcSegment, CustomIpcType};
|
use kawari::common::custom_ipc::{CustomIpcData, CustomIpcSegment, CustomIpcType};
|
||||||
use kawari::common::{get_citystate, get_world_name};
|
use kawari::common::timestamp_secs;
|
||||||
|
use kawari::common::{determine_initial_starting_zone, get_citystate, get_world_name};
|
||||||
use kawari::config::get_config;
|
use kawari::config::get_config;
|
||||||
use kawari::lobby::CharaMake;
|
use kawari::lobby::CharaMake;
|
||||||
use kawari::oodle::OodleNetwork;
|
use kawari::oodle::OodleNetwork;
|
||||||
|
@ -21,7 +22,6 @@ use kawari::world::{
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use kawari::world::{PlayerData, WorldDatabase};
|
use kawari::world::{PlayerData, WorldDatabase};
|
||||||
use kawari::{ZONE_ID, common::timestamp_secs};
|
|
||||||
use physis::common::{Language, Platform};
|
use physis::common::{Language, Platform};
|
||||||
use physis::gamedata::GameData;
|
use physis::gamedata::GameData;
|
||||||
use tokio::io::AsyncReadExt;
|
use tokio::io::AsyncReadExt;
|
||||||
|
@ -59,7 +59,7 @@ async fn main() {
|
||||||
state,
|
state,
|
||||||
player_data: PlayerData::default(),
|
player_data: PlayerData::default(),
|
||||||
spawn_index: 0,
|
spawn_index: 0,
|
||||||
zone: Zone::load(ZONE_ID),
|
zone: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
|
@ -238,11 +238,17 @@ async fn main() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let chara_details = database
|
||||||
|
.find_chara_make(connection.player_data.content_id);
|
||||||
|
|
||||||
|
let zone_id = determine_initial_starting_zone(
|
||||||
|
chara_details.city_state,
|
||||||
|
);
|
||||||
|
|
||||||
|
connection.zone = Some(Zone::load(zone_id));
|
||||||
|
|
||||||
// Player Setup
|
// Player Setup
|
||||||
{
|
{
|
||||||
let chara_details = database
|
|
||||||
.find_chara_make(connection.player_data.content_id);
|
|
||||||
|
|
||||||
let ipc = ServerZoneIpcSegment {
|
let ipc = ServerZoneIpcSegment {
|
||||||
op_code: ServerZoneIpcType::PlayerSetup,
|
op_code: ServerZoneIpcType::PlayerSetup,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
|
@ -283,7 +289,7 @@ async fn main() {
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.change_zone(ZONE_ID).await;
|
connection.change_zone(zone_id).await;
|
||||||
|
|
||||||
// send welcome message
|
// send welcome message
|
||||||
{
|
{
|
||||||
|
@ -424,7 +430,11 @@ async fn main() {
|
||||||
content_id: connection
|
content_id: connection
|
||||||
.player_data
|
.player_data
|
||||||
.content_id,
|
.content_id,
|
||||||
zone_id: connection.zone.id,
|
zone_id: connection
|
||||||
|
.zone
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.id,
|
||||||
zone_id1: 0x0100,
|
zone_id1: 0x0100,
|
||||||
class_job: 36,
|
class_job: 36,
|
||||||
level: 100,
|
level: 100,
|
||||||
|
@ -575,6 +585,8 @@ async fn main() {
|
||||||
{
|
{
|
||||||
let (_, exit_box) = connection
|
let (_, exit_box) = connection
|
||||||
.zone
|
.zone
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
.find_exit_box(*exit_box_id)
|
.find_exit_box(*exit_box_id)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
tracing::info!("exit box: {:#?}", exit_box);
|
tracing::info!("exit box: {:#?}", exit_box);
|
||||||
|
|
|
@ -83,3 +83,16 @@ pub fn get_citystate(classjob_id: u16) -> u8 {
|
||||||
|
|
||||||
*town_id
|
*town_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets the initial zone for a given city-state id
|
||||||
|
pub fn determine_initial_starting_zone(citystate_id: u8) -> u16 {
|
||||||
|
match citystate_id {
|
||||||
|
// Limsa
|
||||||
|
1 => 128,
|
||||||
|
// Gridania
|
||||||
|
2 => 132,
|
||||||
|
// Ul'dah
|
||||||
|
3 => 130,
|
||||||
|
_ => panic!("This is not a valid city-state id!"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -26,10 +26,6 @@ pub mod packet;
|
||||||
/// Logic server-specific code.
|
/// Logic server-specific code.
|
||||||
pub mod login;
|
pub mod login;
|
||||||
|
|
||||||
/// The zone ID you initially spawn in.
|
|
||||||
/// See the TerritoryType excel sheet for a list of possible IDs.
|
|
||||||
pub const ZONE_ID: u16 = 132;
|
|
||||||
|
|
||||||
pub const INVALID_OBJECT_ID: u32 = 0xE0000000;
|
pub const INVALID_OBJECT_ID: u32 = 0xE0000000;
|
||||||
|
|
||||||
/// Maxmimum length of a character's name.
|
/// Maxmimum length of a character's name.
|
||||||
|
|
|
@ -30,7 +30,7 @@ pub struct ZoneConnection {
|
||||||
pub state: PacketState,
|
pub state: PacketState,
|
||||||
pub player_data: PlayerData,
|
pub player_data: PlayerData,
|
||||||
|
|
||||||
pub zone: Zone,
|
pub zone: Option<Zone>,
|
||||||
pub spawn_index: u8,
|
pub spawn_index: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ impl ZoneConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn change_zone(&mut self, new_zone_id: u16) {
|
pub async fn change_zone(&mut self, new_zone_id: u16) {
|
||||||
self.zone = Zone::load(new_zone_id);
|
self.zone = Some(Zone::load(new_zone_id));
|
||||||
|
|
||||||
// Player Class Info
|
// Player Class Info
|
||||||
{
|
{
|
||||||
|
@ -128,7 +128,7 @@ impl ZoneConnection {
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
data: ServerZoneIpcData::InitZone(InitZone {
|
data: ServerZoneIpcData::InitZone(InitZone {
|
||||||
server_id: 0,
|
server_id: 0,
|
||||||
zone_id: self.zone.id,
|
zone_id: self.zone.as_ref().unwrap().id,
|
||||||
weather_id: 1,
|
weather_id: 1,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -2,10 +2,7 @@ use std::sync::Mutex;
|
||||||
|
|
||||||
use rusqlite::Connection;
|
use rusqlite::Connection;
|
||||||
|
|
||||||
use crate::{
|
use crate::lobby::{CharaMake, ClientSelectData, ipc::CharacterDetails};
|
||||||
ZONE_ID,
|
|
||||||
lobby::{CharaMake, ClientSelectData, ipc::CharacterDetails},
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::PlayerData;
|
use super::PlayerData;
|
||||||
|
|
||||||
|
@ -121,7 +118,7 @@ impl WorldDatabase {
|
||||||
guardian: chara_make.guardian,
|
guardian: chara_make.guardian,
|
||||||
unk8: 0,
|
unk8: 0,
|
||||||
unk9: 0,
|
unk9: 0,
|
||||||
zone_id: ZONE_ID as i32,
|
zone_id: 130 as i32,
|
||||||
unk11: 0,
|
unk11: 0,
|
||||||
customize: chara_make.customize,
|
customize: chara_make.customize,
|
||||||
unk12: 0,
|
unk12: 0,
|
||||||
|
|
Loading…
Add table
Reference in a new issue