主站
道具百科
触发器百科
脚本API百科
创作手册
创作功能
其他
Studio百科
功能案例集合
彼得兔 更新时间: 2022-08-18 18:04:26

 

以下内容是脚本实现的简单小功能,可以直接复制粘贴到游戏使用。有编程基础的小伙伴可以复制下来根据需求再做修改。如果想学习脚本、自己写脚本,或者没有编程基础又想修改功能的小伙伴,可参考《lua语言教程》和《迷你世界脚本教程》,不需要任何基础也能学会自己写脚本~

 

<方块玩法>

·每秒钟在(0,0)高度7至(10,10)高度12范围内随机生成一个基石,并且删掉之前生成的:

local x0,y0,z0=0,7,0--范围起点坐标(面朝N,左后下的角)
local x1,y1,z1=10,12,10--范围终点坐标(面朝N,右前上的角)
local x,y,z=nil,nil,nil--随机生成的基石坐标
local function run(e)--创建一个名字为run、入口(参数)为e的盒子(函数)
    if x~=nil then--如果已经有了基石坐标,证明基石已经生成过了一次
        Block:destroyBlock(x,y,z,false)--就把生成的基石破坏掉
    end--结束判断
    x=math.random(x0,x1)--在x0到x1之间随机生成一个数字
    y=math.random(y0,y1)--在y0到y1之间随机生成一个数字
    z=math.random(z0,z1)--在z0到z1之间随机生成一个数字
    Block:setBlockAll(x,y,z,1,0)--在(x,z)高度y的位置生成基石
end--关闭盒子(函数)run
--下面是添加事件,游戏每运行1秒都打开盒子run(执行函数run)
ScriptSupportEvent:registerEvent([=[Game.RunTime]=],run)
 
·玩家点击方块即可破坏并掉落,无需挖掘:

local function pcb(e)--创建一个名字为pcb、入口(参数)为e的盒子(函数)
    --破坏掉位于(e.x,e.z)高度e.y的方块并掉落
    Block:destroyBlock(e.x,e.y,e.z,true)
end--关闭盒子(函数)pcb
--下面是添加事件,每当玩家点击方块都打开盒子pcb(执行函数pcb)
ScriptSupportEvent:registerEvent([=[Player.ClickBlock]=],pcb)
 
·玩家点击南瓜,南瓜就远离一格:

local function pcb(e)--创建一个名字为pcb、入口(参数)为e的盒子(函数)
    --如果入口(参数)表格e中的blockid等于230(被点击的方块id)
    if e.blockid==230 then
        Block:destroyBlock(e.x,e.y,e.z,false)--就破坏掉这个方块
        local r,x,y,z=Actor:getPosition(e.eventobjid)--获取玩家位置
        local dx,dz=x-e.x,z-e.z--计算玩家相对于南瓜的坐标
        --如果玩家在南瓜的东面,就向西一格生成南瓜
        if (dx>0)and(dx>dz)and(dx>-dz) then
            Block:setBlockAll(e.x-1,e.y,e.z,230,0)
        --如果玩家在南瓜的北面,就向南一格生成南瓜
        elseif (dz>0)and(dz>dx)and(dz>-dx) then
            Block:setBlockAll(e.x,e.y,e.z-1,230,0)
        --如果玩家在南瓜的西面,就向东一格生成南瓜
        elseif (dx<0)and(dx<dz)and(dx<-dz) then
            Block:setBlockAll(e.x+1,e.y,e.z,230,0)
        --否则,就向北一格生成南瓜
        else
            Block:setBlockAll(e.x,e.y,e.z+1,230,0)
        end--结束玩家和南瓜方位的判断
    end--结束被点击的方块id的判断
end--关闭盒子(函数)pcb
--下面是添加事件,每当玩家点击方块都打开盒子pcb(执行函数pcb)
ScriptSupportEvent:registerEvent([=[Player.ClickBlock]=],pcb)
 
·在(0,0)到(5,5)范围内,从高度7开始,每隔10秒生成一层岩浆:

local h=7--让h等于7,岩浆面开始上升的初始高度
local function runtime(e)--创建一个名字为runtime、入口(参数)为e的盒子(函数)
    --如果入口(参数)表格e中的second除以10的余数为0
    --也就是游戏每运行10秒钟
    if e.second%10==0 then
       for i=0,5 do--让i从0到5
           for j=0,5 do--让j从0到5
               --在(i,j)高度h的位置生成岩浆
               Block:setBlockAll(i,h,j,5,0)
           end--结束j的循环
       end--结束i的循环
       h=h+1--让高度加1,下次生成岩浆就会升高一层
    end--结束游戏运行时间的判断
end--关闭盒子(函数)runtime
--下面是添加事件,游戏每运行1秒都打开盒子run(执行函数run)
ScriptSupportEvent:registerEvent([=[Game.RunTime]=],runtime)
 
·当方块被挖掘后会立即重新生成:

local function dig(e)--创建一个名字为dig、入口(参数)为e的盒子(函数)
    --在(e.x,e.z)高度e.y的位置生成一个id为e.blockid的方块
    --在这里的意思就是:在被挖掘的方块的位置,生成一个被挖掘的方块
    Block:setBlockAll(e.x,e.y,e.z,e.blockid,0)
