300 lines
11 KiB
Ucode
300 lines
11 KiB
Ucode
/**
|
|
* Author: dkanus
|
|
* Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
|
|
* License: GPL
|
|
* Copyright 2021-2024 Anton Tarasenko
|
|
*------------------------------------------------------------------------------
|
|
* This file is part of Acedia.
|
|
*
|
|
* Acedia is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Acedia is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Acedia. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
class ETrader extends EInterface
|
|
abstract;
|
|
|
|
//! Class, objects of which are expected to represent traders located on
|
|
//! the map.
|
|
//!
|
|
//! In classic KF game mode it would represent areas behind closed doors that
|
|
//! open during trader time and allow to purchase weapons and ammo.
|
|
|
|
/// Retrieves the location of the trader.
|
|
///
|
|
/// This location is used for distance or path calculations to the trader.
|
|
/// In case trader is represented by an area rather than a specific point,
|
|
/// this method is still supposed to return a vector representing the location
|
|
/// that "makes sense" for the trader.
|
|
public function Vector GetLocation();
|
|
|
|
/// Fetches the current case-insesitive name of the trader, which should be
|
|
/// unique post-map initialization but can be altered later using
|
|
/// [`ETrader::SetName()`].
|
|
///
|
|
/// The name is intended for admin use rather than regular players, ensuring
|
|
/// it's human-readable for configuration purposes.
|
|
public function Text GetName();
|
|
|
|
/// Changes the name of the trader to the provided [`newName`].
|
|
///
|
|
/// The change only occurs if the new name is not `none`, empty or already in
|
|
/// used by some other trader (trader names are considered case-insensitive).
|
|
public function SetName(BaseText newName);
|
|
|
|
/// Determines if the trader is currently enabled, meaning it can be opened and
|
|
/// used for trading.
|
|
///
|
|
/// A disabled trader cannot be used for trading.
|
|
/// Being marked as selected is discouraged, but remains possible.
|
|
///
|
|
/// Returns `true` if the trader is enabled, `false` otherwise.
|
|
public function bool IsEnabled();
|
|
|
|
/// Sets the trader's enabled state according to the `doEnable` parameter.
|
|
///
|
|
/// Disabling a trader automatically initiates [`ETrader::BootPlayers()`] to
|
|
/// remove players from the trader area and/or close their trading windows.
|
|
public function SetEnabled(bool doEnable);
|
|
|
|
/// Checks if the trader is set to auto-open when trading is activated.
|
|
///
|
|
/// Returns `true` if the trader will auto-open upon trading activation unless disabled, `false` otherwise.
|
|
///
|
|
/// This setting is ignored if the trader is disabled, but disabling the trader
|
|
/// does not reset this setting.
|
|
public function bool IsAutoOpen();
|
|
|
|
/// Sets the auto-open state of the trader to the specified value.
|
|
///
|
|
/// This function does not alter the enabled state of the trader but determines
|
|
/// its behavior when trading is activated.
|
|
public function SetAutoOpen(bool doAutoOpen);
|
|
|
|
/// Checks if the trader is currently open, meaning players can enter and use
|
|
/// it for buying or selling equipment.
|
|
///
|
|
/// Returns `true` if the trader is open, `false` otherwise.
|
|
public function bool IsOpen();
|
|
|
|
/// Determines if the specified `player` is currently using the trader to
|
|
/// buy items.
|
|
///
|
|
/// Returns `true` if the trader is being used by the specified player,
|
|
/// `false` otherwise.
|
|
public function bool IsUsedBy(EPlayer player);
|
|
|
|
/// Sets the open state of the trader based on the [`doOpen`] parameter.
|
|
///
|
|
/// Closing a trader does not automatically trigger [`BootPlayers()`].
|
|
public function SetOpen(bool doOpen);
|
|
|
|
/// Checks if this trader is currently selected within the trading system.
|
|
///
|
|
/// Returns `true` if this trader is selected, `false` otherwise.
|
|
public function bool IsSelected();
|
|
|
|
/// Marks this trader as selected within the trading system.
|
|
///
|
|
/// This status can influence various gameplay mechanics, particularly in user
|
|
/// interfaces where the selected trader might be highlighted or given priority.
|
|
public function Select();
|
|
|
|
/// Removes players from the trader's area.
|
|
///
|
|
/// This method closes any trading menus/sessions for the players and ensures
|
|
/// they are not trapped in the trader's area after it closes.
|
|
///
|
|
/// In the classic KF game mode, this typically teleports them just outside
|
|
/// the trading area.
|
|
public function BootPlayers();
|
|
|
|
/// Opens the trader, setting its state to open, and is guaranteed to be
|
|
/// equivalent to [`ETrader::SetOpen(true)`].
|
|
public final function Open() {
|
|
SetOpen(true);
|
|
}
|
|
|
|
/// Closes the trader, setting its state to closed, and is guaranteed to be
|
|
/// equivalent to [`ETrader::SetOpen(false)`].
|
|
public final function Close() {
|
|
SetOpen(false);
|
|
}
|
|
|
|
/// Fetches the maximum number of [`EItem`] copies a player can buy at once
|
|
/// based on the given template.
|
|
///
|
|
/// If [`target`] is `none`, it returns the maximum for the baseline case.
|
|
/// Returns 0 if the [`tradable`] is `none`.
|
|
///
|
|
/// Parameter [`allowDebt`] makes the calculation without caring whether player
|
|
/// has enough money, assuming they can pay for everything.
|
|
public function int GetMaxBuyQuantity(
|
|
BaseText tradableTemplate,
|
|
EPlayer target,
|
|
optional bool allowDebt);
|
|
|
|
/// Fetches the maximum number of [`EItem`] copies a player can sell at once
|
|
/// based on the given template.
|
|
///
|
|
/// If [`target`] is `none`, it returns the maximum for the baseline case.
|
|
/// Returns 0 if the [`tradable`] is `none`.
|
|
///
|
|
/// Parameter [`allowDebt`] makes the calculation without caring whether trader
|
|
/// has enough money, assuming they can pay for everything.
|
|
public function int GetMaxSellQuantity(
|
|
BaseText tradableTemplate,
|
|
EPlayer target,
|
|
optional bool allowDebt);
|
|
|
|
/// Calculates the money a player would receive for selling
|
|
/// a given [`EItem`].
|
|
///
|
|
/// The price may vary per player.
|
|
/// If [`target`] is `none`, it returns the baseline price.
|
|
/// Returns 0 if the [`tradable`] is `none`.
|
|
public function int GetSellPrice(EItem tradable, optional EPlayer target);
|
|
|
|
/// Determines the cost for a player to buy a given [`EItem`].
|
|
///
|
|
/// The cost may vary per player.
|
|
/// If [`target`] is `none`, it returns the baseline price.
|
|
/// Returns 0 if the [`tradable`] is `none`.
|
|
public function int GetBuyPrice(EItem tradable, optional EPlayer target);
|
|
|
|
/// Calculates the cost for a player to buy an [`EItem`] based on
|
|
/// the given template.
|
|
///
|
|
/// The cost may vary per player.
|
|
/// If [`target`] is `none`, it returns the baseline price.
|
|
/// Returns 0 if the [`tradableTemplate`] is `none`.
|
|
public function int GetTemplateBuyPrice(BaseText tradableTemplate, optional EPlayer target);
|
|
|
|
/// Attempts to buy an item with a given [`EItem`] template for
|
|
/// a specified player.
|
|
///
|
|
/// The transaction may allow the player to go into debt if specified.
|
|
/// Returns `true` on success and `false` if the player lacks sufficient funds
|
|
/// or if other conditions are not met.
|
|
public function bool BuyTemplate(
|
|
BaseText tradableTemplate,
|
|
EPlayer target,
|
|
optional bool allowDebt
|
|
);
|
|
|
|
/// Checks whether a player can buy a tradable based on a template.
|
|
///
|
|
/// This function checks various conditions like financial status and returns
|
|
/// `true` if the tradable cannot be bought, otherwise returns `false`.
|
|
public final function bool CanBuyTemplate(
|
|
BaseText tradableTemplate,
|
|
EPlayer target,
|
|
optional bool allowDebt
|
|
) {
|
|
local bool success;
|
|
local AcediaError explanation;
|
|
|
|
explanation = CanBuyTemplateExplain(tradableTemplate, target, allowDebt);
|
|
success = (explanation == none);
|
|
_.memory.Free(explanation);
|
|
return success;
|
|
}
|
|
|
|
/// Provides a detailed explanation if a player cannot buy a tradable based on
|
|
/// a template.
|
|
///
|
|
/// This function checks various conditions like financial status and returns
|
|
/// an error object describing the issue if the tradable cannot be bought,
|
|
/// otherwise returns `none`.
|
|
public function AcediaError CanBuyTemplateExplain(
|
|
BaseText tradable,
|
|
EPlayer target,
|
|
optional bool allowDebt
|
|
);
|
|
|
|
/// Attempts to buy a specified [`EItem`] for a player.
|
|
///
|
|
/// The transaction may allow the player to go into debt if [`allowDebt`] flag
|
|
/// is set to `true`.
|
|
///
|
|
/// Returns `true` on success and `false` if the player lacks sufficient funds
|
|
/// or if other conditions are not met.
|
|
public function bool CanBuy(EItem tradable, EPlayer target, optional bool allowDebt);
|
|
|
|
/// Tries to buy given [`EItem`] for a provided [`EPlayer`].
|
|
///
|
|
/// Fails when [`EPlayer`] doesn't have enough money available, unless
|
|
/// [`allowDebt`] is set to `true`.
|
|
/// What money can be used for the purchase is decided by implementation.
|
|
///
|
|
/// Returns `true` on success and `false` on failure.
|
|
public function bool Buy(EItem tradable, EPlayer target, optional bool allowDebt);
|
|
|
|
/// Provides a detailed explanation if a player cannot buy a specific
|
|
/// [`EItem`].
|
|
///
|
|
/// The transaction may allow the player to go into debt if [`allowDebt`] flag
|
|
/// is set to `true`.
|
|
///
|
|
/// This function checks various conditions like financial status and returns
|
|
/// an error object describing the issue if the tradable cannot be bought,
|
|
/// otherwise returns `none`.
|
|
public function bool CanBuyExplain(
|
|
EItem tradable,
|
|
EPlayer target,
|
|
optional bool allowDebt
|
|
);
|
|
|
|
/// Checks if a player can sell a specific [`EItem`].
|
|
///
|
|
/// The transaction may allow the trader to go into debt if [`allowDebt`] flag
|
|
/// is set to `true`.
|
|
///
|
|
/// Returns `true` if the sale is possible, `false` otherwise.
|
|
public final function bool CanSell(EItem tradable, EPlayer target, optional bool allowDebt) {
|
|
local bool success;
|
|
local AcediaError explanation;
|
|
|
|
explanation = CanSellExplain(tradable, target, allowDebt);
|
|
success = (explanation == none);
|
|
_.memory.Free(explanation);
|
|
return success;
|
|
}
|
|
|
|
/// Provides a detailed explanation if a player cannot sell a specific
|
|
/// [`EItem`].
|
|
///
|
|
/// The transaction may allow the trader to go into debt if [`allowDebt`] flag
|
|
/// is set to `true`.
|
|
///
|
|
/// This function checks various conditions like financial status and returns
|
|
/// an error object describing the issue if the tradable cannot be sold,
|
|
/// otherwise returns `none`.
|
|
public function AcediaError CanSellExplain(
|
|
EItem tradable,
|
|
EPlayer target,
|
|
optional bool allowDebt
|
|
);
|
|
|
|
/// Tries to sell given [`EItem`] as a provided [`EPlayer`].
|
|
///
|
|
/// Fails when trader doesn't have enough money available, unless
|
|
/// [`allowDebt`] is set to `true`.
|
|
/// What money can be used for the purchase is decided by implementation.
|
|
///
|
|
/// Returns `true` on success and `false` on failure.
|
|
public function bool Sell(EItem tradable, EPlayer target, optional bool allowDebt);
|
|
|
|
/// Opens a menu for buying/selling inside the caller [`ETrader`].
|
|
public function bool OpenTradeMenu();
|
|
|
|
defaultproperties {
|
|
} |