package im.expensive.functions.impl.movement;
import com.google.common.eventbus.Subscribe;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
@FunctionRegister(
name = "LootOtdacha",
type = Category.Movement
)
public class LootOtdacha extends Function {
private final Minecraft mc = Minecraft.getInstance();
private Vector3d initialPosition = null;
private Vector3d deathPosition = null;
private static final Set<Item> VALUABLE_ITEMS;
public LootOtdacha() {}
@Subscribe
public void onUpdate(EventUpdate event) {
if (mc.player == null || mc.world == null) return;
// помнить позицию смерти
if (mc.player.getHealth() <= 0) {
deathPosition = mc.player.getPositionVec();
}
// После респавна: телепорт к позиции смерти
if (deathPosition != null && mc.player.getHealth() > 0) {
mc.player.setPosition(deathPosition.x, deathPosition.y, deathPosition.z);
deathPosition = null;
}
// Запомнить стартовую позицию
if (initialPosition == null) {
initialPosition = mc.player.getPositionVec();
}
pickUpLoot();
}
private void pickUpLoot() {
double radius = 100.0;
Vector3d playerPos = mc.player.getPositionVec();
AxisAlignedBB searchBox = new AxisAlignedBB(
playerPos.x - radius, playerPos.y - radius, playerPos.z - radius,
playerPos.x + radius, playerPos.y + radius, playerPos.z + radius
);
List<ItemEntity> nearbyItems = mc.world.getEntitiesWithinAABB(ItemEntity.class, searchBox,
entity -> entity.getItem() != null && VALUABLE_ITEMS.contains(entity.getItem().getItem())
);
if (nearbyItems.isEmpty() && initialPosition != null) {
mc.player.setPosition(initialPosition.x, initialPosition.y, initialPosition.z);
initialPosition = null;
} else {
for (ItemEntity item : nearbyItems) {
mc.player.moveForward = 1.0F;
mc.player.setPosition(item.getPosX(), item.getPosY(), item.getPosZ());
applyKnockbackToNearbyPlayers(item.getPosX(), item.getPosY(), item.getPosZ());
break;
}
}
}
private void applyKnockbackToNearbyPlayers(double itemX, double itemY, double itemZ) {
double knockbackRadius = 3.0;
List<PlayerEntity> nearbyPlayers = mc.world.getEntitiesWithinAABB(PlayerEntity.class, new AxisAlignedBB(
itemX - knockbackRadius, itemY - knockbackRadius, itemZ - knockbackRadius,
itemX + knockbackRadius, itemY + knockbackRadius, itemZ + knockbackRadius
));
for (PlayerEntity player : nearbyPlayers) {
if (player != mc.player) {
Vector3d direction = player.getPositionVec().subtract(itemX, itemY, itemZ).normalize();
player.addVelocity(direction.x * 1.5, direction.y * 1.5, direction.z * 1.5);
}
}
}
static {
VALUABLE_ITEMS = new HashSet<>(Arrays.asList(
Items.TOTEM_OF_UNDYING,
Items.NETHERITE_HELMET,
Items.NETHERITE_CHESTPLATE,
Items.NETHERITE_LEGGINGS,
Items.NETHERITE_BOOTS,
Items.NETHERITE_SWORD,
Items.NETHERITE_PICKAXE,
Items.GOLDEN_APPLE,
Items.ENCHANTED_GOLDEN_APPLE,
Items.PLAYER_HEAD,
Items.SHULKER_BOX,
Items.NETHERITE_INGOT,
Items.SPLASH_POTION
));
}
}