骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 1359|回复: 3

[功能与代码] 一个为自己MOD制作会自动识别可选素材DLC包的做法

[复制链接]

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
发表于 2024-9-3 08:25:26 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2024-9-3 14:05 编辑

骑砍这个游戏最大的问题莫过于体积超过2个g,就在崩溃跳出爆缓内存的边缘徘徊。

如果你做的是模组,关卡任务或剧情是递进式的,或者本身有两套不同风格大小但是命名一样的brf素材替换,那我们是不是可以退出游戏,打一个可以覆盖部分原有brf资源的类似DLC的扩展补丁,然后进入游戏战场后进行识别素材的特征变化,进而自动启动相应的代码,省的还要做个界面设置选项教那些看说明一目十行的玩家瞎选。

首先module_scene_props注册spr_proptrans0~spr_proptrans8 这9个场景物体,其中碰撞名称填0,模型名称填spr后面对应的proptrans0~spr_proptrans8。
然后比如现在你游戏有个递进的剧情模式,假设这个剧情的第一节和第二节之间,直接出现了部分国家及对应兵种武器装备素材的完全置换,比如都针对A国,那么第一节剧情你为A国准备的素材brf和第二节,都是E/F/G.brf,里面装备的名称也是一样的,但是外观不一样,特别的,对应到游戏场景战斗中穿这个装备或使用特定器械对应的控制触发器内容也发生了变化,此时你如果不想重命名把brf都堆在一起占内存,想类似DLC扩展包一样后续补充,替换同名文件保持mod体积,就可以这么处理。

在其中一个比如叫E.brf的brf中加入spr_proptrans0~spr_proptrans8 中特定几个场景物体的实体简单模型,然后根据排列组合判断,因为除E.brf外,不再有spr_proptrans0~spr_proptrans8 的实体模型,所以在先module_scene_props注册的spr_proptrans0~spr_proptrans8这些物体如果都在同一个战斗场景刷出来,就会有部分有实体模型,有部分是空模型,而这个就是识别同名同素材名称brf但不同模型外观的关键。利用顶点动画,因为顶点动画有个特征就是,你一旦是空模型的prop,无论你怎么播放,你都是0帧时刻状态。

