/* * Copyright 2025-2026 R3944Realms * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package top.r3944realms.eroticdungeongame.mixin.minecraft; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; 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 org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import top.r3944realms.eroticdungeongame.api.workspace.Services; import top.r3944realms.eroticdungeongame.content.block.blockentity.BaseSeatBlockEntity; import top.r3944realms.eroticdungeongame.content.entity.SeatEntity; import top.r3944realms.eroticdungeongame.core.service.SeatService; import java.util.Optional; @Mixin(LivingEntity.class) public abstract class MixinLivingEntity extends Entity { public MixinLivingEntity(EntityType entityType, Level level) { super(entityType, level); } @WrapOperation( method = "baseTick", at = @At( value = "INVOKE", target= "Lnet/minecraft/world/entity/LivingEntity;isInWall()Z" ) ) private boolean edg$inWall$Warp(LivingEntity instance, Operation original) { return Services.WORK_SPACE.tryToDoIfInDeviceAndRet(instance, data -> false, () -> original.call(instance)); } @WrapMethod( method = "stopRiding" ) private void edg$redefineStopRiding(Operation original) { LivingEntity livingEntity = LivingEntity.class.cast(this); Services.WORK_SPACE.tryToDoIfInDevice(livingEntity, data -> { if (data.getDeviceMainBlockPos() == null || !(level().getBlockEntity(data.getDeviceMainBlockPos()) instanceof BaseSeatBlockEntity seatBe) || !seatBe.hasLockCode()) { original.call(); } else if (livingEntity instanceof Player player) { Optional playerSeat = SeatService.getPlayerSeat(player); if (playerSeat.isEmpty() || playerSeat.get().isRemoved()) { original.call(); } } }, original::call ); } }