mirror of https://github.com/GeyserMC/Geyser.git
Merge branch 'master' into dependencies
This commit is contained in:
commit
1b94d3b86e
|
@ -64,6 +64,14 @@ public interface NonVanillaCustomItemData extends CustomItemData {
|
|||
*/
|
||||
int maxDamage();
|
||||
|
||||
/**
|
||||
* Gets the attack damage of the item.
|
||||
* This is purely visual, and only applied to tools
|
||||
*
|
||||
* @return the attack damage of the item
|
||||
*/
|
||||
int attackDamage();
|
||||
|
||||
/**
|
||||
* Gets the tool type of the item.
|
||||
*
|
||||
|
@ -169,6 +177,8 @@ public interface NonVanillaCustomItemData extends CustomItemData {
|
|||
|
||||
Builder maxDamage(int maxDamage);
|
||||
|
||||
Builder attackDamage(int attackDamage);
|
||||
|
||||
Builder toolType(@Nullable String toolType);
|
||||
|
||||
Builder toolTier(@Nullable String toolTier);
|
||||
|
|
|
@ -26,10 +26,13 @@
|
|||
package org.geysermc.geyser.inventory;
|
||||
|
||||
import com.github.steveice10.mc.protocol.data.game.inventory.ContainerType;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.cloudburstmc.math.vector.Vector3i;
|
||||
import org.cloudburstmc.nbt.NbtMap;
|
||||
import org.geysermc.geyser.session.GeyserSession;
|
||||
import org.geysermc.geyser.translator.protocol.java.inventory.JavaOpenBookTranslator;
|
||||
|
||||
public class LecternContainer extends Container {
|
||||
@Getter @Setter
|
||||
|
@ -39,7 +42,34 @@ public class LecternContainer extends Container {
|
|||
@Getter @Setter
|
||||
private Vector3i position;
|
||||
|
||||
// Sigh. When the lectern container is created, we don't know (yet) if it's fake or not.
|
||||
// So... time for a manual check :/
|
||||
@Getter
|
||||
private boolean isFakeLectern = false;
|
||||
|
||||
public LecternContainer(String title, int id, int size, ContainerType containerType, PlayerInventory playerInventory) {
|
||||
super(title, id, size, containerType, playerInventory);
|
||||
}
|
||||
|
||||
/**
|
||||
* When we are using a fake lectern, the Java server expects us to still be in a player inventory.
|
||||
* We can't use {@link #isUsingRealBlock()} as that may not be determined yet.
|
||||
*/
|
||||
@Override
|
||||
public void setItem(int slot, @NonNull GeyserItemStack newItem, GeyserSession session) {
|
||||
if (isFakeLectern) {
|
||||
session.getPlayerInventory().setItem(slot, newItem, session);
|
||||
} else {
|
||||
super.setItem(slot, newItem, session);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used ONLY once to set the book of a fake lectern in {@link JavaOpenBookTranslator}.
|
||||
* See {@link LecternContainer#setItem(int, GeyserItemStack, GeyserSession)} as for why this is separate.
|
||||
*/
|
||||
public void setFakeLecternBook(GeyserItemStack book, GeyserSession session) {
|
||||
this.isFakeLectern = true;
|
||||
super.setItem(0, book, session);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ public final class GeyserNonVanillaCustomItemData extends GeyserCustomItemData i
|
|||
private final int javaId;
|
||||
private final int stackSize;
|
||||
private final int maxDamage;
|
||||
private final int attackDamage;
|
||||
private final String toolType;
|
||||
private final String toolTier;
|
||||
private final String armorType;
|
||||
|
@ -64,6 +65,7 @@ public final class GeyserNonVanillaCustomItemData extends GeyserCustomItemData i
|
|||
this.javaId = builder.javaId;
|
||||
this.stackSize = builder.stackSize;
|
||||
this.maxDamage = builder.maxDamage;
|
||||
this.attackDamage = builder.attackDamage;
|
||||
this.toolType = builder.toolType;
|
||||
this.toolTier = builder.toolTier;
|
||||
this.armorType = builder.armorType;
|
||||
|
@ -98,6 +100,11 @@ public final class GeyserNonVanillaCustomItemData extends GeyserCustomItemData i
|
|||
return maxDamage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackDamage() {
|
||||
return attackDamage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toolType() {
|
||||
return toolType;
|
||||
|
@ -161,6 +168,8 @@ public final class GeyserNonVanillaCustomItemData extends GeyserCustomItemData i
|
|||
|
||||
private int maxDamage = 0;
|
||||
|
||||
private int attackDamage = 0;
|
||||
|
||||
private String toolType = null;
|
||||
private String toolTier = null;
|
||||
|
||||
|
@ -248,6 +257,12 @@ public final class GeyserNonVanillaCustomItemData extends GeyserCustomItemData i
|
|||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NonVanillaCustomItemData.Builder attackDamage(int attackDamage) {
|
||||
this.attackDamage = attackDamage;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Builder toolType(@Nullable String toolType) {
|
||||
this.toolType = toolType;
|
||||
|
|
|
@ -852,36 +852,36 @@ public final class Items {
|
|||
public static final Item GOLD_INGOT = register(new Item("gold_ingot", builder()));
|
||||
public static final Item NETHERITE_INGOT = register(new Item("netherite_ingot", builder()));
|
||||
public static final Item NETHERITE_SCRAP = register(new Item("netherite_scrap", builder()));
|
||||
public static final Item WOODEN_SWORD = register(new TieredItem("wooden_sword", ToolTier.WOODEN, builder().stackSize(1).maxDamage(59)));
|
||||
public static final Item WOODEN_SHOVEL = register(new TieredItem("wooden_shovel", ToolTier.WOODEN, builder().stackSize(1).maxDamage(59)));
|
||||
public static final Item WOODEN_PICKAXE = register(new TieredItem("wooden_pickaxe", ToolTier.WOODEN, builder().stackSize(1).maxDamage(59)));
|
||||
public static final Item WOODEN_AXE = register(new TieredItem("wooden_axe", ToolTier.WOODEN, builder().stackSize(1).maxDamage(59)));
|
||||
public static final Item WOODEN_HOE = register(new TieredItem("wooden_hoe", ToolTier.WOODEN, builder().stackSize(1).maxDamage(59)));
|
||||
public static final Item STONE_SWORD = register(new TieredItem("stone_sword", ToolTier.STONE, builder().stackSize(1).maxDamage(131)));
|
||||
public static final Item STONE_SHOVEL = register(new TieredItem("stone_shovel", ToolTier.STONE, builder().stackSize(1).maxDamage(131)));
|
||||
public static final Item STONE_PICKAXE = register(new TieredItem("stone_pickaxe", ToolTier.STONE, builder().stackSize(1).maxDamage(131)));
|
||||
public static final Item STONE_AXE = register(new TieredItem("stone_axe", ToolTier.STONE, builder().stackSize(1).maxDamage(131)));
|
||||
public static final Item STONE_HOE = register(new TieredItem("stone_hoe", ToolTier.STONE, builder().stackSize(1).maxDamage(131)));
|
||||
public static final Item GOLDEN_SWORD = register(new TieredItem("golden_sword", ToolTier.GOLDEN, builder().stackSize(1).maxDamage(32)));
|
||||
public static final Item GOLDEN_SHOVEL = register(new TieredItem("golden_shovel", ToolTier.GOLDEN, builder().stackSize(1).maxDamage(32)));
|
||||
public static final Item GOLDEN_PICKAXE = register(new TieredItem("golden_pickaxe", ToolTier.GOLDEN, builder().stackSize(1).maxDamage(32)));
|
||||
public static final Item GOLDEN_AXE = register(new TieredItem("golden_axe", ToolTier.GOLDEN, builder().stackSize(1).maxDamage(32)));
|
||||
public static final Item GOLDEN_HOE = register(new TieredItem("golden_hoe", ToolTier.GOLDEN, builder().stackSize(1).maxDamage(32)));
|
||||
public static final Item IRON_SWORD = register(new TieredItem("iron_sword", ToolTier.IRON, builder().stackSize(1).maxDamage(250)));
|
||||
public static final Item IRON_SHOVEL = register(new TieredItem("iron_shovel", ToolTier.IRON, builder().stackSize(1).maxDamage(250)));
|
||||
public static final Item IRON_PICKAXE = register(new TieredItem("iron_pickaxe", ToolTier.IRON, builder().stackSize(1).maxDamage(250)));
|
||||
public static final Item IRON_AXE = register(new TieredItem("iron_axe", ToolTier.IRON, builder().stackSize(1).maxDamage(250)));
|
||||
public static final Item IRON_HOE = register(new TieredItem("iron_hoe", ToolTier.IRON, builder().stackSize(1).maxDamage(250)));
|
||||
public static final Item DIAMOND_SWORD = register(new TieredItem("diamond_sword", ToolTier.DIAMOND, builder().stackSize(1).maxDamage(1561)));
|
||||
public static final Item DIAMOND_SHOVEL = register(new TieredItem("diamond_shovel", ToolTier.DIAMOND, builder().stackSize(1).maxDamage(1561)));
|
||||
public static final Item DIAMOND_PICKAXE = register(new TieredItem("diamond_pickaxe", ToolTier.DIAMOND, builder().stackSize(1).maxDamage(1561)));
|
||||
public static final Item DIAMOND_AXE = register(new TieredItem("diamond_axe", ToolTier.DIAMOND, builder().stackSize(1).maxDamage(1561)));
|
||||
public static final Item DIAMOND_HOE = register(new TieredItem("diamond_hoe", ToolTier.DIAMOND, builder().stackSize(1).maxDamage(1561)));
|
||||
public static final Item NETHERITE_SWORD = register(new TieredItem("netherite_sword", ToolTier.NETHERITE, builder().stackSize(1).maxDamage(2031)));
|
||||
public static final Item NETHERITE_SHOVEL = register(new TieredItem("netherite_shovel", ToolTier.NETHERITE, builder().stackSize(1).maxDamage(2031)));
|
||||
public static final Item NETHERITE_PICKAXE = register(new TieredItem("netherite_pickaxe", ToolTier.NETHERITE, builder().stackSize(1).maxDamage(2031)));
|
||||
public static final Item NETHERITE_AXE = register(new TieredItem("netherite_axe", ToolTier.NETHERITE, builder().stackSize(1).maxDamage(2031)));
|
||||
public static final Item NETHERITE_HOE = register(new TieredItem("netherite_hoe", ToolTier.NETHERITE, builder().stackSize(1).maxDamage(2031)));
|
||||
public static final Item WOODEN_SWORD = register(new TieredItem("wooden_sword", ToolTier.WOODEN, builder().stackSize(1).attackDamage(4).maxDamage(59)));
|
||||
public static final Item WOODEN_SHOVEL = register(new TieredItem("wooden_shovel", ToolTier.WOODEN, builder().stackSize(1).attackDamage(2.5).maxDamage(59)));
|
||||
public static final Item WOODEN_PICKAXE = register(new TieredItem("wooden_pickaxe", ToolTier.WOODEN, builder().stackSize(1).attackDamage(2).maxDamage(59)));
|
||||
public static final Item WOODEN_AXE = register(new TieredItem("wooden_axe", ToolTier.WOODEN, builder().stackSize(1).attackDamage(7).maxDamage(59)));
|
||||
public static final Item WOODEN_HOE = register(new TieredItem("wooden_hoe", ToolTier.WOODEN, builder().stackSize(1).attackDamage(1).maxDamage(59)));
|
||||
public static final Item STONE_SWORD = register(new TieredItem("stone_sword", ToolTier.STONE, builder().stackSize(1).attackDamage(5).maxDamage(131)));
|
||||
public static final Item STONE_SHOVEL = register(new TieredItem("stone_shovel", ToolTier.STONE, builder().stackSize(1).attackDamage(3.5).maxDamage(131)));
|
||||
public static final Item STONE_PICKAXE = register(new TieredItem("stone_pickaxe", ToolTier.STONE, builder().stackSize(1).attackDamage(3).maxDamage(131)));
|
||||
public static final Item STONE_AXE = register(new TieredItem("stone_axe", ToolTier.STONE, builder().stackSize(1).attackDamage(9).maxDamage(131)));
|
||||
public static final Item STONE_HOE = register(new TieredItem("stone_hoe", ToolTier.STONE, builder().stackSize(1).attackDamage(1).maxDamage(131)));
|
||||
public static final Item GOLDEN_SWORD = register(new TieredItem("golden_sword", ToolTier.GOLDEN, builder().stackSize(1).attackDamage(4).maxDamage(32)));
|
||||
public static final Item GOLDEN_SHOVEL = register(new TieredItem("golden_shovel", ToolTier.GOLDEN, builder().stackSize(1).attackDamage(2.5).maxDamage(32)));
|
||||
public static final Item GOLDEN_PICKAXE = register(new TieredItem("golden_pickaxe", ToolTier.GOLDEN, builder().stackSize(1).attackDamage(2).maxDamage(32)));
|
||||
public static final Item GOLDEN_AXE = register(new TieredItem("golden_axe", ToolTier.GOLDEN, builder().stackSize(1).attackDamage(7).maxDamage(32)));
|
||||
public static final Item GOLDEN_HOE = register(new TieredItem("golden_hoe", ToolTier.GOLDEN, builder().stackSize(1).attackDamage(1).maxDamage(32)));
|
||||
public static final Item IRON_SWORD = register(new TieredItem("iron_sword", ToolTier.IRON, builder().stackSize(1).attackDamage(6).maxDamage(250)));
|
||||
public static final Item IRON_SHOVEL = register(new TieredItem("iron_shovel", ToolTier.IRON, builder().stackSize(1).attackDamage(4.5).maxDamage(250)));
|
||||
public static final Item IRON_PICKAXE = register(new TieredItem("iron_pickaxe", ToolTier.IRON, builder().stackSize(1).attackDamage(4).maxDamage(250)));
|
||||
public static final Item IRON_AXE = register(new TieredItem("iron_axe", ToolTier.IRON, builder().stackSize(1).attackDamage(9).maxDamage(250)));
|
||||
public static final Item IRON_HOE = register(new TieredItem("iron_hoe", ToolTier.IRON, builder().stackSize(1).attackDamage(1).maxDamage(250)));
|
||||
public static final Item DIAMOND_SWORD = register(new TieredItem("diamond_sword", ToolTier.DIAMOND, builder().stackSize(1).attackDamage(7).maxDamage(1561)));
|
||||
public static final Item DIAMOND_SHOVEL = register(new TieredItem("diamond_shovel", ToolTier.DIAMOND, builder().stackSize(1).attackDamage(5.5).maxDamage(1561)));
|
||||
public static final Item DIAMOND_PICKAXE = register(new TieredItem("diamond_pickaxe", ToolTier.DIAMOND, builder().stackSize(1).attackDamage(5).maxDamage(1561)));
|
||||
public static final Item DIAMOND_AXE = register(new TieredItem("diamond_axe", ToolTier.DIAMOND, builder().stackSize(1).attackDamage(9).maxDamage(1561)));
|
||||
public static final Item DIAMOND_HOE = register(new TieredItem("diamond_hoe", ToolTier.DIAMOND, builder().stackSize(1).attackDamage(1).maxDamage(1561)));
|
||||
public static final Item NETHERITE_SWORD = register(new TieredItem("netherite_sword", ToolTier.NETHERITE, builder().stackSize(1).attackDamage(8).maxDamage(2031)));
|
||||
public static final Item NETHERITE_SHOVEL = register(new TieredItem("netherite_shovel", ToolTier.NETHERITE, builder().stackSize(1).attackDamage(6.5).maxDamage(2031)));
|
||||
public static final Item NETHERITE_PICKAXE = register(new TieredItem("netherite_pickaxe", ToolTier.NETHERITE, builder().stackSize(1).attackDamage(6).maxDamage(2031)));
|
||||
public static final Item NETHERITE_AXE = register(new TieredItem("netherite_axe", ToolTier.NETHERITE, builder().stackSize(1).attackDamage(10).maxDamage(2031)));
|
||||
public static final Item NETHERITE_HOE = register(new TieredItem("netherite_hoe", ToolTier.NETHERITE, builder().stackSize(1).attackDamage(1).maxDamage(2031)));
|
||||
public static final Item STICK = register(new Item("stick", builder()));
|
||||
public static final Item BOWL = register(new Item("bowl", builder()));
|
||||
public static final Item MUSHROOM_STEW = register(new Item("mushroom_stew", builder().stackSize(1)));
|
||||
|
@ -1216,7 +1216,7 @@ public final class Items {
|
|||
public static final Item MUSIC_DISC_5 = register(new Item("music_disc_5", builder().stackSize(1)));
|
||||
public static final Item MUSIC_DISC_PIGSTEP = register(new Item("music_disc_pigstep", builder().stackSize(1)));
|
||||
public static final Item DISC_FRAGMENT_5 = register(new Item("disc_fragment_5", builder()));
|
||||
public static final Item TRIDENT = register(new Item("trident", builder().stackSize(1).maxDamage(250)));
|
||||
public static final Item TRIDENT = register(new Item("trident", builder().stackSize(1).attackDamage(9).maxDamage(250)));
|
||||
public static final Item PHANTOM_MEMBRANE = register(new Item("phantom_membrane", builder()));
|
||||
public static final Item NAUTILUS_SHELL = register(new Item("nautilus_shell", builder()));
|
||||
public static final Item HEART_OF_THE_SEA = register(new Item("heart_of_the_sea", builder()));
|
||||
|
|
|
@ -53,10 +53,6 @@ public enum ToolTier {
|
|||
this.repairIngredients = Suppliers.memoize(repairIngredients::get);
|
||||
}
|
||||
|
||||
public int getSpeed() {
|
||||
return speed;
|
||||
}
|
||||
|
||||
public Set<Item> getRepairIngredients() {
|
||||
return repairIngredients.get();
|
||||
}
|
||||
|
|
|
@ -50,14 +50,14 @@ public class Item {
|
|||
private final String javaIdentifier;
|
||||
private int javaId = -1;
|
||||
private final int stackSize;
|
||||
private final String toolType;
|
||||
private final int attackDamage;
|
||||
private final int maxDamage;
|
||||
|
||||
public Item(String javaIdentifier, Builder builder) {
|
||||
this.javaIdentifier = Identifier.formalize(javaIdentifier).intern();
|
||||
this.stackSize = builder.stackSize;
|
||||
this.toolType = builder.toolType;
|
||||
this.maxDamage = builder.maxDamage;
|
||||
this.attackDamage = builder.attackDamage;
|
||||
}
|
||||
|
||||
public String javaIdentifier() {
|
||||
|
@ -72,6 +72,10 @@ public class Item {
|
|||
return maxDamage;
|
||||
}
|
||||
|
||||
public int attackDamage() {
|
||||
return attackDamage;
|
||||
}
|
||||
|
||||
public int maxStackSize() {
|
||||
return stackSize;
|
||||
}
|
||||
|
@ -279,16 +283,17 @@ public class Item {
|
|||
|
||||
public static final class Builder {
|
||||
private int stackSize = 64;
|
||||
private String toolType;
|
||||
private int maxDamage;
|
||||
private int attackDamage;
|
||||
|
||||
public Builder stackSize(int stackSize) {
|
||||
this.stackSize = stackSize;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setToolType(String toolType) {
|
||||
this.toolType = toolType;
|
||||
public Builder attackDamage(double attackDamage) {
|
||||
// TODO properly store/send a double value once Bedrock supports it.. pls
|
||||
this.attackDamage = (int) attackDamage;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,18 +31,18 @@ import io.netty.channel.ChannelFuture;
|
|||
import io.netty.channel.epoll.Native;
|
||||
import io.netty.channel.unix.UnixChannelOption;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.geysermc.geyser.GeyserImpl;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
|
||||
@UtilityClass
|
||||
public final class Bootstraps {
|
||||
private static final Optional<int[]> KERNEL_VERSION;
|
||||
|
||||
// The REUSEPORT_AVAILABLE socket option is available starting from kernel version 3.9.
|
||||
// This option allows multiple sockets to listen on the same IP address and port without conflict.
|
||||
private static final int[] REUSEPORT_VERSION = new int[]{3, 9, 0};
|
||||
private static final int[] REUSEPORT_VERSION = new int[]{3, 9};
|
||||
private static final boolean REUSEPORT_AVAILABLE;
|
||||
|
||||
static {
|
||||
|
@ -50,24 +50,16 @@ public final class Bootstraps {
|
|||
try {
|
||||
kernelVersion = Native.KERNEL_VERSION;
|
||||
} catch (Throwable e) {
|
||||
GeyserImpl.getInstance().getLogger().debug("Could not determine kernel version! " + e.getMessage());
|
||||
kernelVersion = null;
|
||||
}
|
||||
if (kernelVersion != null && kernelVersion.contains("-")) {
|
||||
int index = kernelVersion.indexOf('-');
|
||||
if (index > -1) {
|
||||
kernelVersion = kernelVersion.substring(0, index);
|
||||
}
|
||||
int[] kernelVer = fromString(kernelVersion);
|
||||
KERNEL_VERSION = Optional.of(kernelVer);
|
||||
REUSEPORT_AVAILABLE = checkVersion(kernelVer, 0);
|
||||
} else {
|
||||
KERNEL_VERSION = Optional.empty();
|
||||
REUSEPORT_AVAILABLE = false;
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<int[]> getKernelVersion() {
|
||||
return KERNEL_VERSION;
|
||||
if (kernelVersion == null) {
|
||||
REUSEPORT_AVAILABLE = false;
|
||||
} else {
|
||||
int[] kernelVer = fromString(kernelVersion);
|
||||
REUSEPORT_AVAILABLE = checkVersion(kernelVer, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isReusePortAvailable() {
|
||||
|
@ -81,17 +73,19 @@ public final class Bootstraps {
|
|||
}
|
||||
}
|
||||
|
||||
private static int[] fromString(String ver) {
|
||||
String[] parts = ver.split("\\.");
|
||||
if (parts.length < 2) {
|
||||
throw new IllegalArgumentException("At least 2 version numbers required");
|
||||
private static int[] fromString(String input) {
|
||||
// Match only beginning of string for at least two digits separated by dot
|
||||
Pattern pattern = Pattern.compile("^(\\d+)\\.(\\d+)");
|
||||
Matcher matcher = pattern.matcher(input);
|
||||
|
||||
int[] version = {0, 0};
|
||||
|
||||
if (matcher.find()) {
|
||||
version[0] = Integer.parseInt(matcher.group(1));
|
||||
version[1] = Integer.parseInt(matcher.group(2));
|
||||
}
|
||||
|
||||
return new int[]{
|
||||
Integer.parseInt(parts[0]),
|
||||
Integer.parseInt(parts[1]),
|
||||
parts.length == 2 ? 0 : Integer.parseInt(parts[2])
|
||||
};
|
||||
return version;
|
||||
}
|
||||
|
||||
private static boolean checkVersion(int[] ver, int i) {
|
||||
|
|
|
@ -153,7 +153,7 @@ public class CustomItemRegistryPopulator {
|
|||
.build();
|
||||
|
||||
NbtMapBuilder builder = createComponentNbt(customItemData, customItemData.identifier(), customItemId,
|
||||
customItemData.creativeCategory(), customItemData.creativeGroup(), customItemData.isHat(), customItemData.displayHandheld(), protocolVersion);
|
||||
customItemData.isHat(), customItemData.displayHandheld(), protocolVersion);
|
||||
ComponentItemData componentItemData = new ComponentItemData(customIdentifier, builder.build());
|
||||
|
||||
return new NonVanillaItemRegistration(componentItemData, item, customItemMapping);
|
||||
|
@ -172,7 +172,7 @@ public class CustomItemRegistryPopulator {
|
|||
|
||||
boolean canDestroyInCreative = true;
|
||||
if (mapping.getToolType() != null) { // This is not using the isTool boolean because it is not just a render type here.
|
||||
canDestroyInCreative = computeToolProperties(mapping.getToolType(), itemProperties, componentBuilder);
|
||||
canDestroyInCreative = computeToolProperties(mapping.getToolType(), itemProperties, componentBuilder, javaItem.attackDamage());
|
||||
}
|
||||
itemProperties.putBoolean("can_destroy_in_creative", canDestroyInCreative);
|
||||
|
||||
|
@ -208,10 +208,8 @@ public class CustomItemRegistryPopulator {
|
|||
return builder;
|
||||
}
|
||||
|
||||
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
|
||||
private static NbtMapBuilder createComponentNbt(NonVanillaCustomItemData customItemData, String customItemName,
|
||||
int customItemId, OptionalInt creativeCategory,
|
||||
String creativeGroup, boolean isHat, boolean displayHandheld, int protocolVersion) {
|
||||
int customItemId, boolean isHat, boolean displayHandheld, int protocolVersion) {
|
||||
NbtMapBuilder builder = NbtMap.builder();
|
||||
builder.putString("name", customItemName)
|
||||
.putInt("id", customItemId);
|
||||
|
@ -223,7 +221,7 @@ public class CustomItemRegistryPopulator {
|
|||
|
||||
boolean canDestroyInCreative = true;
|
||||
if (customItemData.toolType() != null) { // This is not using the isTool boolean because it is not just a render type here.
|
||||
canDestroyInCreative = computeToolProperties(Objects.requireNonNull(customItemData.toolType()), itemProperties, componentBuilder);
|
||||
canDestroyInCreative = computeToolProperties(Objects.requireNonNull(customItemData.toolType()), itemProperties, componentBuilder, customItemData.attackDamage());
|
||||
}
|
||||
itemProperties.putBoolean("can_destroy_in_creative", canDestroyInCreative);
|
||||
|
||||
|
@ -311,7 +309,7 @@ public class CustomItemRegistryPopulator {
|
|||
/**
|
||||
* @return can destroy in creative
|
||||
*/
|
||||
private static boolean computeToolProperties(String toolType, NbtMapBuilder itemProperties, NbtMapBuilder componentBuilder) {
|
||||
private static boolean computeToolProperties(String toolType, NbtMapBuilder itemProperties, NbtMapBuilder componentBuilder, int attackDamage) {
|
||||
boolean canDestroyInCreative = true;
|
||||
float miningSpeed = 1.0f;
|
||||
|
||||
|
@ -362,6 +360,11 @@ public class CustomItemRegistryPopulator {
|
|||
itemProperties.putInt("enchantable_value", 1);
|
||||
itemProperties.putString("enchantable_slot", toolType);
|
||||
|
||||
// Adds a "attack damage" indicator. Purely visual!
|
||||
if (attackDamage > 0) {
|
||||
itemProperties.putInt("damage", attackDamage);
|
||||
}
|
||||
|
||||
return canDestroyInCreative;
|
||||
}
|
||||
|
||||
|
|
|
@ -602,13 +602,6 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
@Setter
|
||||
private @Nullable ItemData currentBook = null;
|
||||
|
||||
/**
|
||||
* Stores if we've sent AvailibleCommandsPacket to the client due to it crashing if sent twice on 1.20.70/71
|
||||
* Hopefully bedrock will have a hotfix so we can remove this
|
||||
*/
|
||||
@Setter
|
||||
private boolean sentAvailibleCommands = false;
|
||||
|
||||
private final GeyserCameraData cameraData;
|
||||
|
||||
private final GeyserEntityData entityData;
|
||||
|
|
|
@ -129,6 +129,11 @@ public class LecternInventoryTranslator extends AbstractBlockInventoryTranslator
|
|||
|
||||
@Override
|
||||
public void updateSlot(GeyserSession session, Inventory inventory, int slot) {
|
||||
// If we're not in a real lectern, the Java server thinks we are still in the player inventory.
|
||||
if (((LecternContainer) inventory).isFakeLectern()) {
|
||||
InventoryTranslator.PLAYER_INVENTORY_TRANSLATOR.updateSlot(session, session.getPlayerInventory(), slot);
|
||||
return;
|
||||
}
|
||||
super.updateSlot(session, inventory, slot);
|
||||
if (slot == 0) {
|
||||
updateBook(session, inventory, inventory.getItem(0));
|
||||
|
|
|
@ -127,9 +127,9 @@ public class BedrockInteractTranslator extends PacketTranslator<InteractPacket>
|
|||
InventoryUtils.openInventory(session, session.getPlayerInventory());
|
||||
}
|
||||
} else {
|
||||
// Case: Player opens a player inventory, while we think it shouldn't have!
|
||||
// Close all inventories, reset to player inventory.
|
||||
InventoryUtils.closeInventory(session, session.getOpenInventory().getJavaId(), false);
|
||||
// Case: Player tries to open a player inventory, while we think it should be in a different inventory
|
||||
// Now: Open the inventory that we're supposed to be in.
|
||||
InventoryUtils.openInventory(session, session.getOpenInventory());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,6 @@ import org.geysermc.geyser.GeyserImpl;
|
|||
import org.geysermc.geyser.api.event.java.ServerDefineCommandsEvent;
|
||||
import org.geysermc.geyser.command.GeyserCommandManager;
|
||||
import org.geysermc.geyser.inventory.item.Enchantment;
|
||||
import org.geysermc.geyser.network.GameProtocol;
|
||||
import org.geysermc.geyser.registry.BlockRegistries;
|
||||
import org.geysermc.geyser.registry.Registries;
|
||||
import org.geysermc.geyser.session.GeyserSession;
|
||||
|
@ -116,12 +115,6 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
|
|||
return;
|
||||
}
|
||||
|
||||
// Don't send command suggestions if they are already sent and the client is 1.20.70 or higher due to crash bug
|
||||
// TODO: Remove this check when the crash bug is fixed
|
||||
if (session.isSentAvailibleCommands() && !GameProtocol.isPre1_20_70(session)) {
|
||||
return;
|
||||
}
|
||||
|
||||
GeyserCommandManager manager = session.getGeyser().commandManager();
|
||||
CommandNode[] nodes = packet.getNodes();
|
||||
List<CommandData> commandData = new ArrayList<>();
|
||||
|
@ -198,7 +191,6 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
|
|||
|
||||
// Finally, send the commands to the client
|
||||
session.sendUpstreamPacket(availableCommandsPacket);
|
||||
session.setSentAvailibleCommands(true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -30,6 +30,7 @@ import com.github.steveice10.mc.protocol.packet.ingame.clientbound.inventory.Cli
|
|||
import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundContainerClosePacket;
|
||||
import org.geysermc.geyser.inventory.GeyserItemStack;
|
||||
import org.geysermc.geyser.inventory.Inventory;
|
||||
import org.geysermc.geyser.inventory.LecternContainer;
|
||||
import org.geysermc.geyser.item.Items;
|
||||
import org.geysermc.geyser.network.GameProtocol;
|
||||
import org.geysermc.geyser.session.GeyserSession;
|
||||
|
@ -79,8 +80,8 @@ public class JavaOpenBookTranslator extends PacketTranslator<ClientboundOpenBook
|
|||
|
||||
// Should never be null
|
||||
Objects.requireNonNull(translator, "lectern translator must exist");
|
||||
Inventory inventory = translator.createInventory("", FAKE_LECTERN_WINDOW_ID, ContainerType.LECTERN , session.getPlayerInventory());
|
||||
inventory.setItem(0, stack, session);
|
||||
Inventory inventory = translator.createInventory("", FAKE_LECTERN_WINDOW_ID, ContainerType.LECTERN, session.getPlayerInventory());
|
||||
((LecternContainer) inventory).setFakeLecternBook(stack, session);
|
||||
InventoryUtils.openInventory(session, inventory);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,12 +5,12 @@ erosion = "1.0-20230406.174837-8"
|
|||
events = "1.1-SNAPSHOT"
|
||||
jackson = { strictly = "2.14.0" } # Don't let other dependencies override
|
||||
fastutil = "8.5.2"
|
||||
netty = "4.1.103.Final"
|
||||
netty = "4.1.107.Final"
|
||||
guava = "29.0-jre"
|
||||
gson = "2.3.1" # Provided by Spigot 1.8.8
|
||||
websocket = "1.5.1"
|
||||
protocol = "3.0.0.Beta1-20240226.201527-125"
|
||||
protocol-connection = "3.0.0.Beta1-20240226.201527-124"
|
||||
protocol = "3.0.0.Beta1-20240313.120922-126"
|
||||
protocol-connection = "3.0.0.Beta1-20240313.120922-125"
|
||||
raknet = "1.0.0.CR1-20231206.145325-12"
|
||||
blockstateupdater="1.20.70-20240303.125052-2"
|
||||
mcauthlib = "d9d773e"
|
||||
|
|
Loading…
Reference in New Issue