Compare commits

..

No commits in common. "3a3aafc29610e0d2594d3657cb697ec6fda6387d" and "3e6aea5668bf87b94c16291c387c2fa676d7544a" have entirely different histories.

View File

@ -17,7 +17,6 @@ use veloren_common::{
comp::{
invite::InviteKind,
item::{ItemDefinitionId, ItemDesc, ItemI18n, MaterialStatManifest},
slot::EquipSlot,
tool::AbilityMap,
ChatType, ControllerInputs, Item, Ori, Pos,
},
@ -40,6 +39,13 @@ const TRADE_ACTION_DELAY: Duration = Duration::from_millis(300);
const ACCOUNCEMENT_DELAY: Duration = Duration::from_mins(45);
const OUCH_DELAY: Duration = Duration::from_secs(2);
/// TODO: Implement Display
#[derive(Debug)]
pub struct Reciept {
pub my_items: HashMap<String, u32>,
pub their_items: HashMap<String, u32>,
}
/// An active connection to the Veloren server that will attempt to run every time the `tick`
/// function is called.
///
@ -518,8 +524,6 @@ impl Bot {
/// 6. If the total value of my offer is greater than the total value of their offer:
/// 1. If I am offering coins, remove them to balance.
/// 2. If I am not offering coins, add theirs to balance.
/// 7. If the trade is still unbalanced, tell them the value of the greater offer and the
/// other party's total coin amount.
///
/// See the inline comments for more details.
#[allow(clippy::comparison_chain)]
@ -528,7 +532,6 @@ impl Bot {
return Ok(());
}
let phase = trade.phase;
let my_offer_index = trade
.which_party(self.client.uid().ok_or("Failed to get uid")?)
.ok_or("Failed to get offer index")?;
@ -539,11 +542,6 @@ impl Bot {
&trade.offers[their_offer_index],
)
};
let their_uid = trade.parties[their_offer_index];
let their_name = self
.find_player_alias(&their_uid)
.ok_or("Failed to find player name")?
.clone();
let inventories = self.client.inventories();
let me = self.client.entity();
@ -561,16 +559,6 @@ impl Bot {
let coins_owned = COINS.to_owned();
let get_my_coins = my_inventory.get_slot_of_item_by_def_id(&coins_owned);
let get_their_coins = their_inventory.get_slot_of_item_by_def_id(&coins_owned);
let my_coin_amount = if let Some(coins) = get_my_coins {
my_inventory.get(coins).unwrap().amount()
} else {
0
};
let their_coin_amount = if let Some(coins) = get_their_coins {
their_inventory.get(coins).unwrap().amount()
} else {
0
};
let mut receipt = Reciept {
my_items: HashMap::new(),
their_items: HashMap::new(),
@ -676,6 +664,8 @@ impl Bot {
drop(inventories);
let phase = trade.phase;
// If the trade hasn't changed, do nothing to avoid spamming the server.
if let Some(previous) = &self.previous_trade {
if previous == &trade {
@ -687,8 +677,6 @@ impl Bot {
// offer now. The trade action is infallible from here.
self.previous_trade = Some(trade);
log::info!("Performing trade action with {their_name}");
// Before running any actual trade logic, remove items that are not for sale or not being
// purchased. End this trade action if an item was removed.
@ -716,7 +704,8 @@ impl Bot {
// The if/else statements below implement the bot's main feature: buying, selling and
// trading items according to the values set in the configuration file. Coins are used to
// balance the value of the trade.
// balance the value of the trade. In the case that we try to add more coins than are
// available, the server will correct it by adding all of the available coins.
// If the trade is balanced
if difference == 0 {
@ -724,88 +713,48 @@ impl Bot {
// Accept
self.client.perform_trade_action(TradeAction::Accept(phase));
return Ok(());
// If they are offering more
// If they are offering more
} else if difference > 0 {
// If they are offering coins
if their_offered_coin_amount > 0 {
if let Some(their_coins) = get_their_coins {
if their_coin_amount >= difference as u32 {
// Remove their coins to balance
self.client.perform_trade_action(TradeAction::RemoveItem {
item: their_coins,
quantity: difference as u32,
ours: false,
});
return Ok(());
}
// Remove their coins to balance
self.client.perform_trade_action(TradeAction::RemoveItem {
item: their_coins,
quantity: difference as u32,
ours: false,
});
}
// If they are not offering coins
} else if let Some(my_coins) = get_my_coins {
if my_coin_amount >= difference as u32 {
// Add my coins to balanace
self.client.perform_trade_action(TradeAction::AddItem {
item: my_coins,
quantity: difference as u32,
ours: true,
});
return Ok(());
}
// Add my coins to balanace
self.client.perform_trade_action(TradeAction::AddItem {
item: my_coins,
quantity: difference as u32,
ours: true,
});
}
self.client.send_command(
"tell".to_string(),
vec![
their_name,
format!(
"The value of your offer is {their_offered_items_value} coins. I only have {my_coin_amount} coins.",
),
],
);
// If I am offering more
} else if difference < 0 {
// If I am offering coins
if my_offered_coin_amount > 0 {
if let Some(my_coins) = get_my_coins {
if my_coin_amount >= difference.unsigned_abs() {
// Remove my coins to balance
self.client.perform_trade_action(TradeAction::RemoveItem {
item: my_coins,
quantity: difference.unsigned_abs(),
ours: true,
});
return Ok(());
}
// Remove my coins to balance
self.client.perform_trade_action(TradeAction::RemoveItem {
item: my_coins,
quantity: difference.unsigned_abs(),
ours: true,
});
}
// If I am not offering coins
} else if let Some(their_coins) = get_their_coins {
if their_coin_amount >= difference.unsigned_abs() {
// Add their coins to balance
self.client.perform_trade_action(TradeAction::AddItem {
item: their_coins,
quantity: difference.unsigned_abs(),
ours: false,
});
return Ok(());
}
// Add their coins to balance
self.client.perform_trade_action(TradeAction::AddItem {
item: their_coins,
quantity: difference.unsigned_abs(),
ours: false,
});
}
let their_name = self.find_player_alias(&their_uid).unwrap().clone();
self.client.send_command(
"tell".to_string(),
vec![
their_name,
format!(
"The value of my offer is {my_offered_items_value} coins. You only have {their_coin_amount} coins.",
),
],
);
}
Ok(())
@ -1006,12 +955,6 @@ impl Bot {
}
}
#[derive(Debug)]
pub struct Reciept {
pub my_items: HashMap<String, u32>,
pub their_items: HashMap<String, u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum TradeMode {
AdminAccess,