Add server-side check for extendo-grip and contraption interaction

This commit is contained in:
Snownee 2021-01-31 16:06:45 +08:00
parent 4a15fbcec3
commit 5c64c2d942
2 changed files with 43 additions and 33 deletions

View file

@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Abs
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Direction;
@ -45,22 +46,26 @@ public class ContraptionInteractionPacket extends SimplePacketBase {
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity sender = context.get()
.getSender();
context.get().enqueueWork(() -> {
ServerPlayerEntity sender = context.get().getSender();
if (sender == null)
return;
Entity entityByID = sender.getServerWorld()
.getEntityByID(target);
Entity entityByID = sender.getServerWorld().getEntityByID(target);
if (!(entityByID instanceof AbstractContraptionEntity))
return;
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
double d = sender.getAttribute(PlayerEntity.REACH_DISTANCE).getValue();
if (!sender.canEntityBeSeen(entityByID))
d -= 3;
d *= d;
if (sender.getDistanceSq(entityByID) > d) {
// TODO log?
return;
}
if (contraptionEntity.handlePlayerInteraction(sender, localPos, face, interactionHand))
sender.swingHand(interactionHand, true);
});
context.get()
.setPacketHandled(true);
context.get().setPacketHandled(true);
}
}

View file

@ -5,6 +5,7 @@ import java.util.function.Supplier;
import com.simibubi.create.foundation.networking.SimplePacketBase;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.Hand;
@ -53,15 +54,20 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayerEntity sender = context.get()
.getSender();
context.get().enqueueWork(() -> {
ServerPlayerEntity sender = context.get().getSender();
if (sender == null)
return;
Entity entityByID = sender.getServerWorld()
.getEntityByID(target);
Entity entityByID = sender.getServerWorld().getEntityByID(target);
if (entityByID != null && ExtendoGripItem.isHoldingExtendoGrip(sender)) {
double d = sender.getAttribute(PlayerEntity.REACH_DISTANCE).getValue();
if (!sender.canEntityBeSeen(entityByID))
d -= 3;
d *= d;
if (sender.getDistanceSq(entityByID) > d) {
// TODO log?
return;
}
if (interactionHand == null)
sender.attackTargetEntityWithCurrentItem(entityByID);
else if (specificPoint == null)
@ -70,8 +76,7 @@ public class ExtendoGripInteractionPacket extends SimplePacketBase {
entityByID.applyPlayerInteraction(sender, specificPoint, interactionHand);
}
});
context.get()
.setPacketHandled(true);
context.get().setPacketHandled(true);
}
}