Начинающий
- Статус
- Оффлайн
- Регистрация
- 6 Июн 2024
- Сообщения
- 22
- Реакции
- 0
- Выберите загрузчик игры
- Прочие моды
Пожалуйста, авторизуйтесь для просмотра ссылки.
TpLoot:
package DickRecode.functions.impl.movement;
import DickRecode.events.EventTarget;
import DickRecode.events.EventUpdate;
import DickRecode.functions.api.Category;
import DickRecode.functions.api.Function;
import DickRecode.functions.api.FunctionRegister;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
@FunctionRegister(
name = "TPloot", description = "лутает ресы", type = Category.Movement)
public class TPloot extends Function {
private Vector3d initialPosition = null;
private Vector3d deathPosition = null;
private static final Set<Item> VALUABLE_ITEMS;
public TPloot() {}
@EventTarget
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 -> {
if (entity == null) return false;
ItemStack stack = entity.getItem();
if (stack == null) return false;
Item item = stack.getItem();
if (item == Items.GOLDEN_APPLE) {
// Loot golden apples only if exactly 12 were dropped in this stack
return stack.getCount() == 12;
}
return VALUABLE_ITEMS.contains(item);
}
);
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;
AxisAlignedBB box = new AxisAlignedBB(
itemX - knockbackRadius, itemY - knockbackRadius, itemZ - knockbackRadius,
itemX + knockbackRadius, itemY + knockbackRadius, itemZ + knockbackRadius
);
List<PlayerEntity> nearbyPlayers = mc.world.getEntitiesWithinAABB(PlayerEntity.class, box);
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,
Items.ELYTRA,
Items.FIREWORK_ROCKET
));
}
}