Skip to content

Commit

Permalink
Merge pull request #167 from rune-js/combat
Browse files Browse the repository at this point in the history
Combat
  • Loading branch information
TheBlackParade committed Jun 9, 2020
2 parents 211a0a9 + 16db8fe commit d381369
Show file tree
Hide file tree
Showing 48 changed files with 914 additions and 216 deletions.
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

0 comments on commit d381369

Please sign in to comment.