不到一天,打造自己的 Llama NPC

  • PermaDAO
  • 更新于 2024-08-13 22:19
  • 阅读 333

参与 Llama Land,打造自己的 Llama NPC,攫取平台的红利

1.png


作者: txohyeah

审阅:outprog

来源:内容公会 - 新闻


Llama NPC 的红利

放在开篇,先来讲下我们为什么要开发 Llama NPC!

Llama Land 的流量

这点其实是依托于 Llama Land 的平台获得的红利,为自己的项目导入 Llama Land 的流量。就好像自己发的朋友圈的视频,能看到的只有自己的几个朋友,但是当视频发抖音的时候就有可能被抖音的用户看到。就好像 Llama Lottery NPC 中接入的 Llama Lottery 项目。仅仅 3 天时间,就有近 100 人参与,而参与人次更是已经超过了 200。项目的作者仅仅就发了一个推特,没有做过其他任何推广。对了,题外话,该推特还有幸得到了 Sam 等大佬的转载。

高效的开发体验

在已有项目的基础上,仅仅接入一个 Llama NPC 所需要的开发时间不会超过半天。并且对于项目的验证阶段,甚至等于省去了前端开发、部署等工作,就可以完成自己项目的 MVP 验证。

官方 Quest 奖励

现在官方还对于 Llama Land 平台生态的开发者发布了包括开发 Llama World,Llama NPC,The Best use of Llama coin 在内的 3 个任务,一共提供了 1000 AR 的高额奖励。

接下来我们就来介绍下 Llama Land,这个基于 AO 和 AI 的平台。

什么是 Llama Land 游戏

Llama Land 是一款前沿的大型多人在线(MMO)游戏,它以 AI 技术为核心,构建于先进的 AO 平台之上。这是一款全链游戏,所有的游戏数据与代码都被永久地存储在 Arweave 区块链上。另外,游戏具有超强的可扩展性。基于 Reality Protocol,任何人都可以在 Llama Land 中创建自己的 NPC,甚至是子世界。因此,相较于称之为游戏,我更倾向于把它当作是元宇宙的一次实践。

Reality Protocol 是开发 Llama Land 的底层协议,现在已经完全开源。

Reality Protocal 文档与开源代码:https://github.com/elliotsayes/Reality/blob/main/docs/Reality.md

2.png

一些简单玩法介绍

截至本文撰写的时间。游戏已经允许了前一万名玩家进入游戏,并且开放了新的二万二千个排队的名额。每天可以通过登录来完成每日任务获取一个随机的 Llama coin 奖励。在排队的小伙伴也可以通过每12小时进行一次 Claim,获得 5 Llama coin 的奖励。最重磅的莫过于与 Llama King 进行对话来获取 Llama coin 的奖励,每次对话需要 0.025 个 wAR,每次奖励会按照你提供的 prompt 进行分级。最高有 100 Llama coin 的奖励。其中对 prompt 的分级就是依赖于运行在 AO 上的 AI 进程实现的。

3.png

另外,还有越来越多玩家自定义的 NPC,也可以与他们互动,相信玩法会越来越丰富。比如,Arweave 生态的老牌 swap 应用,已经提供了 Permaswap Llama,可以直接通过该 NPC 在上面换取 Llama coin。也有 Llama Lottery NPC,已经有超过 200 人次参与。

4.png

友情链接:

通过跨链桥获取 wAR:https://aox.arweave.dev/#/beta

Llama Land 强大的扩展性

简单介绍游戏之后,我们接下来进入今天的主题。首先,我们先来介绍下 Llama Land 强大的扩展性。

  1. Llama Land 强大扩展性的基础是 AO,Llama Land 游戏的设计逻辑也是遵循了 Actor Model。正是因为这个超并行计算机的支持,才让这种扩展性成为了可能。
  2. Llama Land 可以支持构建自己的世界。只需要通过画图软件 Tile,画出一个自己心仪的地图。然后再通过一个 AO 进程加载一个实现 Reality Protocal 的 lua 文件(也可以直接加载官方提供的模板 lua 文件),轻轻松松几分钟就可以构建一个自定义的地图。
  3. Llama Land 可以支持玩家自己添加自定义的 NPC。后面会更详细的介绍这块内容。

