Replies: 3 comments 1 reply
-
This is definitely too much to discuss each point in depth, but I'll try to cover a few things that came to my mind when reading it.
That sounds very similar to
Sounds interesting, but I'm not convinced that it provides intuitive usability. Might be interesting to have a working example and figure out things that can be changed based on that.
This shounds like something that should be added to WE.
Besides other usability issues, teleporting to random positions sounds like a bad idea. While such a command might be useful, it needs careful considerations to cover actual use cases.
While this could work for globbing, there currently is no way to serialize a command, and whether it is possible to serialize any command is unclear. Also,
Definitely something that should be done in WE.
I wanted to work on this for years but just hadn't enough time. I think such feature should be its own plugin, as it's a rather specific use case and, more importantly, it needs to be maintained (which is the reason it's not implemented currently).
The only real use case I see for this is to switch blocks so no temporary block is needed. I'm not sure if that's needed on a regular basis.
Something like that can be done outside of FAWE. As with other features, it increases maintainance cost while presumably being useful for only a very minor audience.
Stretch and compress should already be possible with
There are a lot of things to consider for such a feature, e.g. validation, global vs per user shortcuts, etc...
This sounds just like a different way to do
I'm not sure if there is actual need for that. It might be more interesting to have selection/clipboard cropping.
I think such functionality should be provided via a third party plugin
Fuzzy searching schematics sounds interesting and useful. Maybe it can be integrated into
I'm not sure if there is need for that.
Big no. Mixing up masks with something that makes the command do something completely different is confusing and also not really supported by both brigadier and the WE command system. I know that clearing might be unintuitiv at the moment, but this should be solved in a different way.
This needs hardcoding, heavily increasing maintainance cost.
This was discussed before. We rather want all that functionality in a standalone plugin, using e.g. Arkitektonika.
The idea itself is good. It should be rather discussed to be included in WE. Some terms are rather technical, and I don't think it needs to be a stack. But those are details that can be discussed before and during implementation, with careful evaluation.
Definitely a good idea, but it requires a careful implementation to avoid abuse.
I'm not sure if I understand the use case.
FAWE already supports [].
Patterns don't have percentages but weights. For masks, it doesn't make sense to add up to 100%.
Block tags can already be used as
This sounds like another
Already exists: https://worldedit.enginehub.org/en/latest/usage/general/masks/#random-noise-mask
Sounds like a good idea, the actual syntax can be discussed.
I've never encountered bad results myself, but it's unclear what exact feature you're referring to. We can probably switch to one of the many other RNGs in the JDK. In won't go into detail for the other stuff for now, but I got a few general points: Basically everything that extends expressions should really be discussed in WorldEdit. FAWE does not touch it at all at the moment and that's good. We're always happy about improvements, but basically everything that is more than just basic refactoring should be discussed before. I hope this helps to orientate. |
Beta Was this translation helpful? Give feedback.
-
Many thanks for your comments. Several things:
I agree that trying to implement new things in FAWE will accumulate tremendous technical debt in FAWE, but what's the alternative if WorldEdit is not very accepting of outside changes? I'm off to continue my RNG improvement in WE, and I expect that it will be rejected or ignored despite the benchmarks and unit tests proving its validity and that I'll have to be a FAWE-only feature. Your comment helped a lot with orienting |
Beta Was this translation helpful? Give feedback.
-
What is the current status of the fabric-related items here? |
Beta Was this translation helpful? Give feedback.
-
I feel I am finally ready to present my master plan for overhauling FAWE, and I would like your input and your suggestions on what I should be working on, how I should change my approach, or what else I should consider:
Features/Improvements (the fun part!):
NOTICE: I have barely started work on all these, so I will have to prioritize which to start working on as I won't be able to implement many of them.
New commands:
//pin
and//unpin
//autorotatepaste [-abenosr] [-m <sourceMask>]
//arp
+X+Y+Z
,-X+Y+Z
,+X-Y+Z
,-X-Y+Z
,+X+Y-Z
,-X+Y-Z
,+X-Y-Z
, and-X-Y-Z
//copy
//autorotatepaste
//rotate
-r
option makes the paste relative to your position (instead of pasting from pos1 to pos1) as if you were pasting normally.//help-masks
for listing a quick cheatsheet of examples of FAWE mask commands//help-patterns
for listing a quick cheatsheet of examples of FAWE pattern commands//tpsel [-s <n>] [<x> <y> <z>]
(also, internally,//tpsel -s .<hashCode>
)//seltp
-s <n>
option ties it in.)//tpsel
and//tpsel -s .<hashCode>
):tp
command centered at the middle of your selection.//tpsel ~ ~ ~30
would TP you to 30 blocks above the centerpoint of your selection-s <n>
option makes//tpsel
use then
th selection on the stack instead of the current selection not on the stack.//echo
command//echo replace mud_brick_* air
will print the text@> replace mud_brick_slab,mud_brick_stairs,mud_brick_wall air
to the console//echo replace "#tag[mineable/pickaxe] !gold_block !iron_block !diamond_block" stone
will print@> replace "(#tag[mineable/pickaxe]) (!gold_block) (!iron_block) (!diamond_block)" stone
//language <name code>
//draw [-w <width>] [-h <height>] [-f] [-c|-abenos] [-x <+x+y+z|-x+y+z|+x-y+z|-x-y+z|+x+y-z|-x+y-z|+x-y-z|-x-y-z|>] [-r <degrees>] <load|www|paste|save|scrape> <value> <block-pallete>
<block-palette
in the Minecraft world, or, if blocks is left unspecified, then all blocks.-c
flag saves to Clipboard and disables pasting directly in the world.-w
resizes the image to the specified width-f
fits the width/height of the image to the current selection. Which dimensions of the selection size correspond to the image's width/height depend upon the orientation of the image<+x+y+z|-x+y+z|+x-y+z|-x-y+z|+x+y-z|-x+y-z|+x-y-z|-x-y-z>
sets the orientation of the image.<degrees>
rotates the image about its orientation to the specified number of degrees.-abenos
have the same behavior as they do on the//paste
command//draw save [-abenos] <subreddit> <block-pallete>
//draw scrape [-l <upvotes=128>] [-m <upvotes=2048>] <subreddit> <block-pallete>
-l
sets the lower limit for upvotes. Use-l 0
or-l -1
to disable.-m
sets the maximum limit for the upvotes. Use-m -1
to disable.//draw scrape dankmemes
pulls a random image off https://www.reddit.com/r/dankmemes and draws it in the world//multireplace <mask> <pattern> [<mask> <pattern>...]
//multirepl
//mulitreplace dirt stone stone dirt
will swap all dirt blocks with stone blocks and vice-versa//actor <name> <command...>
command<command...>
as a fake player with the specified name/tp
command for moving the player around to different positions/entities and rotating.//jumpto
to move between worlds<name>
is created if they don't already exist.//actor john pos1 0,0,0
, then//actor john //pos2 100,100,100
, then//actor john replace gold_blocks stone
//actor daily:daily/restore tp 0 0 0
then//actor daily:daily/restore schematic load arena-time
then//actor daily:daily/restore tp 0 0 0
then//actor daily:daily/restore //paste -e
will reset the spawn area from schematic//actor
//clipboard <size|stretch|compress|crop|list|select>
commandsize
subcommand OR when run without arguments, it prints stats about the clipboard. (size and offset)stretch
subcommand://clipboard stretch [-d <away|towards>] <newWidth|%> <newHeight|%> <newLength|%>
-d away
compress
is alias ofstretch
crop
subcommand://clipboard crop [-w <width|%>] [-h <height|%>] [-l <length|%>] [-x <offset>] [-y <offset>] [-z <offset>]
//genclipboard
commands~
//clipboard list [-dn] [-p <page=0>]
subcommand provides a multipage menu of all clipboards on the multiclipboard object//clipboard select [-n 0]
subcommand selects which entry in the multi-clipboard to set as primary.//smooththatdoesnotsuck2d [-b 1] [-e <empty=#air>] [-p <pattern>] <strength=2.0> <mask>
command//stdns2d
//smooth
is the most sucky useless feature in WE/FAWE-b 0
to independently smoothen an area without reguard for adjacent areas.#air
.b
-degree polynomial at each position where a border block and an interior block are adjacent to represent the exact slope of the border blocks there (whereb
is the number of border blocks)b+1
polynomial that smoothly transitions from one side over to the other side.strength
to tween the slope map of the inner terrain towards the smooth slope//smooththatdoesnotsuck3d [-b 1] [-e <empty>] [-p <pattern>] <strength=2.0> <mask>
command//stdns3d
//smooth
is the most sucky useless feature in WE/FAWE//shortcut <list|move|new|delete>
//sc
#
are masks/patterns and all other shortcuts are available as//sc <shortcut> <args...>
${n}
, which shouldn't conflict with any know syntax in either.${n}
supports Bash parameter expansion syntax: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.htmlshortcuts.yml
file that//schematics list
is hard-coded to not list and schematic load ignores.//shortcut list [-dn] [-p <page=0>] <filter>
//schematic list
//shortcut move <oldName> <newName>
//shortcut new <name> <shortcut>
//shortcut new repair //replace air ${1}
creates a shortcut for replacing air blocks that can be used like so://sc repair stone
to replace all air blocks in selection with stone//sc new #valuables gold_block,diamond_block,netherite_block
creates a pattern/mask that can be used like so//replace #valuables waxed_copper_block
//shortcut delete <name>
//shortcut <shortcutName> <args...>
//shortcut history [-dn] [-p <page=0>] <text>
//schematic list
//shortcut search [-dn] [-p <page=0>] <text>
//schematic list
//shortcut export
//shortcut import <url>
//bmask <biomes>
//bmask desert,ocean
restricts edits to only those blocks in deserts/ocean biomes.//copynear [-xbce] [-m <mask>] <mask> <distance=64>
<mask>
block up to<distance>
away and forms a convex selection polygon around these blocks-x
to exclude the selected blocks from being included in the copy-m <mask>
to filter which blocks are copiedAdditional expression-guided generation commands
Continuation of the new commands section because it was getting too long.
//generatebuffer2d [-chor] <expr>
and//generatebuffer3d
commands//genbuf2d
for//generatebuffer2d
and//genbuf3d
for//generatebuffer3d
perlin
noise.buffer2d(x, z)
andbuffer3d(x, y, z)
functions//generate2d [-chor] <pattern> <expr>
//gen2d
<pattern>
, where<expr>
is evaluated at each X and Z to get the height//generateblock [-chor] <expr>
//generatebiome2d [-chor] <pattern> <expr>
//generatebiomeblock [-chor] <expr>
//genbiomeblock
//generatebiomeblock2d [-chor] <expr>
//genbiomeblock2d
//generateclipboard [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <pattern> <expr>
//genclip
//generateclipboard2d [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <pattern> <expr>
//genclip2d
//generateclipboardblock [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <expr>
//genclipblock
//generateclipboardblock2d [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <expr>
//genclipblock2d
//generateclipboardbiome [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <pattern> <expr>
//genclipbiome
//generateclipboardbiome2d [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <pattern> <expr>
//genclipbiome2d
//generateclipboardbiomeblock [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <expr>
//genclipbiomeblock
//generateclipboardbiomeblock2d [-chor] [-w <width>] [-t <height>] [-l <length>] [-x <offset>] [-y <offset>] [-z <offset>] <expr>
//genclipbiomeblock2d
~
)Expanded command arguments
These are new arguments/flags to be added to existing commands.
//schematic search [-dfn] [-p <page=0>] <text>
//schematic list
//rotate <rotateY> <clockwise/counterclockwise>
because it's kind of confusing//sel clear
and//gmask clear
to clear your selection/gmask.//sel
and//gmask
clearing their respective things will be preserved and will never be deprecated.//brush catenary -b <pattern>
<pattern>
to achieve fine-grained sub-block-precision.-b
argument forces whole Blocks and disables the usage of stair/slab variants.-m <mask>
option for//fill
and//fillr
-d <maxdist>
option for//fill
and//fillr
Add aliases/shortcuts for commands
These commands don't add any new functionality but provide shortcuts or aliases to existing functionality.
//upload
//download
your clipboard in order to upload a schematic which is crazy and unintuitive.//repeat
command as an alias for//stack
.//unextend
command//contract
but in opposite direction as//contact
. (That is,//unextend
is in same direction as and exact reversal of//extend
.)//extend
makes perfect sense to me and I use it all the time.//contract
messes with my head for some or whatever inexplicable reason. (Might be related to the fact that I mix up my right/left.)//tracemask
as alias for/tracemask
//seldraw
as alias for//drawsel
unbind
as alias fornone
in//brush
and//tool
. Also,//unbind
command//unbind
or//brush unbind
or//tool unbind
will unbind the brush/tool from the held itemNew
msel
andssel
family of commandsI made this its own section because it was getting a bit too long.
//msel <push|pop|delete|combine|clear>
//msel push
pushes your current selection onto the stack and reports the new number of items on the selection stack.//msel push <n>
inserts your current selection BEFORE then
th selection. (Such that you current selection becomes the newn
th selection in the stack.) Negative numbers are wrapped around to be from the end going backwards.//msel pop
pops the top selection off your selection stack and replaces your current selection with it.//msel pop <n>
popsn
selections off the top of the stack and fuses them together into one multi-selection.//msel pop all
runs//msel pop <n>
with the size of the stack//msel list [-dn] [-p <page=0>]
//schematic list
)//msel delete .<hashCode>
on it)tp
to it (which executes//msel tp .<hashCode>
on it)//msel delete <n>
or//msel delete .<hashCode>
deletes then
th item..<hashCode>
form is for internal use with//msel list
to make sure we properly track objects across intermediary changes to the stack, we prependn
with a dot to select the selection object by itsObject.hashCode
.//msel combine
is an alias for//msel pop all
//msel clear
nukes the stack but not not clear the selection//msel undo
and//msel redo
//msel
operations whereby every selection change or use of//msel
command adds an entry to this history.//msel undo
pops the last item off this history stack, restoring the selection and msel stack to before.//msel redo
recovers from the last//msel undo
via its own redo stack provided that no changes have happened in interim.//ssel <clear|delete|formats|list|load|move|save|search>
//schematic
but for selections and (optionally) the msel stack state//schematic
and//msel
for maintainability.//ssel save
has an addition flag,-m
, which also saves the msel stack state to the selection file..sel
file extension..sel
file extensions will need to be filtered out of//schematic list
New mask/pattern features
//replace mud_brick_* air
is equivalent to//replace mud_brick_slab,mud_brick_stairs,mud_brick_wall air
^
blockstate matcher//replace oak_* ^[mangrove_*][#existing]
//replace "(stone_bricks <air),(dirt <stone_bricks,dirt)" deepslate_tiles
#above
as alias for>
,#below
as alias for<
,#north
,#south
,#east
,#west
#visible
#skylight[<a>][<b=a>]
,#blocklight[<a>][<b=a>]
, and#light[<a>[<b=a>]
#haslight
as alias for#skylight[1][15],#blocklight[1][15]
#nolight
as alias for#skylight[0] #blocklight[0]
#light[<a>[<b=a>]
tests for effective light, which is the greater/maximum of skylight and blocklight.<b>
defaults to the value ofa
if left unspecified.#liquid
#sky
#transparent
#conductive
observer
s//set oak_sign{Text1:'{"text":"FastAsyncWorldEdit"}'}
//replace "(#solid >dirt) (#tag[mineable/pickaxe] <air)" light_gray_stained_glass
//replace "#tag[mineable/pickaxe] !gold_block !iron_block !diamond_block" stone
#tag[<name>]
mask//count #tag[goats_spawnable_on]
counts the number of stone, snow, snow_block, packed_ice, and gravel//count #tag[is_river]
counts the number of blocks whose biome is river or frozen_river#emitslight[<min>][<max=min>]
mask#opacity[<min>][<max=min>]
mask#solid
to be actually useful and mean actually solid blocks#solid
is an alias for!#air
->
block state transformation maps in patterns//replace smooth_stone_slab smooth_stone_slab[type=top->type=bottom,type=bottom->type=top]
flips all smooth stone slabs upside-down%
probabilities in masks//replace 50%stone sponge
replaces 50% of all stone blocks with sponge blocks%
block state probabilities in patterns with parenthesis grouping to escape comma//replace 4%water #above[!#transparent] 50%gravel,50%sea_pickles[pickles=(25%1,25%2,25%3,25%4)]
generates a nice lovely seabedNew Togglables
//perf history
//perf fluids
allow-tick-fluids
config option to default to true//perf fluids
and config option doesn't let you do so.//scoreboard
toggle command//drawpaste
toggle command:Block Updates
//suppress
toggle command//postplacement [-f] [-m <mask>]
command//connections
and//pp
//neighborchanged [-f] [-m <mask>]
command//nc
New
config.yml
Optionscommands
/
slash FAWE commands because they clutter the command space and can conflict with other plugins with their short generic names.expression-batch-size: <n>
n
expressions and give the group as a wholen
times the normal expression time limit.default-perf
default-drawsel: <true|false>
//drawsel
defaults to on or offdefault-drawpaste: <true|false>
//drawsel
defaults to on or offlanguage: auto
language-autoupdate: <true|false>
true
chat-stacktraces
false
because the stack trace takes up the whole screen and makes the chat a landmine to navigate which is frustrating when people browsing the chat don't actually care about the stack trace.Multi-lingual Translation:
Show me the help page.
is fed into an autotranslator and the word in that translation corresponding to the selected word "help" in the source is used as the translation for that piece.help
messages (shown by//help <command>
) translatable. Resolves Make exceptions translatable #1308//reemplace
as an alias for//replace
, though it will still be called the "replace" command when they run//ayuda reemplace
Improvements
//setbiome
and//genbiome
-l
(literal) flag for the old behavior of only setting the stored biomes in those 4x4x4 cubes.//setbiome
's and//genbiome
's help//help
to clarify that biomes are stored on a 4x4x4 block basis and intermixed when the chunk is loaded in.//perf
but FAWE just spits out an error.)WEBrush
on the tool.WEBrush
NBT tag (e.x. after rejoining the server), the server simply executes the command stored in the string as the user./give @s minecraft:golden_shovel{WEBrush:["//brush clipboard","/tracemask air"]}
//
will be allowed to be executed (tool commands using a single/
slash will be transformed into a double//
prior to the command being stored in theWEBrush
NBT tag.)/
or\
is detected in a directory name, that slash will become part of the path for where to save/
and\
depending upon host operating system./
when listing schematics so as to not leak the operating system of the server.schematic-save-subdirs
in order to enable this feature, which defaults tofalse
/help fastasyncworldedit
to give a short 101 basic summary of how to copy/paste with FAWE so beginners can get started easier. (/help worldedit
will also be make an alias to this for printing out this 101 getting started help information.)//setbiome
and//genbiome
respect the//gmask
just like WorldEdit doesFixes
//fawe reload
not reloading config debugmode, command debug, and colors from lang folder (maybe more things it fails?)//history
not working when//tool inspect
does//perf
to actually do stuff (make it so that blocks that need update ticking are enqueued on the main thread for update ticking.)//perf neighbors
work such that we scan for blocks known to need//fillr
only filling one block when starting in the middle of a non-air block instead of spreading to all same-blocks//removelighting
,//setblocklight
,//setskylight
, and//setlight
//replace oak_fence ^nether_brick_wall
strips the block state data because there's slight differences//help
command//perf
command//help sel <type>
with extra useful information and such.Misc. Features
IMPORTANT CONCEPTS:
New expression features:
//generate gold_block offY=0; while (queryRel(0,offY,0,AIR,0) && (offY < 16)) ++offY; (0 < offY) && queryRel(0,offY,0,GOLD_BLOCK,0)
&
,|
,xor
, and>>>
bitwise operators in expressions^
remains power operatorxor(a,b)
returns the bitwise xor of those two numbers>>>
is unsigned right-shift (cast to long, then shift, then cast back to int)<<
and>>
bitwise shift operators|
and&
biome(x, y, z, type)
,biomeRel(dx, dy, dz, type)
, andbiomeAbs(xp, yp, zp, type)
methods//genbiome savanna offY=0; while (biomeRel(0,offY,0,PLAINS,0) && (offY < 16)) ++offY; (0 < offY) && biomeRel(0,offY,0,SAVANNA,0)
cx
,cy
, andcz
rx
,ry
, andrz
cx
,cy
,cz
queryCenter
method for querying a block relative to the center of the selection boxlogN
functionlogN(x, base)
computes the base-th logarithm ofx
via the formulalog(x)/log(base)
hypot
functionhypot(x)
computessqrt(x*x)
which is the absolute valuehypot(x,y)
computessqrt(x*x + y*y)
hypot(x,y,z)
computessqrt(x*x + y*y + z*z)
worldSeed()
functiongetAt
,getAtRel
,getAtAbs
, andgetAtCenter
getAt(x,y,z)
cbGetAt
,cbGetAtRel
,cbGetAtAbs
, andcbGetAtCenter
block
,blockRel
,blockAbs
, andblockCenter
block(x,y,z)
cbBlock
,cbBlockRel
,cbBlockAbs
, andcbBlockCenter
state
,stateRel
,stateAbs
, andstateCenter
state(x,y,z)
getAt(x,y,z)
is exactly equivalent tostate(x,y,z) | block(x,y,z)
cbState
,cbStateRel
,cbStateAbs
, andcbStateCenter
cbQuery
,cbQueryRel
,cbQueryAbs
, andcbQueryCenter
query
but operators on the clipboard datareturn
statement//generate stone return 1
buffer2d(x, z)
andbuffer3d(x, y, z)
commands.//genbuffer2d
and//genbuffer3d
commandheight(x, z)
commandheightRel(x, z)
,heightAbs(x, z)
, andheightCenter(x, z)
Truly miscellaneous features:
entity_name<relX,relY,relZ>
sort of as part of entity name//webrepl
command that brings you straight to this web repl session. (though, you can just as easily get to the web repl via//upload
).Unexciting but Important Things
QOL:
Misc./Fixes:
long
s (while maintaining backwards compatibility) and open pull request for them to integrate the changeslong
s (while maintaining backwards compatibility.)//fall
less god-aweful slow//fall
itSpigot:
run
task to make every new player who joins the server a creative-mode operator and add various plugins that tie into FAWE so that FAWE can be better tested in a real environment.Bukkit:
NMSRelighter.java
to be less of a clunky piece of crap.runBukkit
Gradle task to build CraftBukkit from source and start up a CraftBukkit server.Fabric provider:
runFabricServer
gradle task for dev testingrunFabricClient
from WorldEditCLI provider:
runCLI
gradle task to get to a CLI dev repl with loaded test Minecraft map for quickly testing and diagnosing issues as I develop the CLI provider.Nukkit provider
bedrockClient
gradle task that spins up a Bedrock client on Linux machines via https://github.com/ChristopherHX/linux-packaging-scriptsrunNukkit
gradle task that spins up a Nukkit serverrunPowerNukkit
command to spin up a PowerNukkit server (see https://github.com/PowerNukkit/PowerNukkit)I would look forwards to seeing the reintegration of the Forge/Sponge implementation, but I'm not going to be the one to do it.
I also looked into Minestorm (https://github.com/Minestom/Minestom), but the issue with Minestorm is that it's not complete enough yet and I would be starting at ground 0. At least Nukkit has Pokkit plugin that I can use as a base reference for starting to implement my transition over to the new provider, but Minestorm doesn't even have this.
Google Forum
I would really appreciate it if you could fill out this Google Form on which features you would like to see me start work on: https://forms.gle/xRziwZafgpU1a3L5A
See the results of the Google Form at: https://docs.google.com/forms/d/1qi2wmUJ4omNrEj_6bpMlfaR0ylxge-HKlTh-gWeEXPo/viewanalytics
Beta Was this translation helpful? Give feedback.
All reactions