Skip to content

Latest commit

 

History

History
711 lines (421 loc) · 17.5 KB

命令函数设计.md

File metadata and controls

711 lines (421 loc) · 17.5 KB

命令函数设计

对象设计

所有的命令函数都被包装在mcfpp.minecraft下。

kotlin class EntityBase

实体有selector<T>entity两种。它们都继承于entitybase,保证都能完成类似的行为,都可以作为命令的对象。

interface SingleEntity

对于Selector<1>Entity,都继承了此接口,表示只包含了单个实体

class Area

表示一个三维的区域。

构造方法:

  • constructor(vec3 start, vec3 end)根据两个三维坐标选取区域
  • constructor(int sx, int sy, int sz, int ex, int ey, int ez)根据六个坐标选取区域

class BlockPredicate

某个方块需要满足的特征。和ItemPredicate类似。

class BossBar

bossbar命令

class CommandReturn

CommandReturn是几乎所有命令函数的返回值类型。它有两个只读成员,Returnsuccess,对应命令是否执行成功,或者命令执行的返回值。

  • ReturnCommandResult类型的数据。可以被储存为int
  • success: CommandSuccess类型。可以用于if语句的判断,也能被储存在if语句中。

class Inventory

玩家的物品栏。

可以使用Slot类型的数据索引,获得某个具体的物品的对象,或者设置某个具体的物品。

class ItemPredicate

某个物品需要满足的特征。对应命令参数中的minecraft:item_predicate。可以被隐式转换为bool。重写了逻辑运算符。

使用链式调用进行构造。以下略去ItemPredicate.Companion

.hasComponent(string id)拥有一个组件

.hasComponentValue(string id, nbt value)组件有一个确定的值

.damage(range range)损坏值是否在一定范围内

.durability(range range)剩余耐久度是否在一定范围内

.customData(nbt value)物品堆叠组件custom_data是否包含指定的值

.enchantments(list<EnchantmentData> enchantments)检查物品是否具有列表中所有的魔咒

.jukeboxPlayable(list<string> song)检查物品所含有的唱片音乐信息

.jukeboxPlayable(string song)上面的重载

.potionContents(list<string> potion)检查物品包含的药水效果数据

.potionContents(string potion)

.storedEnchantments(list<EnchantmentData> enchantments)enchantments

.count(range range)检查数量是否在一定的范围内。

下面是一个例子

var qwq = ItemPredicate.count(1..5).durability(9..11).or(!ItemPredicate.customData({"test":1}));
@p.clear("paper",qwq);

即为:

clear @p minecraft:paper[minecraft:count~1..5,minecraft:durability~9..11|!minecraft:custom_data={"test":1}]

class ItemStack

物品组件。

成员方法:

.modify(ItemModifier)使用一个物品修饰器修饰这个物品。

class LootSource

LootSource被用在loot命令中。

工厂函数

  • LootSource.fish(LootTable table, Pos pos, Item tool)
  • LootSource.fish(LootTable table, Pos pos, Slot slot)
  • LootSource.kill(SingleEntity entity)
  • LootSource.loot(LootTable table)
  • LootSource.mine(Pos pos, Item tool)
  • LootSource.mine(Pos pos, Slot slot)

class Position

表示一个坐标,它同时带有维度信息。

class Time

表示一个时间。可以是刻,秒,分,小时,日。使用工程方法构造

  • Time(int tick)创建一个指定tick的时间。

  • Time.tick(int tick)一个tick

  • Time.second(float second)现实中的一秒

  • Time.minute(float minute)现实中的一分钟

  • Time.hour(float hour)现实中的一小时

  • Time.day(float day)现实中的一天

  • Time.gameDay(float gameday)游戏中的一天

编译器已知的Time,即TimeConcrete可以被加减。

在命令中,Time默认使用tick。但是,Time提供成员方法转换单位。

  • .toTick()

  • .toSecond()

  • .toDay()

class World

当前所在的世界,包含了一系列的方法

数据模板

关于NBT的数据,使用NBT数据模板实现。一些数据模板除了提供数据结构提示以外,还拥有一些实用的方法来完成各种功能

命令设计

对于所有的命令,mcfpp会以函数的形式等将其进行包装。

对于其中的所有函数,若有函数前带点,则为成员函数,具体是哪个类的成员函数根据前文确定。

除非特殊标记,所有命令的返回值都是CommandValue

对于成员函数,类似BossBar.Companion表示是静态成员,如果是BossBar.xxx则是对象成员。

目前设计如下:

advancement

