用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill player-component-generator命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | player-component-generator |
| description | 生成Go语言玩家组件的初始代码。当用户想要创建带有客户端请求处理函数的新玩家组件时调用。 Use when this capability is needed. |
| metadata | {"author":"fish-tennis"} |
此技能用于生成遵循项目规范的玩家组件初始代码。
向用户询问以下信息:
*pb.XxxData)
db:"plain"标签,否则使用db:""标签gentity.MapData的map结构
int32或int64或string该技能生成的Go文件包含:
package gameGet<ComponentName>()方法On<Xxx>Req()方法检查pb/目录中是否存在所需的proto消息:
pb/*.pb.go中搜索<ComponentName>Data检查proto/player.proto:
message PlayerData定义<ComponentName> <ComponentName>或bytes <ComponentName>或map<int32,bytes> <ComponentName>或map<int64,bytes> <ComponentName>或map<string,bytes> <ComponentName>)*pb.XxxData)
bytes <ComponentName>gentity.MapData的map结构
map<**Map键类型**,bytes> <ComponentName>使用适当的模板在game/<componentname>.go创建组件文件。
package game
import (
"errors"
"github.com/fish-tennis/gentity"
"github.com/fish-tennis/gserver/cfg"
"github.com/fish-tennis/gserver/pb"
)
const (
ComponentName<ComponentName> = "<ComponentName>"
)
func init() {
_playerComponentRegister.Register(ComponentName<ComponentName>, 0, func(player *Player, _ any) gentity.Component {
return &<ComponentName>{
PlayerDataComponent: *NewPlayerDataComponent(player, ComponentName<ComponentName>),
Data: &pb.<ComponentName>Data{
// TODO: 初始化默认值
},
}
})
}
type <ComponentName> struct {
PlayerDataComponent
Data *pb.<ComponentName>Data `db:"plain"`
}
func (p *Player) Get<ComponentName>() *<ComponentName> {
return p.GetComponentByName(ComponentName<ComponentName>).(*<ComponentName>)
}
func (c *<ComponentName>) SyncDataToClient() {
c.GetPlayer().Send(&pb.<ComponentName>Sync{
Data: c.Data,
})
}
func (c *<ComponentName>) On<Xxx>Req(req *pb.<Xxx>Req) (*pb.<Xxx>Res, error) {
l := c.GetPlayer().Log
l.Debug("On<Xxx>Req", "req", req)
// TODO: 实现逻辑
res := &pb.<Xxx>Res{}
return res, nil
}
package game
import (
"errors"
"github.com/fish-tennis/gentity"
"github.com/fish-tennis/gserver/cfg"
"github.com/fish-tennis/gserver/pb"
)
const (
ComponentName<ComponentName> = "<ComponentName>"
)
func init() {
_playerComponentRegister.Register(ComponentName<ComponentName>, 0, func(player *Player, _ any) gentity.Component {
return &<ComponentName>{
BasePlayerComponent: BasePlayerComponent{
player: player,
name: ComponentName<ComponentName>,
},
<DataField>: gentity.NewMapData[int32, *pb.<DataType>](),
}
})
}
type <ComponentName> struct {
BasePlayerComponent
<DataField> *gentity.MapData[int32, *pb.<DataType>] `db:""`
}
func (p *Player) Get<ComponentName>() *<ComponentName> {
return p.GetComponentByName(ComponentName<ComponentName>).(*<ComponentName>)
}
func (c *<ComponentName>) SyncDataToClient() {
c.GetPlayer().Send(&pb.<ComponentName>Sync{
<DataField>: c.<DataField>.Data,
})
}
func (c *<ComponentName>) On<Xxx>Req(req *pb.<Xxx>Req) (*pb.<Xxx>Res, error) {
l := c.GetPlayer().Log
l.Debug("On<Xxx>Req", "req", req)
// TODO: 实现逻辑
res := &pb.<Xxx>Res{}
return res, nil
}
package game
import (
"errors"
"github.com/fish-tennis/gentity"
"github.com/fish-tennis/gserver/cfg"
"github.com/fish-tennis/gserver/pb"
)
const (
ComponentName<ComponentName> = "<ComponentName>"
)
func init() {
_playerComponentRegister.Register(ComponentName<ComponentName>, 0, func(player *Player, _ any) gentity.Component {
return &<ComponentName>{
BasePlayerComponent: BasePlayerComponent{
player: player,
name: ComponentName<ComponentName>,
},
<DataField>: gentity.NewMapData[string, *pb.<DataType>](),
}
})
}
type <ComponentName> struct {
BasePlayerComponent
<DataField> *gentity.MapData[string, *pb.<DataType>] `db:""`
}
func (p *Player) Get<ComponentName>() *<ComponentName> {
return p.GetComponentByName(ComponentName<ComponentName>).(*<ComponentName>)
}
func (c *<ComponentName>) SyncDataToClient() {
c.GetPlayer().Send(&pb.<ComponentName>Sync{
<DataField>: c.<DataField>.Data,
})
}
func (c *<ComponentName>) On<Xxx>Req(req *pb.<Xxx>Req) (*pb.<Xxx>Res, error) {
l := c.GetPlayer().Log
l.Debug("On<Xxx>Req", "req", req)
// TODO: 实现逻辑
res := &pb.<Xxx>Res{}
return res, nil
}
对于带有ExchangeReq/ExchangeRes的"Exchange"组件:
pb/exchange.pb.go中的消息定义cfg/data_mgr.go中的配置数据proto/player.proto中的PlayerData,如果缺少则添加map<int32,bytes> Exchangegame/exchange.go生成组件文件PlayerDataComponent(Single Proto)BasePlayerComponent(MapData)BasePlayerComponentdb:"plain"标签的数据字段,用于明文存储(例如:*pb.BaseInfo),带有db:""标签的数据字段,用于序列化存储proto/目录player.proto包含带有所有组件字段的PlayerData消息protoc重新生成Go代码game/base_info.go、game/exchange.go、game/bags.go、game/quest.go中的现有模式pb/目录中的protobuf定义以了解Req/Res消息结构Source: fish-tennis/gserver — distributed by TomeVault.
基于 SOC 职业分类