Skip to content

Commit 16db8fe

Browse files
Adding some more little skill accessor shortcuts for easier fetching
I like helper functions :)
1 parent e61c731 commit 16db8fe

File tree

7 files changed

+100
-38
lines changed

7 files changed

+100
-38
lines changed

src/plugins/skills/crafting/spinning-wheel-plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ export const buttonClicked: buttonAction = (details) => {
148148
// Close the widget as it is no longer needed
149149
details.player.closeActiveWidgets();
150150

151-
if (!details.player.skills.hasSkillLevel(Skill.CRAFTING, product.spinnable.requiredLevel)) {
151+
if (!details.player.skills.hasLevel(Skill.CRAFTING, product.spinnable.requiredLevel)) {
152152
details.player.sendMessage(`You need a crafting level of ${product.spinnable.requiredLevel} to craft ${cache.itemDefinitions.get(product.spinnable.output).name.toLowerCase()}.`, true);
153153
return;
154154
}

src/plugins/skills/firemaking-plugin.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const lightFire = (player: Player, position: Position, worldItemLog: WorldItem,
5151

5252
player.playAnimation(null);
5353
player.sendMessage(`The fire catches and the logs begin to burn.`);
54-
player.skills.addExp('firemaking', burnExp);
54+
player.skills.firemaking.addExp(burnExp);
5555

5656
if(!player.walkingQueue.moveIfAble(-1, 0)) {
5757
if(!player.walkingQueue.moveIfAble(1, 0)) {
@@ -93,7 +93,7 @@ const action: itemOnItemAction = (details) => {
9393
const worldItemLog = world.spawnWorldItem(log, player.position, player, 300);
9494

9595
if(player.metadata['lastFire'] && Date.now() - player.metadata['lastFire'] < 1200 &&
96-
canChain(skillInfo.requiredLevel, player.skills.getSkillLevel('firemaking'))) {
96+
canChain(skillInfo.requiredLevel, player.skills.firemaking.level)) {
9797
lightFire(player, position, worldItemLog, skillInfo.burnExp);
9898
} else {
9999
player.sendMessage(`You attempt to light the logs.`);
@@ -121,7 +121,7 @@ const action: itemOnItemAction = (details) => {
121121
player.playAnimation(animationIds.lightingFire);
122122
}
123123

124-
canLightFire = elapsedTicks > 10 && canLight(skillInfo.requiredLevel, player.skills.getSkillLevel('firemaking'));
124+
canLightFire = elapsedTicks > 10 && canLight(skillInfo.requiredLevel, player.skills.firemaking.level);
125125

126126
if(!canLightFire && (elapsedTicks === 0 || elapsedTicks % 4 === 0)) {
127127
player.playSound(soundIds.lightingFire, 10, 0);

src/plugins/skills/smithing/smelting-plugin.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ const loadSmeltingInterface = (details: ObjectActionDetails) => {
180180
// Send the items to the widget.
181181
widgetItems.forEach((item) => {
182182
details.player.outgoingPackets.setItemOnWidget(widgets.furnace.widgetId, item.slot.modelId, item.bar.barId, 125);
183-
if (!details.player.skills.hasSkillLevel(Skill.SMITHING, item.bar.requiredLevel)) {
183+
if (!details.player.skills.hasLevel(Skill.SMITHING, item.bar.requiredLevel)) {
184184
details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.red});
185185
} else {
186186
details.player.modifyWidget(widgets.furnace.widgetId, { childId: item.slot.titleId, textColor: colors.black});
@@ -204,7 +204,7 @@ const hasIngredients = (details: ButtonActionDetails, ingredients: Item[], inven
204204
};
205205

206206
const canSmelt = (details: ButtonActionDetails, bar: Bar): boolean => {
207-
return details.player.skills.hasSkillLevel(Skill.SMITHING, bar.requiredLevel);
207+
return details.player.skills.hasLevel(Skill.SMITHING, bar.requiredLevel);
208208
};
209209

210210
const smeltProduct = (details: ButtonActionDetails, bar: Bar, count: number) => {
@@ -303,4 +303,4 @@ export default new RunePlugin([
303303
buttonIds: Array.from(widgetButtonIds.keys()),
304304
action: buttonClicked
305305
}
306-
]);
306+
]);

src/world/actor/actor.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { WalkingQueue } from './walking-queue';
22
import { ItemContainer } from '../items/item-container';
3-
import { Animation, Graphic, UpdateFlags } from './update-flags';
3+
import { Animation, DamageType, Graphic, UpdateFlags } from './update-flags';
44
import { Npc } from './npc/npc';
55
import { Skills } from '@server/world/actor/skills';
66
import { Item } from '@server/world/items/item';
@@ -42,6 +42,10 @@ export abstract class Actor {
4242
this.pathfinding = new Pathfinding(this);
4343
}
4444

45+
public damage(amount: number, damageType: DamageType = DamageType.DAMAGE): void {
46+
47+
}
48+
4549
public face(face: Position | Actor | null, clearWalkingQueue: boolean = true, autoClear: boolean = true, clearedByWalking: boolean = true): void {
4650
if(face === null) {
4751
this.clearFaceActor();

src/world/actor/skills.ts

Lines changed: 85 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,38 +67,89 @@ export const skillDetails: SkillDetail[] = [
6767
export interface SkillValue {
6868
exp: number;
6969
level: number;
70+
modifiedLevel?: number;
7071
}
7172

72-
export class Skills {
73+
export class SkillShortcut {
74+
75+
public constructor(private skills: Skills, private skillName: SkillName) {
76+
}
77+
78+
public addExp(exp: number): void {
79+
this.skills.addExp(this.skillName, exp);
80+
}
81+
82+
public get level(): number {
83+
return this.skills.getLevel(this.skillName);
84+
}
85+
86+
public get exp(): number {
87+
return this.skills.get(this.skillName).exp;
88+
}
89+
90+
public get levelForExp(): number {
91+
return this.skills.getLevelForExp(this.exp);
92+
}
93+
94+
}
95+
96+
type SkillShortcutMap = {
97+
[skillName in SkillName]: SkillShortcut;
98+
};
99+
100+
class SkillShortcuts implements SkillShortcutMap {
101+
agility: SkillShortcut;
102+
attack: SkillShortcut;
103+
construction: SkillShortcut;
104+
cooking: SkillShortcut;
105+
crafting: SkillShortcut;
106+
defence: SkillShortcut;
107+
farming: SkillShortcut;
108+
firemaking: SkillShortcut;
109+
fishing: SkillShortcut;
110+
fletching: SkillShortcut;
111+
herblore: SkillShortcut;
112+
hitpoints: SkillShortcut;
113+
magic: SkillShortcut;
114+
mining: SkillShortcut;
115+
prayer: SkillShortcut;
116+
ranged: SkillShortcut;
117+
runecrafting: SkillShortcut;
118+
slayer: SkillShortcut;
119+
smithing: SkillShortcut;
120+
strength: SkillShortcut;
121+
thieving: SkillShortcut;
122+
woodcutting: SkillShortcut;
123+
}
124+
125+
export class Skills extends SkillShortcuts {
73126

74127
private _values: SkillValue[];
75128

76129
public constructor(private actor: Actor, values?: SkillValue[]) {
130+
super();
131+
132+
Object.keys(Skill)
133+
.map(skillName => skillName.toLowerCase())
134+
.forEach(skillName =>
135+
this[skillName] = new SkillShortcut(this, skillName as SkillName)
136+
);
137+
77138
if(values) {
78139
this._values = values;
79140
} else {
80141
this._values = this.defaultValues();
81142
}
82143
}
83144

84-
private defaultValues(): SkillValue[] {
85-
const values: SkillValue[] = [];
86-
skillDetails.forEach(s => values.push({ exp: 0, level: 1 }));
87-
values[Skill.HITPOINTS] = { exp: 1154, level: 10 };
88-
return values;
89-
}
90-
91-
/*
92-
* @TODO make an additional field for boostedLevel that this reads from
93-
* Also add a new method to get the unboostedLevel incase it's ever needed
94-
* Then think about some way to reliably and easily fade those boosts out over time
95-
*/
96-
public getSkillLevel(skill: number | SkillName): number {
97-
return this.get(skill).level;
145+
public getLevel(skill: number | SkillName, ignoreLevelModifications: boolean = false): number {
146+
const s = this.get(skill);
147+
return (s.modifiedLevel !== undefined && !ignoreLevelModifications ? s.modifiedLevel : s.level);
98148
}
99149

100-
public hasSkillLevel(skill: number | SkillName, level: number): boolean {
101-
return this.get(skill).level >= level;
150+
public hasLevel(skill: number | SkillName, level: number, ignoreLevelModifications: boolean = false): boolean {
151+
const s = this.get(skill);
152+
return (ignoreLevelModifications ? s.level : s.modifiedLevel) >= level;
102153
}
103154

104155
public getLevelForExp(exp: number): number {
@@ -181,16 +232,6 @@ export class Skills {
181232
});
182233
}
183234

184-
public setExp(skill: number | SkillName, exp: number): void {
185-
const skillId = this.getSkillId(skill);
186-
this._values[skillId].exp = exp;
187-
}
188-
189-
public setLevel(skill: number | SkillName, level: number): void {
190-
const skillId = this.getSkillId(skill);
191-
this._values[skillId].level = level;
192-
}
193-
194235
public getSkillId(skill: number | SkillName) : number {
195236
if(typeof skill === 'number') {
196237
return skill;
@@ -209,6 +250,23 @@ export class Skills {
209250
}
210251
}
211252

253+
private defaultValues(): SkillValue[] {
254+
const values: SkillValue[] = [];
255+
skillDetails.forEach(s => values.push({ exp: 0, level: 1 }));
256+
values[Skill.HITPOINTS] = { exp: 1154, level: 10 };
257+
return values;
258+
}
259+
260+
private setExp(skill: number | SkillName, exp: number): void {
261+
const skillId = this.getSkillId(skill);
262+
this._values[skillId].exp = exp;
263+
}
264+
265+
private setLevel(skill: number | SkillName, level: number): void {
266+
const skillId = this.getSkillId(skill);
267+
this._values[skillId].level = level;
268+
}
269+
212270
public get values(): SkillValue[] {
213271
return this._values;
214272
}

src/world/config/harvest-tool.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const Axes: HarvestTool[] = [
5757
*/
5858
export function getBestPickaxe(player: Player): HarvestTool | null {
5959
for (let i = Pickaxes.length - 1; i >= 0; i--) {
60-
if (player.skills.hasSkillLevel(Skill.MINING, Pickaxes[i].level)) {
60+
if (player.skills.hasLevel(Skill.MINING, Pickaxes[i].level)) {
6161
if (player.hasItemOnPerson(Pickaxes[i].itemId)) {
6262
return Pickaxes[i];
6363
}
@@ -72,7 +72,7 @@ export function getBestPickaxe(player: Player): HarvestTool | null {
7272
*/
7373
export function getBestAxe(player: Player): HarvestTool | null {
7474
for (let i = Axes.length - 1; i >= 0; i--) {
75-
if (player.skills.hasSkillLevel(Skill.WOODCUTTING, Axes[i].level)) {
75+
if (player.skills.hasLevel(Skill.WOODCUTTING, Axes[i].level)) {
7676
if (player.hasItemOnPerson(Axes[i].itemId)) {
7777
return Axes[i];
7878
}

src/world/skill-util/harvest-skill.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function canInitiateHarvest(player: Player, target: IHarvestable, skill:
3434

3535

3636
// Check player level against the required level
37-
if (!player.skills.hasSkillLevel(skill, target.level)) {
37+
if (!player.skills.hasLevel(skill, target.level)) {
3838
switch (skill) {
3939
case Skill.MINING:
4040
player.sendMessage(`You need a Mining level of ${target.level} to mine this rock.`, true);

0 commit comments

Comments
 (0)