end--关闭盒子(函数)dig
--下面是添加事件,每当玩家完成了方块挖掘都会打开盒子dig(执行函数dig)
ScriptSupportEvent:registerEvent([=[Block.Dig.End]=],dig)
 
·玩家挖掘细沙块会随机掉落一个物品:

local function dig(e)--创建一个名字为dig、入口(参数)为e的盒子(函数)
    --如果入口(参数)表格e中的blockid等于106
    --即被挖掉的方块id是106(细沙块)
    if e.blockid==106 then
        --在被挖掘的位置上面一格生成一个掉落物
        --掉落物id是100到1000之间的随机数
        World:spawnItem(e.x,e.y+1,e.z,math.random(100,1000),1)
    end--结束方块id的判断
end--关闭盒子(函数)dig
--下面是添加事件,每当玩家完成了方块挖掘都会打开盒子dig(执行函数dig)
ScriptSupportEvent:registerEvent([=[Block.Dig.End]=],dig)
 
·从(0,0)到(10,10)范围内的方块不可被挖掘,以外的方块不受影响:

local function digb(e)--创建一个名字为digb、入口(参数)为e的盒子(函数)
    --如果入口(参数)表格e中,x在0到10之间,z在0到10之间
    --在这里的意思就是:如果被挖掘的方块位置在(0,0)到(10,10)范围内
    if (e.x>0)and(e.x<10)and(e.z>0)and(e.z<10) then
        --就把当前挖掘方块的玩家设置为“不可破坏方块”
        Player:setActionAttrState(e.eventobjid,8,false)
    else
        --否则就设置为“可以破坏方块”
        Player:setActionAttrState(e.eventobjid,8,true)
    end--结束被挖掘方块坐标的判断
end--关闭盒子(函数)digb
--下面是添加事件,每当玩家开始挖掘方块都会打开盒子digb(执行函数digb)
ScriptSupportEvent:registerEvent([=[Block.Dig.Begin]=],digb)

 

<道具玩法>

·玩家手持石斧头砍果木,会一同挖掉这个果木正上方的10格方块:

local function dig(e)--创建一个名字为dig、入口(参数)为e的盒子(函数)
    --如果入口(参数)表格e中的blockid等于200
    --即被挖掉的方块id是200(果木)
    if e.blockid==200 then
        --获取玩家手持物品的id
        local r,id=Player:getCurToolID(e.eventobjid)
        if id==11002 then--如果手持物品id为11002(石斧头)
            for i=1,10 do--让i从1到10
                --破坏掉被挖掘方块正上方第i格的方块(从1到10)
                Block:destroyBlock(e.x,e.y+i,e.z,true)
            end--结束i的循环
        end--结束玩家手持物品的判断
    end--结束被挖掘方块id的判断
end--关闭盒子(函数)dig
--下面是添加事件,每当玩家完成了方块挖掘都会打开盒子dig(执行函数dig)
ScriptSupportEvent:registerEvent([=[Block.Dig.End]=],dig)
 
·当前地图的所有箱子,只要放入物品都可无限拿取:

local function f(e)--创建一个名字为f、入口(参数)为e的盒子(函数)
    --把入口(参数)表格e里的x,y,z向下取一下整(即舍弃小数部分,只保留整数)
    local x,y,z=math.floor(e.x),math.floor(e.y),math.floor(e.z)
    --给位于(x,z)高度y处(即事件中的位置)的箱子添加被取走的物品
    WorldContainer:addItemToContainer(x,y,z,e.itemid,e.itemnum)
end--关闭盒子(函数)f
--下面是添加事件,每当箱子里有物品被取走都会打开盒子f(执行函数f)
ScriptSupportEvent:registerEvent([=[Backpack.ItemTakeOut]=],f)
 
·玩家手持物品点击红色陶花盆,即可丢掉物品(直接消失):

local function click(e)--创建一个名字为click、入口(参数)为e的盒子(函数)
    local r,id=Block:getBlockID(e.x,e.y,e.z)--获取事件发生位置的方块id
    if id==946 then--如果是946(红色陶花盆)
        r,id=Player:getCurToolID(e.eventobjid)--获取玩家手持物品
        --把玩家手持物品移除一个
        Backpack:removeGridItemByItemID(e.eventobjid,id,1)
    end--结束被点击方块id的判断
end--关闭盒子(函数)click
--下面是添加事件,每当玩家点击方块都会打开盒子click(执行函数click)
ScriptSupportEvent:registerEvent([=[Player.ClickBlock]=],click)
 
·玩家投掷圣诞雪球,会被传送到圣诞雪球落地的位置:

local obj={}--创建一个表格
local function crt(e)--创建一个名字为crt、入口(参数)为e的盒子(函数)
    --如果入口(参数)表格e里的itemit等于12057
    --即投掷物id是12057,圣诞雪球
	if e.itemid==12057 then
        --就把投掷雪球的玩家迷你号存到表格obj里面,名字是投掷物对象id
		obj[e.toobjid]=e.eventobjid
	end--结束投掷物id的判断
