Mirror von
https://github.com/GeyserMC/Geyser.git
synchronisiert 2024-12-26 16:12:46 +01:00
Merge branch 'feature/1.19.3'
Dieser Commit ist enthalten in:
Commit
e12d4bfa0e
@ -38,7 +38,7 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.geysermc.geyser.level.GameRule;
|
import org.geysermc.geyser.level.GameRule;
|
||||||
import org.geysermc.geyser.level.GeyserWorldManager;
|
import org.geysermc.geyser.level.WorldManager;
|
||||||
import org.geysermc.geyser.level.block.BlockStateValues;
|
import org.geysermc.geyser.level.block.BlockStateValues;
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
@ -51,7 +51,7 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* The base world manager to use when there is no supported NMS revision
|
* The base world manager to use when there is no supported NMS revision
|
||||||
*/
|
*/
|
||||||
public class GeyserSpigotWorldManager extends GeyserWorldManager {
|
public class GeyserSpigotWorldManager extends WorldManager {
|
||||||
private final Plugin plugin;
|
private final Plugin plugin;
|
||||||
|
|
||||||
public GeyserSpigotWorldManager(Plugin plugin) {
|
public GeyserSpigotWorldManager(Plugin plugin) {
|
||||||
@ -151,12 +151,12 @@ public class GeyserSpigotWorldManager extends GeyserWorldManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
|
public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
|
||||||
String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID());
|
String value = Bukkit.getPlayer(session.getPlayerEntity().getUsername()).getWorld().getGameRuleValue(gameRule.getJavaID());
|
||||||
if (!value.isEmpty()) {
|
if (!value.isEmpty()) {
|
||||||
return Boolean.parseBoolean(value);
|
return Boolean.parseBoolean(value);
|
||||||
}
|
}
|
||||||
return (Boolean) gameRule.getDefaultValue();
|
return gameRule.getDefaultBooleanValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -165,7 +165,7 @@ public class GeyserSpigotWorldManager extends GeyserWorldManager {
|
|||||||
if (!value.isEmpty()) {
|
if (!value.isEmpty()) {
|
||||||
return Integer.parseInt(value);
|
return Integer.parseInt(value);
|
||||||
}
|
}
|
||||||
return (int) gameRule.getDefaultValue();
|
return gameRule.getDefaultIntValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -60,6 +60,7 @@ public final class EntityDefinitions {
|
|||||||
public static final EntityDefinition<BeeEntity> BEE;
|
public static final EntityDefinition<BeeEntity> BEE;
|
||||||
public static final EntityDefinition<BlazeEntity> BLAZE;
|
public static final EntityDefinition<BlazeEntity> BLAZE;
|
||||||
public static final EntityDefinition<BoatEntity> BOAT;
|
public static final EntityDefinition<BoatEntity> BOAT;
|
||||||
|
public static final EntityDefinition<CamelEntity> CAMEL;
|
||||||
public static final EntityDefinition<CatEntity> CAT;
|
public static final EntityDefinition<CatEntity> CAT;
|
||||||
public static final EntityDefinition<SpiderEntity> CAVE_SPIDER;
|
public static final EntityDefinition<SpiderEntity> CAVE_SPIDER;
|
||||||
public static final EntityDefinition<MinecartEntity> CHEST_MINECART;
|
public static final EntityDefinition<MinecartEntity> CHEST_MINECART;
|
||||||
@ -859,6 +860,13 @@ public final class EntityDefinitions {
|
|||||||
.addTranslator(MetadataType.BYTE, AbstractHorseEntity::setHorseFlags)
|
.addTranslator(MetadataType.BYTE, AbstractHorseEntity::setHorseFlags)
|
||||||
.addTranslator(null) // UUID of owner
|
.addTranslator(null) // UUID of owner
|
||||||
.build();
|
.build();
|
||||||
|
CAMEL = EntityDefinition.inherited(CamelEntity::new, abstractHorseEntityBase)
|
||||||
|
.type(EntityType.CAMEL)
|
||||||
|
.identifier("minecraft:llama") // todo 1.20
|
||||||
|
.height(2.375f).width(1.7f)
|
||||||
|
.addTranslator(MetadataType.BOOLEAN, CamelEntity::setDashing)
|
||||||
|
.addTranslator(null) // Last pose change tick
|
||||||
|
.build();
|
||||||
HORSE = EntityDefinition.inherited(HorseEntity::new, abstractHorseEntityBase)
|
HORSE = EntityDefinition.inherited(HorseEntity::new, abstractHorseEntityBase)
|
||||||
.type(EntityType.HORSE)
|
.type(EntityType.HORSE)
|
||||||
.height(1.6f).width(1.3965f)
|
.height(1.6f).width(1.3965f)
|
||||||
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.geyser.entity.type.living.animal.horse;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose;
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
|
||||||
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
|
import com.nukkitx.protocol.bedrock.data.entity.EntityData;
|
||||||
|
import org.geysermc.geyser.entity.EntityDefinition;
|
||||||
|
import org.geysermc.geyser.registry.type.ItemMapping;
|
||||||
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class CamelEntity extends AbstractHorseEntity {
|
||||||
|
|
||||||
|
private static final float SITTING_HEIGHT_DIFFERENCE = 1.43F;
|
||||||
|
|
||||||
|
public CamelEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) {
|
||||||
|
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initializeMetadata() {
|
||||||
|
super.initializeMetadata();
|
||||||
|
this.dirtyMetadata.put(EntityData.VARIANT, 2); // Closest llama colour to camel
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canEat(String javaIdentifierStripped, ItemMapping mapping) {
|
||||||
|
return "cactus".equals(javaIdentifierStripped);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setDimensions(Pose pose) {
|
||||||
|
if (pose == Pose.SITTING) {
|
||||||
|
setBoundingBoxWidth(definition.height() - SITTING_HEIGHT_DIFFERENCE);
|
||||||
|
setBoundingBoxWidth(definition.width());
|
||||||
|
} else {
|
||||||
|
super.setDimensions(pose);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDashing(BooleanEntityMetadata entityMetadata) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -25,8 +25,9 @@
|
|||||||
|
|
||||||
package org.geysermc.geyser.entity.type.living.monster;
|
package org.geysermc.geyser.entity.type.living.monster;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata;
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.OptionalIntMetadataType;
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
|
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
import com.nukkitx.protocol.bedrock.data.SoundEvent;
|
import com.nukkitx.protocol.bedrock.data.SoundEvent;
|
||||||
import com.nukkitx.protocol.bedrock.data.entity.EntityData;
|
import com.nukkitx.protocol.bedrock.data.entity.EntityData;
|
||||||
@ -35,6 +36,7 @@ import com.nukkitx.protocol.bedrock.packet.LevelSoundEvent2Packet;
|
|||||||
import org.geysermc.geyser.entity.EntityDefinition;
|
import org.geysermc.geyser.entity.EntityDefinition;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
|
||||||
|
import java.util.OptionalInt;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class EndermanEntity extends MonsterEntity {
|
public class EndermanEntity extends MonsterEntity {
|
||||||
@ -43,8 +45,15 @@ public class EndermanEntity extends MonsterEntity {
|
|||||||
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
|
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCarriedBlock(IntEntityMetadata entityMetadata) {
|
public void setCarriedBlock(EntityMetadata<OptionalInt, OptionalIntMetadataType> entityMetadata) {
|
||||||
dirtyMetadata.put(EntityData.CARRIED_BLOCK, session.getBlockMappings().getBedrockBlockId(entityMetadata.getPrimitiveValue()));
|
int bedrockBlockId;
|
||||||
|
if (entityMetadata.getValue().isPresent()) {
|
||||||
|
bedrockBlockId = session.getBlockMappings().getBedrockBlockId(entityMetadata.getValue().getAsInt());
|
||||||
|
} else {
|
||||||
|
bedrockBlockId = session.getBlockMappings().getBedrockAirId();
|
||||||
|
}
|
||||||
|
|
||||||
|
dirtyMetadata.put(EntityData.CARRIED_BLOCK, bedrockBlockId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,43 +32,41 @@ import lombok.Getter;
|
|||||||
* It is used to construct the list for the settings menu
|
* It is used to construct the list for the settings menu
|
||||||
*/
|
*/
|
||||||
public enum GameRule {
|
public enum GameRule {
|
||||||
ANNOUNCEADVANCEMENTS("announceAdvancements", Boolean.class, true), // JE only
|
ANNOUNCEADVANCEMENTS("announceAdvancements", true), // JE only
|
||||||
COMMANDBLOCKOUTPUT("commandBlockOutput", Boolean.class, true),
|
COMMANDBLOCKOUTPUT("commandBlockOutput", true),
|
||||||
DISABLEELYTRAMOVEMENTCHECK("disableElytraMovementCheck", Boolean.class, false), // JE only
|
DISABLEELYTRAMOVEMENTCHECK("disableElytraMovementCheck", false), // JE only
|
||||||
DISABLERAIDS("disableRaids", Boolean.class, false), // JE only
|
DISABLERAIDS("disableRaids", false), // JE only
|
||||||
DODAYLIGHTCYCLE("doDaylightCycle", Boolean.class, true),
|
DODAYLIGHTCYCLE("doDaylightCycle", true),
|
||||||
DOENTITYDROPS("doEntityDrops", Boolean.class, true),
|
DOENTITYDROPS("doEntityDrops", true),
|
||||||
DOFIRETICK("doFireTick", Boolean.class, true),
|
DOFIRETICK("doFireTick", true),
|
||||||
DOIMMEDIATERESPAWN("doImmediateRespawn", Boolean.class, false),
|
DOIMMEDIATERESPAWN("doImmediateRespawn", false),
|
||||||
DOINSOMNIA("doInsomnia", Boolean.class, true),
|
DOINSOMNIA("doInsomnia", true),
|
||||||
DOLIMITEDCRAFTING("doLimitedCrafting", Boolean.class, false), // JE only
|
DOLIMITEDCRAFTING("doLimitedCrafting", false), // JE only
|
||||||
DOMOBLOOT("doMobLoot", Boolean.class, true),
|
DOMOBLOOT("doMobLoot", true),
|
||||||
DOMOBSPAWNING("doMobSpawning", Boolean.class, true),
|
DOMOBSPAWNING("doMobSpawning", true),
|
||||||
DOPATROLSPAWNING("doPatrolSpawning", Boolean.class, true), // JE only
|
DOPATROLSPAWNING("doPatrolSpawning", true), // JE only
|
||||||
DOTILEDROPS("doTileDrops", Boolean.class, true),
|
DOTILEDROPS("doTileDrops", true),
|
||||||
DOTRADERSPAWNING("doTraderSpawning", Boolean.class, true), // JE only
|
DOTRADERSPAWNING("doTraderSpawning", true), // JE only
|
||||||
DOWEATHERCYCLE("doWeatherCycle", Boolean.class, true),
|
DOWEATHERCYCLE("doWeatherCycle", true),
|
||||||
DROWNINGDAMAGE("drowningDamage", Boolean.class, true),
|
DROWNINGDAMAGE("drowningDamage", true),
|
||||||
FALLDAMAGE("fallDamage", Boolean.class, true),
|
FALLDAMAGE("fallDamage", true),
|
||||||
FIREDAMAGE("fireDamage", Boolean.class, true),
|
FIREDAMAGE("fireDamage", true),
|
||||||
FREEZEDAMAGE("freezeDamage", Boolean.class, true),
|
FREEZEDAMAGE("freezeDamage", true),
|
||||||
FORGIVEDEADPLAYERS("forgiveDeadPlayers", Boolean.class, true), // JE only
|
FORGIVEDEADPLAYERS("forgiveDeadPlayers", true), // JE only
|
||||||
KEEPINVENTORY("keepInventory", Boolean.class, false),
|
KEEPINVENTORY("keepInventory", false),
|
||||||
LOGADMINCOMMANDS("logAdminCommands", Boolean.class, true), // JE only
|
LOGADMINCOMMANDS("logAdminCommands", true), // JE only
|
||||||
MAXCOMMANDCHAINLENGTH("maxCommandChainLength", Integer.class, 65536),
|
MAXCOMMANDCHAINLENGTH("maxCommandChainLength", 65536),
|
||||||
MAXENTITYCRAMMING("maxEntityCramming", Integer.class, 24), // JE only
|
MAXENTITYCRAMMING("maxEntityCramming", 24), // JE only
|
||||||
MOBGRIEFING("mobGriefing", Boolean.class, true),
|
MOBGRIEFING("mobGriefing", true),
|
||||||
NATURALREGENERATION("naturalRegeneration", Boolean.class, true),
|
NATURALREGENERATION("naturalRegeneration", true),
|
||||||
PLAYERSSLEEPINGPERCENTAGE("playersSleepingPercentage", Integer.class, 100), // JE only
|
PLAYERSSLEEPINGPERCENTAGE("playersSleepingPercentage", 100), // JE only
|
||||||
RANDOMTICKSPEED("randomTickSpeed", Integer.class, 3),
|
RANDOMTICKSPEED("randomTickSpeed", 3),
|
||||||
REDUCEDDEBUGINFO("reducedDebugInfo", Boolean.class, false), // JE only
|
REDUCEDDEBUGINFO("reducedDebugInfo", false), // JE only
|
||||||
SENDCOMMANDFEEDBACK("sendCommandFeedback", Boolean.class, true),
|
SENDCOMMANDFEEDBACK("sendCommandFeedback", true),
|
||||||
SHOWDEATHMESSAGES("showDeathMessages", Boolean.class, true),
|
SHOWDEATHMESSAGES("showDeathMessages", true),
|
||||||
SPAWNRADIUS("spawnRadius", Integer.class, 10),
|
SPAWNRADIUS("spawnRadius", 10),
|
||||||
SPECTATORSGENERATECHUNKS("spectatorsGenerateChunks", Boolean.class, true), // JE only
|
SPECTATORSGENERATECHUNKS("spectatorsGenerateChunks", true), // JE only
|
||||||
UNIVERSALANGER("universalAnger", Boolean.class, false), // JE only
|
UNIVERSALANGER("universalAnger", false); // JE only
|
||||||
|
|
||||||
UNKNOWN("unknown", Object.class);
|
|
||||||
|
|
||||||
public static final GameRule[] VALUES = values();
|
public static final GameRule[] VALUES = values();
|
||||||
|
|
||||||
@ -78,48 +76,25 @@ public enum GameRule {
|
|||||||
@Getter
|
@Getter
|
||||||
private final Class<?> type;
|
private final Class<?> type;
|
||||||
|
|
||||||
@Getter
|
private final int defaultValue;
|
||||||
private final Object defaultValue;
|
|
||||||
|
|
||||||
GameRule(String javaID, Class<?> type) {
|
GameRule(String javaID, boolean defaultValue) {
|
||||||
this(javaID, type, null);
|
this.javaID = javaID;
|
||||||
|
this.type = Boolean.class;
|
||||||
|
this.defaultValue = defaultValue ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
GameRule(String javaID, Class<?> type, Object defaultValue) {
|
GameRule(String javaID, int defaultValue) {
|
||||||
this.javaID = javaID;
|
this.javaID = javaID;
|
||||||
this.type = type;
|
this.type = Integer.class;
|
||||||
this.defaultValue = defaultValue;
|
this.defaultValue = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public boolean getDefaultBooleanValue() {
|
||||||
* Convert a string to an object of the correct type for the current gamerule
|
return defaultValue != 0;
|
||||||
*
|
|
||||||
* @param value The string value to convert
|
|
||||||
* @return The converted and formatted value
|
|
||||||
*/
|
|
||||||
public Object convertValue(String value) {
|
|
||||||
if (type.equals(Boolean.class)) {
|
|
||||||
return Boolean.parseBoolean(value);
|
|
||||||
} else if (type.equals(Integer.class)) {
|
|
||||||
return Integer.parseInt(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public int getDefaultIntValue() {
|
||||||
* Fetch a game rule by the given Java ID
|
return defaultValue;
|
||||||
*
|
|
||||||
* @param id The ID of the gamerule
|
|
||||||
* @return A {@link GameRule} object representing the requested ID or {@link GameRule#UNKNOWN}
|
|
||||||
*/
|
|
||||||
public static GameRule fromJavaID(String id) {
|
|
||||||
for (GameRule gamerule : VALUES) {
|
|
||||||
if (gamerule.javaID.equals(id)) {
|
|
||||||
return gamerule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return UNKNOWN;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
|
|
||||||
package org.geysermc.geyser.level;
|
package org.geysermc.geyser.level;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.setting.Difficulty;
|
|
||||||
import com.nukkitx.nbt.NbtMap;
|
import com.nukkitx.nbt.NbtMap;
|
||||||
import com.nukkitx.nbt.NbtMapBuilder;
|
import com.nukkitx.nbt.NbtMapBuilder;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
@ -36,11 +34,8 @@ import org.geysermc.geyser.session.GeyserSession;
|
|||||||
import org.geysermc.geyser.session.cache.ChunkCache;
|
import org.geysermc.geyser.session.cache.ChunkCache;
|
||||||
import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator;
|
import org.geysermc.geyser.translator.inventory.LecternInventoryTranslator;
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
public class GeyserWorldManager extends WorldManager {
|
public class GeyserWorldManager extends WorldManager {
|
||||||
|
private final Object2ObjectMap<String, String> gameruleCache = new Object2ObjectOpenHashMap<>();
|
||||||
private static final Object2ObjectMap<String, String> gameruleCache = new Object2ObjectOpenHashMap<>();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getBlockAt(GeyserSession session, int x, int y, int z) {
|
public int getBlockAt(GeyserSession session, int x, int y, int z) {
|
||||||
@ -82,18 +77,18 @@ public class GeyserWorldManager extends WorldManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setGameRule(GeyserSession session, String name, Object value) {
|
public void setGameRule(GeyserSession session, String name, Object value) {
|
||||||
session.sendCommand("gamerule " + name + " " + value);
|
super.setGameRule(session, name, value);
|
||||||
gameruleCache.put(name, String.valueOf(value));
|
gameruleCache.put(name, String.valueOf(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
|
public boolean getGameRuleBool(GeyserSession session, GameRule gameRule) {
|
||||||
String value = gameruleCache.get(gameRule.getJavaID());
|
String value = gameruleCache.get(gameRule.getJavaID());
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
return Boolean.parseBoolean(value);
|
return Boolean.parseBoolean(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return gameRule.getDefaultValue() != null ? (Boolean) gameRule.getDefaultValue() : false;
|
return gameRule.getDefaultBooleanValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -103,17 +98,7 @@ public class GeyserWorldManager extends WorldManager {
|
|||||||
return Integer.parseInt(value);
|
return Integer.parseInt(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return gameRule.getDefaultValue() != null ? (int) gameRule.getDefaultValue() : 0;
|
return gameRule.getDefaultIntValue();
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPlayerGameMode(GeyserSession session, GameMode gameMode) {
|
|
||||||
session.sendCommand("gamemode " + gameMode.name().toLowerCase(Locale.ROOT));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setDifficulty(GeyserSession session, Difficulty difficulty) {
|
|
||||||
session.sendCommand("difficulty " + difficulty.name().toLowerCase(Locale.ROOT));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -31,6 +31,8 @@ import com.nukkitx.math.vector.Vector3i;
|
|||||||
import com.nukkitx.nbt.NbtMap;
|
import com.nukkitx.nbt.NbtMap;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class that manages or retrieves various information
|
* Class that manages or retrieves various information
|
||||||
* from the world. Everything in this class should be
|
* from the world. Everything in this class should be
|
||||||
@ -105,7 +107,9 @@ public abstract class WorldManager {
|
|||||||
* @param name The gamerule to change
|
* @param name The gamerule to change
|
||||||
* @param value The new value for the gamerule
|
* @param value The new value for the gamerule
|
||||||
*/
|
*/
|
||||||
public abstract void setGameRule(GeyserSession session, String name, Object value);
|
public void setGameRule(GeyserSession session, String name, Object value) {
|
||||||
|
session.sendCommand("gamerule " + name + " " + value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a gamerule value as a boolean
|
* Gets a gamerule value as a boolean
|
||||||
@ -114,7 +118,7 @@ public abstract class WorldManager {
|
|||||||
* @param gameRule The gamerule to fetch the value of
|
* @param gameRule The gamerule to fetch the value of
|
||||||
* @return The boolean representation of the value
|
* @return The boolean representation of the value
|
||||||
*/
|
*/
|
||||||
public abstract Boolean getGameRuleBool(GeyserSession session, GameRule gameRule);
|
public abstract boolean getGameRuleBool(GeyserSession session, GameRule gameRule);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a gamerule value as an integer
|
* Get a gamerule value as an integer
|
||||||
@ -131,7 +135,9 @@ public abstract class WorldManager {
|
|||||||
* @param session The session of the player to change the game mode of
|
* @param session The session of the player to change the game mode of
|
||||||
* @param gameMode The game mode to change the player to
|
* @param gameMode The game mode to change the player to
|
||||||
*/
|
*/
|
||||||
public abstract void setPlayerGameMode(GeyserSession session, GameMode gameMode);
|
public void setPlayerGameMode(GeyserSession session, GameMode gameMode) {
|
||||||
|
session.sendCommand("gamemode " + gameMode.name().toLowerCase(Locale.ROOT));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the difficulty of the Java server
|
* Change the difficulty of the Java server
|
||||||
@ -139,7 +145,9 @@ public abstract class WorldManager {
|
|||||||
* @param session The session of the user that requested the change
|
* @param session The session of the user that requested the change
|
||||||
* @param difficulty The difficulty to change to
|
* @param difficulty The difficulty to change to
|
||||||
*/
|
*/
|
||||||
public abstract void setDifficulty(GeyserSession session, Difficulty difficulty);
|
public void setDifficulty(GeyserSession session, Difficulty difficulty) {
|
||||||
|
session.sendCommand("difficulty " + difficulty.name().toLowerCase(Locale.ROOT));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the given session's player has a permission
|
* Checks if the given session's player has a permission
|
||||||
|
@ -82,8 +82,6 @@ public class RecipeRegistryPopulator {
|
|||||||
Collections.singletonList(CraftingData.fromMulti(UUID.fromString("d392b075-4ba1-40ae-8789-af868d56f6ce"), ++LAST_RECIPE_NET_ID)));
|
Collections.singletonList(CraftingData.fromMulti(UUID.fromString("d392b075-4ba1-40ae-8789-af868d56f6ce"), ++LAST_RECIPE_NET_ID)));
|
||||||
craftingData.put(RecipeType.CRAFTING_SPECIAL_MAPCLONING,
|
craftingData.put(RecipeType.CRAFTING_SPECIAL_MAPCLONING,
|
||||||
Collections.singletonList(CraftingData.fromMulti(UUID.fromString("85939755-ba10-4d9d-a4cc-efb7a8e943c4"), ++LAST_RECIPE_NET_ID)));
|
Collections.singletonList(CraftingData.fromMulti(UUID.fromString("85939755-ba10-4d9d-a4cc-efb7a8e943c4"), ++LAST_RECIPE_NET_ID)));
|
||||||
craftingData.put(RecipeType.CRAFTING_SPECIAL_BANNERADDPATTERN,
|
|
||||||
Collections.singletonList(CraftingData.fromMulti(UUID.fromString("b5c5d105-75a2-4076-af2b-923ea2bf4bf0"), ++LAST_RECIPE_NET_ID)));
|
|
||||||
|
|
||||||
// https://github.com/pmmp/PocketMine-MP/blob/stable/src/pocketmine/inventory/MultiRecipe.php
|
// https://github.com/pmmp/PocketMine-MP/blob/stable/src/pocketmine/inventory/MultiRecipe.php
|
||||||
|
|
||||||
|
@ -193,6 +193,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.BitSet;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -1415,18 +1416,20 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||||||
return clientData.getLanguageCode();
|
return clientData.getLanguageCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: 1.19.3 int offest and ack'd messages BitSet???
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a chat message to the Java server.
|
* Sends a chat message to the Java server.
|
||||||
*/
|
*/
|
||||||
public void sendChat(String message) {
|
public void sendChat(String message) {
|
||||||
sendDownstreamPacket(new ServerboundChatPacket(message, Instant.now().toEpochMilli(), 0L, ByteArrays.EMPTY_ARRAY, false, Collections.emptyList(), null));
|
sendDownstreamPacket(new ServerboundChatPacket(message, Instant.now().toEpochMilli(), 0L, null, 0, new BitSet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a command to the Java server.
|
* Sends a command to the Java server.
|
||||||
*/
|
*/
|
||||||
public void sendCommand(String command) {
|
public void sendCommand(String command) {
|
||||||
sendDownstreamPacket(new ServerboundChatCommandPacket(command, Instant.now().toEpochMilli(), 0L, Collections.emptyList(), false, Collections.emptyList(), null));
|
sendDownstreamPacket(new ServerboundChatCommandPacket(command, Instant.now().toEpochMilli(), 0L, Collections.emptyList(), 0, new BitSet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setServerRenderDistance(int renderDistance) {
|
public void setServerRenderDistance(int renderDistance) {
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
package org.geysermc.geyser.text;
|
package org.geysermc.geyser.text;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.BuiltinChatType;
|
import com.github.steveice10.mc.protocol.data.game.chat.BuiltinChatType;
|
||||||
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
import com.nukkitx.protocol.bedrock.packet.TextPacket;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ import com.nukkitx.nbt.NbtMapBuilder;
|
|||||||
import org.geysermc.geyser.translator.text.MessageTranslator;
|
import org.geysermc.geyser.translator.text.MessageTranslator;
|
||||||
import org.geysermc.geyser.util.SignUtils;
|
import org.geysermc.geyser.util.SignUtils;
|
||||||
|
|
||||||
@BlockEntity(type = BlockEntityType.SIGN)
|
@BlockEntity(type = {BlockEntityType.SIGN, BlockEntityType.HANGING_SIGN})
|
||||||
public class SignBlockEntityTranslator extends BlockEntityTranslator {
|
public class SignBlockEntityTranslator extends BlockEntityTranslator {
|
||||||
/**
|
/**
|
||||||
* Maps a color stored in a sign's Color tag to its ARGB value.
|
* Maps a color stored in a sign's Color tag to its ARGB value.
|
||||||
@ -88,6 +88,7 @@ public class SignBlockEntityTranslator extends BlockEntityTranslator {
|
|||||||
signWidth += SignUtils.getCharacterWidth(c);
|
signWidth += SignUtils.getCharacterWidth(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo 1.20: update for hanging signs (smaller width). Currently OK because bedrock sees hanging signs as normal signs
|
||||||
if (signWidth <= SignUtils.BEDROCK_CHARACTER_WIDTH_MAX) {
|
if (signWidth <= SignUtils.BEDROCK_CHARACTER_WIDTH_MAX) {
|
||||||
finalSignLine.append(c);
|
finalSignLine.append(c);
|
||||||
} else {
|
} else {
|
||||||
|
@ -57,6 +57,10 @@ public class BedrockBlockEntityDataTranslator extends PacketTranslator<BlockEnti
|
|||||||
// This converts the message into the array'd message Java wants
|
// This converts the message into the array'd message Java wants
|
||||||
for (char character : text.toCharArray()) {
|
for (char character : text.toCharArray()) {
|
||||||
widthCount += SignUtils.getCharacterWidth(character);
|
widthCount += SignUtils.getCharacterWidth(character);
|
||||||
|
|
||||||
|
// todo 1.20: update for hanging signs (smaller width). Currently bedrock thinks hanging signs are normal,
|
||||||
|
// so it thinks hanging signs have more width than they actually do. Seems like JE just truncates it.
|
||||||
|
|
||||||
// If we get a return in Bedrock, or go over the character width max, that signals to use the next line.
|
// If we get a return in Bedrock, or go over the character width max, that signals to use the next line.
|
||||||
if (character == '\n' || widthCount > SignUtils.JAVA_CHARACTER_WIDTH_MAX) {
|
if (character == '\n' || widthCount > SignUtils.JAVA_CHARACTER_WIDTH_MAX) {
|
||||||
// We need to apply some more logic if we went over the character width max
|
// We need to apply some more logic if we went over the character width max
|
||||||
|
@ -234,18 +234,18 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
|
|||||||
case OPERATION -> CommandParam.OPERATOR; // ">=", "==", etc
|
case OPERATION -> CommandParam.OPERATOR; // ">=", "==", etc
|
||||||
case BLOCK_STATE -> BlockRegistries.JAVA_TO_BEDROCK_IDENTIFIERS.get().keySet().toArray(new String[0]);
|
case BLOCK_STATE -> BlockRegistries.JAVA_TO_BEDROCK_IDENTIFIERS.get().keySet().toArray(new String[0]);
|
||||||
case ITEM_STACK -> session.getItemMappings().getItemNames();
|
case ITEM_STACK -> session.getItemMappings().getItemNames();
|
||||||
case ITEM_ENCHANTMENT -> Enchantment.JavaEnchantment.ALL_JAVA_IDENTIFIERS;
|
|
||||||
case ENTITY_SUMMON -> Registries.JAVA_ENTITY_IDENTIFIERS.get().keySet().toArray(new String[0]);
|
|
||||||
case COLOR -> VALID_COLORS;
|
case COLOR -> VALID_COLORS;
|
||||||
case SCOREBOARD_SLOT -> VALID_SCOREBOARD_SLOTS;
|
case SCOREBOARD_SLOT -> VALID_SCOREBOARD_SLOTS;
|
||||||
case MOB_EFFECT -> ALL_EFFECT_IDENTIFIERS;
|
|
||||||
case RESOURCE, RESOURCE_OR_TAG -> {
|
case RESOURCE, RESOURCE_OR_TAG -> {
|
||||||
String resource = ((ResourceProperties) node.getProperties()).getRegistryKey();
|
String resource = ((ResourceProperties) node.getProperties()).getRegistryKey();
|
||||||
if (resource.equals("minecraft:attribute")) {
|
yield switch (resource) {
|
||||||
yield ATTRIBUTES;
|
// minecraft:worldgen/biome is also valid but we currently don't cache biome IDs
|
||||||
} else {
|
case "minecraft:attribute" -> ATTRIBUTES;
|
||||||
yield CommandParam.STRING;
|
case "minecraft:enchantment" -> Enchantment.JavaEnchantment.ALL_JAVA_IDENTIFIERS;
|
||||||
}
|
case "minecraft:entity_type" -> Registries.JAVA_ENTITY_IDENTIFIERS.get().keySet().toArray(new String[0]);
|
||||||
|
case "minecraft:mob_effect" -> ALL_EFFECT_IDENTIFIERS;
|
||||||
|
default -> CommandParam.STRING;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
default -> CommandParam.STRING;
|
default -> CommandParam.STRING;
|
||||||
};
|
};
|
||||||
@ -325,7 +325,7 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
|
|||||||
CommandParam type = null;
|
CommandParam type = null;
|
||||||
boolean optional = this.paramNode.isExecutable();
|
boolean optional = this.paramNode.isExecutable();
|
||||||
if (mappedType instanceof String[]) {
|
if (mappedType instanceof String[]) {
|
||||||
enumData = new CommandEnumData(paramNode.getParser().name().toLowerCase(Locale.ROOT), (String[]) mappedType, false);
|
enumData = new CommandEnumData(getEnumDataName(paramNode).toLowerCase(Locale.ROOT), (String[]) mappedType, false);
|
||||||
} else {
|
} else {
|
||||||
type = (CommandParam) mappedType;
|
type = (CommandParam) mappedType;
|
||||||
// Bedrock throws a fit if an optional message comes after a string or target
|
// Bedrock throws a fit if an optional message comes after a string or target
|
||||||
@ -347,6 +347,21 @@ public class JavaCommandsTranslator extends PacketTranslator<ClientboundCommands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mitigates https://github.com/GeyserMC/Geyser/issues/3411. Not a perfect solution.
|
||||||
|
*/
|
||||||
|
private static String getEnumDataName(CommandNode node) {
|
||||||
|
if (node.getProperties() instanceof ResourceProperties properties) {
|
||||||
|
String registryKey = properties.getRegistryKey();
|
||||||
|
int identifierSplit = registryKey.indexOf(':');
|
||||||
|
if (identifierSplit != -1) {
|
||||||
|
return registryKey.substring(identifierSplit);
|
||||||
|
}
|
||||||
|
return registryKey;
|
||||||
|
}
|
||||||
|
return node.getParser().name();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comparing CommandNode type a and b, determine if they are in the same overload.
|
* Comparing CommandNode type a and b, determine if they are in the same overload.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -51,7 +51,7 @@ public class JavaPlayerChatTranslator extends PacketTranslator<ClientboundPlayer
|
|||||||
textPacket.setType(TextPacket.Type.CHAT);
|
textPacket.setType(TextPacket.Type.CHAT);
|
||||||
|
|
||||||
textPacket.setNeedsTranslation(false);
|
textPacket.setNeedsTranslation(false);
|
||||||
Component message = packet.getUnsignedContent() == null ? packet.getMessageDecorated() : packet.getUnsignedContent();
|
Component message = packet.getUnsignedContent() == null ? Component.text(packet.getContent()) : packet.getUnsignedContent();
|
||||||
|
|
||||||
TextDecoration decoration = session.getChatTypes().get(packet.getChatType());
|
TextDecoration decoration = session.getChatTypes().get(packet.getChatType());
|
||||||
if (decoration != null) {
|
if (decoration != null) {
|
||||||
|
@ -40,6 +40,6 @@ public class JavaSoundEntityTranslator extends PacketTranslator<ClientboundSound
|
|||||||
if (entity == null) {
|
if (entity == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SoundUtils.playBuiltinSound(session, packet.getSound(), entity.getPosition(), packet.getVolume(), packet.getPitch());
|
SoundUtils.playSound(session, packet.getSound(), entity.getPosition(), packet.getVolume(), packet.getPitch());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.geyser.translator.protocol.java.entity.player;
|
||||||
|
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerInfoRemovePacket;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.PlayerListPacket;
|
||||||
|
import org.geysermc.geyser.entity.type.player.PlayerEntity;
|
||||||
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Translator(packet = ClientboundPlayerInfoRemovePacket.class)
|
||||||
|
public class JavaPlayerInfoRemoveTranslator extends PacketTranslator<ClientboundPlayerInfoRemovePacket> {
|
||||||
|
@Override
|
||||||
|
public void translate(GeyserSession session, ClientboundPlayerInfoRemovePacket packet) {
|
||||||
|
PlayerListPacket translate = new PlayerListPacket();
|
||||||
|
translate.setAction(PlayerListPacket.Action.REMOVE);
|
||||||
|
|
||||||
|
for (UUID id : packet.getProfileIds()) {
|
||||||
|
// As the player entity is no longer present, we can remove the entry
|
||||||
|
PlayerEntity entity = session.getEntityCache().removePlayerEntity(id);
|
||||||
|
if (entity != null) {
|
||||||
|
// Just remove the entity's player list status
|
||||||
|
// Don't despawn the entity - the Java server will also take care of that.
|
||||||
|
entity.setPlayerList(false);
|
||||||
|
}
|
||||||
|
if (entity == session.getPlayerEntity()) {
|
||||||
|
// If removing ourself we use our AuthData UUID
|
||||||
|
translate.getEntries().add(new PlayerListPacket.Entry(session.getAuthData().uuid()));
|
||||||
|
} else {
|
||||||
|
translate.getEntries().add(new PlayerListPacket.Entry(id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session.sendUpstreamPacket(translate);
|
||||||
|
}
|
||||||
|
}
|
@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* @author GeyserMC
|
|
||||||
* @link https://github.com/GeyserMC/Geyser
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.java.entity.player;
|
|
||||||
|
|
||||||
import com.github.steveice10.mc.auth.data.GameProfile;
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.PlayerListEntry;
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction;
|
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerInfoPacket;
|
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
|
||||||
import com.nukkitx.protocol.bedrock.packet.PlayerListPacket;
|
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
|
||||||
import org.geysermc.geyser.entity.type.player.PlayerEntity;
|
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.skin.SkinManager;
|
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
|
||||||
|
|
||||||
@Translator(packet = ClientboundPlayerInfoPacket.class)
|
|
||||||
public class JavaPlayerInfoTranslator extends PacketTranslator<ClientboundPlayerInfoPacket> {
|
|
||||||
@Override
|
|
||||||
public void translate(GeyserSession session, ClientboundPlayerInfoPacket packet) {
|
|
||||||
if (packet.getAction() != PlayerListEntryAction.ADD_PLAYER && packet.getAction() != PlayerListEntryAction.REMOVE_PLAYER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PlayerListPacket translate = new PlayerListPacket();
|
|
||||||
translate.setAction(packet.getAction() == PlayerListEntryAction.ADD_PLAYER ? PlayerListPacket.Action.ADD : PlayerListPacket.Action.REMOVE);
|
|
||||||
|
|
||||||
for (PlayerListEntry entry : packet.getEntries()) {
|
|
||||||
switch (packet.getAction()) {
|
|
||||||
case ADD_PLAYER -> {
|
|
||||||
GameProfile profile = entry.getProfile();
|
|
||||||
PlayerEntity playerEntity;
|
|
||||||
boolean self = profile.getId().equals(session.getPlayerEntity().getUuid());
|
|
||||||
|
|
||||||
if (self) {
|
|
||||||
// Entity is ourself
|
|
||||||
playerEntity = session.getPlayerEntity();
|
|
||||||
} else {
|
|
||||||
playerEntity = session.getEntityCache().getPlayerEntity(profile.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
GameProfile.Property textures = profile.getProperty("textures");
|
|
||||||
String texturesProperty = textures == null ? null : textures.getValue();
|
|
||||||
|
|
||||||
if (playerEntity == null) {
|
|
||||||
// It's a new player
|
|
||||||
playerEntity = new PlayerEntity(
|
|
||||||
session,
|
|
||||||
-1,
|
|
||||||
session.getEntityCache().getNextEntityId().incrementAndGet(),
|
|
||||||
profile.getId(),
|
|
||||||
Vector3f.ZERO,
|
|
||||||
Vector3f.ZERO,
|
|
||||||
0, 0, 0,
|
|
||||||
profile.getName(),
|
|
||||||
texturesProperty
|
|
||||||
);
|
|
||||||
|
|
||||||
session.getEntityCache().addPlayerEntity(playerEntity);
|
|
||||||
} else {
|
|
||||||
playerEntity.setUsername(profile.getName());
|
|
||||||
playerEntity.setTexturesProperty(texturesProperty);
|
|
||||||
}
|
|
||||||
|
|
||||||
playerEntity.setPlayerList(true);
|
|
||||||
|
|
||||||
// We'll send our own PlayerListEntry in requestAndHandleSkinAndCape
|
|
||||||
// But we need to send other player's entries so they show up in the player list
|
|
||||||
// without processing their skin information - that'll be processed when they spawn in
|
|
||||||
if (self) {
|
|
||||||
SkinManager.requestAndHandleSkinAndCape(playerEntity, session, skinAndCape ->
|
|
||||||
GeyserImpl.getInstance().getLogger().debug("Loaded Local Bedrock Java Skin Data for " + session.getClientData().getUsername()));
|
|
||||||
} else {
|
|
||||||
playerEntity.setValid(true);
|
|
||||||
PlayerListPacket.Entry playerListEntry = SkinManager.buildCachedEntry(session, playerEntity);
|
|
||||||
|
|
||||||
translate.getEntries().add(playerListEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case REMOVE_PLAYER -> {
|
|
||||||
// As the player entity is no longer present, we can remove the entry
|
|
||||||
PlayerEntity entity = session.getEntityCache().removePlayerEntity(entry.getProfile().getId());
|
|
||||||
if (entity != null) {
|
|
||||||
// Just remove the entity's player list status
|
|
||||||
// Don't despawn the entity - the Java server will also take care of that.
|
|
||||||
entity.setPlayerList(false);
|
|
||||||
}
|
|
||||||
if (entity == session.getPlayerEntity()) {
|
|
||||||
// If removing ourself we use our AuthData UUID
|
|
||||||
translate.getEntries().add(new PlayerListPacket.Entry(session.getAuthData().uuid()));
|
|
||||||
} else {
|
|
||||||
translate.getEntries().add(new PlayerListPacket.Entry(entry.getProfile().getId()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!translate.getEntries().isEmpty()) {
|
|
||||||
session.sendUpstreamPacket(translate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Geyser
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.geyser.translator.protocol.java.entity.player;
|
||||||
|
|
||||||
|
import com.github.steveice10.mc.auth.data.GameProfile;
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.PlayerListEntry;
|
||||||
|
import com.github.steveice10.mc.protocol.data.game.PlayerListEntryAction;
|
||||||
|
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerInfoUpdatePacket;
|
||||||
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
|
import com.nukkitx.protocol.bedrock.packet.PlayerListPacket;
|
||||||
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
|
import org.geysermc.geyser.entity.type.player.PlayerEntity;
|
||||||
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
import org.geysermc.geyser.skin.SkinManager;
|
||||||
|
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||||
|
import org.geysermc.geyser.translator.protocol.Translator;
|
||||||
|
|
||||||
|
@Translator(packet = ClientboundPlayerInfoUpdatePacket.class)
|
||||||
|
public class JavaPlayerInfoUpdateTranslator extends PacketTranslator<ClientboundPlayerInfoUpdatePacket> {
|
||||||
|
@Override
|
||||||
|
public void translate(GeyserSession session, ClientboundPlayerInfoUpdatePacket packet) {
|
||||||
|
if (!packet.getActions().contains(PlayerListEntryAction.ADD_PLAYER)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerListPacket translate = new PlayerListPacket();
|
||||||
|
translate.setAction(PlayerListPacket.Action.ADD);
|
||||||
|
|
||||||
|
for (PlayerListEntry entry : packet.getEntries()) {
|
||||||
|
GameProfile profile = entry.getProfile();
|
||||||
|
PlayerEntity playerEntity;
|
||||||
|
boolean self = profile.getId().equals(session.getPlayerEntity().getUuid());
|
||||||
|
|
||||||
|
if (self) {
|
||||||
|
// Entity is ourself
|
||||||
|
playerEntity = session.getPlayerEntity();
|
||||||
|
} else {
|
||||||
|
playerEntity = session.getEntityCache().getPlayerEntity(profile.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
GameProfile.Property textures = profile.getProperty("textures");
|
||||||
|
String texturesProperty = textures == null ? null : textures.getValue();
|
||||||
|
|
||||||
|
if (playerEntity == null) {
|
||||||
|
// It's a new player
|
||||||
|
playerEntity = new PlayerEntity(
|
||||||
|
session,
|
||||||
|
-1,
|
||||||
|
session.getEntityCache().getNextEntityId().incrementAndGet(),
|
||||||
|
profile.getId(),
|
||||||
|
Vector3f.ZERO,
|
||||||
|
Vector3f.ZERO,
|
||||||
|
0, 0, 0,
|
||||||
|
profile.getName(),
|
||||||
|
texturesProperty
|
||||||
|
);
|
||||||
|
|
||||||
|
session.getEntityCache().addPlayerEntity(playerEntity);
|
||||||
|
} else {
|
||||||
|
playerEntity.setUsername(profile.getName());
|
||||||
|
playerEntity.setTexturesProperty(texturesProperty);
|
||||||
|
}
|
||||||
|
|
||||||
|
playerEntity.setPlayerList(true);
|
||||||
|
|
||||||
|
// We'll send our own PlayerListEntry in requestAndHandleSkinAndCape
|
||||||
|
// But we need to send other player's entries so they show up in the player list
|
||||||
|
// without processing their skin information - that'll be processed when they spawn in
|
||||||
|
if (self) {
|
||||||
|
SkinManager.requestAndHandleSkinAndCape(playerEntity, session, skinAndCape ->
|
||||||
|
GeyserImpl.getInstance().getLogger().debug("Loaded Local Bedrock Java Skin Data for " + session.getClientData().getUsername()));
|
||||||
|
} else {
|
||||||
|
playerEntity.setValid(true);
|
||||||
|
PlayerListPacket.Entry playerListEntry = SkinManager.buildCachedEntry(session, playerEntity);
|
||||||
|
|
||||||
|
translate.getEntries().add(playerListEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!translate.getEntries().isEmpty()) {
|
||||||
|
session.sendUpstreamPacket(translate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* @author GeyserMC
|
|
||||||
* @link https://github.com/GeyserMC/Geyser
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.geysermc.geyser.translator.protocol.java.level;
|
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.level.ClientboundCustomSoundPacket;
|
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
|
||||||
import com.nukkitx.protocol.bedrock.packet.PlaySoundPacket;
|
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
|
||||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
|
||||||
import org.geysermc.geyser.translator.protocol.Translator;
|
|
||||||
import org.geysermc.geyser.util.SoundUtils;
|
|
||||||
|
|
||||||
@Translator(packet = ClientboundCustomSoundPacket.class)
|
|
||||||
public class JavaCustomSoundTranslator extends PacketTranslator<ClientboundCustomSoundPacket> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void translate(GeyserSession session, ClientboundCustomSoundPacket packet) {
|
|
||||||
PlaySoundPacket playSoundPacket = new PlaySoundPacket();
|
|
||||||
playSoundPacket.setSound(SoundUtils.translatePlaySound(packet.getSound()));
|
|
||||||
playSoundPacket.setPosition(Vector3f.from(packet.getX(), packet.getY(), packet.getZ()));
|
|
||||||
playSoundPacket.setVolume(packet.getVolume());
|
|
||||||
playSoundPacket.setPitch(packet.getPitch());
|
|
||||||
|
|
||||||
session.sendUpstreamPacket(playSoundPacket);
|
|
||||||
}
|
|
||||||
}
|
|
@ -30,7 +30,6 @@ import com.nukkitx.math.vector.Vector3f;
|
|||||||
import com.nukkitx.math.vector.Vector3i;
|
import com.nukkitx.math.vector.Vector3i;
|
||||||
import com.nukkitx.nbt.NbtMap;
|
import com.nukkitx.nbt.NbtMap;
|
||||||
import com.nukkitx.nbt.NbtMapBuilder;
|
import com.nukkitx.nbt.NbtMapBuilder;
|
||||||
import com.nukkitx.protocol.bedrock.data.LevelEventType;
|
|
||||||
import com.nukkitx.protocol.bedrock.data.SoundEvent;
|
import com.nukkitx.protocol.bedrock.data.SoundEvent;
|
||||||
import com.nukkitx.protocol.bedrock.packet.LevelEventGenericPacket;
|
import com.nukkitx.protocol.bedrock.packet.LevelEventGenericPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket;
|
import com.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket;
|
||||||
@ -49,9 +48,9 @@ public class JavaExplodeTranslator extends PacketTranslator<ClientboundExplodePa
|
|||||||
LevelEventGenericPacket levelEventPacket = new LevelEventGenericPacket();
|
LevelEventGenericPacket levelEventPacket = new LevelEventGenericPacket();
|
||||||
levelEventPacket.setEventId(2026/*LevelEventType.PARTICLE_BLOCK_EXPLOSION*/);
|
levelEventPacket.setEventId(2026/*LevelEventType.PARTICLE_BLOCK_EXPLOSION*/);
|
||||||
NbtMapBuilder builder = NbtMap.builder();
|
NbtMapBuilder builder = NbtMap.builder();
|
||||||
builder.putFloat("originX", packet.getX());
|
builder.putFloat("originX", (float) packet.getX());
|
||||||
builder.putFloat("originY", packet.getY());
|
builder.putFloat("originY", (float) packet.getY());
|
||||||
builder.putFloat("originZ", packet.getZ());
|
builder.putFloat("originZ", (float) packet.getZ());
|
||||||
builder.putFloat("radius", packet.getRadius());
|
builder.putFloat("radius", packet.getRadius());
|
||||||
builder.putInt("size", packet.getExploded().size());
|
builder.putInt("size", packet.getExploded().size());
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -38,6 +38,6 @@ public class JavaSoundTranslator extends PacketTranslator<ClientboundSoundPacket
|
|||||||
@Override
|
@Override
|
||||||
public void translate(GeyserSession session, ClientboundSoundPacket packet) {
|
public void translate(GeyserSession session, ClientboundSoundPacket packet) {
|
||||||
Vector3f position = Vector3f.from(packet.getX(), packet.getY(), packet.getZ());
|
Vector3f position = Vector3f.from(packet.getX(), packet.getY(), packet.getZ());
|
||||||
SoundUtils.playBuiltinSound(session, packet.getSound(), position, packet.getVolume(), packet.getPitch());
|
SoundUtils.playSound(session, packet.getSound(), position, packet.getVolume(), packet.getPitch());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,11 +100,7 @@ public class SettingsUtils {
|
|||||||
.translator(MinecraftLocale::getLocaleString); // we need translate gamerules next
|
.translator(MinecraftLocale::getLocaleString); // we need translate gamerules next
|
||||||
|
|
||||||
WorldManager worldManager = GeyserImpl.getInstance().getWorldManager();
|
WorldManager worldManager = GeyserImpl.getInstance().getWorldManager();
|
||||||
for (GameRule gamerule : GameRule.values()) {
|
for (GameRule gamerule : GameRule.VALUES) {
|
||||||
if (gamerule.equals(GameRule.UNKNOWN)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the relevant form item based on the gamerule type
|
// Add the relevant form item based on the gamerule type
|
||||||
if (Boolean.class.equals(gamerule.getType())) {
|
if (Boolean.class.equals(gamerule.getType())) {
|
||||||
builder.toggle("gamerule." + gamerule.getJavaID(), worldManager.getGameRuleBool(session, gamerule));
|
builder.toggle("gamerule." + gamerule.getJavaID(), worldManager.getGameRuleBool(session, gamerule));
|
||||||
@ -146,10 +142,6 @@ public class SettingsUtils {
|
|||||||
|
|
||||||
if (showGamerules) {
|
if (showGamerules) {
|
||||||
for (GameRule gamerule : GameRule.VALUES) {
|
for (GameRule gamerule : GameRule.VALUES) {
|
||||||
if (gamerule.equals(GameRule.UNKNOWN)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Boolean.class.equals(gamerule.getType())) {
|
if (Boolean.class.equals(gamerule.getType())) {
|
||||||
boolean value = response.next();
|
boolean value = response.next();
|
||||||
if (value != session.getGeyser().getWorldManager().getGameRuleBool(session, gamerule)) {
|
if (value != session.getGeyser().getWorldManager().getGameRuleBool(session, gamerule)) {
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
|
|
||||||
package org.geysermc.geyser.util;
|
package org.geysermc.geyser.util;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.level.sound.BuiltinSound;
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.level.sound.CustomSound;
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.level.sound.Sound;
|
import com.github.steveice10.mc.protocol.data.game.level.sound.Sound;
|
||||||
import com.nukkitx.math.vector.Vector3f;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
import com.nukkitx.protocol.bedrock.data.LevelEventType;
|
import com.nukkitx.protocol.bedrock.data.LevelEventType;
|
||||||
@ -63,30 +61,20 @@ public final class SoundUtils {
|
|||||||
/**
|
/**
|
||||||
* Translates a Java Custom or Builtin Sound to its Bedrock equivalent
|
* Translates a Java Custom or Builtin Sound to its Bedrock equivalent
|
||||||
*
|
*
|
||||||
* @param sound the sound to translate
|
* @param javaIdentifier the sound to translate
|
||||||
* @return a Bedrock sound
|
* @return a Bedrock sound
|
||||||
*/
|
*/
|
||||||
public static String translatePlaySound(Sound sound) {
|
public static String translatePlaySound(String javaIdentifier) {
|
||||||
String packetSound;
|
|
||||||
if (sound instanceof BuiltinSound builtinSound) {
|
|
||||||
packetSound = builtinSound.getName();
|
|
||||||
} else if (sound instanceof CustomSound customSound) {
|
|
||||||
packetSound = customSound.getName();
|
|
||||||
} else {
|
|
||||||
GeyserImpl.getInstance().getLogger().debug("Unknown sound, we were unable to map this. " + sound);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Drop the Minecraft namespace if applicable
|
// Drop the Minecraft namespace if applicable
|
||||||
if (packetSound.startsWith("minecraft:")) {
|
if (javaIdentifier.startsWith("minecraft:")) {
|
||||||
packetSound = packetSound.substring("minecraft:".length());
|
javaIdentifier = javaIdentifier.substring("minecraft:".length());
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundMapping soundMapping = Registries.SOUNDS.get(packetSound);
|
SoundMapping soundMapping = Registries.SOUNDS.get(javaIdentifier);
|
||||||
if (soundMapping == null || soundMapping.getPlaysound() == null) {
|
if (soundMapping == null || soundMapping.getPlaysound() == null) {
|
||||||
// no mapping
|
// no mapping
|
||||||
GeyserImpl.getInstance().getLogger().debug("[PlaySound] Defaulting to sound server gave us for " + sound);
|
GeyserImpl.getInstance().getLogger().debug("[PlaySound] Defaulting to sound server gave us for " + javaIdentifier);
|
||||||
return packetSound;
|
return javaIdentifier;
|
||||||
}
|
}
|
||||||
return soundMapping.getPlaysound();
|
return soundMapping.getPlaysound();
|
||||||
}
|
}
|
||||||
@ -99,7 +87,7 @@ public final class SoundUtils {
|
|||||||
* @param position the position
|
* @param position the position
|
||||||
* @param pitch the pitch
|
* @param pitch the pitch
|
||||||
*/
|
*/
|
||||||
public static void playBuiltinSound(GeyserSession session, BuiltinSound javaSound, Vector3f position, float volume, float pitch) {
|
public static void playSound(GeyserSession session, Sound javaSound, Vector3f position, float volume, float pitch) {
|
||||||
String packetSound = javaSound.getName();
|
String packetSound = javaSound.getName();
|
||||||
|
|
||||||
SoundMapping soundMapping = Registries.SOUNDS.get(packetSound);
|
SoundMapping soundMapping = Registries.SOUNDS.get(packetSound);
|
||||||
|
Binäre Datei nicht angezeigt.
@ -28,6 +28,14 @@
|
|||||||
"id" : "minecraft:mangrove_planks",
|
"id" : "minecraft:mangrove_planks",
|
||||||
"blockRuntimeId" : 1570
|
"blockRuntimeId" : 1570
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_planks",
|
||||||
|
"blockRuntimeId" : 8202
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_mosaic",
|
||||||
|
"blockRuntimeId" : 12438
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:crimson_planks",
|
"id" : "minecraft:crimson_planks",
|
||||||
"blockRuntimeId" : 7399
|
"blockRuntimeId" : 7399
|
||||||
@ -152,6 +160,10 @@
|
|||||||
"id" : "minecraft:mangrove_fence",
|
"id" : "minecraft:mangrove_fence",
|
||||||
"blockRuntimeId" : 10405
|
"blockRuntimeId" : 10405
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_fence",
|
||||||
|
"blockRuntimeId" : 863
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:nether_brick_fence",
|
"id" : "minecraft:nether_brick_fence",
|
||||||
"blockRuntimeId" : 6071
|
"blockRuntimeId" : 6071
|
||||||
@ -192,6 +204,10 @@
|
|||||||
"id" : "minecraft:mangrove_fence_gate",
|
"id" : "minecraft:mangrove_fence_gate",
|
||||||
"blockRuntimeId" : 6406
|
"blockRuntimeId" : 6406
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_fence_gate",
|
||||||
|
"blockRuntimeId" : 7611
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:crimson_fence_gate",
|
"id" : "minecraft:crimson_fence_gate",
|
||||||
"blockRuntimeId" : 6826
|
"blockRuntimeId" : 6826
|
||||||
@ -240,6 +256,14 @@
|
|||||||
"id" : "minecraft:mangrove_stairs",
|
"id" : "minecraft:mangrove_stairs",
|
||||||
"blockRuntimeId" : 6376
|
"blockRuntimeId" : 6376
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_stairs",
|
||||||
|
"blockRuntimeId" : 1339
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_mosaic_stairs",
|
||||||
|
"blockRuntimeId" : 9958
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:stone_brick_stairs",
|
"id" : "minecraft:stone_brick_stairs",
|
||||||
"blockRuntimeId" : 1554
|
"blockRuntimeId" : 1554
|
||||||
@ -421,6 +445,9 @@
|
|||||||
{
|
{
|
||||||
"id" : "minecraft:mangrove_door"
|
"id" : "minecraft:mangrove_door"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_door"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:iron_door"
|
"id" : "minecraft:iron_door"
|
||||||
},
|
},
|
||||||
@ -458,6 +485,10 @@
|
|||||||
"id" : "minecraft:mangrove_trapdoor",
|
"id" : "minecraft:mangrove_trapdoor",
|
||||||
"blockRuntimeId" : 6266
|
"blockRuntimeId" : 6266
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_trapdoor",
|
||||||
|
"blockRuntimeId" : 7828
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:iron_trapdoor",
|
"id" : "minecraft:iron_trapdoor",
|
||||||
"blockRuntimeId" : 549
|
"blockRuntimeId" : 549
|
||||||
@ -666,6 +697,14 @@
|
|||||||
"id" : "minecraft:mangrove_slab",
|
"id" : "minecraft:mangrove_slab",
|
||||||
"blockRuntimeId" : 1772
|
"blockRuntimeId" : 1772
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_slab",
|
||||||
|
"blockRuntimeId" : 10300
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_mosaic_slab",
|
||||||
|
"blockRuntimeId" : 4081
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:stone_block_slab",
|
"id" : "minecraft:stone_block_slab",
|
||||||
"blockRuntimeId" : 6054
|
"blockRuntimeId" : 6054
|
||||||
@ -2707,6 +2746,9 @@
|
|||||||
{
|
{
|
||||||
"id" : "minecraft:trader_llama_spawn_egg"
|
"id" : "minecraft:trader_llama_spawn_egg"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:camel_spawn_egg"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:ghast_spawn_egg"
|
"id" : "minecraft:ghast_spawn_egg"
|
||||||
},
|
},
|
||||||
@ -4073,6 +4115,10 @@
|
|||||||
"id" : "minecraft:bookshelf",
|
"id" : "minecraft:bookshelf",
|
||||||
"blockRuntimeId" : 10443
|
"blockRuntimeId" : 10443
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:chiseled_bookshelf",
|
||||||
|
"blockRuntimeId" : 326
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:lectern",
|
"id" : "minecraft:lectern",
|
||||||
"blockRuntimeId" : 10718
|
"blockRuntimeId" : 10718
|
||||||
@ -4263,12 +4309,45 @@
|
|||||||
{
|
{
|
||||||
"id" : "minecraft:mangrove_sign"
|
"id" : "minecraft:mangrove_sign"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_sign"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:crimson_sign"
|
"id" : "minecraft:crimson_sign"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:warped_sign"
|
"id" : "minecraft:warped_sign"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:oak_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:spruce_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:birch_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:jungle_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:acacia_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:dark_oak_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:crimson_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:warped_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:mangrove_hanging_sign"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_hanging_sign"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:painting"
|
"id" : "minecraft:painting"
|
||||||
},
|
},
|
||||||
@ -4979,6 +5058,9 @@
|
|||||||
{
|
{
|
||||||
"id" : "minecraft:mangrove_boat"
|
"id" : "minecraft:mangrove_boat"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_raft"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:oak_chest_boat"
|
"id" : "minecraft:oak_chest_boat"
|
||||||
},
|
},
|
||||||
@ -5000,6 +5082,9 @@
|
|||||||
{
|
{
|
||||||
"id" : "minecraft:mangrove_chest_boat"
|
"id" : "minecraft:mangrove_chest_boat"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_chest_raft"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:rail",
|
"id" : "minecraft:rail",
|
||||||
"blockRuntimeId" : 5697
|
"blockRuntimeId" : 5697
|
||||||
@ -5071,6 +5156,10 @@
|
|||||||
"id" : "minecraft:mangrove_button",
|
"id" : "minecraft:mangrove_button",
|
||||||
"blockRuntimeId" : 10840
|
"blockRuntimeId" : 10840
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_button",
|
||||||
|
"blockRuntimeId" : 10238
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:stone_button",
|
"id" : "minecraft:stone_button",
|
||||||
"blockRuntimeId" : 826
|
"blockRuntimeId" : 826
|
||||||
@ -5119,6 +5208,10 @@
|
|||||||
"id" : "minecraft:mangrove_pressure_plate",
|
"id" : "minecraft:mangrove_pressure_plate",
|
||||||
"blockRuntimeId" : 5646
|
"blockRuntimeId" : 5646
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id" : "minecraft:bamboo_pressure_plate",
|
||||||
|
"blockRuntimeId" : 9819
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id" : "minecraft:crimson_pressure_plate",
|
"id" : "minecraft:crimson_pressure_plate",
|
||||||
"blockRuntimeId" : 12447
|
"blockRuntimeId" : 12447
|
||||||
|
Binäre Datei nicht angezeigt.
@ -1 +1 @@
|
|||||||
Subproject commit 10baa9a45de074afa643e8477bd5a4e72ecfa563
|
Subproject commit e8703ccb187f98cd845357395d7b4ecfafbcd864
|
@ -8,7 +8,7 @@ websocket = "1.5.1"
|
|||||||
protocol = "2.9.15-20221129.204554-2"
|
protocol = "2.9.15-20221129.204554-2"
|
||||||
raknet = "1.6.28-20220125.214016-6"
|
raknet = "1.6.28-20220125.214016-6"
|
||||||
mcauthlib = "d9d773e"
|
mcauthlib = "d9d773e"
|
||||||
mcprotocollib = "9f78bd5"
|
mcprotocollib = "1.19.3-20221206.215111-2"
|
||||||
packetlib = "3.0"
|
packetlib = "3.0"
|
||||||
adventure = "4.12.0-20220629.025215-9"
|
adventure = "4.12.0-20220629.025215-9"
|
||||||
adventure-platform = "4.1.2"
|
adventure-platform = "4.1.2"
|
||||||
@ -80,7 +80,7 @@ guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
|
|||||||
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
|
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
|
||||||
junit = { group = "junit", name = "junit", version.ref = "junit" }
|
junit = { group = "junit", name = "junit", version.ref = "junit" }
|
||||||
mcauthlib = { group = "com.github.GeyserMC", name = "MCAuthLib", version.ref = "mcauthlib" }
|
mcauthlib = { group = "com.github.GeyserMC", name = "MCAuthLib", version.ref = "mcauthlib" }
|
||||||
mcprotocollib = { group = "com.github.GeyserMC", name = "MCProtocolLib", version.ref = "mcprotocollib" }
|
mcprotocollib = { group = "com.github.steveice10", name = "mcprotocollib", version.ref = "mcprotocollib" }
|
||||||
packetlib = { group = "com.github.steveice10", name = "packetlib", version.ref = "packetlib" }
|
packetlib = { group = "com.github.steveice10", name = "packetlib", version.ref = "packetlib" }
|
||||||
protocol = { group = "com.nukkitx.protocol", name = "bedrock-v560", version.ref = "protocol" }
|
protocol = { group = "com.nukkitx.protocol", name = "bedrock-v560", version.ref = "protocol" }
|
||||||
raknet = { group = "com.nukkitx.network", name = "raknet", version.ref = "raknet" }
|
raknet = { group = "com.nukkitx.network", name = "raknet", version.ref = "raknet" }
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren