1- import { ItemContainer } from '@engine/world/items/item-container' ;
1+ import { ContainerUpdateEvent , ItemContainer } from '@engine/world/items/item-container' ;
22import { findItem , loadConfigurationFiles , widgets } from '@engine/config/index' ;
33import { Player } from '@engine/world/actor/player/player' ;
44import { ItemDetails } from '@engine/config/item-config' ;
5+ import { WidgetClosedEvent } from '@engine/world/actor/player/interface-state' ;
6+ import { Subscription } from 'rxjs' ;
57
68
79export type ShopStock = [ [ string , number ] ] ;
@@ -18,6 +20,8 @@ export class Shop {
1820 public sellRate : number ;
1921 public buyRate : number ;
2022 public rateModifier : number ;
23+ private customers : Player [ ] ;
24+ private containerSubscription : Subscription ;
2125
2226 public constructor ( key : string , name : string , generalStore : boolean , stock : ShopStock , sellRate : number , buyRate : number , modifier : number ) {
2327 this . key = key ;
@@ -30,6 +34,8 @@ export class Shop {
3034 this . rateModifier = modifier ;
3135 this . originalStock = stock ;
3236 this . container = new ItemContainer ( 40 ) ;
37+ this . containerSubscription = this . container . containerUpdated . subscribe ( ( _update : ContainerUpdateEvent ) => this . updateCustomers ( ) ) ;
38+ this . customers = [ ] ;
3339 this . resetShopStock ( ) ;
3440 }
3541
@@ -91,6 +97,12 @@ export class Shop {
9197
9298 public open ( player : Player ) : void {
9399 player . metadata [ 'lastOpenedShop' ] = this ;
100+ player . metadata [ 'shopCloseListener' ] = player . interfaceState . closed . subscribe ( ( whatClosed : WidgetClosedEvent ) => {
101+ if ( whatClosed && whatClosed . widget && whatClosed . widget . widgetId === widgets . shop . widgetId ) {
102+ this . removePlayerFromShop ( player ) ;
103+ }
104+ } ) ;
105+
94106 player . outgoingPackets . updateWidgetString ( widgets . shop . widgetId , widgets . shop . title , this . name ) ;
95107 player . outgoingPackets . sendUpdateAllWidgetItems ( widgets . shop , this . container ) ;
96108 player . outgoingPackets . sendUpdateAllWidgetItems ( widgets . shopPlayerInventory , player . inventory ) ;
@@ -103,8 +115,26 @@ export class Shop {
103115 slot : 'tabarea' ,
104116 multi : true
105117 } ) ;
118+ this . customers . push ( player ) ;
119+ }
120+
121+ private updateCustomers ( ) {
122+ for ( const player of this . customers ) {
123+ if ( player . metadata [ 'lastOpenedShop' ] === this ) {
124+ player . outgoingPackets . sendUpdateAllWidgetItems ( widgets . shop , this . container ) ;
125+ } else {
126+ this . removePlayerFromShop ( player ) ;
127+ }
128+ }
106129 }
107130
131+ private removePlayerFromShop ( player : Player ) {
132+ if ( player . metadata [ 'lastOpenedShop' ] === this ) {
133+ player . metadata [ 'lastOpenedShop' ] = undefined ;
134+ player . metadata [ 'shopCloseListener' ] . unsubscribe ( ) ;
135+ }
136+ this . customers = this . customers . filter ( ( c ) => c !== player ) ;
137+ }
108138}
109139
110140export interface ShopConfiguration {
0 commit comments