Plugin API Overview

The Go Plugin API exposes server-owned runtime operations to plugins.

In this section

Related section pages:

Overview

Pulse provides a type-safe API for extending server functionality using Go. New code should prefer PMMP-like handles such as Gameplay.Players(), PlayerHandle.Inventory(), Gameplay.Entities(), and WorldHandle.ContainerAt().

plugin.go
package minimalpluginimport (	"context"	"fmt"	"github.com/pulse-core/Pulse/core/command"	"github.com/pulse-core/Pulse/core/content"	"github.com/pulse-core/Pulse/core/gameplay"	"github.com/pulse-core/Pulse/core/item"	"github.com/pulse-core/Pulse/core/player"	"github.com/pulse-core/Pulse/core/plugin")type Plugin struct {	ctx        plugin.Context	unregister func()}func New() plugin.Plugin { return &Plugin{} }func init() {	plugin.MustRegisterFactory("minimalplugin", New)}func (p *Plugin) Name() string { return "minimalplugin" }func (p *Plugin) Init(ctx plugin.Context) error {	p.ctx = ctx	if _, err := ctx.RegisterBlock(content.BlockSpec{Name: "minimalplugin:ruby_block"}); err != nil {		return err	}	if _, err := ctx.RegisterItem(content.ItemSpec{Name: "minimalplugin:ruby", MaxCount: 64}); err != nil {		return err	}	unregister, err := ctx.Commands().Register(command.Definition{		Name: "ruby",		Handler: p.giveRuby,	})	if err != nil {		return err	}	p.unregister = unregister	return nil}func (p *Plugin) Start(context.Context) error { return nil }func (p *Plugin) Stop(context.Context) error {	if p.unregister != nil {		p.unregister()	}	return nil}func (p *Plugin) giveRuby(ctx context.Context, exec command.Execution) (command.Result, error) {	_, err := p.ctx.Gameplay().GiveItem(gameplay.InventoryGiveRequest{		PlayerID: player.ID(exec.Source.PlayerID),		Stack: item.Stack{			Item: item.State{Name: "minimalplugin:ruby"},			Count: 1,		},	})	if err != nil {		return command.Result{}, err	}	return command.Result{Messages: []string{fmt.Sprintf("Gave ruby to %s.", exec.Source.Username)}}, nil}

Explore the API

Design Rule