import { SYSTEM_SOCKET_ID } from "../constants.js"; import { Monnaie } from "../item-monnaie.js"; import { Misc } from "../misc.js"; import { SystemCompendiums } from "../settings/system-compendiums.js"; export class RdDBaseActor extends Actor { static getDefaultImg(itemType) { return game.system.rdd.actorClasses[itemType]?.defaultIcon ?? defaultItemImg[itemType]; } /* -------------------------------------------- */ static init() { Hooks.on("preUpdateItem", (item, change, options, id) => RdDBaseActor.getParentActor(item)?.onPreUpdateItem(item, change, options, id)); Hooks.on("createItem", (item, options, id) => RdDBaseActor.getParentActor(item)?.onCreateItem(item, options, id)); Hooks.on("deleteItem", (item, options, id) => RdDBaseActor.getParentActor(item)?.onDeleteItem(item, options, id)); Hooks.on("updateActor", (actor, change, options, actorId) => actor.onUpdateActor(change, options, actorId)); } static onSocketMessage(sockmsg) { switch (sockmsg.msg) { case "msg_remote_actor_call": return RdDBaseActor.onRemoteActorCall(sockmsg.data, sockmsg.userId); case "msg_reset_nombre_astral": console.log("RESET ASTRAL", game.user.character); game.user.character.resetNombreAstral(); return; } } static remoteActorCall(callData, userId = undefined) { userId = userId ?? Misc.firstConnectedGMId(); if (userId == game.user.id) { RdDBaseActor.onRemoteActorCall(callData, userId); return false; } else { game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_remote_actor_call", data: callData, userId: userId }); return true; } } static onRemoteActorCall(callData, userId) { if (userId == game.user.id) { const actor = game.actors.get(callData?.actorId); if (Misc.isOwnerPlayerOrUniqueConnectedGM(actor)) { // Seul le joueur choisi effectue l'appel: le joueur courant si propriétaire de l'actor, ou le MJ sinon const args = callData.args; console.info(`RdDBaseActor.onRemoteActorCall: pour l'Actor ${callData.actorId}, appel de RdDBaseActor.${callData.method}(`, ...args, ')'); actor[callData.method](...args); } } } static getParentActor(document) { return document?.parent instanceof Actor ? document.parent : undefined } /** * Cet methode surcharge Actor.create() pour ajouter si besoin des Items par défaut: * compétences et monnaies. * * @param {Object} actorData template d'acteur auquel ajouter des informations. * @param {Object} options optionspour customiser la création */ static async create(actorData, options) { // import depuis un compendium if (actorData instanceof Array) { return super.create(actorData, options); } // Création d'un acteur avec des items (uniquement en cas de duplication): pas besoin d'ajouter d'items if (actorData.items) { return await super.create(actorData, options); } if (actorData.type == "personnage") { const competences = await SystemCompendiums.getCompetences(actorData.type); actorData.items = competences.map(i => i.toObject()) .concat(Monnaie.monnaiesStandard()); } else { actorData.items = []; } return super.create(actorData, options); } constructor(docData, context = {}) { if (!context.rdd?.ready) { mergeObject(context, { rdd: { ready: true } }); const ActorConstructor = game.system.rdd.actorClasses[docData.type]; if (ActorConstructor) { if (!docData.img) { docData.img = ActorConstructor.defaultIcon; } return new ActorConstructor(docData, context); } } super(docData, context); } isCreatureEntite() { return this.type == 'creature' || this.type == 'entite'; } isCreature() { return this.type == 'creature'; } isEntite() { return this.type == 'entite'; } isPersonnage() { return this.type == 'personnage'; } isVehicule() { return this.type == 'vehicule'; } getItem(id, type = undefined) { const item = this.items.get(id); if (type == undefined || (item?.type == type)) { return item; } return undefined; } listItems(type = undefined) { return (type ? this.itemTypes[type] : this.items); } filterItems(filter, type = undefined) { return this.listItems(type)?.filter(filter) ?? []; } findItemLike(idOrName, type) { return this.getItem(idOrName, type) ?? Misc.findFirstLike(idOrName, this.listItems(type), { description: Misc.typeName('Item', type) }); } recompute() { } /* -------------------------------------------- */ async onPreUpdateItem(item, change, options, id) { } async onCreateItem(item, options, id) { } async onDeleteItem(item, options, id) { } async onUpdateActor(update, options, actorId) { } getFortune() { return Monnaie.getFortune(this.itemTypes['monnaie']); } async createItem(type, name = undefined) { if (!name) { name = 'Nouveau ' + Misc.typeName('Item', type); } await this.createEmbeddedDocuments('Item', [{ name: name, type: type }], { renderSheet: true }); } canReceive(item) { return false; } }