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

events/mining.craftCraftScript
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)
    }
}
events/MiningEvents.ktKotlin
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.
events/hunting.craftCraftScript
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).

events/entities.craftCraftScript
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.

events/falls.craftCraftScript
on damage(e) priority high {
    if e.damage_type == "minecraft:fall" {
        e.amount = e.amount / 2        // mas malambot na bagsak
    }
}
events/ChatEvents.ktKotlin
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.