Skip to content

Commit ab72d0e

Browse files
Merge pull request #175 from Promises/banking
Banking
2 parents 897c506 + 09ae510 commit ab72d0e

File tree

7 files changed

+108
-20
lines changed

7 files changed

+108
-20
lines changed

src/net/incoming-packets/item-swap-packet.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { incomingPacket } from '../incoming-packet';
22
import { Player } from '../../world/actor/player/player';
3-
import { swapItemAction } from '../../world/actor/player/action/swap-item-action';
3+
import { insertItemAction, swapItemAction } from '../../world/actor/player/action/swap-item-action';
44
import { ByteBuffer } from '@runejs/byte-buffer';
55

66
export const itemSwapPacket: incomingPacket = (player: Player, packetId: number, packetSize: number, packet: ByteBuffer): void => {
@@ -18,6 +18,6 @@ export const itemSwapPacket: incomingPacket = (player: Player, packetId: number,
1818
// Swap
1919
swapItemAction(player, fromSlot, toSlot, { widgetId, containerId });
2020
} else if(swapType === 1) {
21-
// @TODO insert
21+
insertItemAction(player, fromSlot, toSlot, { widgetId, containerId });
2222
}
2323
};

src/plugins/objects/bank/bank-booth-plugin.ts renamed to src/plugins/objects/bank/bank-plugin.ts

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
import { ActionType, RunePlugin } from '@server/plugins/plugin';
22
import { objectIds } from '@server/world/config/object-ids';
3-
import { widgets } from '@server/world/config/widget';
3+
import { widgets, widgetScripts } from '@server/world/config/widget';
44
import { objectAction } from '@server/world/actor/player/action/object-action';
55
import { ItemContainer } from '@server/world/items/item-container';
66
import { itemAction } from '@server/world/actor/player/action/item-action';
7-
import { Item } from '@server/world/items/item';
8-
7+
import { fromNote, Item, toNote } from '@server/world/items/item';
8+
import { buttonAction } from '@server/world/actor/player/action/button-action';
9+
import { logger } from '@runejs/logger/dist/logger';
10+
import { hasValueNotNull } from '@server/util/data';
11+
12+
const buttonIds: number[] = [
13+
92, // as note
14+
93, // as item
15+
98, // swap
16+
99, // insert
17+
];
918