此命令需要以玩家为对象。此后内容略去Player

  • .grantAll() 获得所有的进度
  • .grant(Advancement a) 获得某个进度
  • .grant(Advancement a, AdvancementCriterion c) 满足某个进度的某个条件
  • .grantFrom(Advancement a) advancement grant from
  • .grantThrough(Advancement a)
  • .grantUntil(Advancement a)
  • revoke同理

attribute

此命令用于修改实体的属性。实体的属性视作实体类的成员dict<Attribute> attribute

dict<Attribute> attribute可以访问实体的属性

  • attribute["xxx"]{ get(); set(); } 设置和修改属性的base值,获取的是nbt的值。
  • attribute["xxx"].tryGet()获得xxx属性的值(使用命令获取)
  • attribute["xxx"].addValue(float value, string name = randomUUID().toString(),UUID uuid = randomUUID()) 同attribute modifier add add_value。其余三种修改方式同,只是下划线命名变成驼峰命名法。
  • attribute["xxx"].remove(UUID uuid) 移除一个属性修饰器
  • attribute["xxx"].getModfier(UUID uuid, float scale = 1)获得属性修饰器的值

ban

  • ban(string name, string reason = "")
  • ban(UUID uuid, string reason = "")

ban的其他几个命令同理

bossbar

Boss栏是一个对象,bossbar命令的目的都是为了修改Boss栏完成。

  • BossBar(string id) BossBar的构造方法。生成一个链接到此BossBar对象的BossBar

  • BossBar(string id, text name)

  • BossBar.add()在游戏中创建这个BossBar

  • 成员int max,int players,int value,bool visible

  • BossBar.Companion.list()

  • BossBar.remove()移除注册这个BossBar

  • BossBar.exist(out bool exist)这个BossBar是否存在/被注册

  • BossBar.setColor(BossBarColor color)参数为枚举变量

  • BossBar.setName(text name)

  • BossBar.setVisiblePlayers(selector<Player>)设置可见玩家

  • BossBar.setStyle(BossBarStyle style)参数为枚举变量

clear

clear是玩家物品栏对象的成员方法。以下略去entitybase<Player>.Inventory

  • .clear()
  • .clear(string id, ItemPredicate predicate)
  • .clear(string id, int max = 1)
  • .clear(Item item, int max = 1)除去带有指定NBT的物品
  • .check(Item item) -> bool检测是否有此物品。等同于clear命令参数max为0的时候。

clone

  • Area.clone(vec3 target, bool masked = false, CloneMode mode = normal)
  • Area.cloneFiltered(vec3 target, BlockPredicate block, bool masked, CloneMode mode = normal )

damage

  • damage(EntityBase target, double amount, DamageType type = minecraft.damageType.generic)
  • damage(EntityBase target, double amount, vec3 location, DamageType type = minecraft.damageType.generic)
  • damage(EntityBase target, double amount, SingleEntity by, DamageType type = minecraft.damageType.generic)
  • damage(EntityBase target, double amount, SingleEntity by, SingleEntity from, DamageType type = minecraft.damageType.generic)

data

/data命令被融合在了mcfpp的语法中,也就是nbt为主的类型以及派生类型。

datapack

class Datapackdatapack命令的具体实现。

  • Datapack.disable()
  • Datapack.enable()
  • Datapack.enableFirst()
  • Datapack.enableLast()
  • Datapack.enableBefore(Datapack existing)
  • Datapack.Companion.listAll()
  • Datapack.Companion.listAvailable()
  • Datapack.Companion.listEnabled()

debug

  • Debug.start()

  • Debug.stop()

  • Debug.function(Function function)

defaultgamemode

  • World.SetDefaultGamemode(Gamemode mode)

deop

  • Op.deop(Player player)

difficulty

  • World.setDifficulty(Difficulty difficulty)

effect

EntityBase类管理了此实体的效果状态

  • EntityBase.giveEffect(Effect effect, int time = 30, int amplifier = 0, bool hideParticles = false)

  • EntityBase.giveInfiniteEffect(Effect effect, int amplifier = 0, bool hideParticles = false)

  • EntityBase.clearAllEffect()

  • EntityBase.clearEffect(Effect effect)

enchant

结合物品修饰器,mcfpp提供了比原版enchant命令更强大的功能

  • enchant(EntityBase entity, Enchantment enchantment, int level = 1, Slot slot = Slot.weapon_mainhand) -> void

其中,int可以超越魔咒的最大合法等级。它的返回值是void

experience

Player类管理了玩家的经验值。

  • Player.addXpPoint(int points)
  • Player.addXpLevel(int levels)
  • Player.getXpPoint(out int points)
  • Player.getXpLevels(out int levels)
  • Player.set...

