Skip to content

Commit fcecb92

Browse files
Merge pull request #168 from Promises/woodcutting
BANKING! and some small changes to harvestables
2 parents d381369 + fb60e35 commit fcecb92

File tree

12 files changed

+329
-81
lines changed

12 files changed

+329
-81
lines changed

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

Lines changed: 126 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,146 @@ import { ActionType, RunePlugin } from '@server/plugins/plugin';
22
import { objectIds } from '@server/world/config/object-ids';
33
import { widgets } from '@server/world/config/widget';
44
import { objectAction } from '@server/world/actor/player/action/object-action';
5+
import { ItemContainer } from '@server/world/items/item-container';
6+
import { itemAction } from '@server/world/actor/player/action/item-action';
7+
import { Item } from '@server/world/items/item';
58

69

710
export const openBankInterface: objectAction = (details) => {
811
details.player.activeWidget = {
9-
widgetId: widgets.bank.screenWidget,
12+
widgetId: widgets.bank.screenWidget.widgetId,
1013
secondaryWidgetId: widgets.bank.tabWidget.widgetId,
1114
type: 'SCREEN_AND_TAB',
1215
closeOnWalk: true
1316
};
17+
1418
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
19+
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);
1522

1623
};
1724

18-
export const depositItem: objectAction = (details) => {
25+
export const depositItem: itemAction = (details) => {
1926
// Check if player might be spawning widget clientside
2027
if (!details.player.activeWidget ||
21-
!(details.player.activeWidget.widgetId === widgets.bank.screenWidget) ||
28+
!(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) ||
2229
!(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) {
2330
return;
2431
}
2532

33+
// Check if the player has the item
34+
if (!details.player.hasItemInInventory(details.itemId)) {
35+
return;
36+
}
37+
38+
let countToRemove: number;
39+
if (details.option.endsWith('all')) {
40+
countToRemove = -1;
41+
} else {
42+
countToRemove = +details.option.replace('deposit-', '');
43+
}
44+
45+
const playerInventory: ItemContainer = details.player.inventory;
46+
const playerBank: ItemContainer = details.player.bank;
47+
const slotsWithItem: number[] = playerInventory.findAll(details.itemId);
48+
let itemAmount: number = 0;
49+
slotsWithItem.forEach((slot) => itemAmount += playerInventory.items[slot].amount);
50+
if (countToRemove == -1 || countToRemove > itemAmount) {
51+
countToRemove = itemAmount;
52+
}
53+
54+
if (!playerBank.canFit({itemId: details.itemId, amount: countToRemove}, true)) {
55+
details.player.sendMessage('Your bank is full.');
56+
return;
57+
}
58+
59+
60+
const itemToAdd: Item = {itemId: details.itemId, amount: 0};
61+
while (countToRemove > 0 && playerInventory.has(details.itemId)) {
62+
const invIndex = playerInventory.findIndex(details.itemId);
63+
const invItem = playerInventory.items[invIndex];
64+
if (countToRemove >= invItem.amount) {
65+
itemToAdd.amount += invItem.amount;
66+
countToRemove -= invItem.amount;
67+
playerInventory.remove(invIndex);
68+
} else {
69+
itemToAdd.amount += countToRemove;
70+
invItem.amount -= countToRemove;
71+
countToRemove = 0;
72+
}
73+
}
74+
playerBank.addStacking(itemToAdd);
75+
76+
77+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
78+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory);
79+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank);
2680
};
2781

