0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Improved accuracy of flea offer creation

`user` object of each offer matches live
Added `getPmcNicknameOfMaxLength()` to `botHelper`
This commit is contained in:
Dev 2024-05-22 13:26:35 +01:00
parent 961210f73c
commit 4081508bf3
4 changed files with 68 additions and 85 deletions

View File

@ -1,14 +1,16 @@
import { inject, injectable } from "tsyringe";
import { RagfairAssortGenerator } from "@spt/generators/RagfairAssortGenerator";
import { BotHelper } from "@spt/helpers/BotHelper";
import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PaymentHelper } from "@spt/helpers/PaymentHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { RagfairServerHelper } from "@spt/helpers/RagfairServerHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IBarterScheme } from "@spt/models/eft/common/tables/ITrader";
import { IRagfairOffer, OfferRequirement } from "@spt/models/eft/ragfair/IRagfairOffer";
import { IRagfairOffer, IRagfairOfferUser, OfferRequirement } from "@spt/models/eft/ragfair/IRagfairOffer";
import { BaseClasses } from "@spt/models/enums/BaseClasses";
import { ConfigTypes } from "@spt/models/enums/ConfigTypes";
import { MemberCategory } from "@spt/models/enums/MemberCategory";
@ -48,7 +50,9 @@ export class RagfairOfferGenerator
@inject("TimeUtil") protected timeUtil: TimeUtil,
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
@inject("RagfairServerHelper") protected ragfairServerHelper: RagfairServerHelper,
@inject("ProfileHelper") protected profileHelper: ProfileHelper,
@inject("HandbookHelper") protected handbookHelper: HandbookHelper,
@inject("BotHelper") protected botHelper: BotHelper,
@inject("SaveServer") protected saveServer: SaveServer,
@inject("PresetHelper") protected presetHelper: PresetHelper,
@inject("RagfairAssortGenerator") protected ragfairAssortGenerator: RagfairAssortGenerator,
@ -135,22 +139,13 @@ export class RagfairOfferGenerator
}
}
const itemCount = items.filter((x) => x.slotId === "hideout").length;
const itemRootCount = items.filter((item) => item.slotId === "hideout").length;
const roublePrice = Math.round(this.convertOfferRequirementsIntoRoubles(offerRequirements));
const offer: IRagfairOffer = {
_id: this.hashUtil.generate(),
intId: this.offerCounter,
user: {
id: this.getTraderId(userID),
memberType:
userID === "ragfair" ? MemberCategory.DEFAULT : this.ragfairServerHelper.getMemberType(userID),
nickname: this.ragfairServerHelper.getNickname(userID),
rating: this.getRating(userID),
isRatingGrowing: this.getRatingGrowing(userID),
avatar: this.getAvatarUrl(isTrader, userID),
aid: this.ragfairServerHelper.getUserAid(userID),
},
user: this.createUserDataForFleaOffer(userID, isTrader),
root: items[0]._id,
items: itemsClone,
itemsCost: Math.round(this.handbookHelper.getTemplatePrice(items[0]._tpl)), // Handbook price
@ -165,7 +160,7 @@ export class RagfairOfferGenerator
locked: false,
unlimitedCount: false,
notAvailable: false,
CurrentItemCount: itemCount,
CurrentItemCount: itemRootCount,
};
this.offerCounter++;
@ -173,6 +168,52 @@ export class RagfairOfferGenerator
return offer;
}
/**
* Create the user object stored inside each flea offer object
* @param userID user creating the offer
* @param isTrader Is the user creating the offer a trader
* @returns IRagfairOfferUser
*/
createUserDataForFleaOffer(userID: string, isTrader: boolean): IRagfairOfferUser
{
// Trader offer
if (isTrader)
{
return {
id: userID,
memberType: MemberCategory.TRADER,
};
}
const isPlayerOffer = this.ragfairServerHelper.isPlayer(userID);
if (isPlayerOffer)
{
const playerProfile = this.profileHelper.getPmcProfile(userID);
return {
id: playerProfile._id,
memberType: MemberCategory.DEFAULT,
nickname: playerProfile.Info.Nickname,
rating: playerProfile.RagfairInfo.rating,
isRatingGrowing: playerProfile.RagfairInfo.isRatingGrowing,
avatar: null,
aid: playerProfile.aid,
};
}
// Regular old fake pmc offer
return {
id: userID,
memberType: MemberCategory.DEFAULT,
nickname: this.botHelper.getPmcNicknameOfMaxLength(userID, 50),
rating: this.randomUtil.getFloat(
this.ragfairConfig.dynamic.rating.min,
this.ragfairConfig.dynamic.rating.max),
isRatingGrowing: this.randomUtil.getBool(),
avatar: null,
aid: this.hashUtil.generateAccountId(),
};
}
/**
* Calculate the offer price that's listed on the flea listing
* @param offerRequirements barter requirements for offer

View File

@ -7,7 +7,6 @@ import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseServer } from "@spt/servers/DatabaseServer";
import { LocalisationService } from "@spt/services/LocalisationService";
import { RandomUtil } from "@spt/utils/RandomUtil";
@injectable()
@ -20,7 +19,6 @@ export class BotHelper
@inject("WinstonLogger") protected logger: ILogger,
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
@inject("RandomUtil") protected randomUtil: RandomUtil,
@inject("LocalisationService") protected localisationService: LocalisationService,
@inject("ConfigServer") protected configServer: ConfigServer,
)
{
@ -247,4 +245,15 @@ export class BotHelper
{
return this.randomUtil.getChance100(this.pmcConfig.isUsec) ? "Usec" : "Bear";
}
public getPmcNicknameOfMaxLength(userId: string, maxLength: number): string
{
// recurivse if name is longer than max characters allowed (15 characters)
const randomType = this.randomUtil.getInt(0, 1) === 0 ? "usec" : "bear";
const name
= this.randomUtil.getStringArrayValue(this.databaseServer.getTables().bots.types[randomType].firstName);
return name.length > maxLength
? this.getPmcNicknameOfMaxLength(userId, maxLength)
: name;
}
}

View File

@ -1,4 +1,5 @@
import { inject, injectable } from "tsyringe";
import { BotHelper } from "@spt/helpers/BotHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PaymentHelper } from "@spt/helpers/PaymentHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
@ -51,6 +52,7 @@ export class RagfairOfferHelper
@inject("TraderHelper") protected traderHelper: TraderHelper,
@inject("SaveServer") protected saveServer: SaveServer,
@inject("ItemHelper") protected itemHelper: ItemHelper,
@inject("BotHelper") protected botHelper: BotHelper,
@inject("PaymentHelper") protected paymentHelper: PaymentHelper,
@inject("PresetHelper") protected presetHelper: PresetHelper,
@inject("ProfileHelper") protected profileHelper: ProfileHelper,
@ -538,7 +540,7 @@ export class RagfairOfferHelper
// Used to replace tokens in sold message sent to player
const tplVars: ISystemData = {
soldItem: globalLocales[`${itemTpl} Name`] || itemTpl,
buyerNickname: this.ragfairServerHelper.getNickname(this.hashUtil.generate()),
buyerNickname: this.botHelper.getPmcNicknameOfMaxLength(this.hashUtil.generate(), 50),
itemCount: boughtAmount,
};

View File

@ -1,5 +1,4 @@
import { inject, injectable } from "tsyringe";
import { DialogueHelper } from "@spt/helpers/DialogueHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
@ -7,7 +6,6 @@ import { Item } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { BaseClasses } from "@spt/models/enums/BaseClasses";
import { ConfigTypes } from "@spt/models/enums/ConfigTypes";
import { MemberCategory } from "@spt/models/enums/MemberCategory";
import { MessageType } from "@spt/models/enums/MessageType";
import { Traders } from "@spt/models/enums/Traders";
import { IQuestConfig } from "@spt/models/spt/config/IQuestConfig";
@ -17,10 +15,8 @@ import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseServer } from "@spt/servers/DatabaseServer";
import { SaveServer } from "@spt/servers/SaveServer";
import { ItemFilterService } from "@spt/services/ItemFilterService";
import { LocaleService } from "@spt/services/LocaleService";
import { MailSendService } from "@spt/services/MailSendService";
import { ICloner } from "@spt/utils/cloners/ICloner";
import { HashUtil } from "@spt/utils/HashUtil";
import { RandomUtil } from "@spt/utils/RandomUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
@ -37,14 +33,11 @@ export class RagfairServerHelper
constructor(
@inject("WinstonLogger") protected logger: ILogger,
@inject("RandomUtil") protected randomUtil: RandomUtil,
@inject("HashUtil") protected hashUtil: HashUtil,
@inject("TimeUtil") protected timeUtil: TimeUtil,
@inject("SaveServer") protected saveServer: SaveServer,
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
@inject("ProfileHelper") protected profileHelper: ProfileHelper,
@inject("ItemHelper") protected itemHelper: ItemHelper,
@inject("LocaleService") protected localeService: LocaleService,
@inject("DialogueHelper") protected dialogueHelper: DialogueHelper,
@inject("TraderHelper") protected traderHelper: TraderHelper,
@inject("MailSendService") protected mailSendService: MailSendService,
@inject("ItemFilterService") protected itemFilterService: ItemFilterService,
@ -241,68 +234,6 @@ export class RagfairServerHelper
return bias[Math.floor(Math.random() * bias.length)];
}
public getMemberType(userID: string): MemberCategory
{
if (this.isPlayer(userID))
{
// Player offer
return this.saveServer.getProfile(userID).characters.pmc.Info.AccountType;
}
if (this.isTrader(userID))
{
// trader offer
return MemberCategory.TRADER;
}
// generated PMC offer
return MemberCategory.DEFAULT;
}
public getUserAid(userID: string): number
{
if (this.isPlayer(userID))
{
// Player offer
return this.saveServer.getProfile(userID).characters.pmc.aid;
}
if (this.isTrader(userID))
{
// trader offer
return undefined;
}
// Generated PMC offer
return this.hashUtil.generateAccountId();
}
/**
* Get a player or traders nickname from their profile by their user id
* @param userID Sessionid/userid
* @returns Nickname of individual
*/
public getNickname(userID: string): string
{
if (this.isPlayer(userID))
{
// player offer
return this.saveServer.getProfile(userID).characters.pmc.Info.Nickname;
}
if (this.isTrader(userID))
{
// trader offer
return this.databaseServer.getTables().traders[userID].base.nickname;
}
// generated offer
// recurivse if name is longer than max characters allowed (15 characters)
const type = this.randomUtil.getInt(0, 1) === 0 ? "usec" : "bear";
const name = this.randomUtil.getStringArrayValue(this.databaseServer.getTables().bots.types[type].firstName);
return name.length > 15 ? this.getNickname(userID) : name;
}
/**
* Given a preset id from globals.json, return an array of items[] with unique ids
* @param item Preset item