diff --git a/Common/src/main/java/tschipp/carryon/common/carry/CarryOnData.java b/Common/src/main/java/tschipp/carryon/common/carry/CarryOnData.java index 6aa089c..b8a0156 100644 --- a/Common/src/main/java/tschipp/carryon/common/carry/CarryOnData.java +++ b/Common/src/main/java/tschipp/carryon/common/carry/CarryOnData.java @@ -38,6 +38,7 @@ import net.minecraft.world.entity.AreaEffectCloud; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySpawnReason; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -50,6 +51,7 @@ import tschipp.carryon.common.scripting.CarryOnScript; import javax.annotation.Nullable; import java.util.Optional; +import java.util.UUID; public class CarryOnData { @@ -103,6 +105,11 @@ public class CarryOnData { } + public CarryType getType() + { + return this.type; + } + public CompoundTag getNbt() { nbt.putString("type", type.toString()); @@ -201,8 +208,20 @@ public class CarryOnData { this.activeScript = script; } - public void setCarryingPlayer() { + public void setCarryingPlayer(Player player) + { this.type = CarryType.PLAYER; + nbt.putString("player", player.getStringUUID().toString()); + } + + public Player getCarryingPlayer(Level level) + { + if(this.type != CarryType.PLAYER) + throw new IllegalStateException("Called getCarryingPlayer on data that contained " + this.type); + if(!nbt.contains("player")) + return null; + UUID uuid = UUID.fromString(nbt.getString("player").get()); + return level.getServer().getPlayerList().getPlayer(uuid); } public boolean isCarrying() diff --git a/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java b/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java index dc9f9f4..0963957 100644 --- a/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java +++ b/Common/src/main/java/tschipp/carryon/common/carry/PickupHandler.java @@ -239,9 +239,9 @@ public class PickupHandler { player.level().getServer().getCommands().performPrefixedCommand(player.level().getServer().createCommandSourceStack(), "/execute as " + player.getGameProfile().name() + " run " + cmd); } - otherPlayer.startRiding(player, true,true); + otherPlayer.startRiding(player, true, false); Services.PLATFORM.sendPacketToAllPlayers(Constants.PACKET_ID_START_RIDING_OTHER, new ClientboundStartRidingOtherPlayerPacket(player.getId(), otherPlayer.getId(), true), player.level()); - carry.setCarryingPlayer(); + carry.setCarryingPlayer(otherPlayer); player.swing(InteractionHand.MAIN_HAND, true); player.level().playSound(null, player.getOnPos(), SoundEvents.ARMOR_EQUIP_GENERIC.value(), SoundSource.AMBIENT, 1.0f, 0.5f); CarryOnDataManager.setCarryData(player, carry); diff --git a/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java b/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java index db41e5b..64b2860 100644 --- a/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java +++ b/Common/src/main/java/tschipp/carryon/common/carry/PlacementHandler.java @@ -175,7 +175,7 @@ public class PlacementHandler Vec3 placementPos = Vec3.atBottomCenterOf(pos); if (carry.isCarrying(CarryType.PLAYER)) { - Entity otherPlayer = player.getFirstPassenger(); + Entity otherPlayer = carry.getCarryingPlayer(level); player.ejectPassengers(); Services.PLATFORM.sendPacketToAllPlayers(Constants.PACKET_ID_START_RIDING_OTHER, new ClientboundStartRidingOtherPlayerPacket(player.getId(), otherPlayer.getId(), false), player.level()); carry.clear(); diff --git a/Common/src/main/java/tschipp/carryon/mixin/EntityMixin.java b/Common/src/main/java/tschipp/carryon/mixin/EntityMixin.java index c434768..9a314e0 100644 --- a/Common/src/main/java/tschipp/carryon/mixin/EntityMixin.java +++ b/Common/src/main/java/tschipp/carryon/mixin/EntityMixin.java @@ -34,6 +34,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; + import tschipp.carryon.Constants; import tschipp.carryon.common.carry.CarryOnData; import tschipp.carryon.common.carry.CarryOnData.CarryType; @@ -47,6 +50,13 @@ public abstract class EntityMixin @Shadow public boolean hasPassenger(Entity pEntity) {throw new IllegalStateException("EntityMixin application failed");} + + @ModifyExpressionValue(method = "startRiding(Lnet/minecraft/world/entity/Entity;ZZ)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/EntityType;canSerialize()Z")) + private boolean onStartRidingCheck(boolean original, Entity entity, boolean force) { + if (force && entity instanceof Player) return true; + return original; + } + @Shadow public abstract void onPassengerTurned(Entity $$0); @Inject(method = "positionRider(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/entity/Entity$MoveFunction;)V", at = @At("HEAD"), cancellable = true) diff --git a/Common/src/main/java/tschipp/carryon/mixin/PlayerMixin.java b/Common/src/main/java/tschipp/carryon/mixin/PlayerMixin.java index 1806385..3c67966 100644 --- a/Common/src/main/java/tschipp/carryon/mixin/PlayerMixin.java +++ b/Common/src/main/java/tschipp/carryon/mixin/PlayerMixin.java @@ -21,17 +21,23 @@ package tschipp.carryon.mixin; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.ValueInput; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import tschipp.carryon.common.carry.CarryOnData; import tschipp.carryon.common.carry.CarryOnDataManager; +import tschipp.carryon.common.carry.PlacementHandler; +import tschipp.carryon.common.carry.CarryOnData.CarryType; import java.util.Optional; @@ -50,4 +56,17 @@ public abstract class PlayerMixin extends LivingEntity { res.ifPresent(data -> CarryOnDataManager.setCarryData((Player)((Object)this), data)); } + + @Override + public void stopRiding() { + Entity entity = this.getVehicle(); + if (entity instanceof Player && entity.getPassengers().size() < 2){ + CarryOnData carry = CarryOnDataManager.getCarryData((Player) entity); + if (carry.getType() == CarryType.PLAYER){ + carry.clear(); + ((Player) entity).removeEffect(MobEffects.SLOWNESS); + } + } + super.stopRiding(); + } }