Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 39 additions & 3 deletions src/main/java/ch/njol/skript/classes/data/BukkitClasses.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@
import ch.njol.skript.bukkitutil.BukkitUtils;
import ch.njol.skript.bukkitutil.EntityUtils;
import ch.njol.skript.bukkitutil.SkriptTeleportFlag;
import ch.njol.skript.classes.*;
import ch.njol.skript.classes.ClassInfo;
import ch.njol.skript.classes.EnumClassInfo;
import ch.njol.skript.classes.Parser;
import ch.njol.skript.classes.PatternedParser;
import ch.njol.skript.classes.Serializer;
import ch.njol.skript.classes.registry.RegistryClassInfo;
import ch.njol.skript.expressions.ExprDamageCause;
import ch.njol.skript.expressions.base.EventValueExpression;
import ch.njol.skript.lang.ParseContext;
import ch.njol.skript.lang.util.SimpleLiteral;
import ch.njol.skript.paperutil.CopperState;
import ch.njol.skript.registrations.Classes;
import ch.njol.skript.util.BlockUtils;
import ch.njol.skript.util.PotionEffectUtils;
Expand All @@ -23,10 +28,16 @@
import org.bukkit.block.DoubleChest;
import org.bukkit.block.banner.PatternType;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.CopperGolemStatue;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentOffer;
import org.bukkit.entity.*;
import org.bukkit.entity.EntitySnapshot;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Vehicle;
import org.bukkit.entity.Villager;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityPotionEffectEvent;
Expand All @@ -52,8 +63,14 @@
import org.bukkit.util.CachedServerIcon;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.bukkit.base.types.*;
import org.skriptlang.skript.bukkit.base.types.BlockClassInfo;
import org.skriptlang.skript.bukkit.base.types.EntityClassInfo;
import org.skriptlang.skript.bukkit.base.types.EntityClassInfo.EntityChanger;
import org.skriptlang.skript.bukkit.base.types.InventoryClassInfo;
import org.skriptlang.skript.bukkit.base.types.ItemStackClassInfo;
import org.skriptlang.skript.bukkit.base.types.NameableClassInfo;
import org.skriptlang.skript.bukkit.base.types.OfflinePlayerClassInfo;
import org.skriptlang.skript.bukkit.base.types.PlayerClassInfo;
import org.skriptlang.skript.lang.properties.Property;
import org.skriptlang.skript.lang.properties.PropertyHandler.ExpressionPropertyHandler;

Expand Down Expand Up @@ -1140,5 +1157,24 @@ public String toVariableNameString(WorldBorder border) {
.since("2.12")
);

//noinspection unchecked,rawtypes
Classes.registerClass(new EnumClassInfo<>((Class) CopperState.getStateClass(), "weatheringcopperstate", "weathering copper states")
.user("(weathering ?)?copper ?states?")
.name("Weathering Copper State")
.description("The weathering state of a copper golem or copper block.")
.requiredPlugins("Minecraft 1.21.9+")
.since("INSERT VERSION")
);

if (Skript.classExists("org.bukkit.block.data.type.CopperGolemStatue$Pose")) {
Classes.registerClass(new EnumClassInfo<>(CopperGolemStatue.Pose.class, "coppergolempose", "copper golem poses")
.user("copper ? golem ?(statue ?)?poses?")
.name("Copper Golem Pose")
.description("The pose of a copper golem statue.")
.requiredPlugins("Minecraft 1.21.9+")
.since("INSERT VERSION")
);
}

}
}
54 changes: 54 additions & 0 deletions src/main/java/ch/njol/skript/conditions/CondIsWaxed.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package ch.njol.skript.conditions;

import ch.njol.skript.Skript;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Example;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.RequiredPlugins;
import ch.njol.skript.doc.Since;
import com.destroystokyo.paper.MaterialTags;
import org.bukkit.block.Block;
import org.bukkit.entity.CopperGolem;
import org.bukkit.entity.CopperGolem.Oxidizing.Waxed;
import org.skriptlang.skript.util.ReflectUtils;

