站内搜索

搜索
热搜: 活动 交友 discuz

iFAction 世界需要你的想象力!

白嫖MOD的思路和部分代码

10

主题

51

帖子

452

积分

iF村庄

Rank: 5Rank: 5

积分
452
发表于 2020-4-23 23:02:59 | 显示全部楼层 |阅读模式
写在前面:

在看这个帖子之前,我建议你先在资源商店上下载白嫖MOD体验一下,有助于加深理解。毕竟真的是白嫖

然后,这不是零基础教学,而是思路分享。如果你没有任何基础,我建议你先自己做一个MOD。如果您是高手,我恳请您提出宝贵的建议和批评。

最后要说的点,就是在iFAction之前,我没有接触过js,我到现在还是不知道什么时候要打分号。所以这些代码效率不可能高,格式也潦草。如果你和
我的情况差不多,我的代码是没有参考价值的。

以上。


正文:

白嫖MOD,其实就是主要功能就是偷窃,在IFA中实现像刺客信条大革命开箱子或者中国式家长收红包那样的一个功能。
总结一下:靠近一个NPC有可以偷窃的提示,玩一个小游戏,从NPC的商店中获得物品。

用词可能不准确,看官理解就好。

第一步:小游戏
先做小游戏,因为小游戏能够大幅提升游戏的细节体验,除了这个MOD,其他很多功能也能用得上。就算后面失败了也是个好MOD.

我的小游戏是点击屏幕让窄框停在特定区域,因为这很简单。三个精灵,一个精灵当背景,一个精灵当判定区域,随机生成,一个精灵上
下移动,速率可调。三个精灵的x轴宽度都是一样的,然后居中。

    PIao.ss = new IColor(0,191,225,155);   //用drawRect 会更好
    PIao.bb = new ISprite(60,10,PIao.ss);
    PIao.ss = new IColor(190,190,190,165);  //凑合着看吧
    PIao.ll = new ISprite(60,460,PIao.ss);
    PIao.ss = new IColor(84,255,159,155);
    PIao.jj = new ISprite(60,20,PIao.ss);

    PIao.bb.x = RV.NowProject.gameWidth/2;
    PIao.bb.y = 100;
    PIao.bb.z = 99999;    //别忘了图层

    PIao.ll.x = RV.NowProject.gameWidth/2;
    PIao.ll.y = 50;
    PIao.ll.z = 99997;

    PIao.jj.x = RV.NowProject.gameWidth/2;
    PIao.jj.y = rand(70,400);
    PIao.jj.z = 99998;


更改y轴就能上下移动了

    this.update = function(){
        if (PIao.bb.y >= 500){
            times = -1;
            }else if (PIao.bb.y <= 50){
            times = 1;
            }
        PIao.bb.y += PIao.hard * times;  //难度乘方向
        wait += 1;
        if (IInput.down == true && wait > 30) {           //等待30帧,防止玩家手贱
            if (PIao.bb.y >= PIao.jj.y && PIao.bb.y <= PIao.jj.y + 20){        //判定是否在区域内
                PIao.are = true;
                PIao.end = true;
                }else{
                PIao.are = false;
                PIao.end = true;
                };
            };
    };


完事了释放就可以了

第二步:测距离

玩家和触发器的距离。最难的是找数据,不过还是顺藤摸瓜找到了LTrigger

LTrigger = function(trigger , view , mdata , blocks , mapdata)
这个trigger就是DTrigger的实例

所以我们只用这样就能读到了(为了方便)
PIao.LTrigger = LTrigger;

LTrigger = function(trigger , view , mdata , blocks , mapdata){
    PIao.LTrigger.call(this, trigger , view , mdata , blocks , mapdata);

    this.cof = trigger;
    }


剩下的两点距离公式算就可以了,注意触发器坐标要乘上blockSize(也许角色的坐标除以blockSize才是最好的)
        var max_dis = 99999;
        for(i=0;i<RV.NowMap.getEvents().length;i++){          //遍历找出最近的距离和触发器
            var temp_dis = Math.sqrt(Math.pow(RV.NowMap.getEvents().cof.x*RV.NowProject.blockSize-RV.NowMap.getActor().getCharacter().x, 2)+Math.pow(RV.NowMap.getEvents().cof.y*RV.NowProject.blockSize-RV.NowMap.getActor().getCharacter().y,2));  //(a**2+b**2)**0.5
            if(max_dis > temp_dis){
                max_dis = temp_dis;
                temp_tri = RV.NowMap.getEvents();
                };
            };


