Skip to content

Commit 6a066d1

Browse files
feature(#13558): add copper golem state api
1 parent b5e7257 commit 6a066d1

6 files changed

Lines changed: 160 additions & 1 deletion

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.papermc.paper.entity;
2+
3+
import io.papermc.paper.annotation.GeneratedClass;
4+
import org.jspecify.annotations.NullMarked;
5+
6+
@SuppressWarnings({
7+
"unused",
8+
"SpellCheckingInspection"
9+
})
10+
@NullMarked
11+
@GeneratedClass
12+
public enum CopperGolemState {
13+
IDLE,
14+
15+
GETTING_ITEM,
16+
17+
GETTING_NO_ITEM,
18+
19+
DROPPING_ITEM,
20+
21+
DROPPING_NO_ITEM
22+
}

paper-api/src/main/java/org/bukkit/entity/CopperGolem.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.bukkit.entity;
22

33
import com.google.common.base.Preconditions;
4+
import io.papermc.paper.entity.CopperGolemState;
45
import io.papermc.paper.entity.Shearable;
56
import io.papermc.paper.world.WeatheringCopperState;
67
import org.bukkit.World;
@@ -25,6 +26,20 @@ public interface CopperGolem extends Golem, Shearable {
2526
*/
2627
void setWeatheringState(WeatheringCopperState state);
2728

29+
/**
30+
* Get the current copper golem state of the copper golem.
31+
*
32+
* @return the copper golem state
33+
*/
34+
CopperGolemState getState();
35+
36+
/**
37+
* Set the copper golem state of the copper golem.
38+
*
39+
* @param state the new copper golem state
40+
*/
41+
void setState(CopperGolemState state);
42+
2843
/**
2944
* Get the current oxidizing state of the copper golem.
3045
*
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package io.papermc.generator;
22

33
import io.papermc.generator.registry.RegistryBootstrapper;
4+
import io.papermc.generator.types.SimpleEnumGenerator;
45
import io.papermc.generator.types.SourceGenerator;
56
import io.papermc.generator.types.craftblockdata.CraftBlockDataBootstrapper;
67
import io.papermc.generator.types.goal.MobGoalGenerator;
8+
import io.papermc.generator.utils.SimpleEnumBridgeGenerator;
79
import java.util.ArrayList;
810
import java.util.Collections;
911
import java.util.List;
1012
import net.minecraft.util.Util;
13+
import net.minecraft.world.entity.animal.golem.CopperGolemState;
1114
import org.jspecify.annotations.NullMarked;
1215

1316
@NullMarked
@@ -16,8 +19,12 @@ public interface Generators {
1619
List<SourceGenerator> API = Collections.unmodifiableList(Util.make(new ArrayList<>(), list -> {
1720
RegistryBootstrapper.bootstrap(list);
1821
list.add(new MobGoalGenerator("VanillaGoal", "com.destroystokyo.paper.entity.ai"));
22+
list.add(new SimpleEnumGenerator<>(CopperGolemState.class, "io.papermc.paper.entity"));
1923
// todo extract fields for registry based api
2024
}));
2125

22-
List<SourceGenerator> SERVER = Collections.unmodifiableList(Util.make(new ArrayList<>(), CraftBlockDataBootstrapper::bootstrap));
26+
List<SourceGenerator> SERVER = Collections.unmodifiableList(Util.make(new ArrayList<>(), list -> {
27+
list.add(new SimpleEnumBridgeGenerator<>(io.papermc.paper.entity.CopperGolemState.class, CopperGolemState.class, "io.papermc.paper.entity"));
28+
CraftBlockDataBootstrapper.bootstrap(list);
29+
}));
2330
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package io.papermc.generator.utils;
2+
3+
import com.squareup.javapoet.ClassName;
4+
import com.squareup.javapoet.CodeBlock;
5+
import com.squareup.javapoet.JavaFile;
6+
import com.squareup.javapoet.MethodSpec;
7+
import com.squareup.javapoet.TypeSpec;
8+
import io.papermc.generator.types.SimpleGenerator;
9+
import java.util.EnumSet;
10+
import javax.lang.model.element.Modifier;
11+
import org.checkerframework.framework.qual.DefaultQualifier;
12+
import org.jspecify.annotations.NonNull;
13+
14+
@DefaultQualifier(NonNull.class)
15+
public class SimpleEnumBridgeGenerator<B extends Enum<B>, V extends Enum<V>> extends SimpleGenerator {
16+
17+
private final Class<B> bukkitClass;
18+
private final Class<V> vanillaClass;
19+
20+
public SimpleEnumBridgeGenerator(Class<B> bukkit, Class<V> vanilla, String packageName) {
21+
super("Craft%sBridge".formatted(bukkit.getSimpleName()), packageName);
22+
this.bukkitClass = bukkit;
23+
this.vanillaClass = vanilla;
24+
}
25+
26+
@Override
27+
protected TypeSpec getTypeSpec() {
28+
29+
TypeSpec.Builder typeBuilder = TypeSpec.classBuilder(this.className)
30+
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
31+
.addAnnotations(Annotations.CONSTANTS_HEADER);
32+
33+
MethodSpec fromVanilla = generateMethod(vanillaClass, bukkitClass);
34+
MethodSpec fromBukkit = generateMethod(bukkitClass, vanillaClass);
35+
typeBuilder.addMethod(fromVanilla);
36+
typeBuilder.addMethod(fromBukkit);
37+
return typeBuilder.build();
38+
}
39+
40+
private <F extends Enum<F>, T extends Enum<T>> MethodSpec generateMethod(Class<F> from, Class<T> to) {
41+
MethodSpec.Builder builder = MethodSpec.methodBuilder("from")
42+
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
43+
.returns(ClassName.get(to))
44+
.addParameter(ClassName.get(from), "from");
45+
46+
CodeBlock.Builder coderblockBuilder = CodeBlock.builder()
47+
.add("return switch ($N) {\n", "from")
48+
.indent();
49+
50+
for (F fromConstants : EnumSet.allOf(from)) {
51+
coderblockBuilder.add("case $T.$L -> $T.$L;\n",
52+
ClassName.get(from), fromConstants.name(),
53+
ClassName.get(to), fromConstants.name());
54+
}
55+
coderblockBuilder.unindent()
56+
.add("};\n");
57+
58+
builder.addCode(coderblockBuilder.build());
59+
return builder.build();
60+
}
61+
62+
63+
@Override
64+
protected JavaFile.Builder file(final JavaFile.Builder builder) {
65+
return builder.skipJavaLangImports(true);
66+
}
67+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.papermc.paper.entity;
2+
3+
import io.papermc.paper.annotation.GeneratedClass;
4+
import org.jspecify.annotations.NullMarked;
5+
6+
@SuppressWarnings({
7+
"unused",
8+
"SpellCheckingInspection"
9+
})
10+
@NullMarked
11+
@GeneratedClass
12+
public final class CraftCopperGolemStateBridge {
13+
public static CopperGolemState from(
14+
net.minecraft.world.entity.animal.golem.CopperGolemState from) {
15+
return switch (from) {
16+
case net.minecraft.world.entity.animal.golem.CopperGolemState.IDLE -> CopperGolemState.IDLE;
17+
case net.minecraft.world.entity.animal.golem.CopperGolemState.GETTING_ITEM -> CopperGolemState.GETTING_ITEM;
18+
case net.minecraft.world.entity.animal.golem.CopperGolemState.GETTING_NO_ITEM -> CopperGolemState.GETTING_NO_ITEM;
19+
case net.minecraft.world.entity.animal.golem.CopperGolemState.DROPPING_ITEM -> CopperGolemState.DROPPING_ITEM;
20+
case net.minecraft.world.entity.animal.golem.CopperGolemState.DROPPING_NO_ITEM -> CopperGolemState.DROPPING_NO_ITEM;
21+
};
22+
}
23+
24+
public static net.minecraft.world.entity.animal.golem.CopperGolemState from(
25+
CopperGolemState from) {
26+
return switch (from) {
27+
case CopperGolemState.IDLE -> net.minecraft.world.entity.animal.golem.CopperGolemState.IDLE;
28+
case CopperGolemState.GETTING_ITEM -> net.minecraft.world.entity.animal.golem.CopperGolemState.GETTING_ITEM;
29+
case CopperGolemState.GETTING_NO_ITEM -> net.minecraft.world.entity.animal.golem.CopperGolemState.GETTING_NO_ITEM;
30+
case CopperGolemState.DROPPING_ITEM -> net.minecraft.world.entity.animal.golem.CopperGolemState.DROPPING_ITEM;
31+
case CopperGolemState.DROPPING_NO_ITEM -> net.minecraft.world.entity.animal.golem.CopperGolemState.DROPPING_NO_ITEM;
32+
};
33+
}
34+
}

paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftCopperGolem.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package org.bukkit.craftbukkit.entity;
22

33
import com.google.common.base.Preconditions;
4+
import io.papermc.paper.entity.CopperGolemState;
5+
import io.papermc.paper.entity.CraftCopperGolemStateBridge;
46
import io.papermc.paper.entity.PaperShearable;
57
import io.papermc.paper.world.WeatheringCopperState;
8+
import java.util.Objects;
69
import net.minecraft.world.level.block.WeatheringCopper;
710
import org.bukkit.craftbukkit.CraftServer;
811
import org.bukkit.entity.CopperGolem;
@@ -30,6 +33,17 @@ public void setWeatheringState(final WeatheringCopperState state) {
3033
this.getHandle().setWeatherState(WeatheringCopper.WeatherState.valueOf(state.name()));
3134
}
3235

36+
@Override
37+
public CopperGolemState getState() {
38+
return CraftCopperGolemStateBridge.from(this.getHandle().getState());
39+
}
40+
41+
@Override
42+
public void setState(final CopperGolemState state) {
43+
Objects.requireNonNull(state, "state cannot be null");
44+
this.getHandle().setState(CraftCopperGolemStateBridge.from(state));
45+
}
46+
3347
@Override
3448
public Oxidizing getOxidizing() {
3549
long value = this.getHandle().nextWeatheringTick;

0 commit comments

Comments
 (0)