Skip to content

Commit

Permalink
combination rune craftong
Browse files Browse the repository at this point in the history
  • Loading branch information
Promises committed Oct 17, 2020
1 parent 9ba3a4c commit 2b83e41
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 6 deletions.
22 changes: 22 additions & 0 deletions data/config/item-data.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,28 @@
crush: 0
magic: 0
ranged: 0
- id: 5521
desc: Binding necklace
canTrade: true
weight: 0.010
alchemy:
high: 855
low: 570
equipment:
slot: NECK
bonuses:
offencive:
stab: 0
slash: 0
crush: 0
magic: 0
ranged: 0
defencive:
stab: 0
slash: 0
crush: 0
magic: 0
ranged: 0
- id: 5529
desc: Mind tiara
canTrade: true
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/commands/exp-test-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Skill } from '@server/world/actor/skills';
const action: commandAction = (details) => {
const { player } = details;

player.skills.addExp(Skill.AGILITY, 1000);
player.skills.addExp(Skill.RUNECRAFTING, 1000);
};

export default new RunePlugin({
Expand Down
61 changes: 59 additions & 2 deletions src/plugins/skills/runecrafting/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
*/

import { itemIds } from '@server/world/config/item-ids';
import { Altar, Rune, Talisman, Tiara } from '@server/plugins/skills/runecrafting/types';
import { Altar, CombinationRune, Rune, Talisman, Tiara } from '@server/plugins/skills/runecrafting/types';
import { Position } from '@server/world/position';

export const tiaras: Map<string, Tiara> = new Map<string, Tiara>([
Expand Down Expand Up @@ -296,6 +296,64 @@ export const runes: Map<string, Rune> = new Map<string, Rune>([




export const combinationRunes: Map<string, CombinationRune> = new Map<string, CombinationRune>([
['mist', {
altar: [altars.get('air'), altars.get('water')],
id: 4695,
level: 7,
talisman: [talismans.get('air'), talismans.get('water')],
tiara: [tiaras.get('air'), tiaras.get('water')],
runes: [runes.get('air'), runes.get('water')],
xp: [8.0, 8.5]
}],
['dust', {
id: 4696,
level: 10,
xp: [8.3, 9.0],
altar: [altars.get('air'), altars.get('earth')],
talisman: [talismans.get('air'), talismans.get('earth')],
runes: [runes.get('air'), runes.get('earth')],
tiara: [tiaras.get('air'), tiaras.get('earth')],
}],
['mud', {
id: 4698,
level: 13,
xp: [9.3, 9.5],
altar: [altars.get('water'), altars.get('earth')],
talisman: [talismans.get('water'), talismans.get('earth')],
runes: [runes.get('water'), runes.get('earth')],
tiara: [tiaras.get('water'), tiaras.get('earth')],
}],
['smoke', {
id: 4697,
level: 15,
xp: [8.5, 9.5],
altar: [altars.get('air'), altars.get('fire')],
talisman: [talismans.get('air'), talismans.get('fire')],
runes: [runes.get('air'), runes.get('fire')],
tiara: [tiaras.get('air'), tiaras.get('fire')],
}],
['steam', {
id: 4694,
level: 19,
xp: [9.5, 10.0],
altar: [altars.get('water'), altars.get('fire')],
talisman: [talismans.get('water'), talismans.get('fire')],
runes: [runes.get('water'), runes.get('fire')],
tiara: [tiaras.get('water'), tiaras.get('fire')],
}],
['lava', {
id: 4699,
level: 23,
xp: [10.0, 10.5],
altar: [altars.get('earth'), altars.get('fire')],
talisman: [talismans.get('earth'), talismans.get('fire')],
runes: [runes.get('earth'), runes.get('fire')],
tiara: [tiaras.get('earth'), tiaras.get('fire')],
}]
]);

export function getEntityByAttr<T>(entities: Map<any, T>, attr: string, value: any): T {
let entity = undefined;
const splits = attr.split('.');
Expand Down Expand Up @@ -342,4 +400,3 @@ export function runeMultiplier(runeId: number, level: number): number {
case 560: return 1.0;
}
}

83 changes: 80 additions & 3 deletions src/plugins/skills/runecrafting/runecrafting-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ import { objectAction, ObjectActionDetails } from '@server/world/actor/player/ac
import { Skill } from '@server/world/actor/skills';
import { widgets } from '@server/world/config/widget';
import {
altars,
altars, combinationRunes,
getEntityByAttr,
getEntityIds, runeMultiplier,
runes,
} from '@server/plugins/skills/runecrafting/constants';

import { itemOnObjectAction, ItemOnObjectActionDetails } from '@server/world/actor/player/action/item-on-object-action';
import { CombinationRune } from '@server/plugins/skills/runecrafting/types';
import { randomBetween } from '@server/util/num';
import { itemIds } from '@server/world/config/item-ids';
import { cache } from '@server/game-server';


const craftRune: objectAction = (details: ObjectActionDetails) => {
Expand All @@ -34,13 +38,80 @@ const craftRune: objectAction = (details: ObjectActionDetails) => {
player.skills.addExp(Skill.RUNECRAFTING, (rune.xp * essenceAvailable));
// Update widget items.
player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory);
return ;
return;
}

player.sendMessage(`You do not have any rune essence to bind.`);
};

function getCombinationRuneByAltar(itemId: number, objectId: number): CombinationRune | undefined {
let rune = undefined;
for (const combinationRune of combinationRunes.values()) {
const altarIndex = combinationRune.altar.findIndex((altar) => altar.craftingId === objectId);
if (altarIndex > -1 && combinationRune.talisman[altarIndex ^ 1].id === itemId) {
rune = combinationRune;
break;
}
}
return rune;
}

const craftCombinationRune: itemOnObjectAction = (details: ItemOnObjectActionDetails) => {
const {player, object, item} = details;
const rune = getCombinationRuneByAltar(item.itemId, object.objectId);
if (!rune) {
player.sendMessage('Nothing interesting happens.');
return;
}

const altarIndex = rune.altar.findIndex(altar => object.objectId === altar.craftingId);
const shouldBreakTalisman = randomBetween(0, 1) === 1;
const requiredRunesIndex = player.inventory.findIndex(rune.runes[altarIndex ^ 1].id);
if (requiredRunesIndex < 0) {
player.sendMessage(`You don't have any runes to bind.`);
return;
}
const runeDetails = cache.itemDefinitions.get(rune.id);

const level = player.skills.get(Skill.RUNECRAFTING).level;
if (level < rune.level) {
player.sendMessage(`You need a runecrafting level of ${rune.level} to craft ${runeDetails.name}.`);
return;
}

const essenceAvailable = player.inventory.findAll(itemIds.essence.pure).length;
const requiredRunesAvailable = player.inventory.amountInStack(requiredRunesIndex);
if (essenceAvailable > 0 && requiredRunesIndex > 0) {
const amountToCraft = Math.min(essenceAvailable, requiredRunesAvailable);

// Remove runes from inventory
if (amountToCraft === requiredRunesAvailable) {
player.inventory.remove(requiredRunesIndex, false);
} else {
player.inventory.set(requiredRunesIndex, {
itemId: rune.runes[altarIndex ^ 1].id,
amount: requiredRunesAvailable - amountToCraft
});
}
// Remove essence from inventory.
for (let i = 0; i < amountToCraft; i++) {
player.inventory.removeFirst(itemIds.essence.pure);
}
// Add crafted runes to inventory.
player.inventory.add({itemId: rune.id, amount: amountToCraft});
// Add experience
player.skills.addExp(Skill.RUNECRAFTING, (rune.xp[altarIndex] * essenceAvailable));
if (shouldBreakTalisman) {
player.inventory.removeFirst(item.itemId);
}
// Update widget items.
player.outgoingPackets.sendUpdateAllWidgetItems(widgets.inventory, player.inventory);
player.sendMessage(`You craft some ${runeDetails.name}.`);
return;
}
//
player.sendMessage(`You do not have any pure essence to bind.`);
};


export default new RunePlugin([
Expand All @@ -49,5 +120,11 @@ export default new RunePlugin([
objectIds: getEntityIds(altars, 'craftingId'),
walkTo: true,
action: craftRune
},
{
type: ActionType.ITEM_ON_OBJECT_ACTION,
objectIds: getEntityIds(altars, 'craftingId'),
walkTo: true,
action: craftCombinationRune
}
]);
10 changes: 10 additions & 0 deletions src/plugins/skills/runecrafting/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Item } from '@server/world/items/item';
import { Position } from '@server/world/position';
import { altars, talismans, tiaras } from '@server/plugins/skills/runecrafting/constants';

export interface Recipe {
ingredients: Item[] | number[];
Expand Down Expand Up @@ -34,3 +35,12 @@ export interface Rune {
tiara: Tiara;
talisman: Talisman;
}
export interface CombinationRune {
id: number;
xp: [number, number];
level: number;
altar: [Altar, Altar];
tiara: [Tiara, Tiara];
talisman: [Talisman, Talisman];
runes: [Rune, Rune];
}

0 comments on commit 2b83e41

Please sign in to comment.