在mt里(0.000000, 0.000000, 0.000000, 条件写一个参考模板

    (try_begin),
        (get_player_agent_no, ":var_0"),
        (agent_get_slot, ":var_41", ":var_0", 339),                #slot339用于延时,给prop刷出检测其模型外观是否存在留一个间隔时间,避免检测太早出bug
        (try_begin),
            (is_between, ":var_41", 0, 20),
            (store_add, ":var_44", ":var_41", 1),
            (agent_set_slot, ":var_0", 339, ":var_44"),
        (try_end),
    (try_end),                                    


    (try_begin),
        (agent_get_position, pos2, ":var_0"),
        (position_move_z, pos2, -80000),
        (assign, ":var_1", "spr_proptrans9"),                                #为了后续扩展和方便写循环末尾,多加一个spr_proptrans9
        (try_for_range, ":var_2", "spr_proptrans0", ":var_1"),             #把spr_proptrans0~spr_proptrans8都刷一个出来
            (scene_prop_get_num_instances, ":var_3", ":var_2"),
            (eq, ":var_3", 0),
            (set_spawn_position, pos2),
            (spawn_scene_prop, ":var_2"),
            (scene_prop_set_visibility, reg0, 0),
            (2610, reg0, 500),                                               #强制初始化顶点动画帧时刻至500
        (try_end),
        (try_begin),
            (agent_slot_eq, ":var_0", 339, 20),
            (scene_prop_get_instance, ":var_4", "spr_proptrans0", 0),
            (scene_prop_get_instance, ":var_5", "spr_proptrans1", 0),
            (scene_prop_get_instance, ":var_6", "spr_proptrans2", 0),
            (scene_prop_get_instance, ":var_7", "spr_proptrans3", 0),
            (scene_prop_get_instance, ":var_8", "spr_proptrans4", 0),
            (scene_prop_get_instance, ":var_9", "spr_proptrans5", 0),
            (scene_prop_get_instance, ":var_10", "spr_proptrans6", 0),
            (scene_prop_get_instance, ":var_11", "spr_proptrans7", 0),
            (scene_prop_get_instance, ":var_12", "spr_proptrans8", 0),
            (2616, ":var_13", ":var_4"),
            (2616, ":var_14", ":var_5"),
            (2616, ":var_15", ":var_6"),
            (2616, ":var_16", ":var_7"),
            (2616, ":var_17", ":var_8"),
            (2616, ":var_18", ":var_9"),
            (2616, ":var_19", ":var_10"),
            (2616, ":var_20", ":var_11"),
            (2616, ":var_21", ":var_12"),
            (try_begin),
                (eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp0"),                 #如果检测到spr_proptrans0~spr_proptrans8都是空模型,启动脚本roletemp0
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp1"),                    #如果检测到spr_proptrans0~spr_proptrans8,只有proptrans0不是空模型,启动脚本roletemp1,后面类似,至于脚本里写什么,你可以是一段触发过程,也可以是对该DLC扩展内容的初始化定性。
            (else_try),
                (neg|eq, ":var_13", 0),
                (neg|eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp2"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (neg|eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp3"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (neg|eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp4"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (neg|eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp5"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (neg|eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp6"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (neg|eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp7"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (neg|eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp8"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (eq, ":var_15", 0),
                (eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (neg|eq, ":var_21", 0),
                (call_script, "script_roletemp9"),
            (else_try),
                (neg|eq, ":var_13", 0),
                (eq, ":var_14", 0),
                (neg|eq, ":var_15", 0),
                (neg|eq, ":var_16", 0),
                (eq, ":var_17", 0),
                (eq, ":var_18", 0),
                (eq, ":var_19", 0),
                (eq, ":var_20", 0),
                (eq, ":var_21", 0),
                (call_script, "script_roletemp10"),
            (try_end),
        (try_end),
    (try_end),




################################################################
此外,类似的,还有一个类似的判定方法,之前帖子介绍过,但没写代码示例,这次也不写了,简单说一下,就是碰撞体高度,假如你把spr_proptrans0的板子碰撞的z轴进行放大,然后场景里利用to terrain和to ground level两种获取坐标高度值的op,两个高度值做差,就可以得到碰撞体的高度,,这样依据特征场景物碰撞体高度作为区分条件,判定brf所属DLC素材包,但是呢,这个做法如果你场景里碰撞体情况比较复杂,就要慎重考虑。


360截图20240903082458774.jpg
360截图20240903082554998.jpg

212

主题

1032

回帖

1048

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14847
精华
0
互助
93
荣誉
21
贡献
325
魅力
1382
注册时间
2017-11-5
鲜花(431) 鸡蛋(0)
 楼主| 发表于 2024-9-3 08:36:50 | 显示全部楼层
本帖最后由 vegetto 于 2024-9-3 10:03 编辑

也许你们可能比较难理解为什么我这些功能角度比较奇怪,不是正常mod用的。确实,为什么我会想这个功能。是我部分模组大量使用了顶点动画作为主角的动画机制,而顶点动画要达到模型外观及动画平滑度的双重保证,就常常接近或突破100MB,这对游戏是一个不稳定的存在。

10个以内都还好,超过10个,坐等跳出。所以比如我的魔兽争霸和七龙珠模组来说,算了,就拿魔兽争霸,主角,每个种族的战车、飞龙加起来(战场限制4个每种特殊兵),这时候这种动画人的存在已经饱和了,而且不是不加载就没问题,如果我brf里多留几个不同时加载的这种模型,会提高这种不稳定的阈值。
所以我才考虑到,比如有些老游戏,就像cs一样,他们早期加人物是不好随便扩充人物的数量的,而只能打补丁占原有人员的位置,而且很多开放性比较低的游戏也有类似情况。
所以通过同样的A brf,同样是A brf里面的aaa模型,但是模型外观和动画不一样。这种具备同名覆盖但是模型动画数据不同的资源,利用空模型顶点动画检测方法,识别后,立即判定出你目前的游戏版本或剧情进程已经改变,或者是剧情进程改变时提示你打扩展补丁,再次进入已经自动识别出你打了扩展补丁。这样mod就可以在不堆积内存体积的前提下无限水平扩展,自己给自己做DLC,并且不担心冲突,和玩家瞎选设置选错剧本模式或者甚至还要玩家去自己调txt的问题。而且也不影响你把原始备份brf素材打回去继续识别启用默认代码。

缺点就是,每次打DLC扩展补丁后,你需要从大地图先进入任意场景类似识别一下“版本号”,当系统判定你上次记录的版本特征和本次不一样时,立即转接脚本,运行DLC自身在代码中预设的功能内容。

此外,注意,要达到素材等价替换但不同效果功能的的最佳情况,不仅仅是brf素材的替换,还要规范brf素材中对应的材质贴图名称,使得也能不同DLC中将模型贴图一并等效替换掉,避免贴图也堆积提高mod体积。

------

所以偏门的操作和mod题材,发展到极端,稍微会有一些奇怪的做法和感悟





---

29

主题

738

回帖

565

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1748
精华
0
互助
67
荣誉
0
贡献
0
魅力
6
注册时间
2022-2-3
鲜花(57) 鸡蛋(0)
发表于 2024-9-3 09:03:50 来自手机 | 显示全部楼层
好汉好。来自: Android客户端

26

主题

804

回帖

399

积分

骑士

民间工匠

Rank: 4Rank: 4

UID
1115705
第纳尔
4062
精华
0
互助
26
荣誉
2
贡献
0
魅力
30
注册时间
2012-12-13
鲜花(235) 鸡蛋(10)
发表于 2024-9-3 12:39:13 | 显示全部楼层
功能很好,感谢老彼得的分享

但是,问题并不是文件超过多大的大小,而是有没有做优化
多半是因为载入资源太多才爆的,所以可以勾选“在需要时再载入纹理”,这样就不会撑死一个单核运行的老程序了(而且还有系统默认的内存保护,你不解除限制它就一直存在)

还有个题外话,如果贴图用非正方形的贴图,这会导致在加载贴图的时候强制拉伸贴图,这也是资源优化的问题之一
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 08:46 , Processed in 0.126397 second(s), 24 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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