Scarpet - gnembon/fabric-carpet GitHub Wiki
"Scarpet is a fully featured, in-game, programming language that you can use to code new tools and new behaviours, and all of it's in-game, preserving the vanilla feel. Ummm, so it works little bit like datapacks. So if you have an itch to, maybe do some, err programming in minecraft, or you haven't programmed, and you just want to learn how to code, in your favourite game, that might be a good place to start" - gnembon
Scarpet comes built into the carpet mod. Check the releases page of this repo for the most recent version, and the changelog at the bottom to see what's new
You can go to this page and get all the apps you want
Then go to world saves file, and create a new folder called scripts and in it put all your .sc files
Then open the game and type in command /script load scriptname
Then the script will run. Some apps require you to add global at the end, in which case it will tell you (usually in the form of an error message) and then you just do /script load scriptname global
(All programs are available as is. They might be incorrect, they might be outdated. If you see some problems, either open a pull request with a fix or report on the bug tracker for someone else to look into it)
Open a new file in your scripts folder caled scriptname.sc and then write whatever code you want, and then run it to see if it works.
Pro tip: Do this in a specific world, away from anything delicate. Test your scripts there THEN take them over to your actual world where you may wish to use them.
That's ok, cos there are some docs here which explain it all. It just takes some practice and dedication, and you'll get there in the end. Perseverance is the defining factor of a winner. (I feel like Socrates now)
Scarpet currently has support for the following editors:
-
Notepad++ (by gnembon): Get the most current version
-
IntellijIDEA (by gnembon): Read the document
-
VScode (by Uriel/ImUrX): Get the latest version and install it into VSCode using instructions on Readme if you don't know how
-
Atom (by replaceitem): Installation instructions are in Readme
-
SublimeText (by lucifiel1618): Obtain via built-in package management as described in the README file
-
Kate (by Federico Carboni): Installation instructions are in the readme
-
Scarpet Language Server — advanced language features like autocomplete and refactor for any editor with support for language servers
- changed and expanded available entity descriptors for entity_list and entity_area, Now they support all entity types and categorizations. Previous
- descriptors that were not consistent, like 'players' or 'items' are removed.
- improved precision of entity targetting with entity_area.
- added label to supported shapes as floating text
- allow for discrete snapping of client shapes, using 'dxdydz' as opposite to 'xyz'
- type of 'task' is reported properly
- expanded entity API with 'path', 'brain', 'active_block', and 'breaking_progress' functions
- solved hash collisions for shapes caused by vanilla vec3d(-8,8,-8) == vec3d(8,8,8)
- added
__on_player_swaps_handsevent handles - fixed issue where command-defined events were preventing apps events from registering
- attached entity events (via
entity_event) will execute with the context (dimension, position, etc) of the entity - events of taking damage, block breaking, and using item are called a bit earlier - before they have an effect in vanilla
- fixed nbt values reporting their initial value despite being modified
- events of updating hotbar slot and craft request will trigger only once
- addition on maps treats them like sets and produces merged maps. Lists operations are still propritizing vector approach, not lists approach.
- new structure and
plop(world gen) API for 1.16.2 (incoming) support for features and structures in json. Your previous names used with structure API and especiallyplopwill not work but going forwards, names will be compatible with Mojang datapack specs. - documented how to setup scarpet markers as armorstand type markers
- Officially supported new map and list constructor syntax. You have 1.4.0 and are missing
{}and[]- don't worry - it works in 1.4 as well, it is just not documented. Previous functional notation (usingm()andl()) is fully supported and the 'proper' way to do it. -
->operator in map constructor context now returns a tuple of its arguments. To construct a set of functions, you would have to add them one by one now, as->will be creating pairs, not defining functions Previously:Now, this would also work:__config() -> m( l('stay_loaded', true) ); global_precious_blocks = l('dirt', 'stone');
__config() -> { 'stay_loaded' -> true }; global_precious_blocks = ['dirt', 'stone'];
- fixed lighting issues when resetting chunks with
reset_chunk. Now it all resets properly. Thanks to PhiPro - added persistence (
queryandmodify) to the entity API -
without_updatesandin_dimensionshould now be thread safe - support for threaded execution via
task,task_value,task_join,task_count,task_completed,synchronizeandtask_dock. - added import support - allows to modularize your apps and use libraries (extension .scl)
- structure API to query and modify game structures via
structures,structure_set,structure_eligibility - POI API to access and make changes to the POI system via
poiandset_poi - global system variables for better interapperability via
system_variable_getandsystem_variable_set - noise generation via
perlinandsimplex - scoreboard API via
scoreboard,scoreboard_add,scoreboard_remove,scoreboard_display - client facing shapes drawing via
draw_shape - ability for scripts to read, load and write to files of with NBT and plain text. Better organization of scripts files
- API for handling stats via statistics and event
__on_statistic - added game event handlers
__on_player_interacts_with_block__on_player_places_block__on_chunk_generated__on_lightning__on_player_takes_damage__on_player_deals_damage__on_player_dies__on_player_respawns__on_player_connects__on_player_disconects__on_player_chooses_recipe__on_player_switches_slot- added
__on_close - events with global scope (like
__on_tick) can only be triggered for apps with global scope. - expanded entity api:
permission_level,effect,breeding_age,pose,display_name,command_name,team,gamemode,jumping,jump,silent,gravity,fire,hunger,saturation,exhaustion,add_exhaustion,nbt,nbt_merge - added stack traces to error messages
- player enderchest access
- support for '\n' and '\t' characters in strings
- added
seed,in_slime_chunk,reset_chunk,without_updates,c_for,is_chunk_generated,world_time,day_time,inhabited_time,last_tick_times,spawn_potential,portal_cooldown,portal_timer,add_chunk_ticket,reload_chunk,view_distance,mob_counts,unix_time,convert_date,parse_nbt,encode_nbt,recipe_data - better support for break and continue in functions like scan and volume
- added support for all new nether blocks, materials, sounds, etc
- set_biome is now y value sensitive. Use 0 in the end and overworld, and actual Y value for the nether
- lots of bugfixes...
- allowed for much smaller transparencies for scarpet client-facing shapes
- allowed for /-+_/ characters in file names for app accessed files
- improved performance in handling ops in NBT tags
- added more options to handle block properties and block data support for set
- added parse_nbt and encode_nbt as ways to convert scarpet values from and to nbt tags
- added
nbtandnbt_mergeto entity modify API - added
unix_time()andconvert_date()for date / time manipulations - added support for block position arguments and triples for
scan,volume,rectanddiamond - added hooks for
__on_player_chooses_recipeand__on_player_switches_slotevents - added
recipe_data()andcrafting_remaining_item()- for convenient and easy crafting scripts - added optional player argument to print. when called print(player, msg) it will only display this message to that player.
- added
cylindershape to scarpet shapes - ability of sending shapes via
draw_shapein bulk to minimize network packets - duration of shapes can be set to 0 - this turns them off immediately
- added ability for shapes to snap to various combinations of coordinates, not only to all of them
- switched to 64bit FNV-1a algorithm for keying of shapes to minimize collisions
- optimized rendering of shapes that do not render all faces/lines
- shapes that 'follow' entities now move smoothly with high framerates, not just 20/s
- inventories for players can be specified as strings (player names) as well as 'enderchest_' to denote their enderchest content
- added hunger, saturation, exhaustion and add_exhaustion to (player) entity API
- added read_file, delete_file, and write_file as preferred functions to access external files. use of load_app_data and - - store_app_data on external files is now deprecated (still supported) and its use is limited to the system managed app tag.
- added the ability to handle textual files, apart from nbt files.
- added mob_counts() (1.16 +) to query mob cap information in scripts
- added 'cylinder' shape to scarpet shapes
- ability of sending shapes via
draw_shapein bulk to minimize network packets - duration of shapes can be set to 0 - this turns them off immediately
- added ability for shapes to snap to various combinations of coordinates, not only to all of them
- switched to 64bit FNV-1a algorithm for keying of shapes to minimize collisions
- optimized rendering of shapes that do not render all faces/lines
- shapes that
followentities now move smoothly with high framerates, not just 20/s - inventories for players can be specified as strings (player names) as well as 'enderchest_' to denote their enderchest content
- added hunger, saturation, exhaustion and add_exhaustion to (player) entity API
- added read_file, delete_file, and write_file as preferred functions to access external files. use of load_app_data and store_app_data on external files is now deprecated (still supported) and its use is limited to the system managed app tag.
- added the ability to handle textual files, apart from nbt files.
- added
__on_player_connectsand__on_player_disconnectsevents - added
view_distance()as reported by the game - events now cannot be registered and handled in libraries and imports. each app has to define its callbacks directly in the app main file to handle those.
- added
draw_shapeallowing rendering of custom shapes to clients. Vanilla clients connected to carpet servers will receive replacement rendering based on dust particles. Drawn shapes can be static, or follow entities. GitHub - cleaner log when placing structures and features
- added
reload_chunkto resend chunk data to the clients, and added option to set_biome not to update chunk data with the clients - added
add_chunk_ticketto temporarily load remote chunks. Only natural chunk tickets are supported at the moment results of poi come out sorted by center distance as of now. - added
portal_cooldownandportal_timerto entity API query and modify - better handling of errors in docked section of threaded tasks to merge stack traces all the way to the top of the thread
- renamed 'vine' material to 'vegetation' and 'redstone_bits' to 'decoration'
- arguments for
scheduleandtaskwill be evaluated at the time of call, so things likeloop(10, task( _(outer(_))->print(_)))now pass arguments as you would expect them to do. - added
task_dockto allow tasks to run a block of code in a server-synchronized fashion - fixed multiple typos in scarpet docs (thanks to James103)
- fixed double evaluation in
spawnfunction -
place_itemcan now handle non-block items, like bonemeal, flint and steel, or axes - added
spawn_potential - added
structure_eligibilitythat works likestructures, but return structure information based on seed, not the structures actually placed in the world - fixed multiline strings in apps causing error lines in error reports and stack traces to be offset.
-
scoreboard_remove(objective, player)will now remove score for a given key - added
format()function to allow for text formatting, including custom RBG colors for 1.16 - added
gamemode(which accepts strings, case insensitive, or numbers 0-3),jumpingwhich makes you jump continuously, andjumpto make you jump once,silentandgravitywith boolean modifiers andfirewith no. of fire ticks (0 for extinguishing) tomodify - added
query(e, 'category')to get mob category: monster, creature, ambient, water_creature, misc and water_ambient in 1.16+ - scarpet programs loaded via world scripts folders are now referred to as scarpet apps.
- functions are now proper function values, and are closures thanks to the redefined
outercall, so they can hold state. Good alternative to global values. - added anonymous functions via
_(args) -> body - scripts now ignore redundant and unnecessary extra semicolons - feel free to spam them at the end of expressions, even if not needed.
- added
callto call functions directly (by name or lambda reference) - added
copyfor deep copy of nested values. With that - all values are now passed by reference in function arguments - added
loaded_status(),generation_status()andchunk_tickets()to debug loading issues using scarpet. - calling
block()directly on a block value, like inscan()will cause to resolve it. Otherwise block values are lazy until they are needed. - apps can now bind to the events on the fly, no need to have callbacks defined only on the first code pass
- entity events are now separated between apps. There can be multiple apps running the same entity at the same time, not knowing about each other.
- loops and higher order functions now will not accept the
exitblock, sincecontinue()andbreak()functions were introduced to use in loops and higher order functions. - restored
plopfunction for 1.15 - scarpet markers are cleaned automatically if an app is not loaded.
- added
replace(str, regex, repl),replace_first(str, regex, repl),escape_nbt - added new entity options,
aiandno_clip
- added ability for apps to keep their persistent state using
load_app_dataandstore_app_datafunctions - added maps via
m()function - added proper nbt support via
nbt()function - all containers (lists, maps and nbts) now have unified api via
get,has,putanddeletefunctions - added L-value behaviour to certain functions and operators, like
get,has,put,delete,=,+= - new
:operator - highest priority - to access containers elements, alias forgetfunction - changed priority of
~match operator to match: - numbers have to start because of that with a number, so
.123won't float anymore, use0.123instead - added
in_dimension(dimension, expr)to change the execution context for the subexpression, for instance to place blocks in the nether while running a script in the overworld - added carpet mod setting
/carpet scriptsAutoloadto automatically load scarpet packages from disk on server / game start which works even with/scriptcommand fully disabled. However, scipts to stay loaded need to return proper app config by defining__config()function. See/script loadsection for details. - added
entity_eventto add functions to be called when certain events happen for an entity - added four more general use events:
player_releases_item(bows, aborting actions, controlled client side),player_finishes_using_item(item consumed, eating etc. server controlled),player_drops_itemfor single item dropped, andplayer_drops_stackfor dropping entire stack.
-
topto get the top block at position now requires full block coordinates, but Y value is ignored. - Inventories of blocks and entities got their API as well. Check
stack_limit,inventory_size,inventory_get,inventory_set,inventory_find,inventory_removeanddrop_itemfunctions. - scripts loaded from disk (via /script load/unload command) will operate in each player space by default, unless loaded with
sharedoption. - the newline markers for 'in-commandblock' type scripts are now fully parsed, meaning you can have
$in strings.$markers are supported only with in-game cases. - support for comments via
//in scripts loaded from world files. Comments are only allowed in external file scripts. - tab completion for typing programs in commands manually (in /script command)
- unloading/reloading a module removes all event callbacks from that module
-
return,throw,exit, as well as the 'catch' expression oftrycan be omitted, assumingnull - if with no
elseexpression will 'else' tonull -
element(list,index)has been deprecated, and replaced withget(value,address), working on lists as well as nbt constructs - there is a new
nbttype, that behave like string, but can be queried with get more efficiently - primitive types of nbt are now converted to primitive scarpet types when queried. This doesn't apply to compound nbts
- iterators, like
range,rect, can be reused and moved about in a variable. - added
typefunction to recognized held variable type. -
strformat arguments can now be passed in a single list - block values now properly handle block entity data, meaning
set-ting a chest from another location will retain its content. - therefore set can also accept custom BE tag?
-
place_itemto replicate the action of a player placing a block of item -
set_biometo sets permanently a custom biome at a position. For those missing a custom command to do that in carpet, just use/script scan 0 0 0 x1 0 z1 x2 0 z2 set_biome(_,'swamp')for the same effect -
block_propertieslists all available block properties at position -
block_datareturns nbt of a block at position -
propertymakes sure all value comes out lowercased. -
spawnfunction to spawn entities like /summon command but retaining access to them. -
entity ~ 'look'will return a look vector of an entity. No need to math yaw pitch here. -
entity ~ 'selected_slot'to return current selected slot for players -
entity ~ 'facing'returns a facing order of a player -
entity ~ 'trace'ca be used to ray trace blocks, liquids and entities - entity
~sugar can now support - fixed
modify(e,'custom_name',null)to actually clear custom name -
create_markerandremove_all_markersfor easy marking I guess - fixed 'double evaluation' caused by print function
- setting various entities motions and positions should update properly to the clients
- fixed
thoughts too dopewhen trying to compare list to a number
- Added 1.14 specific structures to plop for 1.14 (fabric-carpet)
- added
destroyandharvestfunctions for other valid methods of breaking blocks - added
scheduleto delay execution of user defined functions for later ticks - scarpet now allows to intercept most important user actions related events. Check
utilities\event_test.scand load via/script load event_testto test event handling.
- fixes to lists handling
- fixed issue with running 'run' command in functions
- scripts can now be loaded from files in /scripts/ folder inside world directory. These also can be edited normally, without extra $ to indicate new lines.
- each file represents a package and is run independently from others.
- /script load/unload
- /script in run/invoke etc...
- script modules loaded from scripts / bundled with carpetmod can make new commands. details - later.
-
putfunction to modify lists content -
_in loop functions can be used to change content of sublists - minor performance improvements
- scripting engine will reset with world loading
- typos with gragon eggs
- player movement is much smoother when controlled with
modifyfunction -
loadedandloaded_epwon't load the points, lol - if executed as
/execute as @p script run...print will output to players chat, not system log - no need to disable commandBlockOutput - scripts will no longer output results of intermediate results.
- everything