Mga gabay

CraftScript

Ang wika ng Crafting. Mga keyword sa English, maikling syntax, walang compile: ise-save mo ang file at magre-reload ang mod. Gumagana ito para sa mod na sampung linya at para sa mod na apatnapung file na may mga class at type.

Ang kaya mong gawin ngayon

Bahagi Paano
Mga item item "ruby" { … }: rarity, glint, pagkain, tool, durability, texture, creative tab, aksyon kapag ginamit.
Mga block block "ruby_ore" { … }: hardness, resistance, liwanag, tunog, tool at pinakamababang tier, mga drop, friction, transparency, use action. Mga hugis at model: tingnan ang Mga hugis ng block. Hagdan, pinto, bakod, chest, karatula, pananim, ore at ang iba pang uri ng block ng laro, mga upuan at block na dalawa ang taas: tingnan ang Mga uri ng block. Puwede ring tumugon ang mga block sa mga hakbang at tick, maging portal, magkaroon ng mga state, gumamit ng redstone at magtago ng mga item: tingnan ang Mga bloke, gamit at resipe.
World generation ore, tree, patch, structure, biome: ang lumilitaw sa mga bagong chunk; terrain, biome_map, carver at mga istruktura na may plan/build para sa lupain, mga biome, mga kuweba at mga gusaling gawa ng code. Tingnan ang World generation at Paglikha gamit ang code.
Mga nilalang creature "ghost" { … }: ang katawan ng isang nilalang sa laro na may texture mo o sarili mong 3D model, stats, behaviour, target at loot, pati kusang paglitaw, pagpapaamo, pagpaparami, pagsakay, pag-atake mula sa malayo at mga animation na may keyframe. Tingnan ang Mga nilalang.
Mga tunog at partikulo sound "chime" { file: … }, particle "spark" { textures: … }; ginagamit ayon sa id. Tingnan ang Mga tunog at partikulo.
Mga recipe recipe shaped, shapeless, smelting. Awtomatikong ginagawa para sa iyo ang mga model, loot, tag at salin.
Mga kaganapan on join, on break(e)… bawat event, may priority at cancellation.
Armor, sandata, cooldown armor: { slot, defense, texture } para isuot, on_hit kapag tumama, cooldown sa pagitan ng mga gamit. Tingnan ang Mga block, item at recipe.
Mga effect, attribute, kagamitan e.add_effect(…), e.attribute(…), e.set_attribute(…), e.set_equipment(…). Tingnan ang Ang mundo at mga player.
Mga key key "dash" { label: "Dash", default: "R" } at on key(e); mga event ng entity na on interact_entity at on attack. Tingnan ang Interface at Mga event.
Mga command command pay(to: player, amount: int) requires "eco.pay", may alias, paglalarawan at mga permission.
Oras every 5 minutes { }, after 10 seconds { }, on tick.
Mundo at mga player Mga block na may state, entity, pagsabog, particle, tunog, oras ng araw, chest, sign; inventory, health, title, teleport. Tingnan ang Ang mundo at ang mga manlalaro.
Interface form(…) at player.show_form, server.boss_bar, player.set_sidebar. Tingnan ang Ang interface.
Saved data p.data.set("rubies.visits", n), p.data.get_int("rubies.visits"): sa mga player, entity, block at mundo; nananatili kahit mag-restart. Tingnan ang Ang mundo at ang mga manlalaro.
Settings at networking config("settings", { … }), listen, send, send_to_server. Tingnan ang Config at network.
Malalaking mod Opsyonal na type, class na may inheritance, enum, module, constant.

Sa Kotlin lang: trabaho sa background, mga Java library, at, sa world generation, mga feature at tag na gawa ng code.

Mga file

Ang isang mod ay iisang file (mods/gems.craft) o, mas mabuti kapag lumaki na, isang folder na may main.craft at ang mga file na ini-import nito. Nagsisimula ang main.craft sa header na mod, na nagbibigay ng id, pangalan at bersyon:

mods/rubies/main.craftCraftScript
mod "rubies" { name: "Rubies", version: "1.0.0", author: "you" }

// What exists
import "content/items"
import "content/ores"
import "content/world"
import "content/dimensions"
import "content/creatures"
import "content/sounds"
import "content/particles"
import "content/recipes"

// What happens
import "events/mining"
import "events/hunting"
import "events/welcome"
import "commands/realm"
import "commands/rubies"
import "commands/shop"

Kung paano hatiin sa mga folder ang natitira, at kung bakit: Pag-aayos ng mod.

Mga value at variable

lib/values.craftCraftScript
let coins = 100
const MAX_HOMES = 3                          // const: hindi na puwedeng i-reassign
let greeting = "May {coins * 2} coin ka"
let names = ["Ana", "Ben"]
let prices = { gold: 5, ruby: 2 }

names.add("Cleo")
prices["diamond"] = 9
log(len(names), prices.gold, prices.keys())