TODO:使用访问器优化

fill

  • fill(vec3 from, vec3 to, BlockState block, FillMode mode = replace)
  • fill(vec3 from, vec3 to, BlockState block, BlockPredicate replaceBlock)

fillbiome

  • Area.fillBiome(Biome biome)
  • Area.replaceBiome(Biome biome, ResourceID replaceBiome)

forceload

  • forceloadAdd(vec2 from, vec2 to)
  • forceloadRemove(vec2 from, vec2 to)
  • forceloadRemoveAll()
  • forceloadQuery()
  • forceloadQuery(vec2 pos)

function

被mcfpp的函数实现

gamemode

  • Player.setMode(Gamemode mode)

gamerule

  • 成员属性World.rule.规则名控制游戏规则。可以获取和修改游戏规则

give

give是玩家物品栏对象的成员方法。以下略去entitybase<Player>.inventory

  • .give(Item item, int count = 1)

有非成员方法的版本

  • give(Player player, Item item, int count = 1)

help

  • help()
  • help(string command)

item

item命令被ItemStack类型,即玩家物品栏对象使用Slot类型枚举索引得到的数据类型实现。

具体参考上文中ItemStack中的API。

例子

@a.inventory[Slot.weapon_main] = Item("diamond").count(10).cmd(10);
@a.inventory[Slot.head].modify(
	ItemModifier()
	.setEnchantments(Minecraft.enchantments.sharpness,10)
)

jfr

  • jfrStart()
  • jfrStop

kick

  • kick(Player player, string reason = "")

kill

  • kill(EntityBase target = @s)

list

  • list()
  • listUUIDs

locate

  • locate(Structure structure)
  • locate(Biome biome)
  • locate(Poi poi)

loot

  • lootGive(Player player, LootSource source)
  • lootInsert(Pos pos, LootSource source)
  • lootAt(Pos pos, LootSource source)
  • lootReplace(ItemStack stack, LootSource source)
  • lootReplace(ItemStack stack, int count, LootSource source)

其中,LootSource参见上文。

me

  • me(string action)

msg

tell

op

  • Op.op(Player player)

pardon

  • pardon(string name)

pardon-ip

  • pardonIp(string ip)

particle

  • particle(Particle particle)
  • particle(Particle particle, Pos pos)
  • particle(Particle particle, Pos pos, Vec3 delta, double speed, int count, bool force = false)
  • particle(Particle particle, Pos pos, Vec3 delta, double speed, int count,Player viewer, bool force = false)

pref

jrf

place

  • place(Feature feature)

  • place(Feature feature, Pos pos)

  • place(TemplatePool pool, ResourceID target, int maxDepth)

  • place(TemplatePool pool, ResourceID target, int maxDepth, Pos pos)

  • place(Structure structure)

  • place(Structure structure, Pos pos)

  • place(Template template, Pos pos = Pos.relative(), PlaceRotation rotation = none, PlaceMirror = none, float intergriry = 1.0f)

  • place(Template template, Pos pos = Pos.relative(), PlaceRotation rotation = none, PlaceMirror = none, float intergriry = 1.0f, int seed = System.randInt())

这里的System.randInt()返回一个确定的int,表示是在编译期间随机确定的一个种子,和random命令有差别

playsound

  • playsound(Sound sound, SoundSource source = master)
  • playsound(Sound sound, SoundSource source, Player player, Pos pos = Pos.relative(), float volumn = 1.0f, float pitch = 1.0f, float minVolume = 0.0f)

publish

  • publish(bool allowCommands = false, Gamemode gamemode = survival, int port = System.randInt(1025,65536))

random

随机数由随机序列产生,因此random命令会和随机序列的类Random有关。在Minecraft.random下,有一些原版的随机数序列。

Random类的构造方法:

  • Random()随机一个Random对象,它有随机的名字和参数
  • Random(ResourceID id)随机一个Random对象,它有随机的参数
  • Random(ResourceID id, int salt)
  • Random(ResourceID id, int salt, bool includeWorldSeed)
  • Random(ResourceID id, int salt, bool includeWorldSeed, bool includeSequenceId)方法的重载,对应是否指定随机用的三个参数。值得注意的是,其中的salt在命令中的对应的是seed

成员方法

  • .setParam(int salt, bool includeWorldSeed, bool includeSequenceId)同样包含三个参数的重载,这里省略。
  • .rand(IntRange range, bool roll = false)