end--关闭盒子(函数)crt
--下面是添加事件,每当有玩家投掷物品都会打开盒子crt(执行函数crt)
ScriptSupportEvent:registerEvent([=[Missile.Create]=],crt)
local function hit(e)--创建一个名字为hit、入口(参数)为e的盒子(函数)
    --e.eventobjid在这里就是落地或者击中生物的投掷物的对象id
    --如果表格obj里有以这个对象id为名字的内容
    --也就是这个投掷物是被迷你号为obj[e.eventobjid]的玩家抛出来的
	if obj[e.eventobjid]~=nil then
        --就把这个玩家传送到投掷物的落地点
        Actor:setPosition(obj[e.eventobjid],e.x,e.y,e.z)
        --把表格中的这个投掷物记录删掉(因为投掷物已经落地了)
        obj[e.eventobjid]=nil
	end--结束投掷物主人是否存在的判断
end--关闭盒子(函数)hit
--下面是添加事件,每当有投掷物击中方块或生物都会打开盒子hit(执行函数hit)
ScriptSupportEvent:registerEvent([=[Actor.Projectile.Hit]=],hit)
 
·玩家使用牛仔左轮攻击,会被往反方向推动:

local function pus(e)--创建一个名字为pus、入口(参数)为e的盒子(函数)
    if e.itemid==15002 then--如果玩家使用的道具id是15002(牛仔左轮)
        --获取玩家朝向
        local r,x,y,z=Actor:getFaceDirection(e.eventobjid)
        --给玩家一个反方向的速度
        Actor:appendSpeed(e.eventobjid,-x,-y,-z)
    end--结束道具id的判断
end--关闭盒子(函数)pus
--下面是添加事件,每当玩家使用道具都会打开盒子pus(执行函数pus)
ScriptSupportEvent:registerEvent([=[Player.UseItem]=],pus)
 
·玩家使用牛仔左轮攻击,视角会向上偏移持续0.5秒:

local ps={}--创建一个表格ps,用来储存玩家偏移视角的持续次数
local function pus(e)--创建一个名字为pus、入口(参数)为e的盒子(函数)
    if e.itemid==15002 then--如果玩家使用的道具id是15002(牛仔左轮)
        ps[e.eventobjid]=10--设置当前玩家视角偏移的持续10次
    end--结束道具id的判断
end--关闭盒子(函数)pus
--下面是添加事件,每当玩家使用道具都会打开盒子pus(执行函数pus)
ScriptSupportEvent:registerEvent([=[Player.UseItem]=],pus)
local function r()--创建一个名字为r、没有入口(参数)的盒子(函数)
    for i,a in pairs(ps) do--让i,a分别遍历表格ps里的名字,内容
        if a>0 then--如果a>0,说明玩家i还有偏移视角的次数
            local r,a1=Actor:getFaceYaw(i)--获取玩家i的水平视角
            local r,a2=Actor:getFacePitch(i)--获取玩家i的竖直视角
            --设置玩家i视角向上偏移5度
            Player:rotateCamera(i,a1+180,a2-5)
            ps[i]=ps[i]-1--让玩家i的剩余偏移次数减1
        else--否则(玩家已经没有偏移次数)
            ps[i]=nil--从表格ps中移除玩家i
        end--结束玩家是否还有偏移次数的判断
    end--结束i,a的遍历循环
end--关闭盒子(函数)r
--下面是添加事件,游戏每运行0.05秒都会打开盒子r(执行函数r)
ScriptSupportEvent:registerEvent([=[Game.Run]=],r)
 
·任意玩家使用能量剑,都会给全体玩家添加4级快速生命恢复的buff持续60秒:

local function pus(e)--创建一个名字为pus、入口(参数)为e的盒子(函数)
    if e.itemid==12005 then--如果使用的道具id是12005(能量剑)
        local r,n,as=World:getAllPlayers(-1)--获取当前存档所有玩家
        for i,a in pairs(as) do--让i,a遍历玩家列表
            Actor:addBuff(a,50,4,60*20)--给玩家添加60秒4级回血buff
        end--结束i,a的遍历循环
    end--结束道具id的判断
end--关闭盒子(函数)pus
--下面是添加事件,每当玩家使用道具都会打开盒子pus(执行函数pus)
ScriptSupportEvent:registerEvent([=[Player.UseItem]=],pus)

 

<生物玩法>

·玩家使用钻石剑,在玩家所在位置召唤一只鸡:

local function pus(e)--创建一个名字为pus、入口(参数)为e的盒子(函数)
    if e.itemid==12005 then--如果玩家使用的道具id是12005(钻石剑)
        local r,x,y,z=Actor:getPosition(e.eventobjid)--获取玩家坐标
        World:spawnCreature(x,y,z,3400,1)--在玩家所在坐标生成鸡
    end--结束玩家使用道具的判断
end--关闭盒子(函数)pus
--下面是添加事件,每当玩家使用道具都会打开盒子pus(执行函数pus)
ScriptSupportEvent:registerEvent([=[Player.UseItem]=],pus)
 
·玩家点击生物,生物会变大:

