Update upstream
This commit is contained in:
parent
b254d6f8fb
commit
5640328bad
|
@ -1,15 +1,14 @@
|
||||||
package io.izzel.arclight.common.bridge.core.entity.player;
|
package io.izzel.arclight.common.bridge.core.entity.player;
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
||||||
|
import org.bukkit.event.player.PlayerSpawnChangeEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public interface ServerPlayerEntityBridge extends PlayerEntityBridge {
|
public interface ServerPlayerEntityBridge extends PlayerEntityBridge {
|
||||||
|
|
||||||
|
@ -18,6 +17,8 @@ public interface ServerPlayerEntityBridge extends PlayerEntityBridge {
|
||||||
|
|
||||||
void bridge$pushChangeDimensionCause(PlayerTeleportEvent.TeleportCause cause);
|
void bridge$pushChangeDimensionCause(PlayerTeleportEvent.TeleportCause cause);
|
||||||
|
|
||||||
|
void bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause cause);
|
||||||
|
|
||||||
Optional<PlayerTeleportEvent.TeleportCause> bridge$getTeleportCause();
|
Optional<PlayerTeleportEvent.TeleportCause> bridge$getTeleportCause();
|
||||||
|
|
||||||
BlockPos bridge$getSpawnPoint(ServerLevel world);
|
BlockPos bridge$getSpawnPoint(ServerLevel world);
|
||||||
|
|
|
@ -985,6 +985,13 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "*", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;performChatCommand(Lnet/minecraft/network/protocol/game/ServerboundChatCommandPacket;Lnet/minecraft/network/chat/LastSeenMessages;)V"))
|
||||||
|
private void arclight$rejectIfDisconnect(CallbackInfo ci) {
|
||||||
|
if (this.player.hasDisconnected()) {
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author IzzelAliz
|
* @author IzzelAliz
|
||||||
* @reason
|
* @reason
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package io.izzel.arclight.common.mixin.core.server.commands;
|
||||||
|
|
||||||
|
import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge;
|
||||||
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.server.commands.SetSpawnCommand;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import org.bukkit.event.player.PlayerSpawnChangeEvent;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
@Mixin(SetSpawnCommand.class)
|
||||||
|
public class SetSpawnCommandMixin {
|
||||||
|
|
||||||
|
@Inject(method = "setSpawn", at = @At("HEAD"))
|
||||||
|
private static void arclight$cause(CommandSourceStack p_138650_, Collection<ServerPlayer> players, BlockPos p_138652_, float p_138653_, CallbackInfoReturnable<Integer> cir) {
|
||||||
|
for (ServerPlayer player : players) {
|
||||||
|
((ServerPlayerEntityBridge) player).bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause.COMMAND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -66,11 +66,7 @@ import org.bukkit.craftbukkit.v.CraftWorld;
|
||||||
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v.util.CraftChatMessage;
|
import org.bukkit.craftbukkit.v.util.CraftChatMessage;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
import org.bukkit.event.player.*;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import org.bukkit.event.player.PlayerLoginEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
|
||||||
import org.spigotmc.SpigotConfig;
|
import org.spigotmc.SpigotConfig;
|
||||||
import org.spigotmc.event.player.PlayerSpawnLocationEvent;
|
import org.spigotmc.event.player.PlayerSpawnLocationEvent;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
@ -298,12 +294,13 @@ public abstract class PlayerListMixin implements PlayerListBridge {
|
||||||
f2 = (float) Mth.wrapDegrees(Mth.atan2(vec3d2.z, vec3d2.x) * 57.2957763671875 - 90.0);
|
f2 = (float) Mth.wrapDegrees(Mth.atan2(vec3d2.z, vec3d2.x) * 57.2957763671875 - 90.0);
|
||||||
}
|
}
|
||||||
// playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f);
|
// playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f);
|
||||||
playerIn.setRespawnPosition(spawnWorld.dimension(), pos, f2, flag2, false);
|
// playerIn.setRespawnPosition(spawnWorld.dimension(), pos, f2, flag2, false);
|
||||||
flag3 = (!flag && flag4);
|
flag3 = (!flag && flag4);
|
||||||
isBedSpawn = true;
|
isBedSpawn = true;
|
||||||
location = new Location(((WorldBridge) spawnWorld).bridge$getWorld(), vec3d.x, vec3d.y, vec3d.z);
|
location = new Location(((WorldBridge) spawnWorld).bridge$getWorld(), vec3d.x, vec3d.y, vec3d.z);
|
||||||
} else if (pos != null) {
|
} else if (pos != null) {
|
||||||
playerIn.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0f));
|
playerIn.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0f));
|
||||||
|
((ServerPlayerEntityBridge) playerIn).bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause.RESET);
|
||||||
playerIn.setRespawnPosition(Level.OVERWORLD, null, 0f, false, false); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed
|
playerIn.setRespawnPosition(Level.OVERWORLD, null, 0f, false, false); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -419,12 +416,13 @@ public abstract class PlayerListMixin implements PlayerListBridge {
|
||||||
f2 = (float) Mth.wrapDegrees(Mth.atan2(vec3d2.z, vec3d2.x) * 57.2957763671875 - 90.0);
|
f2 = (float) Mth.wrapDegrees(Mth.atan2(vec3d2.z, vec3d2.x) * 57.2957763671875 - 90.0);
|
||||||
}
|
}
|
||||||
// playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f);
|
// playerIn.setLocationAndAngles(vec3d.x, vec3d.y, vec3d.z, f2, 0.0f);
|
||||||
playerIn.setRespawnPosition(spawnWorld.dimension(), pos, f2, flag2, false);
|
// playerIn.setRespawnPosition(spawnWorld.dimension(), pos, f2, flag2, false);
|
||||||
flag3 = (!flag2 && flag4);
|
flag3 = (!flag2 && flag4);
|
||||||
isBedSpawn = true;
|
isBedSpawn = true;
|
||||||
location = new Location(((WorldBridge) spawnWorld).bridge$getWorld(), vec3d.x, vec3d.y, vec3d.z);
|
location = new Location(((WorldBridge) spawnWorld).bridge$getWorld(), vec3d.x, vec3d.y, vec3d.z);
|
||||||
} else if (pos != null) {
|
} else if (pos != null) {
|
||||||
playerIn.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0f));
|
playerIn.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0f));
|
||||||
|
((ServerPlayerEntityBridge) playerIn).bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause.RESET);
|
||||||
playerIn.setRespawnPosition(Level.OVERWORLD, null, 0f, false, false);
|
playerIn.setRespawnPosition(Level.OVERWORLD, null, 0f, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,8 @@ import net.minecraft.world.level.ExplosionDamageCalculator;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.BaseFireBlock;
|
import net.minecraft.world.level.block.BaseFireBlock;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.Blocks;
|
||||||
|
import net.minecraft.world.level.block.TntBlock;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.gameevent.GameEvent;
|
import net.minecraft.world.level.gameevent.GameEvent;
|
||||||
|
@ -40,12 +42,9 @@ import org.bukkit.Location;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
import org.bukkit.event.block.BlockExplodeEvent;
|
import org.bukkit.event.block.BlockExplodeEvent;
|
||||||
import org.bukkit.event.block.BlockIgniteEvent;
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
|
import org.bukkit.event.block.TNTPrimeEvent;
|
||||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.*;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
|
||||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
@ -271,6 +270,16 @@ public abstract class ExplosionMixin implements ExplosionBridge {
|
||||||
for (BlockPos blockpos : this.toBlow) {
|
for (BlockPos blockpos : this.toBlow) {
|
||||||
BlockState blockstate = this.level.getBlockState(blockpos);
|
BlockState blockstate = this.level.getBlockState(blockpos);
|
||||||
Block block = blockstate.getBlock();
|
Block block = blockstate.getBlock();
|
||||||
|
// CraftBukkit start - TNTPrimeEvent
|
||||||
|
if (block instanceof TntBlock) {
|
||||||
|
var sourceEntity = source == null ? null : source;
|
||||||
|
var sourceBlock = sourceEntity == null ? BlockPos.containing(this.x, this.y, this.z) : null;
|
||||||
|
if (!CraftEventFactory.callTNTPrimeEvent(this.level, blockpos, TNTPrimeEvent.PrimeCause.EXPLOSION, sourceEntity, sourceBlock)) {
|
||||||
|
this.level.sendBlockUpdated(blockpos, Blocks.AIR.defaultBlockState(), blockstate, 3); // Update the block on the client
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// CraftBukkit end
|
||||||
if (!blockstate.isAir()) {
|
if (!blockstate.isAir()) {
|
||||||
BlockPos blockpos1 = blockpos.immutable();
|
BlockPos blockpos1 = blockpos.immutable();
|
||||||
this.level.getProfiler().push("explosion_blocks");
|
this.level.getProfiler().push("explosion_blocks");
|
||||||
|
|
|
@ -12,6 +12,8 @@ import org.bukkit.craftbukkit.v.entity.CraftLivingEntity;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
import org.bukkit.event.entity.EntityTargetEvent;
|
import org.bukkit.event.entity.EntityTargetEvent;
|
||||||
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
|
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
|
||||||
|
import org.bukkit.event.player.PlayerExpCooldownChangeEvent;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
@ -67,6 +69,11 @@ public abstract class ExperienceOrbMixin extends EntityMixin {
|
||||||
player.giveExperiencePoints(CraftEventFactory.callPlayerExpChangeEvent(player, amount).getAmount());
|
player.giveExperiencePoints(CraftEventFactory.callPlayerExpChangeEvent(player, amount).getAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "playerTouch", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/world/entity/player/Player;takeXpDelay:I"))
|
||||||
|
private void arclight$cooldown(Player instance, int value) {
|
||||||
|
instance.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(instance, value, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author IzzelAliz
|
* @author IzzelAliz
|
||||||
* @reason
|
* @reason
|
||||||
|
|
|
@ -10,6 +10,7 @@ import io.izzel.arclight.common.bridge.core.network.play.ServerPlayNetHandlerBri
|
||||||
import io.izzel.arclight.common.bridge.core.util.FoodStatsBridge;
|
import io.izzel.arclight.common.bridge.core.util.FoodStatsBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.world.TeleporterBridge;
|
import io.izzel.arclight.common.bridge.core.world.TeleporterBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.world.WorldBridge;
|
import io.izzel.arclight.common.bridge.core.world.WorldBridge;
|
||||||
|
import io.izzel.arclight.common.bridge.core.world.server.ServerWorldBridge;
|
||||||
import io.izzel.arclight.common.mod.server.block.ChestBlockDoubleInventoryHacks;
|
import io.izzel.arclight.common.mod.server.block.ChestBlockDoubleInventoryHacks;
|
||||||
import io.izzel.arclight.common.mod.util.ArclightCaptures;
|
import io.izzel.arclight.common.mod.util.ArclightCaptures;
|
||||||
import net.minecraft.BlockUtil;
|
import net.minecraft.BlockUtil;
|
||||||
|
@ -99,13 +100,7 @@ import org.bukkit.craftbukkit.v.util.BlockStateListPopulator;
|
||||||
import org.bukkit.craftbukkit.v.util.CraftChatMessage;
|
import org.bukkit.craftbukkit.v.util.CraftChatMessage;
|
||||||
import org.bukkit.event.entity.EntityPotionEffectEvent;
|
import org.bukkit.event.entity.EntityPotionEffectEvent;
|
||||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
import org.bukkit.event.player.PlayerBedLeaveEvent;
|
import org.bukkit.event.player.*;
|
||||||
import org.bukkit.event.player.PlayerChangedMainHandEvent;
|
|
||||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
|
||||||
import org.bukkit.event.player.PlayerLocaleChangeEvent;
|
|
||||||
import org.bukkit.event.player.PlayerPortalEvent;
|
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
|
||||||
import org.bukkit.event.player.PlayerToggleSneakEvent;
|
|
||||||
import org.bukkit.event.world.PortalCreateEvent;
|
import org.bukkit.event.world.PortalCreateEvent;
|
||||||
import org.bukkit.inventory.MainHand;
|
import org.bukkit.inventory.MainHand;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
@ -160,7 +155,6 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
|
||||||
@Shadow protected abstract void tellNeutralMobsThatIDied();
|
@Shadow protected abstract void tellNeutralMobsThatIDied();
|
||||||
@Shadow protected abstract void createEndPlatform(ServerLevel p_242110_1_, BlockPos p_242110_2_);
|
@Shadow protected abstract void createEndPlatform(ServerLevel p_242110_1_, BlockPos p_242110_2_);
|
||||||
@Shadow public abstract boolean isCreative();
|
@Shadow public abstract boolean isCreative();
|
||||||
@Shadow public abstract void setRespawnPosition(ResourceKey<Level> p_242111_1_, @org.jetbrains.annotations.Nullable BlockPos p_242111_2_, float p_242111_3_, boolean p_242111_4_, boolean p_242111_5_);
|
|
||||||
@Shadow protected abstract boolean bedBlocked(BlockPos p_241156_1_, Direction p_241156_2_);
|
@Shadow protected abstract boolean bedBlocked(BlockPos p_241156_1_, Direction p_241156_2_);
|
||||||
@Shadow protected abstract boolean bedInRange(BlockPos p_241147_1_, Direction p_241147_2_);
|
@Shadow protected abstract boolean bedInRange(BlockPos p_241147_1_, Direction p_241147_2_);
|
||||||
@Shadow public abstract void setLevel(ServerLevel p_143426_);
|
@Shadow public abstract void setLevel(ServerLevel p_143426_);
|
||||||
|
@ -170,6 +164,10 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
|
||||||
@Shadow public abstract void shadow$nextContainerCounter();
|
@Shadow public abstract void shadow$nextContainerCounter();
|
||||||
@Shadow public abstract void initMenu(AbstractContainerMenu p_143400_);
|
@Shadow public abstract void initMenu(AbstractContainerMenu p_143400_);
|
||||||
@Shadow public abstract boolean teleportTo(ServerLevel p_265564_, double p_265424_, double p_265680_, double p_265312_, Set<RelativeMovement> p_265192_, float p_265059_, float p_265266_);
|
@Shadow public abstract boolean teleportTo(ServerLevel p_265564_, double p_265424_, double p_265680_, double p_265312_, Set<RelativeMovement> p_265192_, float p_265059_, float p_265266_);
|
||||||
|
@Shadow @Nullable private BlockPos respawnPosition;
|
||||||
|
@Shadow public abstract void sendSystemMessage(Component p_215097_);
|
||||||
|
@Shadow private float respawnAngle;
|
||||||
|
@Shadow private boolean respawnForced;
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
public String displayName;
|
public String displayName;
|
||||||
|
@ -648,7 +646,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
|
||||||
if (this.bedBlocked(blockposition, enumdirection)) {
|
if (this.bedBlocked(blockposition, enumdirection)) {
|
||||||
return Either.left(Player.BedSleepingProblem.OBSTRUCTED);
|
return Either.left(Player.BedSleepingProblem.OBSTRUCTED);
|
||||||
}
|
}
|
||||||
this.setRespawnPosition(this.level.dimension(), blockposition, this.getYRot(), false, true);
|
this.setRespawnPosition(this.level.dimension(), blockposition, this.getYRot(), false, true, PlayerSpawnChangeEvent.Cause.BED);
|
||||||
if (this.level.isDay()) {
|
if (this.level.isDay()) {
|
||||||
return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW);
|
return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW);
|
||||||
}
|
}
|
||||||
|
@ -677,6 +675,11 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
|
||||||
return arclight$fireBedEvent(either, pos).ifRight(consumer);
|
return arclight$fireBedEvent(either, pos).ifRight(consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject(method = "startSleepInBed", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V"))
|
||||||
|
private void arclight$bedCause(BlockPos p_9115_, CallbackInfoReturnable<Either<Player.BedSleepingProblem, Unit>> cir) {
|
||||||
|
this.bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause.BED);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private <L, R> Either<L, R> arclight$fireBedEvent(Either<L, R> e, BlockPos pos) {
|
private <L, R> Either<L, R> arclight$fireBedEvent(Either<L, R> e, BlockPos pos) {
|
||||||
Either<Player.BedSleepingProblem, Unit> either = (Either<Player.BedSleepingProblem, Unit>) e;
|
Either<Player.BedSleepingProblem, Unit> either = (Either<Player.BedSleepingProblem, Unit>) e;
|
||||||
|
@ -948,6 +951,68 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
|
||||||
return super.isImmobile() || !this.getBukkitEntity().isOnline();
|
return super.isImmobile() || !this.getBukkitEntity().isOnline();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private transient PlayerSpawnChangeEvent.Cause arclight$spawnChangeCause;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause cause) {
|
||||||
|
this.arclight$spawnChangeCause = cause;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRespawnPosition(ResourceKey<Level> p_9159_, @Nullable BlockPos p_9160_, float p_9161_, boolean p_9162_, boolean p_9163_, PlayerSpawnChangeEvent.Cause cause) {
|
||||||
|
arclight$spawnChangeCause = cause;
|
||||||
|
this.setRespawnPosition(p_9159_, p_9160_, p_9161_, p_9162_, p_9163_);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author IzzelAliz
|
||||||
|
* @reason
|
||||||
|
*/
|
||||||
|
@Overwrite
|
||||||
|
public void setRespawnPosition(ResourceKey<Level> p_9159_, @Nullable BlockPos p_9160_, float p_9161_, boolean p_9162_, boolean p_9163_) {
|
||||||
|
if (ForgeEventFactory.onPlayerSpawnSet((ServerPlayer) (Object) this, p_9160_ == null ? Level.OVERWORLD : p_9159_, p_9160_, p_9162_))
|
||||||
|
return;
|
||||||
|
var cause = arclight$spawnChangeCause == null ? PlayerSpawnChangeEvent.Cause.UNKNOWN : arclight$spawnChangeCause;
|
||||||
|
arclight$spawnChangeCause = null;
|
||||||
|
var newWorld = this.server.getLevel(p_9159_);
|
||||||
|
Location newSpawn = (p_9160_ != null) ? new Location(((ServerWorldBridge) newWorld).bridge$getWorld(), p_9160_.getX(), p_9160_.getY(), p_9160_.getZ(), p_9161_, 0) : null;
|
||||||
|
|
||||||
|
PlayerSpawnChangeEvent event = new PlayerSpawnChangeEvent(this.getBukkitEntity(), newSpawn, p_9162_, cause);
|
||||||
|
Bukkit.getServer().getPluginManager().callEvent(event);
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newSpawn = event.getNewSpawn();
|
||||||
|
p_9162_ = event.isForced();
|
||||||
|
|
||||||
|
if (newSpawn != null) {
|
||||||
|
p_9159_ = ((CraftWorld) newSpawn.getWorld()).getHandle().dimension();
|
||||||
|
p_9160_ = BlockPos.containing(newSpawn.getX(), newSpawn.getY(), newSpawn.getZ());
|
||||||
|
p_9161_ = newSpawn.getYaw();
|
||||||
|
} else {
|
||||||
|
p_9159_ = Level.OVERWORLD;
|
||||||
|
p_9160_ = null;
|
||||||
|
p_9161_ = 0.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_9160_ != null) {
|
||||||
|
boolean flag = p_9160_.equals(this.respawnPosition) && p_9159_.equals(this.respawnDimension);
|
||||||
|
if (p_9163_ && !flag) {
|
||||||
|
this.sendSystemMessage(Component.translatable("block.minecraft.set_spawn"));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.respawnPosition = p_9160_;
|
||||||
|
this.respawnDimension = p_9159_;
|
||||||
|
this.respawnAngle = p_9161_;
|
||||||
|
this.respawnForced = p_9162_;
|
||||||
|
} else {
|
||||||
|
this.respawnPosition = null;
|
||||||
|
this.respawnDimension = Level.OVERWORLD;
|
||||||
|
this.respawnAngle = 0.0F;
|
||||||
|
this.respawnForced = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Scoreboard getScoreboard() {
|
public Scoreboard getScoreboard() {
|
||||||
return this.getBukkitEntity().getScoreboard().getHandle();
|
return this.getBukkitEntity().getScoreboard().getHandle();
|
||||||
|
|
|
@ -9,12 +9,14 @@ import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.stats.Stats;
|
import net.minecraft.stats.Stats;
|
||||||
import net.minecraft.tags.ItemTags;
|
import net.minecraft.tags.ItemTags;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
|
import net.minecraft.util.RandomSource;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.ExperienceOrb;
|
import net.minecraft.world.entity.ExperienceOrb;
|
||||||
import net.minecraft.world.entity.item.ItemEntity;
|
import net.minecraft.world.entity.item.ItemEntity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.entity.projectile.FishingHook;
|
import net.minecraft.world.entity.projectile.FishingHook;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.storage.loot.BuiltInLootTables;
|
import net.minecraft.world.level.storage.loot.BuiltInLootTables;
|
||||||
import net.minecraft.world.level.storage.loot.LootContext;
|
import net.minecraft.world.level.storage.loot.LootContext;
|
||||||
import net.minecraft.world.level.storage.loot.LootTable;
|
import net.minecraft.world.level.storage.loot.LootTable;
|
||||||
|
@ -54,7 +56,13 @@ public abstract class FishingHookMixin extends ProjectileMixin {
|
||||||
|
|
||||||
public int minWaitTime = 100;
|
public int minWaitTime = 100;
|
||||||
public int maxWaitTime = 600;
|
public int maxWaitTime = 600;
|
||||||
|
public int minLureTime = 20;
|
||||||
|
public int maxLureTime = 80;
|
||||||
|
public float minLureAngle = 0.0F;
|
||||||
|
public float maxLureAngle = 360.0F;
|
||||||
public boolean applyLure = true;
|
public boolean applyLure = true;
|
||||||
|
public boolean rainInfluenced = true;
|
||||||
|
public boolean skyInfluenced = true;
|
||||||
|
|
||||||
@Redirect(method = "checkCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/FishingHook;onHit(Lnet/minecraft/world/phys/HitResult;)V"))
|
@Redirect(method = "checkCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/FishingHook;onHit(Lnet/minecraft/world/phys/HitResult;)V"))
|
||||||
private void arclight$collide(FishingHook fishingHook, HitResult hitResult) {
|
private void arclight$collide(FishingHook fishingHook, HitResult hitResult) {
|
||||||
|
@ -84,6 +92,26 @@ public abstract class FishingHookMixin extends ProjectileMixin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "catchingFish", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;isRainingAt(Lnet/minecraft/core/BlockPos;)Z"))
|
||||||
|
private boolean arclight$rainInfluenced(Level level, BlockPos pos) {
|
||||||
|
return this.rainInfluenced && level.isRainingAt(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "catchingFish", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;canSeeSky(Lnet/minecraft/core/BlockPos;)Z"))
|
||||||
|
private boolean arclight$skyInfluenced(Level instance, BlockPos blockPos) {
|
||||||
|
return this.skyInfluenced && instance.canSeeSky(blockPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "catchingFish", at = @At(value = "INVOKE", ordinal = 2, target = "Lnet/minecraft/util/Mth;nextFloat(Lnet/minecraft/util/RandomSource;FF)F"))
|
||||||
|
private float arclight$lureAngleParam(RandomSource random, float p_216269_, float p_216270_) {
|
||||||
|
return Mth.nextFloat(random, this.minLureAngle, this.maxLureAngle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "catchingFish", at = @At(value = "INVOKE", ordinal = 2, target = "Lnet/minecraft/util/Mth;nextInt(Lnet/minecraft/util/RandomSource;II)I"))
|
||||||
|
private int arclight$lureTimeParam(RandomSource random, int p_216273_, int p_216274_) {
|
||||||
|
return Mth.nextInt(random, this.minLureTime, this.maxLureTime);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author IzzelAliz
|
* @author IzzelAliz
|
||||||
* @reason
|
* @reason
|
||||||
|
|
|
@ -11,6 +11,7 @@ import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.FireBlock;
|
import net.minecraft.world.level.block.FireBlock;
|
||||||
|
import net.minecraft.world.level.block.TntBlock;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
|
@ -20,6 +21,7 @@ import org.bukkit.craftbukkit.v.block.CraftBlockStates;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
import org.bukkit.event.block.BlockBurnEvent;
|
import org.bukkit.event.block.BlockBurnEvent;
|
||||||
import org.bukkit.event.block.BlockFadeEvent;
|
import org.bukkit.event.block.BlockFadeEvent;
|
||||||
|
import org.bukkit.event.block.TNTPrimeEvent;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
@ -63,6 +65,10 @@ public abstract class FireBlockMixin extends BaseFireBlockMixin implements FireB
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (worldIn.getBlockState(pos).getBlock() instanceof TntBlock && !CraftEventFactory.callTNTPrimeEvent(worldIn, pos, TNTPrimeEvent.PrimeCause.FIRE, null, pos.relative(face))) {
|
||||||
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package io.izzel.arclight.common.mixin.core.world.level.block;
|
||||||
|
|
||||||
|
import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.InteractionHand;
|
||||||
|
import net.minecraft.world.InteractionResult;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.block.RespawnAnchorBlock;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.phys.BlockHitResult;
|
||||||
|
import org.bukkit.event.player.PlayerSpawnChangeEvent;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(RespawnAnchorBlock.class)
|
||||||
|
public class RespawnAnchorBlockMixin {
|
||||||
|
|
||||||
|
@Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V"))
|
||||||
|
private void arclight$cause(BlockState p_55874_, Level p_55875_, BlockPos p_55876_, Player player, InteractionHand p_55878_, BlockHitResult p_55879_, CallbackInfoReturnable<InteractionResult> cir) {
|
||||||
|
((ServerPlayerEntityBridge) player).bridge$pushChangeSpawnCause(PlayerSpawnChangeEvent.Cause.RESPAWN_ANCHOR);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,23 +1,59 @@
|
||||||
package io.izzel.arclight.common.mixin.core.world.level.block;
|
package io.izzel.arclight.common.mixin.core.world.level.block;
|
||||||
|
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.world.InteractionHand;
|
||||||
|
import net.minecraft.world.InteractionResult;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.entity.projectile.Projectile;
|
import net.minecraft.world.entity.projectile.Projectile;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.TntBlock;
|
import net.minecraft.world.level.block.TntBlock;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.phys.BlockHitResult;
|
import net.minecraft.world.phys.BlockHitResult;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
|
import org.bukkit.event.block.TNTPrimeEvent;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@Mixin(TntBlock.class)
|
@Mixin(TntBlock.class)
|
||||||
public class TntBlockMixin {
|
public abstract class TntBlockMixin {
|
||||||
|
|
||||||
|
@Redirect(method = "onPlace", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z"))
|
||||||
|
private boolean arclight$redstone1(Level instance, BlockPos pos) {
|
||||||
|
return instance.hasNeighborSignal(pos) && CraftEventFactory.callTNTPrimeEvent(instance, pos, TNTPrimeEvent.PrimeCause.REDSTONE, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "neighborChanged", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;hasNeighborSignal(Lnet/minecraft/core/BlockPos;)Z"))
|
||||||
|
private boolean arclight$redstone2(Level instance, BlockPos pos, BlockState p_57457_, Level p_57458_, BlockPos p_57459_, Block p_57460_, BlockPos source) {
|
||||||
|
return instance.hasNeighborSignal(pos) && CraftEventFactory.callTNTPrimeEvent(instance, pos, TNTPrimeEvent.PrimeCause.REDSTONE, null, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "playerWillDestroy", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/TntBlock;onCaughtFire(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/world/entity/LivingEntity;)V"))
|
||||||
|
private void arclight$playerBreak(TntBlock instance, BlockState state, Level world, BlockPos pos, Direction face, LivingEntity igniter,
|
||||||
|
Level p_57445_, BlockPos p_57446_, BlockState p_57447_, Player player) {
|
||||||
|
if (CraftEventFactory.callTNTPrimeEvent(world, pos, TNTPrimeEvent.PrimeCause.BLOCK_BREAK, player, null)) {
|
||||||
|
instance.onCaughtFire(state, world, pos, face, igniter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "use", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/TntBlock;onCaughtFire(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/world/entity/LivingEntity;)V"))
|
||||||
|
private void arclight$player(BlockState p_57450_, Level level, BlockPos pos, Player player, InteractionHand p_57454_, BlockHitResult p_57455_, CallbackInfoReturnable<InteractionResult> cir) {
|
||||||
|
if (!CraftEventFactory.callTNTPrimeEvent(level, pos, TNTPrimeEvent.PrimeCause.PLAYER, player, null)) {
|
||||||
|
cir.setReturnValue(InteractionResult.CONSUME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Inject(method = "onProjectileHit", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraft/world/level/block/TntBlock;onCaughtFire(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/world/entity/LivingEntity;)V"))
|
@Inject(method = "onProjectileHit", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraft/world/level/block/TntBlock;onCaughtFire(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/world/entity/LivingEntity;)V"))
|
||||||
public void arclight$entityChangeBlock(Level worldIn, BlockState state, BlockHitResult hit, Projectile projectile, CallbackInfo ci) {
|
public void arclight$entityChangeBlock(Level worldIn, BlockState state, BlockHitResult hit, Projectile projectile, CallbackInfo ci) {
|
||||||
if (CraftEventFactory.callEntityChangeBlockEvent(projectile, hit.getBlockPos(), Blocks.AIR.defaultBlockState()).isCancelled()) {
|
if (CraftEventFactory.callEntityChangeBlockEvent(projectile, hit.getBlockPos(), Blocks.AIR.defaultBlockState()).isCancelled()
|
||||||
|
|| !CraftEventFactory.callTNTPrimeEvent(worldIn, hit.getBlockPos(), TNTPrimeEvent.PrimeCause.PROJECTILE, projectile, null)) {
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
"server.commands.EffectCommandMixin",
|
"server.commands.EffectCommandMixin",
|
||||||
"server.commands.GameRuleCommandMixin",
|
"server.commands.GameRuleCommandMixin",
|
||||||
"server.commands.ReloadCommandMixin",
|
"server.commands.ReloadCommandMixin",
|
||||||
|
"server.commands.SetSpawnCommandMixin",
|
||||||
"server.commands.SummonCommandMixin",
|
"server.commands.SummonCommandMixin",
|
||||||
"server.commands.TeleportCommandMixin",
|
"server.commands.TeleportCommandMixin",
|
||||||
"server.commands.TimeCommandMixin",
|
"server.commands.TimeCommandMixin",
|
||||||
|
@ -411,6 +412,7 @@
|
||||||
"world.level.block.RedstoneOreBlockMixin",
|
"world.level.block.RedstoneOreBlockMixin",
|
||||||
"world.level.block.RedstoneTorchBlockMixin",
|
"world.level.block.RedstoneTorchBlockMixin",
|
||||||
"world.level.block.RedstoneWireBlockMixin",
|
"world.level.block.RedstoneWireBlockMixin",
|
||||||
|
"world.level.block.RespawnAnchorBlockMixin",
|
||||||
"world.level.block.RootedDirtBlockMixin",
|
"world.level.block.RootedDirtBlockMixin",
|
||||||
"world.level.block.SaplingBlockMixin",
|
"world.level.block.SaplingBlockMixin",
|
||||||
"world.level.block.ScaffoldingBlockMixin",
|
"world.level.block.ScaffoldingBlockMixin",
|
||||||
|
|
|
@ -43,7 +43,7 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
def embedLibs = [/*"org.spongepowered:mixin:$mixinVersion", */ 'org.yaml:snakeyaml:1.33',
|
def embedLibs = [/*"org.spongepowered:mixin:$mixinVersion", */ 'org.yaml:snakeyaml:1.33',
|
||||||
'org.xerial:sqlite-jdbc:3.41.0.0', 'com.mysql:mysql-connector-j:8.0.32',
|
'org.xerial:sqlite-jdbc:3.41.2.2', 'com.mysql:mysql-connector-j:8.0.32',
|
||||||
/*'commons-lang:commons-lang:2.6',*/ 'com.googlecode.json-simple:json-simple:1.1.1',
|
/*'commons-lang:commons-lang:2.6',*/ 'com.googlecode.json-simple:json-simple:1.1.1',
|
||||||
'org.apache.logging.log4j:log4j-jul:2.17.2', 'net.md-5:SpecialSource:1.11.0',
|
'org.apache.logging.log4j:log4j-jul:2.17.2', 'net.md-5:SpecialSource:1.11.0',
|
||||||
'org.jline:jline-terminal-jansi:3.12.1', 'org.fusesource.jansi:jansi:1.18',
|
'org.jline:jline-terminal-jansi:3.12.1', 'org.fusesource.jansi:jansi:1.18',
|
||||||
|
|
Loading…
Reference in New Issue
Block a user