3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-12-27 16:40:14 +01:00

Implement allay, plus some interaction fixes

Dieser Commit ist enthalten in:
Camotoy 2022-05-26 17:51:55 -04:00
Ursprung 4b9055c252
Commit 29c819fe21
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 7EEFB66FE798081F
30 geänderte Dateien mit 258 neuen und 101 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,51 @@
/*
* 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;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f;
import org.geysermc.geyser.entity.type.BoatEntity;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import java.util.UUID;
public class ChestBoatEntity extends BoatEntity {
public ChestBoatEntity(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 InteractiveTag testInteraction(Hand hand) {
return passengers.isEmpty() && !session.isSneaking() ? super.testInteraction(hand) : InteractiveTag.OPEN_CONTAINER;
}
@Override
public InteractionResult interact(Hand hand) {
return passengers.isEmpty() && !session.isSneaking() ? super.interact(hand) : InteractionResult.SUCCESS;
}
}

Datei anzeigen

@ -51,6 +51,7 @@ import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.translator.text.MessageTranslator;
public final class EntityDefinitions { public final class EntityDefinitions {
public static final EntityDefinition<AllayEntity> ALLAY;
public static final EntityDefinition<AreaEffectCloudEntity> AREA_EFFECT_CLOUD; public static final EntityDefinition<AreaEffectCloudEntity> AREA_EFFECT_CLOUD;
public static final EntityDefinition<ArmorStandEntity> ARMOR_STAND; public static final EntityDefinition<ArmorStandEntity> ARMOR_STAND;
public static final EntityDefinition<TippedArrowEntity> ARROW; public static final EntityDefinition<TippedArrowEntity> ARROW;
@ -63,7 +64,7 @@ public final class EntityDefinitions {
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;
public static final EntityDefinition<ChickenEntity> CHICKEN; public static final EntityDefinition<ChickenEntity> CHICKEN;
public static final EntityDefinition<BoatEntity> CHEST_BOAT; public static final EntityDefinition<ChestBoatEntity> CHEST_BOAT;
public static final EntityDefinition<AbstractFishEntity> COD; public static final EntityDefinition<AbstractFishEntity> COD;
public static final EntityDefinition<CommandBlockMinecartEntity> COMMAND_BLOCK_MINECART; public static final EntityDefinition<CommandBlockMinecartEntity> COMMAND_BLOCK_MINECART;
public static final EntityDefinition<CowEntity> COW; public static final EntityDefinition<CowEntity> COW;
@ -211,7 +212,7 @@ public final class EntityDefinitions {
.addTranslator(MetadataType.BOOLEAN, BoatEntity::setPaddlingRight) .addTranslator(MetadataType.BOOLEAN, BoatEntity::setPaddlingRight)
.addTranslator(MetadataType.INT, (boatEntity, entityMetadata) -> boatEntity.getDirtyMetadata().put(EntityData.BOAT_BUBBLE_TIME, entityMetadata.getValue())) // May not actually do anything .addTranslator(MetadataType.INT, (boatEntity, entityMetadata) -> boatEntity.getDirtyMetadata().put(EntityData.BOAT_BUBBLE_TIME, entityMetadata.getValue())) // May not actually do anything
.build(); .build();
CHEST_BOAT = EntityDefinition.inherited(BOAT.factory(), BOAT) CHEST_BOAT = EntityDefinition.inherited(ChestBoatEntity::new, BOAT)
.type(EntityType.CHEST_BOAT) .type(EntityType.CHEST_BOAT)
.build(); .build();
DRAGON_FIREBALL = EntityDefinition.inherited(FireballEntity::new, entityBase) DRAGON_FIREBALL = EntityDefinition.inherited(FireballEntity::new, entityBase)
@ -447,6 +448,10 @@ public final class EntityDefinitions {
// Extends mob // Extends mob
{ {
ALLAY = EntityDefinition.inherited(AllayEntity::new, mobEntityBase)
.type(EntityType.ALLAY)
.height(0.6f).width(0.35f)
.build();
BAT = EntityDefinition.inherited(BatEntity::new, mobEntityBase) BAT = EntityDefinition.inherited(BatEntity::new, mobEntityBase)
.type(EntityType.BAT) .type(EntityType.BAT)
.height(0.9f).width(0.5f) .height(0.9f).width(0.5f)

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -49,11 +50,11 @@ public class AbstractFishEntity extends WaterEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (EntityUtils.attemptToBucket(session, itemInHand)) { if (EntityUtils.attemptToBucket(session, itemInHand)) {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -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;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import javax.annotation.Nonnull;
import java.util.UUID;
public class AllayEntity extends MobEntity {
public AllayEntity(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);
}
@Nonnull
@Override
protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!this.hand.isValid() && !itemInHand.isEmpty()) {
return InteractiveTag.GIVE_ITEM_TO_ALLAY;
} else if (this.hand.isValid() && hand == Hand.MAIN_HAND && itemInHand.isEmpty()) {
// Seems like there isn't a good tag for this yet
return InteractiveTag.GIVE_ITEM_TO_ALLAY;
} else {
return super.testMobInteraction(hand, itemInHand);
}
}
@Nonnull
@Override
protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!this.hand.isValid() && !itemInHand.isEmpty()) {
//TODO play sound?
return InteractionResult.SUCCESS;
} else if (this.hand.isValid() && hand == Hand.MAIN_HAND && itemInHand.isEmpty()) {
//TOCHECK also play sound here?
return InteractionResult.SUCCESS;
} else {
return super.mobInteract(hand, itemInHand);
}
}
}

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.GeyserItemStack;
@ -47,20 +48,20 @@ public class DolphinEntity extends WaterEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) {
return InteractiveTag.FEED; return InteractiveTag.FEED;
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) { if (!itemInHand.isEmpty() && session.getTagCache().isFish(itemInHand)) {
// Feed // Feed
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -48,7 +49,7 @@ public class IronGolemEntity extends GolemEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().ironIngot()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().ironIngot()) {
if (health < maxHealth) { if (health < maxHealth) {
// Healing the iron golem // Healing the iron golem
@ -57,6 +58,6 @@ public class IronGolemEntity extends GolemEntity {
return InteractionResult.PASS; return InteractionResult.PASS;
} }
} }
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -90,7 +90,7 @@ public class MobEntity extends LivingEntity {
} }
} }
InteractiveTag tag = testMobInteraction(itemStack); InteractiveTag tag = testMobInteraction(hand, itemStack);
return tag != InteractiveTag.NONE ? tag : super.testInteraction(hand); return tag != InteractiveTag.NONE ? tag : super.testInteraction(hand);
} }
} }
@ -109,7 +109,7 @@ public class MobEntity extends LivingEntity {
if (result.consumesAction()) { if (result.consumesAction()) {
return result; return result;
} else { } else {
InteractionResult mobResult = mobInteract(itemInHand); InteractionResult mobResult = mobInteract(hand, itemInHand);
return mobResult.consumesAction() ? mobResult : super.interact(hand); return mobResult.consumesAction() ? mobResult : super.interact(hand);
} }
} }
@ -137,12 +137,12 @@ public class MobEntity extends LivingEntity {
} }
@Nonnull @Nonnull
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
return InteractiveTag.NONE; return InteractiveTag.NONE;
} }
@Nonnull @Nonnull
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
return InteractionResult.PASS; return InteractionResult.PASS;
} }

Datei anzeigen

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living; package org.geysermc.geyser.entity.type.living;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -51,7 +52,7 @@ public class SnowGolemEntity extends GolemEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (session.getItemMappings().getStoredItems().shears() == itemInHand.getJavaId() && isAlive() && !getFlag(EntityFlag.SHEARED)) { if (session.getItemMappings().getStoredItems().shears() == itemInHand.getJavaId() && isAlive() && !getFlag(EntityFlag.SHEARED)) {
// Shearing the snow golem // Shearing the snow golem
return InteractiveTag.SHEAR; return InteractiveTag.SHEAR;
@ -61,7 +62,7 @@ public class SnowGolemEntity extends GolemEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (session.getItemMappings().getStoredItems().shears() == itemInHand.getJavaId() && isAlive() && !getFlag(EntityFlag.SHEARED)) { if (session.getItemMappings().getStoredItems().shears() == itemInHand.getJavaId() && isAlive() && !getFlag(EntityFlag.SHEARED)) {
// Shearing the snow golem // Shearing the snow golem
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; import com.nukkitx.protocol.bedrock.data.entity.EntityEventType;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -63,16 +64,16 @@ public class AnimalEntity extends AgeableEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (canEat(itemInHand)) { if (canEat(itemInHand)) {
return InteractiveTag.FEED; return InteractiveTag.FEED;
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (canEat(itemInHand)) { if (canEat(itemInHand)) {
// FEED // FEED
if (getFlag(EntityFlag.BABY)) { if (getFlag(EntityFlag.BABY)) {
@ -82,6 +83,6 @@ public class AnimalEntity extends AgeableEntity {
return InteractionResult.CONSUME; return InteractionResult.CONSUME;
} }
} }
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.animal;
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.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -75,11 +76,11 @@ public class AxolotlEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (EntityUtils.attemptToBucket(session, itemInHand)) { if (EntityUtils.attemptToBucket(session, itemInHand)) {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
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.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -44,9 +45,9 @@ public class CowEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (getFlag(EntityFlag.BABY) || !itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) { if (getFlag(EntityFlag.BABY) || !itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) {
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
return InteractiveTag.MILK; return InteractiveTag.MILK;
@ -54,9 +55,9 @@ public class CowEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (getFlag(EntityFlag.BABY) || !itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) { if (getFlag(EntityFlag.BABY) || !itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
session.playSoundEvent(SoundEvent.MILK, position); session.playSoundEvent(SoundEvent.MILK, position);

Datei anzeigen

@ -33,6 +33,7 @@ import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.registry.type.ItemMapping;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.GeyserSession;
import java.util.OptionalInt; import java.util.OptionalInt;
@ -65,4 +66,9 @@ public class FrogEntity extends AnimalEntity {
dirtyMetadata.put(EntityData.TARGET_EID, 0L); dirtyMetadata.put(EntityData.TARGET_EID, 0L);
} }
} }
@Override
public boolean canEat(String javaIdentifierStripped, ItemMapping mapping) {
return javaIdentifierStripped.equals("slime_ball");
}
} }

Datei anzeigen

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Pose; 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.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
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.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -65,12 +66,12 @@ public class GoatEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.BABY) && itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) { if (!getFlag(EntityFlag.BABY) && itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bucket")) {
session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position); session.playSoundEvent(isScreamer ? SoundEvent.MILK_SCREAMER : SoundEvent.MILK, position);
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ObjectEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -52,7 +53,7 @@ public class MooshroomEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
StoredItemMappings storedItems = session.getItemMappings().getStoredItems(); StoredItemMappings storedItems = session.getItemMappings().getStoredItems();
if (!isBaby()) { if (!isBaby()) {
if (itemInHand.getJavaId() == storedItems.bowl()) { if (itemInHand.getJavaId() == storedItems.bowl()) {
@ -63,12 +64,12 @@ public class MooshroomEntity extends AnimalEntity {
return InteractiveTag.MOOSHROOM_SHEAR; return InteractiveTag.MOOSHROOM_SHEAR;
} }
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
StoredItemMappings storedItems = session.getItemMappings().getStoredItems(); StoredItemMappings storedItems = session.getItemMappings().getStoredItems();
boolean isBaby = isBaby(); boolean isBaby = isBaby();
if (!isBaby && itemInHand.getJavaId() == storedItems.bowl()) { if (!isBaby && itemInHand.getJavaId() == storedItems.bowl()) {
@ -81,6 +82,6 @@ public class MooshroomEntity extends AnimalEntity {
// ? // ?
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -50,23 +51,23 @@ public class OcelotEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) {
// Attempt to feed // Attempt to feed
return InteractiveTag.FEED; return InteractiveTag.FEED;
} else { } else {
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) { if (!getFlag(EntityFlag.TRUSTING) && canEat(itemInHand) && session.getPlayerEntity().getPosition().distanceSquared(position) < 9f) {
// Attempt to feed // Attempt to feed
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityEventType; import com.nukkitx.protocol.bedrock.data.entity.EntityEventType;
@ -93,16 +94,16 @@ public class PandaEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (mainGene == Gene.WORRIED && session.isThunder()) { if (mainGene == Gene.WORRIED && session.isThunder()) {
return InteractiveTag.NONE; return InteractiveTag.NONE;
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (mainGene == Gene.WORRIED && session.isThunder()) { if (mainGene == Gene.WORRIED && session.isThunder()) {
// Huh! // Huh!
return InteractionResult.PASS; return InteractionResult.PASS;

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -51,12 +52,12 @@ public class PigEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) {
// Mount // Mount
return InteractiveTag.MOUNT; return InteractiveTag.MOUNT;
} else { } else {
InteractiveTag superTag = super.testMobInteraction(itemInHand); InteractiveTag superTag = super.testMobInteraction(hand, itemInHand);
if (superTag != InteractiveTag.NONE) { if (superTag != InteractiveTag.NONE) {
return superTag; return superTag;
} else { } else {
@ -68,12 +69,12 @@ public class PigEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) {
// Mount // Mount
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
InteractionResult superResult = super.mobInteract(itemInHand); InteractionResult superResult = super.mobInteract(hand, itemInHand);
if (superResult.consumesAction()) { if (superResult.consumesAction()) {
return superResult; return superResult;
} else { } else {

Datei anzeigen

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -55,11 +56,11 @@ public class SheepEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().shears()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().shears()) {
return InteractiveTag.SHEAR; return InteractiveTag.SHEAR;
} else { } else {
InteractiveTag tag = super.testMobInteraction(itemInHand); InteractiveTag tag = super.testMobInteraction(hand, itemInHand);
if (tag != InteractiveTag.NONE) { if (tag != InteractiveTag.NONE) {
return tag; return tag;
} else { } else {
@ -74,11 +75,11 @@ public class SheepEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().shears()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().shears()) {
return InteractionResult.CONSUME; return InteractionResult.CONSUME;
} else { } else {
InteractionResult superResult = super.mobInteract(itemInHand); InteractionResult superResult = super.mobInteract(hand, itemInHand);
if (superResult.consumesAction()) { if (superResult.consumesAction()) {
return superResult; return superResult;
} else { } else {

Datei anzeigen

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal; package org.geysermc.geyser.entity.type.living.animal;
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.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.Entity;
@ -98,12 +99,12 @@ public class StriderEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) {
// Mount Strider // Mount Strider
return InteractiveTag.RIDE_STRIDER; return InteractiveTag.RIDE_STRIDER;
} else { } else {
InteractiveTag tag = super.testMobInteraction(itemInHand); InteractiveTag tag = super.testMobInteraction(hand, itemInHand);
if (tag != InteractiveTag.NONE) { if (tag != InteractiveTag.NONE) {
return tag; return tag;
} else { } else {
@ -115,12 +116,12 @@ public class StriderEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) { if (!canEat(itemInHand) && getFlag(EntityFlag.SADDLED) && passengers.isEmpty() && !session.isSneaking()) {
// Mount Strider // Mount Strider
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
InteractionResult superResult = super.mobInteract(itemInHand); InteractionResult superResult = super.mobInteract(hand, itemInHand);
if (superResult.consumesAction()) { if (superResult.consumesAction()) {
return superResult; return superResult;
} else { } else {

Datei anzeigen

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.type.living.animal.horse; package org.geysermc.geyser.entity.type.living.animal.horse;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
@ -129,12 +130,12 @@ public class AbstractHorseEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
return testHorseInteraction(itemInHand); return testHorseInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
protected final InteractiveTag testHorseInteraction(@Nonnull GeyserItemStack itemInHand) { protected final InteractiveTag testHorseInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
boolean isBaby = isBaby(); boolean isBaby = isBaby();
if (!isBaby) { if (!isBaby) {
if (getFlag(EntityFlag.TAMED) && session.isSneaking()) { if (getFlag(EntityFlag.TAMED) && session.isSneaking()) {
@ -142,7 +143,7 @@ public class AbstractHorseEntity extends AnimalEntity {
} }
if (!passengers.isEmpty()) { if (!passengers.isEmpty()) {
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
} }
@ -171,7 +172,7 @@ public class AbstractHorseEntity extends AnimalEntity {
} }
if (isBaby) { if (isBaby) {
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} else { } else {
return InteractiveTag.MOUNT; return InteractiveTag.MOUNT;
} }
@ -179,12 +180,12 @@ public class AbstractHorseEntity extends AnimalEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
return mobHorseInteract(itemInHand); return mobHorseInteract(hand, itemInHand);
} }
@Nonnull @Nonnull
protected final InteractionResult mobHorseInteract(@Nonnull GeyserItemStack itemInHand) { protected final InteractionResult mobHorseInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
boolean isBaby = isBaby(); boolean isBaby = isBaby();
if (!isBaby) { if (!isBaby) {
if (getFlag(EntityFlag.TAMED) && session.isSneaking()) { if (getFlag(EntityFlag.TAMED) && session.isSneaking()) {
@ -193,7 +194,7 @@ public class AbstractHorseEntity extends AnimalEntity {
} }
if (!passengers.isEmpty()) { if (!passengers.isEmpty()) {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
@ -227,7 +228,7 @@ public class AbstractHorseEntity extends AnimalEntity {
} }
if (isBaby) { if (isBaby) {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} else { } else {
// Attempt to mount // Attempt to mount
// TODO client-set flags sitting standing? // TODO client-set flags sitting standing?
@ -249,15 +250,15 @@ public class AbstractHorseEntity extends AnimalEntity {
/* Just a place to stuff common code for the undead variants without having duplicate code */ /* Just a place to stuff common code for the undead variants without having duplicate code */
protected final InteractiveTag testUndeadHorseInteraction(@Nonnull GeyserItemStack itemInHand) { protected final InteractiveTag testUndeadHorseInteraction(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.TAMED)) { if (!getFlag(EntityFlag.TAMED)) {
return InteractiveTag.NONE; return InteractiveTag.NONE;
} else if (isBaby()) { } else if (isBaby()) {
return testHorseInteraction(itemInHand); return testHorseInteraction(hand, itemInHand);
} else if (session.isSneaking()) { } else if (session.isSneaking()) {
return InteractiveTag.OPEN_CONTAINER; return InteractiveTag.OPEN_CONTAINER;
} else if (!passengers.isEmpty()) { } else if (!passengers.isEmpty()) {
return testHorseInteraction(itemInHand); return testHorseInteraction(hand, itemInHand);
} else { } else {
if (session.getItemMappings().getStoredItems().saddle() == itemInHand.getJavaId()) { if (session.getItemMappings().getStoredItems().saddle() == itemInHand.getJavaId()) {
return InteractiveTag.OPEN_CONTAINER; return InteractiveTag.OPEN_CONTAINER;
@ -271,16 +272,16 @@ public class AbstractHorseEntity extends AnimalEntity {
} }
} }
protected final InteractionResult undeadHorseInteract(@Nonnull GeyserItemStack itemInHand) { protected final InteractionResult undeadHorseInteract(@Nonnull Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (!getFlag(EntityFlag.TAMED)) { if (!getFlag(EntityFlag.TAMED)) {
return InteractionResult.PASS; return InteractionResult.PASS;
} else if (isBaby()) { } else if (isBaby()) {
return mobHorseInteract(itemInHand); return mobHorseInteract(hand, itemInHand);
} else if (session.isSneaking()) { } else if (session.isSneaking()) {
// Opens inventory // Opens inventory
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else if (!passengers.isEmpty()) { } else if (!passengers.isEmpty()) {
return mobHorseInteract(itemInHand); return mobHorseInteract(hand, itemInHand);
} else { } else {
// The client tests for saddle but it doesn't matter for us at this point. // The client tests for saddle but it doesn't matter for us at this point.
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal.horse; package org.geysermc.geyser.entity.type.living.animal.horse;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.GeyserItemStack;
@ -42,13 +43,13 @@ public class SkeletonHorseEntity extends AbstractHorseEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
return testUndeadHorseInteraction(itemInHand); return testUndeadHorseInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
return undeadHorseInteract(itemInHand); return undeadHorseInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal.horse; package org.geysermc.geyser.entity.type.living.animal.horse;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.inventory.GeyserItemStack;
@ -42,13 +43,13 @@ public class ZombieHorseEntity extends AbstractHorseEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
return testUndeadHorseInteraction(itemInHand); return testUndeadHorseInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
return undeadHorseInteract(itemInHand); return undeadHorseInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -28,6 +28,7 @@ package org.geysermc.geyser.entity.type.living.animal.tameable;
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.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -105,7 +106,7 @@ public class CatEntity extends TameableEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
boolean tamed = getFlag(EntityFlag.TAMED); boolean tamed = getFlag(EntityFlag.TAMED);
if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) { if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) {
// Toggle sitting // Toggle sitting
@ -117,7 +118,7 @@ public class CatEntity extends TameableEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
boolean tamed = getFlag(EntityFlag.TAMED); boolean tamed = getFlag(EntityFlag.TAMED);
if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) { if (tamed && ownerBedrockId == session.getPlayerEntity().getGeyserId()) {
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.animal.tameable; package org.geysermc.geyser.entity.type.living.animal.tameable;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -58,7 +59,7 @@ public class ParrotEntity extends TameableEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
String javaIdentifierStripped = itemInHand.getMapping(session).getJavaIdentifier().replace("minecraft:", ""); String javaIdentifierStripped = itemInHand.getMapping(session).getJavaIdentifier().replace("minecraft:", "");
boolean tame = getFlag(EntityFlag.TAMED); boolean tame = getFlag(EntityFlag.TAMED);
if (!tame && isTameFood(javaIdentifierStripped)) { if (!tame && isTameFood(javaIdentifierStripped)) {
@ -69,12 +70,12 @@ public class ParrotEntity extends TameableEntity {
// Sitting/standing // Sitting/standing
return getFlag(EntityFlag.SITTING) ? InteractiveTag.STAND : InteractiveTag.SIT; return getFlag(EntityFlag.SITTING) ? InteractiveTag.STAND : InteractiveTag.SIT;
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
String javaIdentifierStripped = itemInHand.getMapping(session).getJavaIdentifier().replace("minecraft:", ""); String javaIdentifierStripped = itemInHand.getMapping(session).getJavaIdentifier().replace("minecraft:", "");
boolean tame = getFlag(EntityFlag.TAMED); boolean tame = getFlag(EntityFlag.TAMED);
if (!tame && isTameFood(javaIdentifierStripped)) { if (!tame && isTameFood(javaIdentifierStripped)) {
@ -85,6 +86,6 @@ public class ParrotEntity extends TameableEntity {
// Sitting/standing // Sitting/standing
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }

Datei anzeigen

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.animal.tameable;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
@ -103,7 +104,7 @@ public class WolfEntity extends TameableEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (getFlag(EntityFlag.ANGRY)) { if (getFlag(EntityFlag.ANGRY)) {
return InteractiveTag.NONE; return InteractiveTag.NONE;
} }
@ -122,12 +123,12 @@ public class WolfEntity extends TameableEntity {
return getFlag(EntityFlag.SITTING) ? InteractiveTag.STAND : InteractiveTag.SIT; return getFlag(EntityFlag.SITTING) ? InteractiveTag.STAND : InteractiveTag.SIT;
} }
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (ownerBedrockId == session.getPlayerEntity().getGeyserId() || getFlag(EntityFlag.TAMED) if (ownerBedrockId == session.getPlayerEntity().getGeyserId() || getFlag(EntityFlag.TAMED)
|| itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bone") && !getFlag(EntityFlag.ANGRY)) { || itemInHand.getMapping(session).getJavaIdentifier().equals("minecraft:bone") && !getFlag(EntityFlag.ANGRY)) {
// Sitting toggle or feeding; not angry // Sitting toggle or feeding; not angry

Datei anzeigen

@ -25,6 +25,7 @@
package org.geysermc.geyser.entity.type.living.merchant; package org.geysermc.geyser.entity.type.living.merchant;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinition;
@ -51,7 +52,7 @@ public class AbstractMerchantEntity extends AgeableEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
String javaIdentifier = itemInHand.getMapping(session).getJavaIdentifier(); String javaIdentifier = itemInHand.getMapping(session).getJavaIdentifier();
if (!javaIdentifier.equals("minecraft:villager_spawn_egg") if (!javaIdentifier.equals("minecraft:villager_spawn_egg")
&& (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING) && ((VillagerEntity) this).isCanTradeWith())) { && (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING) && ((VillagerEntity) this).isCanTradeWith())) {
@ -60,12 +61,12 @@ public class AbstractMerchantEntity extends AgeableEntity {
return InteractiveTag.TRADE; return InteractiveTag.TRADE;
} }
} }
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
String javaIdentifier = itemInHand.getMapping(session).getJavaIdentifier(); String javaIdentifier = itemInHand.getMapping(session).getJavaIdentifier();
if (!javaIdentifier.equals("minecraft:villager_spawn_egg") if (!javaIdentifier.equals("minecraft:villager_spawn_egg")
&& (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING)) && (definition != EntityDefinitions.VILLAGER || !getFlag(EntityFlag.SLEEPING))
@ -73,7 +74,7 @@ public class AbstractMerchantEntity extends AgeableEntity {
// Trading time // Trading time
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -27,6 +27,7 @@ package org.geysermc.geyser.entity.type.living.monster;
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.github.steveice10.mc.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
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.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -63,23 +64,23 @@ public class CreeperEntity extends MonsterEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().flintAndSteel()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().flintAndSteel()) {
return InteractiveTag.IGNITE_CREEPER; return InteractiveTag.IGNITE_CREEPER;
} else { } else {
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().flintAndSteel()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().flintAndSteel()) {
// Ignite creeper // Ignite creeper
session.playSoundEvent(SoundEvent.IGNITE, position); session.playSoundEvent(SoundEvent.IGNITE, position);
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -26,6 +26,7 @@
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.type.BooleanEntityMetadata; import com.github.steveice10.mc.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -71,8 +72,8 @@ public class PiglinEntity extends BasePiglinEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
InteractiveTag tag = super.testMobInteraction(itemInHand); InteractiveTag tag = super.testMobInteraction(hand, itemInHand);
if (tag != InteractiveTag.NONE) { if (tag != InteractiveTag.NONE) {
return tag; return tag;
} else { } else {
@ -82,8 +83,8 @@ public class PiglinEntity extends BasePiglinEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
InteractionResult superResult = super.mobInteract(itemInHand); InteractionResult superResult = super.mobInteract(hand, itemInHand);
if (superResult.consumesAction()) { if (superResult.consumesAction()) {
return superResult; return superResult;
} else { } else {

Datei anzeigen

@ -28,6 +28,7 @@ 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.EntityMetadata;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData;
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.player.Hand;
import com.nukkitx.math.vector.Vector3f; import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityData;
import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag;
@ -67,22 +68,22 @@ public class ZombieVillagerEntity extends ZombieEntity {
@Nonnull @Nonnull
@Override @Override
protected InteractiveTag testMobInteraction(@Nonnull GeyserItemStack itemInHand) { protected InteractiveTag testMobInteraction(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().goldenApple()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().goldenApple()) {
return InteractiveTag.CURE; return InteractiveTag.CURE;
} else { } else {
return super.testMobInteraction(itemInHand); return super.testMobInteraction(hand, itemInHand);
} }
} }
@Nonnull @Nonnull
@Override @Override
protected InteractionResult mobInteract(@Nonnull GeyserItemStack itemInHand) { protected InteractionResult mobInteract(Hand hand, @Nonnull GeyserItemStack itemInHand) {
if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().goldenApple()) { if (itemInHand.getJavaId() == session.getItemMappings().getStoredItems().goldenApple()) {
// The client doesn't know if the entity has weakness as that's not usually sent over the network // The client doesn't know if the entity has weakness as that's not usually sent over the network
return InteractionResult.CONSUME; return InteractionResult.CONSUME;
} else { } else {
return super.mobInteract(itemInHand); return super.mobInteract(hand, itemInHand);
} }
} }
} }

Datei anzeigen

@ -69,7 +69,8 @@ public enum InteractiveTag {
EQUIP_ARMOR_STAND("armorstand.equip"), EQUIP_ARMOR_STAND("armorstand.equip"),
READ, READ,
WAKE_VILLAGER("wakevillager"), WAKE_VILLAGER("wakevillager"),
BARTER; BARTER,
GIVE_ITEM_TO_ALLAY("allay");
/** /**
* The full string that should be passed on to the client. * The full string that should be passed on to the client.