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

作者: txohyeah
审阅:outprog
来源:内容公会 - 新闻
放在开篇,先来讲下我们为什么要开发 Llama NPC!
这点其实是依托于 Llama Land 的平台获得的红利,为自己的项目导入 Llama Land 的流量。就好像自己发的朋友圈的视频,能看到的只有自己的几个朋友,但是当视频发抖音的时候就有可能被抖音的用户看到。就好像 Llama Lottery NPC 中接入的 Llama Lottery 项目。仅仅 3 天时间,就有近 100 人参与,而参与人次更是已经超过了 200。项目的作者仅仅就发了一个推特,没有做过其他任何推广。对了,题外话,该推特还有幸得到了 Sam 等大佬的转载。
在已有项目的基础上,仅仅接入一个 Llama NPC 所需要的开发时间不会超过半天。并且对于项目的验证阶段,甚至等于省去了前端开发、部署等工作,就可以完成自己项目的 MVP 验证。
现在官方还对于 Llama Land 平台生态的开发者发布了包括开发 Llama World,Llama NPC,The Best use of Llama coin 在内的 3 个任务,一共提供了 1000 AR 的高额奖励。
接下来我们就来介绍下 Llama Land,这个基于 AO 和 AI 的平台。
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

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

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

友情链接:
通过跨链桥获取 wAR:https://aox.arweave.dev/#/beta
简单介绍游戏之后,我们接下来进入今天的主题。首先,我们先来介绍下 Llama Land 强大的扩展性。
因为 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 = '表单弹框的标题'
            },
          },
        }),
    })
endAction = "Reality.EntityCreate" 这个 Action 就是注册自己 NPC 的句柄。如果自己创建了,那么在执行就会更新这个 NPC。
Data 里面存在很多的字段,具体含义如下,
如果 Llama NPC 被注册到地图中以后,长时间没有交互信息,那么 Llama NPC 就会从地图中下线。如果你想要让自己的 Llama NPC 在地图上持续存在,一般有两种方式:
ao.send({
  Target = TARGET_WORLD_PID,
  Tags = {
    Action = 'Reality.EntityFix',
  },
})ao.send({
    Target = TARGET_WORLD_PID,
    Tags = {
      Action = "Reality.EntityUpdatePosition",
    },
    Data = json.encode({
      Position = {
        math.random(-3, 3),
        math.random(12, 15),
      },
    }),
})SchemaExternalForm 交互模式
ActionName 是动作的唯一标识符。一个模式(Schema)中可以声明多个动作。Title 和 Description 是按照上面 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 吧!

免责声明:本文不代表 PermaDAO 的观点或立场。PermaDAO 不提供投资建议,亦不为任何项目背书。请读者遵守所在国法律,合规进行 Web3 活动。
🔗 关于 PermaDAO:Website | Twitter | Telegram | Discord | Medium | Youtube
 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!