Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/world/mob/player/action/input-command-action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,15 @@ const commands: { [key: string]: commandHandler } = {

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ::move command was previously crashing due to the new object chunk packets. This fixes it.

const newChunk = world.chunkManager.getChunkForWorldPosition(player.position);

player.updateFlags.mapRegionUpdateRequired = true;
player.lastMapRegionUpdatePosition = player.position;

if(!oldChunk.equals(newChunk)) {
oldChunk.removePlayer(player);
newChunk.addPlayer(player);
player.chunkChanged(newChunk);
player.packetSender.updateCurrentMapChunk();
}

player.updateFlags.mapRegionUpdateRequired = true;
},

give: (player: Player, args: string[]) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import { Position } from '@server/world/position';
import { directionData, WNES } from '@server/world/direction';
import { world } from '@server/game-server';
import { Chunk } from '@server/world/map/chunk';
import { objectAction, ObjectActionPlugin } from '@server/world/mob/player/action/object-action/object-action';

const objectIds = [1530, 4465, 4467, 3014, 3017, 3018, 3019, 1536, 1537, 1533, 1531, 1534, 12348];

// @TODO move to yaml config
const doors = [
Expand Down Expand Up @@ -47,7 +50,7 @@ const rightHingeDir: { [key: string]: string } = {
'EAST': 'SOUTH'
};

export const doorAction = (player: Player, door: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
export const action: objectAction = (player: Player, door: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
player.packetSender.chatboxMessage(`door ${door.objectId}`);
let opening = true;
let doorConfig = doors.find(d => d.closed === door.objectId);
Expand Down Expand Up @@ -84,5 +87,7 @@ export const doorAction = (player: Player, door: LandscapeObject, position: Posi
const replacementDoorChunk = world.chunkManager.getChunkForWorldPosition(endPosition);

world.chunkManager.toggleObjects(replacementDoor, door, endPosition, position, replacementDoorChunk, startDoorChunk, !cacheOriginal);
player.packetSender.playSound(opening ? 328 : 326, 7);
player.packetSender.playSound(opening ? 318 : 326, 7);
};

export default { objectIds, action, walkTo: true } as ObjectActionPlugin;
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import { Position } from '@server/world/position';
import { WNES } from '@server/world/direction';
import { logger } from '@runejs/logger/dist/logger';
import { world } from '@server/game-server';
import { doorAction } from '@server/world/mob/player/action/doors/door-action';
import { action as doorAction } from '@server/world/mob/player/action/object-action/doors/door-action';
import { objectAction, ObjectActionPlugin } from '@server/world/mob/player/action/object-action/object-action';

const objectIds = [1519, 1516, 1517, 1520];

const doubleDoors = [
{
Expand Down Expand Up @@ -35,7 +38,7 @@ const openingDelta = {
}
};

export const doubleDoorAction = (player: Player, door: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
const action: objectAction = (player: Player, door: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
let doorConfig = doubleDoors.find(d => d.closed.indexOf(door.objectId) !== -1);
let doorIds: number[];
let opening = true;
Expand Down Expand Up @@ -92,3 +95,5 @@ export const doubleDoorAction = (player: Player, door: LandscapeObject, position
doorAction(player, door, position, cacheOriginal);
doorAction(player, otherDoor, otherDoorPosition, cacheOriginal);
};

export default { objectIds, action, walkTo: true } as ObjectActionPlugin;
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import { directionData, WNES } from '@server/world/direction';
import { logger } from '@runejs/logger/dist/logger';
import { world } from '@server/game-server';
import { ModifiedLandscapeObject } from '@server/world/map/landscape-object';
import { objectAction, ObjectActionPlugin } from '@server/world/mob/player/action/object-action/object-action';

const objectIds = [1551, 1553, 1552, 1554];

const gates = [
{
Expand All @@ -14,12 +17,14 @@ const gates = [
}
];

export const gateAction = (player: Player, gate: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
// @TODO clean up this disgusting code
const action: objectAction = (player: Player, gate: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
if((gate as ModifiedLandscapeObject).metadata) {
const metadata = (gate as ModifiedLandscapeObject).metadata;

world.chunkManager.toggleObjects(metadata.originalMain, metadata.main, metadata.originalMainPosition, metadata.mainPosition, metadata.originalMainChunk, metadata.mainChunk, true);
world.chunkManager.toggleObjects(metadata.originalSecond, metadata.second, metadata.originalSecondPosition, metadata.secondPosition, metadata.originalSecondChunk, metadata.secondChunk, true);
player.packetSender.playSound(327, 7); // @TODO find correct gate closing sound
} else {
let details = gates.find(g => g.main === gate.objectId);
let clickedSecondary = false;
Expand Down Expand Up @@ -96,11 +101,11 @@ export const gateAction = (player: Player, gate: LandscapeObject, position: Posi
break;
case 'NORTH':
deltaX++;
newY--;
newY++;
break;
case 'SOUTH':
deltaX--;
newY++;
newY--;
break;
}
} else if(hinge === 'RIGHT') {
Expand All @@ -115,15 +120,17 @@ export const gateAction = (player: Player, gate: LandscapeObject, position: Posi
break;
case 'NORTH':
deltaX--;
newY++;
newY--;
break;
case 'SOUTH':
deltaX++;
newY--;
newY++;
break;
}
}

player.packetSender.chatboxMessage(hinge + ' ' + direction);

let leftHingeDirections: { [key: string]: string } = {
'NORTH': 'WEST',
'SOUTH': 'EAST',
Expand Down Expand Up @@ -197,5 +204,8 @@ export const gateAction = (player: Player, gate: LandscapeObject, position: Posi

world.chunkManager.toggleObjects(newHinge, gate, newPosition, position, newHingeChunk, hingeChunk, !cacheOriginal);
world.chunkManager.toggleObjects(newSecond, secondGate, newSecondPosition, gateSecondPosition, newSecondChunk, gateSecondChunk, !cacheOriginal);
player.packetSender.playSound(328, 7); // @TODO find correct gate opening sound
}
};

export default { objectIds, action, walkTo: true } as ObjectActionPlugin;
58 changes: 58 additions & 0 deletions src/world/mob/player/action/object-action/object-action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { Player } from '@server/world/mob/player/player';
import { LandscapeObject } from '@runejs/cache-parser';
import { Position } from '@server/world/position';

import doorAction from '@server/world/mob/player/action/object-action/doors/door-action';
import doubleDoorAction from '@server/world/mob/player/action/object-action/doors/double-door-action';
import gateAction from '@server/world/mob/player/action/object-action/doors/gate-action';
import { walkToAction } from '@server/world/mob/player/action/action';

/**
* The definition for an object action function.
*/
export type objectAction = (player: Player, landscapeObject: LandscapeObject, position: Position, cacheOriginal: boolean) => void;

/**
* Defines an object interaction plugin.
* A list of object ids that apply to the plugin, the action to be performed, and whether or not the player must first walk to the object.
*/
export interface ObjectActionPlugin {
objectIds: number[];
action: objectAction;
walkTo: boolean;
}

/**
* A directory of all object interaction plugins.
* When making a new object interaction, it needs to follow the same format and be listed here.
*/
export const objectInteractions: ObjectActionPlugin[] = [
doorAction,
doubleDoorAction,
gateAction
];

// @TODO priority and cancelling other (lower priority) actions
export const objectAction = (player: Player, landscapeObject: LandscapeObject, position: Position, cacheOriginal: boolean): void => {
// Find all object action plugins that reference this landscape object
const interactionPlugins = objectInteractions.filter(plugin => plugin.objectIds.indexOf(landscapeObject.objectId) !== -1);

if(interactionPlugins.length === 0) {
player.packetSender.chatboxMessage(`Unhandled object interaction: ${landscapeObject.objectId} @ ${position.x},${position.y},${position.level}`);
return;
}

// Separate out walk-to actions from immediate actions
const walkToPlugins = interactionPlugins.filter(plugin => plugin.walkTo);
const immediatePlugins = interactionPlugins.filter(plugin => !plugin.walkTo);

// Make sure we walk to the object before running any of the walk-to plugins
if(walkToPlugins.length !== 0) {
walkToAction(player, position).then(() => walkToPlugins.forEach(plugin => plugin.action(player, landscapeObject, position, cacheOriginal)));
}

// Immediately run any non-walk-to plugins
if(immediatePlugins.length !== 0) {
immediatePlugins.forEach(plugin => plugin.action(player, landscapeObject, position, cacheOriginal));
}
};
4 changes: 2 additions & 2 deletions src/world/mob/player/packet/impl/npc-interaction-packet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { RsBuffer } from '@server/net/rs-buffer';
import { world } from '@server/game-server';
import { World } from '@server/world/world';
import { npcAction } from '@server/world/mob/player/action/npc-action';
import { walkToAction } from '@server/world/mob/player/action/action';

export const npcInteractionPacket: incomingPacket = (player: Player, packetId: number, packetSize: number, packet: RsBuffer): void => {
const npcIndex = packet.readUnsignedShortLE();
Expand All @@ -26,7 +27,6 @@ export const npcInteractionPacket: incomingPacket = (player: Player, packetId: n
if(distance === 1) {
npcAction(player, npc);
} else {
// @TODO wait for the player to finish walking to their target
npcAction(player, npc);
walkToAction(player, npc.position).then(() => npcAction(player, npc));
}
};
19 changes: 2 additions & 17 deletions src/world/mob/player/packet/impl/object-interaction-packet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,7 @@ import { Player } from '../../player';
import { RsBuffer } from '@server/net/rs-buffer';
import { Position } from '@server/world/position';
import { world } from '@server/game-server';
import { doorAction } from '@server/world/mob/player/action/doors/door-action';
import { walkToAction } from '@server/world/mob/player/action/action';
import { doubleDoorAction } from '@server/world/mob/player/action/doors/double-door-action';
import { gateAction } from '@server/world/mob/player/action/doors/gate-action';

const doors = [1530, 4465, 4467, 3014, 3017, 3018, 3019, 1536, 1537, 1533, 1531, 1534, 12348];
const doubleDoors = [1519, 1516, 1517, 1520];
const gates = [1551, 1553, 1552, 1554];
import { objectAction } from '@server/world/mob/player/action/object-action/object-action';

export const objectInteractionPacket: incomingPacket = (player: Player, packetId: number, packetSize: number, packet: RsBuffer): void => {
const x = packet.readNegativeOffsetShortBE();
Expand All @@ -35,13 +28,5 @@ export const objectInteractionPacket: incomingPacket = (player: Player, packetId
return;
}

if(doors.indexOf(objectId) !== -1) {
walkToAction(player, objectPosition).then(() => doorAction(player, chunkObject, objectPosition, cacheOriginal));
} else if(doubleDoors.indexOf(objectId) !== -1) {
walkToAction(player, objectPosition).then(() => doubleDoorAction(player, chunkObject, objectPosition, cacheOriginal));
} else if(gates.indexOf(objectId) !== -1) {
walkToAction(player, objectPosition).then(() => gateAction(player, chunkObject, objectPosition, cacheOriginal));
} else {
player.packetSender.chatboxMessage(`Unhandled object interaction: ${objectId} @ ${x},${y}`);
}
objectAction(player, chunkObject, objectPosition, cacheOriginal);
};