fix: implement ProjectileEntity#getOwner correctly (looks like MCPE-55823)
This commit is contained in:
1 file changed
+62
@@ -0,0 +1,62 @@
|
||||
package io.ib67.sfcraft.mixin.server.fixes;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.projectile.ProjectileEntity;
|
||||
import net.minecraft.server.world.ServerWorld;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
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 java.util.UUID;
|
||||
|
||||
@Mixin(ProjectileEntity.class)
|
||||
public class ProjectileEntityMixin {
|
||||
@Shadow
|
||||
private @Nullable Entity owner;
|
||||
|
||||
@Shadow
|
||||
private @Nullable UUID ownerUuid;
|
||||
|
||||
@Unique
|
||||
private boolean isPlayer;
|
||||
|
||||
@Inject(at = @At("HEAD"), method = "setOwner")
|
||||
private void setOwner(@Nullable Entity owner, CallbackInfo ci) {
|
||||
isPlayer = owner instanceof PlayerEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* @reason Implement the logic correctly.
|
||||
*/
|
||||
@Overwrite
|
||||
public @Nullable Entity getOwner() {
|
||||
if (this.owner != null && !this.owner.isRemoved()) {
|
||||
return this.owner;
|
||||
} else if (this.ownerUuid != null) {
|
||||
var server = $().getWorld().getServer();
|
||||
if (server == null) {
|
||||
return null;
|
||||
}
|
||||
if (isPlayer) {
|
||||
return server.getPlayerManager().getPlayer(this.ownerUuid);
|
||||
} else {
|
||||
for (ServerWorld world : server.getWorlds()) {
|
||||
var entity = world.getEntity(this.ownerUuid);
|
||||
if (entity != null) return entity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Unique
|
||||
private ProjectileEntity $() {
|
||||
return (ProjectileEntity) (Object) this;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user