@Name("Is Waxed")
@Description("Whether a copper golem or copper block is waxed.")
@Example("""
if last spawned copper golem is not waxed:
wax last spawned copper golem
""")
@Example("""
if {_block} is waxed:
unwax {_block}
""")
@RequiredPlugins("Minecraft 1.21.9+ (copper golems)")
@Since("INSERT VERSION")
public class CondIsWaxed extends PropertyCondition<Object> {

private static final boolean COPPER_GOLEM_EXISTS = ReflectUtils.classExists("org.bukkit.entity.CopperGolem");

static {
String type = "blocks";
if (Skript.classExists("org.bukkit.entity.CopperGolem"))
type = "entities/blocks";
register(CondIsWaxed.class, "waxed", type);
}

@Override
public boolean check(Object object) {
if (COPPER_GOLEM_EXISTS && object instanceof CopperGolem golem) {
return golem.getOxidizing() instanceof Waxed;
} else if (object instanceof Block block) {
return MaterialTags.WAXED_COPPER_BLOCKS.isTagged(block);
}
return false;
}

@Override
protected String getPropertyName() {
return "waxed";
}

}
105 changes: 105 additions & 0 deletions src/main/java/ch/njol/skript/effects/EffWax.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package ch.njol.skript.effects;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Example;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.RequiredPlugins;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.SyntaxStringBuilder;
import ch.njol.util.Kleenean;
import com.destroystokyo.paper.MaterialTags;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.CopperGolem;
import org.bukkit.entity.CopperGolem.Oxidizing;
import org.bukkit.entity.CopperGolem.Oxidizing.Waxed;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.util.ReflectUtils;

@Name("Wax")
@Description("""
Wax or unwax a copper golem or copper block.
This does not change the weathering copper state of entities and blocks.
""")
@Example("""
if last spawned copper golem is not waxed:
wax last spawned copper golem
""")
@Example("""
if {_block} is waxed:
unwax {_block}
""")
@RequiredPlugins("Minecraft 1.21.9+ (copper golems)")
@Since("INSERT VERSION")
public class EffWax extends Effect {


private static final BiMap<Material, Material> WAX_CONVERSION;
private static final BiMap<Material, Material> UNWAX_CONVERSION = HashBiMap.create();
private static final boolean COPPER_GOLEM_EXISTS = ReflectUtils.classExists("org.bukkit.entity.CopperGolem");

static {
String type = "%blocks%";
if (COPPER_GOLEM_EXISTS)
type = "%entities/blocks%";
Skript.registerEffect(EffWax.class, "[:un]wax " + type);

for (Material waxed : MaterialTags.WAXED_COPPER_BLOCKS.getValues()) {
Material unwaxed = Material.valueOf(waxed.name().replaceAll("WAXED_", ""));
UNWAX_CONVERSION.put(waxed, unwaxed);
}
WAX_CONVERSION = UNWAX_CONVERSION.inverse();
}

private boolean wax;
private Expression<?> objects;

@Override
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
objects = exprs[0];
wax = !parseResult.hasTag("un");
return true;
}

@Override
protected void execute(Event event) {
for (Object object : objects.getArray(event)) {
if (COPPER_GOLEM_EXISTS && object instanceof CopperGolem golem) {
boolean isWaxed = golem.getOxidizing() instanceof Waxed;
if (wax == isWaxed)
continue;
CopperGolem.Oxidizing oxidizing = wax ? Oxidizing.waxed() : Oxidizing.unset();
golem.setOxidizing(oxidizing);
} else if (object instanceof Block block) {
if (!MaterialTags.COPPER_BLOCKS.isTagged(block))
continue;
BiMap<Material, Material> conversion = wax ? WAX_CONVERSION : UNWAX_CONVERSION;
if (conversion.containsKey(block.getType())) {
Material material = conversion.get(block.getType());
assert material != null;
block.setType(material);
}
}
}
}