local function cla(e)--创建一个名字为cla、入口(参数)为e的盒子(函数)
    local r,s=Creature:getAttr(e.toobjid,21)--获取被点击生物的模型大小
    --设置被点击生物的模型大小,比之前大0.2倍
    Creature:setAttr(e.toobjid,21,s+0.2)
end--关闭盒子(函数)cla
--下面是添加事件,每当玩家点击生物都会打开盒子cla(执行函数cla)
ScriptSupportEvent:registerEvent([=[Player.ClickActor]=],cla)
 
·任何碰到猪的玩家都会被弹飞:

local function coll(e)--创建一个名字为coll、入口(参数)为e的盒子(函数)
    local r1=Actor:isPlayer(e.eventobjid)--获取碰撞物1是不是玩家
    local r2=Actor:isPlayer(e.toobjid)--获取碰撞物2是不是玩家
    if (r1==0)and(r2~=0) then--如果碰撞物1是玩家,2不是玩家
        p1=e.eventobjid--让p1等于被碰撞的玩家迷你号
        p2=e.toobjid--让p2等于被碰撞的生物对象id
    elseif (r1~=0)and(r2==0) then--如果碰撞物1不是玩家,2是玩家
        p1=e.toobjid--让p1等于被碰撞的玩家迷你号
        p2=e.eventobjid--让p2等于被碰撞的生物对象id
    end--结束碰撞物1和2所属类型的判断
    local r,id=Creature:getActorID(p2)--获取碰撞生物的id
    if id==3402 then--如果是3402(猪)
        Actor:appendSpeed(p1,0,1,0)--就给碰撞的玩家加一个向上的速度
    end--结束碰撞生物类型的判断
end--关闭盒子(函数)coll
--下面是添加事件,每当生物发生碰撞时都会打开盒子coll(执行函数coll)
ScriptSupportEvent:registerEvent([=[Actor.Collide]=],coll)
 
·玩家点击猪,会随机掉落一个物品:

local function cla(e)--创建一个名字为cla、入口(参数)为e的盒子(函数)
    local r,id=Creature:getActorID(e.toobjid)--获取被点击的生物id
    if id==3402 then--如果是3402(猪)
        local r,x,y,z=Actor:getPosition(e.toobjid)--获取被点击的生物坐标
        --在被点击的生物坐标处随机生成一个掉落物,id在100到1000之间
        World:spawnItem(x,y,z,math.random(100,1000),1)
    end--结束被点击生物类型的判断
end--关闭盒子(函数)cla
--下面是添加事件,每当玩家点击生物时都会打开盒子cla(执行函数cla)
ScriptSupportEvent:registerEvent([=[Player.ClickActor]=],cla)
 
·游戏内时间每到白天12点,在所有玩家所在位置生成一只团子:

local function gah(e)--创建一个名字为gah、入口(参数)为e的盒子(函数)
    if e.hour==12 then--如果游戏内时间到了12点
        --获取当前存档所有玩家列表。n是数量,ps是列表
        local r,n,ps=World:getAllPlayers(-1)
        for i=1,n do--让i从1到n
            local r,x,y,z=Actor:getPosition(ps[i])--获取第i个玩家的坐标
            World:spawnCreature(x,y,z,3414,1)--坐标处生成一只团子
        end--结束i的循环
    end--结束游戏内时间的判断
end--关闭盒子(函数)gah
--下面是添加事件,每当游戏内时间到整点时都会打开盒子gah(执行函数gah)
ScriptSupportEvent:registerEvent([=[Game.Hour]=],gah)

 

<对战玩法>

·任何玩家点击其他玩家或生物,立即杀死对方:

local function cla(e)--创建一个名字为cla、入口(参数)为e的盒子(函数)
    --杀死对象id为e.toobjid的生物,这里就是被点击的生物
    Actor:killSelf(e.toobjid)
end--关闭盒子(函数)cla
--下面是添加事件,每当玩家点击生物时都会打开盒子cla(执行函数cla)
ScriptSupportEvent:registerEvent([=[Player.ClickActor]=],cla)
 
·所有玩家的攻击均会使对方被点燃持续30秒:

local function atc(e)--创建一个名字为atc、入口(参数)为e的盒子(函数)
    --给对象id为e.toobjid的生物添加燃烧buff,这里就是被攻击的生物
    Actor:addBuff(e.toobjid,200,2,30*20)
end--关闭盒子(函数)atc
--下面是添加事件,每当玩家攻击命中时都会打开盒子atc(执行函数atc)
ScriptSupportEvent:registerEvent([=[Player.AttackHit]=],atc)
 
·玩家吃下小麦面包,立即获得胜利:

local function pcu(e)--创建一个名字为pcu、入口(参数)为e的盒子(函数)
    if e.itemid==12502 then--如果被消耗的道具id是12502(小麦面包)
        --设置触发事件的玩家获胜
        Player:setGameResults(e.eventobjid,1)
    end--结束消耗道具id的判断
end--关闭盒子(函数)pcu
--下面是添加事件,每当玩家消耗道具都会打开盒子pcu(执行函数pcu)
ScriptSupportEvent:registerEvent([=[Player.ConsumeItem]=],pcu)
 
