Skip to content

Commit 5460b5f

Browse files
committed
Add for 1.21.3
1 parent 57f8f6c commit 5460b5f

File tree

11 files changed

+682
-8
lines changed

11 files changed

+682
-8
lines changed

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightLevelProxy.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.minecraft.world.level.block.EntityBlock;
1111
import net.minecraft.world.level.block.entity.BlockEntity;
1212
import net.minecraft.world.level.block.state.BlockState;
13+
import net.minecraft.world.level.border.WorldBorder;
1314
import net.minecraft.world.level.material.FluidState;
1415
import net.minecraft.world.level.material.Fluids;
1516
import org.enginehub.linbus.tree.LinCompoundTag;
@@ -107,4 +108,9 @@ public int getMinBuildHeight() {
107108
return serverLevel.getMinBuildHeight();
108109
}
109110

111+
@Override
112+
public WorldBorder getWorldBorder() {
113+
return serverLevel.getWorldBorder();
114+
}
115+
110116
}

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightLevelProxy.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.minecraft.world.level.block.EntityBlock;
1111
import net.minecraft.world.level.block.entity.BlockEntity;
1212
import net.minecraft.world.level.block.state.BlockState;
13+
import net.minecraft.world.level.border.WorldBorder;
1314
import net.minecraft.world.level.material.FluidState;
1415
import net.minecraft.world.level.material.Fluids;
1516
import org.enginehub.linbus.tree.LinCompoundTag;
@@ -107,4 +108,9 @@ public int getMinBuildHeight() {
107108
return serverLevel.getMinBuildHeight();
108109
}
109110

111+
@Override
112+
public WorldBorder getWorldBorder() {
113+
return serverLevel.getWorldBorder();
114+
}
115+
110116
}

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightLevelProxy.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.minecraft.world.level.block.EntityBlock;
1111
import net.minecraft.world.level.block.entity.BlockEntity;
1212
import net.minecraft.world.level.block.state.BlockState;
13+
import net.minecraft.world.level.border.WorldBorder;
1314
import net.minecraft.world.level.material.FluidState;
1415
import net.minecraft.world.level.material.Fluids;
1516
import org.enginehub.linbus.tree.LinCompoundTag;
@@ -107,4 +108,9 @@ public int getMinBuildHeight() {
107108
return serverLevel.getMinBuildHeight();
108109
}
109110

111+
@Override
112+
public WorldBorder getWorldBorder() {
113+
return serverLevel.getWorldBorder();
114+
}
115+
110116
}

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightLevelProxy.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.minecraft.world.level.block.EntityBlock;
1111
import net.minecraft.world.level.block.entity.BlockEntity;
1212
import net.minecraft.world.level.block.state.BlockState;
13+
import net.minecraft.world.level.border.WorldBorder;
1314
import net.minecraft.world.level.material.FluidState;
1415
import net.minecraft.world.level.material.Fluids;
1516
import org.enginehub.linbus.tree.LinCompoundTag;
@@ -107,4 +108,8 @@ public int getMinBuildHeight() {
107108
return serverLevel.getMinBuildHeight();
108109
}
109110

111+
@Override
112+
public WorldBorder getWorldBorder() {
113+
return serverLevel.getWorldBorder();
114+
}
110115
}

worldedit-bukkit/adapters/adapter-1_21_3/src/main/java/com/sk89q/worldedit/bukkit/adapter/ext/fawe/v1_21_3/PaperweightAdapter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -849,12 +849,12 @@ private ResourceKey<LevelStem> getWorldDimKey(Environment env) {
849849
}
850850

851851
private static final Set<SideEffect> SUPPORTED_SIDE_EFFECTS = Sets.immutableEnumSet(
852-
SideEffect.NEIGHBORS,
852+
//FAWE start - FAWE-supported side effects
853+
SideEffect.HISTORY,
854+
SideEffect.HEIGHTMAPS,
853855
SideEffect.LIGHTING,
854-
SideEffect.VALIDATION,
855-
SideEffect.ENTITY_AI,
856-
SideEffect.EVENTS,
857-
SideEffect.UPDATE
856+
SideEffect.NEIGHBORS
857+
//FAWE end
858858
);
859859