再绘制提示

        if(max_dis<20 && PIao.playing == false && PIao.can){
            var cc = new IColor(255, 255, 255, 155);
            PIao.white = new ISprite(RV.NowProject.gameWidth/20,RV.NowProject.gameWidth/20,cc);
            PIao.white.x =RV.NowProject.gameWidth - RV.NowProject.gameWidth/6;
            PIao.white.y = 20;
            PIao.white.z = 99990;
            PIao.playing = true;
            }else{
                if (PIao.playing == true){
                    if (max_dis >= 20 || !PIao.can){
                        PIao.white.dispose();
                        PIao.playing = false;
                        PIao.touch = false;
                        huan_chong = 0;      //缓冲
                    };
                };
            };


第三步:玩家玩玩了游戏后的操作

在白嫖MOD里,操作是从商店中拿东西,你的情况不同就改。
在第二步,我们顺便拿到了离我们最近的触发器,检查它的code,读它的event.args,再对每个元素切片。然后我们就会惊奇地发现,直接上RV.GameData.addItem就行了

PIao.areDo = function(tri){
    var take = [];
    for(i=0;i<tri.cof.page.length;i++){
        var nmml = tri.cof.page[0].events.length;      //用这个变量名称是因为我当时很暴躁。。。
        for(k=0;k<nmml;k++){
            if (tri.cof.page.events[k].code == 601){
                take.push(tri.cof.page.events[k].args[rand(0,tri.cof.page.events[k].args.length-1)]);
                i = 99999;
                k = 99999;
            }
        }
    }
    if(take == []){ //如果偷的触发器中没有商店
        var trigger = RV.NowSet.findEventId(PIao.kong);
        if(trigger != null){
            trigger.doEvent();
        }
    }else{
        for(i=0;i<take.length;i++){
            var temp = take.split('|');
            RV.GameData.addItem(temp[0],temp[1],1);
        }
    }
};


同理失败惩罚也是一样的
        var trigger = RV.NowSet.findEventId(PIao.publish);
        if(trigger != null){
            trigger.doEvent();
        }


字变绿了,复制粘贴的结果。。。


最后一步:完善功能和设计触发器


其实还有很多功能可以做,比如根据商品价值,人物等级增加或减少偷窃难度,设置不能被偷窃的NPC,可以偷窃更多的东西,甚至是友军的战利品。。。


我设置了两个触发器,一个是刷新偷窃cd (上面的代码没有,但是确实是有的),一个是弹出小游戏界面,如果胜利,则执行一个通用触发器。但其实你可以设置更多


暂时想到这么多,以后再补充




31

主题

304

帖子

1557

积分

管理员

iFAction缔造者

Rank: 22Rank: 22Rank: 22Rank: 22Rank: 22Rank: 22

积分
1557

iFAction学院校长

发表于 2020-4-23 23:30:44 | 显示全部楼层


大佬竟然这么熟悉默认脚本了啊~

全程除了PIao的命名不是Piao让我很难受以外,逻辑和实现都很nice啊

另外有个小意见:

可以叫做“偷窃MOD”

白嫖MOD,总感觉 emmmm……是教怎么白嫖别人MOD的教学

28

主题

316

帖子

4583

积分

iF世界

次元文明-Original Sin

Rank: 8Rank: 8

积分
4583

摩点支持者内测用户

QQ
发表于 2020-4-23 23:56:13 | 显示全部楼层
6666

14

主题

150

帖子

1906

积分

iF城镇

Rank: 6Rank: 6

积分
1906
发表于 2020-4-24 08:50:34 | 显示全部楼层
我跟你讲,XOXOXOXOXOXOXO..明白了吗?

哈哈哈哈 我就是这个状态   前排支持大佬们的分享!

ifaction一定会越来越精彩的
莫问,问就是在偷懒

0

主题

101

帖子

1048

积分

iF城镇

Rank: 6Rank: 6

积分
1048

摩点支持者

发表于 2020-4-24 17:47:30 | 显示全部楼层
七夕小雨 发表于 2020-4-23 23:30
大佬竟然这么熟悉默认脚本了啊~

全程除了PIao的命名不是Piao让我很难受以外,逻辑和实现都很nic ...

哈哈哈 我也看成了白票mod的教学了,想着这么胆大来官方论坛教网友怎么偷mod

2

主题

10

帖子

47

积分

iF元素粒

Rank: 2

积分
47
QQ
发表于 2020-5-21 11:15:13 | 显示全部楼层
不明觉厉啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们
QQ群:977585123
iFAction下载
Windows客户端
反馈
意见建议
iFAction

iFAction

京ICP备15053274号-1

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.