·任何玩家只要站到基石上就立即死亡:

local function mob(e)--创建一个名字为mob、入口(参数)为e的盒子(函数)
    local r,x,y,z=Actor:getPosition(e.eventobjid)--获取事件中玩家坐标
    local r,id=Block:getBlockID(x,y-1,z)--获取玩家下面一格的方块id
    if id==1 then--如果id等于1(基石)
        Actor:killSelf(e.eventobjid)--杀死事件中的玩家
    end--结束方块id的判断
end--关闭盒子(函数)mob
--下面是添加事件,每当玩家移动一格都会打开盒子mob(执行函数mob)
ScriptSupportEvent:registerEvent([=[Player.MoveOneBlockSize]=],mob)
 
·任何玩家只要站到南瓜上就会立即回满生命值:

local function mob(e)--创建一个名字为mob、入口(参数)为e的盒子(函数)
    local r,x,y,z=Actor:getPosition(e.eventobjid)--获取事件中玩家坐标
    local r,id=Block:getBlockID(x,y-1,z)--获取玩家下面一格的方块id
    if id==230 then--如果id等于230(南瓜)
        local r,hp=Player:getAttr(e.eventobjid,1)--获取玩家最大生命值
        Player:setAttr(e.eventobjid,2,hp)--设置玩家生命值为最大
    end--结束方块id的判断
end--关闭盒子(函数)mob
--下面是添加事件,每当玩家移动一格都会打开盒子mob(执行函数mob)
ScriptSupportEvent:registerEvent([=[Player.MoveOneBlockSize]=],mob)
 
·玩家每放置一个方块,所在队伍加一分:

local function plc(e)--创建一个名字为plc、入口(参数)为e的盒子(函数)
    local r,team=Player:getTeam(e.eventobjid)--获取放置方块的玩家队伍
    Team:addTeamScore(team,1)--给这个队伍加1分
end--关闭盒子(函数)plc
--下面是添加事件,每当玩家放置方块都会打开盒子plc(执行函数plc)
ScriptSupportEvent:registerEvent([=[Block.PlaceBy]=],plc)

 

<游戏玩法>

·玩家长按跳跃会一直上升:

local function pk(e)--创建一个名字为pk、入口(参数)为e的盒子(函数)
    if e.vkey=="SPACE" then--如果被长按的按钮是空格(跳跃)
        Actor:appendSpeed(e.eventobjid,0,1,0)--给玩家向上的速度
    end--结束按钮的判断
end--关闭盒子(函数)pk
--下面是添加事件,每当玩家长按按钮都会打开盒子pk(执行函数pk)
ScriptSupportEvent:registerEvent([=[Player.InputKeyOnPress]=],pk)
 
·所有玩家免疫掉落伤害:

local function pn(e)--创建一个名字为pn、入口(参数)为e的盒子(函数)
    --设置进入游戏的玩家免疫掉落伤害
    Actor:setImmuneType(e.eventobjid,7,true)
end--关闭盒子(函数)pn
--下面是添加事件,每当有玩家进入游戏都会打开盒子pn(执行函数pn)
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.EnterGame]=],pn)
 
·玩家每消耗一个道具,就会获得同样10个道具:

local function pcu(e)--创建一个名字为pcu、入口(参数)为e的盒子(函数)
    --在玩家背包里添加10个被消耗的道具
    Backpack:addItem(e.eventobjid,e.itemid,10)
end--关闭盒子(函数)pcu
--下面是添加事件,每当玩家消耗道具都会打开盒子pcu(执行函数pcu)
ScriptSupportEvent:registerEvent([=[Player.ConsumeItem]=],pcu)
 
·玩家做哭泣的动作,在玩家所在位置正上方10格播放烟花:

local function pac(e)--创建一个名字为pac、入口(参数)为e的盒子(函数)
    if e.act==3 then--如果玩家做的表情是3(哭泣)
        local r,x,y,z=Actor:getPosition(e.eventobjid)--获取玩家坐标
        loc={x=x,y=y+10,z=z}--把坐标上方第10格的位置放进表格loc里
        --在loc坐标处播放声音10564(烟花爆炸)
        World:playSoundEffectOnPos(loc,10564,100,1,false)
        --在玩家坐标上方第10格处播放特效1047(烟花特效)
        World:playParticalEffect(x,y+10,z,1047,1)
    end--结束玩家表情的判断
end--关闭盒子(函数)pac
--下面是添加事件,每当玩家做动作表情都会打开盒子pac(执行函数pac)
ScriptSupportEvent:registerEvent([=[Player.PlayAction]=],pac)
 
·任何玩家放置基石,会立即死亡:

local function plc(e)--创建一个名字为plc、入口(参数)为e的盒子(函数)
    if e.blockid==1 then--如果被放置的方块id是1(基石)
        Actor:killSelf(e.eventobjid)--杀死放置方块的玩家
    end--结束方块id的判断
end--关闭盒子(函数)plc
--下面是添加事件,每当玩家放置方块都会打开盒子plc(执行函数plc)
ScriptSupportEvent:registerEvent([=[Block.PlaceBy]=],plc)
 