82+
83+
export const withdrawItem: itemAction = (details) => {
84+
// Check if player might be spawning widget clientside
85+
if (!details.player.activeWidget ||
86+
!(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) ||
87+
!(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) {
88+
return;
89+
}
90+
// Check if the player has the item
91+
if (!details.player.hasItemInBank(details.itemId)) {
92+
return;
93+
}
94+
let countToRemove: number;
95+
if (details.option.endsWith('all')) {
96+
countToRemove = -1;
97+
} else {
98+
countToRemove = +details.option.replace('withdraw-', '');
99+
}
100+
101+
const playerBank: ItemContainer = details.player.bank;
102+
const playerInventory: ItemContainer = details.player.inventory;
103+
const slotWithItem: number = playerBank.findIndex(details.itemId);
104+
const itemAmount: number = playerBank.items[slotWithItem].amount;
105+
if (countToRemove == -1 || countToRemove > itemAmount) {
106+
countToRemove = itemAmount;
107+
}
108+
109+
if (!details.itemDetails.stackable) {
110+
const slots = playerInventory.getOpenSlotCount();
111+
if (slots < countToRemove) {
112+
countToRemove = slots;
113+
}
114+
}
115+
116+
if (!playerInventory.canFit({itemId: details.itemId, amount: countToRemove})) {
117+
details.player.sendMessage('Your inventory is full.');
118+
return;
119+
}
120+
121+
122+
const itemToAdd: Item = {itemId: details.itemId, amount: 0};
123+
while (countToRemove > 0 && playerBank.has(details.itemId)) {
124+
const invIndex = playerBank.findIndex(details.itemId);
125+
const invItem = playerBank.items[invIndex];
126+
if (countToRemove >= invItem.amount) {
127+
itemToAdd.amount += invItem.amount;
128+
countToRemove -= invItem.amount;
129+
playerBank.remove(invIndex);
130+
} else {
131+
itemToAdd.amount += countToRemove;
132+
invItem.amount -= countToRemove;
133+
countToRemove = 0;
134+
}
135+
}
136+
playerInventory.addStacking(itemToAdd);
137+
138+
139+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
140+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory);
141+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank);
142+
};
143+
144+
28145
export default new RunePlugin([{
29146
type: ActionType.OBJECT_ACTION,
30147
objectIds: objectIds.bankBooth,
@@ -34,6 +151,11 @@ export default new RunePlugin([{
34151
}, {
35152
type: ActionType.ITEM_ACTION,
36153
widgets: widgets.bank.tabWidget,
37-
options: ['deposit-1', 'deposit-5', 'deposit-10'],
154+
options: ['deposit-1', 'deposit-5', 'deposit-10', 'deposit-all'],
38155
action: depositItem,
156+
}, {
157+
type: ActionType.ITEM_ACTION,
158+
widgets: widgets.bank.screenWidget,
159+
options: ['withdraw-1', 'withdraw-5', 'withdraw-10', 'withdraw-all'],
160+
action: withdrawItem,
39161
}]);

src/plugins/skills/woodcutting/woodcutting.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const action: objectAction = (details) => {
1818

1919
export default new RunePlugin({
2020
type: ActionType.OBJECT_ACTION,
21-
options: ['chop down'],
21+
options: ['chop down', 'chop'],
2222
objectIds: getTreeIds(),
2323
walkTo: true,
2424
action

src/util/data.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function hasValueNotNull(variable: any): boolean {
2+
return typeof variable !== 'undefined' && variable !== null;
3+
}

src/web-server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export function runWebServer(): void {
8282
level: p.position.level
8383
},
8484
inventory: p.inventory.items,
85+
bank: p.bank.items,
8586
equipment: p.equipment.items
8687
};
8788
}));

src/world/actor/actor.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export abstract class Actor {
2323
private _runDirection: number;
2424
private _faceDirection: number;
2525
private readonly _inventory: ItemContainer;
26+
private readonly _bank: ItemContainer;
2627
public readonly skills: Skills;
2728
private _busy: boolean;
2829
public readonly metadata: { [key: string]: any } = {};
@@ -36,6 +37,7 @@ export abstract class Actor {
3637
this._runDirection = -1;
3738
this._faceDirection = 6;
3839
this._inventory = new ItemContainer(28);
40+
this._bank = new ItemContainer(376);
3941
this.skills = new Skills(this);
4042
this._busy = false;
4143
this._combatActions = [];
@@ -100,13 +102,23 @@ export abstract class Actor {
100102
this._inventory.remove(slot);
101103
}
102104

105+
public removeBankItem(slot: number): void {
106+
this._bank.remove(slot);
107+
}
108+
103109
public giveItem(item: number | Item): boolean {
104110
return this._inventory.add(item) !== null;
105111
}
112+
public giveBankItem(item: number | Item): boolean {
113+
return this._bank.add(item) !== null;
114+
}
106115

107116
public hasItemInInventory(item: number | Item): boolean {
108117
return this._inventory.has(item);
109118
}
119+
public hasItemInBank(item: number | Item): boolean {
120+
return this._bank.has(item);
121+
}
110122

111123
public hasItemOnPerson(item: number | Item): boolean {
112124
return this.hasItemInInventory(item);
@@ -286,6 +298,9 @@ export abstract class Actor {
286298
public get inventory(): ItemContainer {
287299
return this._inventory;
288300
}
301+
public get bank(): ItemContainer {
302+
return this._bank;
303+
}
289304

290305
public get busy(): boolean {
291306
return this._busy;

src/world/actor/player/action/swap-item-action.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,13 @@ export const swapItemAction = (player: Player, fromSlot: number, toSlot: number,
1111

1212
inventory.swap(fromSlot, toSlot);
1313
}
14+
if(widget.widgetId === widgets.bank.screenWidget.widgetId && widget.containerId === widgets.bank.screenWidget.containerId) {
15+
const bank = player.bank;
16+
17+
if(toSlot > bank.size - 1 || fromSlot > bank.size - 1) {
18+
return;
19+
}
20+
21+
bank.swap(fromSlot, toSlot);
22+
}
1423
};

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { join } from 'path';
44
import { logger } from '@runejs/logger';
55
import { Player } from './player';
66
import { SkillValue } from '@server/world/actor/skills';
7+
import { hasValueNotNull } from '@server/util/data';
78

89

910
export interface QuestProgress {
@@ -58,6 +59,7 @@ export interface PlayerSave {
5859
};
5960
appearance: Appearance;
6061
inventory: Item[];
62+
bank: Item[];
6163
equipment: Item[];
6264
skills: SkillValue[];
6365
settings: PlayerSettings;
@@ -122,6 +124,9 @@ export function savePlayerData(player: Player): boolean {
122124
rights: player.rights.valueOf(),
123125
appearance: player.appearance,
124126
inventory: player.inventory.items,
127+
bank: player.bank.items.filter((item) => {
128+
return hasValueNotNull(item);
129+
}),
125130
equipment: player.equipment.items,
126131
skills: player.skills.values,
127132
settings: player.settings,

src/world/actor/player/player.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export class Player extends Actor {
106106
public readonly actionsCancelled: Subject<ActionCancelType>;
107107
private quadtreeKey: QuadtreeKey = null;
108108
public savedMetadata: { [key: string]: any } = {};
109+
public sessionMetadata: { [key: string]: any } = {};
109110
public quests: QuestProgress[] = [];
110111
public achievements: string[] = [];
111112

@@ -152,6 +153,9 @@ export class Player extends Actor {
152153
if(playerSave.inventory && playerSave.inventory.length !== 0) {
153154
this.inventory.setAll(playerSave.inventory);
154155
}
156+
if(playerSave.bank && playerSave.bank.length !== 0) {
157+
this.bank.setAll(playerSave.bank);
158+
}
155159
if(playerSave.equipment && playerSave.equipment.length !== 0) {
156160
this.equipment.setAll(playerSave.equipment);
157161
}

src/world/config/harvestable-object.ts

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { objectIds } from '@server/world/config/object-ids';
2+
13
export interface IHarvestable {
24
objects: Map<number, number>;
35
itemId: number;
@@ -123,52 +125,17 @@ const RUNITE_OBJECTS: Map<number, number> = new Map<number, number>([
123125
]);
124126

125127
const NORMAL_OBJECTS: Map<number, number> = new Map<number, number>([
126-
[1276, 1342],
127-
[1277, 1342],
128-
[1278, 1342],
129-
[1279, 1342],
130-
[1280, 1342],
131-
[1282, 1341],
132-
[1283, 1341],
133-
[1284, 1341],
134-
[1285, 1341],
135-
[1285, 1341],
136-
[1286, 1341],
137-
[1289, 1341],
138-
[1290, 1341],
139-
[1291, 1341],
140-
[1315, 1342],
141-
[1316, 1342],
142-
[1318, 1342],
143-
[1330, 1342],
144-
[1331, 1342],
145-
[1332, 1342],
146-
[1365, 1342],
147-
[1383, 1342],
148-
[1384, 1342],
149-
[2409, 1342],
150-
[3033, 1342],
151-
[3034, 1342],
152-
[3035, 1342],
153-
[3036, 1342],
154-
[3881, 1342],
155-
[3882, 1342],
156-
[3883, 1342],
157-
[5902, 1342],
158-
[5903, 1342],
159-
[5904, 1342],
160-
[10041, 1342]
161-
]);
128+
...objectIds.tree.normal.map((tree) => [tree.default, tree.stump]),
129+
...objectIds.tree.dead.map((tree) => [tree.default, tree.stump]),
130+
] as [number, number][]);
162131

163132
const ACHEY_OBJECTS: Map<number, number> = new Map<number, number>([
164-
[2023, 3371],
165-
]);
166-
133+
...objectIds.tree.archey.map((tree) => [tree.default, tree.stump]),
134+
] as [number, number][]);
167135

168136
const OAK_OBJECTS: Map<number, number> = new Map<number, number>([
169-
[1281, 1342],
170-
[3037, 1342],
171-
]);
137+
...objectIds.tree.oak.map((tree) => [tree.default, tree.stump]),
138+
] as [number, number][]);
172139

173140

174141
const WILLOW_OBJECTS: Map<number, number> = new Map<number, number>([

0 commit comments

Comments
 (0)