isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
73 lines (72 loc) • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ItemPickupDetection = void 0;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const ModCallbackCustom_1 = require("../../../enums/ModCallbackCustom");
const playerDataStructures_1 = require("../../../functions/playerDataStructures");
const players_1 = require("../../../functions/players");
const types_1 = require("../../../functions/types");
const PickingUpItem_1 = require("../../../types/PickingUpItem");
const DefaultMap_1 = require("../../DefaultMap");
const Feature_1 = require("../../private/Feature");
const v = {
run: {
playersPickingUpItemMap: new DefaultMap_1.DefaultMap(() => (0, PickingUpItem_1.newPickingUpItem)()),
},
};
class ItemPickupDetection extends Feature_1.Feature {
v = v;
postItemPickup;
preItemPickup;
constructor(postItemPickup, preItemPickup) {
super();
this.customCallbacksUsed = [
[
ModCallbackCustom_1.ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED,
this.postPEffectUpdateReordered,
],
];
this.postItemPickup = postItemPickup;
this.preItemPickup = preItemPickup;
}
// ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED
postPEffectUpdateReordered = (player) => {
const pickingUpItem = (0, playerDataStructures_1.defaultMapGetPlayer)(v.run.playersPickingUpItemMap, player);
if (player.IsItemQueueEmpty()) {
this.queueEmpty(player, pickingUpItem);
// If a player enters a room with a trinket next to the entrance, the player will pick up the
// trinket, but it will not become queued (it will be deposited into their inventory
// immediately). Since we don't know what type of item the player is holding, don't account
// for this bug.
}
else {
this.queueNotEmpty(player, pickingUpItem);
}
};
queueEmpty(player, pickingUpItem) {
if (pickingUpItem.itemType === isaac_typescript_definitions_1.ItemType.NULL
|| (0, types_1.asNumber)(pickingUpItem.subType) === 0) {
return;
}
this.postItemPickup.fire(player, pickingUpItem);
(0, PickingUpItem_1.resetPickingUpItem)(pickingUpItem);
}
queueNotEmpty(player, pickingUpItem) {
const queuedItem = player.QueuedItem.Item;
if (queuedItem === undefined || queuedItem.Type === isaac_typescript_definitions_1.ItemType.NULL) {
// This should never happen, since the `EntityPlayer.IsItemQueueEmpty` method returned false.
return;
}
if (queuedItem.Type !== pickingUpItem.itemType
|| queuedItem.ID !== pickingUpItem.subType) {
// Record which item we are picking up.
pickingUpItem.itemType = queuedItem.Type;
pickingUpItem.subType = queuedItem.ID;
const shouldBeGranted = this.preItemPickup.fire(player, pickingUpItem);
if (shouldBeGranted === false) {
(0, players_1.dequeueItem)(player);
}
}
}
}
exports.ItemPickupDetection = ItemPickupDetection;