·玩家吃下小麦面包获得踏水技能,再次吃下技能取消:

local ps={}--创建表格ps,存放可以踏水的玩家列表
local function pcu(e)--创建一个名字为pcu、入口(参数)为e的盒子(函数)
    if e.itemid==12502 then--如果被消耗的道具id是12502(小麦面包)
        if ps[e.eventobjid]==nil then--如果玩家不在踏水列表里
            ps[e.eventobjid]=1--把玩家加进可踏水列表
        else--否则(玩家已经在踏水列表里)
            ps[e.eventobjid]=nil--就从列表移除该玩家
        end--结束玩家是否已开启踏水的判断
    end--结束被消耗道具的判断
end--关闭盒子(函数)pcu
--下面是添加事件,每当玩家消耗道具都会打开盒子pcu(执行函数pcu)
ScriptSupportEvent:registerEvent([=[Player.ConsumeItem]=],pcu)
local function run()--创建一个名字为run、没有入口(参数)的盒子(函数)
    for i,a in pairs(ps) do--让i,a分别遍历表格ps的名字,内容列表
        local r,x,y,z=Actor:getPosition(i)--获取列表中玩家的坐标
        local r,id=Block:getBlockID(x,y,z)--获取玩家所在坐标处的方块id
        if id==3 then--如果玩家所在位置的方块id是3(水)
            Actor:appendSpeed(i,0,0.1,0)--给玩家加一个向上的速度
        end--结束方块id的判断
    end--结束i,a的遍历循环
end--关闭盒子(函数)run
--下面是添加事件,游戏运行时每0.05秒都会打开盒子run(执行函数run)
ScriptSupportEvent:registerEvent([=[Game.Run]=],run)
 
·当玩家正下方有蓝钻矿石时,弹出提示信息:

local function mob(e)--创建一个名字为mob、入口(参数)为e的盒子(函数)
    local r,x,y,z=Actor:getPosition(e.eventobjid)--获取事件中玩家坐标
    for i=0,math.floor(y) do--让i从0到玩家所在高度
        local r,id=Block:getBlockID(x,i,z)--获取(x,z)高度i处的方块id
        if id==404 then--如果是404(蓝钻矿石)
            --对玩家弹出提示文字
            Player:notifyGameInfo2Self(e.eventobjid,"下方有钻")
        end--结束方块id的判断
    end--结束i的循环
end--关闭盒子(函数)mob
--下面是添加事件,每当玩家移动一格都会打开盒子mob(执行函数mob)
ScriptSupportEvent:registerEvent([=[Player.MoveOneBlockSize]=],mob)
 
·玩家攻击其他玩家或生物,上方显示对方名字和血量信息:

--暂无注释,复制可用。
local ss="
























"
local ps,mt={},3
local function pda(e)
	local p,oid=e.eventobjid,e.toobjid
	local r1,mhp=Actor:getMaxHP(oid)
	local r2,hp=Actor:getHP(oid)
	mhp,hp=math.floor(mhp),math.floor(hp)
	local r3,s=0,""
	r3=Actor:isPlayer(oid)
	if r3==0 then
		r3,s=Player:getNickname(oid)
	else
		r3,s=Creature:getActorName(oid)
	end
	if hp>0 then
        MiniTimer:showTimerTips({p},ps[p][1],"#G"..s.."#n#R剩余血量为:#n#G"..hp.."/"..mhp.."#n"..ss,true)
	else
		MiniTimer:showTimerTips({p},ps[p][1],"#G"..s.."#n#R已被击败!#n"..ss,true)
	end
	ps[p][2]=0
end
ScriptSupportEvent:registerEvent([=[Player.DamageActor]=],pda)
local function pin(e)
	local p=e.eventobjid
	local r,id=MiniTimer:createTimer("t",nil,true)
	MiniTimer:startForwardTimer(id)
	ps[p]={id,0}
end
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.EnterGame]=],pin)
local function pou(e)
	local p=e.eventobjid
	MiniTimer:deleteTimer(ps[p][1])
	ps[p]=nil
end
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.LeaveGame]=],pou)
local function run()
	local i,a=0,0
	for i,a in pairs(ps) do
		if a[2]==mt*20 then
			MiniTimer:showTimerTips({i},a[1],ss,true)
		else
			a[2]=a[2]+1
		end
	end
end
ScriptSupportEvent:registerEvent([=[Game.Run]=],run)
 
·玩家发送聊天消息“回家”,会被传送至出生点:

local function inc(e)--创建一个名字为inc、入口(参数)为e的盒子(函数)
    if e.content=="回家" then--如果玩家发送的消息是“回家”
        Player:teleportHome(e.eventobjid)--传送玩家回出生点
    end--结束玩家消息的判断
end--关闭盒子(函数)inc
--下面是添加事件,每当玩家发送消息都会打开盒子inc(执行函数inc)
ScriptSupportEvent:registerEvent([=[Player.InputContent]=],inc)
 
·玩家点击白色硬砂块,替换为黑色;点击黑色硬砂块,替换为白色:

