Skip to content

Commit 2666a3d

Browse files
authored
Merge pull request #280 from rune-js/fix/shop-sync
sync shop between connected clients
2 parents 5c551db + b3e1b94 commit 2666a3d

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

src/game-engine/config/shop-config.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { ItemContainer } from '@engine/world/items/item-container';
1+
import { ContainerUpdateEvent, ItemContainer } from '@engine/world/items/item-container';
22
import { findItem, loadConfigurationFiles, widgets } from '@engine/config/index';
33
import { Player } from '@engine/world/actor/player/player';
44
import { ItemDetails } from '@engine/config/item-config';
5+
import { WidgetClosedEvent } from '@engine/world/actor/player/interface-state';
6+
import { Subscription } from 'rxjs';
57

68

79
export 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

110140
export interface ShopConfiguration {

src/game-engine/world/actor/player/interface-state.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export class Widget {
5858

5959
}
6060

61-
interface WidgetClosedEvent {
61+
export interface WidgetClosedEvent {
6262
widget: Widget;
6363
data?: number;
6464
}
@@ -129,7 +129,6 @@ export class InterfaceState {
129129
public closeWidget(slot: GameInterfaceSlot, data?: number): void;
130130
public closeWidget(i: GameInterfaceSlot | number, data?: number): void {
131131
let widget: Widget | null;
132-
133132
if(typeof i === 'number') {
134133
widget = this.findWidget(i);
135134
} else {

src/plugins/npcs/lumbridge/shopkeeper.plugin.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import { npcInteractionActionHandler } from '@engine/world/action/npc-interactio
22
import { findShop } from '@engine/config';
33

44

5-
const action: npcInteractionActionHandler = ({ player }) =>
5+
const action: npcInteractionActionHandler = ({ player }) => {
66
findShop('rs:lumbridge_general_store')?.open(player);
77

8+
}
89
export default {
910
pluginId: 'rs:lumbridge_general_store',
1011
hooks: [

0 commit comments

Comments
 (0)