API
Mga kaganapan
Inilalarawan ng event ang isang bagay na nangyari sa laro: may player na pumasok, may block na nasira, may nasaktan. Hindi nito inilalarawan kung aling internal na code ng laro ang tumakbo, kaya patuloy na gumagana ang mod na nakikinig sa join kahit magbago ang code na iyon.
Pakikinig sa event
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)
}
}
}
}Sa CraftScript, magagamit bilang variable ang mga property ng event (player, block…) o sa pamamagitan ng pangalang ibibigay mo rito (on break(e)). Puwede kang makinig sa bawat event mula sa kahit ilang file: ilagay ang bawat patakaran sa file ng paksa nito.
Lahat ng event
Lahat ng ito ay nagfa-fire sa totoong laro, sa client o sa server ayon sa naaangkop. Sa CraftScript, puwede mong gamitin ang maikli o ang mahabang pangalan sa snake_case (join o player_join).
| CraftScript | Kotlin | Mga property | Puwedeng kanselahin |
|---|---|---|---|
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 | Oo |
respawn |
PlayerRespawnEvent |
player, location | |
death |
PlayerDeathEvent |
player, death_message, keep_inventory | |
interact |
PlayerInteractBlockEvent |
player, block, hand, item | Oo |
interact_entity |
PlayerInteractEntityEvent |
player, entity, hand, item | Oo |
attack |
PlayerAttackEvent |
player, target | Oo |
key |
PlayerKeyEvent |
player, key | |
use_item |
PlayerUseItemEvent |
player, item, hand | Oo |
command |
PlayerCommandEvent |
player, command | Oo |
break |
BlockBreakEvent |
player (puwedeng null), block, drop_items | Oo |
place |
BlockPlaceEvent |
player (puwedeng null), block, placed | Oo |
spawn |
EntitySpawnEvent |
entity | Oo |
damage |
EntityDamageEvent |
entity, damage_type, amount (nababago), attacker | Oo |
entity_death |
EntityDeathEvent |
entity, drops | |
hit |
ProjectileHitEvent |
projectile, shooter, entity or block | Oo |
ready |
ModsLoadedEvent |
mod_ids | |
plugin_reload |
PluginReloadEvent |
plugin_id |
Pagbago sa nangyayari
May mga property na puwedeng baguhin, at sinusunod ito ng laro:
| Kaganapan | Katangian | Epekto |
|---|---|---|
chat |
message |
Ang bagong text ang sasabihin ng player. |
command |
command |
Ang bagong command ang tatakbo, bilang ang player na iyon. |
join, quit |
join_message, quit_message |
Ina-anunsyo sa lahat, bukod sa mensahe ng laro. |
respawn |
location |
Doon magre-respawn ang player. |
break |
drop_items = false |
Walang ida-drop ang block. |
damage |
amount |
Ang bagong value ang damage na matatanggap. |
entity_death |
drops.add(…) |
Babagsak kung saan ito namatay ang mga idinagdag na item, bukod sa normal nitong loot. |
on entity_death(e) {
if e.entity.type == "minecraft:zombie" and chance(0.05) {
e.drops.add(item("rubies:ruby", 1))
}
}Ang interact_entity ay right click sa isang entity: kapag kinansela mo, walang mangyayari (walang paggatas, pakikipagkalakalan o pagsakay). Ang attack ay player na tumatama sa isang entity: kapag kinansela, walang tama. Nagbibigay ang damage ng attacker, ang nasa likod ng pinsala: ang umatake o ang bumaril ng projectile. Tumatakbo ang key kapag pinindot ng player ang key ng isang mod (tingnan ang Interface).
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() }
}Hindi pa naipapatupad. Sa death, wala pang epekto ang pagbago sa death_message o keep_inventory. Isang beses itong binababalaan ng Crafting sa log sa halip na tahimik na hindi pansinin.
Priority at cancellation
Pagkakasunod: highest, high, normal, low, lowest at monitor. Kapag kinansela ng isang listener ang event, hindi na tatakbo ang mga kasunod, maliban sa mga listener na monitor (at sa Kotlin, ang mga nagpapasa ng ignoreCancelled = true). Nagmamasid lang ang listener na monitor: hindi nito dapat baguhin ang event.
on damage(e) priority high {
if e.damage_type == "minecraft:fall" {
e.amount = e.amount / 2 // mas malambot na bagsak
}
}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}")
}
}
}Kapag may pumalya
- Nilo-log kasama ang pangalan ng mod nito ang listener na nag-throw ng error, at patuloy na tumatakbo ang ibang listener.
- Ipinapakita ng
/crafting profile(dalawang beses: simulan, saka tingnan) kung gaano karaming oras ang ginugugol ng bawat mod sa mga event nito. - Hindi man lang binubuo ang event na walang nakikinig, kaya walang gastos ang pakikinig sa iilang event.