local function pcb(e)--创建一个名字为pcb、入口(参数)为e的盒子(函数)
    if e.blockid==667 then--如果被点击的方块id是667(白色硬砂块)
        Block:setBlockAll(e.x,e.y,e.z,682,0)--把该位置设置为682
    elseif e.blockid==682 then--如果被点击的方块id是682(黑色硬砂块)
        Block:setBlockAll(e.x,e.y,e.z,667,0)--把该位置设置为667
    end--结束方块id的判断
end--关闭盒子(函数)pcb
--下面是添加事件,每当玩家点击方块都打开盒子pcb(执行函数pcb)
ScriptSupportEvent:registerEvent([=[Player.ClickBlock]=],pcb)
 
·玩家挖掘所有方块都会额外掉落20个:

local function dig(e)--创建一个名字为dig、入口(参数)为e的盒子(函数)
    --在被挖掘的位置上面一格生成20个被挖掘的方块掉落物
    World:spawnItem(e.x,e.y+1,e.z,e.blockid,20)
end--关闭盒子(函数)dig
--下面是添加事件,每当玩家完成了方块挖掘都会打开盒子dig(执行函数dig)
ScriptSupportEvent:registerEvent([=[Block.Dig.End]=],dig)
 
·玩家静止不动超过5秒就会死亡:

local ps={}--创建表格ps,用来存放每个玩家已经保持某种运动状态多少秒的数据
local function pn(e)--创建一个名字为pn、入口(参数)为e的盒子(函数)
    ps[e.eventobjid]={0,0}--初始化玩家数据(运动状态和持续时间)
end
--下面是添加事件,每当有玩家进入游戏都会打开盒子pn(执行函数pn)
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.EnterGame]=],pn)
local function ch(e)--创建一个名字为ch、入口(参数)为e的盒子(函数)
    ps[e.eventobjid]={e.playermotion,0}--刷新玩家数据
end
--下面是添加事件,玩家每次改变运动状态都会打开盒子ch(执行函数ch)
ScriptSupportEvent:registerEvent([=[Player.MotionStateChange]=],ch)
local function run(e)--创建一个名字为run、入口(参数)为e的盒子(函数)
    for i,a in pairs(ps) do--让i,a分别遍历表格ps的列表名字,内容
        a[2]=a[2]+1--把玩家当前运动状态的持续时间加1(秒)
        if (a[1]==0)and(a[2]>5) then--如果玩家持续静止超过5秒钟
            Actor:killSelf(i)--杀死当前玩家
        end
    end--结束i,a的遍历循环
end
--下面是添加事件,游戏每运行1秒都打开盒子run(执行函数run)
ScriptSupportEvent:registerEvent([=[Game.RunTime]=],run)
 
·玩家吃下西瓜片会破坏地面不断掉落,直到至少两格高的空间:

local ps={}--创建表格ps,存放开启掉落的玩家列表
local function pcu(e)--创建一个名字为pcu、入口(参数)为e的盒子(函数)
    if e.itemid==12508 then--如果被消耗的道具id是12508(西瓜片)
        ps[e.eventobjid]=1--把玩家加进掉落列表
    end--结束被消耗道具的判断
end--关闭盒子(函数)pcu
--下面是添加事件,每当玩家消耗道具都会打开盒子pcu(执行函数pcu)
ScriptSupportEvent:registerEvent([=[Player.ConsumeItem]=],pcu)
local function run()--创建一个名字为run、没有入口(参数)的盒子(函数)
    for i,a in pairs(ps) do--让i,a分别遍历表格ps的名字,内容列表
        local r,x,y,z=Actor:getPosition(i)--获取列表中玩家的坐标
        x,y,z=math.floor(x),math.floor(y),math.floor(z)--取整
        Actor:setPosition(i,x+0.5,y,z+0.5)--设置玩家坐标在方块中心
        r,id1=Block:getBlockID(x,y-1,z)--获取玩家脚下第1格的方块id
        r,id2=Block:getBlockID(x,y-2,z)--获取玩家脚下第2格的方块id
        r,id3=Block:getBlockID(x,y-3,z)--获取玩家脚下第3格的方块id
        Block:setBlockAll(x,y-1,z,0,0)--清除玩家脚下第1格的方块
        --如果玩家脚下第1格为空,或第2,3格同时为空
        if (id1==0)or((id2==0)and(id3==0)) then
            ps[i]=nil--就从掉落列表移除玩家(结束玩家的掉落)
        end--结束是否为空的判断
    end--结束i,a的遍历循环
end--关闭盒子(函数)run
--下面是添加事件,游戏运行时每0.05秒都会打开盒子run(执行函数run)
ScriptSupportEvent:registerEvent([=[Game.Run]=],run)
 
·玩家吃下烤鸡腿开启飞行,长按跳跃上升、点击潜行下降;再次吃烤鸡腿关闭飞行:

--暂无注释,复制可用。
local ps={}
local function pn(e)
    ps[e.eventobjid]=0
