This commit is contained in:
parent
8b4eb146ac
commit
fc5d318ac3
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -1040,7 +1040,7 @@ checksum = "739e9d7726dc32173fed2d69d17eef3c54682169e4e20ff1d0a45dcd37063cef"
|
||||
[[package]]
|
||||
name = "libpso"
|
||||
version = "0.1.0"
|
||||
source = "git+http://git.sharnoth.com/jake/libpso#e71b435ea3dde01a44abf0492bfab12236b1ec06"
|
||||
source = "git+http://git.sharnoth.com/jake/libpso#05222bbf9fe402675447bc163b45e07a327cdb1a"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"psopacket",
|
||||
@ -1399,7 +1399,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "psopacket"
|
||||
version = "1.0.0"
|
||||
source = "git+http://git.sharnoth.com/jake/libpso#e71b435ea3dde01a44abf0492bfab12236b1ec06"
|
||||
source = "git+http://git.sharnoth.com/jake/libpso#05222bbf9fe402675447bc163b45e07a327cdb1a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"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>
|
||||
{
|
||||
// this is some degen shit
|
||||
let conn = Arc::new(Mutex::new(conn.begin().await?));
|
||||
let conn = Arc::new(Mutex::new(conn.begin().await?)); // this is some degen shit
|
||||
let inventory = sqlx::query_as::<_, PgInventoryEntity>("select * from inventory where pchar = $1")
|
||||
.bind(char_id.0)
|
||||
.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>
|
||||
{
|
||||
// this is some degen shit
|
||||
let conn = Arc::new(Mutex::new(conn.begin().await?));
|
||||
let conn = Arc::new(Mutex::new(conn.begin().await?)); // this is some degen shit
|
||||
let bank = match bank_identifier {
|
||||
BankIdentifier::Character => {
|
||||
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?
|
||||
},
|
||||
BankIdentifier::Shared(bank_name) => {
|
||||
todo!();
|
||||
/*
|
||||
sqlx::query_as::<_, PgInventoryEntity>("select shared_bank.* from shared_bank
|
||||
left join player_character on shared_bank.user = player_character.user
|
||||
where player_character.id = $1 and bank.name = $2")
|
||||
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
|
||||
where player_character.id = $1 and shared_bank.name = $2")
|
||||
.bind(char_id.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 {
|
||||
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(sqlx::types::Json(bank))
|
||||
.execute(conn)
|
||||
.await?;
|
||||
},
|
||||
BankIdentifier::Shared(bank_name) => {
|
||||
// TODO!
|
||||
/*
|
||||
sqlx::query("insert into shared_bank (pchar, items) values ($1, $2) on conflict (pchar, name) do update set items = $2")
|
||||
sqlx::query("insert into shared_bank (user_account, items, name)
|
||||
select player_character.user_account, $2, $3 from player_character
|
||||
where player_character.id = $1
|
||||
on conflict (user_account, name) do update set items = $2;")
|
||||
.bind(char_id.0)
|
||||
.bind(sqlx::types::Json(bank))
|
||||
.bind(&bank_name.0)
|
||||
.execute(conn)
|
||||
.await?;
|
||||
*/
|
||||
}
|
||||
}
|
||||
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>
|
||||
{
|
||||
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(meseta.0 as i32)
|
||||
.execute(conn)
|
||||
@ -592,14 +593,22 @@ async fn set_bank_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntit
|
||||
{
|
||||
match bank_identifier {
|
||||
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(meseta.0 as i32)
|
||||
.execute(conn)
|
||||
.await?;
|
||||
},
|
||||
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)]
|
||||
struct PgMeseta(i32);
|
||||
|
||||
match bank_identifier {
|
||||
let meseta = match bank_identifier {
|
||||
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)
|
||||
.fetch_one(conn)
|
||||
.await?;
|
||||
Ok(Meseta(meseta.0 as u32))
|
||||
.await?
|
||||
},
|
||||
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>
|
||||
|
@ -1,19 +1,89 @@
|
||||
|
||||
use libpso::packet::ship::PlayerChat;
|
||||
use crate::entity::gateway::EntityGateway;
|
||||
|
||||
use crate::common::serverstate::ClientId;
|
||||
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,
|
||||
message: PlayerChat,
|
||||
state: &mut ShipServerState<EG>)
|
||||
-> Option<Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error>>
|
||||
-> Option<Result<Vec<(ClientId, SendShipPacket)>, String>>
|
||||
where
|
||||
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 character_playtime: chrono::Duration,
|
||||
pub log_on_time: chrono::DateTime<chrono::Utc>,
|
||||
pub current_bank: item::BankIdentifier,
|
||||
}
|
||||
|
||||
impl ClientState {
|
||||
@ -161,7 +160,6 @@ impl ClientState {
|
||||
tek: None,
|
||||
character_playtime,
|
||||
log_on_time: chrono::Utc::now(),
|
||||
current_bank: item::BankIdentifier::Character,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -614,7 +614,8 @@ where
|
||||
tool,
|
||||
})
|
||||
};
|
||||
inventory.add_item(inventory_item)?.1
|
||||
inventory.add_item(inventory_item.clone())
|
||||
.with_context(|| format!("inventory {inventory:?}\nitem {inventory_item:?}"))?.1
|
||||
},
|
||||
item_detail => {
|
||||
let item_entity = transaction.gateway().create_item(NewItemEntity {
|
||||
@ -631,7 +632,8 @@ where
|
||||
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),
|
||||
TradeSuccessful(TradeSuccessful),
|
||||
LobbyEvent(LobbyEvent),
|
||||
LargeDialog(LargeDialog),
|
||||
}
|
||||
|
||||
impl SendServerPacket for SendShipPacket {
|
||||
@ -334,6 +335,7 @@ impl SendServerPacket for SendShipPacket {
|
||||
SendShipPacket::CancelTrade(pkt) => pkt.as_bytes(),
|
||||
SendShipPacket::TradeSuccessful(pkt) => pkt.as_bytes(),
|
||||
SendShipPacket::LobbyEvent(pkt) => pkt.as_bytes(),
|
||||
SendShipPacket::LargeDialog(pkt) => pkt.as_bytes(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -496,10 +498,10 @@ impl Blocks {
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ShipServerState<EG: EntityGateway + Clone + 'static> {
|
||||
entity_gateway: EG,
|
||||
pub(crate) entity_gateway: EG,
|
||||
pub clients: Clients,
|
||||
name: String,
|
||||
item_state: items::state::ItemState,
|
||||
pub(crate) item_state: items::state::ItemState,
|
||||
shops: ItemShops,
|
||||
pub blocks: Blocks,
|
||||
event: ShipEvent,
|
||||
@ -736,7 +738,10 @@ impl<EG: EntityGateway + Clone> ServerState for ShipServerState<EG> {
|
||||
RecvShipPacket::PlayerChat(msg) => {
|
||||
match chatcommand::handle_chat_command(id, msg.clone(), &mut self).await {
|
||||
Some(ccmd) => {
|
||||
ccmd?
|
||||
match ccmd {
|
||||
Ok(pkts) => pkts,
|
||||
Err(msg) => vec![(id, SendShipPacket::LargeDialog(LargeDialog::new(msg)))]
|
||||
}
|
||||
},
|
||||
None => {
|
||||
let block = self.blocks.get_from_client(id, &self.clients).await?;
|
||||
|
Loading…
x
Reference in New Issue
Block a user