Skip to content

Commit a5b690f

Browse files
committed
BANKING! and some small changes to harvestables
1 parent 17c71fe commit a5b690f

File tree

11 files changed

+322
-81
lines changed

11 files changed

+322
-81
lines changed

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

Lines changed: 125 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,145 @@ 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+
21+
22+
};
23+
24+
export const depositItem: itemAction = (details) => {
25+
// Check if player might be spawning widget clientside
26+
if (!details.player.activeWidget ||
27+
!(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) ||
28+
!(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) {
29+
return;
30+
}
31+
32+
// Check if the player has the item
33+
if (!details.player.hasItemInInventory(details.itemId)) {
34+
return;
35+
}
36+
37+
let countToRemove: number;
38+
if (details.option.endsWith("all")) {
39+
countToRemove = -1;
40+
} else {
41+
countToRemove = +details.option.replace("deposit-", "");
42+
}
43+
44+
const playerInventory: ItemContainer = details.player.inventory;
45+
const playerBank: ItemContainer = details.player.bank;
46+
const slotsWithItem: number[] = playerInventory.findAll(details.itemId);
47+
let itemAmount: number = 0;
48+
slotsWithItem.forEach((slot) => itemAmount += playerInventory.items[slot].amount);
49+
if (countToRemove == -1 || countToRemove > itemAmount) {
50+
countToRemove = itemAmount
51+
}
52+
53+
if (!playerBank.canFit({itemId: details.itemId, amount: countToRemove}, true)) {
54+
details.player.sendMessage("Your bank is full.");
55+
return;
56+
}
57+
58+
59+
const itemToAdd: Item = {itemId: details.itemId, amount: 0}
60+
while (countToRemove > 0 && playerInventory.has(details.itemId)) {
61+
const invIndex = playerInventory.findIndex(details.itemId);
62+
const invItem = playerInventory.items[invIndex];
63+
if (countToRemove >= invItem.amount) {
64+
itemToAdd.amount += invItem.amount;
65+
countToRemove -= invItem.amount;
66+
playerInventory.remove(invIndex);
67+
} else {
68+
itemToAdd.amount += countToRemove;
69+
invItem.amount -= countToRemove;
70+
countToRemove = 0
71+
}
72+
}
73+
playerBank.addStacking(itemToAdd);
74+
1575

76+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
77+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory);
78+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank);
1679
};
1780

18-
export const depositItem: objectAction = (details) => {
81+
82+
export const withdrawItem: itemAction = (details) => {
1983
// Check if player might be spawning widget clientside
2084
if (!details.player.activeWidget ||
21-
!(details.player.activeWidget.widgetId === widgets.bank.screenWidget) ||
85+
!(details.player.activeWidget.widgetId === widgets.bank.screenWidget.widgetId) ||
2286
!(details.player.activeWidget.secondaryWidgetId === widgets.bank.tabWidget.widgetId)) {
2387
return;
2488
}
89+
// Check if the player has the item
90+
if (!details.player.hasItemInBank(details.itemId)) {
91+
return;
92+
}
93+
let countToRemove: number;
94+
if (details.option.endsWith("all")) {
95+
countToRemove = -1;
96+
} else {
97+
countToRemove = +details.option.replace("withdraw-", "");
98+
}
99+
100+
const playerBank: ItemContainer = details.player.bank;
101+
const playerInventory: ItemContainer = details.player.inventory;
102+
const slotWithItem: number = playerBank.findIndex(details.itemId);
103+
let itemAmount: number = playerBank.items[slotWithItem].amount;
104+
if (countToRemove == -1 || countToRemove > itemAmount) {
105+
countToRemove = itemAmount
106+
}
107+
108+
if (!details.itemDetails.stackable) {
109+
const slots = playerInventory.getOpenSlotCount();
110+
if (slots < countToRemove) {
111+
countToRemove = slots;
112+
}
113+
}
114+
115+
if (!playerInventory.canFit({itemId: details.itemId, amount: countToRemove})) {
116+
details.player.sendMessage("Your inventory is full.");
117+
return;
118+
}
119+
120+
121+
const itemToAdd: Item = {itemId: details.itemId, amount: 0}
122+
while (countToRemove > 0 && playerBank.has(details.itemId)) {
123+
const invIndex = playerBank.findIndex(details.itemId);
124+
const invItem = playerBank.items[invIndex];
125+
if (countToRemove >= invItem.amount) {
126+
itemToAdd.amount += invItem.amount;
127+
countToRemove -= invItem.amount;
128+
playerBank.remove(invIndex);
129+
} else {
130+
itemToAdd.amount += countToRemove;
131+
invItem.amount -= countToRemove;
132+
countToRemove = 0
133+
}
134+
}
135+
playerInventory.addStacking(itemToAdd);
25136

137+
138+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.tabWidget, details.player.inventory);
139+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, details.player.inventory);
140+
details.player.outgoingPackets.sendUpdateAllWidgetItems(widgets.bank.screenWidget, details.player.bank);
26141
};
27142

