扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 83|回复: 0

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

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    7 天前
  • 签到天数: 174 天

    连续签到: 1 天

    [LV.7]常住居民III

    2563

    主题

    691

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    16443
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    19725

    灌水之王

    发表于 昨天 05:16 | 显示全部楼层 |阅读模式
    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. * 例如,在角色的备注中写 ,
    15. * 插件会将 $dataActors[actorId].initialLevel 的值从原来的数字改为 30。
    16. * 在职业的备注中写 ,
    17. * 插件会将这个职业的经验值曲线改为每级需要固定100点。
    18. *
    19. * 注意:覆盖后可能影响游戏平衡,请谨慎使用。
    20. *
    21. */
    22. (() => {
    23.     'use strict';
    24.     // 保存原始的 DataManager.extractArrayMetadata 方法
    25.     const sailcat_mz_DataManager_extractMetaData = DataManager.extractMetadata;
    26.     /**
    27.      * 重写 DataManager.onLoad,在处理完数据库对象后应用 meta 覆盖。
    28.      */
    29.     DataManager.extractMetadata = function(data){
    30.         // 先调用原方法,保证对象的 meta 已经被正确提取
    31.         sailcat_mz_DataManager_extractMetaData.call(this, data);
    32.         // 对加载的对象应用 meta 覆盖
    33.         applyMetaOverrides(data);
    34.     };
    35.     /**
    36.      * 对单个对象应用 meta 覆盖。
    37.      * @param {Object} obj - 数据库对象(如角色、物品、地图等)
    38.      */
    39.     function applyMetaOverrides(obj){
    40.         // 如果对象没有 meta 或者 meta 为空,直接返回
    41.         if(!obj || typeof obj !== 'object' || !obj.meta)return;
    42.         const meta = obj.meta;
    43.         // 遍历 meta 的每个键
    44.         for(const key in meta){
    45.             if(!meta.hasOwnProperty(key))continue;
    46.             // 检查该键名是否是对象本身的属性(即已存在的属性)
    47.             if(obj.hasOwnProperty(key)){
    48.                 const originalValue = obj[key];
    49.                 const metaValueStr = meta[key];   // meta 中的值永远是字符串
    50.                 // 将字符串转换为与原属性相同的类型
    51.                 const convertedValue = convertValue(originalValue, metaValueStr);
    52.                 // 如果转换成功(不是 undefined),则覆盖原属性
    53.                 if(convertedValue !== undefined){
    54.                     obj[key] = convertedValue;
    55.                 }
    56.             }
    57.         }
    58.     }
    59.     /**
    60.      * 将字符串值转换为与原始值相同的类型。
    61.      * @param {*} original - 对象的原属性值
    62.      * @param {string} str - meta 中读取的字符串
    63.      * @returns {*} 转换后的值,如果无法转换则返回 undefined
    64.      */
    65.     function convertValue(original, str){
    66.         // 根据原始值的类型进行转换
    67.         const type = typeof original;
    68.         if(type === 'number'){
    69.             const num = Number(str);
    70.             return isNaN(num) ? undefined : num;
    71.         }
    72.         if(type === 'string'){
    73.             return String(str);
    74.         }
    75.         if(type === 'boolean'){
    76.             // 常见布尔字符串表示:true/false, 1/0, yes/no, y/n, t/f
    77.             const lower = str.toLowerCase();
    78.             if(lower === 'true' || lower === '1' || lower === 'yes' || lower === 't' || lower === 'y')returntrue;
    79.             if(lower === 'false' || lower === '0' || lower === 'no' || lower === 'f' || lower === 'n')returnfalse;
    80.             return undefined; // 无法识别
    81.         }
    82.         if(Array.isArray(original)){
    83.             try{
    84.                 // 尝试解析为数组,例如 "[1,2,3]"
    85.                 const parsed = JSON.parse(str);
    86.                 if(Array.isArray(parsed))return parsed;
    87.             }catch(e){
    88.                 // 解析失败,忽略
    89.             }
    90.             return undefined;
    91.         }
    92.         if(type === 'object' && original !== null){
    93.             try{
    94.                 // 尝试解析为对象,例如 "{"x":1}"
    95.                 const parsed = JSON.parse(str);
    96.                 if(typeof parsed === 'object' && parsed !== null)return parsed;
    97.             }catch(e){
    98.                 // 解析失败
    99.             }
    100.             return undefined;
    101.         }
    102.         // 对于 null、undefined 或其他无法处理的类型,直接返回 undefined 表示不覆盖
    103.         return undefined;
    104.     }
    105. })();
    复制代码

                本帖来自P1论坛作者来自网络,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=498615  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-2-21 00:08 , Processed in 0.139291 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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