Compare commits
10 Commits
216cf6b404
...
fded76e5ac
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fded76e5ac | ||
|
|
14bf4dc941 | ||
|
|
976e874c78 | ||
|
|
033f7507e6 | ||
|
|
072483cf95 | ||
|
|
7a0a194619 | ||
|
|
c743dbdb58 | ||
|
|
473aa47edb | ||
|
|
87c9caa8ed | ||
|
|
ef1854ccb2 |
@ -0,0 +1,42 @@
|
|||||||
|
package io.izzel.arclight.common.mixin.bukkit;
|
||||||
|
|
||||||
|
import io.izzel.arclight.api.EnumHelper;
|
||||||
|
import io.izzel.arclight.common.mod.ArclightMod;
|
||||||
|
import net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase;
|
||||||
|
import org.bukkit.craftbukkit.v.entity.CraftEnderDragon;
|
||||||
|
import org.bukkit.entity.EnderDragon;
|
||||||
|
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.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mixin(value = CraftEnderDragon.class, remap = false)
|
||||||
|
public class CraftEnderDragonMixin {
|
||||||
|
|
||||||
|
@Inject(method = "getPhase", at = @At("HEAD"))
|
||||||
|
public void arclight$getPhase(CallbackInfoReturnable<EnderDragon.Phase> cir) {
|
||||||
|
checkAndUpdateDragonPhase();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "getBukkitPhase", at = @At("HEAD"))
|
||||||
|
private static void arclight$getBukkitPhase(EnderDragonPhase phase, CallbackInfoReturnable<EnderDragon.Phase> cir) {
|
||||||
|
checkAndUpdateDragonPhase();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkAndUpdateDragonPhase() {
|
||||||
|
var forgeCount = EnderDragonPhase.getCount();
|
||||||
|
if (EnderDragon.Phase.values().length != forgeCount) {
|
||||||
|
var newTypes = new ArrayList<EnderDragon.Phase>();
|
||||||
|
for (var id = EnderDragon.Phase.values().length; id < forgeCount; id++) {
|
||||||
|
var name = "MOD_PHASE_" + id;
|
||||||
|
var newPhase = EnumHelper.makeEnum(EnderDragon.Phase.class, name, id, List.of(), List.of());
|
||||||
|
newTypes.add(newPhase);
|
||||||
|
ArclightMod.LOGGER.debug("Registered {} as ender dragon phase {}", name, newPhase);
|
||||||
|
}
|
||||||
|
EnumHelper.addEnums(EnderDragon.Phase.class, newTypes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1207,7 +1207,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
|
|||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|
||||||
InteractionResult enuminteractionresult = interaction.run(player, entity, hand);
|
InteractionResult enuminteractionresult = interaction.run(player, entity, hand);
|
||||||
if (ForgeHooks.onInteractEntityAt(player, entity, entity.position(), hand) != null) return;
|
// if (ForgeHooks.onInteractEntityAt(player, entity, entity.position(), hand) != null) return;
|
||||||
|
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) {
|
if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) {
|
||||||
@ -1233,7 +1233,11 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInteraction(InteractionHand hand, Vec3 vec) {
|
public void onInteraction(InteractionHand hand, Vec3 vec) {
|
||||||
this.performInteraction(hand, (player, e, h) -> e.interactAt(player, vec, h),
|
this.performInteraction(hand, (player, e, h) -> {
|
||||||
|
var interactionResult = ForgeHooks.onInteractEntityAt(player, entity, vec, hand);
|
||||||
|
if (interactionResult != null) return interactionResult;
|
||||||
|
return e.interactAt(player, vec, h);
|
||||||
|
},
|
||||||
new PlayerInteractAtEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(),
|
new PlayerInteractAtEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(),
|
||||||
new org.bukkit.util.Vector(vec.x, vec.y, vec.z), (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND));
|
new org.bukkit.util.Vector(vec.x, vec.y, vec.z), (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,7 +48,7 @@ public abstract class DedicatedServerMixin extends MinecraftServerMixin {
|
|||||||
BukkitRegistry.lockRegistries();
|
BukkitRegistry.lockRegistries();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "initServer", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/rcon/thread/RconThread;create(Lnet/minecraft/server/ServerInterface;)Lnet/minecraft/server/rcon/thread/RconThread;"))
|
@Inject(method = "initServer", at = @At(value = "FIELD", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties;enableRcon:Z"))
|
||||||
public void arclight$setRcon(CallbackInfoReturnable<Boolean> cir) {
|
public void arclight$setRcon(CallbackInfoReturnable<Boolean> cir) {
|
||||||
this.remoteConsole = new CraftRemoteConsoleCommandSender(this.rconConsoleSource);
|
this.remoteConsole = new CraftRemoteConsoleCommandSender(this.rconConsoleSource);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,8 +49,6 @@ public abstract class EntityTypeMixin<T extends Entity> implements EntityTypeBri
|
|||||||
public T spawn(ServerLevel worldIn, @Nullable CompoundTag compound, @Nullable Component customName, @Nullable Player playerIn, BlockPos pos, MobSpawnType reason, boolean p_220342_7_, boolean p_220342_8_, CreatureSpawnEvent.SpawnReason spawnReason) {
|
public T spawn(ServerLevel worldIn, @Nullable CompoundTag compound, @Nullable Component customName, @Nullable Player playerIn, BlockPos pos, MobSpawnType reason, boolean p_220342_7_, boolean p_220342_8_, CreatureSpawnEvent.SpawnReason spawnReason) {
|
||||||
T t = this.create(worldIn, compound, customName, playerIn, pos, reason, p_220342_7_, p_220342_8_);
|
T t = this.create(worldIn, compound, customName, playerIn, pos, reason, p_220342_7_, p_220342_8_);
|
||||||
if (t != null) {
|
if (t != null) {
|
||||||
if (t instanceof net.minecraft.world.entity.Mob && net.minecraftforge.event.ForgeEventFactory.doSpecialSpawn((net.minecraft.world.entity.Mob) t, worldIn, pos.getX(), pos.getY(), pos.getZ(), null, reason))
|
|
||||||
return null;
|
|
||||||
((IWorldWriterBridge) worldIn).bridge$pushAddEntityReason(spawnReason);
|
((IWorldWriterBridge) worldIn).bridge$pushAddEntityReason(spawnReason);
|
||||||
worldIn.addFreshEntityWithPassengers(t);
|
worldIn.addFreshEntityWithPassengers(t);
|
||||||
return t.isRemoved() ? null : t;
|
return t.isRemoved() ? null : t;
|
||||||
|
|||||||
@ -137,7 +137,7 @@ public abstract class MobMixin extends LivingEntityMixin implements MobEntityBri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var changeTargetEvent = ForgeHooks.onLivingChangeTarget((Mob) (Object) this, livingEntity, LivingChangeTargetEvent.LivingTargetType.MOB_TARGET);
|
var changeTargetEvent = ForgeHooks.onLivingChangeTarget((Mob) (Object) this, livingEntity, LivingChangeTargetEvent.LivingTargetType.MOB_TARGET);
|
||||||
if (changeTargetEvent.isCanceled()) {
|
if (!changeTargetEvent.isCanceled()) {
|
||||||
this.target = changeTargetEvent.getNewTarget();
|
this.target = changeTargetEvent.getNewTarget();
|
||||||
// noinspection removal
|
// noinspection removal
|
||||||
ForgeHooks.onLivingSetAttackTarget((Mob) (Object) this, this.target);
|
ForgeHooks.onLivingSetAttackTarget((Mob) (Object) this, this.target);
|
||||||
|
|||||||
@ -35,7 +35,7 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
|||||||
public abstract class BucketItemMixin {
|
public abstract class BucketItemMixin {
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
@Shadow public abstract boolean emptyContents(@javax.annotation.Nullable Player player, Level worldIn, BlockPos posIn, @javax.annotation.Nullable BlockHitResult rayTrace);
|
@Shadow(remap = false) public abstract boolean emptyContents(@javax.annotation.Nullable Player player, Level worldIn, BlockPos posIn, @javax.annotation.Nullable BlockHitResult rayTrace, ItemStack stack);
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
@Inject(method = "use", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/BucketPickup;pickupBlock(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/item/ItemStack;"))
|
@Inject(method = "use", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/BucketPickup;pickupBlock(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/item/ItemStack;"))
|
||||||
@ -54,11 +54,10 @@ public abstract class BucketItemMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "use", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BucketItem;emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;)Z"))
|
@Inject(method = "use", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraft/world/item/BucketItem;emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z"))
|
||||||
private void arclight$capture(Level worldIn, Player playerIn, InteractionHand handIn, CallbackInfoReturnable<InteractionResultHolder<ItemStack>> cir, ItemStack stack, BlockHitResult result) {
|
private void arclight$capture(Level worldIn, Player playerIn, InteractionHand handIn, CallbackInfoReturnable<InteractionResultHolder<ItemStack>> cir, ItemStack stack, BlockHitResult result) {
|
||||||
arclight$direction = result.getDirection();
|
arclight$direction = result.getDirection();
|
||||||
arclight$click = result.getBlockPos();
|
arclight$click = result.getBlockPos();
|
||||||
arclight$stack = stack;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "use", at = @At("RETURN"))
|
@Inject(method = "use", at = @At("RETURN"))
|
||||||
@ -66,7 +65,6 @@ public abstract class BucketItemMixin {
|
|||||||
arclight$captureItem = null;
|
arclight$captureItem = null;
|
||||||
arclight$direction = null;
|
arclight$direction = null;
|
||||||
arclight$click = null;
|
arclight$click = null;
|
||||||
arclight$stack = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient org.bukkit.inventory.@Nullable ItemStack arclight$captureItem;
|
private transient org.bukkit.inventory.@Nullable ItemStack arclight$captureItem;
|
||||||
@ -79,25 +77,22 @@ public abstract class BucketItemMixin {
|
|||||||
public boolean emptyContents(Player entity, Level world, BlockPos pos, @Nullable BlockHitResult result, Direction direction, BlockPos clicked, ItemStack itemstack) {
|
public boolean emptyContents(Player entity, Level world, BlockPos pos, @Nullable BlockHitResult result, Direction direction, BlockPos clicked, ItemStack itemstack) {
|
||||||
arclight$direction = direction;
|
arclight$direction = direction;
|
||||||
arclight$click = clicked;
|
arclight$click = clicked;
|
||||||
arclight$stack = itemstack;
|
|
||||||
try {
|
try {
|
||||||
return this.emptyContents(entity, world, pos, result);
|
return this.emptyContents(entity, world, pos, result, itemstack);
|
||||||
} finally {
|
} finally {
|
||||||
arclight$direction = null;
|
arclight$direction = null;
|
||||||
arclight$click = null;
|
arclight$click = null;
|
||||||
arclight$stack = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient Direction arclight$direction;
|
private transient Direction arclight$direction;
|
||||||
private transient BlockPos arclight$click;
|
private transient BlockPos arclight$click;
|
||||||
private transient ItemStack arclight$stack;
|
|
||||||
|
|
||||||
@Inject(method = "emptyContents", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z"))
|
@Inject(method = "emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z", remap = false, cancellable = true, at = @At(value = "INVOKE", remap = true, target = "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z"))
|
||||||
private void arclight$bucketEmpty(Player player, Level worldIn, BlockPos posIn, BlockHitResult rayTrace, CallbackInfoReturnable<Boolean> cir) {
|
private void arclight$bucketEmpty(Player player, Level worldIn, BlockPos posIn, BlockHitResult rayTrace, ItemStack itemStack, CallbackInfoReturnable<Boolean> cir) {
|
||||||
if (!DistValidate.isValid(worldIn)) return;
|
if (!DistValidate.isValid(worldIn)) return;
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((ServerLevel) worldIn, player, posIn, arclight$click, arclight$direction, arclight$stack);
|
PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((ServerLevel) worldIn, player, posIn, arclight$click, arclight$direction, itemStack);
|
||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
((ServerPlayer) player).connection.send(new ClientboundBlockUpdatePacket(worldIn, posIn));
|
((ServerPlayer) player).connection.send(new ClientboundBlockUpdatePacket(worldIn, posIn));
|
||||||
((ServerPlayerEntityBridge) player).bridge$getBukkitEntity().updateInventory();
|
((ServerPlayerEntityBridge) player).bridge$getBukkitEntity().updateInventory();
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
"CraftBlockStateMixin",
|
"CraftBlockStateMixin",
|
||||||
"CraftConsoleCommandSenderMixin",
|
"CraftConsoleCommandSenderMixin",
|
||||||
"CraftCreativeCategoryMixin",
|
"CraftCreativeCategoryMixin",
|
||||||
|
"CraftEnderDragonMixin",
|
||||||
"CraftEntityMixin",
|
"CraftEntityMixin",
|
||||||
"CraftEventFactoryMixin",
|
"CraftEventFactoryMixin",
|
||||||
"CraftHumanEntityMixin",
|
"CraftHumanEntityMixin",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
allprojects {
|
allprojects {
|
||||||
group 'io.izzel.arclight'
|
group 'io.izzel.arclight'
|
||||||
version '1.0.9-SNAPSHOT'
|
version '1.0.12'
|
||||||
|
|
||||||
def getGitHash = { ->
|
def getGitHash = { ->
|
||||||
def stdout = new ByteArrayOutputStream()
|
def stdout = new ByteArrayOutputStream()
|
||||||
@ -14,7 +14,7 @@ allprojects {
|
|||||||
ext {
|
ext {
|
||||||
agpVersion = '1.23'
|
agpVersion = '1.23'
|
||||||
minecraftVersion = '1.18.2'
|
minecraftVersion = '1.18.2'
|
||||||
forgeVersion = '40.2.1'
|
forgeVersion = '40.2.14'
|
||||||
apiVersion = '1.4.0'
|
apiVersion = '1.4.0'
|
||||||
toolsVersion = '1.3.+'
|
toolsVersion = '1.3.+'
|
||||||
mixinVersion = '0.8.5'
|
mixinVersion = '0.8.5'
|
||||||
|
|||||||
@ -92,7 +92,9 @@ public class ForgeInstaller {
|
|||||||
builder.command(file.getCanonicalPath(), "-Djava.net.useSystemProxies=true", "-jar", futures[0].join().toString(), "--installServer", ".", "--debug");
|
builder.command(file.getCanonicalPath(), "-Djava.net.useSystemProxies=true", "-jar", futures[0].join().toString(), "--installServer", ".", "--debug");
|
||||||
builder.inheritIO();
|
builder.inheritIO();
|
||||||
Process process = builder.start();
|
Process process = builder.start();
|
||||||
process.waitFor();
|
if (process.waitFor() > 0) {
|
||||||
|
throw new Exception("Forge installation failed");
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
try (URLClassLoader loader = new URLClassLoader(
|
try (URLClassLoader loader = new URLClassLoader(
|
||||||
new URL[]{new File(String.format("forge-%s-%s-installer.jar", installInfo.installer.minecraft, installInfo.installer.forge)).toURI().toURL()},
|
new URL[]{new File(String.format("forge-%s-%s-installer.jar", installInfo.installer.minecraft, installInfo.installer.forge)).toURI().toURL()},
|
||||||
|
|||||||
@ -5,15 +5,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.StringJoiner;
|
import java.util.StringJoiner;
|
||||||
import java.util.function.Function;
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class MavenDownloader implements Supplier<Path> {
|
public class MavenDownloader implements Supplier<Path> {
|
||||||
|
|
||||||
private static final Function<String, String> FORGE_TO_BMCLAPI =
|
|
||||||
s -> s.replace("https://files.minecraftforge.net/maven/", "https://download.mcbbs.net/maven/")
|
|
||||||
.replace("https://maven.minecraftforge.net/", "https://download.mcbbs.net/maven/");
|
|
||||||
|
|
||||||
private final LinkedList<String> urls;
|
private final LinkedList<String> urls;
|
||||||
private final String coord;
|
private final String coord;
|
||||||
private final String target;
|
private final String target;
|
||||||
@ -33,8 +28,11 @@ public class MavenDownloader implements Supplier<Path> {
|
|||||||
public MavenDownloader(String[] repos, String coord, String target, String hash, String sourceUrl) {
|
public MavenDownloader(String[] repos, String coord, String target, String hash, String sourceUrl) {
|
||||||
this(repos, coord, target, hash);
|
this(repos, coord, target, hash);
|
||||||
if (sourceUrl != null && !this.urls.contains(sourceUrl)) {
|
if (sourceUrl != null && !this.urls.contains(sourceUrl)) {
|
||||||
this.urls.addFirst(sourceUrl);
|
if (Mirrors.isMirrorUrl(sourceUrl)) {
|
||||||
this.urls.addFirst(FORGE_TO_BMCLAPI.apply(sourceUrl));
|
this.urls.addFirst(sourceUrl);
|
||||||
|
} else {
|
||||||
|
this.urls.addLast(sourceUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,14 +8,12 @@ import java.util.stream.Collectors;
|
|||||||
public class Mirrors {
|
public class Mirrors {
|
||||||
|
|
||||||
private static final String[] MAVEN_REPO = {
|
private static final String[] MAVEN_REPO = {
|
||||||
"https://arclight.mcxk.net/",
|
"https://arclight.hypertention.cn/",
|
||||||
"https://download.mcbbs.net/maven/",
|
|
||||||
"https://repo.spongepowered.org/maven/"
|
"https://repo.spongepowered.org/maven/"
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] MOJANG_MIRROR = {
|
private static final String[] MOJANG_MIRROR = {
|
||||||
"https://download.mcbbs.net",
|
"https://mojmirror.hypertention.cn",
|
||||||
"https://bmclapi2.bangbang93.com",
|
|
||||||
"https://piston-meta.mojang.com"
|
"https://piston-meta.mojang.com"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -39,4 +37,8 @@ public class Mirrors {
|
|||||||
.replace("https://piston-meta.mojang.com", mirror)
|
.replace("https://piston-meta.mojang.com", mirror)
|
||||||
.replace("https://piston-data.mojang.com", mirror);
|
.replace("https://piston-data.mojang.com", mirror);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isMirrorUrl(String url) {
|
||||||
|
return url.startsWith(MOJANG_MIRROR[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user