如何构建自己的 Llama NPC

准备工作

因为 Llama NPC 本质上就是一个 AO Process,因此创建一个 AO Process 是必须的。另外,由于需要移动 NPC,监听一些事件等需求,因此我们需要创建一个支持定时任务的 AO Process。另外,为了业务的方便,我们可以创建带有 sqlite 的 AO Process(这点可选)。

# 创建进程
aos 你NPC的名字 --sqlite --module=GYrbbe0VbHim_7Hi6zrOpHQXrSQz07XNtwCnfbFo2I0 --cron 5-minutes

# 打开定时监听
.monitor

注册自己的 Llama NPC

-- 选择自己 NPC 需要注册的地图,这里示例中就是 Llama Land 的 Process Id
TARGET_WORLD_PID = TARGET_WORLD_PID or "9a_YP6M7iN7b6QUoSvpoV3oe3CqxosyuJnraCucy5ss"

-- 判断是否已经注册
if HasReg == false then
  Register()
  HasReg = true
end

function Register()
  ao.send({
      Target = TARGET_WORLD_PID,
      Tags = {
        Action = "Reality.EntityCreate",
      },
      Data = json.encode({
          Type = "Avatar",
          Metadata = {
            DisplayName = "你的 NPC 名称",
            SkinNumber = 1,
            Interaction = {
              Type = 'SchemaExternalForm',
              Id = '表单弹框的标题'
            },
          },
        }),
    })
end

Action = "Reality.EntityCreate" 这个 Action 就是注册自己 NPC 的句柄。如果自己创建了,那么在执行就会更新这个 NPC。

Data 里面存在很多的字段,具体含义如下,

  • Type 可以是 Avatar、Hidden、Unknow
  • Avatar 是一个 user 或者是一个 AO Process
  • Hidden 是一个不可见的实体,比如可以用作地图上的传送点
  • Unknow 则会忽略该实体
  • DisplayName 是显示在 Llama NPC 上的名字
  • SkinNumber 可选的皮肤。有 0~9 一共 10 个数字可选,分别对应 10 种不同的 Llama 皮肤。另外,目前已经支持通过 Arweave 上的 txId,以后 Llama Land 可以容纳下更多玩家的创意了。例如,PlayerSpriteTxId = '0WFjH89wzK8XAA1aLPzBBEUQ1uKpQe9Oz_pj8x1Wxpc' 是官方提供的一个新的皮肤。
  • Interaction 是交互方式,包含 4 种交互方式
  • Default(默认):当点击 Llama NPC 的时候会像点击它的玩家发送一条消息。
  • Warp:用作传送点,传送到其他地图
  • Schema:允许玩家基于表单的方式,向 Llama NPC 发送一条消息。
  • SchemaExternalForm:允许玩家基于表单的方式,向指定的一个进程发送一条消息。这个特性就非常有用了,可以把玩家自己开发的各种应用集成到 Llama Land 中。文中提到的 Permaswap NPC 以及 Llama Lottery NPC 均是基于这个特性完成的。

Llama NPC 的移动以及自定义交互

如果 Llama NPC 被注册到地图中以后,长时间没有交互信息,那么 Llama NPC 就会从地图中下线。如果你想要让自己的 Llama NPC 在地图上持续存在,一般有两种方式:

  1. 定时发送 Action 为 Reality.EntityFix 的消息,适用于 Llama NPC 需要固定某个位置的场景。
