Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix various boat bugs #7185

Merged
merged 9 commits into from
Nov 9, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion skript-aliases
88 changes: 43 additions & 45 deletions src/main/java/ch/njol/skript/entity/BoatChestData.java
Original file line number Diff line number Diff line change
@@ -1,54 +1,42 @@
package ch.njol.skript.entity;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemData;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptParser;
import org.bukkit.Material;
import org.bukkit.entity.Boat;
import org.bukkit.entity.ChestBoat;
import org.bukkit.entity.boat.*;
import org.jetbrains.annotations.Nullable;

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Random;

// For <1.21.3 compatability only. 1.21.3+ boats are SimpleEntityDatas
public class BoatChestData extends EntityData<ChestBoat> {

private static final boolean IS_RUNNING_1_21_3 = Skript.isRunningMinecraft(1, 21, 3);
private static final EnumMap<Boat.Type, Class<? extends ChestBoat>> typeToClassMap = new EnumMap<>(Boat.Type.class);

private static final Boat.Type[] types = Boat.Type.values();

static {
// This ensures all boats are registered
// As well as in the correct order via 'ordinal'
String[] patterns = new String[types.length + 2];
patterns[0] = "chest boat";
patterns[1] = "any chest boat";
for (Boat.Type boat : types) {
String boatName;
if (boat == Boat.Type.BAMBOO)
boatName = "bamboo chest raft";
else
boatName = boat.toString().replace("_", " ").toLowerCase(Locale.ENGLISH) + " chest boat";
patterns[boat.ordinal() + 2] = boatName;
}

if (IS_RUNNING_1_21_3) {
typeToClassMap.put(Boat.Type.OAK, OakChestBoat.class);
typeToClassMap.put(Boat.Type.SPRUCE, SpruceChestBoat.class);
typeToClassMap.put(Boat.Type.BIRCH, BirchChestBoat.class);
typeToClassMap.put(Boat.Type.JUNGLE, JungleChestBoat.class);
typeToClassMap.put(Boat.Type.ACACIA, AcaciaChestBoat.class);
typeToClassMap.put(Boat.Type.DARK_OAK, DarkOakChestBoat.class);
typeToClassMap.put(Boat.Type.MANGROVE, MangroveChestBoat.class);
typeToClassMap.put(Boat.Type.CHERRY, CherryChestBoat.class);
typeToClassMap.put(Boat.Type.BAMBOO, BambooChestRaft.class);
}
if (!Skript.isRunningMinecraft(1, 21, 2)) {
// This ensures all boats are registered
// As well as in the correct order via 'ordinal'
String[] patterns = new String[types.length + 2];
patterns[0] = "chest boat";
patterns[1] = "any chest boat";
for (Boat.Type boat : types) {
String boatName;
if (boat == Boat.Type.BAMBOO) {
boatName = "bamboo chest raft";
} else {
boatName = boat.toString().replace("_", " ").toLowerCase(Locale.ENGLISH) + " chest boat";
}
patterns[boat.ordinal() + 2] = boatName;
}

if (Skript.classExists("org.bukkit.entity.ChestBoat")) {
EntityData.register(BoatChestData.class, "chest boat", ChestBoat.class, 0, patterns);
}
}
Expand Down Expand Up @@ -92,8 +80,6 @@ protected boolean match(ChestBoat entity) {

@Override
public Class<? extends ChestBoat> getType() {
if (IS_RUNNING_1_21_3)
return typeToClassMap.get(types[matchedPattern - 2]);
return ChestBoat.class;
}

Expand Down Expand Up @@ -121,21 +107,33 @@ public boolean isSupertypeOf(EntityData<?> entity) {
return false;
}

public boolean isOfItemType(ItemType itemType) {
int ordinal = -1;

Material material = itemType.getMaterial();
if (material == Material.OAK_CHEST_BOAT) {
ordinal = 0;
} else {
for (Boat.Type boat : types) {
if (material.name().contains(boat.toString())) {
ordinal = boat.ordinal();
break;
}
private static final Map<Material, Boat.Type> materialToType = new HashMap<>();
static {
materialToType.put(Material.OAK_CHEST_BOAT, Boat.Type.OAK);
materialToType.put(Material.BIRCH_CHEST_BOAT, Boat.Type.BIRCH);
materialToType.put(Material.SPRUCE_CHEST_BOAT, Boat.Type.SPRUCE);
materialToType.put(Material.JUNGLE_CHEST_BOAT, Boat.Type.JUNGLE);
materialToType.put(Material.DARK_OAK_CHEST_BOAT, Boat.Type.DARK_OAK);
materialToType.put(Material.ACACIA_CHEST_BOAT, Boat.Type.ACACIA);
materialToType.put(Material.MANGROVE_CHEST_BOAT, Boat.Type.MANGROVE);
materialToType.put(Material.CHERRY_CHEST_BOAT, Boat.Type.CHERRY);
materialToType.put(Material.BAMBOO_CHEST_RAFT, Boat.Type.BAMBOO);
}

public boolean isOfItemType(ItemType itemType) {
for (ItemData itemData : itemType.getTypes()) {
int ordinal;
Material material = itemData.getType();
Boat.Type type = materialToType.get(material);
// material is a boat AND (data matches any boat OR material and data are same)
if (type != null) {
ordinal = type.ordinal();
if (matchedPattern <= 1 || matchedPattern == ordinal + 2)
return true;
}
}
return hashCode_i() == ordinal + 2 || (matchedPattern + ordinal == 0) || ordinal == 0;
return false;
}

}
112 changes: 59 additions & 53 deletions src/main/java/ch/njol/skript/entity/BoatData.java
Original file line number Diff line number Diff line change
@@ -1,56 +1,43 @@
package ch.njol.skript.entity;

import java.util.EnumMap;
import java.util.Locale;
import java.util.Random;

import ch.njol.skript.Skript;
import org.bukkit.Material;
import org.bukkit.entity.Boat;
import org.bukkit.entity.boat.*;
import ch.njol.skript.aliases.ItemData;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import org.bukkit.Material;
import org.bukkit.entity.Boat;
import org.jetbrains.annotations.Nullable;

public class BoatData extends EntityData<Boat> {
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Random;

private static final boolean IS_RUNNING_1_21_3 = Skript.isRunningMinecraft(1, 21, 3);
private static final EnumMap<Boat.Type, Class<? extends Boat>> typeToClassMap = new EnumMap<>(Boat.Type.class);
// For <1.21.3 compatability only. 1.21.3+ boats are SimpleEntityDatas
public class BoatData extends EntityData<Boat> {

private static final Boat.Type[] types = Boat.Type.values();

static {
// This ensures all boats are registered
// As well as in the correct order via 'ordinal'
String[] patterns = new String[types.length + 2];
patterns[0] = "chest boat";
patterns[1] = "any chest boat";
for (Boat.Type boat : types) {
String boatName;
if (boat == Boat.Type.BAMBOO)
boatName = "bamboo raft";
else
boatName = boat.toString().replace("_", " ").toLowerCase(Locale.ENGLISH) + " boat";
patterns[boat.ordinal() + 2] = boatName;
}

if (IS_RUNNING_1_21_3) {
typeToClassMap.put(Boat.Type.OAK, OakBoat.class);
typeToClassMap.put(Boat.Type.SPRUCE, SpruceBoat.class);
typeToClassMap.put(Boat.Type.BIRCH, BirchBoat.class);
typeToClassMap.put(Boat.Type.JUNGLE, JungleBoat.class);
typeToClassMap.put(Boat.Type.ACACIA, AcaciaBoat.class);
typeToClassMap.put(Boat.Type.DARK_OAK, DarkOakBoat.class);
typeToClassMap.put(Boat.Type.MANGROVE, MangroveBoat.class);
typeToClassMap.put(Boat.Type.CHERRY, CherryBoat.class);
typeToClassMap.put(Boat.Type.BAMBOO, BambooRaft.class);
if (!Skript.isRunningMinecraft(1, 21, 2)) {
// This ensures all boats are registered
// As well as in the correct order via 'ordinal'
String[] patterns = new String[types.length + 2];
patterns[0] = "boat";
patterns[1] = "any boat";
for (Boat.Type boat : types) {
String boatName;
if (boat == Boat.Type.BAMBOO) {
boatName = "bamboo raft";
} else {
boatName = boat.toString().replace("_", " ").toLowerCase(Locale.ENGLISH) + " boat";
}
patterns[boat.ordinal() + 2] = boatName;
}
EntityData.register(BoatData.class, "boat", Boat.class, 0, patterns);
}

EntityData.register(BoatData.class, "boat", Boat.class, 0, patterns);
}



public BoatData(){
this(0);
Expand Down Expand Up @@ -91,8 +78,6 @@ protected boolean match(Boat entity) {

@Override
public Class<? extends Boat> getType() {
if (IS_RUNNING_1_21_3)
return typeToClassMap.get(types[matchedPattern - 2]);
return Boat.class;
}

Expand All @@ -119,22 +104,43 @@ public boolean isSupertypeOf(EntityData<?> entity) {
return matchedPattern <= 1 || matchedPattern == boatData.matchedPattern;
return false;
}

public boolean isOfItemType(ItemType itemType){
int ordinal = -1;

Material material = itemType.getMaterial();
if (material == Material.OAK_BOAT) {
ordinal = 0;
} else {
for (Boat.Type boat : types) {
if (material.name().contains(boat.toString())) {
ordinal = boat.ordinal();
break;
}
private static final Map<Material, Boat.Type> materialToType = new HashMap<>();
static {
materialToType.put(Material.OAK_BOAT, Boat.Type.OAK);
materialToType.put(Material.BIRCH_BOAT, Boat.Type.BIRCH);
materialToType.put(Material.SPRUCE_BOAT, Boat.Type.SPRUCE);
materialToType.put(Material.JUNGLE_BOAT, Boat.Type.JUNGLE);
materialToType.put(Material.DARK_OAK_BOAT, Boat.Type.DARK_OAK);
materialToType.put(Material.ACACIA_BOAT, Boat.Type.ACACIA);
materialToType.put(Material.MANGROVE_BOAT, Boat.Type.MANGROVE);
materialToType.put(Material.CHERRY_BOAT, Boat.Type.CHERRY);
materialToType.put(Material.BAMBOO_RAFT, Boat.Type.BAMBOO);
// 'oak chest boat is a boat' should pass
materialToType.put(Material.OAK_CHEST_BOAT, Boat.Type.OAK);
materialToType.put(Material.BIRCH_CHEST_BOAT, Boat.Type.BIRCH);
materialToType.put(Material.SPRUCE_CHEST_BOAT, Boat.Type.SPRUCE);
materialToType.put(Material.JUNGLE_CHEST_BOAT, Boat.Type.JUNGLE);
materialToType.put(Material.DARK_OAK_CHEST_BOAT, Boat.Type.DARK_OAK);
materialToType.put(Material.ACACIA_CHEST_BOAT, Boat.Type.ACACIA);
materialToType.put(Material.MANGROVE_CHEST_BOAT, Boat.Type.MANGROVE);
materialToType.put(Material.CHERRY_CHEST_BOAT, Boat.Type.CHERRY);
materialToType.put(Material.BAMBOO_CHEST_RAFT, Boat.Type.BAMBOO);
}

public boolean isOfItemType(ItemType itemType) {
for (ItemData itemData : itemType.getTypes()) {
int ordinal;
Material material = itemData.getType();
Boat.Type type = materialToType.get(material);
// material is a boat AND (data matches any boat OR material and data are same)
if (type != null) {
ordinal = type.ordinal();
if (matchedPattern <= 1 || matchedPattern == ordinal + 2)
return true;
}
}
return hashCode_i() == ordinal + 2 || (matchedPattern + ordinal == 0) || ordinal == 0;
return false;
}

}
31 changes: 30 additions & 1 deletion src/main/java/ch/njol/skript/entity/SimpleEntityData.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import ch.njol.yggdrasil.Fields;
import org.bukkit.World;
import org.bukkit.entity.*;
import org.bukkit.entity.boat.*;
import org.jetbrains.annotations.Nullable;

import java.io.NotSerializableException;
Expand Down Expand Up @@ -210,8 +211,36 @@ private static void addSuperEntity(String codeName, Class<? extends Entity> enti
addSimpleEntity("bogged", Bogged.class);
}

if (Skript.isRunningMinecraft(1,21,3)) {
if (Skript.isRunningMinecraft(1,21,2)) {
addSimpleEntity("creaking", Creaking.class);
addSimpleEntity("creaking", Creaking.class);
// boats
addSimpleEntity("oak boat", OakBoat.class);
addSimpleEntity("dark oak boat", DarkOakBoat.class);
addSimpleEntity("pale oak boat", PaleOakBoat.class);
addSimpleEntity("acacia boat", AcaciaBoat.class);
addSimpleEntity("birch boat", BirchBoat.class);
addSimpleEntity("spruce boat", SpruceBoat.class);
addSimpleEntity("jungle boat", JungleBoat.class);
addSimpleEntity("bamboo raft", BambooRaft.class);
addSimpleEntity("mangrove boat", MangroveBoat.class);
addSimpleEntity("cherry boat", CherryBoat.class);
// chest boats
addSimpleEntity("oak chest boat", OakChestBoat.class);
addSimpleEntity("dark oak chest boat", DarkOakChestBoat.class);
addSimpleEntity("pale oak chest boat", PaleOakChestBoat.class);
addSimpleEntity("acacia chest boat", AcaciaChestBoat.class);
addSimpleEntity("birch chest boat", BirchChestBoat.class);
addSimpleEntity("spruce chest boat", SpruceChestBoat.class);
addSimpleEntity("jungle chest boat", JungleChestBoat.class);
addSimpleEntity("bamboo chest raft", BambooChestRaft.class);
addSimpleEntity("mangrove chest boat", MangroveChestBoat.class);
addSimpleEntity("cherry chest boat", CherryChestBoat.class);
// supers
addSuperEntity("boat", Boat.class);
addSuperEntity("any boat", Boat.class);
addSuperEntity("chest boat", ChestBoat.class);
addSuperEntity("any chest boat", ChestBoat.class);
}

// Register zombie after Husk and Drowned to make sure both work
Expand Down
7 changes: 7 additions & 0 deletions src/main/resources/lang/default.lang
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,7 @@ entities:
bat:
name: bat¦s
pattern: <age> bat(|1¦s)
# boats!
boat:
name: boat¦s
pattern: boat[1:s]
Expand Down Expand Up @@ -535,6 +536,9 @@ entities:
cherry boat:
name: cherry boat¦s
pattern: cherry [blossom] boat[1:s]
pale oak boat:
name: pale oak boat¦s
pattern: pale oak boat[1:s]
blaze:
name: blaze¦s
pattern: blaze(|1¦s)
Expand Down Expand Up @@ -1235,6 +1239,9 @@ entities:
bamboo chest raft:
name: bamboo chest raft¦s
pattern: bamboo chest (raft|boat)[1:s]
pale oak chest boat:
name: pale oak chest boat¦s
pattern: pale oak chest boat[1:s]
frog:
name: frog¦s
pattern: <age> frog(|1¦s)|(4¦)frog (kid(|1¦s)|child(|1¦ren))
Expand Down
Loading