Skip to content

Commit

Permalink
fix various boat bugs (#7185)
Browse files Browse the repository at this point in the history
* boats are hoes

fix bugs with comparisons, use simple entity data for 1.21.3+

* whoops

* .2

* Update skript-aliases

* Apply suggestions from code review

Co-authored-by: Patrick Miller <apickledwalrus@gmail.com>

* requested changes 2

---------

Co-authored-by: Patrick Miller <apickledwalrus@gmail.com>
  • Loading branch information
sovdeeth and APickledWalrus authored Nov 9, 2024
1 parent 9553678 commit 0a680d4
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 100 deletions.
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

0 comments on commit 0a680d4

Please sign in to comment.