ao.send({
  Target = TARGET_WORLD_PID,
  Tags = {
    Action = 'Reality.EntityFix',
  },
})
  1. 让 Llama NPC 不断的在一个小范围内移动。个人更推荐这个方法,因为当地图上玩家很多的时候,可能会把自己的 Llama NPC 挡住,不断的移动可以避免玩家无法点中自己的 Llama NPC。
ao.send({
    Target = TARGET_WORLD_PID,
    Tags = {
      Action = "Reality.EntityUpdatePosition",
    },
    Data = json.encode({
      Position = {
        math.random(-3, 3),
        math.random(12, 15),
      },
    }),
})

SchemaExternalForm 交互模式

  1. 点击 Llama NPC 的时候会去匹配 Process 中加载的 Action 为 SchemaExternal 的 Handler
  2. 接下去需要向点击 Llama NPC 的玩家发送一条消息。Tags
  3. 发送消息的格式需要符合对应的格式,以下是这种交互下的参数解释与代码示例。(示例代码中 Lottery = {...} 的部分)
    • ActionName 是动作的唯一标识符。一个模式(Schema)中可以声明多个动作。
    • TitleDescription 是按照上面 Permaswap NPC 的截图,那么 Title 就是 Swap for some $llama coins ? 剩下的那一大段就是Description ,这两个字段主要为了向玩家说明这个交互的作用。
    • Target这次交互是让玩家向这个 Target Process 发送一条消息。
    • Schema 字段是可选的。如果没有定义,该动作将被禁用。
    • Tags 是必需的,并定义了该动作接受的标签结构。
    • Data 定义了该动作接受的消息中的 JSON 数据结构,如果适用的话。
    • Result 定义了回复消息数据中 JSON 数据的预期格式。

我们看个例子,注意Tags 需要的是一个 JSON 对应的字符串。

Handlers.add(
  'SchemaExternal',
  Handlers.utils.hasMatchingTag('Action', 'SchemaExternal'),
  function(msg)
    ao.send({
        Target = msg.From,
        Tags = { Type = 'SchemaExternal' },
        Data = json.encode({
          Lottery = {
            Target = LlamaCoinProcessId,
            Title = "Attend Llama Lottery?",
            Description = [[
              Pay 1 Llama Coin to enter the Llama Lottery. The winner will share 80% of the prize pool in Llama Coins.
              The winner will be determined when there are 10 participants.
              ]],
            Schema = {
              Tags = json.decode(LlamaLotteryAttendSchemaTags()),
            },
          },
        })
      })
  end
)

function LlamaLotteryAttendSchemaTags()
    return [[
        {
            "type": "object",
            "required": [
                "Action",
                "Recipient",
                "Quantity",
                "X-Transfer-Purpose"
            ],
            "properties": {
                "Action": {
                    "type": "string",
                    "const": "Transfer"
                },
                "Recipient": {
                    "type": "string",
                    "const": "]] .. POOL .. [["
                },
                "Quantity": {
                    "type": "number",
                    "const": ]] .. 1 .. [[,
                    "$comment": "]] .. 1000000000000 .. [["
                },
                "X-Transfer-Purpose":  {
                    "type": "string",
                    "const": "Lottery"
                },
            }
        }
    ]]
end

注意:当整数字段具有 comment 属性时,该属性会被用来乘以值后再发送。用于将整数金额转换为基本单位的数量。

到这里已经介绍的差不多了,大家快来构建自己的 Llama NPC 吧!


a.png

免责声明:本文不代表 PermaDAO 的观点或立场。PermaDAO 不提供投资建议,亦不为任何项目背书。请读者遵守所在国法律,合规进行 Web3 活动。

🔗 关于 PermaDAO:Website | Twitter | Telegram | Discord | MediumYoutube

点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
PermaDAO
PermaDAO
0x40F9...8718
Arweave 生态系统的共建者 DAO。 @ArweaveEco will be adopted by more developers. All projects of Arweave ecology can post their tasks and rewards here. @everVisionHQ@permaswap@ArweaveSCP