Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pathfinding + following start #167

Merged
merged 10 commits into from
Jun 9, 2020
1 change: 1 addition & 0 deletions plugins/rune.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ module.exports = {
WORLD_ITEM_ACTION: ActionType.WORLD_ITEM_ACTION, OBJECT_ACTION: ActionType.OBJECT_ACTION,
ITEM_ON_OBJECT_ACTION: ActionType.ITEM_ON_OBJECT_ACTION, ITEM_ON_NPC_ACTION: ActionType.ITEM_ON_NPC_ACTION,
COMMAND_ACTION: ActionType.COMMAND, PLAYER_INIT: ActionType.PLAYER_INIT, NPC_INIT: ActionType.NPC_INIT,
PLAYER_ACTION: ActionType.PLAYER_ACTION,
QUEST: ActionType.QUEST, RunePlugin,

world, InteractingAction, loopingAction, walkToAction,
Expand Down
2 changes: 1 addition & 1 deletion src/data-dump.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { join } from 'path';
import { writeFileSync } from 'fs';
import { cache } from '@server/game-server';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { ItemDefinition, NpcDefinition, Widget } from '@runejs/cache-parser';

function dump<T>(fileName: string, definitions: Map<number, T>): boolean {
Expand Down
2 changes: 1 addition & 1 deletion src/error-handling.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';

/*
* Error handling! Feel free to add other types of errors or warnings here. :)
Expand Down
2 changes: 2 additions & 0 deletions src/game-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { setItemOnNpcPlugins } from '@server/world/actor/player/action/item-on-n
import { setPlayerInitPlugins } from '@server/world/actor/player/player';
import { setNpcInitPlugins } from '@server/world/actor/npc/npc';
import { setQuestPlugins } from '@server/world/config/quests';
import { setPlayerPlugins } from '@server/world/actor/player/action/player-action';


export let serverConfig: ServerConfig;
Expand Down Expand Up @@ -68,6 +69,7 @@ export async function injectPlugins(): Promise<void> {
setWidgetPlugins(actionPluginMap[ActionType.WIDGET_ACTION]);
setPlayerInitPlugins(actionPluginMap[ActionType.PLAYER_INIT]);
setNpcInitPlugins(actionPluginMap[ActionType.NPC_INIT]);
setPlayerPlugins(actionPluginMap[ActionType.PLAYER_ACTION]);
}

function generateCrcTable(): void {
Expand Down
2 changes: 1 addition & 1 deletion src/net/data-parser/client-login-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Player } from '@server/world/actor/player/player';
import { Isaac } from '@server/net/isaac';
import { serverConfig, world } from '@server/game-server';
import { DataParser } from './data-parser';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { ByteBuffer } from '@runejs/byte-buffer';
import * as bcrypt from 'bcrypt';
import { loadPlayerSave } from '@server/world/actor/player/player-data';
Expand Down
4 changes: 4 additions & 0 deletions src/net/incoming-packet-directory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { itemInteractionPacket } from '@server/net/incoming-packets/item-interac
import { itemOnObjectPacket } from '@server/net/incoming-packets/item-on-object-packet';
import { numberInputPacket } from '@server/net/incoming-packets/number-input-packet';
import { itemOnNpcPacket } from '@server/net/incoming-packets/item-on-npc-packet';
import { playerInteractionPacket } from '@server/net/incoming-packets/player-interaction-packet';
import { examinePacket } from '@server/net/incoming-packets/examine-packet';

const ignore = [ 234, 160, 216, 13, 58 /* camera move */ ];
Expand Down Expand Up @@ -62,6 +63,9 @@ const packets: { [key: number]: incomingPacket } = {
164: objectInteractionPacket,
183: objectInteractionPacket,

68: playerInteractionPacket,
211: playerInteractionPacket,

148: examinePacket, // examine item
151: examinePacket, // examine object
247: examinePacket, // examine npc
Expand Down
4 changes: 2 additions & 2 deletions src/net/incoming-packet-sizes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export const incomingPacketSizes: number[] = [
6, -3, -3, -3, -3, -3, -3, -3, 8, -3, //30
16, -3, -3, -3, -3, -3, -3, -3, -3, -3, //40
-3, -3, -3, -3, -3, -3, -3, 2, 4, -3, //50
-3, -3, -3, 2, 4, 6, -3, -3, -3, -3, //60
-3, -3, -3, 2, 4, 6, -3, -3, 2, -3, //60
-3, -3, -3, -1, -3, -3, -3, -3, -3, -3, //70
-3, -3, -3, 9, -3, 6, 8, -3, -3, -1, //80
-3, -3, -3, -3, -3, -3, -3, -3, 8, -3, //90
Expand All @@ -20,7 +20,7 @@ export const incomingPacketSizes: number[] = [
-3, -3, -3, 6, -3, -3, -3, -3, -3, -3, //180
-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, //190
-3, -3, -3, -3, -3, -3, -3, -3, 10, -3, //200
-3, -3, -3, -3, -3, -3, 0, -3, -3, -3, //210
-3, 2, -3, -3, -3, -3, 0, -3, -3, -3, //210
-3, -3, -3, -3, -3, -3, -3, -3, 8, -3, //220
-3, 13, -3, -3, 4, -3, -1, -3, 4, -3, //230
-3, -3, -3, -3, -3, -1, -3, 2, -1, -3, //240
Expand Down
2 changes: 1 addition & 1 deletion src/net/incoming-packets/item-on-item-packet.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { incomingPacket } from '../incoming-packet';
import { Player } from '../../world/actor/player/player';
import { widgets } from '@server/world/config/widget';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { itemOnItemAction } from '@server/world/actor/player/action/item-on-item-action';
import { ByteBuffer } from '@runejs/byte-buffer';

Expand Down
2 changes: 1 addition & 1 deletion src/net/incoming-packets/item-on-npc-packet.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { incomingPacket } from '../incoming-packet';
import { Player } from '../../world/actor/player/player';
import { widgets } from '@server/world/config/widget';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { world } from '@server/game-server';
import { World } from '@server/world/world';
import { itemOnNpcAction } from '@server/world/actor/player/action/item-on-npc-action';
Expand Down
2 changes: 1 addition & 1 deletion src/net/incoming-packets/item-on-object-packet.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { incomingPacket } from '../incoming-packet';
import { Player } from '../../world/actor/player/player';
import { widgets } from '@server/world/config/widget';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { Position } from '@server/world/position';
import { cache, world } from '@server/game-server';
import { itemOnObjectAction } from '@server/world/actor/player/action/item-on-object-action';
Expand Down
2 changes: 1 addition & 1 deletion src/net/incoming-packets/npc-interaction-packet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Player } from '../../world/actor/player/player';
import { world } from '@server/game-server';
import { World } from '@server/world/world';
import { npcAction } from '@server/world/actor/player/action/npc-action';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { ByteBuffer } from '@runejs/byte-buffer';

export const npcInteractionPacket: incomingPacket = (player: Player, packetId: number, packetSize: number, packet: ByteBuffer): void => {
Expand Down
2 changes: 1 addition & 1 deletion src/net/incoming-packets/object-interaction-packet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Player } from '../../world/actor/player/player';
import { Position } from '@server/world/position';
import { cache, world } from '@server/game-server';
import { objectAction } from '@server/world/actor/player/action/object-action';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { ByteBuffer } from '@runejs/byte-buffer';

interface ObjectInteraction {
Expand Down
46 changes: 46 additions & 0 deletions src/net/incoming-packets/player-interaction-packet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { incomingPacket } from '../incoming-packet';
import { Player, playerOptions } from '../../world/actor/player/player';
import { world } from '@server/game-server';
import { World } from '@server/world/world';
import { ByteBuffer } from '@runejs/byte-buffer';
import { playerAction } from '@server/world/actor/player/action/player-action';
import { logger } from '@runejs/logger';

export const playerInteractionPacket: incomingPacket = (player: Player, packetId: number, packetSize: number, packet: ByteBuffer): void => {
const args = {
68: [ 'SHORT', 'UNSIGNED', 'LITTLE_ENDIAN' ],
211: [ 'SHORT', 'UNSIGNED', 'LITTLE_ENDIAN' ]
};
const playerIndex = packet.get(...args[packetId]) - 1;

if(playerIndex < 0 || playerIndex > World.MAX_PLAYERS - 1) {
return;
}

const otherPlayer = world.playerList[playerIndex];
if(!otherPlayer) {
return;
}

const position = otherPlayer.position;
const distance = Math.floor(position.distanceBetween(player.position));

// Too far away
if(distance > 16) {
return;
}

const actions = {
68: 0,
211: 1
};

const playerOption = playerOptions.find(playerOption => playerOption.index === actions[packetId]);

if(!playerOption) {
logger.error(`Invalid player option ${actions[packetId]}!`);
return;
}

playerAction(player, otherPlayer, position, playerOption.option.toLowerCase());
};
1 change: 1 addition & 0 deletions src/net/incoming-packets/walk-packet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export const walkPacket: incomingPacket = (player: Player, packetId: number, pac

const walkingQueue = player.walkingQueue;

player.actionsCancelled.next('manual-movement');
player.walkingTo = null;
walkingQueue.clear();
walkingQueue.valid = true;
Expand Down
9 changes: 9 additions & 0 deletions src/net/outgoing-packets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,15 @@ export class OutgoingPackets {
this.queue(packet);
}

public updatePlayerOption(option: string, index: number = 0, placement: 'TOP' | 'BOTTOM' = 'BOTTOM'): void {
const packet = new Packet(223, PacketType.DYNAMIC_SMALL);
packet.putString(!option ? 'hidden' : option);
packet.put(placement === 'TOP' ? 1 : 0);
packet.put(index + 1);

this.queue(packet);
}

public flushQueue(): void {
if(!this.socket || this.socket.destroyed) {
return;
Expand Down
34 changes: 34 additions & 0 deletions src/plugins/commands/path-command.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { ActionType, RunePlugin } from '@server/plugins/plugin';
import { commandAction } from '@server/world/actor/player/action/input-command-action';
import { Position } from '@server/world/position';

const action: commandAction = (details) => {
const { player, args } = details;

const x: number = args.x as number;
const y: number = args.y as number;
const pathingDiameter: number = args.diameter as number;

player.pathfinding.walkTo(new Position(x, y, player.position.level), { pathingDiameter });
};

export default new RunePlugin({
type: ActionType.COMMAND,
commands: [ 'path' ],
args: [
{
name: 'x',
type: 'number'
},
{
name: 'y',
type: 'number'
},
{
name: 'diameter',
type: 'number',
defaultValue: 64
}
],
action
});
2 changes: 1 addition & 1 deletion src/plugins/objects/doors/double-door-plugin.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Position } from '@server/world/position';
import { WNES } from '@server/world/direction';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { world } from '@server/game-server';
import { action as doorAction } from '@server/plugins/objects/doors/door-plugin';
import { objectAction } from '@server/world/actor/player/action/object-action';
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/objects/doors/gate-plugin.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Position } from '@server/world/position';
import { directionData, WNES } from '@server/world/direction';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { world } from '@server/game-server';
import { ModifiedLocationObject } from '@server/world/map/location-object';
import { objectAction } from '@server/world/actor/player/action/object-action';
Expand Down
54 changes: 54 additions & 0 deletions src/plugins/player/follow-player-plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { ActionType, RunePlugin } from '@server/plugins/plugin';
import { playerAction } from '@server/world/actor/player/action/player-action';
import { Player } from '@server/world/actor/player/player';
import { logger } from '@runejs/logger';

async function pathTo(player: Player, otherPlayer: Player): Promise<boolean> {
const distance = Math.floor(otherPlayer.position.distanceBetween(player.position));
if(distance > 16) {
player.clearFaceActor();
player.metadata.faceActorClearedByWalking = true;
throw new Error(`Distance too great!`);
}

if(distance <= 1) {
return Promise.resolve(false);
}

try {
await player.pathfinding.walkTo(otherPlayer.position, {
pathingDiameter: distance + 6,
ignoreDestination: true
});

return Promise.resolve(true);
} catch(error) {
player.clearFaceActor();
logger.warn(error.message);
}
}

export const action: playerAction = (details) => {
const { player, otherPlayer } = details;

player.face(otherPlayer, false, false, false);
pathTo(player, otherPlayer);

const subscription = otherPlayer.movementEvent.subscribe(() => {
player.face(otherPlayer, false, false, false);
pathTo(player, otherPlayer);
});
const actionCancelled = player.actionsCancelled.subscribe(type => {
if(type !== 'pathing-movement') {
subscription.unsubscribe();
actionCancelled.unsubscribe();
player.face(null);
}
});
};

export default new RunePlugin({
type: ActionType.PLAYER_ACTION,
options: 'follow',
action
});
6 changes: 4 additions & 2 deletions src/plugins/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { ButtonActionPlugin } from '@server/world/actor/player/action/button-act
import { WorldItemActionPlugin } from '@server/world/actor/player/action/world-item-action';
import { ItemActionPlugin } from '@server/world/actor/player/action/item-action';
import { QuestPlugin } from '@server/world/config/quests';
import { PlayerActionPlugin } from '@server/world/actor/player/action/player-action';

export enum ActionType {
BUTTON = 'button',
Expand All @@ -25,7 +26,8 @@ export enum ActionType {
COMMAND = 'command',
PLAYER_INIT = 'player_init',
NPC_INIT = 'npc_init',
QUEST = 'quest'
QUEST = 'quest',
PLAYER_ACTION = 'player_action',
}

export interface QuestAction {
Expand Down Expand Up @@ -60,7 +62,7 @@ export function questFilter(player: Player, plugin: ActionPlugin): boolean {
}

export type RunePluginAction = NpcActionPlugin | ObjectActionPlugin | ButtonActionPlugin | ItemOnItemActionPlugin | ItemOnObjectActionPlugin | ItemOnNpcActionPlugin |
CommandActionPlugin | WidgetActionPlugin | ItemActionPlugin | WorldItemActionPlugin | PlayerInitPlugin | NpcInitPlugin | QuestPlugin;
CommandActionPlugin | WidgetActionPlugin | ItemActionPlugin | WorldItemActionPlugin | PlayerInitPlugin | NpcInitPlugin | QuestPlugin | PlayerActionPlugin;

export class RunePlugin {

Expand Down
2 changes: 1 addition & 1 deletion src/plugins/skills/crafting/spinning-wheel-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ export const buttonClicked: buttonAction = (details) => {
// Close the widget as it is no longer needed
details.player.closeActiveWidgets();

if (!details.player.skills.hasSkillLevel(Skill.CRAFTING, product.spinnable.requiredLevel)) {
if (!details.player.skills.hasLevel(Skill.CRAFTING, product.spinnable.requiredLevel)) {
details.player.sendMessage(`You need a crafting level of ${product.spinnable.requiredLevel} to craft ${cache.itemDefinitions.get(product.spinnable.output).name.toLowerCase()}.`, true);
return;
}
Expand Down
6 changes: 3 additions & 3 deletions src/plugins/skills/firemaking-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ const lightFire = (player: Player, position: Position, worldItemLog: WorldItem,

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

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

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

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

if(!canLightFire && (elapsedTicks === 0 || elapsedTicks % 4 === 0)) {
player.playSound(soundIds.lightingFire, 10, 0);
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/skills/skill-guide-plugin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { buttonAction } from '@server/world/actor/player/action/button-action';
import { logger } from '@runejs/logger/dist/logger';
import { logger } from '@runejs/logger';
import { JSON_SCHEMA, safeLoad } from 'js-yaml';
import { readFileSync } from 'fs';
import { ActionType, RunePlugin } from '@server/plugins/plugin';
Expand Down
Loading