Mga numero (laging decimal), string, true/false, null, list at map. Nag-i-interpolate ng {expression} ang double quote; nagsusulat ng literal na brace ang \{. Hindi nag-i-interpolate ang single quote. Isinusulat gamit ang & ang mga kulay ng chat: "&aGreen".

Daloy ng kontrol

lib/flow.craftCraftScript
fun describe(coins: number, banned: bool): string {
    if coins > 100 and not banned {
        return "mayaman"
    } else if coins == 0 {
        return "walang pera"
    }
    return "ayos lang"
}

fun countdown() {
    for i in 1..5 { broadcast("{6 - i}…") }    // inclusive na range
    for p in players() { p.send("Takbo!") }
}

fun who(target: Player?, fallback: Player): string {
    let p = target ?? fallback                  // ?? : value kapag null
    return p?.name ?? "wala"                    // ?. : ligtas kapag null
}

Mga function

lib/rewards.craftCraftScript
fun give_rubies(p: Player, amount: number = 1) {
    p.give(item("rubies:ruby", amount))
}

fun healthy(): list<Player> {
    return players().filter(fun(p) { return p.health > 10 })
}

Mga parameter na may default value, return, at mga anonymous function gamit ang fun(x) { … }, na siyang paraan para ipasa ang mga ito sa map, filter o on_use.

Mga kaganapan

Sa loob ng on, variable ang mga property ng event (player, message, block…), o puwede mong pangalanan ang event: on chat(e). Kinakansela ito ng e.cancel() kung puwede itong kanselahin.

events/chat.craftCraftScript
const BLOCKED = ["spam", "scam"]

on chat(e) priority high {
    if BLOCKED.any(fun(w) { return e.message.contains(w) }) {
        e.cancel()
        e.player.send("&cMaging magalang po tayo")
    }
}

Mga utos

commands/heal.craftCraftScript
command heal(target: player?, amount: number?) requires "rubies.heal" alias "h" describe "Pagalingin ang isang player" {
    let p = target ?? player
    if p == null { return "Magbigay ng pangalan ng player" }
    p.health = min(p.max_health, p.health + (amount ?? 20))
    return "Pinagaling si {p.name}"
}

Sa loob ng command, meron kang sender, player (o null kung ang console ang nagpatakbo nito) at args. Ang anumang i-return mo ay ang sagot. Kung may kulang na argument o mali ang type nito, makikita ng player ang tamang paggamit.

Oras

events/reminders.craftCraftScript
every 5 minutes { broadcast("&6Huwag kalimutang bumoto") }

after 10 seconds { log("10 segundo nang tumatakbo ang server") }

Malalaking mod

Opsyonal na type

Kung saan ka nagsulat ng type, ipinapatupad ito; kung saan hindi, malaya ang code. Kahit wala kang isulat, alam ng checker ang mga type ng buong API:

events/welcome.craftCraftScript
on join {
    player.helth = 20          // typo
    player.name = "Admin"      // read-only na property
    player.give()              // kulang ang argument
}
crafting checkText
welcome.craft:2: error: Player has no property 'helth'. Did you mean 'health'?
welcome.craft:3: error: Player.name is read-only
welcome.craft:4: error: give() expects 1 argument(s), got 0
lib/heal.craftCraftScript
fun heal(p: Player, amount: number = 20): bool {
    p.health = min(p.max_health, p.health + amount)
    return true
}

// heal(player, "a lot")  →  error: Argument 'amount' of heal() must be number, got string

Mga type: number, string, bool, id, list<T>, map<T>, T? (puwedeng null), any, void, fun, ang mga type ng API (Player, World, Block, Entity, ItemStack, Location, Inventory…), mga event, at ang sarili mong mga class at enum. Pagkatapos ng check sa null, alam ng checker na may value:

commands/home.craftCraftScript
command home(target: player?) {
    if target == null { return "Magbigay ng pangalan ng player" }
    target.teleport(world().block_at(0, 80, 0).location)   // hindi na null ang target dito
}

Mga class

lib/wallet.craftCraftScript
class Wallet {
    coins: number = 100

    fun pay(n: number): bool {
        if n > this.coins { return false }
        this.coins -= n
        return true
    }
}

class VipWallet extends Wallet {
    fun pay(n: number): bool {
        return super.pay(n / 2)      // kalahati lang ang binabayaran ng mga VIP
    }
}

Error ang pag-assign sa field na hindi idinedeklara ng class (para hindi makalusot ang mga typo). Kung may init(…) ang class, iyon ang constructor; kung wala, pinupunan ng mga argument ang mga field ayon sa pagkakasunod. Tinitingnan ng is(value, Class) ang type.

Mga enum

lib/rank.craftCraftScript
enum Rank { PEASANT, KNIGHT, LORD, KING }

fun rank_for(coins: number): Rank {
    if coins >= 1000 { return Rank.LORD }
    return Rank.PEASANT
}

// Rank.LORD.name → "LORD", Rank.values() → [PEASANT, …], Rank.from("king") → KING

Mga module

events/economy.craftCraftScript
import { VipWallet } from "/lib/wallet"
import { rank_for } from "/lib/rank"

let wallets = {}

on join {
    wallets[player.name] = VipWallet()
    player.send("Ranggo: {rank_for(wallets[player.name].coins).name}")
}

Puwedeng i-import ang lahat ng idinedeklara ng isang file sa labas ng anumang block: mga function, class, enum, constant. Isang beses lang tumatakbo ang bawat file kahit ilang file ang nag-i-import dito.

Pag-check, pag-reload at kaligtasan

  • Tinitingnan ang lahat kapag nilo-load ang mod: pinipigilan ng error ang pag-load nito at sinasabi kung saan; napupunta sa log ang warning. Ganoon din ang ginagawa ng crafting check main.craft mula sa terminal, sinusundan ang mga import.
  • Sa development mode (-Dcrafting.dev=true, laging naka-on sa crafting sandbox), nire-reload ng pag-save ang mod; ganoon din ang /crafting reload <id>. Kailangan ng restart ng laro ang bagong item o block; agad na nagbabago ang lahat ng iba pa.
  • Ang Crafting API lang ang nakikita ng script: hindi ito makakabasa ng file, makakapagbukas ng koneksyon o makakagamit ng mga Java class.
  • May limitasyong 2,000,000 hakbang ang bawat event, command o timer: pinuputol nang may error ang walang katapusang loop sa halip na i-freeze ang server.
  • Nilo-log kasama ang file at linya ang runtime error, at patuloy na tumatakbo ang server.

Bawat function, operator at member: Sanggunian ng CraftScript.