143+
28144
export default new RunePlugin([{
29145
type: ActionType.OBJECT_ACTION,
30146
objectIds: objectIds.bankBooth,
@@ -34,6 +150,11 @@ export default new RunePlugin([{
34150
}, {
35151
type: ActionType.ITEM_ACTION,
36152
widgets: widgets.bank.tabWidget,
37-
options: ['deposit-1', 'deposit-5', 'deposit-10'],
153+
options: ['deposit-1', 'deposit-5', 'deposit-10', 'deposit-all'],
38154
action: depositItem,
155+
}, {
156+
type: ActionType.ITEM_ACTION,
157+
widgets: widgets.bank.screenWidget,
158+
options: ['withdraw-1', 'withdraw-5', 'withdraw-10', 'withdraw-all'],
159+
action: withdrawItem,
39160
}]);

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/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
@@ -22,6 +22,7 @@ export abstract class Actor {
2222
private _runDirection: number;
2323
private _faceDirection: number;
2424
private readonly _inventory: ItemContainer;
25+
private readonly _bank: ItemContainer;
2526
public readonly skills: Skills;
2627
private _busy: boolean;
2728
public readonly metadata: { [key: string]: any } = {};
@@ -34,6 +35,7 @@ export abstract class Actor {
3435
this._runDirection = -1;
3536
this._faceDirection = 6;
3637
this._inventory = new ItemContainer(28);
38+
this._bank = new ItemContainer(376);
3739
this.skills = new Skills(this);
3840
this._busy = false;
3941
this._combatActions = [];
@@ -86,13 +88,23 @@ export abstract class Actor {
8688
this._inventory.remove(slot);
8789
}
8890

91+
public removeBankItem(slot: number): void {
92+
this._bank.remove(slot);
93+
}
94+
8995
public giveItem(item: number | Item): boolean {
9096
return this._inventory.add(item) !== null;
9197
}
98+
public giveBankItem(item: number | Item): boolean {
99+
return this._bank.add(item) !== null;
100+
}
92101

93102
public hasItemInInventory(item: number | Item): boolean {
94103
return this._inventory.has(item);
95104
}
105+
public hasItemInBank(item: number | Item): boolean {
106+
return this._bank.has(item);
107+
}
96108

97109
public hasItemOnPerson(item: number | Item): boolean {
98110
return this.hasItemInInventory(item);
@@ -272,6 +284,9 @@ export abstract class Actor {
272284
public get inventory(): ItemContainer {
273285
return this._inventory;
274286
}
287+
public get bank(): ItemContainer {
288+
return this._bank;
289+
}
275290

276291
public get busy(): boolean {
277292
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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export interface PlayerSave {
5858
};
5959
appearance: Appearance;
6060
inventory: Item[];
61+
bank: Item[];
6162
equipment: Item[];
6263
skills: SkillValue[];
6364
settings: PlayerSettings;
@@ -122,6 +123,9 @@ export function savePlayerData(player: Player): boolean {
122123
rights: player.rights.valueOf(),
123124
appearance: player.appearance,
124125
inventory: player.inventory.items,
126+
bank: player.bank.items.filter((item) => {
127+
return item !== null
128+
}),
125129
equipment: player.equipment.items,
126130
skills: player.skills.values,
127131
settings: player.settings,

src/world/actor/player/player.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ export class Player extends Actor {
137137
if(playerSave.inventory && playerSave.inventory.length !== 0) {
138138
this.inventory.setAll(playerSave.inventory);
139139
}
140+
if(playerSave.bank && playerSave.bank.length !== 0) {
141+
this.bank.setAll(playerSave.bank);
142+
}
140143
if(playerSave.equipment && playerSave.equipment.length !== 0) {
141144
this.equipment.setAll(playerSave.equipment);
142145
}

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>([

src/world/config/object-ids.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,54 @@ export const objectIds = {
2222
crate: 357,
2323
skeletonLayingFlat: 5358,
2424
skeletonLayingAgainstWall: 5359,
25+
tree: {
26+
normal: [
27+
{
28+
default: 1276,
29+
stump: 1342,
30+
},
31+
{
32+
default: 1278,
33+
stump: 1342,
34+
}
35+
],
36+
dead: [
37+
{
38+
default: 1282,
39+
stump: 1347,
40+
},
41+
{
42+
default: 1283,
43+
stump: 1347,
44+
},
45+
{
46+
default: 1286,
47+
stump: 1351,
48+
},
49+
{
50+
default: 1289,
51+
stump: 1353,
52+
},
53+
{
54+
default: 1365,
55+
stump: 1352,
56+
}
57+
],
58+
archey: [
59+
{
60+
default: 2023,
61+
stump: 3371
62+
}
63+
],
64+
oak: [
65+
{
66+
default: 1281,
67+
stump: 1342
68+
},
69+
{
70+
default: 3037,
71+
stump: 1342
72+
}
73+
]
74+
}
2575
};

0 commit comments

Comments
 (0)