mcpepc综合讨论吧 关注:14,707贴子:6,581
  • 11回复贴,共1

[教程]MODPE.JS 转自己的贴

只看楼主收藏回复

首先我们要了解js,js是什么?js全称JavaScript,不过它和java有很大的区别:java是一种专业性的多平台编程语音,是一个老牌的资深编程语音;而JavaScript不一样,它相对比较大众性,容易入门,它一般是用了设置网页和编辑服务器客户端,不过在mcpe中我们有它的其他作用。用来修改程序,也就是MCPE。
js不需要专门的编写工具,如果你愿意的话甚至可以用任何系统自带的记事本,不过我不推荐这样,为了编写方便这里给几个推荐 安卓:920编辑器;los:这个没找到;pc:JavaScript(没错就是这个名字).
为什么要用这些软件呢,它们可以 语法高亮、数行之类的功能。
任何应用商城都可以搜到上面的应用,所以不提供地址了。
js的作用-
js本身是个网页HTML添加动态内容的,不过在mcpe中我们是用来普及mod而出现的,玩过pc的都知道,mc的mod通常是会增加许多方块、添加许多其它的游戏机制和元素;不过,js要简单一些,更多是修改一下游戏的程序而已,不过也不是不可以到达mod的一般效果,不过需要更高的技术。
好的回到正传.第一部分 基本语法
这里,我们了解“if”,“if的中文意思是“如果”
常见格式如下:
if(满足的条件)
{
做出什么
}
我们分析一下:“if”后加“()”是不变的使用方法,和数学中一样,在js中也有“()”“[]”“{}”的,并且也是按照先小括号再中括号再大括号(花括号)的判断顺序。
“满足的条件”就是需要判断的因素;并且如果需要写几个以上的条件,那么需要用“&&”相联接,所以可以吧“&&”理解为“并且”。
然后大家注意“{”和“}”,在js中,我们可以把“{”理解为“那么”、把“}”理解为“完毕”;注意一个很常见又致命的低级错误:“{”和“}”数量不一致,也就是错误的结尾。我们需要死记:前面写了多少“{”后面就必须写多少“}”,不能多也不能少。
还有注意的是其实“{”“}”不一定需要回车,所以这样也行“
if(满足的条件){
做出什么}
不过我不建议这样做,因为这样看起来不简单明了。
. 语法就暂时停止,因为下面我们会从实例中学校语法。
第一部分结束-
第二部分。Hook(钩子).第一节:认识钩子
说到钩子大家第一想到的应该就是加勒比海盗船长手上的铁钩吧?不过这里的钩子不是这样当时其实本质也差不多。
为什么这么说呢?首先我们需要了解Hook。
Hook在js中的钩子是什么意思呢?大家想一想生活中钩子的作用,是不是勾住拉动东西?hokk也一样,它就是拉动下面非Hook的函数的铁钩。
注:这里我把js中的函数分为“hook”类和“非hook类”
“非”当然就是“不是”的意思。
Hook第二节 function
“function”是什么意思?它的中文意思就是“自定义函数模组”的意思,或是说“函数”。“function”是每个js每个部分必须的开头(除文字显示),就是告诉读取js的东西“下面是函数了啊,看清楚点啊!”的意思,不然它哪知道你下面写得什么鸟语。
“function”出现在后面钩子的前面,这样的格式:
function hook(当然不是直接填“hook”这个单词)
{
if( )
{
……
}
}
我们简要分析一下上面的格式
“function”引出下文、hook表情况、“if”辨条件、“{”接下去、“……”做动作、“}”结束
一气呵成不丝毫拖泥带水!
注意的是“hook”是你需要填“在什么情况下触发的钩子”,钩子不可以乱用。比如你把点击方块触发的钩子写成了点击生物触发的钩子的话,那么下面的一切东西都没有原本的意思了,如果你不注意一致还直接出错。
以及在你需要的不同情况下触发的钩子是可以多个的。(“注意”里的东西没看懂也没关系)。
. Hook 第三节:分析“useItem”
我们看到“useItem”
分析一下,“useItem”(为了区分大小写我“I”用的是全角符号)
它是“点击一个方块时触发”的意思。 注意的是一般hook有两个单词组成,比如这里的“use”和“Item”组成,一定记住第二个单词首字母要大写!
Hook是这样的格式(把这个代入)
function useItem(x,y,z,itemId,blockId)
{
if( )
{
……
}
}
我们分析一下 function是必须的开头,useItem表示在点击方块时触发。现在我们注意(x,y,z,itemId,blockId)表示的是存在这些因素。
itemid为手持方块的id,blockid为被点击方块的id。所以我们知道填方块时是填它的id的。
所以这个hook一起就是
function useItem(x,y,z,itemId,blockId)
表示的意思是“在什么坐标处,手持什么点击什么”
需要时照抄便可
现在我们看一个实例:
function useItem(x,y,z,a,b)
{
if(a==280&&b==5)
{
print ("你点击了木板")


让我们分析一下这个js
“useItem(x,y,z,a,b),大家可能会问:怎么是“a”和“b”呢?不应该是itemid和blockid吗?其实这是一种简写,下面的条件判断中也是写a和b,要因素一致。而且如果是你的话写“useItem(x,y,z,XXX,XXX)”都可以,也就是可以自己填,不过对于初学者我不建议这样。
然后看到“if(a==280&&b==5)”,hook内写的是a和b所以也是以a和b为判断因素。“280”和“5”是方块木棍和木板的id。更重要的是“==”,为什么有两个等于呢?通俗的讲:在条件判断中用“==”在变量中用“=”。具体原因是因为表示附值。前面说了“&&”是并且的意思。注意这个js有两个“{”,所以有两个“}”。
如果把这个实例直译一下,就是这样:
“函数 点击方块时触发 存在坐标和手持方块以及被点击方块因素 那么 如果手持id为280的木棍并且被点击的方块id为5 那么 浮窗显示:你点击了木板 完 完
注意:中文的“”()[]{}&&和英文的""()[]{}&&不一样。为了不出错,我强烈建议一直保持英文输入函数和符号等一切;需要写中文的地方最后一起写,之前先空着。
第三部分 第一节:从实例分析来学格式和语法.
实例:
function newLevel()//加载地图时触发
{
print("欢迎来到这个世界")
}
function leaveGame()//离开地图时触发
{
print("再见")

这是一个欢迎语js,“//”后面是我的批注,也就是解释。
分析.为什么这两个钩子后面的括号内没有内容?
因为前面我们讲过的“useItem"后面有内容是因为存在一些hook本身不包含的因素;而这个“newLevel"它自己本身就有了我们想要的“加载地图时触发”的用处,所以后面括号虽然也要写但是为空(“为空是没有的意思,不是空格”)
之所以有两个“function”是因为我们需要在不同的情况下触发,所以“newlevel和“leavegame”的前面都要加“function”声明函数钩子变换
实例:
function useItem(x,y,z,itemId,blockId)
{
if(itemId==280)
{
explode(x,y+10,z,20);//在点击处前十格引发一起半径为20的爆炸
{
clientMessage("爆破!")//聊天信息中添加内容
}
}
}
分析.if之前现象大家都看懂了吧?我们讲一讲if之后。
为什么if内只有一个“itiemid”?因为这个js表达的意思就是“如果用木棍点击任何方块”,所以if内不用在写“blockid”。
那为什么hook内要写?
因为虽然“被点击方块”这个条件不用判断不过却还是一个存在的因素,所以hook的括号内要写,来声明“存在被点击的方块”。
“”explode"是“爆炸”的意思。
爆炸的函数是:
explode(x,y,z,redius)
“redius”是半径的意思
特讲:x,y,z 第三部分第二节
x,y,z会分别存在于hook、if、设置中。分别讲一下:
hook内、作用:声明存在坐标因素。
如:function useItem(x,y,z)
if内:如果if内没有x,y,z表示直接是点击方块的坐标;如果写了X/Y/Z==什么,那么表示必须在指定的位置,比如下面例子中的x=50y==45z==52,就表示只有点击这个坐标的方块才满足条件。
如:if(x==50&&y==45&&z==52)
设置内 如: explpde(x,y+10,z+1)
作用,用来设置坐标处,并且和if内一样“x,y,z"可以做数学运算。和if不同的是它表示直接是点击方块的形式是写“(x,y,z)"而不是不写。
第三节 更多实例
实例.
function modTick()
{
clientMessage("哇哈哈")

我们分析一下:“function modTick()”是每刻(0.05s) 执行一次 的意思;“()”内没有内容的原因上面讲过认真看。
没有判断条件 表示不需要判断直接执行下面的动作。“clientMessage"是表示在聊天消息中添加后面“("")”里的内容。
很明显这是一个刷屏js。
实例.
function attackHokk(attacker,victim)
{
if(attacker==getplayerEnt();&&victim==pig)
{
rideAnimal(player,pig);
{
preventDefault();//阻止原有动作
}
}
}
我们分析一下这个js
钩子是 当点击一个实体时触发 ;“attacker”和“victim"分别是“进行点击的实体”和“被点击的实体”。
再注意“getplayerEnt",它是 获取玩家实体 的意思;所以在需要我们填玩家的实体时就填这个。
看到“preveDefawlt();”,它是 阻止原动作的意思,注意是“原动作”,所以这个js加了这个函数你点击猪就不会对对猪造成伤害了。
这个js的关键词我不讲,注意的是语法。
大家看 阻止原动作 和聊天栏显示之间没有“{”,是我忘写了吗?
好的揭晓答案
|
function leveLeventHook(entity,eventType,x,y,z,data)//当门打开或关闭,当羊吃草,当睡觉时触发
{
if(entity==0&&eventType==9800&&x==0&&y==0&&z==0&&data==0)//睡觉的勘测数据
{
preventDefault();
clientMessage("睡什么狗觉?!")
}
}
|
这里面的
preventDefault();
clientMessage("睡什么狗觉?!")
之所以中间没有“{”
并不是所谓“并立”或者“同时进行”
特讲 :“{”“}”的真正意思
前面说过 “{”在js里的意思可以理解为“那么”“}”理解为“完毕”
可是注意“理解为”,意思就是为了方便理解说要叫做;事实上,”{}“的意思应该是“调用”,它的作用是调用”{“前的函数后的内容,并以”}“结束。
举个例子:
function leveLeventHook(entity,eventType,x,y,z,data)
{
if(entity==0&&eventType==9800&&x==0&&y==0&&z==0&&data==0)
{
这是刚才的js的一部分,我们注意到,hook后有一个“{”,表示调用这个hook后的函数;以就是调用if了。为了避免函数错误,我们要在需要的调用后面写上“}”。
没记住也没关系,理解就行。
所以说 这里:
if(entity==0&&eventType==9800&&x==0&&y==0&&z=


来自Android客户端1楼2014-07-11 16:29回复
    print("BOOM!!!")
    }
    这个部分主要的错误或者是不足点就是爆炸后不需要调用
    第七部分 gui
    第一节 认识gui
    度娘对gui的介绍:
    “图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。GUI 是 Graphical User Interface 的简称,即图形用户界面,通常人机交互图形化用户界面设计经常读做“goo-ee”准确来说 GUI 就是屏幕产品的视觉体验和互动操作部分。GUI 是一种结合计算机科学、美学、心理学、行为学,及各商业领域需求分析的人机系统工程,强调人—机—环境三者作为一个系统进行总体设计。这种面向客户的系统工程设计其目的是优化产品的性能,使操作更人性化,减轻使用者的认知负担,使其更适合用户的操作需求,直接提升产品的市场竞争力。”
    也就是从指令变成图形管理界面的重要突破。
    gui这个函数其实在modpe中是不存在的,gui是我们通过自定义模组儿弄出的
    下面引用一些其他教程的gui格式和批注
    这是一个自定义函数,用于调用java中的android.widget.Toast进行输出,效果与print("")相似,但文本内容完全自定义而不会在前面加上Script ...js...。
    function toast(str){
    var ctx=com.mojang.minecraftpe.MainActivity.currentMainActivity.get()
    ctx.runOnUiThread(new java.lang.Runnable({
    run: function(){
    android.widget.Toast.makeText(ctx,str,0).show()
    }}))}
    写了这个自定义函数后可以用toast("内容")来显示提示信息。
    (事实上现在的启动器可以不写以上这些了,不过保险起还是建议写上)
    var win=null //null的意思为“空”
    function newLevel(){
    var ctx=com.mojang.minecraftpe.MainActivity.currentMainActivity.get()
    ctx.runOnUiThread(new java.lang.Runnable({
    run: function(){
    try{
    var layout = new android.widget.LinearLayout(ctx);
    var button = new android.widget.Button(ctx);
    button.setText("按钮文本");
    button.setOnClickListener(new android.view.View.OnClickListener() {
    onClick: function(v){ //点击按钮执行的内容
    }});
    win=new android.widget.PopupWindow(ctx);
    win.setContentView(button);
    win.setWidth(60);
    win.setHeight(40);
    win.setBackgroundDrawable(new android.graphics.drawable.ColorDrawable(android.graphics.Color.argb(0,0,0,0)))
    win.showAtLocation(ctx.getWindow().getDecorView(),android.view.Gravity.RIGHT | android.view.Gravity.BOTTOM,0,0);
    }catch(err){print(err)}
    }}))
    }
    function leaveGame(){
    var ctx=com.mojang.minecraftpe.MainActivity.currentMainActivity.get()
    ctx.runOnUiThread(new java.lang.Runnable({
    run: function(){
    if(win!=null)win.dismiss()
    win=null
    }}))
    }
    function dip2px(ctx, dips){
    return Math.ceil(dips * ctx.getResources().getDisplayMetrics().density);
    }
    以上内容实现了在右下角显示一个宽60px高40px的按钮。dip2px的作用是将dip转为px(像素)这里没用到。dip是把屏幕宽分为320份,


    来自Android客户端3楼2014-07-11 16:34
    回复
      高分为480份,每份为1 dip。dip2px(ctx,160)代表屏幕宽(横屏时为高)的一半。win.setWidth()
      win.setHeight()
      定义按钮宽,高,单位为像素。new androud.widget.Button(ctx)
      new androud.widget.EditText(ctx)
      new androud.widget.TextView(ctx)
      new androud.widget.CheckBox(ctx)
      分别是新建gui的按钮,输入框,文本,勾选框,可以赋值给变量。
      当然,ctx要先定义。前三个都可以用
      .setOnClickListener(...)
      方法设置点击事件。
      感谢ccz181078提供以上内容(我实在没语言组织了……)
      注意几个地方:
      new是用于创建对象的,
      var 变量名=new 对象名(参数表)
      创建对象。
      菜单中的常用组件:
      按钮androud.widget.Button(ctx)
      输入文本androud.widget.EditText(ctx)
      文本androud.widget.TextView(ctx)
      勾选框androud.widget.CheckBox(ctx)
      实际上你会发现如果你没有任何一门编程语言基础你根本看不懂上面。
      而这里就需要你有一定的安卓和java基础
      gui js实例
      引用:
      function useItem(x,y,z,i,b){
      if(i==259&&b==46){
      preventDefault()
      var ctx=com.mojang.minecraftpe.MainActivity.currentMainActivity.get()
      var ad=android.app.AlertDialog.Builder
      ctx.runOnUiThread(new java.lang.Runnable({
      run: function(){
      try{
      var d=new ad(ctx)
      d.setPositiveButton("确定",new android.content.DialogInterface.OnClickListener(){
      onClick: function(dia,w){
      setTile(x,y,z,0)
      explode(x,y,z,10)
      explode(x,y,z,10)
      }})
      d.setNegativeButton("取消",new android.content.DialogInterface.OnClickListener(){
      onClick: function(dia,w){
      print("已取消")
      }})
      d.setTitle("提示")
      d.setMessage("确定引爆?")
      d.show()
      }catch(e){print(e)}
      }}))
      }
      }
      这是一个完整的js,实现了打火石点tnt时,弹出 确定引爆 对话框,点确认引发大规模爆炸,取消则提示已取消。
      .setTitle设置对话框标题
      .setMessage设置对话框内容
      .setPositiveButton设置确定按钮的文本,点击事件。
      .setNegativeButton设置取消按钮的文本,点击事件。
      由于gui比较难学,我们可以试着去看一下gui的实例,了解格式后先尝试自己修改设置
      后面慢慢摸索就差不多会了
      我也只能对gui帮到这里了
      感谢地址
      http://tieba.baidu.com/p/2927114867
      http://tieba.baidu.com/p/2909267221
      http://tieba.baidu.com/p/2787941913
      还有很多现在没有找到地址了,请作者不要生气,我在心里感谢着你们,谢谢对我的帮助。
      事实上你会发现很多看上去高深的语句、变量,只是把一大堆繁琐而又有规律的函数通过一种东西来省略麻烦的部分而已
      祝大家都可以学会js这门简单的编程语言
      再见!


      来自Android客户端4楼2014-07-11 16:35
      回复
        有些地方没衔接好,大家凑合着吧


        来自Android客户端5楼2014-07-11 16:36
        回复


          来自Android客户端6楼2014-07-11 16:36
          回复
            顶。。。不要问我怎么找到这里的 。


            IP属地:江苏来自Android客户端8楼2014-07-29 20:13
            回复
              看到要记下这么多我都要疯了!


              来自Android客户端9楼2016-08-09 01:04
              收起回复
                大佬知不知道mid能转成js脚本吗,有软件卖吗


                来自Android客户端10楼2020-11-18 21:25
                回复