设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 826|回复: 2
打印 上一主题 下一主题

[原创发布] 行吧,也算转MZ了,发个插件玩玩(数据库狂野模式)

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
26074
在线时间
2384 小时
注册时间
2005-10-15
帖子
1168

开拓者

跳转到指定楼层
1
发表于 2026-2-20 05:12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
JAVASCRIPT 代码复制
  1. /*:zh
  2.  * @target MZ
  3.  * @plugindesc 利用备注中的 meta 数据,覆盖数据库对象的原有属性
  4.  * @author SailCat
  5.  * @help WildMetaData.js
  6.  * v 1.0.0
  7.  *
  8.  * 此插件会在数据库对象(如角色、职业、敌人、物品等)加载完成后,
  9.  * 遍历其 meta 对象中的每个键值对。
  10.  * 如果该键名是对象本身已有的属性名,则用 meta 中对应的值覆盖该属性,
  11.  * 若值无法转成原属性所需求的类型,则无事发生。
  12.  * 此插件的意义在于突破编辑器对部分字段的值限制。
  13.  *
  14.  * 例如,在角色的备注中写 <initialLevel:30>,
  15.  * 插件会将 $dataActors[actorId].initialLevel 的值从原来的数字改为 30。
  16.  * 在职业的备注中写 <expParams:[0,100,0,1]>,
  17.  * 插件会将这个职业的经验值曲线改为每级需要固定100点。
  18.  *
  19.  * 注意:覆盖后可能影响游戏平衡,请谨慎使用。
  20.  *
  21.  */
  22.  
  23. (() => {
  24.     'use strict';
  25.  
  26.     // 保存原始的 DataManager.extractArrayMetadata 方法
  27.     const sailcat_mz_DataManager_extractMetaData = DataManager.extractMetadata;
  28.  
  29.     /**
  30.      * 重写 DataManager.onLoad,在处理完数据库对象后应用 meta 覆盖。
  31.      */
  32.     DataManager.extractMetadata = function(data) {
  33.         // 先调用原方法,保证对象的 meta 已经被正确提取
  34.         sailcat_mz_DataManager_extractMetaData.call(this, data);
  35.  
  36.         // 对加载的对象应用 meta 覆盖
  37.         applyMetaOverrides(data);
  38.     };
  39.  
  40.     /**
  41.      * 对单个对象应用 meta 覆盖。
  42.      * @param {Object} obj - 数据库对象(如角色、物品、地图等)
  43.      */
  44.     function applyMetaOverrides(obj) {
  45.         // 如果对象没有 meta 或者 meta 为空,直接返回
  46.         if (!obj || typeof obj !== 'object' || !obj.meta) return;
  47.  
  48.         const meta = obj.meta;
  49.  
  50.         // 遍历 meta 的每个键
  51.         for (const key in meta) {
  52.             if (!meta.hasOwnProperty(key)) continue;
  53.  
  54.             // 检查该键名是否是对象本身的属性(即已存在的属性)
  55.             if (obj.hasOwnProperty(key)) {
  56.                 const originalValue = obj[key];
  57.                 const metaValueStr = meta[key];   // meta 中的值永远是字符串
  58.  
  59.                 // 将字符串转换为与原属性相同的类型
  60.                 const convertedValue = convertValue(originalValue, metaValueStr);
  61.  
  62.                 // 如果转换成功(不是 undefined),则覆盖原属性
  63.                 if (convertedValue !== undefined) {
  64.                     obj[key] = convertedValue;
  65.                 }
  66.             }
  67.         }
  68.     }
  69.  
  70.     /**
  71.      * 将字符串值转换为与原始值相同的类型。
  72.      * @param {*} original - 对象的原属性值
  73.      * @param {string} str - meta 中读取的字符串
  74.      * @returns {*} 转换后的值,如果无法转换则返回 undefined
  75.      */
  76.     function convertValue(original, str) {
  77.         // 根据原始值的类型进行转换
  78.         const type = typeof original;
  79.  
  80.         if (type === 'number') {
  81.             const num = Number(str);
  82.             return isNaN(num) ? undefined : num;
  83.         }
  84.  
  85.         if (type === 'string') {
  86.             return String(str);
  87.         }
  88.  
  89.         if (type === 'boolean') {
  90.             // 常见布尔字符串表示:true/false, 1/0, yes/no, y/n, t/f
  91.             const lower = str.toLowerCase();
  92.             if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 't' || lower === 'y') return true;
  93.             if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'f' || lower === 'n') return false;
  94.             return undefined; // 无法识别
  95.         }
  96.  
  97.         if (Array.isArray(original)) {
  98.             try {
  99.                 // 尝试解析为数组,例如 "[1,2,3]"
  100.                 const parsed = JSON.parse(str);
  101.                 if (Array.isArray(parsed)) return parsed;
  102.             } catch (e) {
  103.                 // 解析失败,忽略
  104.             }
  105.             return undefined;
  106.         }
  107.  
  108.         if (type === 'object' && original !== null) {
  109.             try {
  110.                 // 尝试解析为对象,例如 "{"x":1}"
  111.                 const parsed = JSON.parse(str);
  112.                 if (typeof parsed === 'object' && parsed !== null) return parsed;
  113.             } catch (e) {
  114.                 // 解析失败
  115.             }
  116.             return undefined;
  117.         }
  118.  
  119.         // 对于 null、undefined 或其他无法处理的类型,直接返回 undefined 表示不覆盖
  120.         return undefined;
  121.     }
  122.  
  123. })();
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv3.寻梦者

梦石
0
星屑
2002
在线时间
745 小时
注册时间
2017-10-13
帖子
74
2
发表于 2026-2-20 21:41:32 | 只看该作者
欢迎加入MZ
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1274
在线时间
75 小时
注册时间
2024-5-5
帖子
21
3
发表于 2026-2-21 07:38:32 | 只看该作者
欢迎加入MZ
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2026-6-4 18:27

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表