@Override
public String toString(@Nullable Event event, boolean debug) {
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
if (wax) {
builder.append("wax");
} else {
builder.append("unwax");
}
builder.append(objects);
return builder.toString();
}

}
116 changes: 116 additions & 0 deletions src/main/java/ch/njol/skript/entity/CopperGolemData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package ch.njol.skript.entity;

import ch.njol.skript.Skript;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.localization.Language;
import ch.njol.util.Kleenean;
import io.papermc.paper.world.WeatheringCopperState;
import org.bukkit.entity.CopperGolem;
import org.bukkit.entity.CopperGolem.Oxidizing.Waxed;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Objects;

public class CopperGolemData extends EntityData<CopperGolem> {

static {
if (Skript.classExists("org.bukkit.entity.CopperGolem"))
register(CopperGolemData.class, "copper golem", CopperGolem.class, 0, "copper golem");
}

private Kleenean waxed = Kleenean.UNKNOWN;
private @Nullable WeatheringCopperState state;

public CopperGolemData() {}

public CopperGolemData(@Nullable Kleenean waxed, @Nullable WeatheringCopperState state) {
this.waxed = waxed == null ? Kleenean.UNKNOWN : waxed;
this.state = state;
}

@Override
protected boolean init(Literal<?>[] exprs, int matchedCodeName, int matchedPattern, ParseResult parseResult) {
//noinspection unchecked
Literal<WeatheringCopperState> expr = (Literal<WeatheringCopperState>) exprs[0];
if (expr != null)
state = expr.getSingle();
if (matchedPattern == 1) {
waxed = Kleenean.TRUE;
} else if (matchedPattern == 2) {
waxed = Kleenean.FALSE;
}
return true;
}

@Override
protected boolean init(@Nullable Class<? extends CopperGolem> entityClass, @Nullable CopperGolem golem) {
if (golem != null) {
state = golem.getWeatheringState();
waxed = Kleenean.get(golem.getOxidizing() instanceof Waxed);
}
return true;
}

@Override
public void set(CopperGolem golem) {
if (state != null)
golem.setWeatheringState(state);
if (waxed.isTrue())
golem.setOxidizing(CopperGolem.Oxidizing.waxed());
}

@Override
protected boolean match(CopperGolem golem) {
if (!dataMatch(state, golem.getWeatheringState()))
return false;
return kleeneanMatch(waxed, Kleenean.get(golem.getOxidizing() instanceof Waxed));
}

@Override
public Class<? extends CopperGolem> getType() {
return CopperGolem.class;
}

@Override
public @NotNull EntityData<?> getSuperType() {
return new CopperGolemData();
}

@Override
protected int hashCode_i() {
return Objects.hashCode(state) + waxed.hashCode();
}

@Override
protected boolean equals_i(EntityData<?> entityData) {
if (!(entityData instanceof CopperGolemData other))
return false;
return state == other.state && waxed == other.waxed;
}

@Override
public boolean isSupertypeOf(EntityData<?> entityData) {
if (!(entityData instanceof CopperGolemData other))
return false;
return dataMatch(state, other.state) && kleeneanMatch(waxed, other.waxed);
}

@Override
public String toString(int flags) {
StringBuilder builder = new StringBuilder();
if (waxed.isTrue()) {
builder.append("waxed ");
} else if (waxed.isFalse()) {
builder.append("unwaxed ");
}
if (state != null)
builder.append(Language.getList("weathering copper states." + state.name())[0] + " ");
builder.append("copper golem");
if (isPlural().isTrue())
builder.append("s");
return builder.toString();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ private static void addSuperEntity(String codeName, Class<? extends Entity> enti
addSimpleEntity("happy ghast", HappyGhast.class);

if (Skript.isRunningMinecraft(1, 21, 9)) {
addSimpleEntity("copper golem", CopperGolem.class);
addSimpleEntity("mannequin", Mannequin.class);
}

Expand Down
Loading