diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java index c00d976d..c14ff6d6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java @@ -24,6 +24,11 @@ import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.features.tracer.TNTPoint; import de.steamwar.bausystem.features.tracer.Trace; import de.steamwar.bausystem.features.tracer.TraceManager; +<<<<<<< Updated upstream +======= +import de.steamwar.entity.RBlockDisplay; +import de.steamwar.entity.RInteractionEntity; +>>>>>>> Stashed changes import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; import lombok.Getter; @@ -55,13 +60,26 @@ public class TraceEntity extends RFallingBlockEntity { private final String uniqueTntIdsString; private final Trace trace; + private final RInteractionEntity hitbox; public TraceEntity(REntityServer server, Location location, boolean isExplosion, List records, Trace trace) { super(server, location, isExplosion ? Material.RED_STAINED_GLASS : Material.TNT); this.records = records; this.trace = trace; uniqueTntIdsString = records.stream().map(TNTPoint::getTntId).distinct().map(Object::toString).collect(Collectors.joining(" ")); +<<<<<<< Updated upstream setNoGravity(true); +======= + hitbox = new RInteractionEntity(server, location, TNT_VISUAL_SCALE, TNT_VISUAL_SCALE, this); + setTransform(TNT_VISUAL_TRANSFORM); + setBlock(material.createBlockData()); +>>>>>>> Stashed changes + } + + @Override + public void die() { + hitbox.die(); + super.die(); } /** diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 1372ed17..051e8f9b 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -57,14 +57,16 @@ public class REntityServer implements Listener { private final BiFunction filter = (player, packet) -> { REntity entity = entityMap.get(packet.getEntityId()); if (entity == null) return packet; + REntity targetEntity = entity instanceof RInteractionEntity ? ((RInteractionEntity) entity).getOwner() : entity; if (playersThatClicked.contains(player)) return null; playersThatClicked.add(player); EntityAction action = packet.isAttack() ? EntityAction.ATTACK : EntityAction.INTERACT; + Bukkit.getScheduler().runTask(Core.getInstance(), () -> { playersThatClicked.remove(player); - callback.onAction(player, entity, action); + callback.onAction(player, targetEntity, action); }); return null; }; diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RInteractionEntity.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RInteractionEntity.java new file mode 100644 index 00000000..ee97ac26 --- /dev/null +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RInteractionEntity.java @@ -0,0 +1,55 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2025 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.entity; + +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; + +import java.util.function.Consumer; + +public class RInteractionEntity extends REntity { + + private static final EntityDataAccessor widthWatcher = new EntityDataAccessor<>(8, EntityDataSerializers.FLOAT); + private static final EntityDataAccessor heightWatcher = new EntityDataAccessor<>(9, EntityDataSerializers.FLOAT); + + private float width; + private float height; + private final REntity owner; + + public RInteractionEntity(REntityServer server, Location location, float width, float height, REntity owner) { + super(server, EntityType.INTERACTION, location, 0); + this.width = width; + this.height = height; + this.owner = owner; + server.addEntity(this); + } + + @Override + protected void postSpawn(Consumer packetSink) { + super.postSpawn(packetSink); + packetSink.accept(getDataWatcherPacket(widthWatcher, width, heightWatcher, height)); + } + + public REntity getOwner() { + return owner; + } +}