reldens
Version:
Reldens - MMORPG Platform
108 lines (100 loc) • 3.87 kB
JavaScript
/**
*
* Reldens - WorldDropHandler
*
* Handles the creation of dropped item objects in the game world, finding walkable positions and spawning drop
* instances.
*
*/
const { Reward } = require('./reward');
const { WorldWalkableNodesAroundProvider } = require('../../world/server/world-walkable-nodes-around-provider');
const { Logger, sc } = require('@reldens/utils');
class WorldDropHandler
{
/**
* @param {Object} targetObjectBody
* @param {Array<Object>} itemRewards
* @param {Object} roomScene
* @returns {Promise<Array<Object>>}
*/
static async createRewardItemObjectsOnRoom(targetObjectBody, itemRewards, roomScene)
{
let closerWalkableNodes = WorldWalkableNodesAroundProvider.generateWalkableNodesAround(targetObjectBody);
let objectPosition = {x: 0, y: 0};
let rewards = [];
for(let itemReward of itemRewards){
await this.createDropItems(
itemReward,
closerWalkableNodes,
objectPosition,
targetObjectBody,
roomScene,
rewards
);
}
return rewards;
}
/**
* @param {Object} itemReward
* @param {Array<Object>} closerWalkableNodes
* @param {Object} objectPosition
* @param {Object} targetObjectBody
* @param {Object} roomScene
* @param {Array<Object>} rewards
* @returns {Promise<Array<Object>>}
*/
static async createDropItems(itemReward, closerWalkableNodes, objectPosition, targetObjectBody, roomScene, rewards)
{
let itemKey = itemReward.item?.key || 'no-key';
Logger.debug('Create drop item ID "'+itemReward.id+'" ('+ itemKey+'): '+itemReward.dropQuantity);
//Logger.debug('Item reward:', itemReward);
for(let i = 0; i < (itemReward.dropQuantity || 1); i++){
if(0 < closerWalkableNodes.length){
objectPosition = closerWalkableNodes.pop();
}
if(!objectPosition){
Logger.error('No closer walkable nodes found for reward ID "'+itemReward.id+'".');
return rewards;
}
rewards.push(await this.createDropItem(
objectPosition,
itemReward,
targetObjectBody,
roomScene,
'drop-' + itemKey + '-' + sc.randomChars(8)
));
}
return rewards;
}
/**
* @param {Object} objectPosition
* @param {Object} itemReward
* @param {Object} targetObjectBody
* @param {Object} roomScene
* @param {string} randomObjectId
* @returns {Promise<Object|boolean>}
*/
static async createDropItem(objectPosition, itemReward, targetObjectBody, roomScene, randomObjectId)
{
let tileIndex = targetObjectBody.world.tileIndexByRowAndColumn(objectPosition.x, objectPosition.y);
let newReward = sc.deepMergeProperties({objectPosition, tileIndex, randomObjectId}, itemReward);
let worldObjectData = {
layerName: newReward.randomObjectId,
tileIndex: newReward.tileIndex,
tileWidth: targetObjectBody.worldTileWidth,
tileHeight: targetObjectBody.worldTileHeight,
x: newReward.objectPosition.x,
y: newReward.objectPosition.y
};
let dropObjectInstance = await roomScene.createDropObjectInRoom(
Reward.createDropObjectData(newReward, roomScene.roomId),
worldObjectData
);
if(!dropObjectInstance){
return false;
}
newReward['dropObjectInstance'] = dropObjectInstance;
return newReward;
}
}
module.exports.WorldDropHandler = WorldDropHandler;