Skip to content

Commit 9f0afb8

Browse files
committed
feat: check for level, existing fires, and fix busy type
feat: check for existing fires etc fix: check for firemaking level fix: fix use of `busy` on Player
1 parent b10682e commit 9f0afb8

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-8
lines changed

src/plugins/skills/firemaking/chance.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
* @returns `true` if the player successfully lights the fire, `false` otherwise.
99
*/
1010
export const canLight = (logLevel: number, playerLevel: number): boolean => {
11+
if (playerLevel < logLevel) {
12+
return false;
13+
}
14+
1115
playerLevel++;
1216
const hostRatio = Math.random() * logLevel;
1317
const clientRatio = Math.random() * ((playerLevel - logLevel) * (1 + (logLevel * 0.01)));
@@ -25,6 +29,10 @@ export const canLight = (logLevel: number, playerLevel: number): boolean => {
2529
* @returns `true` if the player successfully lights the fire, `false` otherwise.
2630
*/
2731
export const canChain = (logLevel: number, playerLevel: number): boolean => {
32+
if (playerLevel < logLevel) {
33+
return false;
34+
}
35+
2836
playerLevel++;
2937
const hostRatio = Math.random() * logLevel;
3038
const clientRatio = Math.random() * ((playerLevel - logLevel) * (1 + (logLevel * 0.01)));

src/plugins/skills/firemaking/firemaking-task.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class FiremakingTask extends ActorWorldItemInteractionTask<Player> {
103103
// if we can now light the fire, reset the timer so that on the next tick we can begin lighting the fire
104104
if (this.canLightFire) {
105105
this.elapsedTicks = 0;
106-
this.actor.metadata.busy = true;
106+
this.actor.busy = true;
107107
this.actor.playSound(soundIds.fireLit, 7);
108108

109109
return;

src/plugins/skills/firemaking/index.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { itemOnItemActionHandler, ItemOnItemActionHook, ItemOnWorldItemActionHoo
22
import { itemIds } from '@engine/world/config';
33
import { FIREMAKING_LOGS } from './data';
44
import { canChain } from './chance';
5-
import { lightFire } from './light-fire';
5+
import { canLightFireAtCurrentPosition, lightFire } from './light-fire';
66
import { runFiremakingTask } from './firemaking-task';
77

88
/**
@@ -11,27 +11,34 @@ import { runFiremakingTask } from './firemaking-task';
1111
const tinderboxOnLogHandler: itemOnItemActionHandler = (details) => {
1212
const { player, usedItem, usedWithItem, usedSlot, usedWithSlot } = details;
1313

14-
if(player.metadata.lastFire && Date.now() - player.metadata.lastFire < 600) {
14+
if (player.metadata.lastFire && Date.now() - player.metadata.lastFire < 600) {
1515
return;
1616
}
1717

1818
const log = usedItem.itemId !== itemIds.tinderbox ? usedItem : usedWithItem;
1919
const removeFromSlot = usedItem.itemId !== itemIds.tinderbox ? usedSlot : usedWithSlot;
2020
const skillInfo = FIREMAKING_LOGS.find(l => l.logItem.gameId === log.itemId);
2121

22-
if(!skillInfo) {
22+
if (!skillInfo) {
2323
player.sendMessage(`Mishandled firemaking log ${log.itemId}.`);
2424
return;
2525
}
2626

27-
// @TODO check for existing location objects
28-
// @TODO check firemaking level
27+
if (player.skills.firemaking.level < skillInfo.requiredLevel) {
28+
player.sendMessage(`You need a Firemaking level of ${skillInfo.requiredLevel} to light this log.`);
29+
return;
30+
}
31+
32+
if (!canLightFireAtCurrentPosition(player)) {
33+
player.sendMessage('You cannot light a fire here.');
34+
return;
35+
}
2936

3037
player.removeItem(removeFromSlot);
3138
const worldItemLog = player.instance.spawnWorldItem(log, player.position, { owner: player, expires: 300 });
3239

3340
// TODO (jameskmonger) chaining functionality needs documentation, I can't find anything about it online
34-
if(player.metadata.lastFire && Date.now() - player.metadata.lastFire < 1200 &&
41+
if (player.metadata.lastFire && Date.now() - player.metadata.lastFire < 1200 &&
3542
canChain(skillInfo.requiredLevel, player.skills.firemaking.level)) {
3643
lightFire(player, player.position, worldItemLog, skillInfo.experienceGained);
3744
} else {

src/plugins/skills/firemaking/light-fire.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,29 @@ const fireDurationTicks = (): number => {
88
return randomBetween(100, 200); // 1-2 minutes
99
};
1010

11+
/**
12+
* Whether or not a fire can be lit at the player's position.
13+
*
14+
* This is `true` if there are no spawned objects at the specified position of type 10.
15+
*
16+
* Probably should be moved to a more generic location (maybe on WorldInstance)
17+
*
18+
* @param player The player attempting to light the fire.
19+
* @returns `true` if a fire can be lit at the specified position, `false` otherwise.
20+
*
21+
* @author jameskmonger
22+
*/
23+
export const canLightFireAtCurrentPosition = (player: Player): boolean => {
24+
const existingFire = player.instance.getTileModifications(player.position).mods.spawnedObjects.find(o => (
25+
o.x === player.position.x
26+
&& o.y === player.position.y
27+
&& o.level === player.position.level
28+
&& o.type === 10
29+
))
30+
31+
return existingFire === undefined;
32+
}
33+
1134
/**
1235
* Light a fire at the specified position.
1336
*
@@ -17,6 +40,11 @@ const fireDurationTicks = (): number => {
1740
* @param burnExp The experience gained for lighting the fire.
1841
*/
1942
export const lightFire = (player: Player, position: Position, worldItemLog: WorldItem, burnExp: number): void => {
43+
if (!canLightFireAtCurrentPosition(player)) {
44+
player.sendMessage('You cannot light a fire here.');
45+
return;
46+
}
47+
2048
player.instance.despawnWorldItem(worldItemLog);
2149
const fireObject: LandscapeObject = {
2250
objectId: objectIds.fire,
@@ -45,5 +73,5 @@ export const lightFire = (player: Player, position: Position, worldItemLog: Worl
4573

4674
player.face(position, false);
4775
player.metadata.lastFire = Date.now();
48-
player.metadata.busy = false;
76+
player.busy = false;
4977
};

0 commit comments

Comments
 (0)