This commit is contained in:
parent
8b4eb146ac
commit
fc5d318ac3
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -1040,7 +1040,7 @@ checksum = "739e9d7726dc32173fed2d69d17eef3c54682169e4e20ff1d0a45dcd37063cef"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "libpso"
|
name = "libpso"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+http://git.sharnoth.com/jake/libpso#e71b435ea3dde01a44abf0492bfab12236b1ec06"
|
source = "git+http://git.sharnoth.com/jake/libpso#05222bbf9fe402675447bc163b45e07a327cdb1a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"psopacket",
|
"psopacket",
|
||||||
@ -1399,7 +1399,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "psopacket"
|
name = "psopacket"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
source = "git+http://git.sharnoth.com/jake/libpso#e71b435ea3dde01a44abf0492bfab12236b1ec06"
|
source = "git+http://git.sharnoth.com/jake/libpso#05222bbf9fe402675447bc163b45e07a327cdb1a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -418,8 +418,7 @@ async fn add_weapon_modifier(conn: &mut sqlx::PgConnection, item_id: &ItemEntity
|
|||||||
|
|
||||||
async fn get_character_inventory(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId) -> Result<InventoryEntity, GatewayError>
|
async fn get_character_inventory(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId) -> Result<InventoryEntity, GatewayError>
|
||||||
{
|
{
|
||||||
// this is some degen shit
|
let conn = Arc::new(Mutex::new(conn.begin().await?)); // this is some degen shit
|
||||||
let conn = Arc::new(Mutex::new(conn.begin().await?));
|
|
||||||
let inventory = sqlx::query_as::<_, PgInventoryEntity>("select * from inventory where pchar = $1")
|
let inventory = sqlx::query_as::<_, PgInventoryEntity>("select * from inventory where pchar = $1")
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.fetch_one(&mut **conn.lock().await).await?;
|
.fetch_one(&mut **conn.lock().await).await?;
|
||||||
@ -442,8 +441,7 @@ async fn get_character_inventory(conn: &mut sqlx::PgConnection, char_id: &Charac
|
|||||||
|
|
||||||
async fn get_character_bank(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, bank_identifier: &BankIdentifier) -> Result<BankEntity, GatewayError>
|
async fn get_character_bank(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, bank_identifier: &BankIdentifier) -> Result<BankEntity, GatewayError>
|
||||||
{
|
{
|
||||||
// this is some degen shit
|
let conn = Arc::new(Mutex::new(conn.begin().await?)); // this is some degen shit
|
||||||
let conn = Arc::new(Mutex::new(conn.begin().await?));
|
|
||||||
let bank = match bank_identifier {
|
let bank = match bank_identifier {
|
||||||
BankIdentifier::Character => {
|
BankIdentifier::Character => {
|
||||||
sqlx::query_as::<_, PgInventoryEntity>("select * from bank where pchar = $1")
|
sqlx::query_as::<_, PgInventoryEntity>("select * from bank where pchar = $1")
|
||||||
@ -451,15 +449,17 @@ async fn get_character_bank(conn: &mut sqlx::PgConnection, char_id: &CharacterEn
|
|||||||
.fetch_one(&mut **conn.lock().await).await?
|
.fetch_one(&mut **conn.lock().await).await?
|
||||||
},
|
},
|
||||||
BankIdentifier::Shared(bank_name) => {
|
BankIdentifier::Shared(bank_name) => {
|
||||||
todo!();
|
sqlx::query_as::<_, PgInventoryEntity>("select player_character.id as pchar, shared_bank.items as items from shared_bank
|
||||||
/*
|
join player_character on shared_bank.user_account = player_character.user_account
|
||||||
sqlx::query_as::<_, PgInventoryEntity>("select shared_bank.* from shared_bank
|
where player_character.id = $1 and shared_bank.name = $2")
|
||||||
left join player_character on shared_bank.user = player_character.user
|
|
||||||
where player_character.id = $1 and bank.name = $2")
|
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.bind(&bank_name.0)
|
.bind(&bank_name.0)
|
||||||
.fetch_one(&mut **conn.lock().await).await?
|
.fetch_optional(&mut **conn.lock().await)
|
||||||
*/
|
.await?
|
||||||
|
.unwrap_or_else(|| PgInventoryEntity {
|
||||||
|
pchar: char_id.0 as i32,
|
||||||
|
items: sqlx::types::Json::default(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -519,21 +519,22 @@ async fn set_character_bank(conn: &mut sqlx::PgConnection, char_id: &CharacterEn
|
|||||||
|
|
||||||
match bank_identifier {
|
match bank_identifier {
|
||||||
BankIdentifier::Character => {
|
BankIdentifier::Character => {
|
||||||
sqlx::query("insert into bank (pchar, items) values ($1, $2) on conflict (pchar, name) do update set items = $2")
|
sqlx::query("insert into bank (pchar, items, name) values ($1, $2, '') on conflict (pchar, name) do update set items = $2")
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.bind(sqlx::types::Json(bank))
|
.bind(sqlx::types::Json(bank))
|
||||||
.execute(conn)
|
.execute(conn)
|
||||||
.await?;
|
.await?;
|
||||||
},
|
},
|
||||||
BankIdentifier::Shared(bank_name) => {
|
BankIdentifier::Shared(bank_name) => {
|
||||||
// TODO!
|
sqlx::query("insert into shared_bank (user_account, items, name)
|
||||||
/*
|
select player_character.user_account, $2, $3 from player_character
|
||||||
sqlx::query("insert into shared_bank (pchar, items) values ($1, $2) on conflict (pchar, name) do update set items = $2")
|
where player_character.id = $1
|
||||||
|
on conflict (user_account, name) do update set items = $2;")
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.bind(sqlx::types::Json(bank))
|
.bind(sqlx::types::Json(bank))
|
||||||
|
.bind(&bank_name.0)
|
||||||
.execute(conn)
|
.execute(conn)
|
||||||
.await?;
|
.await?;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -569,7 +570,7 @@ async fn set_character_equips(conn: &mut sqlx::PgConnection, char_id: &Character
|
|||||||
|
|
||||||
async fn set_character_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, meseta: Meseta) -> Result<(), GatewayError>
|
async fn set_character_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, meseta: Meseta) -> Result<(), GatewayError>
|
||||||
{
|
{
|
||||||
sqlx::query("insert into character_meseta values ($1, '', $2) on conflict (pchar) do update set meseta = $2")
|
sqlx::query("insert into character_meseta values ($1, $2) on conflict (pchar) do update set meseta = $2")
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.bind(meseta.0 as i32)
|
.bind(meseta.0 as i32)
|
||||||
.execute(conn)
|
.execute(conn)
|
||||||
@ -592,14 +593,22 @@ async fn set_bank_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntit
|
|||||||
{
|
{
|
||||||
match bank_identifier {
|
match bank_identifier {
|
||||||
BankIdentifier::Character => {
|
BankIdentifier::Character => {
|
||||||
sqlx::query("insert into bank_meseta values ($1, '', $2) on conflict pchar do update set meseta = $2")
|
sqlx::query("insert into bank_meseta values ($1, '', $2) on conflict (pchar, bank) do update set meseta = $2")
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.bind(meseta.0 as i32)
|
.bind(meseta.0 as i32)
|
||||||
.execute(conn)
|
.execute(conn)
|
||||||
.await?;
|
.await?;
|
||||||
},
|
},
|
||||||
BankIdentifier::Shared(bank_name) => {
|
BankIdentifier::Shared(bank_name) => {
|
||||||
todo!();
|
sqlx::query("insert into shared_bank_meseta (user_account, name, meseta)
|
||||||
|
select player_character.user_account, $2, $3 from player_character
|
||||||
|
where player_character.id = $1
|
||||||
|
on conflict (user_account, name) do update set meseta = $3")
|
||||||
|
.bind(char_id.0)
|
||||||
|
.bind(&bank_name.0)
|
||||||
|
.bind(meseta.0 as i32)
|
||||||
|
.execute(conn)
|
||||||
|
.await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,18 +620,25 @@ async fn get_bank_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntit
|
|||||||
#[derive(sqlx::FromRow)]
|
#[derive(sqlx::FromRow)]
|
||||||
struct PgMeseta(i32);
|
struct PgMeseta(i32);
|
||||||
|
|
||||||
match bank_identifier {
|
let meseta = match bank_identifier {
|
||||||
BankIdentifier::Character => {
|
BankIdentifier::Character => {
|
||||||
let meseta = sqlx::query_as::<_, PgMeseta>(r#"select meseta from bank_meseta where pchar = $1"#)
|
sqlx::query_as::<_, PgMeseta>(r#"select meseta from bank_meseta where pchar = $1"#)
|
||||||
.bind(char_id.0)
|
.bind(char_id.0)
|
||||||
.fetch_one(conn)
|
.fetch_one(conn)
|
||||||
.await?;
|
.await?
|
||||||
Ok(Meseta(meseta.0 as u32))
|
|
||||||
},
|
},
|
||||||
BankIdentifier::Shared(bank_name) => {
|
BankIdentifier::Shared(bank_name) => {
|
||||||
todo!();
|
sqlx::query_as::<_, PgMeseta>(r#"select shared_bank_meseta.meseta from shared_bank_meseta
|
||||||
|
join player_character on shared_bank_meseta.user_account = player_character.user_account
|
||||||
|
where player_character.id = $1 and shared_bank_meseta.name = $2"#)
|
||||||
|
.bind(char_id.0)
|
||||||
|
.bind(&bank_name.0)
|
||||||
|
.fetch_optional(conn)
|
||||||
|
.await?
|
||||||
|
.unwrap_or_else(|| PgMeseta(0))
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
Ok(Meseta(meseta.0 as u32))
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_trade(conn: &mut sqlx::PgConnection, char_id1: &CharacterEntityId, char_id2: &CharacterEntityId) -> Result<TradeEntity, GatewayError>
|
async fn create_trade(conn: &mut sqlx::PgConnection, char_id1: &CharacterEntityId, char_id2: &CharacterEntityId) -> Result<TradeEntity, GatewayError>
|
||||||
|
@ -1,19 +1,89 @@
|
|||||||
|
|
||||||
use libpso::packet::ship::PlayerChat;
|
use libpso::packet::ship::PlayerChat;
|
||||||
use crate::entity::gateway::EntityGateway;
|
use crate::entity::gateway::EntityGateway;
|
||||||
|
|
||||||
use crate::common::serverstate::ClientId;
|
use crate::common::serverstate::ClientId;
|
||||||
use crate::ship::ship::{ShipServerState, SendShipPacket};
|
use crate::ship::ship::{ShipServerState, SendShipPacket};
|
||||||
|
use crate::ship::client::Clients;
|
||||||
|
use crate::ship::items::state::ItemState;
|
||||||
|
use crate::entity::item::{BankName, BankIdentifier};
|
||||||
|
use crate::ship::packet::builder::message::bank_item_list;
|
||||||
|
|
||||||
|
async fn default_bank<'a, EG, T>(id: ClientId,
|
||||||
|
tokens: T,
|
||||||
|
entity_gateway: &mut EG,
|
||||||
|
clients: &Clients,
|
||||||
|
item_state: &mut ItemState)
|
||||||
|
-> Result<Vec<(ClientId, SendShipPacket)>, String>
|
||||||
|
where
|
||||||
|
EG: EntityGateway + Clone + 'static,
|
||||||
|
T: Iterator<Item = &'a str> + 'a,
|
||||||
|
{
|
||||||
|
let bank = clients
|
||||||
|
.with_mut(id, |client| {
|
||||||
|
let mut item_state = item_state.clone();
|
||||||
|
let mut entity_gateway = entity_gateway.clone();
|
||||||
|
|
||||||
|
Box::pin(async move {
|
||||||
|
item_state.load_character_bank(&mut entity_gateway, &client.character, BankIdentifier::Character).await?;
|
||||||
|
item_state.get_character_bank(&client.character).await
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.map_err(|err| format!("an error occured\n{:?}", err))?
|
||||||
|
.map_err(|err| format!("an error occured\n{:?}", err))?;
|
||||||
|
|
||||||
|
let bank_items_pkt = bank_item_list(&bank);
|
||||||
|
Ok(vec![(id, SendShipPacket::BankItemList(bank_items_pkt))])
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn switch_bank<'a, EG, T>(id: ClientId,
|
||||||
|
mut tokens: T,
|
||||||
|
entity_gateway: &mut EG,
|
||||||
|
clients: &Clients,
|
||||||
|
item_state: &mut ItemState)
|
||||||
|
-> Result<Vec<(ClientId, SendShipPacket)>, String>
|
||||||
|
where
|
||||||
|
EG: EntityGateway + Clone + 'static,
|
||||||
|
T: Iterator<Item = &'a str> + 'a,
|
||||||
|
{
|
||||||
|
let bank_name = BankName(tokens.next().unwrap_or(&"").into());
|
||||||
|
|
||||||
|
let bank = clients
|
||||||
|
.with_mut(id, |client| {
|
||||||
|
let mut item_state = item_state.clone();
|
||||||
|
let mut entity_gateway = entity_gateway.clone();
|
||||||
|
|
||||||
|
Box::pin(async move {
|
||||||
|
item_state.load_character_bank(&mut entity_gateway, &client.character, BankIdentifier::Shared(bank_name)).await?;
|
||||||
|
item_state.get_character_bank(&client.character).await
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.map_err(|err| format!("an error occured\n{:?}", err))?
|
||||||
|
.map_err(|err| format!("an error occured\n{:?}", err))?;
|
||||||
|
|
||||||
|
let bank_items_pkt = bank_item_list(&bank);
|
||||||
|
Ok(vec![(id, SendShipPacket::BankItemList(bank_items_pkt))])
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
pub async fn handle_chat_command<EG>(id: ClientId,
|
pub async fn handle_chat_command<EG>(id: ClientId,
|
||||||
message: PlayerChat,
|
message: PlayerChat,
|
||||||
state: &mut ShipServerState<EG>)
|
state: &mut ShipServerState<EG>)
|
||||||
-> Option<Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error>>
|
-> Option<Result<Vec<(ClientId, SendShipPacket)>, String>>
|
||||||
where
|
where
|
||||||
EG: EntityGateway + Clone + 'static,
|
EG: EntityGateway + Clone + 'static,
|
||||||
{
|
{
|
||||||
|
let mut tokens = message.message
|
||||||
|
.trim_start_matches("\tJ")
|
||||||
|
.trim_start_matches("\tE")
|
||||||
|
.trim_end_matches("\0")
|
||||||
|
.split_whitespace();
|
||||||
|
let cmd = tokens.next()?;
|
||||||
|
match cmd {
|
||||||
|
"/bank" => Some(default_bank(id, tokens, &mut state.entity_gateway, &state.clients, &mut state.item_state).await),
|
||||||
|
"/sbank" => Some(switch_bank(id, tokens, &mut state.entity_gateway, &state.clients, &mut state.item_state).await),
|
||||||
|
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
|
||||||
None
|
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,6 @@ pub struct ClientState {
|
|||||||
pub tek: Option<(items::ClientItemId, item::weapon::TekSpecialModifier, item::weapon::TekPercentModifier, i32)>,
|
pub tek: Option<(items::ClientItemId, item::weapon::TekSpecialModifier, item::weapon::TekPercentModifier, i32)>,
|
||||||
pub character_playtime: chrono::Duration,
|
pub character_playtime: chrono::Duration,
|
||||||
pub log_on_time: chrono::DateTime<chrono::Utc>,
|
pub log_on_time: chrono::DateTime<chrono::Utc>,
|
||||||
pub current_bank: item::BankIdentifier,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ClientState {
|
impl ClientState {
|
||||||
@ -161,7 +160,6 @@ impl ClientState {
|
|||||||
tek: None,
|
tek: None,
|
||||||
character_playtime,
|
character_playtime,
|
||||||
log_on_time: chrono::Utc::now(),
|
log_on_time: chrono::Utc::now(),
|
||||||
current_bank: item::BankIdentifier::Character,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,7 +614,8 @@ where
|
|||||||
tool,
|
tool,
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
inventory.add_item(inventory_item)?.1
|
inventory.add_item(inventory_item.clone())
|
||||||
|
.with_context(|| format!("inventory {inventory:?}\nitem {inventory_item:?}"))?.1
|
||||||
},
|
},
|
||||||
item_detail => {
|
item_detail => {
|
||||||
let item_entity = transaction.gateway().create_item(NewItemEntity {
|
let item_entity = transaction.gateway().create_item(NewItemEntity {
|
||||||
@ -631,7 +632,8 @@ where
|
|||||||
item: item_detail,
|
item: item_detail,
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
inventory.add_item(inventory_item)?.1
|
inventory.add_item(inventory_item.clone())
|
||||||
|
.with_context(|| format!("inventory {inventory:?}\nitem {inventory_item:?}"))?.1
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -291,6 +291,7 @@ pub enum SendShipPacket {
|
|||||||
CancelTrade(CancelTrade),
|
CancelTrade(CancelTrade),
|
||||||
TradeSuccessful(TradeSuccessful),
|
TradeSuccessful(TradeSuccessful),
|
||||||
LobbyEvent(LobbyEvent),
|
LobbyEvent(LobbyEvent),
|
||||||
|
LargeDialog(LargeDialog),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SendServerPacket for SendShipPacket {
|
impl SendServerPacket for SendShipPacket {
|
||||||
@ -334,6 +335,7 @@ impl SendServerPacket for SendShipPacket {
|
|||||||
SendShipPacket::CancelTrade(pkt) => pkt.as_bytes(),
|
SendShipPacket::CancelTrade(pkt) => pkt.as_bytes(),
|
||||||
SendShipPacket::TradeSuccessful(pkt) => pkt.as_bytes(),
|
SendShipPacket::TradeSuccessful(pkt) => pkt.as_bytes(),
|
||||||
SendShipPacket::LobbyEvent(pkt) => pkt.as_bytes(),
|
SendShipPacket::LobbyEvent(pkt) => pkt.as_bytes(),
|
||||||
|
SendShipPacket::LargeDialog(pkt) => pkt.as_bytes(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -496,10 +498,10 @@ impl Blocks {
|
|||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ShipServerState<EG: EntityGateway + Clone + 'static> {
|
pub struct ShipServerState<EG: EntityGateway + Clone + 'static> {
|
||||||
entity_gateway: EG,
|
pub(crate) entity_gateway: EG,
|
||||||
pub clients: Clients,
|
pub clients: Clients,
|
||||||
name: String,
|
name: String,
|
||||||
item_state: items::state::ItemState,
|
pub(crate) item_state: items::state::ItemState,
|
||||||
shops: ItemShops,
|
shops: ItemShops,
|
||||||
pub blocks: Blocks,
|
pub blocks: Blocks,
|
||||||
event: ShipEvent,
|
event: ShipEvent,
|
||||||
@ -736,7 +738,10 @@ impl<EG: EntityGateway + Clone> ServerState for ShipServerState<EG> {
|
|||||||
RecvShipPacket::PlayerChat(msg) => {
|
RecvShipPacket::PlayerChat(msg) => {
|
||||||
match chatcommand::handle_chat_command(id, msg.clone(), &mut self).await {
|
match chatcommand::handle_chat_command(id, msg.clone(), &mut self).await {
|
||||||
Some(ccmd) => {
|
Some(ccmd) => {
|
||||||
ccmd?
|
match ccmd {
|
||||||
|
Ok(pkts) => pkts,
|
||||||
|
Err(msg) => vec![(id, SendShipPacket::LargeDialog(LargeDialog::new(msg)))]
|
||||||
|
}
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user