mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-14 22:44:07 +01:00
Merge branch 'mc1.18/dev' into mc1.19/dev
This commit is contained in:
commit
32f72cb614
@ -33,6 +33,7 @@ import com.simibubi.create.content.curiosities.deco.SlidingDoorBlock;
|
|||||||
import com.simibubi.create.content.logistics.trains.entity.CarriageContraption;
|
import com.simibubi.create.content.logistics.trains.entity.CarriageContraption;
|
||||||
import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity;
|
import com.simibubi.create.content.logistics.trains.entity.CarriageContraptionEntity;
|
||||||
import com.simibubi.create.content.logistics.trains.entity.Train;
|
import com.simibubi.create.content.logistics.trains.entity.Train;
|
||||||
|
import com.simibubi.create.foundation.advancement.AllAdvancements;
|
||||||
import com.simibubi.create.foundation.collision.Matrix3d;
|
import com.simibubi.create.foundation.collision.Matrix3d;
|
||||||
import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor;
|
import com.simibubi.create.foundation.mixin.accessor.ServerLevelAccessor;
|
||||||
import com.simibubi.create.foundation.networking.AllPackets;
|
import com.simibubi.create.foundation.networking.AllPackets;
|
||||||
@ -181,16 +182,28 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
|
|||||||
contraption.getSeatMapping()
|
contraption.getSeatMapping()
|
||||||
.remove(passenger.getUUID());
|
.remove(passenger.getUUID());
|
||||||
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this),
|
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this),
|
||||||
new ContraptionSeatMappingPacket(getId(), contraption.getSeatMapping()));
|
new ContraptionSeatMappingPacket(getId(), contraption.getSeatMapping(), passenger.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Vec3 getDismountLocationForPassenger(LivingEntity pLivingEntity) {
|
public Vec3 getDismountLocationForPassenger(LivingEntity entityLiving) {
|
||||||
Vec3 loc = super.getDismountLocationForPassenger(pLivingEntity);
|
Vec3 position = super.getDismountLocationForPassenger(entityLiving);
|
||||||
CompoundTag data = pLivingEntity.getPersistentData();
|
CompoundTag data = entityLiving.getPersistentData();
|
||||||
if (!data.contains("ContraptionDismountLocation"))
|
if (!data.contains("ContraptionDismountLocation"))
|
||||||
return loc;
|
return position;
|
||||||
return VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
|
|
||||||
|
position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
|
||||||
|
data.remove("ContraptionDismountLocation");
|
||||||
|
entityLiving.setOnGround(false);
|
||||||
|
|
||||||
|
if (!data.contains("ContraptionMountLocation"))
|
||||||
|
return position;
|
||||||
|
|
||||||
|
Vec3 prevPosition = VecHelper.readNBT(data.getList("ContraptionMountLocation", Tag.TAG_DOUBLE));
|
||||||
|
data.remove("ContraptionMountLocation");
|
||||||
|
if (entityLiving instanceof Player player && !prevPosition.closerThan(position, 5000))
|
||||||
|
AllAdvancements.LONG_TRAVEL.awardTo(player);
|
||||||
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -204,7 +217,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit
|
|||||||
transformedVector.y + SeatEntity.getCustomEntitySeatOffset(passenger) - 1 / 8f, transformedVector.z);
|
transformedVector.y + SeatEntity.getCustomEntitySeatOffset(passenger) - 1 / 8f, transformedVector.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Vec3 getPassengerPosition(Entity passenger, float partialTicks) {
|
public Vec3 getPassengerPosition(Entity passenger, float partialTicks) {
|
||||||
UUID id = passenger.getUUID();
|
UUID id = passenger.getUUID();
|
||||||
if (passenger instanceof OrientedContraptionEntity) {
|
if (passenger instanceof OrientedContraptionEntity) {
|
||||||
BlockPos localPos = contraption.getBearingPosOf(id);
|
BlockPos localPos = contraption.getBearingPosOf(id);
|
||||||
|
@ -7,7 +7,6 @@ import java.util.Iterator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.advancement.AllAdvancements;
|
|
||||||
import com.simibubi.create.foundation.utility.VecHelper;
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
import com.simibubi.create.foundation.utility.WorldAttached;
|
import com.simibubi.create.foundation.utility.WorldAttached;
|
||||||
|
|
||||||
@ -17,7 +16,6 @@ import net.minecraft.nbt.CompoundTag;
|
|||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
@ -65,24 +63,18 @@ public class ContraptionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingEntity entityLiving, Level world) {
|
public static void entitiesWhoJustDismountedGetSentToTheRightLocation(LivingEntity entityLiving, Level world) {
|
||||||
if (world.isClientSide)
|
if (!world.isClientSide)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CompoundTag data = entityLiving.getPersistentData();
|
CompoundTag data = entityLiving.getPersistentData();
|
||||||
if (!data.contains("ContraptionDismountLocation"))
|
if (!data.contains("ContraptionDismountLocation"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Vec3 position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
|
Vec3 position = VecHelper.readNBT(data.getList("ContraptionDismountLocation", Tag.TAG_DOUBLE));
|
||||||
if (entityLiving.getVehicle() == null)
|
if (entityLiving.getVehicle() == null)
|
||||||
entityLiving.teleportTo(position.x, position.y, position.z);
|
entityLiving.absMoveTo(position.x, position.y, position.z, entityLiving.getYRot(), entityLiving.getXRot());
|
||||||
data.remove("ContraptionDismountLocation");
|
data.remove("ContraptionDismountLocation");
|
||||||
entityLiving.setOnGround(false);
|
entityLiving.setOnGround(false);
|
||||||
|
|
||||||
if (!data.contains("ContraptionMountLocation"))
|
|
||||||
return;
|
|
||||||
Vec3 prevPosition = VecHelper.readNBT(data.getList("ContraptionMountLocation", Tag.TAG_DOUBLE));
|
|
||||||
data.remove("ContraptionMountLocation");
|
|
||||||
|
|
||||||
if (entityLiving instanceof Player player && !prevPosition.closerThan(position, 5000))
|
|
||||||
AllAdvancements.LONG_TRAVEL.awardTo(player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,24 +7,33 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
||||||
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
||||||
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
import net.minecraftforge.network.NetworkEvent.Context;
|
import net.minecraftforge.network.NetworkEvent.Context;
|
||||||
|
|
||||||
public class ContraptionSeatMappingPacket extends SimplePacketBase {
|
public class ContraptionSeatMappingPacket extends SimplePacketBase {
|
||||||
|
|
||||||
private Map<UUID, Integer> mapping;
|
private Map<UUID, Integer> mapping;
|
||||||
private int entityID;
|
private int entityID;
|
||||||
|
private int dismountedID;
|
||||||
|
|
||||||
public ContraptionSeatMappingPacket(int entityID, Map<UUID, Integer> mapping) {
|
public ContraptionSeatMappingPacket(int entityID, Map<UUID, Integer> mapping) {
|
||||||
|
this(entityID, mapping, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContraptionSeatMappingPacket(int entityID, Map<UUID, Integer> mapping, int dismountedID) {
|
||||||
this.entityID = entityID;
|
this.entityID = entityID;
|
||||||
this.mapping = mapping;
|
this.mapping = mapping;
|
||||||
|
this.dismountedID = dismountedID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ContraptionSeatMappingPacket(FriendlyByteBuf buffer) {
|
public ContraptionSeatMappingPacket(FriendlyByteBuf buffer) {
|
||||||
entityID = buffer.readInt();
|
entityID = buffer.readInt();
|
||||||
|
dismountedID = buffer.readInt();
|
||||||
mapping = new HashMap<>();
|
mapping = new HashMap<>();
|
||||||
short size = buffer.readShort();
|
short size = buffer.readShort();
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
@ -34,6 +43,7 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase {
|
|||||||
@Override
|
@Override
|
||||||
public void write(FriendlyByteBuf buffer) {
|
public void write(FriendlyByteBuf buffer) {
|
||||||
buffer.writeInt(entityID);
|
buffer.writeInt(entityID);
|
||||||
|
buffer.writeInt(dismountedID);
|
||||||
buffer.writeShort(mapping.size());
|
buffer.writeShort(mapping.size());
|
||||||
mapping.forEach((k, v) -> {
|
mapping.forEach((k, v) -> {
|
||||||
buffer.writeUUID(k);
|
buffer.writeUUID(k);
|
||||||
@ -49,6 +59,17 @@ public class ContraptionSeatMappingPacket extends SimplePacketBase {
|
|||||||
if (!(entityByID instanceof AbstractContraptionEntity))
|
if (!(entityByID instanceof AbstractContraptionEntity))
|
||||||
return;
|
return;
|
||||||
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
|
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) entityByID;
|
||||||
|
|
||||||
|
if (dismountedID != -1) {
|
||||||
|
Entity dismountedByID = Minecraft.getInstance().level.getEntity(dismountedID);
|
||||||
|
if (Minecraft.getInstance().player != dismountedByID)
|
||||||
|
return;
|
||||||
|
Vec3 transformedVector = contraptionEntity.getPassengerPosition(dismountedByID, 1);
|
||||||
|
if (transformedVector != null)
|
||||||
|
dismountedByID.getPersistentData()
|
||||||
|
.put("ContraptionDismountLocation", VecHelper.writeNBT(transformedVector));
|
||||||
|
}
|
||||||
|
|
||||||
contraptionEntity.getContraption()
|
contraptionEntity.getContraption()
|
||||||
.setSeatMapping(mapping);
|
.setSeatMapping(mapping);
|
||||||
});
|
});
|
||||||
|
@ -66,8 +66,7 @@ public class ScheduleItem extends Item implements MenuProvider {
|
|||||||
return InteractionResultHolder.pass(heldItem);
|
return InteractionResultHolder.pass(heldItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public InteractionResult handScheduleTo(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget,
|
||||||
public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget,
|
|
||||||
InteractionHand pUsedHand) {
|
InteractionHand pUsedHand) {
|
||||||
InteractionResult pass = InteractionResult.PASS;
|
InteractionResult pass = InteractionResult.PASS;
|
||||||
|
|
||||||
@ -123,6 +122,7 @@ public class ScheduleItem extends Item implements MenuProvider {
|
|||||||
pStack.shrink(1);
|
pStack.shrink(1);
|
||||||
pPlayer.setItemInHand(pUsedHand, pStack.isEmpty() ? ItemStack.EMPTY : pStack);
|
pPlayer.setItemInHand(pUsedHand, pStack.isEmpty() ? ItemStack.EMPTY : pStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
return InteractionResult.SUCCESS;
|
return InteractionResult.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,19 +11,20 @@ import com.simibubi.create.foundation.utility.Lang;
|
|||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.world.InteractionHand;
|
import net.minecraft.world.InteractionHand;
|
||||||
|
import net.minecraft.world.InteractionResult;
|
||||||
import net.minecraft.world.entity.Entity;
|
import net.minecraft.world.entity.Entity;
|
||||||
import net.minecraft.world.entity.animal.Wolf;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract;
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||||
|
|
||||||
@EventBusSubscriber
|
@EventBusSubscriber
|
||||||
public class ScheduleItemRetrieval {
|
public class ScheduleItemEntityInteraction {
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void removeScheduleFromConductor(EntityInteract event) {
|
public static void interactWithConductor(EntityInteractSpecific event) {
|
||||||
Entity entity = event.getTarget();
|
Entity entity = event.getTarget();
|
||||||
Player player = event.getEntity();
|
Player player = event.getEntity();
|
||||||
if (player == null || entity == null)
|
if (player == null || entity == null)
|
||||||
@ -34,16 +35,24 @@ public class ScheduleItemRetrieval {
|
|||||||
Entity rootVehicle = entity.getRootVehicle();
|
Entity rootVehicle = entity.getRootVehicle();
|
||||||
if (!(rootVehicle instanceof CarriageContraptionEntity))
|
if (!(rootVehicle instanceof CarriageContraptionEntity))
|
||||||
return;
|
return;
|
||||||
|
if (!(entity instanceof LivingEntity living))
|
||||||
|
return;
|
||||||
|
if (player.getCooldowns()
|
||||||
|
.isOnCooldown(AllItems.SCHEDULE.get()))
|
||||||
|
return;
|
||||||
|
|
||||||
ItemStack itemStack = event.getItemStack();
|
ItemStack itemStack = event.getItemStack();
|
||||||
if (AllItems.SCHEDULE.isIn(itemStack) && entity instanceof Wolf wolf) {
|
if (itemStack.getItem()instanceof ScheduleItem si) {
|
||||||
itemStack.getItem()
|
InteractionResult result = si.handScheduleTo(itemStack, player, living, event.getHand());
|
||||||
.interactLivingEntity(itemStack, player, wolf, event.getHand());
|
if (result.consumesAction()) {
|
||||||
return;
|
player.getCooldowns()
|
||||||
|
.addCooldown(AllItems.SCHEDULE.get(), 5);
|
||||||
|
event.setCancellationResult(result);
|
||||||
|
event.setCanceled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.level.isClientSide)
|
|
||||||
return;
|
|
||||||
if (event.getHand() == InteractionHand.OFF_HAND)
|
if (event.getHand() == InteractionHand.OFF_HAND)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -68,31 +77,47 @@ public class ScheduleItemRetrieval {
|
|||||||
if (directions == null)
|
if (directions == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
boolean onServer = !event.getWorld().isClientSide;
|
||||||
|
|
||||||
if (train.runtime.paused && !train.runtime.completed) {
|
if (train.runtime.paused && !train.runtime.completed) {
|
||||||
train.runtime.paused = false;
|
if (onServer) {
|
||||||
AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1);
|
train.runtime.paused = false;
|
||||||
player.displayClientMessage(Lang.translateDirect("schedule.continued"), true);
|
AllSoundEvents.CONFIRM.playOnServer(player.level, player.blockPosition(), 1, 1);
|
||||||
|
player.displayClientMessage(Lang.translateDirect("schedule.continued"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.getCooldowns()
|
||||||
|
.addCooldown(AllItems.SCHEDULE.get(), 5);
|
||||||
|
event.setCancellationResult(InteractionResult.SUCCESS);
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack itemInHand = player.getItemInHand(event.getHand());
|
ItemStack itemInHand = player.getItemInHand(event.getHand());
|
||||||
if (!itemInHand.isEmpty()) {
|
if (!itemInHand.isEmpty()) {
|
||||||
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
|
if (onServer) {
|
||||||
player.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true);
|
AllSoundEvents.DENY.playOnServer(player.level, player.blockPosition(), 1, 1);
|
||||||
|
player.displayClientMessage(Lang.translateDirect("schedule.remove_with_empty_hand"), true);
|
||||||
|
}
|
||||||
|
event.setCancellationResult(InteractionResult.SUCCESS);
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AllSoundEvents.playItemPickup(player);
|
if (onServer) {
|
||||||
player.displayClientMessage(
|
AllSoundEvents.playItemPickup(player);
|
||||||
Lang.translateDirect(
|
player.displayClientMessage(
|
||||||
train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"),
|
Lang.translateDirect(
|
||||||
true);
|
train.runtime.isAutoSchedule ? "schedule.auto_removed_from_train" : "schedule.removed_from_train"),
|
||||||
|
true);
|
||||||
|
|
||||||
player.getInventory()
|
player.getInventory()
|
||||||
.placeItemBackInInventory(train.runtime.returnSchedule());
|
.placeItemBackInInventory(train.runtime.returnSchedule());
|
||||||
// player.setItemInHand(event.getHand(), train.runtime.returnSchedule());
|
}
|
||||||
|
|
||||||
|
player.getCooldowns()
|
||||||
|
.addCooldown(AllItems.SCHEDULE.get(), 5);
|
||||||
|
event.setCancellationResult(InteractionResult.SUCCESS);
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
@ -115,6 +115,8 @@ public abstract class EntityContraptionInteractionMixin extends CapabilityProvid
|
|||||||
return;
|
return;
|
||||||
if (self.isOnGround())
|
if (self.isOnGround())
|
||||||
return;
|
return;
|
||||||
|
if (self.isPassenger())
|
||||||
|
return;
|
||||||
|
|
||||||
Vec3 worldPos = self.position()
|
Vec3 worldPos = self.position()
|
||||||
.add(0, -0.2, 0);
|
.add(0, -0.2, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user