end
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.EnterGame]=],pn)
local function pus(e)
    local p,it=e.eventobjid,e.itemid
    if it==12519 then
        if ps[p]==0 then
            ps[p]=1
            Actor:addBuff(p,42,1,999999*20)
            Actor:stopBodyEffectById(p,1237)
            Actor:setImmuneType(p,7,true)
            Chat:sendSystemMsg("#R开启飞行!#n",p)
        else
            ps[p]=0
            Actor:removeBuff(p,42)
            Actor:setImmuneType(p,7,false)
            Chat:sendSystemMsg("#R关闭飞行!#n",p)
        end
    end
end
ScriptSupportEvent:registerEvent([=[Player.ConsumeItem]=],pus)
local function r()
    local r,n,as=World:getAllPlayers(-1)
    local i,a=0,0
    for i,a in pairs(as) do
        if ps[a]==1 then
            Actor:appendSpeed(a,0,-0.02,0)
        end
    end
end
ScriptSupportEvent:registerEvent([=[Game.Run]=],r)
local function pk(e)
    local p=e.eventobjid
    if ps[p]==1 then
        if e.vkey=="SPACE" then
            Actor:appendSpeed(p,0,0.4,0)
        elseif e.vkey=="SHIFT" then
            Actor:appendSpeed(p,0,-0.6,0)
        elseif e.vkey=="W" then
            local r,x,y,z=Actor:getFaceDirection(p)
            Actor:appendSpeed(p,x,0,z)
        elseif e.vkey=="S" then
            local r,x,y,z=Actor:getFaceDirection(p)
            Actor:appendSpeed(p,-x,0,-z)
        end
    end
end
ScriptSupportEvent:registerEvent([=[Player.InputKeyDown]=],pk)
ScriptSupportEvent:registerEvent([=[Player.InputKeyOnPress]=],pk)

 

<功能玩法>

·开局对玩家展示对话窗口:

local function start()--创建一个名字为start、没有入口(参数)的盒子(函数)
   Game:msgBox("欢迎进入此地图!")--对玩家展示对话窗口,内容可自行修改
end--关闭盒子(函数)start
--下面这行是添加事件,当游戏开始时打开盒子start (执行函数start)
ScriptSupportEvent:registerEvent([=[Game.Start]=],start)

 

<建筑与场景>

·用基石填充(0,0)高度7至(10,10)高度12的区域:

local x0,y0,z0=0,7,0--范围起点坐标(面朝N,左下后的角)
local x1,y1,z1=10,12,10--范围终点坐标(面朝N,右上前的角)
for i=x0,x1 do--让i从x0到x1
    for j=y0,y1 do--让j从y0到y1
        for k=z0,z1 do--让k从z0到z1
            --下面这行是在(i,k)高度j的位置生成基石的意思
            Block:setBlockAll(i,j,k,1,0)
        end--结束k的循环
    end--结束j的循环
end--结束i的循环
 
·以(0,0)高度7为圆心,在地面上生成一个半径为15的基石圆:

local x0,y0,z0,r=0,7,0,15--圆心坐标(0,0)高度7,半径15
local function inc(x,z)--创建一个名字为inc、入口(参数)为x,z的盒子(函数)
    if (x-x0)^2+(z-z0)^2<=r^2 then--如果(x,z)到圆心的距离小于半径
        return true--就吐出“正确” (返回 真)
    else--否则就
        return false--吐出“错误” (返回 假)
    end--结束判断
end--关闭盒子(函数)inc
for i=x0-r,x0+r do--让i从x0-r到x0+r
    for j=z0-r,z0+r do--让j从z0-r到z0+r
        if inc(i,j) then--把i,j放进盒子inc,如果它吐出的是“正确”
            --就在(i,j)高度y0的位置生成基石
            Block:setBlockAll(i,y0,j,1,0)
        end--结束判断
    end--结束j的循环
end--结束i的循环
 
·以(0,0)高度20为球心,生成一个半径为12的基石球:

local x0,y0,z0,r=0,20,0,12--球心坐标(0,0)高度20,半径12
local function inr(x,y,z)--创建一个名字为inr、入口(参数)为x,y,z的盒子(函数)
    --如果(x,y,z)到球心的距离小于半径
    if (x-x0)^2+(y-y0)^2+(z-z0)^2<=r^2 then
        return true--就吐出“正确” (返回 真)
    else--否则就
        return false--吐出“错误” (返回 假)
    end--结束判断
end--关闭盒子(函数)inr
for i=x0-r,x0+r do--让i从x0-r到x0+r
    for j=y0-r,y0+r do--让j从y0-r到y0+r
        for k=z0-r,z0+r do--让k从z0-r到z0+r
            --把i,j,k放进盒子inr,如果它吐出的是“正确”
            if inr(i,j,k) then
                --就在(i,k)高度j的位置生成基石
                Block:setBlockAll(i,j,k,1,0)
            end--结束判断
        end--结束k的循环
    end--结束j的循环
end--结束i的循环
 
·在高度7的地面上,从(0,0)到(30,30)范围内随机生成100朵荷花

for i=1,100 do--让i从1到100
    local x=math.random(0,30)--x等于0到30之间的一个随机数
    local z=math.random(0,30)--z等于0到30之间的一个随机数
    Block:setBlockAll(x,7,z,250,0)--在(x,z)高度7的位置生成一朵荷花
end--结束i的循环
站点有内容要更新是否更新。
更新
忽略