Tick boost for Pig and Strider if any player is controlling

This commit is contained in:
AJ Ferguson 2024-06-15 01:11:41 -04:00
parent 1a6c70feed
commit cdbb27669c
6 changed files with 65 additions and 24 deletions

View file

@ -29,8 +29,11 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector2f;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.type.Tickable;
import org.geysermc.geyser.entity.type.player.PlayerEntity;
import org.geysermc.geyser.entity.vehicle.BoostableVehicleComponent;
import org.geysermc.geyser.entity.vehicle.ClientVehicle;
import org.geysermc.geyser.entity.vehicle.VehicleComponent;
@ -46,7 +49,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
import java.util.UUID;
public class PigEntity extends AnimalEntity implements ClientVehicle {
public class PigEntity extends AnimalEntity implements Tickable, ClientVehicle {
private final BoostableVehicleComponent<PigEntity> vehicleComponent = new BoostableVehicleComponent<>(this, 1.0f);
public PigEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) {
@ -96,6 +99,21 @@ public class PigEntity extends AnimalEntity implements ClientVehicle {
vehicleComponent.startBoost(entityMetadata.getPrimitiveValue());
}
@Override
public void tick() {
PlayerEntity player = getPlayerPassenger();
if (player == session.getPlayerEntity()) {
if (session.getPlayerInventory().isHolding(Items.CARROT_ON_A_STICK)) {
vehicleComponent.tickBoost();
}
} else if (player != null) { // getHand() for session player seems to always return air
ItemDefinition itemDefinition = session.getItemMappings().getStoredItems().carrotOnAStick().getBedrockDefinition();
if (player.getHand().getDefinition() == itemDefinition || player.getOffhand().getDefinition() == itemDefinition) {
vehicleComponent.tickBoost();
}
}
}
@Override
public VehicleComponent<?> getVehicleComponent() {
return vehicleComponent;
@ -111,11 +129,16 @@ public class PigEntity extends AnimalEntity implements ClientVehicle {
return vehicleComponent.getMoveSpeed() * 0.225f * vehicleComponent.getBoostMultiplier();
}
private @Nullable PlayerEntity getPlayerPassenger() {
if (getFlag(EntityFlag.SADDLED) && !passengers.isEmpty() && passengers.get(0) instanceof PlayerEntity playerEntity) {
return playerEntity;
}
return null;
}
@Override
public boolean isClientControlled() {
return getFlag(EntityFlag.SADDLED)
&& !passengers.isEmpty()
&& passengers.get(0) == session.getPlayerEntity()
&& session.getPlayerInventory().isHolding(Items.CARROT_ON_A_STICK);
return getPlayerPassenger() == session.getPlayerEntity() && session.getPlayerInventory().isHolding(Items.CARROT_ON_A_STICK);
}
}

View file

@ -29,9 +29,12 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector2f;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.entity.type.Tickable;
import org.geysermc.geyser.entity.type.player.PlayerEntity;
import org.geysermc.geyser.entity.vehicle.BoostableVehicleComponent;
import org.geysermc.geyser.entity.vehicle.ClientVehicle;
import org.geysermc.geyser.entity.vehicle.VehicleComponent;
@ -48,7 +51,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
import java.util.UUID;
public class StriderEntity extends AnimalEntity implements ClientVehicle {
public class StriderEntity extends AnimalEntity implements Tickable, ClientVehicle {
private final BoostableVehicleComponent<StriderEntity> vehicleComponent = new BoostableVehicleComponent<>(this, 1.0f);
private boolean isCold = false;
@ -143,6 +146,21 @@ public class StriderEntity extends AnimalEntity implements ClientVehicle {
vehicleComponent.startBoost(entityMetadata.getPrimitiveValue());
}
@Override
public void tick() {
PlayerEntity player = getPlayerPassenger();
if (player == session.getPlayerEntity()) {
if (session.getPlayerInventory().isHolding(Items.WARPED_FUNGUS_ON_A_STICK)) {
vehicleComponent.tickBoost();
}
} else if (player != null) { // getHand() for session player seems to always return air
ItemDefinition itemDefinition = session.getItemMappings().getStoredItems().warpedFungusOnAStick().getBedrockDefinition();
if (player.getHand().getDefinition() == itemDefinition || player.getOffhand().getDefinition() == itemDefinition) {
vehicleComponent.tickBoost();
}
}
}
@Override
public VehicleComponent<?> getVehicleComponent() {
return vehicleComponent;
@ -158,12 +176,17 @@ public class StriderEntity extends AnimalEntity implements ClientVehicle {
return vehicleComponent.getMoveSpeed() * (isCold ? 0.35f : 0.55f) * vehicleComponent.getBoostMultiplier();
}
private @Nullable PlayerEntity getPlayerPassenger() {
if (getFlag(EntityFlag.SADDLED) && !passengers.isEmpty() && passengers.get(0) instanceof PlayerEntity playerEntity) {
return playerEntity;
}
return null;
}
@Override
public boolean isClientControlled() {
return getFlag(EntityFlag.SADDLED)
&& !passengers.isEmpty()
&& passengers.get(0) == session.getPlayerEntity()
&& session.getPlayerInventory().isHolding(Items.WARPED_FUNGUS_ON_A_STICK);
return getPlayerPassenger() == session.getPlayerEntity() && session.getPlayerInventory().isHolding(Items.WARPED_FUNGUS_ON_A_STICK);
}
@Override

View file

@ -52,14 +52,9 @@ public class BoostableVehicleComponent<T extends LivingEntity & ClientVehicle> e
return boostTicks <= boostLength;
}
@Override
public boolean tickVehicle() {
boolean clientControlled = super.tickVehicle();
if (clientControlled && isBoosting()) {
// TODO: the client ticks boost if any player is controlling
public void tickBoost() {
if (isBoosting()) {
boostTicks++;
}
return clientControlled;
}
}

View file

@ -55,7 +55,7 @@ public class CamelVehicleComponent extends VehicleComponent<CamelEntity> {
}
@Override
public boolean tickVehicle() {
public void tickVehicle() {
if (this.dashTick != 0) {
if (vehicle.getSession().getTicks() > this.dashTick) {
vehicle.setFlag(EntityFlag.HAS_DASH_COOLDOWN, false);
@ -67,8 +67,6 @@ public class CamelVehicleComponent extends VehicleComponent<CamelEntity> {
vehicle.setFlag(EntityFlag.CAN_DASH, vehicle.getFlag(EntityFlag.SADDLED) && !isStationary());
vehicle.updateBedrockMetadata();
return super.tickVehicle();
}
@Override

View file

@ -165,9 +165,9 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
//
}
public boolean tickVehicle() {
public void tickVehicle() {
if (!vehicle.isClientControlled()) {
return false;
return;
}
VehicleContext ctx = new VehicleContext();
@ -185,8 +185,6 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
}
case EMPTY -> landMovement(ctx);
}
return true;
}
protected ObjectDoublePair<Fluid> updateFluidMovement(VehicleContext ctx) {

View file

@ -43,6 +43,7 @@ public class StoredItemMappings {
private final ItemMapping banner;
private final ItemMapping barrier;
private final ItemMapping bow;
private final ItemMapping carrotOnAStick;
private final ItemMapping compass;
private final ItemMapping crossbow;
private final ItemMapping egg;
@ -51,6 +52,7 @@ public class StoredItemMappings {
private final ItemMapping powderSnowBucket;
private final ItemMapping shield;
private final ItemMapping upgradeTemplate;
private final ItemMapping warpedFungusOnAStick;
private final ItemMapping wheat;
private final ItemMapping writableBook;
private final ItemMapping writtenBook;
@ -59,6 +61,7 @@ public class StoredItemMappings {
this.banner = load(itemMappings, Items.WHITE_BANNER); // As of 1.17.10, all banners have the same Bedrock ID
this.barrier = load(itemMappings, Items.BARRIER);
this.bow = load(itemMappings, Items.BOW);
this.carrotOnAStick = load(itemMappings, Items.CARROT_ON_A_STICK);
this.compass = load(itemMappings, Items.COMPASS);
this.crossbow = load(itemMappings, Items.CROSSBOW);
this.egg = load(itemMappings, Items.EGG);
@ -67,6 +70,7 @@ public class StoredItemMappings {
this.powderSnowBucket = load(itemMappings, Items.POWDER_SNOW_BUCKET);
this.shield = load(itemMappings, Items.SHIELD);
this.upgradeTemplate = load(itemMappings, Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE);
this.warpedFungusOnAStick = load(itemMappings, Items.WARPED_FUNGUS_ON_A_STICK);
this.wheat = load(itemMappings, Items.WHEAT);
this.writableBook = load(itemMappings, Items.WRITABLE_BOOK);
this.writtenBook = load(itemMappings, Items.WRITTEN_BOOK);