> LONG_COMPATIBLE_CLASSES = new HashSet<>(Arrays.asList(
Long.class, Integer.class, Short.class, Byte.class));
@@ -78,8 +79,6 @@ public void setDataStorageFromInt(@Nonnegative int storage) {
this.storage = state;
}
- @Since("1.4.0.0-PN")
- @PowerNukkitOnly
@Override
@API(definition = INTERNAL, usage = INCUBATING)
void setDataStorageWithoutValidation(Number storage) {
@@ -90,6 +89,7 @@ void setDataStorageWithoutValidation(Number storage) {
}
}
+ @PowerNukkitOnly
@Override
public void validate() {
validate(storage);
@@ -123,6 +123,7 @@ private void validate(BigInteger state) {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getLegacyDamage() {
return storage.and(BigInteger.valueOf(Block.DATA_MASK)).intValue();
}
@@ -131,6 +132,7 @@ public int getLegacyDamage() {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getBigDamage() {
return storage.and(BigInteger.valueOf(BlockStateRegistry.BIG_META_MASK)).intValue();
}
@@ -154,6 +156,7 @@ public BigInteger getHugeDamage() {
return storage;
}
+ @PowerNukkitOnly
@Nonnegative
@Nonnull
@Override
@@ -191,15 +194,18 @@ public void setIntValue(String propertyName, int value) {
@Nonnull
@Override
+ @PowerNukkitOnly
public Serializable getPropertyValue(String propertyName) {
return properties.getValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public int getIntValue(String propertyName) {
return properties.getIntValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public boolean getBooleanValue(String propertyName) {
return properties.getBooleanValue(storage, propertyName);
@@ -211,10 +217,12 @@ public boolean getBooleanValue(String propertyName) {
*/
@Nonnull
@Override
+ @PowerNukkitOnly
public String getPersistenceValue(String propertyName) {
return properties.getPersistenceValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public BlockState getCurrentState() {
@@ -228,6 +236,7 @@ public int getExactIntStorage() {
return storage.intValueExact();
}
+ @PowerNukkitOnly
@Nonnull
@Override
public BigIntegerMutableBlockState copy() {
diff --git a/src/main/java/cn/nukkit/blockstate/BlockState.java b/src/main/java/cn/nukkit/blockstate/BlockState.java
index 5cf42cdaad8..20caf6c9bba 100644
--- a/src/main/java/cn/nukkit/blockstate/BlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/BlockState.java
@@ -154,8 +154,86 @@ public static BlockState of(@Nonnegative int blockId, @Nonnegative Number blockD
throw new InvalidBlockStateDataTypeException(blockData);
}
}
+
+ /**
+ * Returns the {@link BlockState} object that represents the given {@code persistedStateId}.
+ *
+ *
Same as {@code of(persistedStateid, true}.
+ *
+ * @param persistedStateId Must follow the same syntax returned by {@link #getStateId()} or {@link #getLegacyStateId()}
+ * @throws InvalidBlockPropertyValueException If any property value in the given {@code persistedStateId} is not valid for the state.
+ *
+ * @return The block state, never null
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ @Nonnull
+ public static BlockState of(@Nonnull String persistedStateId) {
+ return of(persistedStateId, true);
+ }
+
+ /**
+ * Returns the {@link BlockState} object that represents the given {@code persistedStateId}.
+ *
+ * @param persistedStateId Must follow the same syntax returned by {@link #getStateId()} or {@link #getLegacyStateId()}
+ * @param useDefaultPropertyValues When {@code true}, the default value will be used for any missing {@link BlockProperty}
+ * in {@code persistedStateId}.
+ * @throws IllegalArgumentException If {@code useDefaultPropertyValues} is false and there are missing properties
+ * @throws InvalidBlockPropertyValueException If any property value in the given {@code persistedStateId} is not valid for the state.
+ * @throws NoSuchElementException If there are no block registered with the given id.
+ *
+ * @return The block state, never null
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ @Nonnull
+ public static BlockState of(@Nonnull String persistedStateId, boolean useDefaultPropertyValues) {
+ String[] stateParts = persistedStateId.split(";");
+ String namespacedId = stateParts[0];
+ int id = Optional.ofNullable(BlockStateRegistry.getBlockId(namespacedId))
+ .map(OptionalInt::of)
+ .orElse(OptionalInt.empty())
+ .orElseThrow(()-> new NoSuchElementException("Block " + namespacedId + " not found."));
+
+ // Fast path
+ BlockState state = BlockState.of(id);
+ if (stateParts.length == 1 && useDefaultPropertyValues) {
+ return state;
+ }
+
+ if (stateParts.length == 2 && (stateParts[1].startsWith("nukkit-unknown=") || stateParts[1].startsWith("unknown="))) {
+ BigInteger damage = new BigInteger(stateParts[1].split("=", 2)[1]);
+ return BlockState.of(id, damage);
+ }
+
+ if (stateParts.length == 1 && state.getPropertyNames().isEmpty()) {
+ return state;
+ }
+
+ if (useDefaultPropertyValues) {
+ for (int i = 1; i < stateParts.length; i++) {
+ String[] propertyKeyValue = stateParts[i].split("=", 2);
+ state = state.withProperty(propertyKeyValue[0], propertyKeyValue[1]);
+ }
+ return state;
+ } else {
+ Set defined = new LinkedHashSet<>();
+ Set needed = new LinkedHashSet<>(state.getPropertyNames());
+ for (int i = 1; i < stateParts.length; i++) {
+ String[] propertyKeyValue = stateParts[i].split("=", 2);
+ state = state.withProperty(propertyKeyValue[0], propertyKeyValue[1]);
+ defined.add(propertyKeyValue[0]);
+ }
+ needed.removeAll(defined);
+ if (needed.isEmpty()) {
+ return state;
+ }
+ throw new IllegalArgumentException(
+ "The state id " + persistedStateId + " is missing the following properties: " + needed
+ );
+ }
+ }
- @Getter
@Nonnegative
private final int blockId;
@@ -218,6 +296,14 @@ private BlockState(@Nonnegative int blockId, @Nonnegative BigInteger blockData)
}
}
+ @PowerNukkitOnly
+ @Since("1.4.0.0-PN")
+ @Nonnegative
+ @Override
+ public int getBlockId() {
+ return blockId;
+ }
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
@Nonnull
@@ -397,12 +483,14 @@ public ItemBlock asItemBlock(int count) {
@Nonnegative
@Nonnull
@Override
+ @PowerNukkitOnly
public Number getDataStorage() {
return storage.getNumber();
}
@Nonnull
@Override
+ @PowerNukkitOnly
public BlockProperties getProperties() {
return BlockStateRegistry.getProperties(blockId);
}
@@ -411,6 +499,7 @@ public BlockProperties getProperties() {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getLegacyDamage() {
return storage.getLegacyDamage();
}
@@ -418,6 +507,7 @@ public int getLegacyDamage() {
@Unsigned
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
+ @PowerNukkitOnly
@Override
public int getBigDamage() {
return storage.getBigDamage();
@@ -444,15 +534,18 @@ public BigInteger getHugeDamage() {
@Nonnull
@Override
+ @PowerNukkitOnly
public Serializable getPropertyValue(String propertyName) {
return storage.getPropertyValue(getProperties(), propertyName);
}
@Override
+ @PowerNukkitOnly
public int getIntValue(String propertyName) {
return storage.getIntValue(getProperties(), propertyName);
}
+ @PowerNukkitOnly
@Override
public boolean getBooleanValue(String propertyName) {
return storage.getBooleanValue(getProperties(), propertyName);
@@ -460,16 +553,19 @@ public boolean getBooleanValue(String propertyName) {
@Nonnull
@Override
+ @PowerNukkitOnly
public String getPersistenceValue(String propertyName) {
return storage.getPersistenceValue(getProperties(), propertyName);
}
@Nonnull
@Override
+ @PowerNukkitOnly
public BlockState getCurrentState() {
return this;
}
+ @PowerNukkitOnly
@Override
public int getBitSize() {
return storage.getBitSize();
@@ -497,7 +593,7 @@ public boolean isDefaultState() {
}
@Override
- public boolean equals(Object o) {
+ public boolean equals(@Nullable Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@@ -580,6 +676,7 @@ public OptionalBoolean getCachedValidation() {
@Nonnull
@Override
+ @PowerNukkitOnly
public Block getBlock() {
try {
Block block = IBlockState.super.getBlock();
@@ -593,6 +690,7 @@ public Block getBlock() {
@Nonnull
@Override
+ @PowerNukkitOnly
public Block getBlock(@Nullable Level level, int x, int y, int z, int layer, boolean repair, @Nullable Consumer callback) {
if (valid == OptionalBoolean.TRUE) {
Block block = IBlockState.super.getBlock();
diff --git a/src/main/java/cn/nukkit/blockstate/BlockStateRegistry.java b/src/main/java/cn/nukkit/blockstate/BlockStateRegistry.java
index 0a555fd04c6..8010780454a 100644
--- a/src/main/java/cn/nukkit/blockstate/BlockStateRegistry.java
+++ b/src/main/java/cn/nukkit/blockstate/BlockStateRegistry.java
@@ -8,6 +8,7 @@
import cn.nukkit.block.BlockID;
import cn.nukkit.block.BlockUnknown;
import cn.nukkit.blockproperty.BlockProperties;
+import cn.nukkit.blockproperty.exception.BlockPropertyNotFoundException;
import cn.nukkit.blockstate.exception.InvalidBlockStateException;
import cn.nukkit.nbt.NBTIO;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -15,6 +16,7 @@
import cn.nukkit.utils.BinaryStream;
import cn.nukkit.utils.HumanStringComparator;
import com.google.common.base.Preconditions;
+import io.netty.util.internal.EmptyArrays;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.AllArgsConstructor;
@@ -58,6 +60,8 @@ public class BlockStateRegistry {
private final byte[] blockPaletteBytes;
+ private final List knownStateIds;
+
//
static {
@@ -95,6 +99,7 @@ public class BlockStateRegistry {
//
List tags = new ArrayList<>();
+ List loadingKnownStateIds = new ArrayList<>();
try (InputStream stream = Server.class.getClassLoader().getResourceAsStream("canonical_block_states.nbt")) {
if (stream == null) {
throw new AssertionError("Unable to locate block state nbt");
@@ -107,14 +112,18 @@ public class BlockStateRegistry {
tag.putInt("runtimeId", runtimeId++);
tag.putInt("blockId", persistenceNameToBlockId.getOrDefault(tag.getString("name").toLowerCase(), -1));
tags.add(tag);
+ loadingKnownStateIds.add(getStateId(tag));
}
}
+ knownStateIds = Arrays.asList(loadingKnownStateIds.toArray(EmptyArrays.EMPTY_STRINGS));
} catch (IOException e) {
throw new AssertionError(e);
}
//
Integer infoUpdateRuntimeId = null;
-
+
+ Set warned = new HashSet<>();
+
for (CompoundTag state : tags) {
int blockId = state.getInt("blockId");
int runtimeId = state.getInt("runtimeId");
@@ -128,6 +137,11 @@ public class BlockStateRegistry {
if (isNameOwnerOfId(name, blockId)) {
registerPersistenceName(blockId, name);
registerStateId(state, runtimeId);
+ } else if (blockId == -1) {
+ if (warned.add(name)) {
+ log.warn("Unknown block id for the block named {}", name);
+ }
+ registerStateId(state, runtimeId);
}
}
@@ -145,9 +159,9 @@ public class BlockStateRegistry {
}
//
-
+
private boolean isNameOwnerOfId(String name, int blockId) {
- return !name.equals("minecraft:wood") || blockId == BlockID.WOOD_BARK;
+ return blockId != -1 && !name.equals("minecraft:wood") || blockId == BlockID.WOOD_BARK;
}
@Nonnull
@@ -169,6 +183,33 @@ private static Registration findRegistrationByRuntimeId(int runtimeId) {
return runtimeIdRegistration.get(runtimeId);
}
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ @Nullable
+ public String getKnownBlockStateIdByRuntimeId(int runtimeId) {
+ if (runtimeId >= 0 && runtimeId < knownStateIds.size()) {
+ return knownStateIds.get(runtimeId);
+ }
+ return null;
+ }
+
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ public int getKnownRuntimeIdByBlockStateId(String stateId) {
+ int result = knownStateIds.indexOf(stateId);
+ if (result != -1) {
+ return result;
+ }
+ BlockState state;
+ try {
+ state = BlockState.of(stateId);
+ } catch (NoSuchElementException|IllegalStateException|IllegalArgumentException ignored) {
+ return -1;
+ }
+ String fullStateId = state.getStateId();
+ return knownStateIds.indexOf(fullStateId);
+ }
+
/**
* @return {@code null} if the runtime id does not matches any known block state.
*/
@@ -213,10 +254,61 @@ private BlockState buildStateFromCompound(CompoundTag block) {
return state;
}
+ private static NoSuchElementException runtimeIdNotRegistered(int runtimeId) {
+ return new NoSuchElementException("The block id for the runtime id "+runtimeId+" is not registered");
+ }
+
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ public int getBlockIdByRuntimeId(int runtimeId) {
+ Registration registration = findRegistrationByRuntimeId(runtimeId);
+ if (registration == null) {
+ throw runtimeIdNotRegistered(runtimeId);
+ }
+ BlockState state = registration.state;
+ if (state != null) {
+ return state.getBlockId();
+ }
+ CompoundTag originalBlock = registration.originalBlock;
+ if (originalBlock == null) {
+ throw runtimeIdNotRegistered(runtimeId);
+ }
+ try {
+ state = buildStateFromCompound(originalBlock);
+ } catch (BlockPropertyNotFoundException e) {
+ String name = originalBlock.getString("name").toLowerCase(Locale.ENGLISH);
+ Integer id = getBlockId(name);
+ if (id == null) {
+ throw runtimeIdNotRegistered(runtimeId);
+ }
+ return id;
+ }
+ if (state != null) {
+ registration.state = state;
+ registration.originalBlock = null;
+ } else {
+ throw runtimeIdNotRegistered(runtimeId);
+ }
+ return state.getBlockId();
+ }
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public int getRuntimeId(BlockState state) {
- return getRegistration(state).runtimeId;
+ return getRegistration(convertToNewState(state)).runtimeId;
+ }
+
+ private BlockState convertToNewState(BlockState oldState) {
+ // Check OldWoodBarkUpdater.java and https://minecraft.fandom.com/wiki/Log#Metadata
+ // The Only bark variant is replaced in the client side to minecraft:wood with the same wood type
+ if (oldState.getBitSize() == 4 && (oldState.getBlockId() == BlockID.LOG || oldState.getBlockId() == BlockID.LOG2)) {
+ int exactInt = oldState.getExactIntStorage();
+ if ((exactInt & 0b1100) == 0b1100) {
+ int increment = oldState.getBlockId() == BlockID.LOG ? 0b000 : 0b100;
+ return BlockState.of(BlockID.WOOD_BARK, (exactInt & 0b11) + increment);
+ }
+ }
+ return oldState;
}
private Registration getRegistration(BlockState state) {
@@ -413,7 +505,7 @@ public void copyBlockPaletteBytes(byte[] target, int targetIndex) {
public BlockProperties getProperties(int blockId) {
int fullId = blockId << Block.DATA_BITS;
Block block;
- if (fullId >= Block.fullList.length || (block = Block.fullList[fullId]) == null) {
+ if (fullId >= Block.fullList.length || fullId < 0 || (block = Block.fullList[fullId]) == null) {
return BlockUnknown.PROPERTIES;
}
return block.getProperties();
diff --git a/src/main/java/cn/nukkit/blockstate/BlockStateRepair.java b/src/main/java/cn/nukkit/blockstate/BlockStateRepair.java
index 8ff784d484b..2b0edf28971 100644
--- a/src/main/java/cn/nukkit/blockstate/BlockStateRepair.java
+++ b/src/main/java/cn/nukkit/blockstate/BlockStateRepair.java
@@ -5,6 +5,8 @@
import cn.nukkit.blockproperty.BlockProperties;
import cn.nukkit.blockproperty.BlockProperty;
import cn.nukkit.blockproperty.exception.InvalidBlockPropertyException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
import lombok.Value;
import lombok.experimental.NonFinal;
@@ -18,6 +20,8 @@
@PowerNukkitOnly
@Since("1.4.0.0-PN")
@Value
+@AllArgsConstructor(onConstructor = @__(@PowerNukkitOnly))
+@Getter(onMethod = @__(@PowerNukkitOnly))
public class BlockStateRepair {
/**
* The block ID of the block state that is being repaired.
diff --git a/src/main/java/cn/nukkit/blockstate/ByteMutableBlockState.java b/src/main/java/cn/nukkit/blockstate/ByteMutableBlockState.java
index 3cc5487725b..37240c2404a 100644
--- a/src/main/java/cn/nukkit/blockstate/ByteMutableBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/ByteMutableBlockState.java
@@ -66,6 +66,7 @@ public ByteMutableBlockState(int blockId, BlockProperties properties) {
this(blockId, properties, (byte)0);
}
+ @PowerNukkitOnly
@Nonnegative
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@@ -78,6 +79,7 @@ public int getLegacyDamage() {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getBigDamage() {
return storage;
}
@@ -94,6 +96,7 @@ public BigInteger getHugeDamage() {
@Nonnegative
@Nonnull
@Override
+ @PowerNukkitOnly
public Byte getDataStorage() {
return storage;
}
@@ -132,14 +135,13 @@ public void setDataStorageFromInt(@Nonnegative int storage) {
this.storage = (byte)storage;
}
- @Since("1.4.0.0-PN")
- @PowerNukkitOnly
@Override
@API(definition = INTERNAL, usage = INCUBATING)
void setDataStorageWithoutValidation(Number storage) {
this.storage = storage.byteValue();
}
+ @PowerNukkitOnly
@Override
public void validate() {
validate(storage);
@@ -197,28 +199,33 @@ public void setIntValue(String propertyName, int value) {
storage = (byte)properties.setIntValue(storage, propertyName, value);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public Serializable getPropertyValue(String propertyName) {
return properties.getValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public int getIntValue(String propertyName) {
return properties.getIntValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public boolean getBooleanValue(String propertyName) {
return properties.getBooleanValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public String getPersistenceValue(String propertyName) {
return properties.getPersistenceValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public BlockState getCurrentState() {
@@ -232,6 +239,7 @@ public int getExactIntStorage() {
return storage;
}
+ @PowerNukkitOnly
@Nonnull
@Override
public ByteMutableBlockState copy() {
diff --git a/src/main/java/cn/nukkit/blockstate/IBlockState.java b/src/main/java/cn/nukkit/blockstate/IBlockState.java
index 0b321c58faa..1755372160f 100644
--- a/src/main/java/cn/nukkit/blockstate/IBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/IBlockState.java
@@ -29,6 +29,7 @@
import java.io.Serializable;
import java.math.BigInteger;
import java.util.*;
+import java.util.AbstractMap.SimpleEntry;
import java.util.function.Consumer;
import static cn.nukkit.blockstate.Loggers.logIBlockState;
@@ -205,6 +206,29 @@ default String getStateId() {
return stateId.toString();
}
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ default String getMinimalistStateId() {
+ if (isDefaultState()) {
+ return getPersistenceName();
+ }
+ BlockProperties properties = getProperties();
+ Map propertyMap = new TreeMap<>(HumanStringComparator.getInstance());
+ try {
+ properties.getNames().stream()
+ .map(name -> new SimpleEntry<>(properties.getBlockProperty(name), getPersistenceValue(name)))
+ .filter(entry -> !entry.getKey().isDefaultPersistentValue(entry.getValue()))
+ .forEach(entry -> propertyMap.put(entry.getKey().getPersistenceName(), entry.getValue()));
+ } catch (InvalidBlockPropertyException e) {
+ logIBlockState.debug("Attempted to get the stateId of an invalid state {}:{}\nProperties: {}", getBlockId(), getDataStorage(), properties, e);
+ return getLegacyStateId();
+ }
+
+ StringBuilder stateId = new StringBuilder(getPersistenceName());
+ propertyMap.forEach((name, value) -> stateId.append(';').append(name).append('=').append(value));
+ return stateId.toString();
+ }
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
@Nonnull
@@ -225,8 +249,7 @@ default String getLegacyStateId() {
@Nonnull
default Block getBlock() {
Block block = Block.get(getBlockId());
- block.setState(this);
- return block;
+ return block.forState(this);
}
/**
@@ -275,8 +298,7 @@ default Block getBlock(@Nullable Level level, int x, int y, int z, int layer, bo
BlockState currentState = getCurrentState();
try {
if (currentState.isCachedValidationValid()) {
- block.setState(currentState);
- return block;
+ return block.forState(currentState);
}
} catch (Exception e) {
logIBlockState.error("Unexpected error while trying to set the cached valid state to the block. State: {}, Block: {}", currentState, block, e);
@@ -420,6 +442,7 @@ default int getFullId() {
return (getBlockId() << Block.DATA_BITS) | (getLegacyDamage() & Block.DATA_MASK);
}
+ @PowerNukkitOnly
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "the BlockState itself")
default long getBigId() {
diff --git a/src/main/java/cn/nukkit/blockstate/IMutableBlockState.java b/src/main/java/cn/nukkit/blockstate/IMutableBlockState.java
index c785f4d41d8..c60fbb3637d 100644
--- a/src/main/java/cn/nukkit/blockstate/IMutableBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/IMutableBlockState.java
@@ -44,6 +44,28 @@ default void setState(IBlockState state) throws InvalidBlockStateException {
throw new UnsupportedOperationException();
}
}
+
+ /**
+ * Replace all matching states of this block state with the same states of the given block state.
+ * But giving opportunity to return a new instance of this mutable state if needed.
+ *
+ * States that doesn't exists in the other state are ignored.
+ *
Only properties that matches each other will be copied, for example, if this state have an age property
+ * going from 0 to 7 and the other have an age from 0 to 15, the age property won't change.
+ *
If the implementation recognizes that the given state does not match the current set of properties
+ * and needs an update, it may update and return a new state with a different block id and different set
+ * of properties that represent the expected visual state. The this change can be detected with an {@code ==} operation.
+ * @throws UnsupportedOperationException If the state is from a different block id and property copying isn't supported by the implementation
+ * @throws InvalidBlockStateException If the given storage has invalid data properties
+ * @param state The states that will have the properties copied.
+ */
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Nonnull
+ default IMutableBlockState forState(@Nonnull IBlockState state) throws InvalidBlockStateException {
+ setState(state);
+ return this;
+ }
/**
* @throws InvalidBlockStateException If the given storage has invalid data properties
diff --git a/src/main/java/cn/nukkit/blockstate/IntMutableBlockState.java b/src/main/java/cn/nukkit/blockstate/IntMutableBlockState.java
index 69bd9532b6f..e6c13b15561 100644
--- a/src/main/java/cn/nukkit/blockstate/IntMutableBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/IntMutableBlockState.java
@@ -48,6 +48,7 @@ public IntMutableBlockState(int blockId, BlockProperties properties) {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getLegacyDamage() {
return storage & Block.DATA_MASK;
}
@@ -56,6 +57,7 @@ public int getLegacyDamage() {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getBigDamage() {
return storage;
}
@@ -71,6 +73,7 @@ public BigInteger getHugeDamage() {
@Nonnegative
@Nonnull
+ @PowerNukkitOnly
@Override
public Integer getDataStorage() {
return storage;
@@ -109,14 +112,13 @@ public void setDataStorageFromInt(@Nonnegative int storage) {
this.storage = storage;
}
- @Since("1.4.0.0-PN")
- @PowerNukkitOnly
@Override
@API(definition = INTERNAL, usage = INCUBATING)
void setDataStorageWithoutValidation(Number storage) {
this.storage = storage.intValue();
}
+ @PowerNukkitOnly
@Override
public void validate() {
validate(storage);
@@ -169,22 +171,26 @@ public void setIntValue(String propertyName, int value) {
storage = properties.setIntValue(storage, propertyName, value);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public Serializable getPropertyValue(String propertyName) {
return properties.getValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public int getIntValue(String propertyName) {
return properties.getIntValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public boolean getBooleanValue(String propertyName) {
return properties.getBooleanValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public String getPersistenceValue(String propertyName) {
@@ -193,6 +199,7 @@ public String getPersistenceValue(String propertyName) {
@Nonnull
@Override
+ @PowerNukkitOnly
public BlockState getCurrentState() {
return BlockState.of(blockId, storage);
}
@@ -204,6 +211,7 @@ public int getExactIntStorage() {
return storage;
}
+ @PowerNukkitOnly
@Nonnull
@Override
public IntMutableBlockState copy() {
diff --git a/src/main/java/cn/nukkit/blockstate/LongMutableBlockState.java b/src/main/java/cn/nukkit/blockstate/LongMutableBlockState.java
index e6f38c8eff9..d53df31a76a 100644
--- a/src/main/java/cn/nukkit/blockstate/LongMutableBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/LongMutableBlockState.java
@@ -74,13 +74,12 @@ public void setDataStorageFromInt(@Nonnegative int storage) {
this.storage = state;
}
- @Since("1.4.0.0-PN")
- @PowerNukkitOnly
@Override
void setDataStorageWithoutValidation(Number storage) {
this.storage = storage.longValue();
}
+ @PowerNukkitOnly
@Override
public void validate() {
validate(storage);
@@ -116,6 +115,7 @@ private void validate(long state) {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getLegacyDamage() {
return (int) (storage & Block.DATA_MASK);
}
@@ -124,6 +124,7 @@ public int getLegacyDamage() {
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "getDataStorage()")
@Override
+ @PowerNukkitOnly
public int getBigDamage() {
return (int) (storage & BlockStateRegistry.BIG_META_MASK);
}
@@ -150,6 +151,7 @@ public BigInteger getHugeDamage() {
@Nonnegative
@Nonnull
@Override
+ @PowerNukkitOnly
public Number getDataStorage() {
return storage;
}
@@ -182,22 +184,26 @@ public void setIntValue(String propertyName, int value) {
storage = properties.setIntValue(storage, propertyName, value);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public Serializable getPropertyValue(String propertyName) {
return properties.getValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public int getIntValue(String propertyName) {
return properties.getIntValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Override
public boolean getBooleanValue(String propertyName) {
return properties.getBooleanValue(storage, propertyName);
}
+ @PowerNukkitOnly
@Nonnull
@Override
public String getPersistenceValue(String propertyName) {
@@ -206,6 +212,7 @@ public String getPersistenceValue(String propertyName) {
@Nonnull
@Override
+ @PowerNukkitOnly
public BlockState getCurrentState() {
return BlockState.of(blockId, storage);
}
@@ -221,6 +228,7 @@ public int getExactIntStorage() {
return (int) storage;
}
+ @PowerNukkitOnly
@Nonnull
@Override
public LongMutableBlockState copy() {
diff --git a/src/main/java/cn/nukkit/blockstate/MutableBlockState.java b/src/main/java/cn/nukkit/blockstate/MutableBlockState.java
index f496362d179..8a4f93aed92 100644
--- a/src/main/java/cn/nukkit/blockstate/MutableBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/MutableBlockState.java
@@ -35,8 +35,6 @@ public abstract class MutableBlockState implements IMutableBlockState {
this.properties = properties;
}
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
@API(definition = INTERNAL, usage = INCUBATING)
void setDataStorageWithoutValidation(Number storage) {
setDataStorage(storage);
@@ -57,18 +55,21 @@ public void setState(IBlockState state) throws InvalidBlockStateException {
}
}
+ @PowerNukkitOnly
@Nonnull
@Override
public final BlockProperties getProperties() {
return properties;
}
+ @PowerNukkitOnly
@Nonnegative
@Override
public final int getBlockId() {
return blockId;
}
+ @PowerNukkitOnly
@Override
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "the BlockState itself")
@@ -79,10 +80,12 @@ public final int getFullId() {
@Override
@Deprecated
@DeprecationDetails(reason = "Can't store all data, exists for backward compatibility reasons", since = "1.4.0.0-PN", replaceWith = "the BlockState itself")
+ @PowerNukkitOnly
public final long getBigId() {
return IMutableBlockState.super.getBigId();
}
+ @PowerNukkitOnly
@Override
public final int getBitSize() {
return getProperties().getBitSize();
diff --git a/src/main/java/cn/nukkit/blockstate/ZeroMutableBlockState.java b/src/main/java/cn/nukkit/blockstate/ZeroMutableBlockState.java
index f9263a5a0ef..20537a9926f 100644
--- a/src/main/java/cn/nukkit/blockstate/ZeroMutableBlockState.java
+++ b/src/main/java/cn/nukkit/blockstate/ZeroMutableBlockState.java
@@ -51,13 +51,15 @@ public ZeroMutableBlockState(int blockId, BlockProperties properties) {
state = BlockState.of(blockId);
}
+ @PowerNukkitOnly
@Override
public void validate() {
}
+ @PowerNukkitOnly
@Nonnull
@Override
- public MutableBlockState copy() {
+ public ZeroMutableBlockState copy() {
return this;
}
@@ -137,8 +139,8 @@ public int getLegacyDamage() {
@Unsigned
@Since("1.4.0.0-PN")
- @PowerNukkitOnly
@Override
+ @PowerNukkitOnly
public int getBigDamage() {
return 0;
}
diff --git a/src/main/java/cn/nukkit/command/CapturingCommandSender.java b/src/main/java/cn/nukkit/command/CapturingCommandSender.java
index ce032506817..fdcca3d68d3 100644
--- a/src/main/java/cn/nukkit/command/CapturingCommandSender.java
+++ b/src/main/java/cn/nukkit/command/CapturingCommandSender.java
@@ -1,65 +1,91 @@
package cn.nukkit.command;
import cn.nukkit.Server;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.lang.TextContainer;
import cn.nukkit.permission.*;
import cn.nukkit.plugin.Plugin;
import cn.nukkit.utils.TextFormat;
import lombok.AllArgsConstructor;
-import lombok.Getter;
import lombok.NonNull;
-import lombok.Setter;
+import javax.annotation.Nonnull;
import java.util.Map;
import java.util.function.Function;
/**
* @since 1.2.1.0-PN
*/
-@AllArgsConstructor
+@PowerNukkitOnly
+@AllArgsConstructor(onConstructor = @__(@PowerNukkitOnly))
public class CapturingCommandSender implements CommandSender {
private final StringBuilder captured = new StringBuilder();
@NonNull
- @Getter
- @Setter
private String name;
- @Getter @Setter
private boolean isOp;
@NonNull
private final Permissible perms;
+ @PowerNukkitOnly
public CapturingCommandSender() {
this("System");
}
-
+
+ @PowerNukkitOnly
public CapturingCommandSender(@NonNull String name) {
this.name = name;
this.perms = new PermissibleBase(this);
}
+ @PowerNukkitOnly
public CapturingCommandSender(@NonNull String name, boolean isOp) {
this.name = name;
- this.isOp = true;
+ this.isOp = isOp;
this.perms = new PermissibleBase(this);
}
+ @PowerNukkitOnly
public CapturingCommandSender(@NonNull String name, boolean isOp, @NonNull Function permissibleFactory) {
this.name = name;
- this.isOp = true;
+ this.isOp = isOp;
this.perms = permissibleFactory.apply(this);
}
-
+
+ @Nonnull
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @PowerNukkitOnly
+ public void setName(@Nonnull String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean isOp() {
+ return isOp;
+ }
+
+ @Override
+ public void setOp(boolean op) {
+ isOp = op;
+ }
+
+ @PowerNukkitOnly
public void resetCapture() {
captured.setLength(0);
}
-
+
+ @PowerNukkitOnly
public synchronized String getRawCapture() {
return captured.toString();
}
-
+
+ @PowerNukkitOnly
public synchronized String getCleanCapture() {
return TextFormat.clean(captured.toString());
}
diff --git a/src/main/java/cn/nukkit/command/Command.java b/src/main/java/cn/nukkit/command/Command.java
index f9307be8ccb..8f2cd25f6c5 100644
--- a/src/main/java/cn/nukkit/command/Command.java
+++ b/src/main/java/cn/nukkit/command/Command.java
@@ -2,6 +2,9 @@
import cn.nukkit.Player;
import cn.nukkit.Server;
+import cn.nukkit.api.DeprecationDetails;
+import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.command.data.*;
import cn.nukkit.lang.TextContainer;
import cn.nukkit.lang.TranslationContainer;
@@ -18,8 +21,6 @@
*/
public abstract class Command {
- private static CommandData defaultDataTemplate;
-
protected CommandData commandData;
private final String name;
@@ -134,7 +135,8 @@ public CommandDataVersions generateCustomCommandData(Player player) {
public Map getOverloads() {
return this.commandData.overloads;
}
-
+
+ @PowerNukkitOnly
protected double parseTilde(String arg, double pos) {
if (arg.equals("~")) {
return pos;
@@ -263,11 +265,17 @@ public void setUsage(String usageMessage) {
this.usageMessage = usageMessage;
}
+ @Deprecated
+ @DeprecationDetails(
+ by = "PowerNukkit",
+ since = "1.5.2.0-PN",
+ reason = "Unused and always throws an exception even in Cloudburst Nukkit")
+ @PowerNukkitDifference(
+ since = "1.5.2.0-PN",
+ info = "Throws UnsupportedOperationException instead of NullPointerException"
+ )
public static CommandData generateDefaultData() {
- if (defaultDataTemplate == null) {
- //defaultDataTemplate = new Gson().fromJson(new InputStreamReader(Server.class.getClassLoader().getResourceAsStream("command_default.json")));
- }
- return defaultDataTemplate.clone();
+ throw new UnsupportedOperationException();
}
public static void broadcastCommandMessage(CommandSender source, String message) {
diff --git a/src/main/java/cn/nukkit/command/ConsoleCommandSender.java b/src/main/java/cn/nukkit/command/ConsoleCommandSender.java
index f6ff12ae348..0ab510a0514 100644
--- a/src/main/java/cn/nukkit/command/ConsoleCommandSender.java
+++ b/src/main/java/cn/nukkit/command/ConsoleCommandSender.java
@@ -73,6 +73,7 @@ public Map getEffectivePermissions() {
return this.perm.getEffectivePermissions();
}
+ @Override
public boolean isPlayer() {
return false;
}
diff --git a/src/main/java/cn/nukkit/command/data/CommandEnum.java b/src/main/java/cn/nukkit/command/data/CommandEnum.java
index c14cf314688..ae11813cf2b 100644
--- a/src/main/java/cn/nukkit/command/data/CommandEnum.java
+++ b/src/main/java/cn/nukkit/command/data/CommandEnum.java
@@ -62,6 +62,7 @@ public List getValues() {
return values;
}
+ @Override
public int hashCode() {
return name.hashCode();
}
diff --git a/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java b/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java
index 82ee3f5f040..e155830fd7f 100644
--- a/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java
+++ b/src/main/java/cn/nukkit/command/defaults/EnchantCommand.java
@@ -34,7 +34,7 @@ public EnchantCommand(String name) {
"protection", "fire_protection", "feather_falling", "blast_protection", "projectile_projection", "thorns", "respiration",
"aqua_affinity", "depth_strider", "sharpness", "smite", "bane_of_arthropods", "knockback", "fire_aspect", "looting", "efficiency",
"silk_touch", "durability", "fortune", "power", "punch", "flame", "infinity", "luck_of_the_sea", "lure", "frost_walker", "mending",
- "binding_curse", "vanishing_curse", "impaling", "loyality", "riptide", "channeling", "multishot", "piercing", "quick_charge",
+ "binding_curse", "vanishing_curse", "impaling", "loyalty", "riptide", "channeling", "multishot", "piercing", "quick_charge",
"soul_speed")),
CommandParameter.newType("level", true, CommandParamType.INT)
});
@@ -86,11 +86,12 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
inventory.setItemInHand(clone);
player.giveItem(enchanted);
}
- Command.broadcastCommandMessage(sender, new TranslationContainer("%commands.enchant.success"));
+ Command.broadcastCommandMessage(sender, new TranslationContainer("%commands.enchant.success", args[1]));
return true;
}
public int getIdByName(String value) throws NumberFormatException {
+ value = value.toLowerCase();
switch (value) {
case "protection":
return 0;
@@ -127,6 +128,7 @@ public int getIdByName(String value) throws NumberFormatException {
case "silk_touch":
return 16;
case "durability":
+ case "unbreaking":
return 17;
case "fortune":
return 18;
@@ -152,9 +154,9 @@ public int getIdByName(String value) throws NumberFormatException {
return 28;
case "impaling":
return 29;
- case "loyality":
- return 30;
case "riptide":
+ return 30;
+ case "loyalty":
return 31;
case "channeling":
return 32;
diff --git a/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java b/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java
index 1015a4cc662..c00cc5d0d39 100644
--- a/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java
+++ b/src/main/java/cn/nukkit/command/defaults/GameruleCommand.java
@@ -29,6 +29,9 @@ public GameruleCommand(String name) {
List unknownGameRules = new ArrayList<>();
rules.getGameRules().forEach((rule, value) -> {
+ if (rule.isDeprecated()) {
+ return;
+ }
switch (value.getType()) {
case BOOLEAN:
boolGameRules.add(rule.getName().toLowerCase());
diff --git a/src/main/java/cn/nukkit/command/defaults/KillCommand.java b/src/main/java/cn/nukkit/command/defaults/KillCommand.java
index 141e2623ce5..dc2328b9c1e 100644
--- a/src/main/java/cn/nukkit/command/defaults/KillCommand.java
+++ b/src/main/java/cn/nukkit/command/defaults/KillCommand.java
@@ -60,7 +60,7 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
for (Level level : Server.getInstance().getLevels().values()) {
for (Entity entity : level.getEntities()) {
if (!(entity instanceof Player)) {
- joiner.add(entity.getName());
+ joiner.add(entity.getVisibleName());
entity.close();
}
}
diff --git a/src/main/java/cn/nukkit/command/defaults/SetBlockCommand.java b/src/main/java/cn/nukkit/command/defaults/SetBlockCommand.java
index f1f7890bfcc..d1be38ee3ec 100644
--- a/src/main/java/cn/nukkit/command/defaults/SetBlockCommand.java
+++ b/src/main/java/cn/nukkit/command/defaults/SetBlockCommand.java
@@ -1,6 +1,7 @@
package cn.nukkit.command.defaults;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.command.CommandSender;
@@ -14,7 +15,9 @@
import java.util.Arrays;
+@PowerNukkitOnly
public class SetBlockCommand extends VanillaCommand {
+ @PowerNukkitOnly
public SetBlockCommand(String name) {
super(name, "%nukkit.command.setblock.description", "%nukkit.command.setblock.usage");
this.setPermission("nukkit.command.setblock");
diff --git a/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java b/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java
index 713e92d85a7..a113047aa8b 100644
--- a/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java
+++ b/src/main/java/cn/nukkit/command/defaults/SetWorldSpawnCommand.java
@@ -20,7 +20,8 @@ public SetWorldSpawnCommand(String name) {
super(name, "%nukkit.command.setworldspawn.description", "%commands.setworldspawn.usage");
this.setPermission("nukkit.command.setworldspawn");
this.commandParameters.clear();
- this.commandParameters.put("default", new CommandParameter[]{
+ this.commandParameters.put("default", CommandParameter.EMPTY_ARRAY);
+ this.commandParameters.put("spawnPoint", new CommandParameter[]{
CommandParameter.newType("spawnPoint", true, CommandParamType.POSITION)
});
}
diff --git a/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java b/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java
index da06292064c..a4f560da794 100644
--- a/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java
+++ b/src/main/java/cn/nukkit/command/defaults/WhitelistCommand.java
@@ -15,7 +15,7 @@
public class WhitelistCommand extends VanillaCommand {
public WhitelistCommand(String name) {
- super(name, "%nukkit.command.whitelist.description", "%commands.whitelist.usage");
+ super(name, "%nukkit.command.whitelist.description", "%commands.whitelist.usage", new String[]{"allowlist"}); // In Minecraft Bedrock v1.18.10 the whitelist was renamed to allowlist
this.setPermission(
"nukkit.command.whitelist.reload;" +
"nukkit.command.whitelist.enable;" +
@@ -52,17 +52,17 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
switch (args[0].toLowerCase()) {
case "reload":
sender.getServer().reloadWhitelist();
- Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.reloaded"));
+ Command.broadcastCommandMessage(sender, new TranslationContainer("commands.allowlist.reloaded"));
return true;
case "on":
sender.getServer().setPropertyBoolean("white-list", true);
- Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.enabled"));
+ Command.broadcastCommandMessage(sender, new TranslationContainer("commands.allowlist.enabled"));
return true;
case "off":
sender.getServer().setPropertyBoolean("white-list", false);
- Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.disabled"));
+ Command.broadcastCommandMessage(sender, new TranslationContainer("commands.allowlist.disabled"));
return true;
case "list":
@@ -72,17 +72,17 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
result.append(player).append(", ");
++count;
}
- sender.sendMessage(new TranslationContainer("commands.whitelist.list", String.valueOf(count), String.valueOf(count)));
+ sender.sendMessage(new TranslationContainer("commands.allowlist.list", String.valueOf(count), String.valueOf(count)));
sender.sendMessage(result.length() > 0 ? result.substring(0, result.length() - 2) : "");
return true;
case "add":
- sender.sendMessage(new TranslationContainer("commands.generic.usage", "%commands.whitelist.add.usage"));
+ sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
return true;
case "remove":
- sender.sendMessage(new TranslationContainer("commands.generic.usage", "%commands.whitelist.remove.usage"));
+ sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage));
return true;
}
} else if (args.length == 2) {
@@ -92,12 +92,12 @@ public boolean execute(CommandSender sender, String commandLabel, String[] args)
switch (args[0].toLowerCase()) {
case "add":
sender.getServer().getOfflinePlayer(args[1]).setWhitelisted(true);
- Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.add.success", args[1]));
+ Command.broadcastCommandMessage(sender, new TranslationContainer("commands.allowlist.add.success", args[1]));
return true;
case "remove":
sender.getServer().getOfflinePlayer(args[1]).setWhitelisted(false);
- Command.broadcastCommandMessage(sender, new TranslationContainer("commands.whitelist.remove.success", args[1]));
+ Command.broadcastCommandMessage(sender, new TranslationContainer("commands.allowlist.remove.success", args[1]));
return true;
}
diff --git a/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java
index bbae7c027b4..d252a9db1a7 100644
--- a/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/BoatDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.block.BlockID;
@@ -7,12 +8,18 @@
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.item.EntityBoat;
import cn.nukkit.item.Item;
-import cn.nukkit.item.ItemBoat;
import cn.nukkit.math.BlockFace;
import cn.nukkit.math.Vector3;
+@PowerNukkitOnly
public class BoatDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public BoatDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Vector3 pos = block.getSide(face).multiply(1.125);
@@ -29,7 +36,7 @@ public Item dispense(BlockDispenser block, BlockFace face, Item item) {
EntityBoat boat = new EntityBoat(block.level.getChunk(target.getChunkX(), target.getChunkZ()),
Entity.getDefaultNBT(pos)
- .putByte("woodID", ((ItemBoat)item).getLegacyBoatDamage().orElse(0))
+ .putInt("Variant", item.getDamage())
);
boat.spawnToAll();
diff --git a/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java
index 31fec412b77..a8bd23033c7 100644
--- a/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/BucketDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.*;
import cn.nukkit.item.Item;
import cn.nukkit.item.ItemBucket;
@@ -11,6 +12,7 @@
*/
public class BucketDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
if (!(item instanceof ItemBucket)) {
diff --git a/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java
index e24a39006b2..8f17cc7179f 100644
--- a/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/DefaultDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.item.Item;
import cn.nukkit.math.BlockFace;
@@ -14,8 +15,10 @@
*/
public class DefaultDispenseBehavior implements DispenseBehavior {
+ @PowerNukkitOnly
public boolean success = true;
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Vector3 dispensePos = block.getDispensePosition();
diff --git a/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java
index ebb94f2c36a..04ecaa2b323 100644
--- a/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/DispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.item.Item;
import cn.nukkit.math.BlockFace;
@@ -9,6 +10,7 @@
*/
public interface DispenseBehavior {
+ @PowerNukkitOnly
Item dispense(BlockDispenser block, BlockFace face, Item item);
}
diff --git a/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java b/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java
index e57d7fa5ee9..41494fc2f57 100644
--- a/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java
+++ b/src/main/java/cn/nukkit/dispenser/DispenseBehaviorRegister.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockID;
import cn.nukkit.item.ItemID;
@@ -26,6 +27,7 @@ public static void removeDispenseBehavior(int id) {
behaviors.remove(id);
}
+ @PowerNukkitOnly
public static void init() {
registerBehavior(ItemID.BOAT, new BoatDispenseBehavior());
registerBehavior(ItemID.BUCKET, new BucketDispenseBehavior());
diff --git a/src/main/java/cn/nukkit/dispenser/DropperDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DropperDispenseBehavior.java
index 2ec3460bb2a..d38318adbce 100644
--- a/src/main/java/cn/nukkit/dispenser/DropperDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/DropperDispenseBehavior.java
@@ -1,6 +1,5 @@
package cn.nukkit.dispenser;
-import cn.nukkit.api.PowerNukkitDifference;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockDispenser;
@@ -10,9 +9,15 @@
import cn.nukkit.level.Sound;
import cn.nukkit.math.BlockFace;
-@PowerNukkitDifference(info = "Spend items in container, the dropper faces to (if there is one).", since = "1.4.0.0-PN")
@PowerNukkitOnly
public class DropperDispenseBehavior extends DefaultDispenseBehavior {
+
+ @PowerNukkitOnly
+ public DropperDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Block target = block.getSide(face);
diff --git a/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java
index 4229683e00c..638cc0de850 100644
--- a/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/DyeDispenseBehavior.java
@@ -1,11 +1,19 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.*;
import cn.nukkit.item.Item;
import cn.nukkit.math.BlockFace;
+@PowerNukkitOnly
public class DyeDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public DyeDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Block target = block.getSide(face);
diff --git a/src/main/java/cn/nukkit/dispenser/EmptyBucketDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/EmptyBucketDispenseBehavior.java
index 088a356afaa..a664478b2cb 100644
--- a/src/main/java/cn/nukkit/dispenser/EmptyBucketDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/EmptyBucketDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.*;
import cn.nukkit.item.Item;
import cn.nukkit.item.MinecraftItemID;
@@ -10,6 +11,7 @@
*/
public class EmptyBucketDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Block target = block.getSide(face);
diff --git a/src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java
deleted file mode 100644
index 6edfaa09655..00000000000
--- a/src/main/java/cn/nukkit/dispenser/FireChargeDispenseBehavior.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cn.nukkit.dispenser;
-
-import cn.nukkit.block.BlockDispenser;
-import cn.nukkit.item.Item;
-import cn.nukkit.math.BlockFace;
-
-public class FireChargeDispenseBehavior extends DefaultDispenseBehavior {
-
- @Override
- public Item dispense(BlockDispenser block, BlockFace face, Item item) {
- //TODO: firecharge
- return null;
- }
-}
diff --git a/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java
index bcc55074a09..f7c80d2a8e1 100644
--- a/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/FireworksDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.item.EntityFirework;
@@ -9,8 +10,15 @@
import cn.nukkit.nbt.NBTIO;
import cn.nukkit.nbt.tag.CompoundTag;
+@PowerNukkitOnly
public class FireworksDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public FireworksDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
BlockFace opposite = face.getOpposite();
diff --git a/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java
index 54dec1b0eef..fd88e362bc3 100644
--- a/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/FlintAndSteelDispenseBehavior.java
@@ -1,19 +1,25 @@
package cn.nukkit.dispenser;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.block.BlockID;
import cn.nukkit.item.Item;
-import cn.nukkit.item.ItemFlintSteel;
import cn.nukkit.level.Sound;
import cn.nukkit.math.BlockFace;
+@PowerNukkitOnly
public class FlintAndSteelDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public FlintAndSteelDispenseBehavior() {
+ super();
+ }
+
@Override
@PowerNukkitDifference(info = "Reduce flint and steel usage instead of clearing.", since = "1.4.0.0-PN")
- public Item dispense(BlockDispenser block, BlockFace face, Item item) {
+ public @PowerNukkitOnly Item dispense(BlockDispenser block, BlockFace face, Item item) {
Block target = block.getSide(face);
item = item.clone();
diff --git a/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java
index a6d083d4921..c40a1095b1e 100644
--- a/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/ProjectileDispenseBehavior.java
@@ -1,6 +1,7 @@
package cn.nukkit.dispenser;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.projectile.EntityProjectile;
@@ -23,7 +24,7 @@ public ProjectileDispenseBehavior(String entity) {
@Override
@PowerNukkitDifference(info = "Implement sound.", since = "1.4.0.0-PN")
- public Item dispense(BlockDispenser source, BlockFace face, Item item) {
+ public @PowerNukkitOnly Item dispense(BlockDispenser source, BlockFace face, Item item) {
Vector3 dispensePos = source.getDispensePosition();
CompoundTag nbt = Entity.getDefaultNBT(dispensePos);
@@ -50,10 +51,12 @@ public Item dispense(BlockDispenser source, BlockFace face, Item item) {
return null;
}
+ @PowerNukkitOnly
protected double getMotion() {
return 1.1;
}
+ @PowerNukkitOnly
protected float getAccuracy() {
return 6;
}
diff --git a/src/main/java/cn/nukkit/dispenser/PumpkinDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/PumpkinDispenseBehavior.java
deleted file mode 100644
index 0803372fa92..00000000000
--- a/src/main/java/cn/nukkit/dispenser/PumpkinDispenseBehavior.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package cn.nukkit.dispenser;
-
-import cn.nukkit.block.Block;
-import cn.nukkit.block.BlockDispenser;
-import cn.nukkit.item.Item;
-import cn.nukkit.math.BlockFace;
-
-public class PumpkinDispenseBehavior extends DefaultDispenseBehavior {
-
- @Override
- public Item dispense(BlockDispenser block, BlockFace face, Item item) {
- Block target = block.getSide(face);
-
- //TODO: snowman / golem
- return null;
- }
-}
diff --git a/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java
index 1a878802fcc..4c6f5d9072c 100644
--- a/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/ShulkerBoxDispenseBehavior.java
@@ -1,13 +1,21 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.block.BlockUndyedShulkerBox;
import cn.nukkit.item.Item;
import cn.nukkit.math.BlockFace;
+@PowerNukkitOnly
public class ShulkerBoxDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public ShulkerBoxDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Block target = block.getSide(face);
diff --git a/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java
index 349453a8b35..27ff98de721 100644
--- a/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/SpawnEggDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityLiving;
@@ -8,8 +9,15 @@
import cn.nukkit.math.BlockFace;
import cn.nukkit.math.Vector3;
+@PowerNukkitOnly
public class SpawnEggDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public SpawnEggDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Vector3 pos = block.getSide(face).add(0.5, 0.7, 0.5);
diff --git a/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java b/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java
index bbdb9aaf266..5f6abc7ce91 100644
--- a/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java
+++ b/src/main/java/cn/nukkit/dispenser/TNTDispenseBehavior.java
@@ -1,5 +1,6 @@
package cn.nukkit.dispenser;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockDispenser;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.item.EntityPrimedTNT;
@@ -7,8 +8,15 @@
import cn.nukkit.math.BlockFace;
import cn.nukkit.math.Vector3;
+@PowerNukkitOnly
public class TNTDispenseBehavior extends DefaultDispenseBehavior {
+ @PowerNukkitOnly
+ public TNTDispenseBehavior() {
+ super();
+ }
+
+ @PowerNukkitOnly
@Override
public Item dispense(BlockDispenser block, BlockFace face, Item item) {
Vector3 pos = block.getSide(face).add(0.5, 0, 0.5);
diff --git a/src/main/java/cn/nukkit/entity/Attribute.java b/src/main/java/cn/nukkit/entity/Attribute.java
index 1ab060eb7f9..611424a073c 100644
--- a/src/main/java/cn/nukkit/entity/Attribute.java
+++ b/src/main/java/cn/nukkit/entity/Attribute.java
@@ -9,13 +9,11 @@
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.utils.ServerException;
-import lombok.ToString;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
-@ToString
public class Attribute implements Cloneable {
@PowerNukkitOnly
@Since("1.4.0.0-PN")
@@ -177,4 +175,14 @@ public Attribute clone() {
return null;
}
}
+
+ @Override
+ public String toString() {
+ return name + "{" +
+ "min=" + minValue +
+ ", max=" + maxValue +
+ ", def=" + defaultValue +
+ ", val=" + currentValue +
+ '}';
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java
index a8308beb055..b55bc03e5a4 100644
--- a/src/main/java/cn/nukkit/entity/Entity.java
+++ b/src/main/java/cn/nukkit/entity/Entity.java
@@ -20,6 +20,8 @@
import cn.nukkit.event.player.PlayerTeleportEvent;
import cn.nukkit.item.Item;
import cn.nukkit.item.ItemID;
+import cn.nukkit.item.enchantment.Enchantment;
+import cn.nukkit.item.enchantment.sideeffect.SideEffect;
import cn.nukkit.level.*;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.math.*;
@@ -35,10 +37,14 @@
import cn.nukkit.potion.Effect;
import cn.nukkit.scheduler.Task;
import cn.nukkit.utils.ChunkException;
+import cn.nukkit.utils.TextFormat;
+import cn.nukkit.utils.Utils;
import co.aikar.timings.Timing;
import co.aikar.timings.Timings;
import co.aikar.timings.TimingsHistory;
import com.google.common.collect.Iterables;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntCollection;
import lombok.extern.log4j.Log4j2;
import javax.annotation.Nonnull;
@@ -124,16 +130,7 @@ public abstract class Entity extends Location implements Metadatable {
public static final int DATA_POTION_AUX_VALUE = dynamic(36); //short
public static final int DATA_LEAD_HOLDER_EID = dynamic(37); //long
public static final int DATA_SCALE = dynamic(38); //float
- @Since("1.4.0.0-PN") public static final int DATA_INTERACTIVE_TAG = dynamic(39); //string (button text)
-
- @PowerNukkitOnly @Since("1.2.0.0-PN")
- @Deprecated @DeprecationDetails(
- by = "PowerNukkit", since = "1.4.0.0-PN",
- reason = "This is not only for NPC, it's used to display any interactive button text " +
- "and Nukkit added this constant with a different name",
- replaceWith = "DATA_INTERACTIVE_TAG")
- public static final int DATA_HAS_NPC_COMPONENT = dynamic(DATA_INTERACTIVE_TAG); //byte
-
+ @Since("1.2.0.0-PN") public static final int DATA_HAS_NPC_COMPONENT = dynamic(39); //byte
public static final int DATA_NPC_SKIN_ID = dynamic(40); //string
public static final int DATA_URL_TAG = dynamic(41); //string
public static final int DATA_MAX_AIR = dynamic(42); //short
@@ -194,7 +191,14 @@ public abstract class Entity extends Location implements Metadatable {
@Since("1.2.0.0-PN") public static final int DATA_CHANGE_RATE = dynamic(97); //float
@Since("1.2.0.0-PN") public static final int DATA_CHANGE_ON_PICKUP = dynamic(98); //float
@Since("1.2.0.0-PN") public static final int DATA_PICKUP_COUNT = dynamic(99); //int
- @Since("1.2.0.0-PN") public static final int DATA_INTERACT_TEXT = dynamic(100); //string
+ @Since("1.4.0.0-PN") public static final int DATA_INTERACTIVE_TAG = dynamic(100); //string (button text)
+
+ @PowerNukkitOnly("Removed from Cloudburst Nukkit")
+ @Deprecated
+ @DeprecationDetails(by = "Cloudburst Nukkit", reason = "Duplicated and removed", replaceWith = "DATA_INTERACTIVE_TAG", since = "1.6.0.0-PN")
+ @Since("1.2.0.0-PN")
+ public static final int DATA_INTERACT_TEXT = dynamic(DATA_INTERACTIVE_TAG); //string
+
public static final int DATA_TRADE_TIER = dynamic(101); //int
public static final int DATA_MAX_TRADE_TIER = dynamic(102); //int
@Since("1.2.0.0-PN") public static final int DATA_TRADE_EXPERIENCE = dynamic(103); //int
@@ -214,11 +218,11 @@ public abstract class Entity extends Location implements Metadatable {
@Since("1.3.0.0-PN") public static final int DATA_NEARBY_CURED_DISCOUNT_TIMESTAMP = dynamic(117); //int
@Since("1.3.0.0-PN") public static final int DATA_HITBOX = dynamic(118); //NBT
@Since("1.3.0.0-PN") public static final int DATA_IS_BUOYANT = dynamic(119); //byte
- @Since("1.5.0.0-PN") @PowerNukkitOnly public static final int DATA_BASE_RUNTIME_ID = dynamic(120); // ???
- @Since("1.4.0.0-PN") public static final int DATA_FREEZING_EFFECT_STRENGTH = dynamic(121);
+ @Since("1.5.0.0-PN") public static final int DATA_BASE_RUNTIME_ID = dynamic(120); // ???
+ @Since("1.4.0.0-PN") public static final int DATA_FREEZING_EFFECT_STRENGTH = dynamic(121); // ???
@Since("1.3.0.0-PN") public static final int DATA_BUOYANCY_DATA = dynamic(122); //string
@Since("1.4.0.0-PN") public static final int DATA_GOAT_HORN_COUNT = dynamic(123); // ???
- @Since("1.5.0.0-PN") @PowerNukkitOnly public static final int DATA_UPDATE_PROPERTIES = dynamic(124); // ???
+ @Since("1.5.0.0-PN") public static final int DATA_UPDATE_PROPERTIES = dynamic(124); // ???
// Flags
public static final int DATA_FLAG_ONFIRE = dynamic(0);
@@ -309,7 +313,7 @@ public abstract class Entity extends Location implements Metadatable {
@Since("1.2.0.0-PN") public static final int DATA_FLAG_BLOCKED_USING_SHIELD = dynamic(73);
@Since("1.2.0.0-PN") public static final int DATA_FLAG_BLOCKED_USING_DAMAGED_SHIELD = dynamic(74);
@Since("1.2.0.0-PN") public static final int DATA_FLAG_SLEEPING = dynamic(75);
- @Since("1.2.0.0-PN") public static final int DATA_FLAG_WANTS_TO_WAKE = dynamic(76);
+ @Since("1.6.0.0-PN") public static final int DATA_FLAG_ENTITY_GROW_UP = dynamic(76);
@Since("1.2.0.0-PN") public static final int DATA_FLAG_TRADE_INTEREST = dynamic(77);
@Since("1.2.0.0-PN") public static final int DATA_FLAG_DOOR_BREAKER = dynamic(78);
@Since("1.2.0.0-PN") public static final int DATA_FLAG_BREAKING_OBSTRUCTION = dynamic(79);
@@ -329,7 +333,11 @@ public abstract class Entity extends Location implements Metadatable {
@Since("1.3.0.0-PN") public static final int DATA_FLAG_ADMIRING = dynamic(93);
@Since("1.3.0.0-PN") public static final int DATA_FLAG_CELEBRATING_SPECIAL = dynamic(94);
@Since("1.4.0.0-PN") public static final int DATA_FLAG_RAM_ATTACK = dynamic(96);
- @Since("1.5.0.0-PN") @PowerNukkitOnly public static final int DATA_FLAG_PLAYING_DEAD = dynamic(97);
+ @Since("1.5.0.0-PN") public static final int DATA_FLAG_PLAYING_DEAD = dynamic(97);
+ @Since("1.6.0.0-PN") public static final int DATA_FLAG_IN_ASCENDABLE_BLOCK = dynamic(98);
+ @Since("1.6.0.0-PN") public static final int DATA_FLAG_OVER_DESCENDABLE_BLOCK = dynamic(99);
+ public static final int DATA_FLAG_CROAKING = 100;
+ public static final int DATA_FLAG_EAT_MOB = 101;
public static long entityCount = 1;
@@ -377,11 +385,13 @@ public abstract class Entity extends Location implements Metadatable {
public double lastMotionY;
public double lastMotionZ;
- public double lastYaw;
public double lastPitch;
+ @Since("1.6.0.0-PN") public double lastYaw;
+ @Since("1.6.0.0-PN") public double lastHeadYaw;
public double pitchDelta;
- public double yawDelta;
+ @Since("1.6.0.0-PN") public double yawDelta;
+ @Since("1.6.0.0-PN") public double headYawDelta;
public double entityCollisionReduction = 0; // Higher than 0.9 will result a fast collisions
public AxisAlignedBB boundingBox;
@@ -446,8 +456,18 @@ public float getHeight() {
return 0;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public float getCurrentHeight() {
+ if (isSwimming()) {
+ return getSwimmingHeight();
+ } else {
+ return getHeight();
+ }
+ }
+
public float getEyeHeight() {
- return this.getHeight() / 2 + 0.1f;
+ return getCurrentHeight() / 2 + 0.1f;
}
public float getWidth() {
@@ -680,12 +700,24 @@ public boolean isSwimming() {
return this.getDataFlag(DATA_FLAGS, DATA_FLAG_SWIMMING);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public float getSwimmingHeight() {
+ return getHeight();
+ }
+
public void setSwimming() {
this.setSwimming(true);
}
public void setSwimming(boolean value) {
+ if (isSwimming() == value) {
+ return;
+ }
this.setDataFlag(DATA_FLAGS, DATA_FLAG_SWIMMING, value);
+ if (Float.compare(getSwimmingHeight(), getHeight()) != 0) {
+ recalculateBoundingBox(true);
+ }
}
public boolean isSprinting() {
@@ -832,11 +864,20 @@ public void recalculateBoundingBox() {
}
public void recalculateBoundingBox(boolean send) {
- float height = this.getHeight() * this.scale;
+ float entityHeight = getCurrentHeight();
+ float height = entityHeight * this.scale;
double radius = (this.getWidth() * this.scale) / 2d;
- this.boundingBox.setBounds(x - radius, y, z - radius, x + radius, y + height, z + radius);
+ this.boundingBox.setBounds(
+ x - radius,
+ y,
+ z - radius,
+
+ x + radius,
+ y + height,
+ z + radius
+ );
- FloatEntityData bbH = new FloatEntityData(DATA_BOUNDING_BOX_HEIGHT, this.getHeight());
+ FloatEntityData bbH = new FloatEntityData(DATA_BOUNDING_BOX_HEIGHT, entityHeight);
FloatEntityData bbW = new FloatEntityData(DATA_BOUNDING_BOX_WIDTH, this.getWidth());
this.dataProperties.put(bbH);
this.dataProperties.put(bbW);
@@ -966,6 +1007,50 @@ public static boolean registerEntity(String name, Class extends Entity> clazz,
return true;
}
+ @Nonnull
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public static IntCollection getKnownEntityIds() {
+ return knownEntities.keySet().stream()
+ .filter(Utils::isInteger)
+ .mapToInt(Integer::parseInt)
+ .collect(IntArrayList::new, IntArrayList::add, IntArrayList::addAll);
+ }
+
+ @Nonnull
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public static List getSaveIds() {
+ return new ArrayList<>(shortNames.values());
+ }
+
+ @Nonnull
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public static OptionalInt getSaveId(String id) {
+ Class extends Entity> entityClass = knownEntities.get(id);
+ if (entityClass == null) {
+ return OptionalInt.empty();
+ }
+ return knownEntities.entrySet().stream()
+ .filter(entry -> entry.getValue().equals(entityClass))
+ .map(Map.Entry::getKey)
+ .filter(Utils::isInteger)
+ .mapToInt(Integer::parseInt)
+ .findFirst();
+ }
+
+ @Nullable
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public static String getSaveId(int id) {
+ Class extends Entity> entityClass = knownEntities.get(Integer.toString(id));
+ if (entityClass == null) {
+ return null;
+ }
+ return shortNames.get(entityClass.getSimpleName());
+ }
+
@Nonnull
public static CompoundTag getDefaultNBT(@Nonnull Vector3 pos) {
return getDefaultNBT(pos, null);
@@ -1054,12 +1139,38 @@ public void saveNBT() {
}
}
+ /**
+ * The name that English name of the type of this entity.
+ */
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public String getOriginalName() {
+ return this.getSaveId();
+ }
+
+ /**
+ * Similar to {@link #getName()}, but if the name is blank or empty it returns the static name instead.
+ */
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public final String getVisibleName() {
+ String name = getName();
+ if (!TextFormat.clean(name).trim().isEmpty()) {
+ return name;
+ } else {
+ return getOriginalName();
+ }
+ }
+
+ /**
+ * The current name used by this entity in the name tag, or the static name if the entity don't have nametag.
+ */
@Nonnull
public String getName() {
if (this.hasCustomName()) {
return this.getNameTag();
} else {
- return this.getSaveId();
+ return this.getOriginalName();
}
}
@@ -1182,6 +1293,17 @@ public boolean attack(EntityDamageEvent source) {
if (source.isCancelled()) {
return false;
}
+
+ // Make fire aspect to set the target in fire before dealing any damage so the target is in fire on death even if killed by the first hit
+ if (source instanceof EntityDamageByEntityEvent) {
+ Enchantment[] enchantments = ((EntityDamageByEntityEvent) source).getWeaponEnchantments();
+ if (enchantments != null) {
+ for (Enchantment enchantment : enchantments) {
+ enchantment.doAttack(((EntityDamageByEntityEvent) source).getDamager(), this);
+ }
+ }
+ }
+
if (this.absorption > 0) { // Damage Absorption
this.setAbsorption(Math.max(0, this.getAbsorption() + source.getDamage(EntityDamageEvent.DamageModifier.ABSORPTION)));
}
@@ -1221,7 +1343,10 @@ public boolean attack(EntityDamageEvent source) {
}
}
}
-
+ Entity attacker = source instanceof EntityDamageByEntityEvent? ((EntityDamageByEntityEvent) source).getDamager() : null;
+ for (SideEffect sideEffect : source.getSideEffects()) {
+ sideEffect.doPreHealthChange(this, source, attacker);
+ }
setHealth(newHealth);
return true;
}
@@ -1305,13 +1430,13 @@ protected boolean checkObstruction(double x, double y, double z) {
double diffY = y - j;
double diffZ = z - k;
- if (!Block.transparent[this.level.getBlockIdAt(i, j, k)]) {
- boolean flag = Block.transparent[this.level.getBlockIdAt(i - 1, j, k)];
- boolean flag1 = Block.transparent[this.level.getBlockIdAt(i + 1, j, k)];
- boolean flag2 = Block.transparent[this.level.getBlockIdAt(i, j - 1, k)];
- boolean flag3 = Block.transparent[this.level.getBlockIdAt(i, j + 1, k)];
- boolean flag4 = Block.transparent[this.level.getBlockIdAt(i, j, k - 1)];
- boolean flag5 = Block.transparent[this.level.getBlockIdAt(i, j, k + 1)];
+ if (!Block.isTransparent(this.level.getBlockIdAt(i, j, k))) {
+ boolean flag = Block.isTransparent(this.level.getBlockIdAt(i - 1, j, k));
+ boolean flag1 = Block.isTransparent(this.level.getBlockIdAt(i + 1, j, k));
+ boolean flag2 = Block.isTransparent(this.level.getBlockIdAt(i, j - 1, k));
+ boolean flag3 = Block.isTransparent(this.level.getBlockIdAt(i, j + 1, k));
+ boolean flag4 = Block.isTransparent(this.level.getBlockIdAt(i, j, k - 1));
+ boolean flag5 = Block.isTransparent(this.level.getBlockIdAt(i, j, k + 1));
int direction = -1;
double limit = 9999;
@@ -1557,9 +1682,11 @@ public void updateMovement() {
this.lastY = this.y;
this.lastZ = this.z;
- this.lastYaw = this.yaw;
this.lastPitch = this.pitch;
+ this.lastYaw = this.yaw;
+ this.lastHeadYaw = this.headYaw;
+ // If you want to achieve headYaw in movement. You can override it by yourself. Changing would break some mob plugins.
this.addMovement(this.x, this.y + this.getBaseOffset(), this.z, this.yaw, this.pitch, this.yaw);
this.positionChanged = true;
} else {
@@ -1589,6 +1716,7 @@ public void addMotion(double motionX, double motionY, double motionZ) {
Server.broadcastPacket(this.hasSpawned.values(), pk);
}
+ @Override
public Vector3 getDirectionVector() {
Vector3 vector = super.getDirectionVector();
return this.temporalVector.setComponents(vector.x, vector.y, vector.z);
@@ -1761,6 +1889,7 @@ public void setAbsorption(float absorption) {
}
}
+ @PowerNukkitOnly
public boolean canBePushed() {
return true;
}
@@ -1819,17 +1948,18 @@ public void fall(float fallDistance) {
return;
}
- float damage = (float) Math.floor(fallDistance - 3 - (this.hasEffect(Effect.JUMP) ? this.getEffect(Effect.JUMP).getAmplifier() + 1 : 0));
Location floorLocation = this.floor();
Block down = this.level.getBlock(floorLocation.down());
- if (damage > 0) {
- if(down instanceof BlockHayBale) {
- damage -= (damage * 0.8f);
- }
- if (down.getId() == BlockID.HONEY_BLOCK) {
+
+ if (!this.isPlayer || level.getGameRules().getBoolean(GameRule.FALL_DAMAGE)) {
+ int jumpBoost = this.hasEffect(Effect.JUMP_BOOST)? (getEffect(Effect.JUMP_BOOST).getAmplifier() + 1) : 0;
+ float damage = (float) Math.floor(fallDistance - 3 - jumpBoost);
+
+ if(down instanceof BlockHayBale || down instanceof BlockHoney) {
damage *= 0.2F;
}
- if (!this.isPlayer || level.getGameRules().getBoolean(GameRule.FALL_DAMAGE)) {
+
+ if (damage > 0) {
this.attack(new EntityDamageEvent(this, DamageCause.FALL, damage));
}
}
@@ -1934,6 +2064,7 @@ public void onStruckByLightning(Entity entity) {
}
}
+ @PowerNukkitOnly
public void onPushByPiston(BlockEntityPistonArm piston) {
}
@@ -1976,11 +2107,13 @@ public Position getPosition() {
return new Position(this.x, this.y, this.z, this.level);
}
+ @Override
@Nonnull
public Location getLocation() {
- return new Location(this.x, this.y, this.z, this.yaw, this.pitch, this.level);
+ return new Location(this.x, this.y, this.z, this.yaw, this.pitch, this.headYaw, this.level);
}
+ @PowerNukkitOnly
public boolean isTouchingWater() {
return hasWaterAt(0) || hasWaterAt(this.getEyeHeight());
}
@@ -2351,12 +2484,30 @@ public boolean setPositionAndRotation(Vector3 pos, double yaw, double pitch) {
return false;
}
+ @Since("1.6.0.0-PN")
+ public boolean setPositionAndRotation(Vector3 pos, double yaw, double pitch, double headYaw) {
+ if (this.setPosition(pos)) {
+ this.setRotation(yaw, pitch, headYaw);
+ return true;
+ }
+
+ return false;
+ }
+
public void setRotation(double yaw, double pitch) {
this.yaw = yaw;
this.pitch = pitch;
this.scheduleUpdate();
}
+ @Since("1.6.0.0-PN")
+ public void setRotation(double yaw, double pitch, double headYaw) {
+ this.yaw = yaw;
+ this.pitch = pitch;
+ this.headYaw = headYaw;
+ this.scheduleUpdate();
+ }
+
/**
* Whether the entity can active pressure plates.
* Used for {@link cn.nukkit.entity.passive.EntityBat}s only.
@@ -2465,7 +2616,7 @@ public boolean teleport(Vector3 pos) {
}
public boolean teleport(Vector3 pos, PlayerTeleportEvent.TeleportCause cause) {
- return this.teleport(Location.fromObject(pos, this.level, this.yaw, this.pitch), cause);
+ return this.teleport(Location.fromObject(pos, this.level, this.yaw, this.pitch, this.headYaw), cause);
}
public boolean teleport(Position pos) {
@@ -2473,7 +2624,7 @@ public boolean teleport(Position pos) {
}
public boolean teleport(Position pos, PlayerTeleportEvent.TeleportCause cause) {
- return this.teleport(Location.fromObject(pos, pos.level, this.yaw, this.pitch), cause);
+ return this.teleport(Location.fromObject(pos, pos.level, this.yaw, this.pitch, this.headYaw), cause);
}
public boolean teleport(Location location) {
@@ -2495,6 +2646,11 @@ public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cau
to = ev.getTo();
}
+ Entity currentRide = getRiding();
+ if (currentRide != null && !currentRide.dismountEntity(this)) {
+ return false;
+ }
+
this.ySize = 0;
this.setMotion(this.temporalVector.setComponents(0, 0, 0));
@@ -2516,10 +2672,12 @@ public long getId() {
}
public void respawnToAll() {
- for (Player player : this.hasSpawned.values()) {
+ Player[] players = this.hasSpawned.values().toArray(Player.EMPTY_ARRAY);
+ this.hasSpawned.clear();
+
+ for (Player player : players) {
this.spawnTo(player);
}
- this.hasSpawned.clear();
}
public void spawnToAll() {
@@ -2603,14 +2761,20 @@ public boolean setDataProperty(EntityData data) {
}
public boolean setDataProperty(EntityData data, boolean send) {
- if (!Objects.equals(data, this.getDataProperties().get(data.getId()))) {
- this.getDataProperties().put(data);
- if (send) {
- this.sendData(this.hasSpawned.values().toArray(Player.EMPTY_ARRAY), new EntityMetadata().put(this.dataProperties.get(data.getId())));
+ if (Objects.equals(data, this.dataProperties.get(data.getId()))) {
+ return false;
+ }
+
+ this.dataProperties.put(data);
+ if (send) {
+ EntityMetadata metadata = new EntityMetadata();
+ metadata.put(this.dataProperties.get(data.getId()));
+ if (data.getId() == DATA_FLAGS_EXTENDED) {
+ metadata.put(this.dataProperties.get(DATA_FLAGS));
}
- return true;
+ this.sendData(this.hasSpawned.values().toArray(Player.EMPTY_ARRAY), metadata);
}
- return false;
+ return true;
}
public EntityMetadata getDataProperties() {
@@ -2712,6 +2876,7 @@ public Server getServer() {
return server;
}
+ @PowerNukkitOnly
public boolean isUndead() {
return false;
}
diff --git a/src/main/java/cn/nukkit/entity/EntityCreature.java b/src/main/java/cn/nukkit/entity/EntityCreature.java
index 5a57a7a4ff8..8e20e723525 100644
--- a/src/main/java/cn/nukkit/entity/EntityCreature.java
+++ b/src/main/java/cn/nukkit/entity/EntityCreature.java
@@ -23,7 +23,7 @@ public EntityCreature(FullChunk chunk, CompoundTag nbt) {
// Armor stands, when implemented, should also check this.
@Override
public boolean onInteract(Player player, Item item, Vector3 clickedPos) {
- if (item.getId() == Item.NAME_TAG) {
+ if (item.getId() == Item.NAME_TAG && !player.isAdventure()) {
return applyNameTag(player, item);
}
return false;
diff --git a/src/main/java/cn/nukkit/entity/EntityHuman.java b/src/main/java/cn/nukkit/entity/EntityHuman.java
index 240314f7a29..07db9539922 100644
--- a/src/main/java/cn/nukkit/entity/EntityHuman.java
+++ b/src/main/java/cn/nukkit/entity/EntityHuman.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.data.IntPositionEntityData;
import cn.nukkit.entity.data.Skin;
import cn.nukkit.item.Item;
@@ -50,14 +52,21 @@ public float getHeight() {
return 1.8f;
}
+ @Since("1.5.1.0-PN")
+ @PowerNukkitOnly
+ @Override
+ public float getSwimmingHeight() {
+ return getWidth();
+ }
+
@Override
public float getEyeHeight() {
- return 1.62f;
+ return (float)(boundingBox.getMaxY() - boundingBox.getMinY() - 0.18);
}
@Override
protected float getBaseOffset() {
- return this.getEyeHeight();
+ return 1.62f;
}
protected Skin skin;
@@ -210,6 +219,13 @@ protected void initEntity() {
super.initEntity();
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Human";
+ }
+
@Override
public String getName() {
return this.getNameTag();
@@ -361,6 +377,7 @@ public void close() {
}
}
+ @PowerNukkitOnly
@Override
protected void onBlock(Entity entity, boolean animate) {
super.onBlock(entity, animate);
diff --git a/src/main/java/cn/nukkit/entity/EntityLiving.java b/src/main/java/cn/nukkit/entity/EntityLiving.java
index f243aab244a..4b5ba5d1a6d 100644
--- a/src/main/java/cn/nukkit/entity/EntityLiving.java
+++ b/src/main/java/cn/nukkit/entity/EntityLiving.java
@@ -448,16 +448,19 @@ protected boolean blockedByShield(EntityDamageEvent source) {
return true;
}
+ @PowerNukkitOnly
protected void onBlock(Entity entity, boolean animate) {
if (animate) {
getLevel().addSound(this, Sound.ITEM_SHIELD_BLOCK);
}
}
+ @PowerNukkitOnly
public boolean isBlocking() {
return this.getDataFlag(DATA_FLAGS_EXTENDED, DATA_FLAG_BLOCKING);
}
+ @PowerNukkitOnly
public void setBlocking(boolean value) {
this.setDataFlag(DATA_FLAGS_EXTENDED, DATA_FLAG_BLOCKING, value);
}
diff --git a/src/main/java/cn/nukkit/entity/EntityNameable.java b/src/main/java/cn/nukkit/entity/EntityNameable.java
index 0786f1ca83a..2498555eb11 100644
--- a/src/main/java/cn/nukkit/entity/EntityNameable.java
+++ b/src/main/java/cn/nukkit/entity/EntityNameable.java
@@ -58,7 +58,7 @@ default boolean playerApplyNameTag(@Nonnull Player player, @Nonnull Item item, b
this.setNameTagVisible(true);
if(consume && !player.isCreative()) {
- player.getInventory().removeItem(item);
+ item.decrement(1);
}
// Set entity as persistent.
return true;
diff --git a/src/main/java/cn/nukkit/entity/data/ByteEntityData.java b/src/main/java/cn/nukkit/entity/data/ByteEntityData.java
index d20d3a0426c..49cad2581a0 100644
--- a/src/main/java/cn/nukkit/entity/data/ByteEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/ByteEntityData.java
@@ -13,10 +13,12 @@ public ByteEntityData(int id, int data) {
this.data = data;
}
+ @Override
public Integer getData() {
return data;
}
+ @Override
public void setData(Integer data) {
if (data == null) {
this.data = 0;
@@ -29,4 +31,9 @@ public void setData(Integer data) {
public int getType() {
return Entity.DATA_TYPE_BYTE;
}
+
+ @Override
+ public String toString() {
+ return data + "b";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/EntityMetadata.java b/src/main/java/cn/nukkit/entity/data/EntityMetadata.java
index 47dcacc56e2..ffe87dff381 100644
--- a/src/main/java/cn/nukkit/entity/data/EntityMetadata.java
+++ b/src/main/java/cn/nukkit/entity/data/EntityMetadata.java
@@ -5,7 +5,7 @@
import cn.nukkit.math.Vector3;
import cn.nukkit.math.Vector3f;
import cn.nukkit.nbt.tag.CompoundTag;
-import lombok.ToString;
+import lombok.extern.log4j.Log4j2;
import java.util.HashMap;
import java.util.Map;
@@ -13,7 +13,7 @@
/**
* @author MagicDroidX (Nukkit Project)
*/
-@ToString
+@Log4j2
public class EntityMetadata {
private final Map map = new HashMap<>();
@@ -38,6 +38,7 @@ public boolean exists(int id) {
public EntityMetadata put(EntityData data) {
this.map.put(data.getId(), data);
+ //log.info("Updated entity data {}", this::toString);
return this;
}
@@ -121,4 +122,9 @@ public EntityMetadata putString(int id, String value) {
public Map getMap() {
return new HashMap<>(map);
}
+
+ @Override
+ public String toString() {
+ return map.toString();
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/FloatEntityData.java b/src/main/java/cn/nukkit/entity/data/FloatEntityData.java
index 12c62f00d45..52aceeb1db1 100644
--- a/src/main/java/cn/nukkit/entity/data/FloatEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/FloatEntityData.java
@@ -13,10 +13,12 @@ public FloatEntityData(int id, float data) {
this.data = data;
}
+ @Override
public Float getData() {
return data;
}
+ @Override
public void setData(Float data) {
if (data == null) {
this.data = 0;
@@ -30,4 +32,9 @@ public void setData(Float data) {
public int getType() {
return Entity.DATA_TYPE_FLOAT;
}
+
+ @Override
+ public String toString() {
+ return data + "f";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/IntEntityData.java b/src/main/java/cn/nukkit/entity/data/IntEntityData.java
index 87dbf695e24..0cafe48ff4d 100644
--- a/src/main/java/cn/nukkit/entity/data/IntEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/IntEntityData.java
@@ -13,10 +13,12 @@ public IntEntityData(int id, int data) {
this.data = data;
}
+ @Override
public Integer getData() {
return data;
}
+ @Override
public void setData(Integer data) {
if (data == null) {
this.data = 0;
@@ -29,4 +31,9 @@ public void setData(Integer data) {
public int getType() {
return Entity.DATA_TYPE_INT;
}
+
+ @Override
+ public String toString() {
+ return data + "i";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java b/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java
index f00b7b391dd..4f37cf0f0a0 100644
--- a/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/IntPositionEntityData.java
@@ -41,4 +41,9 @@ public void setData(BlockVector3 data) {
public int getType() {
return Entity.DATA_TYPE_POS;
}
+
+ @Override
+ public String toString() {
+ return "(" + x + ", " + y + ", " + z + ")";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/LongEntityData.java b/src/main/java/cn/nukkit/entity/data/LongEntityData.java
index 595c9440a92..25c636b59dc 100644
--- a/src/main/java/cn/nukkit/entity/data/LongEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/LongEntityData.java
@@ -13,10 +13,12 @@ public LongEntityData(int id, long data) {
this.data = data;
}
+ @Override
public Long getData() {
return data;
}
+ @Override
public void setData(Long data) {
this.data = data;
}
@@ -25,4 +27,9 @@ public void setData(Long data) {
public int getType() {
return Entity.DATA_TYPE_LONG;
}
+
+ @Override
+ public String toString() {
+ return data + "l";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/NBTEntityData.java b/src/main/java/cn/nukkit/entity/data/NBTEntityData.java
index 14f5931996d..57507721754 100644
--- a/src/main/java/cn/nukkit/entity/data/NBTEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/NBTEntityData.java
@@ -28,4 +28,9 @@ public void setData(CompoundTag tag) {
public int getType() {
return Entity.DATA_TYPE_NBT;
}
+
+ @Override
+ public String toString() {
+ return tag.toString();
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/ShortEntityData.java b/src/main/java/cn/nukkit/entity/data/ShortEntityData.java
index 0d7ec96758d..9d21779a658 100644
--- a/src/main/java/cn/nukkit/entity/data/ShortEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/ShortEntityData.java
@@ -13,10 +13,12 @@ public ShortEntityData(int id, int data) {
this.data = data;
}
+ @Override
public Integer getData() {
return data;
}
+ @Override
public void setData(Integer data) {
if (data == null) {
this.data = 0;
@@ -29,4 +31,9 @@ public void setData(Integer data) {
public int getType() {
return Entity.DATA_TYPE_SHORT;
}
+
+ @Override
+ public String toString() {
+ return data + "s";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/data/Skin.java b/src/main/java/cn/nukkit/entity/data/Skin.java
index d0fecd599f5..60272e9aae9 100644
--- a/src/main/java/cn/nukkit/entity/data/Skin.java
+++ b/src/main/java/cn/nukkit/entity/data/Skin.java
@@ -4,9 +4,10 @@
import cn.nukkit.nbt.stream.FastByteArrayOutputStream;
import cn.nukkit.utils.*;
import com.google.common.base.Preconditions;
+import com.nimbusds.jose.shaded.json.JSONObject;
+import com.nimbusds.jose.shaded.json.JSONValue;
+import lombok.EqualsAndHashCode;
import lombok.ToString;
-import net.minidev.json.JSONObject;
-import net.minidev.json.JSONValue;
import java.awt.*;
import java.awt.image.BufferedImage;
@@ -20,6 +21,7 @@
* @author MagicDroidX (Nukkit Project)
*/
@ToString(exclude = {"geometryData", "animationData"})
+@EqualsAndHashCode(exclude = {"fullSkinId", "trusted"})
public class Skin {
private static final int PIXEL_SIZE = 4;
@@ -45,10 +47,12 @@ public class Skin {
private boolean premium;
private boolean persona;
private boolean capeOnClassic;
+ private boolean primaryUser = true;
private String capeId;
private String skinColor = "#0";
private String armSize = "wide";
private boolean trusted = false;
+ private String geometryDataEngineVersion = "";
public boolean isValid() {
return isValidSkin() && isValidResourcePatch();
@@ -235,6 +239,26 @@ public void setCapeOnClassic(boolean capeOnClassic) {
this.capeOnClassic = capeOnClassic;
}
+ @Since("1.5.2.0-PN")
+ public void setPrimaryUser(boolean primaryUser) {
+ this.primaryUser = primaryUser;
+ }
+
+ @Since("1.5.2.0-PN")
+ public boolean isPrimaryUser() {
+ return primaryUser;
+ }
+
+ @Since("1.5.2.0-PN")
+ public void setGeometryDataEngineVersion(String geometryDataEngineVersion) {
+ this.geometryDataEngineVersion = geometryDataEngineVersion;
+ }
+
+ @Since("1.5.2.0-PN")
+ public String getGeometryDataEngineVersion() {
+ return geometryDataEngineVersion;
+ }
+
public boolean isTrusted() {
return trusted;
}
diff --git a/src/main/java/cn/nukkit/entity/data/StringEntityData.java b/src/main/java/cn/nukkit/entity/data/StringEntityData.java
index 0385acdcb6d..a8a4feb88fd 100644
--- a/src/main/java/cn/nukkit/entity/data/StringEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/StringEntityData.java
@@ -13,10 +13,12 @@ public StringEntityData(int id, String data) {
this.data = data;
}
+ @Override
public String getData() {
return data;
}
+ @Override
public void setData(String data) {
this.data = data;
}
diff --git a/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java b/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java
index 07a9cde4fd5..7bdb91e5a66 100644
--- a/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java
+++ b/src/main/java/cn/nukkit/entity/data/Vector3fEntityData.java
@@ -40,4 +40,9 @@ public void setData(Vector3f data) {
public int getType() {
return Entity.DATA_TYPE_VECTOR3F;
}
+
+ @Override
+ public String toString() {
+ return "(" + x + ", " + y + ", " + z + ")";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityAreaEffectCloud.java b/src/main/java/cn/nukkit/entity/item/EntityAreaEffectCloud.java
index 8b6172f3047..4d5ea81bc0d 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityAreaEffectCloud.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityAreaEffectCloud.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.item;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityLiving;
import cn.nukkit.entity.data.FloatEntityData;
@@ -19,49 +21,60 @@
import java.util.ArrayList;
import java.util.List;
+@PowerNukkitOnly
public class EntityAreaEffectCloud extends Entity {
- public static final int NETWORK_ID = 95;
-
- protected int reapplicationDelay;
- protected int durationOnUse;
- protected float initialRadius;
- protected float radiusOnUse;
- protected int nextApply;
- public List cloudEffects;
+
+ @PowerNukkitOnly public static final int NETWORK_ID = 95;
+
+ @PowerNukkitOnly protected int reapplicationDelay;
+ @PowerNukkitOnly protected int durationOnUse;
+ @PowerNukkitOnly protected float initialRadius;
+ @PowerNukkitOnly protected float radiusOnUse;
+ @PowerNukkitOnly protected int nextApply;
+ @PowerNukkitOnly public List cloudEffects;
private int lastAge;
-
+
+ @PowerNukkitOnly
public EntityAreaEffectCloud(FullChunk chunk, CompoundTag nbt) {
super(chunk, nbt);
}
-
+
+ @PowerNukkitOnly
public int getWaitTime() {
return this.getDataPropertyInt(DATA_AREA_EFFECT_CLOUD_WAITING);
}
-
+
+ @PowerNukkitOnly
public void setWaitTime(int waitTime) {
setWaitTime(waitTime, true);
}
-
+
+ @PowerNukkitOnly
public void setWaitTime(int waitTime, boolean send) {
this.setDataProperty(new IntEntityData(DATA_AREA_EFFECT_CLOUD_WAITING, waitTime), send);
}
-
+
+ @PowerNukkitOnly
public int getPotionId() {
return this.getDataPropertyShort(DATA_POTION_AUX_VALUE);
}
-
+
+ @PowerNukkitOnly
public void setPotionId(int potionId) {
setPotionId(potionId, true);
}
-
+
+ @PowerNukkitOnly
public void setPotionId(int potionId, boolean send) {
this.setDataProperty(new ShortEntityData(DATA_POTION_AUX_VALUE, potionId & 0xFFFF), send);
}
-
+
+ @PowerNukkitOnly
public void recalculatePotionColor() {
recalculatePotionColor(true);
}
-
+
+ @PowerNukkitOnly
public void recalculatePotionColor(boolean send) {
int a;
int r;
@@ -92,103 +105,128 @@ public void recalculatePotionColor(boolean send) {
setPotionColor(a, r, g, b, send);
}
-
+
+ @PowerNukkitOnly
public int getPotionColor() {
return this.getDataPropertyInt(DATA_POTION_COLOR);
}
-
+
+ @PowerNukkitOnly
public void setPotionColor(int alpha, int red, int green, int blue, boolean send) {
setPotionColor(((alpha & 0xff) << 24) | ((red & 0xff) << 16) | ((green & 0xff) << 8) | (blue & 0xff), send);
}
-
+
+ @PowerNukkitOnly
public void setPotionColor(int argp) {
setPotionColor(argp, true);
}
-
+
+ @PowerNukkitOnly
public void setPotionColor(int argp, boolean send) {
this.setDataProperty(new IntEntityData(DATA_POTION_COLOR, argp), send);
}
-
+
+ @PowerNukkitOnly
public int getPickupCount() {
return this.getDataPropertyInt(DATA_PICKUP_COUNT);
}
-
+
+ @PowerNukkitOnly
public void setPickupCount(int pickupCount) {
setPickupCount(pickupCount, true);
}
-
+
+ @PowerNukkitOnly
public void setPickupCount(int pickupCount, boolean send) {
this.setDataProperty(new IntEntityData(DATA_PICKUP_COUNT, pickupCount), send);
- }
-
+ }
+
+ @PowerNukkitOnly
public float getRadiusChangeOnPickup() {
return this.getDataPropertyFloat(DATA_CHANGE_ON_PICKUP);
}
-
+
+ @PowerNukkitOnly
public void setRadiusChangeOnPickup(float radiusChangeOnPickup) {
setRadiusChangeOnPickup(radiusChangeOnPickup, true);
}
-
+
+ @PowerNukkitOnly
public void setRadiusChangeOnPickup(float radiusChangeOnPickup, boolean send) {
this.setDataProperty(new FloatEntityData(DATA_CHANGE_ON_PICKUP, radiusChangeOnPickup), send);
}
-
+
+ @PowerNukkitOnly
public float getRadiusPerTick() {
return this.getDataPropertyFloat(DATA_CHANGE_RATE);
}
-
+
+ @PowerNukkitOnly
public void setRadiusPerTick(float radiusPerTick) {
setRadiusPerTick(radiusPerTick, true);
}
-
+
+ @PowerNukkitOnly
public void setRadiusPerTick(float radiusPerTick, boolean send) {
this.setDataProperty(new FloatEntityData(DATA_CHANGE_RATE, radiusPerTick), send);
}
-
+
+ @PowerNukkitOnly
public long getSpawnTime() {
return this.getDataPropertyInt(DATA_SPAWN_TIME);
}
-
+
+ @PowerNukkitOnly
public void setSpawnTime(long spawnTime) {
setSpawnTime(spawnTime, true);
}
-
+
+ @PowerNukkitOnly
public void setSpawnTime(long spawnTime, boolean send) {
this.setDataProperty(new LongEntityData(DATA_SPAWN_TIME, spawnTime), send);
}
-
+
+ @PowerNukkitOnly
public int getDuration() {
return this.getDataPropertyInt(DATA_DURATION);
}
-
+
+ @PowerNukkitOnly
public void setDuration(int duration) {
setDuration(duration, true);
}
-
+
+ @PowerNukkitOnly
public void setDuration(int duration, boolean send) {
this.setDataProperty(new IntEntityData(DATA_DURATION, duration), send);
}
-
+
+ @PowerNukkitOnly
public float getRadius() {
return this.getDataPropertyFloat(DATA_AREA_EFFECT_CLOUD_RADIUS);
}
-
+
+ @PowerNukkitOnly
public void setRadius(float radius) {
setRadius(radius, true);
}
-
+
+ @PowerNukkitOnly
public void setRadius(float radius, boolean send) {
this.setDataProperty(new FloatEntityData(DATA_AREA_EFFECT_CLOUD_RADIUS, radius), send);
}
-
+
+ @PowerNukkitOnly
public int getParticleId() {
return this.getDataPropertyInt(DATA_AREA_EFFECT_CLOUD_PARTICLE_ID);
}
-
+
+ @PowerNukkitOnly
public void setParticleId(int particleId) {
setParticleId(particleId, true);
}
-
+
+ @PowerNukkitOnly
public void setParticleId(int particleId, boolean send) {
this.setDataProperty(new IntEntityData(DATA_AREA_EFFECT_CLOUD_PARTICLE_ID, particleId), send);
}
@@ -407,4 +445,11 @@ protected float getDrag() {
public int getNetworkId() {
return NETWORK_ID;
}
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Area Effect Cloud";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java b/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java
index 8ab3acdd9ad..fbc56d80280 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityArmorStand.java
@@ -29,7 +29,6 @@
import cn.nukkit.network.protocol.SetEntityDataPacket;
import cn.nukkit.potion.Effect;
-import javax.annotation.Nonnull;
import java.util.Collection;
@PowerNukkitOnly
@@ -438,10 +437,11 @@ public boolean attack(EntityDamageEvent source) {
return true;
}
- @Nonnull
+ @Since("1.5.1.0-PN")
+ @PowerNukkitOnly
@Override
- public String getName() {
- return this.hasCustomName() ? this.getNameTag() : "Armor Stand";
+ public String getOriginalName() {
+ return "Armor Stand";
}
@Override
diff --git a/src/main/java/cn/nukkit/entity/item/EntityBoat.java b/src/main/java/cn/nukkit/entity/item/EntityBoat.java
index 9e9ad88b6a9..02afadd3207 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityBoat.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityBoat.java
@@ -47,11 +47,6 @@ public class EntityBoat extends EntityVehicle {
public static final int NETWORK_ID = 90;
- @Deprecated @DeprecationDetails(since = "1.4.0.0-PN", by = "Cloudburst Nukkit",
- reason = "Was removed because it is already defined in Entity.DATA_VARIANT",
- replaceWith = "Entity.DATA_VARIANT")
- @PowerNukkitOnly public static final int DATA_WOOD_ID = 20;
-
public static final Vector3f RIDER_PLAYER_OFFSET = new Vector3f(0, 1.02001f, 0);
public static final Vector3f RIDER_OFFSET = new Vector3f(0, -0.2f, 0);
@@ -68,9 +63,9 @@ public class EntityBoat extends EntityVehicle {
protected boolean sinking = true;
private int ticksInWater;
private final Set ignoreCollision = new HashSet<>(2);
-
+
@Deprecated
- @DeprecationDetails(since = "1.4.0.0-PN", by = "PowerNukkit",
+ @DeprecationDetails(since = "1.4.0.0-PN", by = "PowerNukkit",
reason = "Unreliable direct field access", replaceWith = "getVariant(), setVariant(int)")
@Since("1.4.0.0-PN") public int woodID;
@@ -346,6 +341,7 @@ private boolean computeBuoyancy(double waterDiff) {
return hasUpdated;
}
+ @Override
public void updatePassengers() {
updatePassengers(false);
}
@@ -454,8 +450,8 @@ public boolean mountEntity(Entity entity, byte mode) {
entity.setDataProperty(new ByteEntityData(DATA_RIDER_ROTATION_LOCKED, 1));
entity.setDataProperty(new FloatEntityData(DATA_RIDER_MAX_ROTATION, 90));
- entity.setDataProperty(new FloatEntityData(DATA_RIDER_ROTATION_OFFSET, -90));
entity.setDataProperty(new FloatEntityData(DATA_RIDER_MIN_ROTATION, this.passengers.indexOf(entity) == 1 ? -90 : 1));
+ entity.setDataProperty(new FloatEntityData(DATA_RIDER_ROTATION_OFFSET, -90));
entity.setRotation(yaw, entity.pitch);
entity.updateMovement();
}
@@ -581,4 +577,16 @@ public void setVariant(int variant) {
this.woodID = variant;
this.dataProperties.putInt(DATA_VARIANT, variant);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Boat";
+ }
+
+ public void onInput(double x, double y, double z, double yaw) {
+ this.setPositionAndRotation(this.temporalVector.setComponents(x, y - this.getBaseOffset(), z), yaw % 360, 0);
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java b/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java
index ab187e07155..65d7faaaa94 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityEndCrystal.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.item;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityExplosive;
import cn.nukkit.event.entity.EntityDamageEvent;
@@ -107,4 +109,12 @@ public boolean showBase() {
public void setShowBase(boolean value) {
this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHOWBASE, value);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Ender Crystal";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java b/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java
index d732c8d797d..88273cfe9ff 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityExpBottle.java
@@ -1,6 +1,7 @@
package cn.nukkit.entity.item;
-import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.projectile.EntityProjectile;
import cn.nukkit.level.Sound;
@@ -98,9 +99,17 @@ public void dropXp() {
this.getLevel().dropExpOrb(this, ThreadLocalRandom.current().nextInt(3, 12));
}
- @PowerNukkitDifference(info = "Using new method to play sounds", since = "1.4.0.0-PN")
+ @PowerNukkitOnly
@Override
protected void addHitEffect() {
this.getLevel().addSound(this, Sound.RANDOM_GLASS);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Bottle o' Enchanting";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java b/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java
index 52522f83a99..34645527973 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityFallingBlock.java
@@ -1,11 +1,16 @@
package cn.nukkit.entity.item;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockLava;
+import cn.nukkit.block.BlockID;
import cn.nukkit.block.BlockLiquid;
import cn.nukkit.entity.Entity;
+import cn.nukkit.entity.EntityLiving;
import cn.nukkit.entity.data.IntEntityData;
import cn.nukkit.event.entity.EntityBlockChangeEvent;
+import cn.nukkit.event.entity.EntityDamageByBlockEvent;
import cn.nukkit.event.entity.EntityDamageEvent;
import cn.nukkit.event.entity.EntityDamageEvent.DamageCause;
import cn.nukkit.item.Item;
@@ -56,12 +61,12 @@ protected float getBaseOffset() {
@Override
public boolean canCollide() {
- return false;
+ return blockId == BlockID.ANVIL;
}
protected int blockId;
protected int damage;
- protected boolean breakOnLava;
+ protected @PowerNukkitOnly boolean breakOnLava;
public EntityFallingBlock(FullChunk chunk, CompoundTag nbt) {
super(chunk, nbt);
@@ -97,8 +102,9 @@ protected void initEntity() {
setDataProperty(new IntEntityData(DATA_VARIANT, GlobalBlockPalette.getOrCreateRuntimeId(this.getBlock(), this.getDamage())));
}
+ @Override
public boolean canCollideWith(Entity entity) {
- return false;
+ return blockId == BlockID.ANVIL;
}
@Override
@@ -189,6 +195,13 @@ public boolean onUpdate(int currentTick) {
if (event.getTo().getId() == Item.ANVIL) {
getLevel().addLevelEvent(block, LevelEventPacket.EVENT_SOUND_ANVIL_FALL);
+
+ Entity[] e = level.getCollidingEntities(this.getBoundingBox(), this);
+ for (Entity entity : e) {
+ if (entity instanceof EntityLiving && fallDistance > 0) {
+ entity.attack(new EntityDamageByBlockEvent(event.getTo(), entity, DamageCause.FALLING_BLOCK, Math.min(40f, Math.max(0f, fallDistance * 2f))));
+ }
+ }
}
}
}
@@ -226,4 +239,19 @@ public void saveNBT() {
public boolean canBeMovedByCurrents() {
return false;
}
+
+ @Override
+ public void resetFallDistance() {
+ if (!this.closed) { // For falling anvil: do not reset fall distance before dealing damage to entities
+ this.highestPosition = this.y;
+ }
+ }
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Falling Block";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityFirework.java b/src/main/java/cn/nukkit/entity/item/EntityFirework.java
index 8390b493a25..a5505ce87c3 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityFirework.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityFirework.java
@@ -2,6 +2,8 @@
import cn.nukkit.Server;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.data.ByteEntityData;
@@ -183,4 +185,12 @@ public float getWidth() {
public float getHeight() {
return 0.25f;
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Firework Rocket";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java b/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java
index 4c1b5b7c050..dca7f1b9c65 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityFishingHook.java
@@ -3,6 +3,8 @@
import cn.nukkit.Player;
import cn.nukkit.Server;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.data.LongEntityData;
@@ -14,6 +16,7 @@
import cn.nukkit.event.entity.ProjectileHitEvent;
import cn.nukkit.event.player.PlayerFishEvent;
import cn.nukkit.item.Item;
+import cn.nukkit.item.enchantment.Enchantment;
import cn.nukkit.item.randomitem.Fishing;
import cn.nukkit.level.MovingObjectPosition;
import cn.nukkit.level.format.FullChunk;
@@ -24,9 +27,10 @@
import cn.nukkit.nbt.NBTIO;
import cn.nukkit.nbt.tag.CompoundTag;
import cn.nukkit.network.protocol.AddEntityPacket;
+import cn.nukkit.network.protocol.DataPacket;
import cn.nukkit.network.protocol.EntityEventPacket;
-import java.util.Random;
+import java.util.Collection;
import java.util.concurrent.ThreadLocalRandom;
@@ -37,15 +41,14 @@ public class EntityFishingHook extends EntityProjectile {
public static final int NETWORK_ID = 77;
- public static final int WAIT_CHANCE = 120;
- public static final int CHANCE = 40;
-
- public boolean chance = false;
- public int waitChance = WAIT_CHANCE * 2;
+ public int waitChance = 120;
+ public int waitTimer = 240;
public boolean attracted = false;
public int attractTimer = 0;
public boolean caught = false;
- public int coughtTimer = 0;
+ public int caughtTimer = 0;
+ @SuppressWarnings("java:S1845")
+ public boolean canCollide = true;
public Vector3 fish = null;
@@ -57,14 +60,9 @@ public EntityFishingHook(FullChunk chunk, CompoundTag nbt) {
public EntityFishingHook(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) {
super(chunk, nbt, shootingEntity);
- }
-
- @Override
- protected void initEntity() {
- super.initEntity();
// https://github.com/PowerNukkit/PowerNukkit/issues/267
- if (age > 0) {
- close();
+ if (this.age > 0) {
+ this.close();
}
}
@@ -98,6 +96,11 @@ public float getDrag() {
return 0.04f;
}
+ @Override
+ public boolean canCollide() {
+ return this.canCollide;
+ }
+
@Override
public boolean onUpdate(int currentTick) {
boolean hasUpdate = false;
@@ -118,7 +121,8 @@ public boolean onUpdate(int currentTick) {
return false;
}
- if (this.isInsideOfWater()) {
+ boolean inWater = this.isInsideOfWater();
+ if (inWater) {
this.motionX = 0;
this.motionY -= getGravity() * -0.04;
this.motionZ = 0;
@@ -131,37 +135,41 @@ public boolean onUpdate(int currentTick) {
hasUpdate = true;
}
- Random random = new Random();
-
- if (this.isInsideOfWater()) {
+ if (inWater) {
+ if (this.waitTimer == 240) {
+ this.waitTimer = this.waitChance << 1;
+ } else if (this.waitTimer == 360) {
+ this.waitTimer = this.waitChance * 3;
+ }
if (!this.attracted) {
- if (this.waitChance > 0) {
- --this.waitChance;
+ if (this.waitTimer > 0) {
+ --this.waitTimer;
}
- if (this.waitChance == 0) {
+ if (this.waitTimer == 0) {
+ ThreadLocalRandom random = ThreadLocalRandom.current();
if (random.nextInt(100) < 90) {
this.attractTimer = (random.nextInt(40) + 20);
this.spawnFish();
this.caught = false;
this.attracted = true;
} else {
- this.waitChance = WAIT_CHANCE;
+ this.waitTimer = this.waitChance;
}
}
} else if (!this.caught) {
if (this.attractFish()) {
- this.coughtTimer = (random.nextInt(20) + 30);
+ this.caughtTimer = (ThreadLocalRandom.current().nextInt(20) + 30);
this.fishBites();
this.caught = true;
}
} else {
- if (this.coughtTimer > 0) {
- --this.coughtTimer;
+ if (this.caughtTimer > 0) {
+ --this.caughtTimer;
}
- if (this.coughtTimer == 0) {
+ if (this.caughtTimer == 0) {
this.attracted = false;
this.caught = false;
- this.waitChance = WAIT_CHANCE * 3;
+ this.waitTimer = this.waitChance * 3;
}
}
}
@@ -180,22 +188,24 @@ public int getWaterHeight() {
}
public void fishBites() {
+ Collection viewers = this.getViewers().values();
+
EntityEventPacket pk = new EntityEventPacket();
pk.eid = this.getId();
pk.event = EntityEventPacket.FISH_HOOK_HOOK;
- Server.broadcastPacket(this.getViewers().values(), pk);
+ Server.broadcastPacket(viewers, pk);
EntityEventPacket bubblePk = new EntityEventPacket();
bubblePk.eid = this.getId();
bubblePk.event = EntityEventPacket.FISH_HOOK_BUBBLE;
- Server.broadcastPacket(this.getViewers().values(), bubblePk);
+ Server.broadcastPacket(viewers, bubblePk);
EntityEventPacket teasePk = new EntityEventPacket();
teasePk.eid = this.getId();
teasePk.event = EntityEventPacket.FISH_HOOK_TEASE;
- Server.broadcastPacket(this.getViewers().values(), teasePk);
+ Server.broadcastPacket(viewers, teasePk);
- Random random = new Random();
+ ThreadLocalRandom random = ThreadLocalRandom.current();
for (int i = 0; i < 5; i++) {
this.level.addParticle(new BubbleParticle(this.setComponents(
this.x + random.nextDouble() * 0.5 - 0.25,
@@ -206,7 +216,7 @@ public void fishBites() {
}
public void spawnFish() {
- Random random = new Random();
+ ThreadLocalRandom random = ThreadLocalRandom.current();
this.fish = new Vector3(
this.x + (random.nextDouble() * 1.2 + 1) * (random.nextBoolean() ? -1 : 1),
this.getWaterHeight(),
@@ -221,14 +231,11 @@ public boolean attractFish() {
this.fish.y,
this.fish.z + (this.z - this.fish.z) * multiply
);
- if (new Random().nextInt(100) < 85) {
+ if (ThreadLocalRandom.current().nextInt(100) < 85) {
this.level.addParticle(new WaterParticle(this.fish));
}
double dist = Math.abs(Math.sqrt(this.x * this.x + this.z * this.z) - Math.sqrt(this.fish.x * this.fish.x + this.fish.z * this.fish.z));
- if (dist < 0.15) {
- return true;
- }
- return false;
+ return dist < 0.15;
}
@PowerNukkitDifference(since = "1.4.0.0-PN", info = "May create custom EntityItem")
@@ -247,8 +254,8 @@ public void reelLine() {
EntityItem itemEntity = (EntityItem) Entity.createEntity(EntityItem.NETWORK_ID,
this.level.getChunk((int) this.x >> 4, (int) this.z >> 4, true),
Entity.getDefaultNBT(
- new Vector3(this.x, this.getWaterHeight(), this.z),
- event.getMotion(), ThreadLocalRandom.current().nextFloat() * 360,
+ new Vector3(this.x, this.getWaterHeight(), this.z),
+ event.getMotion(), ThreadLocalRandom.current().nextFloat() * 360,
0
).putCompound("Item", NBTIO.putItemHelper(event.getLoot()))
.putShort("Health", 5)
@@ -265,7 +272,7 @@ public void reelLine() {
}
@Override
- public void spawnTo(Player player) {
+ protected DataPacket createAddEntityPacket() {
AddEntityPacket pk = new AddEntityPacket();
pk.entityRuntimeId = this.getId();
pk.entityUniqueId = this.getId();
@@ -284,13 +291,7 @@ public void spawnTo(Player player) {
ownerId = this.shootingEntity.getId();
}
pk.metadata = this.dataProperties.putLong(DATA_OWNER_EID, ownerId);
- player.dataPacket(pk);
- super.spawnTo(player);
- }
-
- @Override
- public boolean canCollide() {
- return getDataPropertyLong(DATA_TARGET_EID) == 0L;
+ return pk;
}
@Override
@@ -306,7 +307,30 @@ public void onCollideWithEntity(Entity entity) {
}
if (entity.attack(ev)) {
- setDataProperty(new LongEntityData(DATA_TARGET_EID, entity.getId()));
+ this.setTarget(entity.getId());
+ }
+ }
+
+ @Since("1.6.0.0-PN")
+ public void checkLure() {
+ if (rod != null) {
+ Enchantment ench = rod.getEnchantment(Enchantment.ID_LURE);
+ if (ench != null) {
+ this.waitChance = 120 - (25 * ench.getLevel());
+ }
}
}
+
+ @Since("1.6.0.0-PN")
+ public void setTarget(long eid) {
+ this.setDataProperty(new LongEntityData(DATA_TARGET_EID, eid));
+ this.canCollide = eid == 0;
+ }
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Fishing Hook";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityItem.java b/src/main/java/cn/nukkit/entity/item/EntityItem.java
index b82c62d98a7..cb52ec5eb1b 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityItem.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityItem.java
@@ -2,6 +2,8 @@
import cn.nukkit.Server;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.BlockID;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.entity.EntityDamageEvent;
@@ -20,9 +22,8 @@
* @author MagicDroidX
*/
public class EntityItem extends Entity {
- public static final int NETWORK_ID = 64;
- public static final int DATA_SOURCE_ID = 17;
+ public static final int NETWORK_ID = 64;
public EntityItem(FullChunk chunk, CompoundTag nbt) {
super(chunk, nbt);
@@ -288,9 +289,22 @@ public void saveNBT() {
}
}
+ @Since("1.5.1.0-PN")
+ @PowerNukkitOnly
+ @Override
+ public String getOriginalName() {
+ return "Item";
+ }
+
@Override
public String getName() {
- return this.hasCustomName() ? this.getNameTag() : (this.item.hasCustomName() ? this.item.getCustomName() : this.item.getName());
+ if (this.hasCustomName()) {
+ return getNameTag();
+ }
+ if (item == null) {
+ return getOriginalName();
+ }
+ return item.count + "x " + (this.item.hasCustomName() ? this.item.getCustomName() : this.item.getName());
}
public Item getItem() {
diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java
index e1e7e4d999b..71bffa1142c 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityMinecartChest.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.item;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.entity.Entity;
import cn.nukkit.inventory.InventoryHolder;
@@ -28,8 +30,10 @@ public EntityMinecartChest(FullChunk chunk, CompoundTag nbt) {
setDisplayBlock(Block.get(Block.CHEST), false);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return getType().getName();
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java
index 3b1b5c46556..57c012fb4fb 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityMinecartEmpty.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.item;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityLiving;
import cn.nukkit.entity.passive.EntityWaterAnimal;
@@ -25,8 +27,10 @@ public EntityMinecartEmpty(FullChunk chunk, CompoundTag nbt) {
super(chunk, nbt);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return getType().getName();
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java
index 6a76cd09aee..b2ab7955545 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityMinecartHopper.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.item;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.entity.Entity;
import cn.nukkit.inventory.InventoryHolder;
@@ -24,8 +26,10 @@ public EntityMinecartHopper(FullChunk chunk, CompoundTag nbt) {
setDisplayBlock(Block.get(Block.HOPPER_BLOCK), false);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return getType().getName();
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java b/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java
index 04aa51112d0..81fc4cb2f90 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityMinecartTNT.java
@@ -2,6 +2,8 @@
import cn.nukkit.Player;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.entity.Entity;
@@ -117,8 +119,10 @@ public void dropItem() {
level.dropItem(this, new ItemMinecartTNT());
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return getType().getName();
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityPainting.java b/src/main/java/cn/nukkit/entity/item/EntityPainting.java
index fd2fb9004ad..dbe31b23522 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityPainting.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityPainting.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.item;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.blockentity.BlockEntityPistonArm;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityHanging;
@@ -133,6 +135,7 @@ public void saveNBT() {
this.namedTag.putString("Motive", this.motive.title);
}
+ @PowerNukkitOnly
@Override
public void onPushByPiston(BlockEntityPistonArm piston) {
if (this.level.getGameRules().getBoolean(GameRule.DO_ENTITY_DROPS)) {
@@ -196,4 +199,12 @@ public enum Motive {
this.height = height;
}
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Painting";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityPotion.java b/src/main/java/cn/nukkit/entity/item/EntityPotion.java
index 99e5b513698..543379f6826 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityPotion.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityPotion.java
@@ -1,6 +1,7 @@
package cn.nukkit.entity.item;
-import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.projectile.EntityProjectile;
import cn.nukkit.event.potion.PotionCollideEvent;
@@ -89,7 +90,7 @@ public void onCollideWithEntity(Entity entity) {
this.splash(entity);
}
- @PowerNukkitDifference(info = "Using new method to play sounds", since = "1.4.0.0-PN")
+ @PowerNukkitOnly
protected void splash(Entity collidedWith) {
Potion potion = Potion.getPotion(this.potionId);
PotionCollideEvent event = new PotionCollideEvent(potion, this);
@@ -162,4 +163,12 @@ public boolean onUpdate(int currentTick) {
this.timing.stopTiming();
return hasUpdate;
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Potion";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java b/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java
index 12ac555c364..8521c7e50f6 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityPotionLingering.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.item;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -9,14 +11,18 @@
import cn.nukkit.potion.Effect;
import cn.nukkit.potion.Potion;
+@PowerNukkitOnly
public class EntityPotionLingering extends EntityPotion {
-
+
+ @PowerNukkitOnly
public static final int NETWORK_ID = 101;
-
+
+ @PowerNukkitOnly
public EntityPotionLingering(FullChunk chunk, CompoundTag nbt) {
super(chunk, nbt);
}
-
+
+ @PowerNukkitOnly
public EntityPotionLingering(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) {
super(chunk, nbt, shootingEntity);
}
@@ -27,6 +33,7 @@ protected void initEntity() {
setDataFlag(DATA_FLAGS, DATA_FLAG_LINGER, true);
}
+ @PowerNukkitOnly
@Override
protected void splash(Entity collidedWith) {
super.splash(collidedWith);
@@ -53,4 +60,12 @@ protected void splash(Entity collidedWith) {
entity.spawnToAll();
}
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Lingering Potion";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java b/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java
index 1ad7df10780..15a615671ab 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityPrimedTNT.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.item;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityExplosive;
import cn.nukkit.entity.data.IntEntityData;
@@ -78,6 +80,7 @@ public boolean attack(EntityDamageEvent source) {
return source.getCause() == DamageCause.VOID && super.attack(source);
}
+ @Override
@PowerNukkitDifference(info = "Using new method to play sounds", since = "1.4.0.0-PN")
protected void initEntity() {
super.initEntity();
@@ -95,15 +98,18 @@ protected void initEntity() {
}
+ @Override
public boolean canCollideWith(Entity entity) {
return false;
}
+ @Override
public void saveNBT() {
super.saveNBT();
namedTag.putByte("Fuse", fuse);
}
+ @Override
public boolean onUpdate(int currentTick) {
if (closed) {
@@ -161,6 +167,7 @@ public boolean onUpdate(int currentTick) {
return hasUpdate || fuse >= 0 || Math.abs(motionX) > 0.00001 || Math.abs(motionY) > 0.00001 || Math.abs(motionZ) > 0.00001;
}
+ @Override
public void explode() {
EntityExplosionPrimeEvent event = new EntityExplosionPrimeEvent(this, 4);
server.getPluginManager().callEvent(event);
@@ -178,4 +185,12 @@ public void explode() {
public Entity getSource() {
return source;
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Block of TNT";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java b/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java
index 94bbb987fbd..fc8b5ba4e05 100644
--- a/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java
+++ b/src/main/java/cn/nukkit/entity/item/EntityXPOrb.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.item;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.entity.EntityDamageEvent;
import cn.nukkit.event.entity.EntityDamageEvent.DamageCause;
@@ -264,4 +266,12 @@ public static List splitIntoOrbSizes(int amount) {
return result;
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Experience Orb";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java b/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java
index 0b258344e6e..065e6e4af47 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityBlaze.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,11 +38,14 @@ public float getHeight() {
return 1.8f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Blaze";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java b/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java
index a9e77083bb4..2affa521617 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityCaveSpider.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntityArthropod;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,11 +39,14 @@ public float getHeight() {
return 0.5f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
- return "CaveSpider";
+ public String getOriginalName() {
+ return "Cave Spider";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java b/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java
index 52bf242f46c..dc1ad16e59c 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityCreeper.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.data.ByteEntityData;
import cn.nukkit.entity.weather.EntityLightningStrike;
@@ -67,6 +69,7 @@ public void setPowered(boolean powered) {
}
}
+ @Override
public void onStruckByLightning(Entity entity) {
this.setPowered(true);
}
@@ -81,8 +84,10 @@ protected void initEntity() {
this.setMaxHealth(20);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Creeper";
}
@@ -94,6 +99,7 @@ public Item[] getDrops() {
return Item.EMPTY_ARRAY;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java b/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java
index 50ea237121a..b9b093cf33f 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityDrowned.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -38,8 +40,10 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Drowned";
}
@@ -48,11 +52,13 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.ROTTEN_FLESH)};
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java b/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java
index a34343ecf58..6dab4e23621 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityElderGuardian.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,11 +39,14 @@ public float getHeight() {
return 1.99f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Elder Guardian";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java b/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java
index 9bcd0b49e76..cf02386d963 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityEnderDragon.java
@@ -2,6 +2,7 @@
import cn.nukkit.Player;
import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -52,8 +53,10 @@ public boolean applyNameTag(Item item) {
return false;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
- return "EnderDragon";
+ public String getOriginalName() {
+ return "Ender Dragon";
}
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java b/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java
index c9a449d7266..27b8a9b3b85 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityEnderman.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,11 +38,14 @@ public float getHeight() {
return 2.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Enderman";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return this.getDataPropertyBoolean(DATA_FLAG_ANGRY);
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java b/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java
index 8b57d709ce1..a4eca36fde6 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityEndermite.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntityArthropod;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,11 +39,14 @@ public float getHeight() {
return 0.3f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Endermite";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java b/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java
index 36785c37c1c..d4f0c2055db 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityEvoker.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,11 +38,14 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Evoker";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityGhast.java b/src/main/java/cn/nukkit/entity/mob/EntityGhast.java
index e2c159c8f2c..b7cd44009d5 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityGhast.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityGhast.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.mob;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -35,8 +37,10 @@ public float getHeight() {
return 4;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Ghast";
}
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java b/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java
index e00caa67e67..3ce38363a5b 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityGuardian.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -26,8 +28,10 @@ public void initEntity() {
this.setMaxHealth(30);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Guardian";
}
@@ -41,6 +45,7 @@ public float getHeight() {
return 0.85f;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java b/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java
index dc4eb16ab36..3213b93f2b3 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityHoglin.java
@@ -47,11 +47,14 @@ public float getHeight() {
return 0.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Hoglin";
}
+ @PowerNukkitOnly
@Override
public boolean isBaby() {
return this.getDataFlag(DATA_FLAGS, DATA_FLAG_BABY);
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityHusk.java b/src/main/java/cn/nukkit/entity/mob/EntityHusk.java
index 3c27c89302f..6a0a4238ae4 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityHusk.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityHusk.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,16 +39,20 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Husk";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityIronGolem.java b/src/main/java/cn/nukkit/entity/mob/EntityIronGolem.java
index 92f23d7a7d3..a18081cb63c 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityIronGolem.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityIronGolem.java
@@ -26,7 +26,6 @@
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
-import javax.annotation.Nonnull;
import java.util.concurrent.ThreadLocalRandom;
/**
@@ -51,9 +50,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- @Nonnull
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Iron Golem";
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java b/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java
index 14e85f22c72..522a383117d 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityMagmaCube.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.mob;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -35,8 +37,10 @@ public float getHeight() {
return 2.04f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Magma Cube";
}
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java b/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java
index 820e46f435e..71b7be08c6e 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityPhantom.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -38,8 +40,10 @@ public float getHeight() {
return 0.5f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Phantom";
}
@@ -48,11 +52,13 @@ public Item[] getDrops() {
return new Item[]{Item.get(470)};
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java b/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java
index 6e2f1e81c3e..0e554406679 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityPiglin.java
@@ -1,6 +1,7 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityAgeable;
@@ -40,16 +41,20 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Piglin";
}
+ @PowerNukkitOnly
@Override
public boolean isBaby() {
return this.getDataFlag(DATA_FLAGS, Entity.DATA_FLAG_BABY);
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return !this.isBaby()/*TODO: Should this check player's golden armor?*/;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java b/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java
index 0cfa8101738..5e8ff2d7561 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityPiglinBrute.java
@@ -45,13 +45,16 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Piglin Brute";
}
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityPillager.java b/src/main/java/cn/nukkit/entity/mob/EntityPillager.java
index c05402f8203..6c169d2424e 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityPillager.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityPillager.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -33,11 +35,14 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Pillager";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityRavager.java b/src/main/java/cn/nukkit/entity/mob/EntityRavager.java
index 39c14973e5a..848d4861568 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityRavager.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityRavager.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -33,11 +35,14 @@ public float getWidth() {
return 1.2f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Ravager";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityShulker.java b/src/main/java/cn/nukkit/entity/mob/EntityShulker.java
index 02e176c1d38..e1ae3596206 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityShulker.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityShulker.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.mob;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -35,8 +37,10 @@ public float getHeight() {
return 1f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Shulker";
}
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java b/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java
index 8713c5949a1..2817468138b 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntitySilverfish.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntityArthropod;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -21,8 +23,10 @@ public EntitySilverfish(FullChunk chunk, CompoundTag nbt) {
super(chunk, nbt);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Silverfish";
}
@@ -42,6 +46,7 @@ public void initEntity() {
this.setMaxHealth(8);
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java b/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java
index 32aaeb241a7..e14d6765203 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntitySkeleton.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -38,8 +40,10 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Skeleton";
}
@@ -48,11 +52,13 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.BONE, Item.ARROW)};
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySlime.java b/src/main/java/cn/nukkit/entity/mob/EntitySlime.java
index 34ba44764b2..9539c34cc7f 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntitySlime.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntitySlime.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.mob;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,8 +38,10 @@ public float getHeight() {
return 2.04f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Slime";
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySnowGolem.java b/src/main/java/cn/nukkit/entity/mob/EntitySnowGolem.java
index 2512d9f7c20..33e921e91b2 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntitySnowGolem.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntitySnowGolem.java
@@ -1,5 +1,6 @@
package cn.nukkit.entity.mob;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -19,8 +20,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Snow Golem";
}
diff --git a/src/main/java/cn/nukkit/entity/mob/EntitySpider.java b/src/main/java/cn/nukkit/entity/mob/EntitySpider.java
index 537f8d02239..b6f50dd80d7 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntitySpider.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntitySpider.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntityArthropod;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -38,8 +40,10 @@ public float getHeight() {
return 0.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Spider";
}
@@ -48,6 +52,7 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.STRING, Item.SPIDER_EYE)};
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityStray.java b/src/main/java/cn/nukkit/entity/mob/EntityStray.java
index ff7aecb53f8..dd73a7233cf 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityStray.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityStray.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -38,8 +40,10 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Stray";
}
@@ -48,11 +52,13 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.BONE, Item.ARROW)};
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityVex.java b/src/main/java/cn/nukkit/entity/mob/EntityVex.java
index 6d479124e58..0ba5ee8690a 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityVex.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityVex.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,11 +38,14 @@ public float getHeight() {
return 0.8f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Vex";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java b/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java
index 03d9ef0b7a1..3936b523919 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityVindicator.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,8 +39,10 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Vindicator";
}
@@ -47,6 +51,7 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.IRON_AXE)};
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWitch.java b/src/main/java/cn/nukkit/entity/mob/EntityWitch.java
index de7766d4a9c..62878d383a7 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityWitch.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityWitch.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,11 +38,14 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Witch";
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWither.java b/src/main/java/cn/nukkit/entity/mob/EntityWither.java
index 398db9985dd..5a02b1fb7e9 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityWither.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityWither.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,16 +39,20 @@ protected void initEntity() {
this.setMaxHealth(600);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Wither";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java b/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java
index d0f64679493..c829a39f9a0 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityWitherSkeleton.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,16 +38,20 @@ public float getHeight() {
return 2.01f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
- return "WitherSkeleton";
+ public String getOriginalName() {
+ return "Wither Skeleton";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java b/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java
index 0541572d860..2bd7f4de2dc 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityZoglin.java
@@ -48,21 +48,26 @@ public float getHeight() {
return 0.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Zoglin";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isBaby() {
return this.getDataFlag(DATA_FLAGS, DATA_FLAG_BABY);
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombie.java b/src/main/java/cn/nukkit/entity/mob/EntityZombie.java
index bfc7e4a8d6b..a250ca3f01f 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityZombie.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityZombie.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -38,16 +40,20 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Zombie";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java b/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java
index 0a34f6e67e9..f1e23b9e68b 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityZombiePigman.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,16 +39,20 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
- return "ZombiePigman";
+ public String getOriginalName() {
+ return "Zombified Piglin";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return this.getDataPropertyBoolean(DATA_FLAG_ANGRY);
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java b/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java
index 3382217fe71..dab9f05fb56 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityZombieVillager.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.mob;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -34,16 +36,20 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Zombie Villager";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+ @PowerNukkitOnly
@Override
public boolean isPreventingSleep(Player player) {
return true;
diff --git a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV1.java b/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV1.java
index bf06c34da1b..5b41fbb01ad 100644
--- a/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV1.java
+++ b/src/main/java/cn/nukkit/entity/mob/EntityZombieVillagerV1.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.mob;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -36,11 +38,14 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Zombie Villager";
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityBat.java b/src/main/java/cn/nukkit/entity/passive/EntityBat.java
index de801a1efe8..2618bc8bf24 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityBat.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityBat.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -34,4 +36,12 @@ public void initEntity() {
super.initEntity();
this.setMaxHealth(6);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Bat";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityBee.java b/src/main/java/cn/nukkit/entity/passive/EntityBee.java
index bd05e784183..9a08794ef3e 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityBee.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityBee.java
@@ -1,6 +1,7 @@
package cn.nukkit.entity.passive;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockBeehive;
@@ -49,21 +50,25 @@ public float getHeight() {
return 0.5f;
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public boolean getHasNectar() {
return false;
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public void setHasNectar(boolean hasNectar) {
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public boolean isAngry() {
return false;
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public void setAngry(boolean angry) {
@@ -106,18 +111,29 @@ protected void initEntity() {
this.setMaxHealth(10);
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public void nectarDelivered(BlockEntityBeehive blockEntityBeehive) {
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public void leftBeehive(BlockEntityBeehive blockEntityBeehive) {
}
+ @PowerNukkitOnly
@Since("1.1.1.0-PN")
public void setAngry(Player player) {
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Bee";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityCat.java b/src/main/java/cn/nukkit/entity/passive/EntityCat.java
index 6381ea60561..aa9eadd0295 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityCat.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityCat.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,4 +39,12 @@ public void initEntity() {
super.initEntity();
this.setMaxHealth(10);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Cat";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityChicken.java b/src/main/java/cn/nukkit/entity/passive/EntityChicken.java
index 3dd62f09871..44b7ff949dc 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityChicken.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityChicken.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -31,8 +33,10 @@ public float getHeight() {
return 0.8f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Chicken";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityCod.java b/src/main/java/cn/nukkit/entity/passive/EntityCod.java
index e4a09151d35..a73ad5c72ff 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityCod.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityCod.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -19,7 +21,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Cod";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityCow.java b/src/main/java/cn/nukkit/entity/passive/EntityCow.java
index c1a77a9c8d4..9a4d8c1ac7f 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityCow.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityCow.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -31,8 +33,10 @@ public float getHeight() {
return 1.3f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Cow";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java b/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java
index 7a9b1269758..54f41179c9b 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityDolphin.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -20,7 +22,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Dolphin";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java b/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java
index b27b0c7f68c..612391f7cf9 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityDonkey.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -46,4 +48,12 @@ public void initEntity() {
public Item[] getDrops() {
return new Item[]{Item.get(Item.LEATHER)};
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Donkey";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityFox.java b/src/main/java/cn/nukkit/entity/passive/EntityFox.java
index 872a1c4b5b9..2956d891b89 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityFox.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityFox.java
@@ -1,5 +1,6 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -40,8 +41,10 @@ protected void initEntity() {
this.setMaxHealth(20);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Fox";
}
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityHorse.java b/src/main/java/cn/nukkit/entity/passive/EntityHorse.java
index af3461880fc..3279cc6f8e3 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityHorse.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityHorse.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -46,4 +48,12 @@ public void initEntity() {
public Item[] getDrops() {
return new Item[]{Item.get(Item.LEATHER)};
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Horse";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityLlama.java b/src/main/java/cn/nukkit/entity/passive/EntityLlama.java
index 6536a79ee0c..71ea229972d 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityLlama.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityLlama.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -48,4 +50,12 @@ public void initEntity() {
super.initEntity();
this.setMaxHealth(15);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Llama";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java b/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java
index 4a4b982c401..ced896fefa7 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityMooshroom.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -31,8 +33,10 @@ public float getHeight() {
return 1.3f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Mooshroom";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityMule.java b/src/main/java/cn/nukkit/entity/passive/EntityMule.java
index ae138004025..dd1cca7cb55 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityMule.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityMule.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -46,4 +48,12 @@ public void initEntity() {
super.initEntity();
this.setMaxHealth(15);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Mule";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityNPCEntity.java b/src/main/java/cn/nukkit/entity/passive/EntityNPCEntity.java
index 55abc3d242c..5c5236c9641 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityNPCEntity.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityNPCEntity.java
@@ -49,8 +49,10 @@ public String getInteractButtonText() {
return "action.interact.edit";
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "NPC";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java b/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java
index 04977a6c425..8a01c864f0e 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityOcelot.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -31,8 +33,10 @@ public float getHeight() {
return 0.7f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Ocelot";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPanda.java b/src/main/java/cn/nukkit/entity/passive/EntityPanda.java
index fd34ddd055a..ecd747c3bb3 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityPanda.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityPanda.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -31,4 +33,12 @@ public void initEntity() {
super.initEntity();
this.setMaxHealth(20);
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Panda";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityParrot.java b/src/main/java/cn/nukkit/entity/passive/EntityParrot.java
index 955329a59b8..1bfd2a3d610 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityParrot.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityParrot.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -20,7 +22,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Parrot";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPig.java b/src/main/java/cn/nukkit/entity/passive/EntityPig.java
index 85b6da5b9df..11c6d01c9bb 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityPig.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityPig.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,8 +39,10 @@ public void initEntity() {
this.setMaxHealth(10);
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Pig";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java b/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java
index 21f29c0458d..fb91711f944 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityPolarBear.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -46,4 +48,12 @@ public void initEntity() {
public Item[] getDrops() {
return new Item[]{Item.get(Item.RAW_FISH), Item.get(Item.RAW_SALMON)};
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Polar Bear";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java b/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java
index 1a30aceec5e..e9423f6279a 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityPufferfish.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -19,7 +21,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Pufferfish";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java b/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java
index 394b34c6b18..210c0d40b9e 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityRabbit.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -31,8 +33,10 @@ public float getHeight() {
return 0.67f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Rabbit";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java b/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java
index d29dc648e21..8926d7a7fbd 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntitySalmon.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -19,7 +21,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Salmon";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySheep.java b/src/main/java/cn/nukkit/entity/passive/EntitySheep.java
index b0ff618e885..a9e79eaec3b 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntitySheep.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntitySheep.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.passive;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.data.ByteEntityData;
import cn.nukkit.event.entity.EntityDamageByEntityEvent;
import cn.nukkit.item.Item;
@@ -42,8 +44,10 @@ public float getHeight() {
return 1.3f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Sheep";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java b/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java
index 0b11656e64c..25f9c2d5476 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntitySkeletonHorse.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -42,8 +44,17 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.BONE)};
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Skeleton Horse";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntitySquid.java b/src/main/java/cn/nukkit/entity/passive/EntitySquid.java
index c1ce19d9bed..6dab217e4f1 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntitySquid.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntitySquid.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.item.MinecraftItemID;
import cn.nukkit.level.format.FullChunk;
@@ -41,4 +43,12 @@ public void initEntity() {
public Item[] getDrops() {
return new Item[]{MinecraftItemID.INK_SAC.get(1)};
}
+
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Squid";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityStrider.java b/src/main/java/cn/nukkit/entity/passive/EntityStrider.java
index 001da949c9b..88ce05a70a7 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityStrider.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityStrider.java
@@ -1,5 +1,6 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -37,8 +38,10 @@ public float getHeight() {
return 1.7f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Strider";
}
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTameable.java b/src/main/java/cn/nukkit/entity/passive/EntityTameable.java
index 9499c2a220e..3d355d25426 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityTameable.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityTameable.java
@@ -74,11 +74,6 @@ public Player getOwner() {
return getServer().getPlayer(getOwnerName());
}
- @Override
- public String getName() {
- return getNameTag();
- }
-
public boolean isTamed() {
return (getDataPropertyByte(DATA_TAMED_FLAG) & 4) != 0;
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java b/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java
index 8c6aa42b97a..79aca0eb7e2 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityTropicalFish.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -19,7 +21,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Tropical Fish";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java b/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java
index 880a2eea793..23f9c862710 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityTurtle.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.math.Vector3;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -20,7 +22,10 @@ public int getNetworkId() {
return NETWORK_ID;
}
- public String getName() {
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
return "Turtle";
}
@@ -46,10 +51,12 @@ public void initEntity() {
this.setMaxHealth(30);
}
+ @PowerNukkitOnly
public void setBreedingAge(int ticks) {
}
+ @PowerNukkitOnly
public void setHomePos(Vector3 pos) {
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityVillager.java b/src/main/java/cn/nukkit/entity/passive/EntityVillager.java
index f07cae39843..8f074780f80 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityVillager.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityVillager.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntityAgeable;
import cn.nukkit.entity.EntityCreature;
import cn.nukkit.level.format.FullChunk;
@@ -34,8 +36,10 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Villager";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityVillagerV1.java b/src/main/java/cn/nukkit/entity/passive/EntityVillagerV1.java
index 33aca7df386..707d64a843c 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityVillagerV1.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityVillagerV1.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.EntityAgeable;
import cn.nukkit.entity.EntityCreature;
@@ -40,8 +42,10 @@ public float getHeight() {
return 1.9f;
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Villager";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java b/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java
index 9b00daf6db1..c4042c112d8 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityWanderingTrader.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntityCreature;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -21,9 +23,11 @@ public float getWidth() {
public float getHeight() {
return 1.9f;
}
-
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Wandering Trader";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityWolf.java b/src/main/java/cn/nukkit/entity/passive/EntityWolf.java
index 5c2c6fb6763..a5e88685290 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityWolf.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityWolf.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
import cn.nukkit.nbt.tag.CompoundTag;
@@ -24,9 +26,11 @@ public float getWidth() {
public float getHeight() {
return 0.8f;
}
-
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
+ public String getOriginalName() {
return "Wolf";
}
diff --git a/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java b/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java
index 40a0183a784..eb635579b74 100644
--- a/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java
+++ b/src/main/java/cn/nukkit/entity/passive/EntityZombieHorse.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.passive;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.EntitySmite;
import cn.nukkit.item.Item;
import cn.nukkit.level.format.FullChunk;
@@ -42,8 +44,16 @@ public Item[] getDrops() {
return new Item[]{Item.get(Item.ROTTEN_FLESH, 1, 1)};
}
+ @PowerNukkitOnly
@Override
public boolean isUndead() {
return true;
}
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Zombie Horse";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java b/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java
index 7f67bab01ad..f5688a31678 100644
--- a/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java
+++ b/src/main/java/cn/nukkit/entity/projectile/EntityArrow.java
@@ -15,13 +15,8 @@
* @author MagicDroidX (Nukkit Project)
*/
public class EntityArrow extends EntityProjectile {
- public static final int NETWORK_ID = 80;
-
- public static final int DATA_SOURCE_ID = 17;
- public static final int PICKUP_NONE = 0;
- public static final int PICKUP_ANY = 1;
- public static final int PICKUP_CREATIVE = 2;
+ public static final int NETWORK_ID = 80;
protected int pickupMode;
@@ -65,7 +60,7 @@ protected void updateMotion() {
}
float drag = 1 - this.getDrag() * 20;
-
+
motionY -= getGravity() * 2;
if (motionY < 0) {
motionY *= drag / 1.5;
@@ -84,13 +79,13 @@ public EntityArrow(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) {
public EntityArrow(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) {
super(chunk, nbt, shootingEntity);
- closeOnCollide = false;
this.setCritical(critical);
}
@Override
protected void initEntity() {
super.initEntity();
+ closeOnCollide = false;
this.damage = namedTag.contains("damage") ? namedTag.getDouble("damage") : 2;
this.pickupMode = namedTag.contains("pickup") ? namedTag.getByte("pickup") : PICKUP_ANY;
@@ -143,6 +138,12 @@ public boolean onUpdate(int currentTick) {
hasUpdate = true;
}
+ if (this.level.isRaining() && this.fireTicks > 0 && this.level.canBlockSeeSky(this)) {
+ extinguish();
+
+ hasUpdate = true;
+ }
+
this.timing.stopTiming();
return hasUpdate;
@@ -164,6 +165,7 @@ protected void afterCollisionWithEntity(Entity entity) {
}
}
+ @PowerNukkitOnly
@Override
protected void addHitEffect() {
this.level.addSound(this, Sound.RANDOM_BOWHIT);
@@ -172,7 +174,7 @@ protected void addHitEffect() {
packet.event = EntityEventPacket.ARROW_SHAKE;
packet.data = 7; // TODO Magic value. I have no idea why we have to set it to 7 here...
Server.broadcastPacket(this.hasSpawned.values(), packet);
-
+
onGround = true;
}
@@ -190,4 +192,11 @@ public int getPickupMode() {
public void setPickupMode(int pickupMode) {
this.pickupMode = pickupMode;
}
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Arrow";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java b/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java
index 2e33c328632..62c0280b2af 100644
--- a/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java
+++ b/src/main/java/cn/nukkit/entity/projectile/EntityEgg.java
@@ -1,5 +1,7 @@
package cn.nukkit.entity.projectile;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.item.ItemEgg;
import cn.nukkit.level.format.FullChunk;
@@ -12,6 +14,7 @@
* @author MagicDroidX (Nukkit Project)
*/
public class EntityEgg extends EntityProjectile {
+
public static final int NETWORK_ID = 82;
@Override
@@ -67,7 +70,8 @@ public boolean onUpdate(int currentTick) {
return hasUpdate;
}
-
+
+ @PowerNukkitOnly
@Override
protected void addHitEffect() {
int particles = ThreadLocalRandom.current().nextInt(10) + 5;
@@ -76,4 +80,11 @@ protected void addHitEffect() {
level.addParticle(new ItemBreakParticle(this, egg));
}
}
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Egg";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java b/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java
index 8d59b5c78f5..78f3b5d5d97 100644
--- a/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java
+++ b/src/main/java/cn/nukkit/entity/projectile/EntityEnderPearl.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.projectile;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.entity.EntityDamageByEntityEvent;
@@ -13,6 +15,7 @@
import cn.nukkit.network.protocol.LevelEventPacket;
public class EntityEnderPearl extends EntityProjectile {
+
public static final int NETWORK_ID = 87;
@Override
@@ -106,4 +109,11 @@ private void teleport() {
this.level.addLevelEvent(this, LevelEventPacket.EVENT_PARTICLE_ENDERMAN_TELEPORT);
this.level.addLevelEvent(this.shootingEntity.add(0.5, 0.5, 0.5), LevelEventPacket.EVENT_SOUND_PORTAL);
}
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Ender Pearl";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java b/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java
index 45d940e0535..bbad2aa473a 100644
--- a/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java
+++ b/src/main/java/cn/nukkit/entity/projectile/EntityProjectile.java
@@ -1,5 +1,6 @@
package cn.nukkit.entity.projectile;
+import cn.nukkit.api.DeprecationDetails;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.Player;
@@ -8,7 +9,6 @@
import cn.nukkit.entity.EntityLiving;
import cn.nukkit.entity.data.LongEntityData;
import cn.nukkit.entity.item.EntityEndCrystal;
-import cn.nukkit.event.block.BellRingEvent;
import cn.nukkit.event.entity.*;
import cn.nukkit.event.entity.EntityDamageEvent.DamageCause;
import cn.nukkit.level.MovingObjectPosition;
@@ -29,13 +29,19 @@
public abstract class EntityProjectile extends Entity {
public static final int DATA_SHOOTER_ID = 17;
+ @Since("1.6.0.0-PN") public static final int PICKUP_NONE = 0;
+ @Since("1.6.0.0-PN") public static final int PICKUP_ANY = 1;
+ @Since("1.6.0.0-PN") public static final int PICKUP_CREATIVE = 2;
+
+ public Entity shootingEntity;
+
+ /**
+ * It's inverted from {@link #getHasAge()} because of the poor architecture chosen by the original devs
+ * on the entity construction and initialization. It's impossible to set it to true before
+ * the initialization of the child classes.
+ */
+ private boolean noAge;
- public Entity shootingEntity = null;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
- public boolean hasAge = true;
-
protected double getDamage() {
return namedTag.contains("damage") ? namedTag.getDouble("damage") : getBaseDamage();
}
@@ -44,11 +50,13 @@ protected double getBaseDamage() {
return 0;
}
- public boolean hadCollision = false;
+ public boolean hadCollision;
- public boolean closeOnCollide = true;
+ public boolean closeOnCollide;
- protected double damage = 0;
+ @Deprecated
+ @DeprecationDetails(since = "1.6.0.0-PN", by = "PowerNukkit", reason = "Redundant and unused", replaceWith = "getDamage()")
+ protected double damage;
public EntityProjectile(FullChunk chunk, CompoundTag nbt) {
this(chunk, nbt, null);
@@ -61,6 +69,8 @@ public EntityProjectile(FullChunk chunk, CompoundTag nbt, Entity shootingEntity)
this.setDataProperty(new LongEntityData(DATA_SHOOTER_ID, shootingEntity.getId()));
}
}
+
+
@PowerNukkitOnly("Allows to modify the damage based on the entity being damaged")
@Since("1.4.0.0-PN")
@@ -72,6 +82,7 @@ public int getResultDamage() {
return NukkitMath.ceilDouble(Math.sqrt(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ) * getDamage());
}
+ @Override
public boolean attack(EntityDamageEvent source) {
return source.getCause() == DamageCause.VOID && super.attack(source);
}
@@ -98,7 +109,7 @@ public void onCollideWithEntity(Entity entity) {
if (this.fireTicks > 0) {
EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this, entity, 5);
- this.server.getPluginManager().callEvent(ev);
+ this.server.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
entity.setOnFire(event.getDuration());
}
@@ -109,20 +120,21 @@ public void onCollideWithEntity(Entity entity) {
this.close();
}
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
protected void afterCollisionWithEntity(Entity entity) {
-
+
}
@Override
protected void initEntity() {
+ this.closeOnCollide = true;
super.initEntity();
this.setMaxHealth(1);
this.setHealth(1);
- if (this.namedTag.contains("Age") && this.hasAge) {
+ if (this.namedTag.contains("Age") && !this.noAge) {
this.age = this.namedTag.getShort("Age");
}
}
@@ -135,7 +147,7 @@ public boolean canCollideWith(Entity entity) {
@Override
public void saveNBT() {
super.saveNBT();
- if (this.hasAge) {
+ if (!this.noAge) {
this.namedTag.putShort("Age", this.age);
}
}
@@ -147,7 +159,7 @@ protected void updateMotion() {
this.motionX *= 1 - this.getDrag();
this.motionZ *= 1 - this.getDrag();
}
-
+
@Override
public boolean onUpdate(int currentTick) {
if (this.closed) {
@@ -245,12 +257,14 @@ public boolean onUpdate(int currentTick) {
return hasUpdate;
}
+ @PowerNukkitOnly
public void updateRotation() {
double f = Math.sqrt((this.motionX * this.motionX) + (this.motionZ * this.motionZ));
this.yaw = Math.atan2(this.motionX, this.motionZ) * 180 / Math.PI;
this.pitch = Math.atan2(this.motionY, f) * 180 / Math.PI;
}
+ @PowerNukkitOnly
public void inaccurate(float modifier) {
Random rand = ThreadLocalRandom.current();
@@ -277,16 +291,34 @@ protected boolean onCollideWithBlock(Position position, Vector3 motion, Block co
protected void addHitEffect() {
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
+ @Deprecated
+ @DeprecationDetails(
+ by = "PowerNukkit", since = "1.6.0.0-PN", reason = "Bad method name", replaceWith = "getHasAge",
+ toBeRemovedAt = "1.7.0.0-PN")
public boolean hasAge() {
- return hasAge;
+ return getHasAge();
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
+ @Deprecated
+ @DeprecationDetails(
+ by = "PowerNukkit", since = "1.6.0.0-PN", reason = "Bad method name", replaceWith = "setHasAge",
+ toBeRemovedAt = "1.7.0.0-PN")
public void setAge(boolean hasAge) {
- this.hasAge = hasAge;
+ setHasAge(hasAge);
+ }
+
+ @PowerNukkitOnly
+ @Since("1.4.0.0-PN")
+ public void setHasAge(boolean hasAge) {
+ this.noAge = !hasAge;
+ }
+
+ public boolean getHasAge() {
+ return !this.noAge;
}
}
diff --git a/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java b/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java
index 27efc491eee..4700d5209f8 100644
--- a/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java
+++ b/src/main/java/cn/nukkit/entity/projectile/EntitySnowball.java
@@ -2,6 +2,7 @@
import cn.nukkit.Player;
import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.mob.EntityBlaze;
import cn.nukkit.level.Level;
@@ -19,6 +20,7 @@
* @author MagicDroidX (Nukkit Project)
*/
public class EntitySnowball extends EntityProjectile {
+
public static final int NETWORK_ID = 81;
private static final byte[] particleCounts = new byte[24];
private static int particleIndex = 0;
@@ -100,6 +102,7 @@ public int getResultDamage(@Nullable Entity entity) {
return entity instanceof EntityBlaze ? 3 : super.getResultDamage(entity);
}
+ @PowerNukkitOnly
@Override
protected void addHitEffect() {
int particles = nextParticleCount();
@@ -114,4 +117,11 @@ protected void addHitEffect() {
Level level = this.level;
level.getServer().batchPackets(level.getChunkPlayers(chunkX, chunkZ).values().toArray(Player.EMPTY_ARRAY), allPackets);
}
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Snowball";
+ }
}
diff --git a/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java b/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java
index 03c20f6b137..f53b09fea28 100644
--- a/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java
+++ b/src/main/java/cn/nukkit/entity/projectile/EntityThrownTrident.java
@@ -1,6 +1,7 @@
package cn.nukkit.entity.projectile;
import cn.nukkit.Player;
+import cn.nukkit.api.DeprecationDetails;
import cn.nukkit.api.PowerNukkitDifference;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
@@ -39,62 +40,46 @@
public class EntityThrownTrident extends EntityProjectile {
public static final int NETWORK_ID = 73;
+ private static final String TAG_PICKUP = "pickup";
+ private static final String TAG_TRIDENT = "Trident";
+ private static final String TAG_FAVORED_SLOT = "favoredSlot";
+ private static final String TAG_CREATIVE = "isCreative";
+ private static final String TAG_PLAYER = "player";
+ private static final String NAME_TRIDENT = "Trident";
- public static final int DATA_SOURCE_ID = 17;
-
- // NBT data
protected Item trident;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private Vector3 collisionPos;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private BlockVector3 stuckToBlockPos;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private int favoredSlot;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
- private boolean isCreative;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private boolean player;
-
+
// Enchantment
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
private int loyaltyLevel;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private boolean hasChanneling;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private int riptideLevel;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private int impalingLevel;
-
+
// Default Values
+ @PowerNukkitOnly
protected float gravity = 0.04f;
-
- protected float drag = 0.01f;
-
+
@PowerNukkitOnly
- @Since("1.4.0.0-PN")
+ protected float drag = 0.01f;
+
private static final Vector3 defaultCollisionPos = new Vector3(0, 0, 0);
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
+
private static final BlockVector3 defaultStuckToBlockPos = new BlockVector3(0, 0, 0);
-
+
+ @Since("1.6.0.0-PN") protected int pickupMode;
+ @Since("1.6.0.0-PN") public boolean alreadyCollided;
+
@Override
public int getNetworkId() {
return NETWORK_ID;
@@ -117,41 +102,55 @@ public float getHeight() {
@Override
public float getGravity() {
- return 0.04f;
+ return 0.05f;
}
@Override
public float getDrag() {
return 0.01f;
}
-
+
public EntityThrownTrident(FullChunk chunk, CompoundTag nbt) {
this(chunk, nbt, null);
}
public EntityThrownTrident(FullChunk chunk, CompoundTag nbt, Entity shootingEntity) {
- this(chunk, nbt, shootingEntity, false);
+ super(chunk, nbt, shootingEntity);
}
+ @Deprecated
public EntityThrownTrident(FullChunk chunk, CompoundTag nbt, Entity shootingEntity, boolean critical) {
- super(chunk, nbt, shootingEntity);
+ this(chunk, nbt, shootingEntity);
}
-
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
@Override
- public String getName() {
- return "Trident";
+ public String getOriginalName() {
+ return NAME_TRIDENT;
}
-
+
@Override
protected void initEntity() {
+ super.setHasAge(false);
super.initEntity();
-
+
this.closeOnCollide = false;
-
- this.hasAge = false;
-
- if (namedTag.contains("Trident")) {
- this.trident = NBTIO.getItemHelper(namedTag.getCompound("Trident"));
+
+ this.pickupMode = namedTag.contains(TAG_PICKUP) ? namedTag.getByte(TAG_PICKUP) : PICKUP_ANY;
+ this.damage = namedTag.contains("damage") ? namedTag.getDouble("damage") : 8;
+ this.favoredSlot = namedTag.contains(TAG_FAVORED_SLOT) ? namedTag.getInt(TAG_FAVORED_SLOT) : -1;
+ this.player = !namedTag.contains(TAG_PLAYER) || namedTag.getBoolean(TAG_PLAYER);
+
+ if (namedTag.contains(TAG_CREATIVE)) {
+ if (pickupMode == PICKUP_ANY && namedTag.getBoolean(TAG_CREATIVE)) {
+ pickupMode = PICKUP_CREATIVE;
+ }
+ namedTag.remove(TAG_CREATIVE);
+ }
+
+ if (namedTag.contains(TAG_TRIDENT)) {
+ this.trident = NBTIO.getItemHelper(namedTag.getCompound(TAG_TRIDENT));
this.loyaltyLevel = this.trident.getEnchantmentLevel(Enchantment.ID_TRIDENT_LOYALTY);
this.hasChanneling = this.trident.hasEnchantment(Enchantment.ID_TRIDENT_CHANNELING);
this.riptideLevel = this.trident.getEnchantmentLevel(Enchantment.ID_TRIDENT_RIPTIDE);
@@ -163,43 +162,19 @@ protected void initEntity() {
this.riptideLevel = 0;
this.impalingLevel = 0;
}
-
- if (namedTag.contains("damage")) {
- this.damage = namedTag.getDouble("damage");
- } else {
- this.damage = 8;
- }
-
+
if (namedTag.contains("CollisionPos")) {
ListTag collisionPosList = this.namedTag.getList("CollisionPos", DoubleTag.class);
collisionPos = new Vector3(collisionPosList.get(0).data, collisionPosList.get(1).data, collisionPosList.get(2).data);
} else {
- collisionPos = this.defaultCollisionPos.clone();
+ collisionPos = defaultCollisionPos.clone();
}
-
+
if (namedTag.contains("StuckToBlockPos")) {
ListTag stuckToBlockPosList = this.namedTag.getList("StuckToBlockPos", IntTag.class);
stuckToBlockPos = new BlockVector3(stuckToBlockPosList.get(0).data, stuckToBlockPosList.get(1).data, stuckToBlockPosList.get(2).data);
} else {
- stuckToBlockPos = this.defaultStuckToBlockPos.clone();
- }
-
- if (namedTag.contains("favoredSlot")) {
- this.favoredSlot = namedTag.getInt("favoredSlot");
- } else {
- this.favoredSlot = -1;
- }
-
- if (namedTag.contains("isCreative")) {
- this.isCreative = namedTag.getBoolean("isCreative");
- } else {
- this.isCreative = false;
- }
-
- if (namedTag.contains("player")) {
- this.player = namedTag.getBoolean("player");
- } else {
- this.player = true;
+ stuckToBlockPos = defaultStuckToBlockPos.clone();
}
}
@@ -207,7 +182,8 @@ protected void initEntity() {
public void saveNBT() {
super.saveNBT();
- this.namedTag.put("Trident", NBTIO.putItemHelper(this.trident));
+ this.namedTag.put(TAG_TRIDENT, NBTIO.putItemHelper(this.trident));
+ this.namedTag.putByte(TAG_PICKUP, this.pickupMode);
this.namedTag.putList(new ListTag("CollisionPos")
.add(new DoubleTag("0", this.collisionPos.x))
.add(new DoubleTag("1", this.collisionPos.y))
@@ -218,9 +194,8 @@ public void saveNBT() {
.add(new IntTag("1", this.stuckToBlockPos.y))
.add(new IntTag("2", this.stuckToBlockPos.z))
);
- this.namedTag.putInt("favoredSlot", this.favoredSlot);
- this.namedTag.putBoolean("isCreative", this.isCreative);
- this.namedTag.putBoolean("player", this.player);
+ this.namedTag.putInt(TAG_FAVORED_SLOT, this.favoredSlot);
+ this.namedTag.putBoolean(TAG_PLAYER, this.player);
}
public Item getItem() {
@@ -235,14 +210,17 @@ public void setItem(Item item) {
this.impalingLevel = this.trident.getEnchantmentLevel(Enchantment.ID_TRIDENT_IMPALING);
}
+ @PowerNukkitOnly
public void setCritical() {
this.setCritical(true);
}
+ @PowerNukkitOnly
public void setCritical(boolean value) {
this.setDataFlag(DATA_FLAGS, DATA_FLAG_CRITICAL, value);
}
+ @PowerNukkitOnly
public boolean isCritical() {
return this.getDataFlag(DATA_FLAGS, DATA_FLAG_CRITICAL);
}
@@ -281,7 +259,7 @@ public boolean onUpdate(int currentTick) {
if (this.onGround || this.hadCollision) {
this.setCritical(false);
}
-
+
if (this.noClip) {
if (this.canReturnToShooter()) {
Entity shooter = this.shootingEntity;
@@ -296,7 +274,7 @@ public boolean onUpdate(int currentTick) {
this.close();
}
}
-
+
this.timing.stopTiming();
return hasUpdate;
@@ -328,13 +306,18 @@ public void onCollideWithEntity(Entity entity) {
if (this.noClip) {
return;
}
-
+
+ if (this.alreadyCollided) {
+ this.move(this.motionX, this.motionY, this.motionZ);
+ return;
+ }
+
this.server.getPluginManager().callEvent(new ProjectileHitEvent(this, MovingObjectPosition.fromEntity(entity)));
float damage = this.getResultDamage();
if (this.impalingLevel > 0 && (entity.isTouchingWater() || (entity.getLevel().isRaining() && entity.getLevel().canBlockSeeSky(entity)))) {
damage = damage + (2.5f * (float) this.impalingLevel);
}
-
+
EntityDamageEvent ev;
if (this.shootingEntity == null) {
ev = new EntityDamageByEntityEvent(this, entity, DamageCause.PROJECTILE, damage);
@@ -346,7 +329,7 @@ public void onCollideWithEntity(Entity entity) {
this.hadCollision = true;
this.setCollisionPos(this);
this.setMotion(new Vector3(this.getMotion().getX() * -0.01, this.getMotion().getY() * -0.1, this.getMotion().getZ() * -0.01));
-
+
if (this.hasChanneling) {
if (this.level.isThundering() && this.level.canBlockSeeSky(this)) {
Position pos = this.getPosition();
@@ -355,7 +338,7 @@ public void onCollideWithEntity(Entity entity) {
this.getLevel().addSound(this, Sound.ITEM_TRIDENT_THUNDER);
}
}
-
+
if (this.canReturnToShooter()) {
this.getLevel().addSound(this, Sound.ITEM_TRIDENT_RETURN);
this.setNoClip(true);
@@ -364,19 +347,30 @@ public void onCollideWithEntity(Entity entity) {
}
}
+ @PowerNukkitOnly
public Entity create(Object type, Position source, Object... args) {
FullChunk chunk = source.getLevel().getChunk((int) source.x >> 4, (int) source.z >> 4);
if (chunk == null) return null;
CompoundTag nbt = Entity.getDefaultNBT(
- source.add(0.5, 0, 0.5),
- null,
+ source.add(0.5, 0, 0.5),
+ null,
new Random().nextFloat() * 360, 0
);
return Entity.createEntity(type.toString(), chunk, nbt, args);
}
-
+
+ @Since("1.6.0.0-PN")
+ public int getPickupMode() {
+ return this.pickupMode;
+ }
+
+ @Since("1.6.0.0-PN")
+ public void setPickupMode(int pickupMode) {
+ this.pickupMode = pickupMode;
+ }
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
@Override
@@ -384,7 +378,7 @@ protected void onCollideWithBlock(Position position, Vector3 motion) {
if (this.noClip) {
return;
}
-
+
for (Block collisionBlock : level.getCollisionBlocks(getBoundingBox().grow(0.1, 0.1, 0.1))) {
this.setStuckToBlockPos(new BlockVector3(collisionBlock.getFloorX(), collisionBlock.getFloorY(), collisionBlock.getFloorZ()));
if (this.canReturnToShooter()) {
@@ -396,73 +390,80 @@ protected void onCollideWithBlock(Position position, Vector3 motion) {
onCollideWithBlock(position, motion, collisionBlock);
}
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public Vector3 getCollisionPos() {
return collisionPos;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setCollisionPos(Vector3 collisionPos) {
this.collisionPos = collisionPos;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public BlockVector3 getStuckToBlockPos() {
return stuckToBlockPos;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setStuckToBlockPos(BlockVector3 stuckToBlockPos) {
this.stuckToBlockPos = stuckToBlockPos;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public int getFavoredSlot() {
return favoredSlot;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setFavoredSlot(int favoredSlot) {
this.favoredSlot = favoredSlot;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public boolean isCreative() {
- return isCreative;
+ return getPickupMode() == EntityProjectile.PICKUP_CREATIVE;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
+ @Deprecated
+ @DeprecationDetails(since = "1.6.0.0-PN", by = "PowerNukkit", replaceWith = "setPickupMode(EntityProjectile.PICKUP_)",
+ reason = "Nukkit added this API in 3-states, NONE, ANY, and CREATIVE")
public void setCreative(boolean isCreative) {
- this.isCreative = isCreative;
+ if (isCreative) {
+ setPickupMode(EntityProjectile.PICKUP_CREATIVE);
+ } else if (getPickupMode() == EntityProjectile.PICKUP_CREATIVE) {
+ setPickupMode(EntityProjectile.PICKUP_ANY);
+ }
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public boolean isPlayer() {
return player;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setPlayer(boolean player) {
this.player = player;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public int getLoyaltyLevel() {
return loyaltyLevel;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setLoyaltyLevel(int loyaltyLevel) {
@@ -473,13 +474,13 @@ public void setLoyaltyLevel(int loyaltyLevel) {
// TODO: this.trident.removeEnchantment(Enchantment.ID_TRIDENT_LOYALTY);
}
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public boolean hasChanneling() {
return hasChanneling;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setChanneling(boolean hasChanneling) {
@@ -490,13 +491,13 @@ public void setChanneling(boolean hasChanneling) {
// TODO: this.trident.removeEnchantment(Enchantment.ID_TRIDENT_CHANNELING);
}
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public int getRiptideLevel() {
return riptideLevel;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setRiptideLevel(int riptideLevel) {
@@ -507,13 +508,13 @@ public void setRiptideLevel(int riptideLevel) {
// TODO: this.trident.removeEnchantment(Enchantment.ID_TRIDENT_RIPTIDE);
}
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public int getImpalingLevel() {
return impalingLevel;
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setImpalingLevel(int impalingLevel) {
@@ -524,13 +525,13 @@ public void setImpalingLevel(int impalingLevel) {
// TODO: this.trident.removeEnchantment(Enchantment.ID_TRIDENT_IMPALING);
}
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public boolean getTridentRope() {
return this.getDataFlag(DATA_FLAGS, DATA_FLAG_SHOW_TRIDENT_ROPE);
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public void setTridentRope(boolean tridentRope) {
@@ -541,18 +542,18 @@ public void setTridentRope(boolean tridentRope) {
}
this.setDataFlag(DATA_FLAGS, DATA_FLAG_SHOW_TRIDENT_ROPE, tridentRope);
}
-
+
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public boolean canReturnToShooter() {
if (this.loyaltyLevel <= 0) {
return false;
}
-
+
if (this.getCollisionPos().equals(this.defaultCollisionPos) && this.getStuckToBlockPos().equals(this.defaultStuckToBlockPos)) {
return false;
}
-
+
Entity shooter = this.shootingEntity;
if (shooter != null) {
if (shooter.isAlive() && shooter instanceof Player) {
diff --git a/src/main/java/cn/nukkit/entity/weather/EntityLightning.java b/src/main/java/cn/nukkit/entity/weather/EntityLightning.java
index 439c49801d7..a4cd3eea757 100644
--- a/src/main/java/cn/nukkit/entity/weather/EntityLightning.java
+++ b/src/main/java/cn/nukkit/entity/weather/EntityLightning.java
@@ -1,6 +1,8 @@
package cn.nukkit.entity.weather;
import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockFire;
import cn.nukkit.block.BlockID;
@@ -71,10 +73,12 @@ protected void initEntity() {
}
}
+ @Override
public boolean isEffect() {
return this.isEffect;
}
+ @Override
public void setEffect(boolean e) {
this.isEffect = e;
}
@@ -150,4 +154,10 @@ public boolean onUpdate(int currentTick) {
}
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ @Override
+ public String getOriginalName() {
+ return "Lightning Bolt";
+ }
}
diff --git a/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java b/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java
index 08e5324da49..6278dc5b29f 100644
--- a/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java
+++ b/src/main/java/cn/nukkit/event/block/AnvilDamageEvent.java
@@ -2,26 +2,22 @@
import cn.nukkit.Player;
import cn.nukkit.api.DeprecationDetails;
-import cn.nukkit.api.PowerNukkitDifference;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
+import cn.nukkit.block.BlockAnvil;
+import cn.nukkit.blockproperty.value.AnvilDamage;
+import cn.nukkit.blockstate.BlockState;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
import cn.nukkit.inventory.transaction.CraftingTransaction;
-import lombok.RequiredArgsConstructor;
+import com.google.common.base.Preconditions;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-@PowerNukkitDifference(info = "Extends BlockFadeEvent instead of BlockEvent only in PowerNukkit")
-@Deprecated @DeprecationDetails(since = "1.4.0.0-PN",
- reason = "This is only a warning, this event will change in 1.5.0.0-PN, " +
- "it will no longer extend BlockFadeEvent and the cause enum will be renamed!",
- toBeRemovedAt = "The class will have a breaking change in 1.5.0.0-PN"
-)
@Since("1.1.1.0-PN")
-public class AnvilDamageEvent extends BlockFadeEvent implements Cancellable {
+public class AnvilDamageEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -29,120 +25,140 @@ public class AnvilDamageEvent extends BlockFadeEvent implements Cancellable {
public static HandlerList getHandlers() {
return handlers;
}
-
+
+ @Nullable
private final Player player;
+
+ @Nullable
private final CraftingTransaction transaction;
+
+ @Nonnull
private final DamageCause cause;
+ @Nonnull
+ private final BlockState oldState;
+
+ @Nonnull
+ private BlockState newState;
+
@Since("1.4.0.0-PN")
- public AnvilDamageEvent(Block block, int oldDamage, int newDamage, DamageCause cause, Player player) {
- this(adjustBlock(block, oldDamage), adjustBlock(block, newDamage), player, null, cause);
+ public AnvilDamageEvent(@Nonnull Block block, int oldDamage, int newDamage, @Nonnull DamageCause cause, @Nullable Player player) {
+ this(adjustBlock(block, oldDamage), block.getCurrentState().withData(newDamage), player, null, cause);
}
@PowerNukkitOnly
@Since("1.4.0.0-PN")
- public AnvilDamageEvent(Block block, Block newState, Player player, @Nullable CraftingTransaction transaction, DamageCause cause) {
- super(block, newState);
+ public AnvilDamageEvent(@Nonnull Block block, @Nonnull Block newState, @Nullable Player player, @Nullable CraftingTransaction transaction, @Nonnull DamageCause cause) {
+ this(block, newState.getCurrentState(), player, transaction, cause);
+ }
+
+ @PowerNukkitOnly
+ @Since("1.6.0.0-PN")
+ public AnvilDamageEvent(@Nonnull Block block, @Nonnull BlockState newState, @Nullable Player player, @Nullable CraftingTransaction transaction, @Nonnull DamageCause cause) {
+ super(Preconditions.checkNotNull(block, "block").clone());
+ this.oldState = block.getCurrentState();
this.player = player;
this.transaction = transaction;
- this.cause = cause;
+ this.cause = Preconditions.checkNotNull(cause, "cause");
+ this.newState = Preconditions.checkNotNull(newState, "newState");
}
@PowerNukkitOnly
@Since("1.1.1.0-PN")
- public AnvilDamageEvent(Block block, Block newState, Player player, CraftingTransaction transaction, Cause cause) {
- this(block, newState, player, transaction, convert(cause));
- }
-
-
- @Since("1.1.1.0-PN")
- public Player getPlayer() {
- return player;
- }
-
-
- @PowerNukkitOnly
- @Since("1.1.1.0-PN")
+ @Nullable
public CraftingTransaction getTransaction() {
return transaction;
}
@PowerNukkitOnly
@Since("1.4.0.0-PN")
+ @Nonnull
public DamageCause getDamageCause() {
return cause;
}
-
+ @Deprecated
+ @DeprecationDetails(since = "1.6.0.0-PN", by = "PowerNukkit", reason = "Unstable use of raw block state data", replaceWith = "getOldAnvilDamage or getOldBlockState")
@Since("1.4.0.0-PN")
public int getOldDamage() {
- return getBlock().getDamage();
+ if (!block.getProperties().contains(BlockAnvil.DAMAGE)) {
+ return 0;
+ }
+ return block.getIntValue(BlockAnvil.DAMAGE);
+ }
+
+ @PowerNukkitOnly
+ @Since("1.6.0.0-PN")
+ @Nullable
+ public AnvilDamage getOldAnvilDamage() {
+ if (oldState.getProperties().contains(BlockAnvil.DAMAGE)) {
+ return oldState.getPropertyValue(BlockAnvil.DAMAGE);
+ }
+ return null;
}
+ @PowerNukkitOnly
+ @Since("1.6.0.0-PN")
+ @Nonnull
+ public BlockState getOldBlockState() {
+ return oldState;
+ }
+
+ @PowerNukkitOnly
+ @Since("1.6.0.0-PN")
+ @Nonnull
+ public BlockState getNewBlockState() {
+ return newState;
+ }
+
+ @PowerNukkitOnly("Used to be inherited from BlockFadeEvent")
+ @Since("1.1.1.0-PN")
+ @Nonnull
+ public Block getNewState() {
+ return newState.getBlockRepairing(block);
+ }
+
+ @Deprecated
+ @DeprecationDetails(since = "1.6.0.0-PN", by = "PowerNukkit", reason = "Unstable use of raw block state data", replaceWith = "getNewAnvilDamage or getNewBlockState")
@Since("1.4.0.0-PN")
public int getNewDamage() {
- return getNewState().getDamage();
+ BlockState newBlockState = getNewBlockState();
+ return newBlockState.getProperties().contains(BlockAnvil.DAMAGE)? newBlockState.getIntValue(BlockAnvil.DAMAGE) : 0;
+ }
+
+ @PowerNukkitOnly
+ @Since("1.6.0.0-PN")
+ public void setNewBlockState(@Nonnull BlockState state) {
+ this.newState = Preconditions.checkNotNull(state);
}
+ @Deprecated
+ @DeprecationDetails(since = "1.6.0.0-PN", by = "PowerNukkit", reason = "Unstable use of raw block state data",
+ replaceWith = "setNewBlockState example: setNewBlockState(BlockState.of(BlockID.ANVIL).withProperty(BlockAnvil.DAMAGE, AnvilDamage.VERY_DAMAGED))")
@Since("1.4.0.0-PN")
public void setNewDamage(int newDamage) {
- getNewState().setDamage(newDamage);
+ BlockState newBlockState = getNewBlockState();
+ if (newBlockState.getProperties().contains(BlockAnvil.DAMAGE)) {
+ this.setNewBlockState(newBlockState.withProperty(BlockAnvil.DAMAGE, BlockAnvil.DAMAGE.getValueForMeta(newDamage)));
+ }
}
@PowerNukkitOnly
- @Since("1.1.1.0-PN")
- @Deprecated @DeprecationDetails(
- since = "1.4.0.0-PN", by = "PowerNukkit",
- reason = "NukkitX added the class and made getCause() return an enum with a different name.",
- replaceWith = "getDamageCause()",
- toBeRemovedAt = "1.6.0.0-PN"
- )
- public Cause getCause() {
- return convert(cause);
+ @Since("1.6.0.0-PN")
+ public void setNewState(@Nonnull Block block) {
+ this.newState = block.getCurrentState();
+ }
+
+ @Since("1.6.0.0-PN")
+ @Nonnull
+ public DamageCause getCause() {
+ return this.cause;
}
- @PowerNukkitOnly
@Since("1.1.1.0-PN")
- @Deprecated @DeprecationDetails(
- since = "1.4.0.0-PN", by = "PowerNukkit",
- reason = "NukkitX added the class but with a different enum for the damage cause",
- replaceWith = "DamageCause",
- toBeRemovedAt = "1.6.0.0-PN"
- )
- @RequiredArgsConstructor
- public enum Cause {
- @PowerNukkitOnly
- @Since("1.1.1.0-PN")
- @Deprecated @DeprecationDetails(
- since = "1.4.0.0-PN", by = "PowerNukkit",
- reason = "NukkitX added the class but with a different enum for the damage cause",
- replaceWith = "DamageCause.USE",
- toBeRemovedAt = "1.6.0.0-PN"
- )
- USE,
-
- @PowerNukkitOnly
- @Since("1.1.1.0-PN")
- @Deprecated @DeprecationDetails(
- since = "1.4.0.0-PN", by = "PowerNukkit",
- reason = "NukkitX added the class but with a different enum for the damage cause",
- replaceWith = "DamageCause.FALL",
- toBeRemovedAt = "1.6.0.0-PN"
- )
- IMPACT;
-
- @PowerNukkitOnly
- @Since("1.4.0.0-PN")
- @Deprecated @DeprecationDetails(
- since = "1.4.0.0-PN", by = "PowerNukkit",
- reason = "This is method is only a temporary helper, it will also be removed in future",
- replaceWith = "Direct usage of DamageCause",
- toBeRemovedAt = "1.6.0.0-PN"
- )
- @Nonnull
- public DamageCause getDamageCause() {
- return DamageCause.valueOf(name());
- }
+ @Nullable
+ public Player getPlayer() {
+ return this.player;
}
@Since("1.4.0.0-PN")
@@ -152,30 +168,8 @@ public enum DamageCause {
}
private static Block adjustBlock(Block block, int damage) {
- Block adjusted = block.clone();
- adjusted.setDamage(damage);
+ Block adjusted = Preconditions.checkNotNull(block, "block").clone();
+ adjusted.setDataStorage(damage);
return adjusted;
}
-
- private static DamageCause convert(Cause cause) {
- switch (cause) {
- case USE:
- return DamageCause.USE;
- case IMPACT:
- return DamageCause.FALL;
- default:
- return null;
- }
- }
-
- private static Cause convert(DamageCause cause) {
- switch (cause) {
- case USE:
- return Cause.USE;
- case FALL:
- return Cause.IMPACT;
- default:
- return null;
- }
- }
}
diff --git a/src/main/java/cn/nukkit/event/block/BellRingEvent.java b/src/main/java/cn/nukkit/event/block/BellRingEvent.java
index 18f2bc67d86..29fad42d1a6 100644
--- a/src/main/java/cn/nukkit/event/block/BellRingEvent.java
+++ b/src/main/java/cn/nukkit/event/block/BellRingEvent.java
@@ -1,14 +1,17 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.BlockBell;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
+@PowerNukkitOnly
public class BellRingEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
@@ -16,6 +19,7 @@ public static HandlerList getHandlers() {
private final RingCause cause;
private final Entity entity;
+ @PowerNukkitOnly
public BellRingEvent(BlockBell bell, RingCause cause, Entity entity) {
super(bell);
this.cause = cause;
@@ -27,20 +31,23 @@ public BlockBell getBlock() {
return (BlockBell) super.getBlock();
}
+ @PowerNukkitOnly
public Entity getEntity() {
return entity;
}
+ @PowerNukkitOnly
public RingCause getCause() {
return cause;
}
+ @PowerNukkitOnly
public enum RingCause {
- HUMAN_INTERACTION,
- REDSTONE,
- PROJECTILE,
- DROPPED_ITEM,
- UNKNOWN
+ @PowerNukkitOnly HUMAN_INTERACTION,
+ @PowerNukkitOnly REDSTONE,
+ @PowerNukkitOnly PROJECTILE,
+ @PowerNukkitOnly DROPPED_ITEM,
+ @PowerNukkitOnly UNKNOWN
}
}
diff --git a/src/main/java/cn/nukkit/event/block/BlockHarvestEvent.java b/src/main/java/cn/nukkit/event/block/BlockHarvestEvent.java
index e214f069251..f661d1a8759 100644
--- a/src/main/java/cn/nukkit/event/block/BlockHarvestEvent.java
+++ b/src/main/java/cn/nukkit/event/block/BlockHarvestEvent.java
@@ -1,10 +1,12 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
+@PowerNukkitOnly
public class BlockHarvestEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -12,28 +14,34 @@ public class BlockHarvestEvent extends BlockEvent implements Cancellable {
private Block newState;
private Item[] drops;
+ @PowerNukkitOnly
public BlockHarvestEvent(Block block, Block newState, Item[] drops) {
super(block);
this.newState = newState;
this.drops = drops;
}
+ @PowerNukkitOnly
public Block getNewState() {
return newState;
}
+ @PowerNukkitOnly
public void setNewState(Block newState) {
this.newState = newState;
}
+ @PowerNukkitOnly
public Item[] getDrops() {
return drops;
}
+ @PowerNukkitOnly
public void setDrops(Item[] drops) {
this.drops = drops;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
diff --git a/src/main/java/cn/nukkit/event/block/BlockPistonEvent.java b/src/main/java/cn/nukkit/event/block/BlockPistonEvent.java
index 2d1cc3debd7..5121587560e 100644
--- a/src/main/java/cn/nukkit/event/block/BlockPistonEvent.java
+++ b/src/main/java/cn/nukkit/event/block/BlockPistonEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockPistonBase;
import cn.nukkit.event.Cancellable;
@@ -9,10 +10,12 @@
import java.util.ArrayList;
import java.util.List;
+@PowerNukkitOnly
public class BlockPistonEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
@@ -22,6 +25,7 @@ public static HandlerList getHandlers() {
private final List destroyedBlocks;
private final boolean extending;
+ @PowerNukkitOnly
public BlockPistonEvent(BlockPistonBase piston, BlockFace direction, List blocks, List destroyedBlocks, boolean extending) {
super(piston);
this.direction = direction;
@@ -30,18 +34,22 @@ public BlockPistonEvent(BlockPistonBase piston, BlockFace direction, List
this.extending = extending;
}
+ @PowerNukkitOnly
public BlockFace getDirection() {
return direction;
}
+ @PowerNukkitOnly
public List getBlocks() {
return new ArrayList<>(blocks);
}
+ @PowerNukkitOnly
public List getDestroyedBlocks() {
return destroyedBlocks;
}
+ @PowerNukkitOnly
public boolean isExtending() {
return extending;
}
diff --git a/src/main/java/cn/nukkit/event/block/ComposterEmptyEvent.java b/src/main/java/cn/nukkit/event/block/ComposterEmptyEvent.java
index c6614169ba2..80120a5b67d 100644
--- a/src/main/java/cn/nukkit/event/block/ComposterEmptyEvent.java
+++ b/src/main/java/cn/nukkit/event/block/ComposterEmptyEvent.java
@@ -1,14 +1,14 @@
package cn.nukkit.event.block;
import cn.nukkit.Player;
-import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
import cn.nukkit.math.Vector3;
-@PowerNukkitDifference(info = "The player and the item are null when they are empty by a hopper pulling the item", since = "1.4.0.0-PN")
+@PowerNukkitOnly
public class ComposterEmptyEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -19,6 +19,7 @@ public class ComposterEmptyEvent extends BlockEvent implements Cancellable {
private int newLevel;
private Vector3 motion;
+ @PowerNukkitOnly
public ComposterEmptyEvent(Block block, Player player, Item itemUsed, Item drop, int newLevel) {
super(block);
this.player = player;
@@ -27,14 +28,17 @@ public ComposterEmptyEvent(Block block, Player player, Item itemUsed, Item drop,
this.newLevel = Math.max(0, Math.min(newLevel, 8));
}
+ @PowerNukkitOnly
public Player getPlayer() {
return player;
}
+ @PowerNukkitOnly
public Item getDrop() {
return drop.clone();
}
+ @PowerNukkitOnly
public void setDrop(Item drop) {
if (drop == null) {
drop = Item.get(Item.AIR);
@@ -44,30 +48,37 @@ public void setDrop(Item drop) {
this.drop = drop;
}
+ @PowerNukkitOnly
public Item getItemUsed() {
return itemUsed;
}
+ @PowerNukkitOnly
public void setItemUsed(Item itemUsed) {
this.itemUsed = itemUsed;
}
+ @PowerNukkitOnly
public int getNewLevel() {
return newLevel;
}
+ @PowerNukkitOnly
public void setNewLevel(int newLevel) {
this.newLevel = Math.max(0, Math.min(newLevel, 8));
}
+ @PowerNukkitOnly
public Vector3 getMotion() {
return motion;
}
+ @PowerNukkitOnly
public void setMotion(Vector3 motion) {
this.motion = motion;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
diff --git a/src/main/java/cn/nukkit/event/block/ComposterFillEvent.java b/src/main/java/cn/nukkit/event/block/ComposterFillEvent.java
index f8879c3a35e..4fd733749a1 100644
--- a/src/main/java/cn/nukkit/event/block/ComposterFillEvent.java
+++ b/src/main/java/cn/nukkit/event/block/ComposterFillEvent.java
@@ -1,13 +1,13 @@
package cn.nukkit.event.block;
import cn.nukkit.Player;
-import cn.nukkit.api.PowerNukkitDifference;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
-@PowerNukkitDifference(info = "Player is null when is filled by a hopper pushing the item", since = "1.4.0.0-PN")
+@PowerNukkitOnly
public class ComposterFillEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -17,6 +17,7 @@ public class ComposterFillEvent extends BlockEvent implements Cancellable {
private final int chance;
private boolean success;
+ @PowerNukkitOnly
public ComposterFillEvent(Block block, Player player, Item item, int chance, boolean success) {
super(block);
this.player = player;
@@ -25,26 +26,32 @@ public ComposterFillEvent(Block block, Player player, Item item, int chance, boo
this.success = success;
}
+ @PowerNukkitOnly
public Player getPlayer() {
return player;
}
+ @PowerNukkitOnly
public Item getItem() {
return item;
}
+ @PowerNukkitOnly
public int getChance() {
return chance;
}
+ @PowerNukkitOnly
public boolean isSuccess() {
return success;
}
+ @PowerNukkitOnly
public void setSuccess(boolean success) {
this.success = success;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
diff --git a/src/main/java/cn/nukkit/event/block/ConduitActivateEvent.java b/src/main/java/cn/nukkit/event/block/ConduitActivateEvent.java
index c65368f37d1..d4f58789d9a 100644
--- a/src/main/java/cn/nukkit/event/block/ConduitActivateEvent.java
+++ b/src/main/java/cn/nukkit/event/block/ConduitActivateEvent.java
@@ -1,16 +1,20 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.HandlerList;
+@PowerNukkitOnly
public class ConduitActivateEvent extends BlockEvent {
private static final HandlerList handlers = new HandlerList();
+ @PowerNukkitOnly
public ConduitActivateEvent(Block block) {
super(block);
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
diff --git a/src/main/java/cn/nukkit/event/block/ConduitDeactivateEvent.java b/src/main/java/cn/nukkit/event/block/ConduitDeactivateEvent.java
index 47d7e5392dd..5b18a12d7cc 100644
--- a/src/main/java/cn/nukkit/event/block/ConduitDeactivateEvent.java
+++ b/src/main/java/cn/nukkit/event/block/ConduitDeactivateEvent.java
@@ -1,16 +1,20 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.HandlerList;
+@PowerNukkitOnly
public class ConduitDeactivateEvent extends BlockEvent {
private static final HandlerList handlers = new HandlerList();
+ @PowerNukkitOnly
public ConduitDeactivateEvent(Block block) {
super(block);
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
diff --git a/src/main/java/cn/nukkit/event/block/LecternDropBookEvent.java b/src/main/java/cn/nukkit/event/block/LecternDropBookEvent.java
index 097ae605ed3..a9405b45d78 100644
--- a/src/main/java/cn/nukkit/event/block/LecternDropBookEvent.java
+++ b/src/main/java/cn/nukkit/event/block/LecternDropBookEvent.java
@@ -1,11 +1,13 @@
package cn.nukkit.event.block;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.blockentity.BlockEntityLectern;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
+@PowerNukkitOnly
public class LecternDropBookEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -13,6 +15,7 @@ public class LecternDropBookEvent extends BlockEvent implements Cancellable {
private final BlockEntityLectern lectern;
private Item book;
+ @PowerNukkitOnly
public LecternDropBookEvent(Player player, BlockEntityLectern lectern, Item book) {
super(lectern.getBlock());
this.player = player;
@@ -20,22 +23,27 @@ public LecternDropBookEvent(Player player, BlockEntityLectern lectern, Item book
this.book = book;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
+ @PowerNukkitOnly
public BlockEntityLectern getLectern() {
return lectern;
}
+ @PowerNukkitOnly
public Player getPlayer() {
return player;
}
+ @PowerNukkitOnly
public Item getBook() {
return book.clone();
}
+ @PowerNukkitOnly
public void setBook(Item book) {
this.book = book;
}
diff --git a/src/main/java/cn/nukkit/event/block/LecternPageChangeEvent.java b/src/main/java/cn/nukkit/event/block/LecternPageChangeEvent.java
index fe625129cf9..af0b8d50723 100644
--- a/src/main/java/cn/nukkit/event/block/LecternPageChangeEvent.java
+++ b/src/main/java/cn/nukkit/event/block/LecternPageChangeEvent.java
@@ -1,10 +1,12 @@
package cn.nukkit.event.block;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.blockentity.BlockEntityLectern;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
+@PowerNukkitOnly
public class LecternPageChangeEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -12,6 +14,7 @@ public class LecternPageChangeEvent extends BlockEvent implements Cancellable {
private final BlockEntityLectern lectern;
private int newRawPage;
+ @PowerNukkitOnly
public LecternPageChangeEvent(Player player, BlockEntityLectern lectern, int newPage) {
super(lectern.getBlock());
this.player = player;
@@ -19,42 +22,52 @@ public LecternPageChangeEvent(Player player, BlockEntityLectern lectern, int new
this.newRawPage = newPage;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
+ @PowerNukkitOnly
public BlockEntityLectern getLectern() {
return lectern;
}
+ @PowerNukkitOnly
public int getLeftPage() {
return (newRawPage * 2) + 1;
}
+ @PowerNukkitOnly
public int getRightPage() {
return getLeftPage() + 1;
}
+ @PowerNukkitOnly
public void setLeftPage(int newLeftPage) {
this.newRawPage = (newLeftPage - 1) / 2;
}
+ @PowerNukkitOnly
public void setRightPage(int newRightPage) {
this.setLeftPage(newRightPage - 1);
}
+ @PowerNukkitOnly
public int getNewRawPage() {
return newRawPage;
}
+ @PowerNukkitOnly
public void setNewRawPage(int newRawPage) {
this.newRawPage = newRawPage;
}
+ @PowerNukkitOnly
public int getMaxPage() {
return lectern.getTotalPages();
}
+ @PowerNukkitOnly
public Player getPlayer() {
return player;
}
diff --git a/src/main/java/cn/nukkit/event/block/LecternPlaceBookEvent.java b/src/main/java/cn/nukkit/event/block/LecternPlaceBookEvent.java
index 565a3fe03fc..6458cfd676e 100644
--- a/src/main/java/cn/nukkit/event/block/LecternPlaceBookEvent.java
+++ b/src/main/java/cn/nukkit/event/block/LecternPlaceBookEvent.java
@@ -1,11 +1,13 @@
package cn.nukkit.event.block;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.blockentity.BlockEntityLectern;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
+@PowerNukkitOnly
public class LecternPlaceBookEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -13,6 +15,7 @@ public class LecternPlaceBookEvent extends BlockEvent implements Cancellable {
private final BlockEntityLectern lectern;
private Item book;
+ @PowerNukkitOnly
public LecternPlaceBookEvent(Player player, BlockEntityLectern lectern, Item book) {
super(lectern.getBlock());
this.player = player;
@@ -20,22 +23,27 @@ public LecternPlaceBookEvent(Player player, BlockEntityLectern lectern, Item boo
this.book = book;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
+ @PowerNukkitOnly
public BlockEntityLectern getLectern() {
return lectern;
}
+ @PowerNukkitOnly
public Player getPlayer() {
return player;
}
+ @PowerNukkitOnly
public Item getBook() {
return book.clone();
}
+ @PowerNukkitOnly
public void setBook(Item book) {
this.book = book;
}
diff --git a/src/main/java/cn/nukkit/event/block/TurtleEggHatchEvent.java b/src/main/java/cn/nukkit/event/block/TurtleEggHatchEvent.java
index 7b9eb36cd34..5655edec85f 100644
--- a/src/main/java/cn/nukkit/event/block/TurtleEggHatchEvent.java
+++ b/src/main/java/cn/nukkit/event/block/TurtleEggHatchEvent.java
@@ -1,11 +1,13 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockAir;
import cn.nukkit.block.BlockTurtleEgg;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
+@PowerNukkitOnly
public class TurtleEggHatchEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -14,12 +16,14 @@ public class TurtleEggHatchEvent extends BlockEvent implements Cancellable {
private Block newState;
private boolean recalculateOnFailure = true;
+ @PowerNukkitOnly
public TurtleEggHatchEvent(BlockTurtleEgg turtleEgg, int eggsHatching, Block newState) {
super(turtleEgg);
this.eggsHatching = eggsHatching;
this.newState = newState;
}
+ @PowerNukkitOnly
public void recalculateNewState() {
BlockTurtleEgg turtleEgg = getBlock();
int eggCount = turtleEgg.getEggCount();
@@ -33,10 +37,12 @@ public void recalculateNewState() {
}
}
+ @PowerNukkitOnly
public Block getNewState() {
return newState;
}
+ @PowerNukkitOnly
public void setNewState(Block newState) {
this.newState = newState;
}
@@ -46,22 +52,27 @@ public BlockTurtleEgg getBlock() {
return (BlockTurtleEgg) super.getBlock();
}
+ @PowerNukkitOnly
public int getEggsHatching() {
return eggsHatching;
}
+ @PowerNukkitOnly
public void setEggsHatching(int eggsHatching) {
this.eggsHatching = eggsHatching;
}
+ @PowerNukkitOnly
public boolean isRecalculateOnFailure() {
return recalculateOnFailure;
}
+ @PowerNukkitOnly
public void setRecalculateOnFailure(boolean recalculateOnFailure) {
this.recalculateOnFailure = recalculateOnFailure;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
diff --git a/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java b/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java
index 568361c7803..70966baf66d 100644
--- a/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java
+++ b/src/main/java/cn/nukkit/event/block/WaterFrostEvent.java
@@ -1,25 +1,31 @@
package cn.nukkit.event.block;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
+@PowerNukkitOnly
public class WaterFrostEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
-
+
+ @PowerNukkitOnly
protected final Entity entity;
+ @PowerNukkitOnly
public WaterFrostEvent(Block block, Entity entity) {
super(block);
this.entity = entity;
}
-
+
+ @PowerNukkitOnly
public Entity getEntity() {
return entity;
}
diff --git a/src/main/java/cn/nukkit/event/blockstate/BlockStateRepairFinishEvent.java b/src/main/java/cn/nukkit/event/blockstate/BlockStateRepairFinishEvent.java
index d98777aa44e..76a14e89094 100644
--- a/src/main/java/cn/nukkit/event/blockstate/BlockStateRepairFinishEvent.java
+++ b/src/main/java/cn/nukkit/event/blockstate/BlockStateRepairFinishEvent.java
@@ -39,6 +39,7 @@ public List getAllRepairs() {
return allRepairs;
}
+ @PowerNukkitOnly
@Nonnull
public Block getResult() {
return result;
diff --git a/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java b/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java
index c2efc1a3207..2e6529acf14 100644
--- a/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java
+++ b/src/main/java/cn/nukkit/event/entity/CreatureSpawnEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.entity;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.Event;
@@ -27,6 +28,7 @@ public CreatureSpawnEvent(int networkId, Position position, CompoundTag nbt, Spa
this.compoundTag = nbt;
}
+ @PowerNukkitOnly
public CreatureSpawnEvent(int networkId, Position position, SpawnReason reason) {
this.reason = reason;
this.entityNetworkId = networkId;
diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java
index 269a4836770..0fd4f467b3d 100644
--- a/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java
+++ b/src/main/java/cn/nukkit/event/entity/EntityDamageByEntityEvent.java
@@ -1,8 +1,12 @@
package cn.nukkit.event.entity;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
+import cn.nukkit.item.enchantment.Enchantment;
import cn.nukkit.potion.Effect;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import java.util.Map;
/**
@@ -10,29 +14,47 @@
*/
public class EntityDamageByEntityEvent extends EntityDamageEvent {
+ @Nonnull
private final Entity damager;
private float knockBack;
- public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, float damage) {
+ @Nullable
+ private Enchantment[] enchantments;
+
+ public EntityDamageByEntityEvent(@Nonnull Entity damager, @Nonnull Entity entity, @Nonnull DamageCause cause, float damage) {
this(damager, entity, cause, damage, 0.3f);
}
- public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, Map modifiers) {
+ public EntityDamageByEntityEvent(@Nonnull Entity damager, @Nonnull Entity entity, @Nonnull DamageCause cause, Map modifiers) {
this(damager, entity, cause, modifiers, 0.3f);
}
- public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, float damage, float knockBack) {
+ public EntityDamageByEntityEvent(@Nonnull Entity damager, @Nonnull Entity entity, @Nonnull DamageCause cause, float damage, float knockBack) {
super(entity, cause, damage);
this.damager = damager;
this.knockBack = knockBack;
this.addAttackerModifiers(damager);
}
- public EntityDamageByEntityEvent(Entity damager, Entity entity, DamageCause cause, Map modifiers, float knockBack) {
+ public EntityDamageByEntityEvent(@Nonnull Entity damager, @Nonnull Entity entity, @Nonnull DamageCause cause, @Nonnull Map modifiers, float knockBack) {
+ this(damager, entity, cause, modifiers, knockBack, null);
+ }
+
+ @Since("1.6.0.0-PN")
+ public EntityDamageByEntityEvent(@Nonnull Entity damager, @Nonnull Entity entity, @Nonnull DamageCause cause, @Nonnull Map modifiers, float knockBack, @Nullable Enchantment[] enchantments) {
super(entity, cause, modifiers);
+ if (enchantments != null) {
+ enchantments = enchantments.length == 0 ? Enchantment.EMPTY_ARRAY : enchantments.clone();
+ for (Enchantment enchantment : enchantments) {
+ if (enchantment != null) {
+ addSideEffects(enchantment.getAttackSideEffects(damager, entity));
+ }
+ }
+ }
this.damager = damager;
this.knockBack = knockBack;
+ this.enchantments = enchantments;
this.addAttackerModifiers(damager);
}
@@ -46,6 +68,7 @@ protected void addAttackerModifiers(Entity damager) {
}
}
+ @Nonnull
public Entity getDamager() {
return damager;
}
@@ -57,4 +80,13 @@ public float getKnockBack() {
public void setKnockBack(float knockBack) {
this.knockBack = knockBack;
}
+
+ @Since("1.6.0.0-PN")
+ @Nullable
+ public Enchantment[] getWeaponEnchantments() {
+ if (enchantments == null) {
+ return null;
+ }
+ return enchantments.length > 0? enchantments.clone() : Enchantment.EMPTY_ARRAY;
+ }
}
diff --git a/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java b/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java
index 755555c8f32..4ca95ee2058 100644
--- a/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java
+++ b/src/main/java/cn/nukkit/event/entity/EntityDamageEvent.java
@@ -1,14 +1,18 @@
package cn.nukkit.event.entity;
+import cn.nukkit.api.PowerNukkitOnly;
+import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
+import cn.nukkit.item.enchantment.sideeffect.SideEffect;
import cn.nukkit.potion.Effect;
import cn.nukkit.utils.EventException;
import com.google.common.collect.ImmutableMap;
-import java.util.EnumMap;
-import java.util.Map;
+import javax.annotation.Nonnull;
+import java.util.*;
+import java.util.stream.Stream;
/**
* @author MagicDroidX (Nukkit Project)
@@ -26,12 +30,16 @@ public static HandlerList getHandlers() {
private final Map modifiers;
private final Map originals;
+ private SideEffect[] sideEffects = SideEffect.EMPTY_ARRAY;
+
+ private static Map createDamageModifierMap(float baseDamage) {
+ Map modifiers = new EnumMap<>(DamageModifier.class);
+ modifiers.put(DamageModifier.BASE, baseDamage);
+ return modifiers;
+ }
+
public EntityDamageEvent(Entity entity, DamageCause cause, float damage) {
- this(entity, cause, new EnumMap(DamageModifier.class) {
- {
- put(DamageModifier.BASE, damage);
- }
- });
+ this(entity, cause, createDamageModifierMap(damage));
}
public EntityDamageEvent(Entity entity, DamageCause cause, Map modifiers) {
@@ -45,8 +53,8 @@ public EntityDamageEvent(Entity entity, DamageCause cause, Map sideEffects) {
+ this.setSideEffects(sideEffects.toArray(SideEffect.EMPTY_ARRAY));
+ }
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public void addSideEffects(@Nonnull SideEffect... sideEffects) {
+ Stream safeStream = Arrays.stream(sideEffects)
+ .filter(Objects::nonNull)
+ .map(SideEffect::cloneSideEffect);
+
+ this.sideEffects = Stream.concat(Arrays.stream(this.sideEffects), safeStream).toArray(SideEffect[]::new);
+ }
+
+ @PowerNukkitOnly
+ @Since("1.5.1.0-PN")
+ public void addSideEffects(@Nonnull Collection sideEffects) {
+ this.addSideEffects(sideEffects.toArray(SideEffect.EMPTY_ARRAY));
+ }
+
public boolean canBeReducedByArmor() {
switch (this.cause) {
case FIRE_TICK:
@@ -223,6 +277,48 @@ public enum DamageCause {
/**
* Damage caused by hunger
*/
- HUNGER
+ HUNGER,
+ /**
+ * Damage caused by Wither
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ WITHER,
+ /**
+ * Damage caused by thorns
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ THORNS,
+ /**
+ * Damage caused by falling block
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ FALLING_BLOCK,
+ /**
+ * Damage caused by flying into wall
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ FLYING_INTO_WALL,
+ /**
+ * Damage caused when an entity steps on a hot block, like {@link cn.nukkit.block.BlockID#MAGMA}
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ HOT_FLOOR,
+ /**
+ * Damage caused by fireworks
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ FIREWORKS,
+ /**
+ * Damage caused by temperature
+ */
+ @PowerNukkitOnly
+ @Since("1.5.2.0-PN")
+ FREEZING,
}
}
diff --git a/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java b/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java
index a3f7d11b609..38909860459 100644
--- a/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java
+++ b/src/main/java/cn/nukkit/event/entity/EntityExplodeEvent.java
@@ -25,6 +25,7 @@ public static HandlerList getHandlers() {
protected final Position position;
protected List blocks;
+ @PowerNukkitOnly
protected Set ignitions;
protected double yield;
diff --git a/src/main/java/cn/nukkit/event/entity/EntityMoveByPistonEvent.java b/src/main/java/cn/nukkit/event/entity/EntityMoveByPistonEvent.java
index c97048f7ec9..31d19360692 100644
--- a/src/main/java/cn/nukkit/event/entity/EntityMoveByPistonEvent.java
+++ b/src/main/java/cn/nukkit/event/entity/EntityMoveByPistonEvent.java
@@ -1,10 +1,13 @@
package cn.nukkit.event.entity;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.math.Vector3;
+@PowerNukkitOnly
public class EntityMoveByPistonEvent extends EntityMotionEvent implements Cancellable {
+ @PowerNukkitOnly
public EntityMoveByPistonEvent(Entity entity, Vector3 pos) {
super(entity, pos);
}
diff --git a/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java b/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java
index 8b9b08c6036..7539c9d38e7 100644
--- a/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java
+++ b/src/main/java/cn/nukkit/event/entity/ProjectileLaunchEvent.java
@@ -16,6 +16,7 @@ public ProjectileLaunchEvent(EntityProjectile entity) {
this.entity = entity;
}
+ @Override
public EntityProjectile getEntity() {
return (EntityProjectile) this.entity;
}
diff --git a/src/main/java/cn/nukkit/event/inventory/CampfireSmeltEvent.java b/src/main/java/cn/nukkit/event/inventory/CampfireSmeltEvent.java
index ea03a7888ef..07563ecf826 100644
--- a/src/main/java/cn/nukkit/event/inventory/CampfireSmeltEvent.java
+++ b/src/main/java/cn/nukkit/event/inventory/CampfireSmeltEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.inventory;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.blockentity.BlockEntityCampfire;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
@@ -9,10 +10,12 @@
/**
* @author MagicDroidX (Nukkit Project)
*/
+@PowerNukkitOnly
public class CampfireSmeltEvent extends BlockEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
@@ -22,6 +25,7 @@ public static HandlerList getHandlers() {
private Item result;
private boolean keepItem;
+ @PowerNukkitOnly
public CampfireSmeltEvent(BlockEntityCampfire campfire, Item source, Item result) {
super(campfire.getBlock());
this.source = source.clone();
@@ -30,26 +34,32 @@ public CampfireSmeltEvent(BlockEntityCampfire campfire, Item source, Item result
this.campfire = campfire;
}
+ @PowerNukkitOnly
public BlockEntityCampfire getCampfire() {
return campfire;
}
+ @PowerNukkitOnly
public Item getSource() {
return source;
}
+ @PowerNukkitOnly
public Item getResult() {
return result;
}
+ @PowerNukkitOnly
public void setResult(Item result) {
this.result = result;
}
+ @PowerNukkitOnly
public boolean getKeepItem() {
return keepItem;
}
+ @PowerNukkitOnly
public void setKeepItem(boolean keepItem) {
this.keepItem = keepItem;
}
diff --git a/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java b/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java
index d724e7c5107..28b1abf45b1 100644
--- a/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java
+++ b/src/main/java/cn/nukkit/event/inventory/CraftItemEvent.java
@@ -32,7 +32,7 @@ public CraftItemEvent(CraftingTransaction transaction) {
this.player = transaction.getSource();
this.input = transaction.getInputList().toArray(Item.EMPTY_ARRAY);
- this.recipe = transaction.getRecipe();
+ this.recipe = transaction.getTransactionRecipe();
}
public CraftItemEvent(Player player, Item[] input, Recipe recipe) {
diff --git a/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java b/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java
index 411c7b2db87..9605cd10d6a 100644
--- a/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java
+++ b/src/main/java/cn/nukkit/event/inventory/EnchantItemEvent.java
@@ -6,11 +6,7 @@
import cn.nukkit.event.HandlerList;
import cn.nukkit.inventory.EnchantInventory;
import cn.nukkit.item.Item;
-import lombok.Getter;
-import lombok.Setter;
-@Getter
-@Setter
@Since("1.3.1.0-PN")
public class EnchantItemEvent extends InventoryEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -32,4 +28,44 @@ public EnchantItemEvent(EnchantInventory inventory, Item oldItem, Item newItem,
this.xpCost = cost;
this.enchanter = p;
}
+
+ @Since("1.3.1.0-PN")
+ public Item getOldItem() {
+ return oldItem;
+ }
+
+ @Since("1.3.1.0-PN")
+ public void setOldItem(Item oldItem) {
+ this.oldItem = oldItem;
+ }
+
+ @Since("1.3.1.0-PN")
+ public Item getNewItem() {
+ return newItem;
+ }
+
+ @Since("1.3.1.0-PN")
+ public void setNewItem(Item newItem) {
+ this.newItem = newItem;
+ }
+
+ @Since("1.3.1.0-PN")
+ public int getXpCost() {
+ return xpCost;
+ }
+
+ @Since("1.3.1.0-PN")
+ public void setXpCost(int xpCost) {
+ this.xpCost = xpCost;
+ }
+
+ @Since("1.3.1.0-PN")
+ public Player getEnchanter() {
+ return enchanter;
+ }
+
+ @Since("1.3.1.0-PN")
+ public void setEnchanter(Player enchanter) {
+ this.enchanter = enchanter;
+ }
}
diff --git a/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java
index e2487ab265d..69b2a337760 100644
--- a/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java
+++ b/src/main/java/cn/nukkit/event/player/PlayerBucketEmptyEvent.java
@@ -1,6 +1,7 @@
package cn.nukkit.event.player;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
@@ -13,6 +14,7 @@ public static HandlerList getHandlers() {
return handlers;
}
+ @PowerNukkitOnly
public PlayerBucketEmptyEvent(Player who, Block blockClicked, BlockFace blockFace, Block liquid, Item bucket, Item itemInHand) {
super(who, blockClicked, blockFace, liquid, bucket, itemInHand);
}
diff --git a/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java
index 22a5f434f44..652644b59da 100644
--- a/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java
+++ b/src/main/java/cn/nukkit/event/player/PlayerBucketEvent.java
@@ -1,6 +1,7 @@
package cn.nukkit.event.player;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.Cancellable;
import cn.nukkit.item.Item;
@@ -18,7 +19,7 @@ abstract class PlayerBucketEvent extends PlayerEvent implements Cancellable {
private Item item;
-
+ @PowerNukkitOnly
public PlayerBucketEvent(Player who, Block blockClicked, BlockFace blockFace, Block liquid, Item bucket, Item itemInHand) {
this.player = who;
this.blockClicked = blockClicked;
diff --git a/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java b/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java
index 1a327f420e6..4c6e5135fdc 100644
--- a/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java
+++ b/src/main/java/cn/nukkit/event/player/PlayerBucketFillEvent.java
@@ -1,6 +1,7 @@
package cn.nukkit.event.player;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.event.HandlerList;
import cn.nukkit.item.Item;
@@ -13,6 +14,7 @@ public static HandlerList getHandlers() {
return handlers;
}
+ @PowerNukkitOnly
public PlayerBucketFillEvent(Player who, Block blockClicked, BlockFace blockFace, Block liquid, Item bucket, Item itemInHand) {
super(who, blockClicked, blockFace, liquid, bucket, itemInHand);
}
diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleDamageByEntityEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleDamageByEntityEvent.java
index c928e70e1b6..6413d9234c0 100644
--- a/src/main/java/cn/nukkit/event/vehicle/VehicleDamageByEntityEvent.java
+++ b/src/main/java/cn/nukkit/event/vehicle/VehicleDamageByEntityEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.vehicle;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.item.EntityVehicle;
import cn.nukkit.event.Cancellable;
@@ -11,6 +12,7 @@
* @author TrainmasterHD
* @since 09.09.2019
*/
+@PowerNukkitOnly
public final class VehicleDamageByEntityEvent extends VehicleDamageEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
@@ -24,13 +26,14 @@ public final class VehicleDamageByEntityEvent extends VehicleDamageEvent impleme
* @param attacker the attacking vehicle
* @param damage the caused damage on the vehicle
*/
-
+ @PowerNukkitOnly
public VehicleDamageByEntityEvent(final EntityVehicle vehicle, final Entity attacker, final double damage) {
super(vehicle, damage);
this.attacker = attacker;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return handlers;
}
@@ -40,7 +43,7 @@ public static HandlerList getHandlers() {
*
* @return attacking entity
*/
-
+ @PowerNukkitOnly
public Entity getAttacker() {
return attacker;
}
diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java
index fffdabb2c5d..cecceebc478 100644
--- a/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java
+++ b/src/main/java/cn/nukkit/event/vehicle/VehicleDamageEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.vehicle;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.entity.item.EntityVehicle;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
@@ -20,6 +21,7 @@ public class VehicleDamageEvent extends VehicleEvent implements Cancellable {
* @param damage the caused damage on the vehicle
*/
+ @PowerNukkitOnly
public VehicleDamageEvent(final EntityVehicle vehicle, final double damage) {
super(vehicle);
diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyByEntityEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyByEntityEvent.java
index 436c14e314f..3f0bd8de12f 100644
--- a/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyByEntityEvent.java
+++ b/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyByEntityEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.vehicle;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
@@ -10,6 +11,7 @@
* @author TrainmasterHD
* @since 09.09.2019
*/
+@PowerNukkitOnly
public final class VehicleDestroyByEntityEvent extends VehicleDestroyEvent implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
@@ -22,13 +24,14 @@ public final class VehicleDestroyByEntityEvent extends VehicleDestroyEvent imple
* @param vehicle the destroyed vehicle
* @param destroyer the destroying entity
*/
-
+ @PowerNukkitOnly
public VehicleDestroyByEntityEvent(final Entity vehicle, final Entity destroyer) {
super(vehicle);
this.destroyer = destroyer;
}
+ @PowerNukkitOnly
public static HandlerList getHandlers() {
return HANDLER_LIST;
}
@@ -38,7 +41,7 @@ public static HandlerList getHandlers() {
*
* @return destroying entity
*/
-
+ @PowerNukkitOnly
public Entity getDestroyer() {
return destroyer;
}
diff --git a/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java b/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java
index 6b866b79e2c..ddd9cda5e53 100644
--- a/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java
+++ b/src/main/java/cn/nukkit/event/vehicle/VehicleDestroyEvent.java
@@ -1,5 +1,6 @@
package cn.nukkit.event.vehicle;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.Cancellable;
import cn.nukkit.event.HandlerList;
@@ -17,6 +18,7 @@ public class VehicleDestroyEvent extends VehicleEvent implements Cancellable {
* @param vehicle the destroyed vehicle
*/
+ @PowerNukkitOnly
public VehicleDestroyEvent(final Entity vehicle) {
super(vehicle);
}
diff --git a/src/main/java/cn/nukkit/form/window/FormWindowCustom.java b/src/main/java/cn/nukkit/form/window/FormWindowCustom.java
index 1a0880329f6..6c7ca263a65 100644
--- a/src/main/java/cn/nukkit/form/window/FormWindowCustom.java
+++ b/src/main/java/cn/nukkit/form/window/FormWindowCustom.java
@@ -65,10 +65,12 @@ public void setIcon(ElementButtonImageData icon) {
this.icon = icon;
}
+ @Override
public FormResponseCustom getResponse() {
return response;
}
+ @Override
public void setResponse(String data) {
if (data.equals("null")) {
this.closed = true;
diff --git a/src/main/java/cn/nukkit/form/window/FormWindowModal.java b/src/main/java/cn/nukkit/form/window/FormWindowModal.java
index 9eb7e95c2ce..7aaa4aa7a72 100644
--- a/src/main/java/cn/nukkit/form/window/FormWindowModal.java
+++ b/src/main/java/cn/nukkit/form/window/FormWindowModal.java
@@ -51,10 +51,12 @@ public void setButton2(String button2) {
this.button2 = button2;
}
+ @Override
public FormResponseModal getResponse() {
return response;
}
+ @Override
public void setResponse(String data) {
if (data.equals("null")) {
closed = true;
diff --git a/src/main/java/cn/nukkit/form/window/FormWindowSimple.java b/src/main/java/cn/nukkit/form/window/FormWindowSimple.java
index 0b7ff67ef2e..7c5ca39b7aa 100644
--- a/src/main/java/cn/nukkit/form/window/FormWindowSimple.java
+++ b/src/main/java/cn/nukkit/form/window/FormWindowSimple.java
@@ -49,10 +49,12 @@ public void addButton(ElementButton button) {
this.buttons.add(button);
}
+ @Override
public FormResponseSimple getResponse() {
return response;
}
+ @Override
public void setResponse(String data) {
if (data.equals("null")) {
this.closed = true;
diff --git a/src/main/java/cn/nukkit/inventory/AnvilInventory.java b/src/main/java/cn/nukkit/inventory/AnvilInventory.java
index 9d7418f8fd0..c25f1c9c67a 100644
--- a/src/main/java/cn/nukkit/inventory/AnvilInventory.java
+++ b/src/main/java/cn/nukkit/inventory/AnvilInventory.java
@@ -4,7 +4,6 @@
import cn.nukkit.api.DeprecationDetails;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
-import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.item.Item;
import cn.nukkit.item.ItemID;
@@ -59,6 +58,7 @@ public void onSlotChange(int index, Item before, boolean send) {
@Deprecated
@DeprecationDetails(since = "1.4.0.0-PN", by = "PowerNukkit", reason = "Experimenting the new implementation by Nukkit")
+ @PowerNukkitOnly
public void updateResult() {
Item target = getFirstItem();
Item sacrifice = getSecondItem();
diff --git a/src/main/java/cn/nukkit/inventory/BarrelInventory.java b/src/main/java/cn/nukkit/inventory/BarrelInventory.java
index c9c3dfae9f2..bd080d42133 100644
--- a/src/main/java/cn/nukkit/inventory/BarrelInventory.java
+++ b/src/main/java/cn/nukkit/inventory/BarrelInventory.java
@@ -1,14 +1,17 @@
package cn.nukkit.inventory;
import cn.nukkit.Player;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockBarrel;
import cn.nukkit.blockentity.BlockEntityBarrel;
import cn.nukkit.level.Level;
import cn.nukkit.level.Sound;
+@PowerNukkitOnly
public class BarrelInventory extends ContainerInventory {
+ @PowerNukkitOnly
public BarrelInventory(BlockEntityBarrel barrel) {
super(barrel, InventoryType.BARREL);
}
diff --git a/src/main/java/cn/nukkit/inventory/BaseInventory.java b/src/main/java/cn/nukkit/inventory/BaseInventory.java
index e5ba0d467aa..2b357b328be 100644
--- a/src/main/java/cn/nukkit/inventory/BaseInventory.java
+++ b/src/main/java/cn/nukkit/inventory/BaseInventory.java
@@ -2,6 +2,7 @@
import cn.nukkit.Player;
import cn.nukkit.Server;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.block.Block;
import cn.nukkit.block.BlockID;
import cn.nukkit.blockentity.BlockEntity;
@@ -579,6 +580,7 @@ public void sendSlot(int index, Collection players) {
this.sendSlot(index, players.toArray(Player.EMPTY_ARRAY));
}
+ @PowerNukkitOnly
@Override
public void addListener(InventoryListener listener) {
if (this.listeners == null) {
@@ -588,6 +590,7 @@ public void addListener(InventoryListener listener) {
this.listeners.add(listener);
}
+ @PowerNukkitOnly
@Override
public void removeListener(InventoryListener listener) {
if (this.listeners != null) {
diff --git a/src/main/java/cn/nukkit/inventory/BlastFurnaceRecipe.java b/src/main/java/cn/nukkit/inventory/BlastFurnaceRecipe.java
index a7ac6b7c0fd..251651b469b 100644
--- a/src/main/java/cn/nukkit/inventory/BlastFurnaceRecipe.java
+++ b/src/main/java/cn/nukkit/inventory/BlastFurnaceRecipe.java
@@ -1,22 +1,27 @@
package cn.nukkit.inventory;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.item.Item;
+@PowerNukkitOnly
public class BlastFurnaceRecipe implements SmeltingRecipe {
private final Item output;
private Item ingredient;
+ @PowerNukkitOnly
public BlastFurnaceRecipe(Item result, Item ingredient) {
this.output = result.clone();
this.ingredient = ingredient.clone();
}
+ @PowerNukkitOnly
public void setInput(Item item) {
this.ingredient = item.clone();
}
+ @PowerNukkitOnly
@Override
public Item getInput() {
return this.ingredient.clone();
diff --git a/src/main/java/cn/nukkit/inventory/CampfireInventory.java b/src/main/java/cn/nukkit/inventory/CampfireInventory.java
index 8eb4f1c4168..1910344490c 100644
--- a/src/main/java/cn/nukkit/inventory/CampfireInventory.java
+++ b/src/main/java/cn/nukkit/inventory/CampfireInventory.java
@@ -1,14 +1,18 @@
package cn.nukkit.inventory;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.blockentity.BlockEntityCampfire;
import cn.nukkit.item.Item;
+@PowerNukkitOnly
public class CampfireInventory extends ContainerInventory {
+ @PowerNukkitOnly
public CampfireInventory(BlockEntityCampfire campfire) {
super(campfire, InventoryType.CAMPFIRE);
}
+ @PowerNukkitOnly
public CampfireInventory(BlockEntityCampfire furnace, InventoryType inventoryType) {
super(furnace, inventoryType);
}
diff --git a/src/main/java/cn/nukkit/inventory/CampfireRecipe.java b/src/main/java/cn/nukkit/inventory/CampfireRecipe.java
index 235ec906c7a..cd51e046280 100644
--- a/src/main/java/cn/nukkit/inventory/CampfireRecipe.java
+++ b/src/main/java/cn/nukkit/inventory/CampfireRecipe.java
@@ -1,22 +1,27 @@
package cn.nukkit.inventory;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.item.Item;
+@PowerNukkitOnly
public class CampfireRecipe implements SmeltingRecipe {
private final Item output;
private Item ingredient;
+ @PowerNukkitOnly
public CampfireRecipe(Item result, Item ingredient) {
this.output = result.clone();
this.ingredient = ingredient.clone();
}
+ @PowerNukkitOnly
public void setInput(Item item) {
this.ingredient = item.clone();
}
+ @PowerNukkitOnly
@Override
public Item getInput() {
return this.ingredient.clone();
diff --git a/src/main/java/cn/nukkit/inventory/CartographyRecipe.java b/src/main/java/cn/nukkit/inventory/CartographyRecipe.java
index 1ba2d41e7ad..a038cb5ecb4 100644
--- a/src/main/java/cn/nukkit/inventory/CartographyRecipe.java
+++ b/src/main/java/cn/nukkit/inventory/CartographyRecipe.java
@@ -1,14 +1,18 @@
package cn.nukkit.inventory;
+import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.item.Item;
import java.util.Collection;
+@PowerNukkitOnly
public class CartographyRecipe extends ShapelessRecipe {
+ @PowerNukkitOnly
public CartographyRecipe(Item result, Collection- ingredients) {
super(result, ingredients);
}
-
+
+ @PowerNukkitOnly
public CartographyRecipe(String recipeId, int priority, Item result, Collection
- ingredients) {
super(recipeId, priority, result, ingredients);
}
diff --git a/src/main/java/cn/nukkit/inventory/CraftingManager.java b/src/main/java/cn/nukkit/inventory/CraftingManager.java
index a7b1ac6bc2e..6098b7afa00 100644
--- a/src/main/java/cn/nukkit/inventory/CraftingManager.java
+++ b/src/main/java/cn/nukkit/inventory/CraftingManager.java
@@ -5,6 +5,7 @@
import cn.nukkit.api.Since;
import cn.nukkit.block.BlockID;
import cn.nukkit.block.BlockUnknown;
+import cn.nukkit.blockproperty.UnknownRuntimeIdException;
import cn.nukkit.blockproperty.exception.BlockPropertyNotFoundException;
import cn.nukkit.blockstate.BlockState;
import cn.nukkit.blockstate.BlockStateRegistry;
@@ -27,8 +28,11 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
+import java.io.UncheckedIOException;
import java.util.*;
+import java.util.stream.Stream;
import java.util.zip.Deflater;
/**
@@ -41,25 +45,31 @@ public class CraftingManager {
@Since("1.5.0.0-PN")
public static DataPacket packet = null;
-
-
+
+
protected final Map> shapedRecipes = new Int2ObjectOpenHashMap<>();
public final Map furnaceRecipes = new Int2ObjectOpenHashMap<>();
+ @PowerNukkitOnly
public final Map blastFurnaceRecipes = new Int2ObjectOpenHashMap<>();
+ @PowerNukkitOnly
public final Map smokerRecipes = new Int2ObjectOpenHashMap<>();
+ @PowerNukkitOnly
public final Map campfireRecipes = new Int2ObjectOpenHashMap<>();
- @Since("1.4.0.0-PN") public final Map multiRecipes = new HashMap<>();
+ @Since("1.4.0.0-PN")
+ public final Map multiRecipes = new HashMap<>();
public final Map brewingRecipes = new Int2ObjectOpenHashMap<>();
public final Map containerRecipes = new Int2ObjectOpenHashMap<>();
+ @PowerNukkitOnly
public final Map stonecutterRecipes = new Int2ObjectOpenHashMap<>();
private static int RECIPE_COUNT = 0;
protected final Map> shapelessRecipes = new Int2ObjectOpenHashMap<>();
+ @PowerNukkitOnly
protected final Map> cartographyRecipes = new Int2ObjectOpenHashMap<>();
-
+
private final Int2ObjectOpenHashMap