伴随对象成员方法

  • Random.rand(IntRange range, bool rool = false)由世界的默认随机源产生随机数
  • Random.resetAll()重置所有随机序列
  • Random.resetAll(int salt, bool includeWorldSeed, bool includeSequenceId)用这些参数重置所有随机序列。同时设置世界存档的随机数参数

recipe

  • .give(Player player)
  • Recipe.giveAll(Player player)
  • .take(Player player)
  • Recipe.takeAll(Player player)

reload

  • reload()

return

被函数的返回值实现。同时运用在breakcontinue等逻辑控制语句中

ride

  • EntityBase.ride(SingleEntity vehicle)
  • EntityBase.stopRide()

save-all

  • saveAll(bool flush = false)

save-off

  • saveOff()

save-on

  • saveOn()

say

  • say(string msg)

schedule

被异步实现。TODO。

提供命令函数。

  • schedule(Function function, int tick, bool replace = false)
  • schedule(Function function, double second, bool replace = false)

scoreboard

int类型实现

seed

  • seed()

setblock

  • setblock(Pos pos, BlockState block, SetBlockMode mode = replace)

setidletimeout

  • setidletimeout(int minute)

setworldspawn

  • setworldspawn(Pos pos = Pos.relative(), Angle angle = Angle.relative())

spawnpoint

  • Player.spawnpoint(Pos pos = Pos.relative(), Angle angle = Angle.relative())

spectate

  • Player.spectate(SingleEntity target)
  • Player.stopSpectate()

spreadplayers

  • spreadplayers(vec2 center, float spreadDistance, float maxRange, bool respectTeams, Entity target)
  • spreadplayers(vec2 center, float spreadDistance, float maxRange, int maxHeight, bool respectTeams, Entity target)

stop

  • stop()

stopsound

  • stopsound(Player player, SoundSource source, Sound sound)
  • stopAllSource(Player player)
  • stopAllSound(Player player, SoundSource source)
  • stopAllSource(Player player, SouondSource source)

summon

  • summon(ResourceID entity, Pos pos = Pos.relative(), nbt nbt = {})

tag

tag命令作为实体类型的tag成员被实现。

  • EntityBase.tag.add(string tag)
  • EntityBase.tag.remove(string tag)
  • EntityBase.tag.list()

同时,可以遍历tag的NBT列表。

foreach(tag in @s.tag){
	print(tag);
}

team

teamclass Team作为操作对象

构造方法

  • Team(string team, jtext displayName = team)创建一个队伍

成员方法

  • .remove()删除此队伍
  • .empty()清空此队伍
  • .add(Entity entity)加入队伍
  • .remove(Entity entity)离开队伍

成员属性:

  • jtext displayName
  • TeamColor color
  • bool friendlyFire
  • bool seeFriendlyInvisibles
  • bool nametagVisibility
  • bool deathMessageVisibility
  • CollisionRule collisionRule
  • jtext prefix
  • jtext suffix

teammsg

  • teammsg(string msg)

tp

以下略去EntitiyBase作为调用者

  • .tp(Pos pos)
  • .tp(SingleEntity entity)
  • .tp(Pos pos, Rotation rotation)
  • .tp(Pos pos, Pos facingLocation)
  • .tp(Pos pos, SingleEntity facingEntity, Anchor anchor = eyes)

tell

msg

tellraw

Sytem.print()实现

tick

作为属性World.tick被实现。可以设置和查询值。同时有方法

  • World.tick.freeze()
  • World.tick.unfreeze()
  • World.tick.step(int tick = 1)
  • World.tick.sprint(Time time = Time.tick(1))
  • World.tick.stopSprint()

time

作为属性World.time被实现。类型是Time。可以设置和查询值。重载了加等运算。

title

titleClear(EntityBase target)

titleReset(EntityBase target)

title(EntityBase target, jtext text, TitilePosition position = title)

titleSet(EntityBase target, Time fadeInt, Time stay, Time fadeOut)

tm

teammsg

transfer

  • transfer(string hostname, int port = 25565, Player target = @s)

trigger

  • Trigger(string id)新增一个触发器
  • .enable(Player player)允许触发

Trigger继承了int的运算符

w

tell

weather

World.weather

同时有

World.setWeather(Weather weather, Time duration = Time.minute(5))

whitelist

以下省略Whitelist

  • .add(Player target)
  • .list()
  • .off()
  • .on()
  • .reload()
  • .remove(Player target)

worldborder

以下省略World.border

.add(double distance = 29999984, int time = 0)

.setCenter(vec2 pos = [0,0])

.setDamage(float damage = 0.2f)

.setDamageBuffer(double distance = 5.0)

.setWarnDistance(int distance = 5)

.setWarnTime(int time = 15)

xp

experience