mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Tick boost for Pig and Strider if any player is controlling
This commit is contained in:
parent
1a6c70feed
commit
cdbb27669c
6 changed files with 65 additions and 24 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue