API
Zdarzenia
Zdarzenie opisuje coś, co stało się w grze: gracz dołączył, blok został zniszczony, coś otrzymało obrażenia. Nie opisuje, jaki wewnętrzny kod gry się wykonał, dlatego mod, który nasłuchuje join, działa dalej, nawet gdy ten kod się zmienia.
Nasłuchiwanie zdarzenia
import { give_rubies } from "/lib/rewards"
import { SETTINGS } from "/settings"
on break(e) {
let p = e.player
if p == null { return }
if e.block.type == "minecraft:diamond_ore" and chance(SETTINGS["bonus_chance"]) {
give_rubies(p, 1)
p.play_sound("rubies:ruby_chime")
p.world.spawn_particle("rubies:ruby_spark", e.block.location, 12, 0.4, 0.02)
}
}package com.example.rubies.events
object MiningEvents {
fun register(config: RubiesConfig) {
Crafting.events.on<BlockBreakEvent> { e ->
val player = e.player ?: return@on
if (e.block.type.path == "diamond_ore" && Math.random() < config.dropChance) {
player.give(ItemStack.of(Items.RUBY))
player.playSound(Identifier.parse(Sounds.CHIME))
player.world.spawnParticle(Identifier.parse(Particles.SPARK), e.block.location, count = 12, spread = 0.4, speed = 0.02)
}
}
}
}W CraftScript właściwości zdarzenia są dostępne jako zmienne (player, block…) albo przez nazwę, którą mu nadasz (on break(e)). Każdego zdarzenia możesz nasłuchiwać z dowolnej liczby plików: umieść każdą zasadę w pliku jej tematu.
Wszystkie zdarzenia
Wszystkie są wywoływane w prawdziwej grze, po stronie klienta lub serwera, zależnie od przypadku. W CraftScript możesz użyć krótkiej lub długiej nazwy w snake_case (join lub player_join).
| CraftScript | Kotlin | Właściwości | Można anulować |
|---|---|---|---|
server_starting |
ServerStartingEvent |
server | |
start |
ServerStartedEvent |
server | |
stop |
ServerStoppingEvent |
server | |
tick |
ServerTickEvent |
server, tick, phase | |
client_tick |
ClientTickEvent |
tick, phase | |
world_load |
WorldLoadEvent |
world | |
world_unload |
WorldUnloadEvent |
world | |
join |
PlayerJoinEvent |
player, join_message | |
quit, leave |
PlayerQuitEvent |
player, quit_message | |
chat |
PlayerChatEvent |
player, message | Tak |
respawn |
PlayerRespawnEvent |
player, location | |
death |
PlayerDeathEvent |
player, death_message, keep_inventory | |
interact |
PlayerInteractBlockEvent |
player, block, hand, item | Tak |
interact_entity |
PlayerInteractEntityEvent |
player, entity, hand, item | Tak |
attack |
PlayerAttackEvent |
player, target | Tak |
key |
PlayerKeyEvent |
player, key | |
use_item |
PlayerUseItemEvent |
player, item, hand | Tak |
command |
PlayerCommandEvent |
player, command | Tak |
break |
BlockBreakEvent |
player (może być null), block, drop_items | Tak |
place |
BlockPlaceEvent |
player (może być null), block, placed | Tak |
spawn |
EntitySpawnEvent |
entity | Tak |
damage |
EntityDamageEvent |
entity, damage_type, amount (modyfikowalne), attacker | Tak |
entity_death |
EntityDeathEvent |
entity, drops | |
hit |
ProjectileHitEvent |
projectile, shooter, entity or block | Tak |
ready |
ModsLoadedEvent |
mod_ids | |
plugin_reload |
PluginReloadEvent |
plugin_id |
Zmiana tego, co się dzieje
Niektóre właściwości można zmienić, a gra się do nich stosuje:
| Zdarzenie | Właściwość | Efekt |
|---|---|---|
chat |
message |
Gracz mówi nowy tekst. |
command |
command |
Wykonuje się nowe polecenie, jako ten gracz. |
join, quit |
join_message, quit_message |
Ogłaszane wszystkim, oprócz komunikatu gry. |
respawn |
location |
Gracz odradza się tam. |
break |
drop_items = false |
Blok niczego nie upuszcza. |
damage |
amount |
Otrzymane obrażenia mają nową wartość. |
entity_death |
drops.add(…) |
Dodane przedmioty wypadają tam, gdzie byt zginął, oprócz jego zwykłego łupu. |
on entity_death(e) {
if e.entity.type == "minecraft:zombie" and chance(0.05) {
e.drops.add(item("rubies:ruby", 1))
}
}interact_entity to kliknięcie prawym przyciskiem na jednostkę: po anulowaniu nic się nie dzieje (bez dojenia, handlu i jazdy). attack to gracz uderzający jednostkę: po anulowaniu nie ma uderzenia. damage podaje attacker, czyli kto stoi za obrażeniami: atakujący albo strzelec z pocisku. key uruchamia się, gdy gracz naciśnie klawisz moda (zob. Interfejs).
on interact_entity(e) {
if e.entity.type == "minecraft:cow" { e.player.send("This cow won't be milked"); e.cancel() }
}
on attack(e) {
if e.target.type == "minecraft:pig" { e.player.action_bar("This pig is protected"); e.cancel() }
}Jeszcze niestosowane. W death zmiana death_message lub keep_inventory nie ma jeszcze efektu. Crafting ostrzega o tym raz w dzienniku, zamiast po cichu to pomijać.
Priorytet i anulowanie
Kolejność: highest, high, normal, low, lowest i monitor. Gdy nasłuchiwacz anuluje zdarzenie, kolejne się nie wykonują, z wyjątkiem nasłuchiwaczy monitor (a w Kotlinie tych, które przekazują ignoreCancelled = true). Nasłuchiwacz monitor tylko obserwuje: nie może zmieniać zdarzenia.
on damage(e) priority high {
if e.damage_type == "minecraft:fall" {
e.amount = e.amount / 2 // łagodniejsze lądowania
}
}object ChatEvents {
fun register() {
Crafting.events.on<PlayerChatEvent>(EventPriority.HIGHEST) { e ->
if (e.message.startsWith("!")) e.cancel()
}
Crafting.events.on<PlayerChatEvent>(EventPriority.MONITOR) { e ->
if (!e.isCancelled) Crafting.runtime.logger("chat").info("${e.player.name}: ${e.message}")
}
}
}Gdy coś zawiedzie
- Nasłuchiwacz, który rzuci błąd, trafia do dziennika z nazwą swojego moda, a pozostałe nasłuchiwacze działają dalej.
/crafting profile(dwa razy: start, potem podgląd) pokazuje, ile czasu każdy mod spędza w swoich zdarzeniach.- Zdarzenie, którego nikt nie nasłuchuje, nie jest nawet tworzone, więc nasłuchiwanie niewielu zdarzeń nic nie kosztuje.