SpongePowered / SpongeAPI

A Minecraft plugin API
http://www.spongepowered.org/
MIT License
1.14k stars 342 forks source link

Structure and Feature placement callbacks #2520

Open octylFractal opened 5 months ago

octylFractal commented 5 months ago

Major SpongeAPI version

12

Is this likely to be a breaking change?

No

What are you requesting?

Currently, Structure and Feature have boolean place(ServerWorld, Vector3i), which does not allow a mod like WorldEdit to capture or modify the changes. It would be nice if we could get a callback for each block/entity so that WorldEdit may place it, rather than placing it directly into the world. This allows undo, masking, and better control of block placement than using Minecraft's code directly.

Yeregorix commented 1 month ago

I think the proper way to do it would be:

try (CauseStackManager.StackFrame frame = Sponge.server().causeStackManager().pushCauseFrame()) {
  frame.addContext(MY_CONTEXT_KEY, "hello");
  Features.TREES_PLAINS.get().place(location);
}

and

@Listener
public void onBlockChange(ChangeBlockEvent e) {
  if (e.context().get(MY_CONTEXT_KEY).isPresent()) {
    // filter blocks
  }
}

However I tested that a few days ago and it didn't work so there is likely a bug in the implementation currently. The implementation needs to be fixed, but I don't think the API needs any additions for that.