860860
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
/*
2+
* WorldEdit, a Minecraft world manipulation toolkit
3+
* Copyright (C) sk89q <http://www.sk89q.com>
4+
* Copyright (C) WorldEdit team and contributors
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
18+
*/
19+
20+
package com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_21_3;
21+
22+
import com.fastasyncworldedit.core.internal.exception.FaweException;
23+
import com.sk89q.worldedit.EditSession;
24+
import com.sk89q.worldedit.MaxChangedBlocksException;
25+
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
26+
import com.sk89q.worldedit.bukkit.adapter.Refraction;
27+
import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_21_3.PaperweightFaweAdapter;
28+
import com.sk89q.worldedit.extent.Extent;
29+
import com.sk89q.worldedit.internal.util.LogManagerCompat;
30+
import com.sk89q.worldedit.world.block.BlockTypes;
31+
import net.minecraft.core.BlockPos;
32+
import net.minecraft.core.Direction;
33+
import net.minecraft.nbt.CompoundTag;
34+
import net.minecraft.server.level.ServerLevel;
35+
import net.minecraft.tags.FluidTags;
36+
import net.minecraft.world.entity.Entity;
37+
import net.minecraft.world.level.WorldGenLevel;
38+
import net.minecraft.world.level.block.entity.BlockEntity;
39+
import net.minecraft.world.level.block.state.BlockState;
40+
import net.minecraft.world.level.material.FluidState;
41+
import net.minecraft.world.phys.AABB;
42+
import org.apache.logging.log4j.Logger;
43+
import org.jetbrains.annotations.Nullable;
44+
45+
import java.lang.reflect.InvocationHandler;
46+
import java.lang.reflect.Method;
47+
import java.lang.reflect.Proxy;
48+
import java.util.ArrayList;
49+
import java.util.Arrays;
50+
51+
public class PaperweightServerLevelDelegateProxy implements InvocationHandler {
52+
53+
private static final Logger LOGGER = LogManagerCompat.getLogger();
54+
55+
// FAWE start - extent not EditSession
56+
private final Extent editSession;
57+
//FAWE end
58+
private final ServerLevel serverLevel;
59+
//FAWE start - use FAWE adapter
60+
private final PaperweightFaweAdapter adapter = ((PaperweightFaweAdapter) WorldEditPlugin
61+
.getInstance()
62+
.getBukkitImplAdapter());
63+
//FAWE end
64+
//FAWE start - force error if method not caught by this instance
65+
private final boolean errorOnPassthrough;
66+
//FAWE end
67+
68+
private PaperweightServerLevelDelegateProxy(EditSession editSession, ServerLevel serverLevel, PaperweightAdapter adapter) {
69+
this.editSession = editSession;
70+
this.serverLevel = serverLevel;
71+
//FAWE start
72+
this.errorOnPassthrough = false;
73+
//FAWE end
74+
}
75+
76+
public static WorldGenLevel newInstance(EditSession editSession, ServerLevel serverLevel, PaperweightAdapter adapter) {
77+
return (WorldGenLevel) Proxy.newProxyInstance(
78+
serverLevel.getClass().getClassLoader(),
79+
serverLevel.getClass().getInterfaces(),
80+
new PaperweightServerLevelDelegateProxy(editSession, serverLevel, adapter)
81+
);
82+
}
83+
84+
//FAWE start - force error if method not caught by this instance
85+
private PaperweightServerLevelDelegateProxy(Extent extent, ServerLevel serverLevel, boolean errorOnPassthrough) {
86+
this.editSession = extent;
87+
this.serverLevel = serverLevel;
88+
this.errorOnPassthrough = errorOnPassthrough;
89+
}
90+
91+
public static WorldGenLevel newInstance(Extent extent, ServerLevel serverLevel, boolean errorOnPassthrough) {
92+
return (WorldGenLevel) Proxy.newProxyInstance(
93+
serverLevel.getClass().getClassLoader(),
94+
serverLevel.getClass().getInterfaces(),
95+
new PaperweightServerLevelDelegateProxy(extent, serverLevel, errorOnPassthrough)
96+
);
97+
}
98+
//FAWE end
99+
100+
@Nullable
101+
private BlockEntity getBlockEntity(BlockPos blockPos) {
102+
BlockEntity tileEntity = this.serverLevel.getChunkAt(blockPos).getBlockEntity(blockPos);
103+
if (tileEntity == null) {
104+
return null;
105+
}
106+
BlockEntity newEntity = tileEntity.getType().create(blockPos, getBlockState(blockPos));
107+
newEntity.loadWithComponents(
108+
(CompoundTag) adapter.fromNativeLin(this.editSession.getFullBlock(
109+
blockPos.getX(),
110+
blockPos.getY(),
111+
blockPos.getZ()
112+
).getNbtReference().getValue()),
113+
this.serverLevel.registryAccess()
114+
);
115+
116+
return newEntity;
117+
}
118+
119+
private BlockState getBlockState(BlockPos blockPos) {
120+
return adapter.adapt(this.editSession.getBlock(blockPos.getX(), blockPos.getY(), blockPos.getZ()));
121+
}
122+
123+
private boolean setBlock(BlockPos blockPos, BlockState blockState) {
124+
try {
125+
return editSession.setBlock(blockPos.getX(), blockPos.getY(), blockPos.getZ(), adapter.adapt(blockState));
126+
} catch (MaxChangedBlocksException e) {
127+
throw new RuntimeException(e);
128+
}
129+
}
130+
131+
private boolean removeBlock(BlockPos blockPos, boolean bl) {
132+
try {
133+
return editSession.setBlock(blockPos.getX(), blockPos.getY(), blockPos.getZ(), BlockTypes.AIR.getDefaultState());
134+
} catch (MaxChangedBlocksException e) {
135+
throw new RuntimeException(e);
136+
}
137+
}
138+
139+
private FluidState getFluidState(BlockPos pos) {
140+
return getBlockState(pos).getFluidState();
141+
}
142+
143+
private boolean isWaterAt(BlockPos pos) {
144+
return getBlockState(pos).getFluidState().is(FluidTags.WATER);
145+
}
146+
147+
@Override
148+
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
149+
//FAWE start - cannot use switch where method names are equal
150+
String methodName = method.getName();
151+
if (Refraction.pickName("getBlockState", "a_").equals(methodName)) {
152+
if (args.length == 1 && args[0] instanceof BlockPos blockPos) {
153+
// getBlockState
154+
return getBlockState(blockPos);
155+
}
156+
}
157+
if (Refraction.pickName("getBlockEntity", "c_").equals(methodName)) {
158+
if (args.length == 1 && args[0] instanceof BlockPos blockPos) {
159+
// getBlockEntity
160+
return getBlockEntity(blockPos);
161+
}
162+
}
163+
if ("a".equals(methodName) || "setBlock".equals(methodName) || "removeBlock".equals(methodName) || "destroyBlock".equals(
164+
methodName)) {
165+
if (args.length >= 2 && args[0] instanceof BlockPos blockPos && args[1] instanceof BlockState blockState) {
166+
// setBlock
167+
return setBlock(blockPos, blockState);
168+
} else if (args.length >= 2 && args[0] instanceof BlockPos blockPos && args[1] instanceof Boolean bl) {
169+
// removeBlock (and also matches destroyBlock)
170+
return removeBlock(blockPos, bl);
171+
}
172+
}
173+
//FAWE start
174+
if (Refraction.pickName("getFluidState", "b_").equals(methodName)) { //net.minecraft.world.level.BlockGetter
175+
if (args.length == 1 && args[0] instanceof BlockPos blockPos) {
176+
return getFluidState(blockPos);
177+
}
178+
}
179+
if (Refraction.pickName("isWaterAt", "z").equals(methodName)) { //net.minecraft.world.level.LevelReader
180+
if (args.length == 1 && args[0] instanceof BlockPos blockPos) {
181+
return isWaterAt(blockPos);
182+
}
183+
}
184+
if (Refraction.pickName("getEntities", "a_").equals(methodName)) { //net.minecraft.world.level.EntityGetter
185+
if (args.length == 2 && args[0] instanceof Entity && args[1] instanceof AABB) {
186+
return new ArrayList<>();
187+
}
188+
}
189+
// Specific passthroughs that we want to allow
190+
// net.minecraft.world.level.BlockAndTintGetter
191+
if (Refraction.pickName("getRawBrightness", "b").equals(methodName)) {
192+
return method.invoke(this.serverLevel, args);
193+
}
194+
// net.minecraft.world.level.LevelHeightAccessor
195+
if (Refraction.pickName("getMaxBuildHeight", "al").equals(methodName)) {
196+
if (args.length == 0) {
197+
return method.invoke(this.serverLevel, args);
198+
}
199+
}
200+
// net.minecraft.world.level.SignalGetter
201+
if (Refraction.pickName("hasNeighborSignal", "C").equals(methodName)) {
202+
if (args.length == 1 && args[0] instanceof BlockPos) {
203+
return method.invoke(this.serverLevel, args);
204+
}
205+
}
206+
if (Refraction.pickName("getSignal", "c").equals(methodName)) {
207+
if (args.length == 2 && args[0] instanceof BlockPos && args[1] instanceof Direction) {
208+
return method.invoke(this.serverLevel, args);
209+
}
210+
}
211+
if (Refraction.pickName("getControlInputSignal", "a").equals(methodName)) {
212+
if (args.length == 3 && args[0] instanceof BlockPos && args[1] instanceof Direction && args[2] instanceof Boolean) {
213+
return method.invoke(this.serverLevel, args);
214+
}
215+
}
216+
if (Refraction.pickName("getDirectSignal", "a").equals(methodName)) {
217+
if (args.length == 2 && args[0] instanceof BlockPos && args[1] instanceof Direction) {
218+
return method.invoke(this.serverLevel, args);
219+
}
220+
}
221+
//FAWE start - force error if method not caught by this instance
222+
if (errorOnPassthrough) {
223+
LOGGER.error(
224+
"""
225+
Attempted passthough of method {}.
226+
Method argument types: {}
227+
Method argument values: {}
228+
""",
229+
method.getName(),
230+
Arrays.stream(args).map(a -> a.getClass().getName()).toList(),
231+
Arrays.stream(args).map(Object::toString).toList()
232+
);
233+
throw new FaweException("Method required passthrough.");
234+
}
235+
//FAWE end
236+
237+
return method.invoke(this.serverLevel, args);
238+
}
239+
240+
}

0 commit comments

Comments
 (0)