所有的命令函数都被包装在mcfpp.minecraft下。
实体有selector<T>
和entity
两种。它们都继承于entitybase
,保证都能完成类似的行为,都可以作为命令的对象。
对于Selector<1>
和Entity
,都继承了此接口,表示只包含了单个实体
表示一个三维的区域。
构造方法:
constructor(vec3 start, vec3 end)
根据两个三维坐标选取区域constructor(int sx, int sy, int sz, int ex, int ey, int ez)
根据六个坐标选取区域
某个方块需要满足的特征。和ItemPredicate
类似。
见bossbar
命令
CommandReturn
是几乎所有命令函数的返回值类型。它有两个只读成员,Return
和success
,对应命令是否执行成功,或者命令执行的返回值。
Return
:CommandResult
类型的数据。可以被储存为int
。success
:CommandSuccess
类型。可以用于if语句的判断,也能被储存在if语句中。
玩家的物品栏。
可以使用Slot
类型的数据索引,获得某个具体的物品的对象,或者设置某个具体的物品。
某个物品需要满足的特征。对应命令参数中的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}]
物品组件。
成员方法:
.modify(ItemModifier)
使用一个物品修饰器修饰这个物品。
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)
表示一个坐标,它同时带有维度信息。
表示一个时间。可以是刻,秒,分,小时,日。使用工程方法构造
-
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()
当前所在的世界,包含了一系列的方法
关于NBT的数据,使用NBT数据模板实现。一些数据模板除了提供数据结构提示以外,还拥有一些实用的方法来完成各种功能
对于所有的命令,mcfpp会以函数的形式等将其进行包装。
对于其中的所有函数,若有函数前带点,则为成员函数,具体是哪个类的成员函数根据前文确定。
除非特殊标记,所有命令的返回值都是CommandValue
。
对于成员函数,类似BossBar.Companion
表示是静态成员,如果是BossBar.xxx
则是对象成员。
目前设计如下:
此命令需要以玩家为对象。此后内容略去Player
.grantAll()
获得所有的进度.grant(Advancement a)
获得某个进度.grant(Advancement a, AdvancementCriterion c)
满足某个进度的某个条件.grantFrom(Advancement a)
advancement grant from.grantThrough(Advancement a)
.grantUntil(Advancement a)
- revoke同理
此命令用于修改实体的属性。实体的属性视作实体类的成员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(string name, string reason = "")
ban(UUID uuid, string reason = "")
ban的其他几个命令同理
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是玩家物品栏对象的成员方法。以下略去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的时候。
Area.clone(vec3 target, bool masked = false, CloneMode mode = normal)
Area.cloneFiltered(vec3 target, BlockPredicate block, bool masked, CloneMode mode = normal
)
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
命令被融合在了mcfpp的语法中,也就是nbt
为主的类型以及派生类型。
class Datapack
是datapack
命令的具体实现。
Datapack.disable()
Datapack.enable()
Datapack.enableFirst()
Datapack.enableLast()
Datapack.enableBefore(Datapack existing)
Datapack.Companion.listAll()
Datapack.Companion.listAvailable()
Datapack.Companion.listEnabled()
-
Debug.start()
-
Debug.stop()
-
Debug.function(Function function)
World.SetDefaultGamemode(Gamemode mode)
Op.deop(Player player)
World.setDifficulty(Difficulty difficulty)
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)
结合物品修饰器,mcfpp提供了比原版enchant
命令更强大的功能
enchant(EntityBase entity, Enchantment enchantment, int level = 1, Slot slot = Slot.weapon_mainhand) -> void
其中,int可以超越魔咒的最大合法等级。它的返回值是void
。
Player
类管理了玩家的经验值。
Player.addXpPoint(int points)
Player.addXpLevel(int levels)
Player.getXpPoint(out int points)
Player.getXpLevels(out int levels)
Player.set...
TODO:使用访问器优化
fill(vec3 from, vec3 to, BlockState block, FillMode mode = replace)
fill(vec3 from, vec3 to, BlockState block, BlockPredicate replaceBlock)
Area.fillBiome(Biome biome)
Area.replaceBiome(Biome biome, ResourceID replaceBiome)
forceloadAdd(vec2 from, vec2 to)
forceloadRemove(vec2 from, vec2 to)
forceloadRemoveAll()
forceloadQuery()
forceloadQuery(vec2 pos)
被mcfpp的函数实现
Player.setMode(Gamemode mode)
- 成员属性
World.rule.规则名
控制游戏规则。可以获取和修改游戏规则
give是玩家物品栏对象的成员方法。以下略去entitybase<Player>.inventory
.give(Item item, int count = 1)
有非成员方法的版本
give(Player player, Item item, int count = 1)
help()
help(string command)
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)
)
jfrStart()
jfrStop
kick(Player player, string reason = "")
kill(EntityBase target = @s)
list()
listUUIDs
locate(Structure structure)
locate(Biome biome)
locate(Poi poi)
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(string action)
同tell
Op.op(Player player)
pardon(string name)
pardonIp(string ip)
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)
同jrf
-
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(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(bool allowCommands = false, Gamemode gamemode = survival, int port = System.randInt(1025,65536))
随机数由随机序列产生,因此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)
用这些参数重置所有随机序列。同时设置世界存档的随机数参数
.give(Player player)
Recipe.giveAll(Player player)
.take(Player player)
Recipe.takeAll(Player player)
reload()
被函数的返回值实现。同时运用在break
和continue
等逻辑控制语句中
EntityBase.ride(SingleEntity vehicle)
EntityBase.stopRide()
saveAll(bool flush = false)
saveOff()
saveOn()
say(string msg)
被异步实现。TODO。
提供命令函数。
schedule(Function function, int tick, bool replace = false)
schedule(Function function, double second, bool replace = false)
被int
类型实现
seed()
setblock(Pos pos, BlockState block, SetBlockMode mode = replace)
setidletimeout(int minute)
setworldspawn(Pos pos = Pos.relative(), Angle angle = Angle.relative())
Player.spawnpoint(Pos pos = Pos.relative(), Angle angle = Angle.relative())
Player.spectate(SingleEntity target)
Player.stopSpectate()
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()
stopsound(Player player, SoundSource source, Sound sound)
stopAllSource(Player player)
stopAllSound(Player player, SoundSource source)
stopAllSource(Player player, SouondSource source)
summon(ResourceID entity, Pos pos = Pos.relative(), nbt nbt = {})
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
有class 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(string msg)
以下略去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)
同msg
被Sytem.print()
实现
作为属性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()
作为属性World.time
被实现。类型是Time
。可以设置和查询值。重载了加等运算。
titleClear(EntityBase target)
titleReset(EntityBase target)
title(EntityBase target, jtext text, TitilePosition position = title)
titleSet(EntityBase target, Time fadeInt, Time stay, Time fadeOut)
见teammsg
transfer(string hostname, int port = 25565, Player target = @s)
Trigger(string id)
新增一个触发器.enable(Player player)
允许触发
Trigger
继承了int
的运算符
同tell
World.weather
同时有
World.setWeather(Weather weather, Time duration = Time.minute(5))
以下省略Whitelist
.add(Player target)
.list()
.off()
.on()
.reload()
.remove(Player target)
以下省略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)
见experience