1019
export const openBankInterface: objectAction = (details) => {
1120
details.player.activeWidget = {
@@ -17,9 +26,8 @@ export const openBankInterface: objectAction = (details) => {
1726

1827
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
1928
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank);
20-
details.player.outgoingPackets.updateClientConfig(304, details.player.sessionMetadata['bankRearrangeMode'] === 'insert' ? 1 : 0);
21-
details.player.outgoingPackets.updateClientConfig(115, details.player.sessionMetadata['bankWithdrawAs'] === 'note' ? 1 : 0);
22-
29+
details.player.outgoingPackets.updateClientConfig(widgetScripts.bankInsertMode, details.player.settings.bankInsertMode);
30+
details.player.outgoingPackets.updateClientConfig(widgetScripts.bankWithdrawNoteMode, details.player.settings.bankWithdrawNoteMode);
2331
};
2432

2533
export const depositItem: itemAction = (details) => {
@@ -31,17 +39,26 @@ export const depositItem: itemAction = (details) => {
3139
}
3240

3341
// Check if the player has the item
42+
3443
if (!details.player.hasItemInInventory(details.itemId)) {
3544
return;
3645
}
3746

47+
48+
let itemIdToAdd: number = details.itemId;
49+
const fromNoteId: number = fromNote(details.itemId);
50+
if (fromNoteId > -1) {
51+
itemIdToAdd = fromNoteId;
52+
}
53+
3854
let countToRemove: number;
3955
if (details.option.endsWith('all')) {
4056
countToRemove = -1;
4157
} else {
4258
countToRemove = +details.option.replace('deposit-', '');
4359
}
4460

61+
4562
const playerInventory: ItemContainer = details.player.inventory;
4663
const playerBank: ItemContainer = details.player.bank;
4764
const slotsWithItem: number[] = playerInventory.findAll(details.itemId);
@@ -51,13 +68,13 @@ export const depositItem: itemAction = (details) => {
5168
countToRemove = itemAmount;
5269
}
5370

54-
if (!playerBank.canFit({itemId: details.itemId, amount: countToRemove}, true)) {
71+
if (!playerBank.canFit({itemId: itemIdToAdd, amount: countToRemove}, true)) {
5572
details.player.sendMessage('Your bank is full.');
5673
return;
5774
}
5875

5976

60-
const itemToAdd: Item = {itemId: details.itemId, amount: 0};
77+
const itemToAdd: Item = {itemId: itemIdToAdd, amount: 0};
6178
while (countToRemove > 0 && playerInventory.has(details.itemId)) {
6279
const invIndex = playerInventory.findIndex(details.itemId);
6380
const invItem = playerInventory.items[invIndex];
@@ -71,6 +88,7 @@ export const depositItem: itemAction = (details) => {
7188
countToRemove = 0;
7289
}
7390
}
91+
7492
playerBank.addStacking(itemToAdd);
7593

7694

@@ -91,6 +109,18 @@ export const withdrawItem: itemAction = (details) => {
91109
if (!details.player.hasItemInBank(details.itemId)) {
92110
return;
93111
}
112+
113+
let itemIdToAdd: number = details.itemId;
114+
if (details.player.settings.bankWithdrawNoteMode) {
115+
const toNoteId: number = toNote(details.itemId);
116+
if (toNoteId > -1) {
117+
itemIdToAdd = toNoteId;
118+
} else {
119+
details.player.sendMessage('This item can not be withdrawn as a note.');
120+
}
121+
}
122+
123+
94124
let countToRemove: number;
95125
if (details.option.endsWith('all')) {
96126
countToRemove = -1;
@@ -112,14 +142,13 @@ export const withdrawItem: itemAction = (details) => {
112142
countToRemove = slots;
113143
}
114144
}
115-
116-
if (!playerInventory.canFit({itemId: details.itemId, amount: countToRemove})) {
145+
if (!playerInventory.canFit({itemId: itemIdToAdd, amount: countToRemove}) || countToRemove === 0) {
117146
details.player.sendMessage('Your inventory is full.');
118147
return;
119148
}
120149

121150

122-
const itemToAdd: Item = {itemId: details.itemId, amount: 0};
151+
const itemToAdd: Item = {itemId: itemIdToAdd, amount: 0};
123152
while (countToRemove > 0 && playerBank.has(details.itemId)) {
124153
const invIndex = playerBank.findIndex(details.itemId);
125154
const invItem = playerBank.items[invIndex];
@@ -133,14 +162,34 @@ export const withdrawItem: itemAction = (details) => {
133162
countToRemove = 0;
134163
}
135164
}
136-
playerInventory.addStacking(itemToAdd);
165+
for (let i = 0; i < itemToAdd.amount; i++) {
166+
playerInventory.add({itemId: itemIdToAdd, amount: 1});
167+
}
137168

138169

139170
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
140171
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory);
141172
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank);
142173
};
143174

175+
export const btnAction: buttonAction = (details) => {
176+
const {player, buttonId} = details;
177+
player.settingChanged(buttonId);
178+
179+
const settingsMappings = {
180+
92: {setting: 'bankWithdrawNoteMode', value: 1},
181+
93: {setting: 'bankWithdrawNoteMode', value: 0},
182+
98: {setting: 'bankInsertMode', value: 0},
183+
99: {setting: 'bankInsertMode', value: 1},
184+
};
185+
if (!settingsMappings.hasOwnProperty(buttonId)) {
186+
return;
187+
}
188+
189+
const config = settingsMappings[buttonId];
190+
player.settings[config.setting] = config.value;
191+
};
192+
144193

145194
export default new RunePlugin([{
146195
type: ActionType.OBJECT_ACTION,
@@ -158,4 +207,4 @@ export default new RunePlugin([{
158207
widgets: widgets.bank.screenWidget,
159208
options: ['withdraw-1', 'withdraw-5', 'withdraw-10', 'withdraw-all'],
160209
action: withdrawItem,
161-
}]);
210+
}, {type: ActionType.BUTTON, widgetId: widgets.bank.screenWidget.widgetId, buttonIds: buttonIds, action: btnAction}]);

src/plugins/player/login-update-settings-plugin.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const action: playerInitAction = (details) => {
2121
player.outgoingPackets.updateClientConfig(widgetScripts.autoRetaliate, settings.autoRetaliateEnabled ? 0 : 1);
2222
player.outgoingPackets.updateClientConfig(widgetScripts.attackStyle, settings.attackStyle);
2323
player.outgoingPackets.updateClientConfig(widgetScripts.bankInsertMode, settings.bankInsertMode);
24+
player.outgoingPackets.updateClientConfig(widgetScripts.bankWithdrawNoteMode, settings.bankWithdrawNoteMode);
2425
};
2526

2627
export default new RunePlugin({ type: ActionType.PLAYER_INIT, action });
Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,56 @@
11
import { Player } from '../player';
22
import { widgets } from '../../../config/widget';
3+
import { logger } from '@runejs/logger/dist/logger';
34

45
export const swapItemAction = (player: Player, fromSlot: number, toSlot: number, widget: { widgetId: number, containerId: number }) => {
5-
if(widget.widgetId === widgets.inventory.widgetId && widget.containerId === widgets.inventory.containerId) {
6+
if (widget.widgetId === widgets.inventory.widgetId && widget.containerId === widgets.inventory.containerId) {
67
const inventory = player.inventory;
78

8-
if(toSlot > inventory.size - 1 || fromSlot > inventory.size - 1) {
9+
if (toSlot > inventory.size - 1 || fromSlot > inventory.size - 1) {
910
return;
1011
}
1112

1213
inventory.swap(fromSlot, toSlot);
1314
}
14-
if(widget.widgetId === widgets.bank.screenWidget.widgetId && widget.containerId === widgets.bank.screenWidget.containerId) {
15+
if (widget.widgetId === widgets.bank.screenWidget.widgetId && widget.containerId === widgets.bank.screenWidget.containerId) {
1516
const bank = player.bank;
1617

17-
if(toSlot > bank.size - 1 || fromSlot > bank.size - 1) {
18+
if (toSlot > bank.size - 1 || fromSlot > bank.size - 1) {
1819
return;
1920
}
2021

2122
bank.swap(fromSlot, toSlot);
2223
}
2324
};
25+
26+
27+
export const insertItemAction = (player: Player, fromSlot: number, toSlot: number, widget: { widgetId: number, containerId: number }) => {
28+
if (widget.widgetId === widgets.bank.screenWidget.widgetId && widget.containerId === widgets.bank.screenWidget.containerId) {
29+
const bank = player.bank;
30+
31+
if (toSlot > bank.size - 1 || fromSlot > bank.size - 1) {
32+
return;
33+
}
34+
if (fromSlot < toSlot) {
35+
let slot = toSlot;
36+
let current = bank.remove(fromSlot);
37+
while (slot >= fromSlot) {
38+
const temp = bank.remove(slot);
39+
bank.set(slot, current);
40+
current = temp;
41+
slot--;
42+
}
43+
} else {
44+
let slot = toSlot;
45+
let current = bank.remove(fromSlot);
46+
while (slot <= fromSlot) {
47+
const temp = bank.remove(slot);
48+
bank.set(slot, current);
49+
current = temp;
50+
slot++;
51+
}
52+
}
53+
player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, player.bank);
54+
55+
}
56+
};

src/world/actor/player/player-data.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class PlayerSettings {
4242
autoRetaliateEnabled: boolean = true;
4343
attackStyle: number = 0;
4444
bankInsertMode: number = 0;
45+
bankWithdrawNoteMode: number = 0;
4546
}
4647

4748
export interface PlayerSave {

src/world/config/widget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export const widgetScripts = {
8686
runMode: 173,
8787
splitPrivateChat: 287,
8888
bankInsertMode: 304,
89+
bankWithdrawNoteMode: 115,
8990
acceptAid: 427,
9091
areaEffectVolume: 872,
9192
questPoints: 101

src/world/items/item-container.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,15 @@ export class ItemContainer {
196196
return slot;
197197
}
198198

199-
public remove(slot: number, fireEvent: boolean = true): void {
199+
public remove(slot: number, fireEvent: boolean = true): Item {
200+
const item = this._items[slot];
200201
this._items[slot] = null;
201202

202203
if (fireEvent) {
203204
this._containerUpdated.next({type: 'REMOVE', slot});
204205
}
206+
return item;
207+
205208
}
206209

207210
public getFirstOpenSlot(): number {

0 commit comments

Comments
 (0)