diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index 87bfffe..5c14d0d 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -143,7 +143,7 @@ reg(false, org.bukkit.event.player.AsyncPlayerPreLoginEvent.class); reg(false, org.bukkit.event.player.PlayerAchievementAwardedEvent.class); reg(true, org.bukkit.event.player.PlayerAnimationEvent.class); //TODO cancellation - reg(false, org.bukkit.event.player.PlayerBedEnterEvent.class); + reg(true, org.bukkit.event.player.PlayerBedEnterEvent.class); reg(false, org.bukkit.event.player.PlayerBedLeaveEvent.class); reg(false, org.bukkit.event.player.PlayerBucketEmptyEvent.class); reg(false, org.bukkit.event.player.PlayerBucketFillEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayer.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayer.java index 6574e25..f88eee5 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayer.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayer.java @@ -4,17 +4,20 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayer.EnumStatus; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.entity.CraftItem; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -23,6 +26,7 @@ import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntityLivingBase; import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayer; import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayerMP; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; import org.ultramine.mods.bukkit.mixin.entity.MixinEntityLivingBase; @Mixin(net.minecraft.entity.player.EntityPlayer.class) @@ -145,4 +149,20 @@ ci.setReturnValue(null); } } + + @Inject(method = "sleepInBedAt", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/EntityPlayer;mountEntity(Lnet/minecraft/entity/Entity;)V", shift = Shift.BY, by = 2)) + public void sleepInBedAtInject(int x, int y, int z, CallbackInfoReturnable cir) + { + if (this.getBukkitEntity() instanceof Player) + { + org.bukkit.block.Block bedBlock = ((IMixinWorld) this.worldObj).getWorld().getBlockAt(x, y, z); + PlayerBedEnterEvent event = new PlayerBedEnterEvent((Player) this.getBukkitEntity(), bedBlock); + ((IMixinWorld) this.worldObj).getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) + { + cir.setReturnValue(EntityPlayer.EnumStatus.OTHER_PROBLEM); + cir.cancel(); + } + } + } }