From db479b91b480006774668c57bd0a976ecdac244c Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 26 May 2024 18:53:25 -0700 Subject: [PATCH 01/39] fix: remove rocket entity when damaged in survival still need to drop item --- .../galacticraft/mod/content/entity/orbital/RocketEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index ab62b28a44..36b6cc10d8 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -295,7 +295,7 @@ public void onBaseDestroyed() { @Override public void dropItems(DamageSource damageSource, boolean b) { - + this.remove(RemovalReason.KILLED); } @Override From 355c0918841d4c66f9dbcafdeddc6664d501c773 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 26 May 2024 19:30:30 -0700 Subject: [PATCH 02/39] fix: rocket does not drop when broken combined with previous commit, this fixes #324 --- .../galacticraft/mod/content/entity/orbital/RocketEntity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index 36b6cc10d8..6a100cc15b 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -33,6 +33,7 @@ import dev.galacticraft.api.universe.celestialbody.CelestialBodyConfig; import dev.galacticraft.api.universe.celestialbody.CelestialBodyType; import dev.galacticraft.mod.Constant; +import dev.galacticraft.mod.Galacticraft; import dev.galacticraft.mod.attachments.GCServerPlayer; import dev.galacticraft.mod.content.GCBlocks; import dev.galacticraft.mod.content.GCFluids; @@ -295,6 +296,7 @@ public void onBaseDestroyed() { @Override public void dropItems(DamageSource damageSource, boolean b) { + this.spawnAtLocation(GCItems.ROCKET.getDefaultInstance()); this.remove(RemovalReason.KILLED); } From 2634eafa59a34ee1c1857fab451ef43deb57361e Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 27 May 2024 15:30:50 -0700 Subject: [PATCH 03/39] feature: player dismounts rocket close to the ground player dismounts the rocket on the launch pad instead of above the rocket in the air. I made the dismount location one block south of the rocket (in the direction of the rocket window by default) --- .../mod/content/entity/orbital/RocketEntity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index 6a100cc15b..691e2d1409 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -433,6 +433,11 @@ protected Vector3f getPassengerAttachmentPoint(Entity entity, EntityDimensions d return new Vector3f(0F, 1.5F, 0F); } + @Override + public Vec3 getDismountLocationForPassenger(LivingEntity passenger) { + return new Vec3(getX(), getY(), getZ() + 1f); + } + @Override public void tick() { this.noPhysics = false; From 09237df9b1a43e49046dcbaf7d19e8df21d3fa9f Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 27 May 2024 15:35:29 -0700 Subject: [PATCH 04/39] refactor: improve onPlace readability rewrote onPlace with helper functions to make it more readable. Should perform the same, but please report any bugs (note: bugs would arise from attempting to create a launchpad multiblock) --- .../rocketlaunchpad/RocketLaunchPadBlock.java | 155 ++++++++---------- 1 file changed, 64 insertions(+), 91 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java b/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java index ce268dcdfc..af56af10bb 100644 --- a/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java +++ b/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java @@ -177,111 +177,53 @@ public void onRemove(BlockState blockState, Level level, BlockPos blockPos, Bloc @Override public void onPlace(BlockState blockState, Level level, BlockPos blockPos, BlockState oldState, boolean moved) { super.onPlace(blockState, level, blockPos, oldState, moved); - if (blockState.getValue(PART) == Part.NONE) { - var connections = 0; - for (var direction : CARDINAL) { - if (level.getBlockState(blockPos.relative(direction)).is(this)) { - connections++; - } + // the block should not already be assigned to a part of the launch pad + if (blockState.getValue(PART) != Part.NONE) { + return; + } + // valid connections represent connections to other launch pad block that are not already part of a launch pad + // options are either 2 (corner), 3 (center edge), or 4 (middle) + byte validConnections = 0; + for (Direction direction : CARDINAL) { + if (isValidSingleLaunchPad(level.getBlockState(blockPos.relative(direction)))) { + validConnections++; } - - if (connections == 4) { - var allValid = true; - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - if (!level.getBlockState(blockPos.offset(x, 0, z)).is(this)) { - allValid = false; - break; - } else if (level.getBlockState(blockPos.offset(x, 0, z)).getValue(PART) != Part.NONE) { - allValid = false; - break; - } - } - } - if (allValid) { - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - level.setBlockAndUpdate(blockPos.offset(x, 0, z), level.getBlockState(blockPos.offset(x, 0, z)).setValue(PART, this.getPartForOffset(x, z))); - } - } + } + // now looks to find where the center block is and if it is part of a valid 3x3 grid + for (byte c = validConnections; c >= 2; c--) { + if (c == 4) { + if (isValid3x3(level, blockPos)) { + updateMultiBlock(level, blockPos); return; - } else { - connections--; } } - - if (connections == 3) { - for (var direction : CARDINAL) { - if (level.getBlockState(blockPos.relative(direction)).is(this)) { - if (level.getBlockState(blockPos.relative(direction.getOpposite())).is(this)) { - for (var dir : CARDINAL) { - if (dir.getAxis() != direction.getAxis()) { - var allValid = true; - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - if (!level.getBlockState(blockPos.relative(dir).offset(x, 0, z)).is(this)) { - allValid = false; - break; - } else if (level.getBlockState(blockPos.relative(dir).offset(x, 0, z)).getValue(PART) != Part.NONE) { - allValid = false; - break; - } - } - } - - if (allValid) { - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - level.setBlockAndUpdate(blockPos.relative(dir).offset(x, 0, z), level.getBlockState(blockPos.relative(dir).offset(x, 0, z)).setValue(PART, this.getPartForOffset(x, z))); - } - } - return; - } + else if (c == 3) { + for (Direction primaryDir : CARDINAL) { + if (level.getBlockState(blockPos.relative(primaryDir)).is(this) && level.getBlockState(blockPos.relative(primaryDir.getOpposite())).is(this)) { + for (Direction secondaryDir : CARDINAL) { + if (secondaryDir.getAxis() != primaryDir.getAxis() && isValidSingleLaunchPad(level.getBlockState(blockPos.relative(secondaryDir)))) { + if (isValid3x3(level, blockPos.relative(secondaryDir))) { + updateMultiBlock(level, blockPos.relative(secondaryDir)); + return; } } } } } - connections--; } - - if (connections == 2) { - for (var direction : CARDINAL) { - if (level.getBlockState(blockPos.relative(direction)).is(this)) { - var dirs = new Direction[] {Direction.NORTH, Direction.SOUTH}; - if (direction.getAxis() == Direction.Axis.Z) { - dirs = new Direction[] {Direction.EAST, Direction.WEST}; - } - - for (var dir : dirs) { - if (level.getBlockState(blockPos.relative(dir)).is(this)) { - if (level.getBlockState(blockPos.relative(dir).relative(direction)).is(this)) { - var allValid = true; - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - if (!level.getBlockState(blockPos.relative(dir).relative(direction).offset(x, 0, z)).is(this)) { - allValid = false; - break; - } else if (level.getBlockState(blockPos.relative(dir).relative(direction).offset(x, 0, z)).getValue(PART) != Part.NONE) { - allValid = false; - break; - } - } - } - - if (allValid) { - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - level.setBlockAndUpdate(blockPos.relative(dir).relative(direction).offset(x, 0, z), level.getBlockState(blockPos.relative(dir).relative(direction).offset(x, 0, z)).setValue(PART, this.getPartForOffset(x, z))); - } - } - return; - } + else if (c == 2) { + for (Direction primaryDir : CARDINAL) { + if (level.getBlockState(blockPos.relative(primaryDir)).is(this)) { + Direction[] secondaryDirs = primaryDir.getAxis() == Direction.Axis.Z ? new Direction[]{Direction.EAST, Direction.WEST} : new Direction[]{Direction.NORTH, Direction.SOUTH}; + for (Direction secondaryDir : secondaryDirs) { + if (isValidSingleLaunchPad(level.getBlockState(blockPos.relative(secondaryDir).relative(primaryDir)))) { + if (isValid3x3(level, blockPos.relative(secondaryDir).relative(primaryDir))) { + updateMultiBlock(level, blockPos.relative(secondaryDir).relative(primaryDir)); + return; } } } } - } } } @@ -371,4 +313,35 @@ public String getSerializedName() { return this.direction; } } + + // helper functions for onPlace() + + // returns true if the block being considered is a LaunchPadBlock and is not part of another launch pad + private boolean isValidSingleLaunchPad(BlockState blockState) { + return blockState.is(this) && blockState.getValue(PART) == Part.NONE; + } + + // returns true if the given block is the center of a valid 3x3 launchpad + private boolean isValid3x3 (Level level, BlockPos centerBlockPos) { + // check if any blocks in 3x3 grid are not valid + for (var x = -1; x <= 1; x++) { + for (var z = -1; z <= 1; z++) { + // if one of the surrounding blocks is not a launch pad or is already part of another launch pad + var block = level.getBlockState(centerBlockPos.offset(x, 0, z)); + if (!block.is(this) || block.getValue(PART) != Part.NONE) { + return false; + } + } + } + return true; + } + + // updates the launchpad multiblock with directional part names + private void updateMultiBlock(Level level, BlockPos centerBlockPos) { + for (var x = -1; x <= 1; x++) { + for (var z = -1; z <= 1; z++) { + level.setBlockAndUpdate(centerBlockPos.offset(x, 0, z), level.getBlockState(centerBlockPos.offset(x, 0, z)).setValue(PART, this.getPartForOffset(x, z))); + } + } + } } \ No newline at end of file From fb17484cc2e31ba2bf4431fe1bf009f667c8962d Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 27 May 2024 22:15:35 -0700 Subject: [PATCH 05/39] fix: rocket does not break when launchpad is broken addresses issue #323 and refactors onRemove code to be more readable --- .../rocketlaunchpad/RocketLaunchPadBlock.java | 75 ++++--------------- .../content/entity/orbital/RocketEntity.java | 3 +- 2 files changed, 18 insertions(+), 60 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java b/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java index af56af10bb..76d7b56fc2 100644 --- a/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java +++ b/src/main/java/dev/galacticraft/mod/content/block/special/rocketlaunchpad/RocketLaunchPadBlock.java @@ -110,66 +110,23 @@ public BlockState playerWillDestroy(Level level, BlockPos blockPos, BlockState b @Override public void onRemove(BlockState blockState, Level level, BlockPos blockPos, BlockState newState, boolean moved) { - super.onRemove(blockState, level, blockPos, newState, moved); - var part = blockState.getValue(PART); - switch (part) { - case NORTH, SOUTH, EAST, WEST -> { - var center = blockPos.relative(part.getDirection().getFirst().getOpposite()); - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - var blockState1 = level.getBlockState(center.offset(x, 0, z)); - - if (blockState1.is(this) && blockState1.getValue(PART) != Part.NONE) { - if (level.getBlockEntity(center.offset(x, 0, z)) instanceof RocketLaunchPadBlockEntity pad) { - if (pad.hasRocket()) { - if (pad.getRocket() != null) { - pad.getRocket().onBaseDestroyed(); - } - } - } - level.destroyBlock(center.offset(x, 0, z), true); - } - } - } - } - case NORTH_EAST, NORTH_WEST, SOUTH_EAST, SOUTH_WEST -> { - var center = blockPos.relative(part.getDirection().getFirst().getOpposite()).relative(part.getDirection().getSecond().getOpposite()); - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - var blockState1 = level.getBlockState(center.offset(x, 0, z)); - - if (blockState1.is(this) && blockState1.getValue(PART) != Part.NONE) { - if (level.getBlockEntity(center.offset(x, 0, z)) instanceof RocketLaunchPadBlockEntity pad) { - if (pad.hasRocket()) { - var entity = pad.getRocket(); - if (entity != null) { - entity.onBaseDestroyed(); - } - } - } - level.destroyBlock(center.offset(x, 0, z), true); - } - } - } + // do nothing if it's not part of a multiblock + if (blockState.getValue(PART) == Part.NONE) { + return; + } + // figure out where the center block is and remove the rocket + BlockPos center = blockPos.offset(RocketLaunchPadBlock.partToCenterPos(blockState.getValue(PART))); + if (level.getBlockEntity(center) instanceof RocketLaunchPadBlockEntity pad) { + if (pad.hasRocket() && pad.getRocket() != null) { + pad.getRocket().onBaseDestroyed(); } - case CENTER -> { - for (var x = -1; x <= 1; x++) { - for (var z = -1; z <= 1; z++) { - var blockState1 = level.getBlockState(blockPos.offset(x, 0, z)); - - if (blockState1.is(this) && blockState1.getValue(PART) != Part.NONE) { - if (level.getBlockEntity(blockPos.offset(x, 0, z)) instanceof RocketLaunchPadBlockEntity pad) { - if (pad.hasRocket()) { - var entity = pad.getRocket(); - if (entity != null) { - entity.onBaseDestroyed(); - } - } - } - level.destroyBlock(blockPos.offset(x, 0, z), false); - } - } - } + } + // calling this removes the block entity + super.onRemove(blockState, level, blockPos, newState, moved); + // remove the launch pad blocks + for (var x = -1; x <= 1; x++) { + for (var z = -1; z <= 1; z++) { + level.destroyBlock(center.offset(x, 0, z), true); } } } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index 691e2d1409..f6e8fe75d7 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -291,7 +291,8 @@ public long getFuel() { @Override public void onBaseDestroyed() { - + this.spawnAtLocation(GCItems.ROCKET.getDefaultInstance()); + this.remove(RemovalReason.DISCARDED); } @Override From f163dbdca7dedf33417c6d6a0a74a71489631d13 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Wed, 29 May 2024 18:55:01 -0700 Subject: [PATCH 06/39] fix: dropped rocket will copy NBT data rather than spawn default item addresses changes requested by @marcus8448 --- .../content/entity/orbital/RocketEntity.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index f6e8fe75d7..1ec05a5d0f 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -291,13 +291,25 @@ public long getFuel() { @Override public void onBaseDestroyed() { - this.spawnAtLocation(GCItems.ROCKET.getDefaultInstance()); + RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); + CompoundTag tag = new CompoundTag(); + data.toNbt(tag); + var rocket = new ItemStack(GCItems.ROCKET); + rocket.setTag(tag); + this.spawnAtLocation(rocket); this.remove(RemovalReason.DISCARDED); } @Override - public void dropItems(DamageSource damageSource, boolean b) { - this.spawnAtLocation(GCItems.ROCKET.getDefaultInstance()); + public void dropItems(DamageSource damageSource, boolean exploded) { + if (!exploded) { + RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); + CompoundTag tag = new CompoundTag(); + data.toNbt(tag); + var rocket = new ItemStack(GCItems.ROCKET); + rocket.setTag(tag); + this.spawnAtLocation(rocket); + } this.remove(RemovalReason.KILLED); } From 08f8f18c25ce1ea450d8057676332d604badbfba Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sat, 1 Jun 2024 15:40:21 -0700 Subject: [PATCH 07/39] feat: certain projectiles bounce off rocket --- .../content/entity/orbital/RocketEntity.java | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index 1ec05a5d0f..1f640ad0e7 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -73,12 +73,15 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -203,30 +206,49 @@ public void setLinkedPad(@NotNull BlockPos blockPos) { this.linkedPad = blockPos; } + private boolean projectileDoesDamage (DamageSource source) { + Entity sourceEntity = source.getDirectEntity(); + if (sourceEntity instanceof AbstractHurtingProjectile) { + return true; + } + if (sourceEntity instanceof AbstractArrow arrow) { + Arrow newArrow = new Arrow((EntityType) arrow.getType(), level()); + CompoundTag arrowNbt = new CompoundTag(); + arrow.addAdditionalSaveData(arrowNbt); + newArrow.readAdditionalSaveData(arrowNbt); + newArrow.setPos(arrow.position()); + Vec3 arrowVel = arrow.getDeltaMovement(); + float bounceFactor = 0.025f; + newArrow.setDeltaMovement(-arrowVel.x * bounceFactor, -arrowVel.y * bounceFactor, -arrowVel.z * bounceFactor); + level().addFreshEntity(newArrow); + arrow.remove(RemovalReason.DISCARDED); + this.playSound(SoundEvents.ANVIL_PLACE, 1.0f, 0.7f); + } + return false; + } + @Override public boolean hurt(DamageSource source, float amount) { if (!this.level().isClientSide && !this.isRemoved()) { if (this.isInvulnerableTo(source)) { return false; - } else { - this.entityData.set(DAMAGE_WOBBLE_SIDE, -this.entityData.get(DAMAGE_WOBBLE_SIDE)); - this.entityData.set(DAMAGE_WOBBLE_TICKS, 10); - this.entityData.set(DAMAGE_WOBBLE_STRENGTH, this.entityData.get(DAMAGE_WOBBLE_STRENGTH) + amount * 10.0F); - boolean creative = source.getEntity() instanceof Player && ((Player) source.getEntity()).getAbilities().instabuild; - if (creative || this.entityData.get(DAMAGE_WOBBLE_STRENGTH) > 40.0F) { - this.ejectPassengers(); - if (creative && !this.hasCustomName()) { - this.remove(RemovalReason.DISCARDED); - } else { - this.dropItems(source, false); - } + } else if (source.is(DamageTypeTags.IS_PROJECTILE) && !projectileDoesDamage(source)) { + return false; + } + this.entityData.set(DAMAGE_WOBBLE_SIDE, -this.entityData.get(DAMAGE_WOBBLE_SIDE)); + this.entityData.set(DAMAGE_WOBBLE_TICKS, 10); + this.entityData.set(DAMAGE_WOBBLE_STRENGTH, this.entityData.get(DAMAGE_WOBBLE_STRENGTH) + amount * 10.0F); + boolean creative = source.getEntity() instanceof Player && ((Player) source.getEntity()).getAbilities().instabuild; + if (creative || this.entityData.get(DAMAGE_WOBBLE_STRENGTH) > 40.0F) { + this.ejectPassengers(); + if (creative && !this.hasCustomName()) { + this.remove(RemovalReason.DISCARDED); + } else { + this.dropItems(source, false); } - - return true; } - } else { - return true; } + return true; } @Override From 2df978346b6c0c0cb3232f305745bd7366792be2 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sat, 1 Jun 2024 15:42:04 -0700 Subject: [PATCH 08/39] fix: rocket no longer hangs when exited rocket will launch without player if player exists and does not reenter / destroy rocket before countdown expires. Copies behavior from Galacticraft Legacy and fixes bug #322 --- .../content/entity/orbital/RocketEntity.java | 75 +++++++++++-------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java index 1f640ad0e7..b97a191d28 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java @@ -313,13 +313,15 @@ public long getFuel() { @Override public void onBaseDestroyed() { - RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); - CompoundTag tag = new CompoundTag(); - data.toNbt(tag); - var rocket = new ItemStack(GCItems.ROCKET); - rocket.setTag(tag); - this.spawnAtLocation(rocket); - this.remove(RemovalReason.DISCARDED); + if (getLaunchStage() != LaunchStage.LAUNCHED) { + RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); + CompoundTag tag = new CompoundTag(); + data.toNbt(tag); + var rocket = new ItemStack(GCItems.ROCKET); + rocket.setTag(tag); + this.spawnAtLocation(rocket); + this.remove(RemovalReason.DISCARDED); + } } @Override @@ -499,24 +501,24 @@ public void tick() { this.timeSinceLaunch = 0; } - if (this.getPassengers().isEmpty()) { - if (getLaunchStage() != LaunchStage.FAILED) { - if (getLaunchStage().ordinal() >= LaunchStage.LAUNCHED.ordinal()) { - this.setLaunchStage(LaunchStage.FAILED); - } else { - this.setLaunchStage(LaunchStage.IDLE); - } - } - } else if (!(this.getFirstPassenger() instanceof Player) && this.getLaunchStage() != LaunchStage.FAILED) { - if (getLaunchStage() == LaunchStage.LAUNCHED) { - this.setLaunchStage(LaunchStage.FAILED); - } else { - this.setLaunchStage(LaunchStage.IDLE); - this.timeBeforeLaunch = getPreLaunchWait(); - } - - this.removePassenger(this.getFirstPassenger()); - } +// if (this.getPassengers().isEmpty()) { +// if (getLaunchStage() != LaunchStage.FAILED && getLaunchStage() != LaunchStage.IGNITED) { +// if (getLaunchStage().ordinal() >= LaunchStage.LAUNCHED.ordinal()) { +// this.setLaunchStage(LaunchStage.FAILED); +// } else { +// this.setLaunchStage(LaunchStage.IDLE); +// } +// } +// } else if (!(this.getFirstPassenger() instanceof Player) && this.getLaunchStage() != LaunchStage.FAILED) { +// if (getLaunchStage() == LaunchStage.LAUNCHED) { +// this.setLaunchStage(LaunchStage.FAILED); +// } else { +// this.setLaunchStage(LaunchStage.IDLE); +// this.timeBeforeLaunch = getPreLaunchWait(); +// } +// +// this.removePassenger(this.getFirstPassenger()); +// } if (isOnFire() && !level().isClientSide) { level().explode(this, this.position().x + (level().random.nextDouble() - 0.5 * 4), this.position().y + (level().random.nextDouble() * 3), this.position().z + (level().random.nextDouble() - 0.5 * 4), 10.0F, Level.ExplosionInteraction.TNT); @@ -548,13 +550,18 @@ public void tick() { gcPlayer.setRocketData(this); gcPlayer.setLaunchpadStack(new ItemStack(GCBlocks.ROCKET_LAUNCH_PAD, 9)); } - for (int x = -1; x <= 1; x++) { - for (int z = -1; z <= 1; z++) { - if (level().getBlockState(getLinkedPad().offset(x, 0, z)).getBlock() == GCBlocks.ROCKET_LAUNCH_PAD - && level().getBlockState(getLinkedPad().offset(x, 0, z)).getValue(RocketLaunchPadBlock.PART) != RocketLaunchPadBlock.Part.NONE) { - level().setBlock(getLinkedPad().offset(x, 0, z), Blocks.AIR.defaultBlockState(), Block.UPDATE_NONE); - } - } +// for (int x = -1; x <= 1; x++) { +// for (int z = -1; z <= 1; z++) { +// if (level().getBlockState(getLinkedPad().offset(x, 0, z)).getBlock() == GCBlocks.ROCKET_LAUNCH_PAD +// && level().getBlockState(getLinkedPad().offset(x, 0, z)).getValue(RocketLaunchPadBlock.PART) != RocketLaunchPadBlock.Part.NONE) { +// level().setBlock(getLinkedPad().offset(x, 0, z), Blocks.AIR.defaultBlockState(), Block.UPDATE_NONE); +// } +// } +// } + if (level().getBlockState(getLinkedPad()).getBlock() == GCBlocks.ROCKET_LAUNCH_PAD + && level().getBlockState(getLinkedPad()).getValue(RocketLaunchPadBlock.PART) != RocketLaunchPadBlock.Part.NONE) { + //level().setBlock(getLinkedPad(), Blocks.AIR.defaultBlockState(), Block.UPDATE_NEIGHBORS); + level().destroyBlock(getLinkedPad(), false); } } this.setSpeed(0.0f); @@ -600,6 +607,10 @@ && level().getBlockState(getLinkedPad().offset(x, 0, z)).getValue(RocketLaunchPa } if (this.position().y() >= 1200.0F) { + // will need to change is for rockets that are launched via launch controllers + if (this.getPassengers().isEmpty()) { + this.remove(RemovalReason.DISCARDED); + } CelestialBody> body = CelestialBody.getByDimension(this.level()).orElse(null); int id; if (body != null) { From d0697abd7d0ba154a66c994d7cf057683b923ed8 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 2 Jun 2024 14:58:33 -0700 Subject: [PATCH 09/39] refactor: moved GC vehicle-related files to new folder --- src/main/java/dev/galacticraft/mod/GalacticraftClient.java | 2 +- .../mod/client/gui/overlay/CountdownOverlay.java | 2 +- .../galacticraft/mod/client/gui/overlay/LanderOverlay.java | 2 +- .../galacticraft/mod/client/gui/overlay/RocketOverlay.java | 2 +- .../mod/client/gui/screen/ingame/RocketWorkbenchScreen.java | 2 +- .../galacticraft/mod/client/model/entity/LanderModel.java | 2 +- .../galacticraft/mod/client/render/entity/BuggyRenderer.java | 2 +- .../mod/client/render/entity/LanderEntityRenderer.java | 3 +-- .../client/render/entity/rocket/RocketEntityRenderer.java | 2 +- .../mod/client/render/item/RocketItemRenderer.java | 2 +- .../java/dev/galacticraft/mod/client/sounds/RocketSound.java | 2 +- .../java/dev/galacticraft/mod/content/GCEntityTypes.java | 5 +++-- .../content/advancements/critereon/LaunchRocketTrigger.java | 2 +- .../{orbital/lander => vehicle}/AbstractLanderEntity.java | 3 +-- .../galacticraft/mod/content/entity/{ => vehicle}/Buggy.java | 4 ++-- .../mod/content/entity/{ => vehicle}/GCVehicle.java | 2 +- .../entity/{orbital/lander => vehicle}/LanderEntity.java | 2 +- .../content/entity/{orbital => vehicle}/RocketEntity.java | 5 +---- .../java/dev/galacticraft/mod/content/item/RocketItem.java | 2 +- .../content/teleporters/LanderCelestialTeleporterType.java | 2 +- .../java/dev/galacticraft/mod/events/ClientEventHandler.java | 2 +- .../dev/galacticraft/mod/mixin/client/FogRendererMixin.java | 2 +- .../galacticraft/mod/mixin/client/HumanoidModelMixin.java | 2 +- .../galacticraft/mod/mixin/client/LevelRendererMixin.java | 2 +- .../mod/mixin/client/LivingEntityRendererMixin.java | 2 +- .../galacticraft/mod/network/GCServerPacketReceivers.java | 2 +- .../galacticraft/mod/network/packets/RocketSpawnPacket.java | 2 +- src/main/java/dev/galacticraft/mod/screen/RocketMenu.java | 2 +- 28 files changed, 31 insertions(+), 35 deletions(-) rename src/main/java/dev/galacticraft/mod/content/entity/{orbital/lander => vehicle}/AbstractLanderEntity.java (92%) rename src/main/java/dev/galacticraft/mod/content/entity/{ => vehicle}/Buggy.java (96%) rename src/main/java/dev/galacticraft/mod/content/entity/{ => vehicle}/GCVehicle.java (99%) rename src/main/java/dev/galacticraft/mod/content/entity/{orbital/lander => vehicle}/LanderEntity.java (99%) rename src/main/java/dev/galacticraft/mod/content/entity/{orbital => vehicle}/RocketEntity.java (99%) diff --git a/src/main/java/dev/galacticraft/mod/GalacticraftClient.java b/src/main/java/dev/galacticraft/mod/GalacticraftClient.java index 169783ca99..60eac5c6d7 100644 --- a/src/main/java/dev/galacticraft/mod/GalacticraftClient.java +++ b/src/main/java/dev/galacticraft/mod/GalacticraftClient.java @@ -44,7 +44,7 @@ import dev.galacticraft.mod.content.GCBlocks; import dev.galacticraft.mod.content.GCEntityTypes; import dev.galacticraft.mod.content.block.environment.FallenMeteorBlock; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.content.item.GCItems; import dev.galacticraft.mod.events.ClientEventHandler; import dev.galacticraft.mod.misc.cape.CapesLoader; diff --git a/src/main/java/dev/galacticraft/mod/client/gui/overlay/CountdownOverlay.java b/src/main/java/dev/galacticraft/mod/client/gui/overlay/CountdownOverlay.java index 8726d186f8..92048503b7 100644 --- a/src/main/java/dev/galacticraft/mod/client/gui/overlay/CountdownOverlay.java +++ b/src/main/java/dev/galacticraft/mod/client/gui/overlay/CountdownOverlay.java @@ -23,7 +23,7 @@ package dev.galacticraft.mod.client.gui.overlay; import dev.galacticraft.api.rocket.LaunchStage; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.util.FastColor; diff --git a/src/main/java/dev/galacticraft/mod/client/gui/overlay/LanderOverlay.java b/src/main/java/dev/galacticraft/mod/client/gui/overlay/LanderOverlay.java index 8937700343..01f1ab0ba4 100644 --- a/src/main/java/dev/galacticraft/mod/client/gui/overlay/LanderOverlay.java +++ b/src/main/java/dev/galacticraft/mod/client/gui/overlay/LanderOverlay.java @@ -23,7 +23,7 @@ package dev.galacticraft.mod.client.gui.overlay; import com.mojang.blaze3d.platform.Window; -import dev.galacticraft.mod.content.entity.orbital.lander.LanderEntity; +import dev.galacticraft.mod.content.entity.vehicle.LanderEntity; import dev.galacticraft.mod.util.Translations; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; diff --git a/src/main/java/dev/galacticraft/mod/client/gui/overlay/RocketOverlay.java b/src/main/java/dev/galacticraft/mod/client/gui/overlay/RocketOverlay.java index 1f3c93cca8..057f1a0fd4 100644 --- a/src/main/java/dev/galacticraft/mod/client/gui/overlay/RocketOverlay.java +++ b/src/main/java/dev/galacticraft/mod/client/gui/overlay/RocketOverlay.java @@ -26,7 +26,7 @@ import com.mojang.blaze3d.vertex.*; import com.mojang.math.Axis; import dev.galacticraft.mod.Constant; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; diff --git a/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketWorkbenchScreen.java b/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketWorkbenchScreen.java index d680da071d..0ea1397647 100644 --- a/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketWorkbenchScreen.java +++ b/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketWorkbenchScreen.java @@ -34,7 +34,7 @@ import dev.galacticraft.mod.content.GCEntityTypes; import dev.galacticraft.mod.content.GCRocketParts; import dev.galacticraft.mod.content.block.entity.RocketWorkbenchBlockEntity; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.machine.storage.VariableSizedContainer; import dev.galacticraft.mod.network.packets.SelectPartPacket; import dev.galacticraft.mod.screen.RocketWorkbenchMenu; diff --git a/src/main/java/dev/galacticraft/mod/client/model/entity/LanderModel.java b/src/main/java/dev/galacticraft/mod/client/model/entity/LanderModel.java index 6b070ceae2..b75afcdcb8 100644 --- a/src/main/java/dev/galacticraft/mod/client/model/entity/LanderModel.java +++ b/src/main/java/dev/galacticraft/mod/client/model/entity/LanderModel.java @@ -24,7 +24,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import dev.galacticraft.mod.content.entity.orbital.lander.LanderEntity; +import dev.galacticraft.mod.content.entity.vehicle.LanderEntity; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; diff --git a/src/main/java/dev/galacticraft/mod/client/render/entity/BuggyRenderer.java b/src/main/java/dev/galacticraft/mod/client/render/entity/BuggyRenderer.java index 3314919b04..783344871f 100644 --- a/src/main/java/dev/galacticraft/mod/client/render/entity/BuggyRenderer.java +++ b/src/main/java/dev/galacticraft/mod/client/render/entity/BuggyRenderer.java @@ -30,7 +30,7 @@ import dev.galacticraft.mod.client.model.GCModelLoader; import dev.galacticraft.mod.client.model.GCModelState; import dev.galacticraft.mod.client.model.GCSheets; -import dev.galacticraft.mod.content.entity.Buggy; +import dev.galacticraft.mod.content.entity.vehicle.Buggy; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; diff --git a/src/main/java/dev/galacticraft/mod/client/render/entity/LanderEntityRenderer.java b/src/main/java/dev/galacticraft/mod/client/render/entity/LanderEntityRenderer.java index 01c326eb16..0a7e7c737d 100644 --- a/src/main/java/dev/galacticraft/mod/client/render/entity/LanderEntityRenderer.java +++ b/src/main/java/dev/galacticraft/mod/client/render/entity/LanderEntityRenderer.java @@ -27,13 +27,12 @@ import dev.galacticraft.mod.Constant; import dev.galacticraft.mod.client.model.entity.LanderModel; import dev.galacticraft.mod.client.render.entity.model.GCEntityModelLayer; -import dev.galacticraft.mod.content.entity.orbital.lander.LanderEntity; +import dev.galacticraft.mod.content.entity.vehicle.LanderEntity; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.resources.ResourceLocation; -import org.lwjgl.opengl.GL11; public class LanderEntityRenderer extends EntityRenderer { protected final LanderModel model; diff --git a/src/main/java/dev/galacticraft/mod/client/render/entity/rocket/RocketEntityRenderer.java b/src/main/java/dev/galacticraft/mod/client/render/entity/rocket/RocketEntityRenderer.java index 45cca68e6d..60d40fdc38 100644 --- a/src/main/java/dev/galacticraft/mod/client/render/entity/rocket/RocketEntityRenderer.java +++ b/src/main/java/dev/galacticraft/mod/client/render/entity/rocket/RocketEntityRenderer.java @@ -27,7 +27,7 @@ import dev.galacticraft.api.entity.rocket.render.RocketPartRendererRegistry; import dev.galacticraft.api.rocket.LaunchStage; import dev.galacticraft.api.rocket.part.RocketPart; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.culling.Frustum; diff --git a/src/main/java/dev/galacticraft/mod/client/render/item/RocketItemRenderer.java b/src/main/java/dev/galacticraft/mod/client/render/item/RocketItemRenderer.java index bcff6d44d2..60f0c5996f 100644 --- a/src/main/java/dev/galacticraft/mod/client/render/item/RocketItemRenderer.java +++ b/src/main/java/dev/galacticraft/mod/client/render/item/RocketItemRenderer.java @@ -29,7 +29,7 @@ import dev.galacticraft.api.rocket.RocketData; import dev.galacticraft.api.rocket.part.RocketPart; import dev.galacticraft.mod.content.GCEntityTypes; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/dev/galacticraft/mod/client/sounds/RocketSound.java b/src/main/java/dev/galacticraft/mod/client/sounds/RocketSound.java index f34259d146..2e0347958e 100644 --- a/src/main/java/dev/galacticraft/mod/client/sounds/RocketSound.java +++ b/src/main/java/dev/galacticraft/mod/client/sounds/RocketSound.java @@ -25,7 +25,7 @@ import dev.galacticraft.api.rocket.LaunchStage; import dev.galacticraft.mod.Constant; import dev.galacticraft.mod.content.GCSounds; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.sounds.SoundSource; diff --git a/src/main/java/dev/galacticraft/mod/content/GCEntityTypes.java b/src/main/java/dev/galacticraft/mod/content/GCEntityTypes.java index 7ac2632728..e6a4e153f1 100644 --- a/src/main/java/dev/galacticraft/mod/content/GCEntityTypes.java +++ b/src/main/java/dev/galacticraft/mod/content/GCEntityTypes.java @@ -27,8 +27,9 @@ import dev.galacticraft.mod.Constant.Entity; import dev.galacticraft.mod.content.entity.*; import dev.galacticraft.mod.content.entity.boss.SkeletonBoss; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; -import dev.galacticraft.mod.content.entity.orbital.lander.LanderEntity; +import dev.galacticraft.mod.content.entity.vehicle.Buggy; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.LanderEntity; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; import net.minecraft.core.registries.BuiltInRegistries; diff --git a/src/main/java/dev/galacticraft/mod/content/advancements/critereon/LaunchRocketTrigger.java b/src/main/java/dev/galacticraft/mod/content/advancements/critereon/LaunchRocketTrigger.java index 870ee032e5..4ec14c14bc 100644 --- a/src/main/java/dev/galacticraft/mod/content/advancements/critereon/LaunchRocketTrigger.java +++ b/src/main/java/dev/galacticraft/mod/content/advancements/critereon/LaunchRocketTrigger.java @@ -25,7 +25,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.galacticraft.api.rocket.LaunchStage; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.advancements.critereon.ContextAwarePredicate; import net.minecraft.advancements.critereon.EntityPredicate; import net.minecraft.advancements.critereon.SimpleCriterionTrigger; diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/lander/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java similarity index 92% rename from src/main/java/dev/galacticraft/mod/content/entity/orbital/lander/AbstractLanderEntity.java rename to src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index 0bae5cc634..d361198412 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/lander/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -20,9 +20,8 @@ * SOFTWARE. */ -package dev.galacticraft.mod.content.entity.orbital.lander; +package dev.galacticraft.mod.content.entity.vehicle; -import dev.galacticraft.mod.content.entity.GCVehicle; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; diff --git a/src/main/java/dev/galacticraft/mod/content/entity/Buggy.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java similarity index 96% rename from src/main/java/dev/galacticraft/mod/content/entity/Buggy.java rename to src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java index 6eb99a6967..f4704421d6 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/Buggy.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java @@ -20,8 +20,9 @@ * SOFTWARE. */ -package dev.galacticraft.mod.content.entity; +package dev.galacticraft.mod.content.entity.vehicle; +import dev.galacticraft.mod.content.entity.ControllableEntity; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; @@ -31,7 +32,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.VariantHolder; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.vehicle.ContainerEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; diff --git a/src/main/java/dev/galacticraft/mod/content/entity/GCVehicle.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicle.java similarity index 99% rename from src/main/java/dev/galacticraft/mod/content/entity/GCVehicle.java rename to src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicle.java index 9b478787c9..49ce0222b3 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/GCVehicle.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicle.java @@ -20,7 +20,7 @@ * SOFTWARE. */ -package dev.galacticraft.mod.content.entity; +package dev.galacticraft.mod.content.entity.vehicle; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/lander/LanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java similarity index 99% rename from src/main/java/dev/galacticraft/mod/content/entity/orbital/lander/LanderEntity.java rename to src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java index c0966c5205..d55c91c988 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/lander/LanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java @@ -20,7 +20,7 @@ * SOFTWARE. */ -package dev.galacticraft.mod.content.entity.orbital.lander; +package dev.galacticraft.mod.content.entity.vehicle; import com.mojang.datafixers.util.Pair; import dev.galacticraft.api.entity.IgnoreShift; diff --git a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java similarity index 99% rename from src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java rename to src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index b97a191d28..6a397e4e76 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/orbital/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -20,7 +20,7 @@ * SOFTWARE. */ -package dev.galacticraft.mod.content.entity.orbital; +package dev.galacticraft.mod.content.entity.vehicle; import dev.galacticraft.api.entity.IgnoreShift; import dev.galacticraft.api.registry.AddonRegistries; @@ -33,7 +33,6 @@ import dev.galacticraft.api.universe.celestialbody.CelestialBodyConfig; import dev.galacticraft.api.universe.celestialbody.CelestialBodyType; import dev.galacticraft.mod.Constant; -import dev.galacticraft.mod.Galacticraft; import dev.galacticraft.mod.attachments.GCServerPlayer; import dev.galacticraft.mod.content.GCBlocks; import dev.galacticraft.mod.content.GCFluids; @@ -84,8 +83,6 @@ import net.minecraft.world.entity.projectile.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.Vec3; diff --git a/src/main/java/dev/galacticraft/mod/content/item/RocketItem.java b/src/main/java/dev/galacticraft/mod/content/item/RocketItem.java index 13731d1d1b..126448374a 100644 --- a/src/main/java/dev/galacticraft/mod/content/item/RocketItem.java +++ b/src/main/java/dev/galacticraft/mod/content/item/RocketItem.java @@ -31,7 +31,7 @@ import dev.galacticraft.mod.content.GCEntityTypes; import dev.galacticraft.mod.content.block.special.rocketlaunchpad.RocketLaunchPadBlock; import dev.galacticraft.mod.content.block.special.rocketlaunchpad.RocketLaunchPadBlockEntity; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.util.Translations; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; diff --git a/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java b/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java index b27ad181d4..32afa8beae 100644 --- a/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java +++ b/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java @@ -27,7 +27,7 @@ import dev.galacticraft.api.universe.celestialbody.landable.teleporter.config.CelestialTeleporterConfig; import dev.galacticraft.api.universe.celestialbody.landable.teleporter.type.CelestialTeleporterType; import dev.galacticraft.impl.universe.celestialbody.landable.teleporter.config.DefaultCelestialTeleporterConfig; -import dev.galacticraft.mod.content.entity.orbital.lander.LanderEntity; +import dev.galacticraft.mod.content.entity.vehicle.LanderEntity; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; diff --git a/src/main/java/dev/galacticraft/mod/events/ClientEventHandler.java b/src/main/java/dev/galacticraft/mod/events/ClientEventHandler.java index 7d902e6a0e..f1401a9df6 100644 --- a/src/main/java/dev/galacticraft/mod/events/ClientEventHandler.java +++ b/src/main/java/dev/galacticraft/mod/events/ClientEventHandler.java @@ -31,7 +31,7 @@ import dev.galacticraft.mod.client.gui.overlay.RocketOverlay; import dev.galacticraft.mod.client.render.FootprintRenderer; import dev.galacticraft.mod.client.sounds.RocketSound; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.misc.footprint.FootprintManager; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; diff --git a/src/main/java/dev/galacticraft/mod/mixin/client/FogRendererMixin.java b/src/main/java/dev/galacticraft/mod/mixin/client/FogRendererMixin.java index ae7470c804..44ec2278cc 100644 --- a/src/main/java/dev/galacticraft/mod/mixin/client/FogRendererMixin.java +++ b/src/main/java/dev/galacticraft/mod/mixin/client/FogRendererMixin.java @@ -23,7 +23,7 @@ package dev.galacticraft.mod.mixin.client; import dev.galacticraft.mod.client.render.dimension.OverworldRenderer; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/src/main/java/dev/galacticraft/mod/mixin/client/HumanoidModelMixin.java b/src/main/java/dev/galacticraft/mod/mixin/client/HumanoidModelMixin.java index 914a8f8492..b5bd4154ab 100644 --- a/src/main/java/dev/galacticraft/mod/mixin/client/HumanoidModelMixin.java +++ b/src/main/java/dev/galacticraft/mod/mixin/client/HumanoidModelMixin.java @@ -23,7 +23,7 @@ package dev.galacticraft.mod.mixin.client; import dev.galacticraft.api.universe.celestialbody.CelestialBody; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.content.item.RocketItem; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; diff --git a/src/main/java/dev/galacticraft/mod/mixin/client/LevelRendererMixin.java b/src/main/java/dev/galacticraft/mod/mixin/client/LevelRendererMixin.java index 466296187e..2aa8f50d7e 100644 --- a/src/main/java/dev/galacticraft/mod/mixin/client/LevelRendererMixin.java +++ b/src/main/java/dev/galacticraft/mod/mixin/client/LevelRendererMixin.java @@ -26,7 +26,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.galacticraft.mod.Constant; import dev.galacticraft.mod.client.render.dimension.OverworldRenderer; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; diff --git a/src/main/java/dev/galacticraft/mod/mixin/client/LivingEntityRendererMixin.java b/src/main/java/dev/galacticraft/mod/mixin/client/LivingEntityRendererMixin.java index d9ca7c46aa..9519571a4d 100644 --- a/src/main/java/dev/galacticraft/mod/mixin/client/LivingEntityRendererMixin.java +++ b/src/main/java/dev/galacticraft/mod/mixin/client/LivingEntityRendererMixin.java @@ -24,7 +24,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.core.Direction; diff --git a/src/main/java/dev/galacticraft/mod/network/GCServerPacketReceivers.java b/src/main/java/dev/galacticraft/mod/network/GCServerPacketReceivers.java index d04d0fcf04..7a1f8af5c9 100644 --- a/src/main/java/dev/galacticraft/mod/network/GCServerPacketReceivers.java +++ b/src/main/java/dev/galacticraft/mod/network/GCServerPacketReceivers.java @@ -27,7 +27,7 @@ import dev.galacticraft.api.universe.celestialbody.CelestialBody; import dev.galacticraft.impl.universe.celestialbody.type.SatelliteType; import dev.galacticraft.mod.Constant; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.events.GCEventHandlers; import dev.galacticraft.mod.network.packets.*; import dev.galacticraft.mod.screen.GCPlayerInventoryMenu; diff --git a/src/main/java/dev/galacticraft/mod/network/packets/RocketSpawnPacket.java b/src/main/java/dev/galacticraft/mod/network/packets/RocketSpawnPacket.java index ed84775f11..7840a358cb 100644 --- a/src/main/java/dev/galacticraft/mod/network/packets/RocketSpawnPacket.java +++ b/src/main/java/dev/galacticraft/mod/network/packets/RocketSpawnPacket.java @@ -24,7 +24,7 @@ import dev.galacticraft.api.rocket.RocketData; import dev.galacticraft.mod.Constant.Packet; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.PacketType; import net.minecraft.client.Minecraft; diff --git a/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java b/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java index 75d7c597aa..5f905b2611 100644 --- a/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java +++ b/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java @@ -22,7 +22,7 @@ package dev.galacticraft.mod.screen; -import dev.galacticraft.mod.content.entity.orbital.RocketEntity; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; From 4b2f0f4077b4717b5f996197d574da01ccddfb9c Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 2 Jun 2024 19:50:30 -0700 Subject: [PATCH 10/39] refactor: vehicles inherit from GCVehicleEntity --- .../entity/vehicle/AbstractLanderEntity.java | 8 +- .../mod/content/entity/vehicle/Buggy.java | 15 +- .../{GCVehicle.java => GCVehicleEntity.java} | 146 +++++++++++------- .../content/entity/vehicle/RocketEntity.java | 108 ++++++------- 4 files changed, 155 insertions(+), 122 deletions(-) rename src/main/java/dev/galacticraft/mod/content/entity/vehicle/{GCVehicle.java => GCVehicleEntity.java} (55%) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index d361198412..f6014d8b29 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -23,9 +23,11 @@ package dev.galacticraft.mod.content.entity.vehicle; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -public abstract class AbstractLanderEntity extends GCVehicle { +public abstract class AbstractLanderEntity extends GCVehicleEntity { public AbstractLanderEntity(EntityType entityType, Level level) { super(entityType, level); } @@ -33,4 +35,8 @@ public AbstractLanderEntity(EntityType entityType, Level level) { public abstract boolean shouldMove(); public abstract boolean shouldSpawnParticles(); + + public Item getDropItem() { + return ItemStack.EMPTY.getItem(); + } } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java index f4704421d6..553c4feeb1 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java @@ -29,13 +29,15 @@ import net.minecraft.world.ContainerListener; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.VariantHolder; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -public class Buggy extends GCVehicle implements ContainerListener, ControllableEntity, VariantHolder { +public class Buggy extends GCVehicleEntity implements ContainerListener, ControllableEntity, VariantHolder { public double speed; public float wheelRotationZ; public float wheelRotationX; @@ -64,6 +66,13 @@ public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boole } + @Override + public boolean hurt(DamageSource source, float amount) { + amount++; + return true; + } + + @Override public boolean canBeCollidedWith() { return true; @@ -101,4 +110,8 @@ public BuggyType getVariant() { public enum BuggyType { } + + public Item getDropItem() { + return ItemStack.EMPTY.getItem(); + } } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicle.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java similarity index 55% rename from src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicle.java rename to src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index 49ce0222b3..2800886610 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicle.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -22,26 +22,37 @@ package dev.galacticraft.mod.content.entity.vehicle; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; +import net.minecraft.world.entity.projectile.Arrow; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; /** * More customizable version of {@link net.minecraft.world.entity.vehicle.VehicleEntity} + * Note: actually, it turns out that VehicleEntity contains a package-protected (i.e. no modifier) abstract method + * getDropItem() that a galacticraft vehicle would not be able to implement. That being said, I'm still copying all the + * methods from VehicleEntity */ -public abstract class GCVehicle extends Entity { - protected static final EntityDataAccessor DATA_ID_HURT = SynchedEntityData.defineId(GCVehicle.class, EntityDataSerializers.INT); - protected static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(GCVehicle.class, EntityDataSerializers.INT); - protected static final EntityDataAccessor DATA_ID_DAMAGE = SynchedEntityData.defineId(GCVehicle.class, EntityDataSerializers.FLOAT); +public abstract class GCVehicleEntity extends Entity { + protected static final EntityDataAccessor DATA_ID_HURT = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); + protected static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); + protected static final EntityDataAccessor DATA_ID_DAMAGE = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.FLOAT); private int lerpSteps; private double lerpX; @@ -50,72 +61,80 @@ public abstract class GCVehicle extends Entity { private double lerpYRot; private double lerpXRot; - public GCVehicle(EntityType entityType, Level level) { + public GCVehicleEntity(EntityType entityType, Level level) { super(entityType, level); } - @Override - public boolean hurt(DamageSource source, float amount) { - if (level().isClientSide || isRemoved()) { - return true; - } else if (isInvulnerableTo(source)) { - return false; - } else { - setHurtDir(-getHurtDir()); - setHurtTime(10); - markHurt(); - setDamage(getDamage() + amount * 10); - gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity()); - boolean instaDestroy = source.getEntity() instanceof Player player && player.getAbilities().instabuild; - if ((instaDestroy || !(getDamage() > getMaxDamage())) && !shouldSourceDestroy(source)) { - if (instaDestroy) { - discard(); - } - } else { - destroy(source); - } - + private boolean projectileDoesDamage (DamageSource source) { + Entity sourceEntity = source.getDirectEntity(); + if (sourceEntity instanceof AbstractHurtingProjectile) { return true; } + if (sourceEntity instanceof AbstractArrow arrow) { + Arrow newArrow = new Arrow((EntityType) arrow.getType(), level()); + CompoundTag arrowNbt = new CompoundTag(); + arrow.addAdditionalSaveData(arrowNbt); + newArrow.readAdditionalSaveData(arrowNbt); + newArrow.setPos(arrow.position()); + Vec3 arrowVel = arrow.getDeltaMovement(); + float bounceFactor = 0.025f; + newArrow.setDeltaMovement(-arrowVel.x * bounceFactor, -arrowVel.y * bounceFactor, -arrowVel.z * bounceFactor); + level().addFreshEntity(newArrow); + arrow.remove(RemovalReason.DISCARDED); + this.playSound(SoundEvents.ANVIL_PLACE, 1.0f, 0.7f); + } + return false; } @Override - public void animateHurt(float yaw) { - this.setHurtDir(-this.getHurtDir()); - this.setHurtTime(10); - this.setDamage(this.getDamage() * getDamageMultiplier()); + public boolean isInvulnerableTo(DamageSource source) { + return super.isInvulnerableTo(source) || (source.is(DamageTypeTags.IS_PROJECTILE) && !projectileDoesDamage(source)); } - public float getDamageMultiplier() { - return 10.0F; - } - - public float getMaxDamage() { - return 40.0F; + @Override + public boolean hurt(DamageSource source, float amount) { + boolean bl; + if (this.level().isClientSide || this.isRemoved()) { + return true; + } + if (this.isInvulnerableTo(source)) { + return false; + } + this.setHurtDir(-this.getHurtDir()); + this.setHurtTime(10); + this.markHurt(); + this.setDamage(this.getDamage() + amount * 10.0f); + this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity()); + boolean bl2 = bl = source.getEntity() instanceof Player && ((Player)source.getEntity()).getAbilities().instabuild; + if (!bl && this.getDamage() > 40.0f || this.shouldSourceDestroy(source)) { + this.destroy(source); + } else if (bl) { + this.discard(); + } + return true; } boolean shouldSourceDestroy(DamageSource source) { return false; } - public void destroy(ItemStack selfAsItem) { + public void destroy(Item selfAsItem) { this.kill(); - if (!selfAsItem.isEmpty()) { - if (this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { - if (this.hasCustomName()) { - selfAsItem.setHoverName(this.getCustomName()); - } - - this.spawnAtLocation(selfAsItem); - } + if (!this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + return; + } + ItemStack itemStack = new ItemStack(selfAsItem); + if (this.hasCustomName()) { + itemStack.setHoverName(this.getCustomName()); } + this.spawnAtLocation(itemStack); } @Override protected void defineSynchedData() { this.entityData.define(DATA_ID_HURT, 0); this.entityData.define(DATA_ID_HURTDIR, 1); - this.entityData.define(DATA_ID_DAMAGE, 0.0F); + this.entityData.define(DATA_ID_DAMAGE, Float.valueOf(0.0f)); } public void setHurtTime(int damageWobbleTicks) { @@ -127,11 +146,11 @@ public void setHurtDir(int damageWobbleSide) { } public void setDamage(float damageWobbleStrength) { - this.entityData.set(DATA_ID_DAMAGE, damageWobbleStrength); + this.entityData.set(DATA_ID_DAMAGE, Float.valueOf(damageWobbleStrength)); } public float getDamage() { - return this.entityData.get(DATA_ID_DAMAGE); + return this.entityData.get(DATA_ID_DAMAGE).floatValue(); } public int getHurtTime() { @@ -143,7 +162,24 @@ public int getHurtDir() { } protected void destroy(DamageSource source) { - this.destroy(getDropItem()); + this.destroy(this.getDropItem()); + } + + public abstract Item getDropItem(); + + @Override + public void animateHurt(float yaw) { + this.setHurtDir(-this.getHurtDir()); + this.setHurtTime(10); + this.setDamage(this.getDamage() * getDamageMultiplier()); + } + + public float getDamageMultiplier() { + return 10.0F; + } + + public float getMaxDamage() { + return 40.0F; } @Override @@ -180,13 +216,13 @@ public void lerpTo(double x, double y, double z, float yaw, float pitch, int int private void tickLerp() { // Stolen from the boat class to fix the rocket from bugging out if (this.isControlledByLocalInstance()) { this.lerpSteps = 0; - this.syncPacketPositionCodec(getX(), getY(), getZ()); + this.syncPacketPositionCodec(this.getX(), this.getY(), this.getZ()); } if (this.lerpSteps > 0) { - double lerpedX = getX() + (this.lerpX - getX()) / (double) this.lerpSteps; - double lerpedY = getY() + (this.lerpY - getY()) / (double) this.lerpSteps; - double lerpedZ = getZ() + (this.lerpZ - getZ()) / (double) this.lerpSteps; + double lerpedX = this.getX() + (this.lerpX - getX()) / (double) this.lerpSteps; + double lerpedY = this.getY() + (this.lerpY - getY()) / (double) this.lerpSteps; + double lerpedZ = this.getZ() + (this.lerpZ - getZ()) / (double) this.lerpSteps; double g = Mth.wrapDegrees(this.lerpYRot - (double) this.getYRot()); setYRot(getYRot() + (float) g / (float) this.lerpSteps); setXRot(getXRot() + (float) (this.lerpXRot - (double) getXRot()) / (float) this.lerpSteps); @@ -195,8 +231,4 @@ private void tickLerp() { // Stolen from the boat class to fix the rocket from b setRot(getYRot(), getXRot()); } } - - public ItemStack getDropItem() { - return ItemStack.EMPTY; - }; } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 6a397e4e76..9ca4285ab0 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -72,15 +72,13 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.*; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; @@ -94,7 +92,7 @@ import java.util.Objects; @SuppressWarnings("UnstableApiUsage") -public class RocketEntity extends Entity implements Rocket, IgnoreShift, ControllableEntity { +public class RocketEntity extends GCVehicleEntity implements Rocket, IgnoreShift, ControllableEntity { private static final ResourceLocation NULL_ID = new ResourceLocation("null"); private static final EntityDataAccessor STAGE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.LAUNCH_STAGE); @@ -203,34 +201,11 @@ public void setLinkedPad(@NotNull BlockPos blockPos) { this.linkedPad = blockPos; } - private boolean projectileDoesDamage (DamageSource source) { - Entity sourceEntity = source.getDirectEntity(); - if (sourceEntity instanceof AbstractHurtingProjectile) { - return true; - } - if (sourceEntity instanceof AbstractArrow arrow) { - Arrow newArrow = new Arrow((EntityType) arrow.getType(), level()); - CompoundTag arrowNbt = new CompoundTag(); - arrow.addAdditionalSaveData(arrowNbt); - newArrow.readAdditionalSaveData(arrowNbt); - newArrow.setPos(arrow.position()); - Vec3 arrowVel = arrow.getDeltaMovement(); - float bounceFactor = 0.025f; - newArrow.setDeltaMovement(-arrowVel.x * bounceFactor, -arrowVel.y * bounceFactor, -arrowVel.z * bounceFactor); - level().addFreshEntity(newArrow); - arrow.remove(RemovalReason.DISCARDED); - this.playSound(SoundEvents.ANVIL_PLACE, 1.0f, 0.7f); - } - return false; - } - @Override public boolean hurt(DamageSource source, float amount) { if (!this.level().isClientSide && !this.isRemoved()) { if (this.isInvulnerableTo(source)) { return false; - } else if (source.is(DamageTypeTags.IS_PROJECTILE) && !projectileDoesDamage(source)) { - return false; } this.entityData.set(DAMAGE_WOBBLE_SIDE, -this.entityData.get(DAMAGE_WOBBLE_SIDE)); this.entityData.set(DAMAGE_WOBBLE_TICKS, 10); @@ -327,13 +302,18 @@ public void dropItems(DamageSource damageSource, boolean exploded) { RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); CompoundTag tag = new CompoundTag(); data.toNbt(tag); - var rocket = new ItemStack(GCItems.ROCKET); + var rocket = new ItemStack(this.getDropItem()); rocket.setTag(tag); this.spawnAtLocation(rocket); } this.remove(RemovalReason.KILLED); } + @Override + public Item getDropItem() { + return GCItems.ROCKET; + } + @Override public @Nullable Fluid getFuelTankFluid() { return this.tank.isResourceBlank() ? null : this.tank.variant.getFluid(); @@ -362,6 +342,7 @@ public Storage getFuelTank() { return this.tank; } + // why does this exist? @Override public Entity asEntity() { return this; @@ -385,43 +366,44 @@ public void move(MoverType type, Vec3 vec3d) { this.getPassengers().forEach(this::positionRider); } - @Override - protected void reapplyPosition() { - super.reapplyPosition(); - this.getPassengers().forEach(this::positionRider); - } - - @Override - public void lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { - this.lerpX = x; - this.lerpY = y; - this.lerpZ = z; - this.lerpYRot = yRot; - this.lerpXRot = xRot; - this.lerpSteps = 10; - } - - private void tickLerp() { // Stolen from the boat class to fix the rocket from bugging out - if (this.isControlledByLocalInstance()) { - this.lerpSteps = 0; - this.syncPacketPositionCodec(this.getX(), this.getY(), this.getZ()); - } - - if (this.lerpSteps > 0) { - double d = this.getX() + (this.lerpX - this.getX()) / (double) this.lerpSteps; - double e = this.getY() + (this.lerpY - this.getY()) / (double) this.lerpSteps; - double f = this.getZ() + (this.lerpZ - this.getZ()) / (double) this.lerpSteps; - double g = Mth.wrapDegrees(this.lerpYRot - (double) this.getYRot()); - this.setYRot(this.getYRot() + (float) g / (float) this.lerpSteps); - this.setXRot(this.getXRot() + (float) (this.lerpXRot - (double) this.getXRot()) / (float) this.lerpSteps); - --this.lerpSteps; - this.setPos(d, e, f); - this.setRot(this.getYRot(), this.getXRot()); - } - } +// @Override +// protected void reapplyPosition() { +// super.reapplyPosition(); +// this.getPassengers().forEach(this::positionRider); +// } + +// @Override +// public void lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { +// this.lerpX = x; +// this.lerpY = y; +// this.lerpZ = z; +// this.lerpYRot = yRot; +// this.lerpXRot = xRot; +// this.lerpSteps = 10; +// } + +// private void tickLerp() { // Stolen from the boat class to fix the rocket from bugging out +// if (this.isControlledByLocalInstance()) { +// this.lerpSteps = 0; +// this.syncPacketPositionCodec(this.getX(), this.getY(), this.getZ()); +// } +// +// if (this.lerpSteps > 0) { +// double d = this.getX() + (this.lerpX - this.getX()) / (double) this.lerpSteps; +// double e = this.getY() + (this.lerpY - this.getY()) / (double) this.lerpSteps; +// double f = this.getZ() + (this.lerpZ - this.getZ()) / (double) this.lerpSteps; +// double g = Mth.wrapDegrees(this.lerpYRot - (double) this.getYRot()); +// this.setYRot(this.getYRot() + (float) g / (float) this.lerpSteps); +// this.setXRot(this.getXRot() + (float) (this.lerpXRot - (double) this.getXRot()) / (float) this.lerpSteps); +// --this.lerpSteps; +// this.setPos(d, e, f); +// this.setRot(this.getYRot(), this.getXRot()); +// } +// } @Override protected void defineSynchedData() { + super.defineSynchedData(); this.entityData.define(STAGE, LaunchStage.IDLE); this.entityData.define(SPEED, 0.0f); @@ -478,7 +460,7 @@ public void tick() { setTimeAsState(getTimeAsState() + 1); super.tick(); - tickLerp(); + //tickLerp(); int particleChance; From afe4ccbbad3a9fcd126a881bbe8b25ec6d41dfc0 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 2 Jun 2024 20:23:04 -0700 Subject: [PATCH 11/39] fix: lander gets instantiated on the destination celestial body lander gets instantiated using information from the player, so the player needs to be teleported first before the lander can be created --- .../mod/content/teleporters/LanderCelestialTeleporterType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java b/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java index 32afa8beae..fd2c5f5ce6 100644 --- a/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java +++ b/src/main/java/dev/galacticraft/mod/content/teleporters/LanderCelestialTeleporterType.java @@ -40,10 +40,11 @@ public LanderCelestialTeleporterType(Codec codec) { @Override public void onEnterAtmosphere(ServerLevel level, ServerPlayer player, CelestialBody body, CelestialBody fromBody, Config config) { + // teleport player first because lander level is set by player level at instantiation + player.teleportTo(level, player.getX(), 1100, player.getZ(), player.getYRot(), player.getXRot()); LanderEntity lander = new LanderEntity(player); level.addFreshEntity(lander); lander.setPos(player.getX(), 1100, player.getZ()); - player.teleportTo(level, player.getX(), 1100, player.getZ(), player.getYRot(), player.getXRot()); player.startRiding(lander, true); } } From e5bb153c26103d90ff6cca7f02f32cdbb3c3dd49 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 2 Jun 2024 22:14:23 -0700 Subject: [PATCH 12/39] refactor: added RequiresFuel interface for vehicles --- .../api/rocket/entity/RequiresFuel.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java b/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java new file mode 100644 index 0000000000..e8ee0cbefb --- /dev/null +++ b/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java @@ -0,0 +1,20 @@ +package dev.galacticraft.api.rocket.entity; + +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; +import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; +import net.fabricmc.fabric.api.transfer.v1.storage.Storage; +import net.minecraft.world.level.material.Fluid; +import org.jetbrains.annotations.Nullable; + +public interface RequiresFuel { + + @Nullable + Fluid getFuelTankFluid(); + + int getFuelTankAmount(); + + int getFuelTankCapacity(); + + Storage getFuelTank(); + +} From 29cf6302f5772a0d1f7c94929e671853a353397e Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 2 Jun 2024 22:15:11 -0700 Subject: [PATCH 13/39] refactor: added RideableVehicleEntity class for further subdivision of GC vehicle types --- .../GCPlayerRideableVehicleEntity.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java new file mode 100644 index 0000000000..086b4d4b0f --- /dev/null +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java @@ -0,0 +1,26 @@ +package dev.galacticraft.mod.content.entity.vehicle; + +import dev.galacticraft.api.entity.IgnoreShift; +import dev.galacticraft.mod.content.entity.ControllableEntity; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +/** + * Should contain code common to vehicles that the player can ride + */ +public abstract class GCPlayerRideableVehicleEntity extends GCVehicleEntity implements IgnoreShift, ControllableEntity { + + public GCPlayerRideableVehicleEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + @Override + public boolean isPickable() { //Required to interact with the entity + return true; + } + +} From 92e309f871755a253f34fa41a0c67be41020f979 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 3 Jun 2024 21:10:34 -0700 Subject: [PATCH 14/39] refactor: moved fuel related methods out of rocket interface --- .../dev/galacticraft/api/rocket/entity/Rocket.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java b/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java index c2b7fedc28..465b3b57fd 100644 --- a/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java +++ b/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java @@ -25,16 +25,13 @@ import dev.galacticraft.api.rocket.LaunchStage; import dev.galacticraft.api.rocket.RocketData; import dev.galacticraft.api.rocket.part.*; -import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; -import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public interface Rocket extends RocketData { +public interface Rocket extends RocketData, RequiresFuel { /** * Returns the launch stage of this rocket. * @return the launch stage of this rocket. @@ -79,10 +76,5 @@ public interface Rocket extends RocketData { */ void dropItems(DamageSource source, boolean exploded); - @Nullable Fluid getFuelTankFluid(); - long getFuelTankAmount(); - long getFuelTankCapacity(); - Storage getFuelTank(); - Entity asEntity(); } \ No newline at end of file From a3124752a93ecf89f37027af00f3998b192431db Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 3 Jun 2024 22:08:13 -0700 Subject: [PATCH 15/39] refactor: reorganized methods to have consistent order --- .../GCPlayerRideableVehicleEntity.java | 50 +++++- .../entity/vehicle/GCVehicleEntity.java | 164 +++++++++++------- 2 files changed, 151 insertions(+), 63 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java index 086b4d4b0f..d83cfef1fb 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java @@ -1,26 +1,74 @@ package dev.galacticraft.mod.content.entity.vehicle; import dev.galacticraft.api.entity.IgnoreShift; +import dev.galacticraft.api.rocket.entity.RequiresFuel; import dev.galacticraft.mod.content.entity.ControllableEntity; +import dev.galacticraft.mod.util.FluidUtil; +import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.joml.Vector3f; /** * Should contain code common to vehicles that the player can ride */ -public abstract class GCPlayerRideableVehicleEntity extends GCVehicleEntity implements IgnoreShift, ControllableEntity { +public abstract class GCPlayerRideableVehicleEntity extends GCVehicleEntity implements IgnoreShift, ControllableEntity, RequiresFuel { + + // **************************************** FIELDS **************************************** + + protected static final EntityDataAccessor FUEL = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.LONG); + + protected final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets(this.getFuelTankCapacity()), () -> { + this.entityData.set(FUEL, this.getFuelTank().getAmount()); + }); + + // **************************************** CONSTRUCTOR **************************************** public GCPlayerRideableVehicleEntity(EntityType entityType, Level level) { super(entityType, level); } + // **************************************** DATA **************************************** + @Override public boolean isPickable() { //Required to interact with the entity return true; } + // **************************************** FUEL **************************************** + + public SingleFluidStorage getFuelTank() { + return this.tank; + } + + public int getFuelTankAmount() { + return this.entityData.get(FUEL).intValue(); + } + + @Override + public int getScaledFuelLevel(int scale) { + if (this.getFuelTankCapacity() <= 0) { + return 0; + } + return (int) (this.entityData.get(FUEL) * scale / this.getFuelTankCapacity()); + } + + // **************************************** INTERACTION **************************************** + + @Override + public abstract InteractionResult interact(Player player, InteractionHand hand); + + @Override + public abstract Vec3 getDismountLocationForPassenger(LivingEntity passenger); + } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index 2800886610..16f32e6116 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -22,16 +22,23 @@ package dev.galacticraft.mod.content.entity.vehicle; +import dev.galacticraft.mod.content.entity.ScalableFuelLevel; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; +import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; +import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; +import net.minecraft.world.Container; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; @@ -48,8 +55,16 @@ * Note: actually, it turns out that VehicleEntity contains a package-protected (i.e. no modifier) abstract method * getDropItem() that a galacticraft vehicle would not be able to implement. That being said, I'm still copying all the * methods from VehicleEntity + * + * Should contain code common to all GC vehicles (e.g. rockets, cargo rockets, buggies, landers, and astrominers) */ -public abstract class GCVehicleEntity extends Entity { +public abstract class GCVehicleEntity extends Entity implements Container, ScalableFuelLevel, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { + + // **************************************** FIELDS **************************************** + + protected static final ResourceLocation NULL_ID = new ResourceLocation("null"); + protected static final EntityDataAccessor SPEED = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.FLOAT); + protected static final EntityDataAccessor DATA_ID_HURT = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); protected static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); protected static final EntityDataAccessor DATA_ID_DAMAGE = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.FLOAT); @@ -61,36 +76,83 @@ public abstract class GCVehicleEntity extends Entity { private double lerpYRot; private double lerpXRot; + protected NonNullList inventory; + protected InventoryStorage storage; + + // **************************************** CONSTRUCTOR **************************************** + public GCVehicleEntity(EntityType entityType, Level level) { super(entityType, level); } - private boolean projectileDoesDamage (DamageSource source) { - Entity sourceEntity = source.getDirectEntity(); - if (sourceEntity instanceof AbstractHurtingProjectile) { - return true; - } - if (sourceEntity instanceof AbstractArrow arrow) { - Arrow newArrow = new Arrow((EntityType) arrow.getType(), level()); - CompoundTag arrowNbt = new CompoundTag(); - arrow.addAdditionalSaveData(arrowNbt); - newArrow.readAdditionalSaveData(arrowNbt); - newArrow.setPos(arrow.position()); - Vec3 arrowVel = arrow.getDeltaMovement(); - float bounceFactor = 0.025f; - newArrow.setDeltaMovement(-arrowVel.x * bounceFactor, -arrowVel.y * bounceFactor, -arrowVel.z * bounceFactor); - level().addFreshEntity(newArrow); - arrow.remove(RemovalReason.DISCARDED); - this.playSound(SoundEvents.ANVIL_PLACE, 1.0f, 0.7f); - } - return false; - } + // **************************************** DATA **************************************** @Override public boolean isInvulnerableTo(DamageSource source) { return super.isInvulnerableTo(source) || (source.is(DamageTypeTags.IS_PROJECTILE) && !projectileDoesDamage(source)); } + @Override + protected void defineSynchedData() { + this.entityData.define(DATA_ID_HURT, 0); + this.entityData.define(DATA_ID_HURTDIR, 1); + this.entityData.define(DATA_ID_DAMAGE, Float.valueOf(0.0f)); + } + + public int getHurtTime() { + return this.entityData.get(DATA_ID_HURT); + } + + public void setHurtTime(int damageWobbleTicks) { + this.entityData.set(DATA_ID_HURT, damageWobbleTicks); + } + + public int getHurtDir() { + return this.entityData.get(DATA_ID_HURTDIR); + } + + public void setHurtDir(int damageWobbleSide) { + this.entityData.set(DATA_ID_HURTDIR, damageWobbleSide); + } + + public float getDamage() { + return this.entityData.get(DATA_ID_DAMAGE).floatValue(); + } + + public void setDamage(float damageWobbleStrength) { + this.entityData.set(DATA_ID_DAMAGE, Float.valueOf(damageWobbleStrength)); + } + + public abstract Item getDropItem(); + + public float getDamageMultiplier() { + return 10.0F; + } + + public float getMaxDamage() { + return 40.0F; + } + + // consider deleting + boolean shouldSourceDestroy(DamageSource source) { + return false; + } + + @Override + public boolean stillValid(Player player) { + return this.position().closerThan(player.position(), 8.0); + } + + public float getSpeed() { + return this.getEntityData().get(SPEED); + } + + public void setSpeed(float speed) { + this.getEntityData().set(SPEED, speed); + } + + // **************************************** INTERACTION **************************************** + @Override public boolean hurt(DamageSource source, float amount) { boolean bl; @@ -114,7 +176,24 @@ public boolean hurt(DamageSource source, float amount) { return true; } - boolean shouldSourceDestroy(DamageSource source) { + private boolean projectileDoesDamage (DamageSource source) { + Entity sourceEntity = source.getDirectEntity(); + if (sourceEntity instanceof AbstractHurtingProjectile) { + return true; + } + if (sourceEntity instanceof AbstractArrow arrow) { + Arrow newArrow = new Arrow((EntityType) arrow.getType(), level()); + CompoundTag arrowNbt = new CompoundTag(); + arrow.addAdditionalSaveData(arrowNbt); + newArrow.readAdditionalSaveData(arrowNbt); + newArrow.setPos(arrow.position()); + Vec3 arrowVel = arrow.getDeltaMovement(); + float bounceFactor = 0.025f; + newArrow.setDeltaMovement(-arrowVel.x * bounceFactor, -arrowVel.y * bounceFactor, -arrowVel.z * bounceFactor); + level().addFreshEntity(newArrow); + arrow.remove(RemovalReason.DISCARDED); + this.playSound(SoundEvents.ANVIL_PLACE, 1.0f, 0.7f); + } return false; } @@ -130,43 +209,10 @@ public void destroy(Item selfAsItem) { this.spawnAtLocation(itemStack); } - @Override - protected void defineSynchedData() { - this.entityData.define(DATA_ID_HURT, 0); - this.entityData.define(DATA_ID_HURTDIR, 1); - this.entityData.define(DATA_ID_DAMAGE, Float.valueOf(0.0f)); - } - - public void setHurtTime(int damageWobbleTicks) { - this.entityData.set(DATA_ID_HURT, damageWobbleTicks); - } - - public void setHurtDir(int damageWobbleSide) { - this.entityData.set(DATA_ID_HURTDIR, damageWobbleSide); - } - - public void setDamage(float damageWobbleStrength) { - this.entityData.set(DATA_ID_DAMAGE, Float.valueOf(damageWobbleStrength)); - } - - public float getDamage() { - return this.entityData.get(DATA_ID_DAMAGE).floatValue(); - } - - public int getHurtTime() { - return this.entityData.get(DATA_ID_HURT); - } - - public int getHurtDir() { - return this.entityData.get(DATA_ID_HURTDIR); - } - protected void destroy(DamageSource source) { this.destroy(this.getDropItem()); } - public abstract Item getDropItem(); - @Override public void animateHurt(float yaw) { this.setHurtDir(-this.getHurtDir()); @@ -174,13 +220,7 @@ public void animateHurt(float yaw) { this.setDamage(this.getDamage() * getDamageMultiplier()); } - public float getDamageMultiplier() { - return 10.0F; - } - - public float getMaxDamage() { - return 40.0F; - } + // **************************************** TICK **************************************** @Override public void tick() { From 1b57bd71c39808b20b5df526ff31b5f3a6ddf97c Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 3 Jun 2024 22:09:01 -0700 Subject: [PATCH 16/39] refactor: reorganized rocketentity code also removed methods implemented by parent classes --- .../content/entity/vehicle/RocketEntity.java | 589 ++++++++---------- 1 file changed, 255 insertions(+), 334 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 9ca4285ab0..568c45b9cc 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -22,7 +22,6 @@ package dev.galacticraft.mod.content.entity.vehicle; -import dev.galacticraft.api.entity.IgnoreShift; import dev.galacticraft.api.registry.AddonRegistries; import dev.galacticraft.api.registry.RocketRegistries; import dev.galacticraft.api.rocket.LaunchStage; @@ -39,7 +38,6 @@ import dev.galacticraft.mod.content.advancements.GCTriggers; import dev.galacticraft.mod.content.block.special.rocketlaunchpad.RocketLaunchPadBlock; import dev.galacticraft.mod.content.block.special.rocketlaunchpad.RocketLaunchPadBlockEntity; -import dev.galacticraft.mod.content.entity.ControllableEntity; import dev.galacticraft.mod.content.entity.data.GCEntityDataSerializers; import dev.galacticraft.mod.content.item.GCItems; import dev.galacticraft.mod.events.RocketEvents; @@ -47,14 +45,11 @@ import dev.galacticraft.mod.particle.EntityParticleOption; import dev.galacticraft.mod.particle.GCParticleTypes; import dev.galacticraft.mod.tag.GCTags; -import dev.galacticraft.mod.util.FluidUtil; import dev.galacticraft.mod.util.Translations; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidConstants; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; -import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; -import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; import net.fabricmc.loader.api.FabricLoader; @@ -92,20 +87,18 @@ import java.util.Objects; @SuppressWarnings("UnstableApiUsage") -public class RocketEntity extends GCVehicleEntity implements Rocket, IgnoreShift, ControllableEntity { - private static final ResourceLocation NULL_ID = new ResourceLocation("null"); - private static final EntityDataAccessor STAGE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.LAUNCH_STAGE); +public class RocketEntity extends GCPlayerRideableVehicleEntity implements Rocket { - private static final EntityDataAccessor COLOR = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.INT); + // **************************************** FIELDS **************************************** + private static final EntityDataAccessor STAGE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.LAUNCH_STAGE); + private static final EntityDataAccessor COLOR = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor TIME_AS_STATE = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor DAMAGE_WOBBLE_TICKS = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor DAMAGE_WOBBLE_SIDE = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor DAMAGE_WOBBLE_STRENGTH = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.FLOAT); - public static final EntityDataAccessor SPEED = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.FLOAT); - public static final EntityDataAccessor ROCKET_CONE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); public static final EntityDataAccessor ROCKET_BODY = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); public static final EntityDataAccessor ROCKET_FIN = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); @@ -113,26 +106,22 @@ public class RocketEntity extends GCVehicleEntity implements Rocket, IgnoreShift public static final EntityDataAccessor ROCKET_ENGINE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); public static final EntityDataAccessor ROCKET_UPGRADE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); - public static final EntityDataAccessor FUEL = SynchedEntityData.defineId(RocketEntity.class, EntityDataSerializers.LONG); private final boolean debugMode = false && FabricLoader.getInstance().isDevelopmentEnvironment(); private BlockPos linkedPad = BlockPos.ZERO; - private final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets(100), () -> { - this.entityData.set(FUEL, getTank().getAmount()); - }); + private int timeBeforeLaunch; private float timeSinceLaunch; - private int lerpSteps; - private double lerpX; - private double lerpY; - private double lerpZ; - private double lerpYRot; - private double lerpXRot; + private long ticksSinceJump = 0; + + // **************************************** CONSTRUCTOR **************************************** public RocketEntity(EntityType entityType, Level level) { super(entityType, level); } + // **************************************** DATA **************************************** + public int getTimeAsState() { return this.entityData.get(TIME_AS_STATE); } @@ -141,11 +130,6 @@ public void setTimeAsState(int time) { this.entityData.set(TIME_AS_STATE, time); } - @Override - protected boolean canAddPassenger(Entity passenger) { - return this.getPassengers().isEmpty(); - } - @Override public LaunchStage getLaunchStage() { return this.entityData.get(STAGE); @@ -162,45 +146,150 @@ public void setLaunchStage(LaunchStage launchStage) { } @Override - public RocketCone getCone() { - return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_CONE).get(this.cone()); + protected boolean canRide(Entity rideable) { + return false; } @Override - public RocketBody getBody() { - return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_BODY).get(this.body()); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(STAGE, LaunchStage.IDLE); + this.entityData.define(SPEED, 0.0f); + + this.entityData.define(COLOR, -1); + + this.entityData.define(TIME_AS_STATE, 0); + this.entityData.define(DAMAGE_WOBBLE_TICKS, 0); + this.entityData.define(DAMAGE_WOBBLE_SIDE, 0); + this.entityData.define(DAMAGE_WOBBLE_STRENGTH, 0.0F); + + this.entityData.define(ROCKET_CONE, NULL_ID); + this.entityData.define(ROCKET_BODY, NULL_ID); + this.entityData.define(ROCKET_FIN, NULL_ID); + this.entityData.define(ROCKET_BOOSTER, NULL_ID); + this.entityData.define(ROCKET_ENGINE, NULL_ID); + this.entityData.define(ROCKET_UPGRADE, NULL_ID); + + this.entityData.define(FUEL, 0L); } @Override - public RocketFin getFin() { - return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_FIN).get(this.fin()); + public Item getDropItem() { + return GCItems.ROCKET; } @Override - public RocketBooster getBooster() { - return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_BOOSTER).get(this.booster()); + @ApiStatus.Internal + public void setLevel(Level level) { + super.setLevel(level); } @Override - public RocketEngine getEngine() { - return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_ENGINE).get(this.engine()); + public int color() { + return this.getEntityData().get(COLOR); + } + + public void setColor(int color) { + this.getEntityData().set(COLOR, color); } @Override - public RocketUpgrade getUpgrade() { - return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_UPGRADE).get(this.upgrade()); + public @NotNull Packet getAddEntityPacket() { + return ServerPlayNetworking.createS2CPacket(new RocketSpawnPacket(getType(), getId(), this.uuid, getX(), getY(), getZ(), getXRot(), getYRot(), this)); + } + + public int getTimeBeforeLaunch() { + return timeBeforeLaunch; + } + + public int getPreLaunchWait() { + return 400; } @Override - public @NotNull BlockPos getLinkedPad() { - return linkedPad; + protected void readAdditionalSaveData(CompoundTag tag) { + this.setCone(tag.contains("Cone") ? new ResourceLocation(tag.getString("Cone")) : null); + this.setBody(tag.contains("Body") ? new ResourceLocation(tag.getString("Body")) : null); + this.setFin(tag.contains("Fin") ? new ResourceLocation(tag.getString("Fin")) : null); + this.setBooster(tag.contains("Booster") ? new ResourceLocation(tag.getString("Booster")) : null); + this.setEngine(tag.contains("Engine") ? new ResourceLocation(tag.getString("Engine")) : null); + this.setUpgrade(tag.contains("Upgrade") ? new ResourceLocation(tag.getString("Upgrade")) : null); + + if (tag.contains("Color")) { + this.setColor(tag.getInt("Color")); + } + + if (tag.contains("Stage")) { + this.setLaunchStage(LaunchStage.valueOf(tag.getString("Stage"))); + } + + if (tag.contains("Speed")) { + setSpeed(tag.getFloat("Speed")); + } + + this.linkedPad = new BlockPos(tag.getInt("lX"), tag.getInt("lY"), tag.getInt("lZ")); } @Override - public void setLinkedPad(@NotNull BlockPos blockPos) { - this.linkedPad = blockPos; + protected void addAdditionalSaveData(CompoundTag tag) { + if (this.cone() != null) tag.putString("Cone", Objects.requireNonNull(this.cone()).toString()); + if (this.body() != null) tag.putString("Body", Objects.requireNonNull(this.body()).toString()); + if (this.fin() != null) tag.putString("Fin", Objects.requireNonNull(this.fin()).toString()); + if (this.booster() != null) tag.putString("Booster", Objects.requireNonNull(this.booster()).toString()); + if (this.engine() != null) tag.putString("Engine", Objects.requireNonNull(this.engine()).toString()); + if (this.upgrade() != null) tag.putString("Upgrade", Objects.requireNonNull(this.upgrade()).toString()); + + tag.putString("Stage", getLaunchStage().name()); + tag.putDouble("Speed", this.getSpeed()); + tag.putInt("Color", this.color()); + + tag.putInt("lX", linkedPad.getX()); + tag.putInt("lY", linkedPad.getY()); + tag.putInt("lZ", linkedPad.getZ()); + } + + public void setData(RocketData data) { + this.setColor(data.color()); + + this.setCone(data.cone() != null ? data.cone().location() : null); + this.setBody(data.body() != null ? data.body().location() : null); + this.setFin(data.fin() != null ? data.fin().location() : null); + this.setBooster(data.booster() != null ? data.booster().location() : null); + this.setEngine(data.engine() != null ? data.engine().location() : null); + this.setUpgrade(data.upgrade() != null ? data.upgrade().location() : null); + } + + @Override + public boolean shouldIgnoreShiftExit() { + return getLaunchStage().ordinal() >= LaunchStage.LAUNCHED.ordinal(); + } + + // **************************************** FUEL **************************************** + + public void setFuel(long fuel) { + try (Transaction tx = Transaction.openOuter()) { + StorageUtil.extractAny(this.tank, Long.MAX_VALUE, tx); + this.tank.insert(FluidVariant.of(GCFluids.FUEL), fuel, tx); + tx.commit(); + } + } + + public boolean isTankEmpty() { + return this.getFuelTank().getAmount() <= 0 || this.getFuelTank().getResource().isBlank(); + } + + @Override + public @Nullable Fluid getFuelTankFluid() { + return this.tank.isResourceBlank() ? null : this.tank.variant.getFluid(); } + @Override + public int getFuelTankCapacity() { + return 100; + } + + // **************************************** INTERACTION **************************************** + @Override public boolean hurt(DamageSource source, float amount) { if (!this.level().isClientSide && !this.isRemoved()) { @@ -217,6 +306,7 @@ public boolean hurt(DamageSource source, float amount) { this.remove(RemovalReason.DISCARDED); } else { this.dropItems(source, false); + this.remove(RemovalReason.KILLED); } } } @@ -231,25 +321,9 @@ public void remove(RemovalReason reason) { if (blockEntity instanceof RocketLaunchPadBlockEntity pad) { pad.setLinkedRocket(null); } - } } - @Override - protected boolean canRide(Entity ridable) { - return false; - } - - private long ticksSinceJump = 0; - - public SingleFluidStorage getTank() { - return this.tank; - } - - public boolean isTankEmpty() { - return this.getTank().getAmount() <= 0 || this.getTank().getResource().isBlank(); - } - @Override public void onJump() { if (!this.getPassengers().isEmpty() && ticksSinceJump > 10) { @@ -267,31 +341,10 @@ public void onJump() { } } - public void setFuel(long fuel) { - try (Transaction tx = Transaction.openOuter()) { - StorageUtil.extractAny(this.tank, Long.MAX_VALUE, tx); - this.tank.insert(FluidVariant.of(GCFluids.FUEL), fuel, tx); - tx.commit(); - } - } - - public void setCreative(boolean creative) { - - } - - public long getFuel() { - return this.entityData.get(FUEL); - } - @Override public void onBaseDestroyed() { if (getLaunchStage() != LaunchStage.LAUNCHED) { - RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); - CompoundTag tag = new CompoundTag(); - data.toNbt(tag); - var rocket = new ItemStack(GCItems.ROCKET); - rocket.setTag(tag); - this.spawnAtLocation(rocket); + this.dropRocket(); this.remove(RemovalReason.DISCARDED); } } @@ -299,129 +352,17 @@ public void onBaseDestroyed() { @Override public void dropItems(DamageSource damageSource, boolean exploded) { if (!exploded) { - RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); - CompoundTag tag = new CompoundTag(); - data.toNbt(tag); - var rocket = new ItemStack(this.getDropItem()); - rocket.setTag(tag); - this.spawnAtLocation(rocket); - } - this.remove(RemovalReason.KILLED); - } - - @Override - public Item getDropItem() { - return GCItems.ROCKET; - } - - @Override - public @Nullable Fluid getFuelTankFluid() { - return this.tank.isResourceBlank() ? null : this.tank.variant.getFluid(); - } - - @Override - public long getFuelTankAmount() { - return this.tank.getAmount(); - } - - @Override - public long getFuelTankCapacity() { - return this.tank.getCapacity(); - } - - public int getScaledFuelLevel(int scale) { - if (this.getFuelTankCapacity() <= 0) { - return 0; + this.dropRocket(); } - - return (int) (this.getFuel() * scale / this.getFuelTankCapacity()); - } - - @Override - public Storage getFuelTank() { - return this.tank; } - // why does this exist? - @Override - public Entity asEntity() { - return this; - } - - @Override - public void setDeltaMovement(double x, double y, double z) { - this.setDeltaMovement(new Vec3(x, y, z)); - } - - @Override - public void setDeltaMovement(Vec3 vec3d) { - super.setDeltaMovement(vec3d); - this.hasImpulse = true; - } - - @Override - public void move(MoverType type, Vec3 vec3d) { - if (onGround()) vec3d.multiply(1.0D, 0.0D, 1.0D); - super.move(type, vec3d); - this.getPassengers().forEach(this::positionRider); - } - -// @Override -// protected void reapplyPosition() { -// super.reapplyPosition(); -// this.getPassengers().forEach(this::positionRider); -// } - -// @Override -// public void lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { -// this.lerpX = x; -// this.lerpY = y; -// this.lerpZ = z; -// this.lerpYRot = yRot; -// this.lerpXRot = xRot; -// this.lerpSteps = 10; -// } - -// private void tickLerp() { // Stolen from the boat class to fix the rocket from bugging out -// if (this.isControlledByLocalInstance()) { -// this.lerpSteps = 0; -// this.syncPacketPositionCodec(this.getX(), this.getY(), this.getZ()); -// } -// -// if (this.lerpSteps > 0) { -// double d = this.getX() + (this.lerpX - this.getX()) / (double) this.lerpSteps; -// double e = this.getY() + (this.lerpY - this.getY()) / (double) this.lerpSteps; -// double f = this.getZ() + (this.lerpZ - this.getZ()) / (double) this.lerpSteps; -// double g = Mth.wrapDegrees(this.lerpYRot - (double) this.getYRot()); -// this.setYRot(this.getYRot() + (float) g / (float) this.lerpSteps); -// this.setXRot(this.getXRot() + (float) (this.lerpXRot - (double) this.getXRot()) / (float) this.lerpSteps); -// --this.lerpSteps; -// this.setPos(d, e, f); -// this.setRot(this.getYRot(), this.getXRot()); -// } -// } - - @Override - protected void defineSynchedData() { - super.defineSynchedData(); - this.entityData.define(STAGE, LaunchStage.IDLE); - this.entityData.define(SPEED, 0.0f); - - this.entityData.define(COLOR, -1); - - this.entityData.define(TIME_AS_STATE, 0); - this.entityData.define(DAMAGE_WOBBLE_TICKS, 0); - this.entityData.define(DAMAGE_WOBBLE_SIDE, 0); - this.entityData.define(DAMAGE_WOBBLE_STRENGTH, 0.0F); - - this.entityData.define(ROCKET_CONE, NULL_ID); - this.entityData.define(ROCKET_BODY, NULL_ID); - this.entityData.define(ROCKET_FIN, NULL_ID); - this.entityData.define(ROCKET_BOOSTER, NULL_ID); - this.entityData.define(ROCKET_ENGINE, NULL_ID); - this.entityData.define(ROCKET_UPGRADE, NULL_ID); - - this.entityData.define(FUEL, 0L); + private void dropRocket() { + RocketData data = RocketData.create(this.color(), this.cone(), this.body(), this.fin(), this.booster(), this.engine(), this.upgrade()); + CompoundTag tag = new CompoundTag(); + data.toNbt(tag); + var rocket = new ItemStack(this.getDropItem()); + rocket.setTag(tag); + this.spawnAtLocation(rocket); } @Override @@ -439,11 +380,6 @@ public InteractionResult interact(Player player, InteractionHand hand) { return InteractionResult.FAIL; } - @Override - public boolean isPickable() { //Required to interact with the entity - return true; - } - @Override protected Vector3f getPassengerAttachmentPoint(Entity entity, EntityDimensions dimensions, float scale) { return new Vector3f(0F, 1.5F, 0F); @@ -454,13 +390,20 @@ public Vec3 getDismountLocationForPassenger(LivingEntity passenger) { return new Vec3(getX(), getY(), getZ() + 1f); } + @Override + protected boolean canAddPassenger(Entity passenger) { + return this.getPassengers().isEmpty(); + } + + // **************************************** TICK **************************************** + + // TODO: cleanup @Override public void tick() { this.noPhysics = false; setTimeAsState(getTimeAsState() + 1); super.tick(); - //tickLerp(); int particleChance; @@ -518,7 +461,7 @@ public void tick() { return; } try (Transaction t = Transaction.openOuter()) { - this.getTank().extract(FluidVariant.of(GCFluids.FUEL), FluidConstants.NUGGET, t); //todo find balanced values + this.getFuelTank().extract(FluidVariant.of(GCFluids.FUEL), FluidConstants.NUGGET, t); //todo find balanced values t.commit(); } if (getTimeAsState() >= getPreLaunchWait()) { @@ -546,11 +489,11 @@ && level().getBlockState(getLinkedPad()).getValue(RocketLaunchPadBlock.PART) != this.setSpeed(0.0f); } } else if (getLaunchStage() == LaunchStage.LAUNCHED) { - if (!debugMode && (isTankEmpty() || !this.getTank().getResource().getFluid().is(GCTags.FUEL)) && FabricLoader.getInstance().isDevelopmentEnvironment()) { + if (!debugMode && (isTankEmpty() || !this.getFuelTank().getResource().getFluid().is(GCTags.FUEL)) && FabricLoader.getInstance().isDevelopmentEnvironment()) { this.setLaunchStage(LaunchStage.FAILED); } else { try (Transaction t = Transaction.openOuter()) { - this.getTank().extract(FluidVariant.of(GCFluids.FUEL), FluidConstants.NUGGET, t); //todo find balanced values + this.getFuelTank().extract(FluidVariant.of(GCFluids.FUEL), FluidConstants.NUGGET, t); //todo find balanced values t.commit(); } // for (int i = 0; i < 4; i++) @@ -655,6 +598,49 @@ && level().getBlockState(getLinkedPad()).getValue(RocketLaunchPadBlock.PART) != } } + @Override + public void setDeltaMovement(double x, double y, double z) { + this.setDeltaMovement(new Vec3(x, y, z)); + } + + @Override + public void setDeltaMovement(Vec3 vec3d) { + super.setDeltaMovement(vec3d); + this.hasImpulse = true; + } + + @Override + public void move(MoverType type, Vec3 vec3d) { + if (onGround()) vec3d.multiply(1.0D, 0.0D, 1.0D); + super.move(type, vec3d); + this.getPassengers().forEach(this::positionRider); + } + + @Override + public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boolean down, boolean left, boolean right, boolean jumping, boolean shiftKeyDown) { + float turnFactor = 2.0F; + float angle = 45; + + LaunchStage stage = getLaunchStage(); + + if (jumping && stage.ordinal() < LaunchStage.IGNITED.ordinal()) + onJump(); + + if (stage.ordinal() >= LaunchStage.LAUNCHED.ordinal()) { + if (up) { + setXRot(Math.min(Math.max(getXRot() - 0.5F * turnFactor, -angle), angle)); + } else if (down) { + setXRot((getXRot() + 2.0F) % 360.0f); + } + + if (left) { + setYRot((getYRot() - 2.0F) % 360.0f); + } else if (right) { + setYRot((getYRot() + 2.0F) % 360.0f); + } + } + } + public Vec3 calculateVelocity() { double d = this.timeSinceLaunch / 150; double velX = -(50 * Math.cos(this.getYRot() / Mth.RAD_TO_DEG) * Math.sin(this.getXRot() * 0.01 / Constant.RADIANS_TO_DEGREES)) * (this.getSpeed() * 0.632D) * 1.58227848D; @@ -717,133 +703,69 @@ protected void spawnParticles() { } } - public float getSpeed() { - return this.getEntityData().get(SPEED); - } + // **************************************** COMPONENTS **************************************** - public void setSpeed(float speed) { - this.getEntityData().set(SPEED, speed); + @Override + public RocketCone getCone() { + return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_CONE).get(this.cone()); } public void setCone(ResourceLocation id) { this.getEntityData().set(ROCKET_CONE, id); } - public void setBody(ResourceLocation id) { - this.getEntityData().set(ROCKET_BODY, id); - } - - public void setFin(ResourceLocation id) { - this.getEntityData().set(ROCKET_FIN, id); - } - - public void setBooster(ResourceLocation id) { - this.getEntityData().set(ROCKET_BOOSTER, id); - } - - public void setEngine(ResourceLocation id) { - this.getEntityData().set(ROCKET_ENGINE, id); - } - - public void setUpgrade(ResourceLocation id) { - this.getEntityData().set(ROCKET_UPGRADE, id); - } - @Override - protected void readAdditionalSaveData(CompoundTag tag) { - this.setCone(tag.contains("Cone") ? new ResourceLocation(tag.getString("Cone")) : null); - this.setBody(tag.contains("Body") ? new ResourceLocation(tag.getString("Body")) : null); - this.setFin(tag.contains("Fin") ? new ResourceLocation(tag.getString("Fin")) : null); - this.setBooster(tag.contains("Booster") ? new ResourceLocation(tag.getString("Booster")) : null); - this.setEngine(tag.contains("Engine") ? new ResourceLocation(tag.getString("Engine")) : null); - this.setUpgrade(tag.contains("Upgrade") ? new ResourceLocation(tag.getString("Upgrade")) : null); - - if (tag.contains("Color")) { - this.setColor(tag.getInt("Color")); - } - - if (tag.contains("Stage")) { - this.setLaunchStage(LaunchStage.valueOf(tag.getString("Stage"))); - } - - if (tag.contains("Speed")) { - setSpeed(tag.getFloat("Speed")); + public @Nullable ResourceKey> cone() { + ResourceLocation location = this.getEntityData().get(ROCKET_CONE); + if (location == null || NULL_ID.equals(location)) { + return null; } - - this.linkedPad = new BlockPos(tag.getInt("lX"), tag.getInt("lY"), tag.getInt("lZ")); + return ResourceKey.create(RocketRegistries.ROCKET_CONE, location); } @Override - @ApiStatus.Internal - public void setLevel(Level level) { - super.setLevel(level); + public RocketBody getBody() { + return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_BODY).get(this.body()); } - public void setColor(int color) { - this.getEntityData().set(COLOR, color); + public void setBody(ResourceLocation id) { + this.getEntityData().set(ROCKET_BODY, id); } @Override - protected void addAdditionalSaveData(CompoundTag tag) { - if (this.cone() != null) tag.putString("Cone", Objects.requireNonNull(this.cone()).toString()); - if (this.body() != null) tag.putString("Body", Objects.requireNonNull(this.body()).toString()); - if (this.fin() != null) tag.putString("Fin", Objects.requireNonNull(this.fin()).toString()); - if (this.booster() != null) tag.putString("Booster", Objects.requireNonNull(this.booster()).toString()); - if (this.engine() != null) tag.putString("Engine", Objects.requireNonNull(this.engine()).toString()); - if (this.upgrade() != null) tag.putString("Upgrade", Objects.requireNonNull(this.upgrade()).toString()); - - tag.putString("Stage", getLaunchStage().name()); - tag.putDouble("Speed", this.getSpeed()); - tag.putInt("Color", this.color()); - - tag.putInt("lX", linkedPad.getX()); - tag.putInt("lY", linkedPad.getY()); - tag.putInt("lZ", linkedPad.getZ()); + public @Nullable ResourceKey> body() { + ResourceLocation location = this.getEntityData().get(ROCKET_BODY); + if (location == null || NULL_ID.equals(location)) { + return null; + } + return ResourceKey.create(RocketRegistries.ROCKET_BODY, location); } @Override - public @NotNull Packet getAddEntityPacket() { - return ServerPlayNetworking.createS2CPacket(new RocketSpawnPacket(getType(), getId(), this.uuid, getX(), getY(), getZ(), getXRot(), getYRot(), this)); - } - - public int getTimeBeforeLaunch() { - return timeBeforeLaunch; - } - - public int getPreLaunchWait() { - return 400; + public RocketFin getFin() { + return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_FIN).get(this.fin()); } - @Override - public int color() { - return this.getEntityData().get(COLOR); + public void setFin(ResourceLocation id) { + this.getEntityData().set(ROCKET_FIN, id); } @Override - public @Nullable ResourceKey> cone() { - ResourceLocation location = this.getEntityData().get(ROCKET_CONE); + public @Nullable ResourceKey> fin() { + ResourceLocation location = this.getEntityData().get(ROCKET_FIN); if (location == null || NULL_ID.equals(location)) { return null; } - return ResourceKey.create(RocketRegistries.ROCKET_CONE, location); + return ResourceKey.create(RocketRegistries.ROCKET_FIN, location); } @Override - public @Nullable ResourceKey> body() { - ResourceLocation location = this.getEntityData().get(ROCKET_BODY); - if (location == null || NULL_ID.equals(location)) { - return null; - } - return ResourceKey.create(RocketRegistries.ROCKET_BODY, location); + public RocketBooster getBooster() { + return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_BOOSTER).get(this.booster()); } - @Override - public @Nullable ResourceKey> fin() { - ResourceLocation location = this.getEntityData().get(ROCKET_FIN); - if (location == null || NULL_ID.equals(location)) { - return null; - } - return ResourceKey.create(RocketRegistries.ROCKET_FIN, location); + public void setBooster(ResourceLocation id) { + this.getEntityData().set(ROCKET_BOOSTER, id); } @Override @@ -855,6 +777,15 @@ public int color() { return ResourceKey.create(RocketRegistries.ROCKET_BOOSTER, location); } + @Override + public RocketEngine getEngine() { + return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_ENGINE).get(this.engine()); + } + + public void setEngine(ResourceLocation id) { + this.getEntityData().set(ROCKET_ENGINE, id); + } + @Override public @Nullable ResourceKey> engine() { ResourceLocation location = this.getEntityData().get(ROCKET_ENGINE); @@ -864,6 +795,15 @@ public int color() { return ResourceKey.create(RocketRegistries.ROCKET_ENGINE, location); } + @Override + public RocketUpgrade getUpgrade() { + return this.level().registryAccess().registryOrThrow(RocketRegistries.ROCKET_UPGRADE).get(this.upgrade()); + } + + public void setUpgrade(ResourceLocation id) { + this.getEntityData().set(ROCKET_UPGRADE, id); + } + @Override public @Nullable ResourceKey> upgrade() { ResourceLocation location = this.getEntityData().get(ROCKET_UPGRADE); @@ -873,44 +813,25 @@ public int color() { return ResourceKey.create(RocketRegistries.ROCKET_UPGRADE, location); } - public void setData(RocketData data) { - this.setColor(data.color()); + // **************************************** LINKED ENTITIES **************************************** - this.setCone(data.cone() != null ? data.cone().location() : null); - this.setBody(data.body() != null ? data.body().location() : null); - this.setFin(data.fin() != null ? data.fin().location() : null); - this.setBooster(data.booster() != null ? data.booster().location() : null); - this.setEngine(data.engine() != null ? data.engine().location() : null); - this.setUpgrade(data.upgrade() != null ? data.upgrade().location() : null); + @Override + public @NotNull BlockPos getLinkedPad() { + return linkedPad; } @Override - public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boolean down, boolean left, boolean right, boolean jumping, boolean shiftKeyDown) { - float turnFactor = 2.0F; - float angle = 45; + public void setLinkedPad(@NotNull BlockPos blockPos) { + this.linkedPad = blockPos; + } - LaunchStage stage = getLaunchStage(); + // **************************************** MISC **************************************** - if (jumping && stage.ordinal() < LaunchStage.IGNITED.ordinal()) - onJump(); - - if (stage.ordinal() >= LaunchStage.LAUNCHED.ordinal()) { - if (up) { - setXRot(Math.min(Math.max(getXRot() - 0.5F * turnFactor, -angle), angle)); - } else if (down) { - setXRot((getXRot() + 2.0F) % 360.0f); - } - - if (left) { - setYRot((getYRot() - 2.0F) % 360.0f); - } else if (right) { - setYRot((getYRot() + 2.0F) % 360.0f); - } - } - } + public void setCreative(boolean creative) {} + // why does this exist? @Override - public boolean shouldIgnoreShiftExit() { - return getLaunchStage().ordinal() >= LaunchStage.LAUNCHED.ordinal(); + public Entity asEntity() { + return this; } } From 5a046b1ee003590c8ac27d09d27efdddc9006b33 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 3 Jun 2024 22:23:25 -0700 Subject: [PATCH 17/39] refactor: added inventory-related methods to GCVehicleEntity --- .../GCPlayerRideableVehicleEntity.java | 3 - .../entity/vehicle/GCVehicleEntity.java | 55 +++++++++++++++++++ .../content/entity/vehicle/RocketEntity.java | 12 +++- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java index d83cfef1fb..0cc82d8a8a 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java @@ -10,14 +10,11 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import org.joml.Vector3f; /** * Should contain code common to vehicles that the player can ride diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index 16f32e6116..a605acd0a3 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -27,14 +27,17 @@ import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -49,6 +52,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; /** * More customizable version of {@link net.minecraft.world.entity.vehicle.VehicleEntity} @@ -271,4 +275,55 @@ private void tickLerp() { // Stolen from the boat class to fix the rocket from b setRot(getYRot(), getXRot()); } } + + // **************************************** INVENTORY **************************************** + + @Override + public int getContainerSize() { + return this.inventory.size(); + } + + @Override + public boolean isEmpty() { + return this.inventory.isEmpty(); + } + + @Override + public @NotNull ItemStack getItem(int slot) { + return this.inventory.get(slot); + } + + @Override + public @NotNull ItemStack removeItem(int slot, int amount) { + return ContainerHelper.removeItem(this.inventory, slot, amount); + } + + @Override + public @NotNull ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(this.inventory, slot); + } + + @Override + public void clearContent() { + this.inventory.clear(); + } + + @Override + public void setItem(int slot, ItemStack stack) { + this.inventory.set(slot, stack); + } + + @Override + public void setChanged() {} + + @Override + public void openCustomInventoryScreen(Player player) { + player.openMenu(this); + } + + @Override + public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { + buf.writeBoolean(false); + buf.writeVarInt(this.inventory.size()); + } } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 568c45b9cc..d6913b9fd9 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -72,7 +72,9 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -397,7 +399,7 @@ protected boolean canAddPassenger(Entity passenger) { // **************************************** TICK **************************************** - // TODO: cleanup + // TODO: cleanup (the function is 200 lines long) @Override public void tick() { this.noPhysics = false; @@ -834,4 +836,12 @@ public void setCreative(boolean creative) {} public Entity asEntity() { return this; } + + // **************************************** INVENTORY **************************************** + + @Nullable + @Override + public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { + return null; + } } From 124031e0e3022057f4026a12222b8e2eebfc458a Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 3 Jun 2024 22:24:23 -0700 Subject: [PATCH 18/39] implemented IDE suggestions --- .../mod/content/entity/vehicle/GCVehicleEntity.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index a605acd0a3..871e4d3f52 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -59,7 +59,6 @@ * Note: actually, it turns out that VehicleEntity contains a package-protected (i.e. no modifier) abstract method * getDropItem() that a galacticraft vehicle would not be able to implement. That being said, I'm still copying all the * methods from VehicleEntity - * * Should contain code common to all GC vehicles (e.g. rockets, cargo rockets, buggies, landers, and astrominers) */ public abstract class GCVehicleEntity extends Entity implements Container, ScalableFuelLevel, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { @@ -100,7 +99,7 @@ public boolean isInvulnerableTo(DamageSource source) { protected void defineSynchedData() { this.entityData.define(DATA_ID_HURT, 0); this.entityData.define(DATA_ID_HURTDIR, 1); - this.entityData.define(DATA_ID_DAMAGE, Float.valueOf(0.0f)); + this.entityData.define(DATA_ID_DAMAGE, 0.0f); } public int getHurtTime() { @@ -120,11 +119,11 @@ public void setHurtDir(int damageWobbleSide) { } public float getDamage() { - return this.entityData.get(DATA_ID_DAMAGE).floatValue(); + return this.entityData.get(DATA_ID_DAMAGE); } public void setDamage(float damageWobbleStrength) { - this.entityData.set(DATA_ID_DAMAGE, Float.valueOf(damageWobbleStrength)); + this.entityData.set(DATA_ID_DAMAGE, damageWobbleStrength); } public abstract Item getDropItem(); From 4c1140d224a2d21d243a9ea659f054d0b80751af Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Mon, 3 Jun 2024 22:24:56 -0700 Subject: [PATCH 19/39] refactor: AbstractLanderEntity extends GCPlayerRideableVehicleEntity --- .../mod/content/entity/vehicle/AbstractLanderEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index f6014d8b29..1f8d574ae1 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -27,7 +27,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -public abstract class AbstractLanderEntity extends GCVehicleEntity { +public abstract class AbstractLanderEntity extends GCPlayerRideableVehicleEntity { public AbstractLanderEntity(EntityType entityType, Level level) { super(entityType, level); } From d5648a8acfb72dd12b74fcabb57e1807c8da7ddd Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:17:16 -0700 Subject: [PATCH 20/39] refactor: added inventory interfaces to rocket interface --- src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java b/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java index 465b3b57fd..43a304ec4d 100644 --- a/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java +++ b/src/main/java/dev/galacticraft/api/rocket/entity/Rocket.java @@ -25,13 +25,15 @@ import dev.galacticraft.api.rocket.LaunchStage; import dev.galacticraft.api.rocket.RocketData; import dev.galacticraft.api.rocket.part.*; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.HasCustomInventoryScreen; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public interface Rocket extends RocketData, RequiresFuel { +public interface Rocket extends RocketData, RequiresFuel, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { /** * Returns the launch stage of this rocket. * @return the launch stage of this rocket. From bd558f083a469eb0c5cccbc882247c7a928e97ca Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:20:58 -0700 Subject: [PATCH 21/39] refactor: changed rideable vehicle class to PlayerRideable interface a better organization of vehicles is based on which require fuel and which don't. Both types could be rideable, and if we were to use PlayerRideable as the parent class, then we would either have to reuse a lot of fuel-related code or make assumptions about other parent classes --- .../api/rocket/entity/PlayerRideable.java | 21 ++++++ .../GCPlayerRideableVehicleEntity.java | 71 ------------------- 2 files changed, 21 insertions(+), 71 deletions(-) create mode 100644 src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java delete mode 100644 src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java b/src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java new file mode 100644 index 0000000000..8629c3026d --- /dev/null +++ b/src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java @@ -0,0 +1,21 @@ +package dev.galacticraft.api.rocket.entity; + +import dev.galacticraft.api.entity.IgnoreShift; +import dev.galacticraft.mod.content.entity.ControllableEntity; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +public interface PlayerRideable extends IgnoreShift, ControllableEntity { + + default boolean isPickable() { //Required to interact with the entity + return true; + } + + InteractionResult interact(Player player, InteractionHand hand); + + Vec3 getDismountLocationForPassenger(LivingEntity passenger); + +} diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java deleted file mode 100644 index 0cc82d8a8a..0000000000 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCPlayerRideableVehicleEntity.java +++ /dev/null @@ -1,71 +0,0 @@ -package dev.galacticraft.mod.content.entity.vehicle; - -import dev.galacticraft.api.entity.IgnoreShift; -import dev.galacticraft.api.rocket.entity.RequiresFuel; -import dev.galacticraft.mod.content.entity.ControllableEntity; -import dev.galacticraft.mod.util.FluidUtil; -import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.EntityDataSerializers; -import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; - -/** - * Should contain code common to vehicles that the player can ride - */ -public abstract class GCPlayerRideableVehicleEntity extends GCVehicleEntity implements IgnoreShift, ControllableEntity, RequiresFuel { - - // **************************************** FIELDS **************************************** - - protected static final EntityDataAccessor FUEL = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.LONG); - - protected final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets(this.getFuelTankCapacity()), () -> { - this.entityData.set(FUEL, this.getFuelTank().getAmount()); - }); - - // **************************************** CONSTRUCTOR **************************************** - - public GCPlayerRideableVehicleEntity(EntityType entityType, Level level) { - super(entityType, level); - } - - // **************************************** DATA **************************************** - - @Override - public boolean isPickable() { //Required to interact with the entity - return true; - } - - // **************************************** FUEL **************************************** - - public SingleFluidStorage getFuelTank() { - return this.tank; - } - - public int getFuelTankAmount() { - return this.entityData.get(FUEL).intValue(); - } - - @Override - public int getScaledFuelLevel(int scale) { - if (this.getFuelTankCapacity() <= 0) { - return 0; - } - return (int) (this.entityData.get(FUEL) * scale / this.getFuelTankCapacity()); - } - - // **************************************** INTERACTION **************************************** - - @Override - public abstract InteractionResult interact(Player player, InteractionHand hand); - - @Override - public abstract Vec3 getDismountLocationForPassenger(LivingEntity passenger); - -} From 81c23738a0804489b716c29852a9713720ed4b3d Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:21:56 -0700 Subject: [PATCH 22/39] refactor: removed assumption that all GCVehicleEntities will have viewable inventories I still assume that they will be containers, which I think is fair given that all GC vehicles I can think of store items in some way --- .../entity/vehicle/GCVehicleEntity.java | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index 871e4d3f52..4968282bb4 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -22,17 +22,13 @@ package dev.galacticraft.mod.content.entity.vehicle; -import dev.galacticraft.mod.content.entity.ScalableFuelLevel; -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.DamageTypeTags; import net.minecraft.util.Mth; @@ -41,7 +37,6 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; @@ -61,7 +56,7 @@ * methods from VehicleEntity * Should contain code common to all GC vehicles (e.g. rockets, cargo rockets, buggies, landers, and astrominers) */ -public abstract class GCVehicleEntity extends Entity implements Container, ScalableFuelLevel, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { +public abstract class GCVehicleEntity extends Entity implements Container { // **************************************** FIELDS **************************************** @@ -80,7 +75,7 @@ public abstract class GCVehicleEntity extends Entity implements Container, Scala private double lerpXRot; protected NonNullList inventory; - protected InventoryStorage storage; + //protected InventoryStorage storage; // **************************************** CONSTRUCTOR **************************************** @@ -141,11 +136,6 @@ boolean shouldSourceDestroy(DamageSource source) { return false; } - @Override - public boolean stillValid(Player player) { - return this.position().closerThan(player.position(), 8.0); - } - public float getSpeed() { return this.getEntityData().get(SPEED); } @@ -275,7 +265,7 @@ private void tickLerp() { // Stolen from the boat class to fix the rocket from b } } - // **************************************** INVENTORY **************************************** + // **************************************** CONTAINER **************************************** @Override public int getContainerSize() { @@ -292,6 +282,11 @@ public boolean isEmpty() { return this.inventory.get(slot); } + @Override + public void setItem(int slot, ItemStack stack) { + this.inventory.set(slot, stack); + } + @Override public @NotNull ItemStack removeItem(int slot, int amount) { return ContainerHelper.removeItem(this.inventory, slot, amount); @@ -307,22 +302,12 @@ public void clearContent() { this.inventory.clear(); } - @Override - public void setItem(int slot, ItemStack stack) { - this.inventory.set(slot, stack); - } - @Override public void setChanged() {} @Override - public void openCustomInventoryScreen(Player player) { - player.openMenu(this); + public boolean stillValid(Player player) { + return this.position().closerThan(player.position(), 8.0); } - @Override - public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { - buf.writeBoolean(false); - buf.writeVarInt(this.inventory.size()); - } } From 5f39eb9c55d46f1b1fa8773850a062ffc99e8dc8 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:22:49 -0700 Subject: [PATCH 23/39] refactor: RequiresFuel now extends ScalableFuelLevel --- .../dev/galacticraft/api/rocket/entity/RequiresFuel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java b/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java index e8ee0cbefb..112e075a3e 100644 --- a/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java +++ b/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java @@ -1,12 +1,12 @@ package dev.galacticraft.api.rocket.entity; +import dev.galacticraft.mod.content.entity.ScalableFuelLevel; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; -import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.Nullable; -public interface RequiresFuel { +public interface RequiresFuel extends ScalableFuelLevel { @Nullable Fluid getFuelTankFluid(); @@ -15,6 +15,8 @@ public interface RequiresFuel { int getFuelTankCapacity(); + boolean isTankEmpty(); + Storage getFuelTank(); } From 48536656ab0919be005e32fa5eefe9ad5591e624 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:23:18 -0700 Subject: [PATCH 24/39] refactor: created GCFueledVehicleEntity class --- .../entity/vehicle/GCFueledVehicleEntity.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java new file mode 100644 index 0000000000..e1d18ec259 --- /dev/null +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java @@ -0,0 +1,59 @@ +package dev.galacticraft.mod.content.entity.vehicle; + +import dev.galacticraft.api.rocket.entity.RequiresFuel; +import dev.galacticraft.mod.util.FluidUtil; +import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.material.Fluid; +import org.jetbrains.annotations.Nullable; + +public abstract class GCFueledVehicleEntity extends GCVehicleEntity implements RequiresFuel { + + // **************************************** FIELDS **************************************** + + protected static final EntityDataAccessor FUEL = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.LONG); + + protected final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets(this.getFuelTankCapacity()), () -> { + this.entityData.set(FUEL, this.getFuelTank().getAmount()); + }); + + // **************************************** CONSTRUCTOR **************************************** + + public GCFueledVehicleEntity(EntityType entityType, Level level) { + super(entityType, level); + } + + // **************************************** FUEL **************************************** + + @Override + public SingleFluidStorage getFuelTank() { + return this.tank; + } + + @Override + public int getFuelTankAmount() { + return this.entityData.get(FUEL).intValue(); + } + + public boolean isTankEmpty() { + return this.getFuelTank().getAmount() <= 0 || this.getFuelTank().getResource().isBlank(); + } + + @Override + public @Nullable Fluid getFuelTankFluid() { + return this.tank.isResourceBlank() ? null : this.tank.variant.getFluid(); + } + + @Override + public int getScaledFuelLevel(int scale) { + if (this.getFuelTankCapacity() <= 0) { + return 0; + } + return (int) (this.entityData.get(FUEL) * scale / this.getFuelTankCapacity()); + } + +} From c631d531ef0b9913ea0a2144574308bac18893f4 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:24:02 -0700 Subject: [PATCH 25/39] refactor: lander reorganized based on new super classes --- .../entity/vehicle/AbstractLanderEntity.java | 109 ++++++- .../content/entity/vehicle/LanderEntity.java | 265 +++++------------- 2 files changed, 175 insertions(+), 199 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index 1f8d574ae1..9b73a71313 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -22,21 +22,124 @@ package dev.galacticraft.mod.content.entity.vehicle; +import dev.galacticraft.api.entity.IgnoreShift; +import dev.galacticraft.api.rocket.entity.PlayerRideable; +import dev.galacticraft.mod.screen.ParachestMenu; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractLanderEntity extends GCFueledVehicleEntity implements IgnoreShift, PlayerRideable, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { + + // **************************************** FIELDS **************************************** + + // **************************************** CONSTRUCTOR **************************************** -public abstract class AbstractLanderEntity extends GCPlayerRideableVehicleEntity { public AbstractLanderEntity(EntityType entityType, Level level) { super(entityType, level); } + // **************************************** DATA **************************************** + + public Item getDropItem() { + return ItemStack.EMPTY.getItem(); + } + public abstract boolean shouldMove(); public abstract boolean shouldSpawnParticles(); - public Item getDropItem() { - return ItemStack.EMPTY.getItem(); + @Override + public boolean shouldIgnoreShiftExit() { + return !onGround(); + } + + // **************************************** FUEL **************************************** + + @Override + public int getFuelTankCapacity() { + return 100; + } + + // **************************************** INTERACTION **************************************** + + @Override + public float getDamageMultiplier() { + return 5; + } + + @Override + public float getMaxDamage() { + return 100; } + + @Override + public InteractionResult interact(Player player, InteractionHand hand) { + if (this.level().isClientSide) { + if (!this.onGround()) { + return InteractionResult.FAIL; + } + + if (!this.getPassengers().isEmpty()) { + this.ejectPassengers(); + } + + return InteractionResult.SUCCESS; + } + + if (this.getPassengers().isEmpty()) { + openCustomInventoryScreen(player); + return InteractionResult.SUCCESS; + } else if (player instanceof ServerPlayer) { + if (!this.onGround()) { + return InteractionResult.FAIL; + } + + this.ejectPassengers(); + return InteractionResult.SUCCESS; + } else { + return InteractionResult.SUCCESS; + } + } + + // **************************************** TICK **************************************** + + @Override + public void move(MoverType movementType, Vec3 movement) { + if (shouldMove()) + super.move(movementType, movement); + } + + // **************************************** INVENTORY **************************************** + + @Nullable + @Override + public AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { + return new ParachestMenu(containerId, inventory, this); + } + + @Override + public void openCustomInventoryScreen(Player player) { + player.openMenu(this); + } + + @Override + public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { + buf.writeBoolean(false); + buf.writeVarInt(this.inventory.size()); + } + } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java index d55c91c988..df679b9260 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/LanderEntity.java @@ -23,62 +23,49 @@ package dev.galacticraft.mod.content.entity.vehicle; import com.mojang.datafixers.util.Pair; -import dev.galacticraft.api.entity.IgnoreShift; import dev.galacticraft.api.universe.celestialbody.CelestialBody; import dev.galacticraft.mod.Constant; import dev.galacticraft.mod.attachments.GCServerPlayer; import dev.galacticraft.mod.network.packets.ResetThirdPersonPacket; import dev.galacticraft.mod.content.GCEntityTypes; import dev.galacticraft.mod.content.GCFluids; -import dev.galacticraft.mod.content.entity.ControllableEntity; -import dev.galacticraft.mod.content.entity.ScalableFuelLevel; import dev.galacticraft.mod.particle.GCParticleTypes; -import dev.galacticraft.mod.screen.ParachestMenu; -import dev.galacticraft.mod.util.FluidUtil; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; -import net.fabricmc.fabric.api.transfer.v1.fluid.base.SingleFluidStorage; import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; -import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; import java.util.List; -public class LanderEntity extends AbstractLanderEntity implements Container, ScalableFuelLevel, ControllableEntity, HasCustomInventoryScreen, IgnoreShift, ExtendedScreenHandlerFactory { +public class LanderEntity extends AbstractLanderEntity { + + // **************************************** FIELDS **************************************** + public static final float NO_PARTICLES = 0.0000001F; - protected NonNullList inventory; - protected InventoryStorage storage; - private final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets(100), () -> { - }); private final float turnFactor = 2.0F; private final float angle = 45; protected long ticks = 0; private double lastDeltaY; protected boolean lastOnGround; + // **************************************** CONSTRUCTOR **************************************** + public LanderEntity(EntityType entityType, Level level) { super(entityType, level); } @@ -88,7 +75,7 @@ public LanderEntity(ServerPlayer player) { GCServerPlayer gcPlayer = GCServerPlayer.get(player); this.inventory = NonNullList.withSize(gcPlayer.getRocketStacks().size() + 1, ItemStack.EMPTY); - this.storage = InventoryStorage.of(this, null); + //this.storage = InventoryStorage.of(this, null); this.tank.variant = FluidVariant.of(GCFluids.FUEL); this.tank.amount = gcPlayer.getFuel(); @@ -100,14 +87,54 @@ public LanderEntity(ServerPlayer player) { } } - moveTo(player.getX(), player.getY(), player.getZ(), 0, 0); + this.moveTo(player.getX(), player.getY(), player.getZ(), 0, 0); + } + + // **************************************** DATA **************************************** + + @Override + public boolean shouldSpawnParticles() { + return this.ticks > 40 && getXRot() != NO_PARTICLES; + } + + @Override + protected Vector3f getPassengerAttachmentPoint(Entity passenger, EntityDimensions dimensions, float scaleFactor) { + return new Vector3f(0, 1.5F, 0); + } + + @Override + public Vec3 getDismountLocationForPassenger(LivingEntity passenger) { + return new Vec3(getX(), getY(), getZ()); + } + + + public Vec3 getLanderDeltaMovement() { + if (this.onGround()) { + return Vec3.ZERO; + } + + if (this.ticks >= 40 && this.ticks < 45) { + this.setDeltaMovement(0, -2.5D, 0); + } + + Vec3 delta = getDeltaMovement(); + return new Vec3(delta.x(), this.ticks < 40 ? 0 : delta.y(), delta.z()); + } + + @Override + public boolean shouldMove() { + if (this.ticks < 40) { + return false; + } + + return !this.onGround(); } @Override protected void readAdditionalSaveData(CompoundTag tag) { - tank.readNbt(tag); + this.tank.readNbt(tag); this.inventory = NonNullList.withSize(tag.getInt("size"), ItemStack.EMPTY); - this.storage = InventoryStorage.of(this, null); + //this.storage = InventoryStorage.of(this, null); ContainerHelper.loadAllItems(tag, this.inventory); this.lastDeltaY = this.getDeltaMovement().y; @@ -115,7 +142,7 @@ protected void readAdditionalSaveData(CompoundTag tag) { @Override protected void addAdditionalSaveData(CompoundTag tag) { - tank.writeNbt(tag); + this.tank.writeNbt(tag); tag.putInt("size", this.inventory.size()); ContainerHelper.saveAllItems(tag, this.inventory); @@ -131,22 +158,28 @@ public Pair getParticlePosition() { return new Pair<>(new Vec3(this.getX(), this.getY() + 1D + motionY / 2, this.getZ()), new Vec3(x1, y1 + motionY / 2, z1)); } + // **************************************** FUEL **************************************** + + // **************************************** INTERACTION **************************************** + + // **************************************** TICK **************************************** + @Override public void tick() { super.tick(); this.ticks++; if (onGround()) { - tickOnGround(); + this.tickOnGround(); } else { - tickInAir(); + this.tickInAir(); } - Level level = level(); + Level level = this.level(); - setDeltaMovement(getLanderDeltaMovement()); + this.setDeltaMovement(getLanderDeltaMovement()); - if (shouldSpawnParticles()) { + if (this.shouldSpawnParticles()) { if (level.isClientSide) { var particlePos = getParticlePosition(); final Vec3 posVec = particlePos.getFirst(); @@ -155,10 +188,10 @@ public void tick() { } } - move(MoverType.SELF, getDeltaMovement()); + this.move(MoverType.SELF, this.getDeltaMovement()); - if (onGround() && !this.lastOnGround) { - onGroundHit(); + if (this.onGround() && !this.lastOnGround) { + this.onGroundHit(); } if (this.ticks < 40 && this.getY() > 150) { @@ -182,7 +215,7 @@ public void tick() { } } - pushEntities(); + this.pushEntities(); this.xo = getX(); this.yo = getY(); @@ -199,7 +232,7 @@ protected void pushEntities() { if (!entities.isEmpty()) { for (Entity entity : entities) { if (!this.getPassengers().contains(entity)) { - push(entity); + this.push(entity); } } } @@ -243,7 +276,7 @@ public void onGroundHit() { } this.level().explode(this, this.getX(), this.getY(), this.getZ(), 12, true, Level.ExplosionInteraction.MOB); - discard(); + this.discard(); } } } @@ -264,162 +297,6 @@ public void tickInAir() { setDeltaMovement(new Vec3(motX / 2.0F, getDeltaMovement().y(), motZ / 2.0F)); } - public Vec3 getLanderDeltaMovement() { - if (this.onGround()) { - return Vec3.ZERO; - } - - if (this.ticks >= 40 && this.ticks < 45) { - setDeltaMovement(0, -2.5D, 0); - } - - Vec3 delta = getDeltaMovement(); - return new Vec3(delta.x(), this.ticks < 40 ? 0 : delta.y(), delta.z()); - } - - @Override - public boolean isPickable() { - return true; - } - - @Override - public InteractionResult interact(Player player, InteractionHand hand) { - if (this.level().isClientSide) { - if (!this.onGround()) { - return InteractionResult.FAIL; - } - - if (!this.getPassengers().isEmpty()) { - this.ejectPassengers(); - } - - return InteractionResult.SUCCESS; - } - - if (this.getPassengers().isEmpty()) { - openCustomInventoryScreen(player); - return InteractionResult.SUCCESS; - } else if (player instanceof ServerPlayer) { - if (!this.onGround()) { - return InteractionResult.FAIL; - } - - this.ejectPassengers(); - return InteractionResult.SUCCESS; - } else { - return InteractionResult.SUCCESS; - } - } - - @Override - public int getScaledFuelLevel(int scale) { - final double fuelLevel = this.tank.getResource().isBlank() ? 0 : this.tank.getAmount(); - - return (int) (fuelLevel * scale / tank.getCapacity()); - } - - @Override - public void openCustomInventoryScreen(Player player) { - player.openMenu(this); - } - - @Override - public int getContainerSize() { - return this.inventory.size(); - } - - @Override - public boolean isEmpty() { - return this.inventory.isEmpty(); - } - - @Override - public ItemStack getItem(int slot) { - return this.inventory.get(slot); - } - - @Override - public ItemStack removeItem(int slot, int amount) { - return ContainerHelper.removeItem(this.inventory, slot, amount); - } - - @Override - public ItemStack removeItemNoUpdate(int slot) { - return ContainerHelper.takeItem(this.inventory, slot); - } - - @Override - public void setItem(int slot, ItemStack stack) { - this.inventory.set(slot, stack); - } - - @Override - public void setChanged() { - - } - - @Override - public boolean stillValid(Player player) { - return this.position().closerThan(player.position(), 8.0); - } - - @Override - public void clearContent() { - this.inventory.clear(); - } - - @Override - public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { - buf.writeBoolean(false); - buf.writeVarInt(this.inventory.size()); - } - - @Nullable - @Override - public AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { - return new ParachestMenu(containerId, inventory, this); - } - - @Override - public float getDamageMultiplier() { - return 5; - } - - @Override - public float getMaxDamage() { - return 100; - } - - @Override - public void move(MoverType movementType, Vec3 movement) { - if (shouldMove()) - super.move(movementType, movement); - } - - @Override - public boolean shouldMove() { - if (this.ticks < 40) { - return false; - } - - return !this.onGround(); - } - - @Override - public boolean shouldSpawnParticles() { - return this.ticks > 40 && getXRot() != NO_PARTICLES; - } - - @Override - protected Vector3f getPassengerAttachmentPoint(Entity passenger, EntityDimensions dimensions, float scaleFactor) { - return new Vector3f(0, 1.5F, 0); - } - - @Override - public Vec3 getDismountLocationForPassenger(LivingEntity passenger) { - return new Vec3(getX(), getY(), getZ()); - } - @Override public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boolean down, boolean left, boolean right, boolean jumping, boolean shiftKeyDown) { if (!onGround()) { @@ -433,7 +310,7 @@ public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boole setYRot(getYRot() + 0.5F * turnFactor); if (jumping) { - var deltaM = getDeltaMovement();; + var deltaM = getDeltaMovement(); setDeltaMovement(deltaM.x(), Math.min(deltaM.y() + 0.03F, getY() < level().getHeight(Heightmap.Types.WORLD_SURFACE, getBlockX(), getBlockZ()) + 35 ? -0.15 : -1.0), deltaM.z()); } @@ -444,8 +321,4 @@ public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boole } } - @Override - public boolean shouldIgnoreShiftExit() { - return !onGround(); - } } From f0cdcdd02acd6a6089a392bdb293a10276355750 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:24:17 -0700 Subject: [PATCH 26/39] refactor: buggy reorganized based on new superclasses --- .../mod/content/entity/vehicle/Buggy.java | 71 +++++++++++++++---- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java index 553c4feeb1..cdbfa57c2b 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java @@ -22,22 +22,32 @@ package dev.galacticraft.mod.content.entity.vehicle; -import dev.galacticraft.mod.content.entity.ControllableEntity; +import dev.galacticraft.api.entity.IgnoreShift; +import dev.galacticraft.api.rocket.entity.PlayerRideable; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.ContainerListener; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.HasCustomInventoryScreen; import net.minecraft.world.entity.VariantHolder; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +public class Buggy extends GCFueledVehicleEntity implements IgnoreShift, PlayerRideable, HasCustomInventoryScreen, ExtendedScreenHandlerFactory, ContainerListener, VariantHolder { + + // **************************************** FIELDS **************************************** -public class Buggy extends GCVehicleEntity implements ContainerListener, ControllableEntity, VariantHolder { public double speed; public float wheelRotationZ; public float wheelRotationX; @@ -47,10 +57,28 @@ public class Buggy extends GCVehicleEntity implements ContainerListener, Control private NonNullList stacks = NonNullList.withSize(60, ItemStack.EMPTY); + // **************************************** CONSTRUCTOR **************************************** + public Buggy(EntityType entityType, Level level) { super(entityType, level); } + // **************************************** DATA **************************************** + + @Override + public BuggyType getVariant() { + return null; + } + + @Override + public void setVariant(BuggyType variant) { + + } + + public Item getDropItem() { + return ItemStack.EMPTY.getItem(); + } + @Override protected void readAdditionalSaveData(CompoundTag nbt) { @@ -62,16 +90,18 @@ protected void addAdditionalSaveData(CompoundTag nbt) { } @Override - public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boolean down, boolean left, boolean right, boolean jumping, boolean shiftKeyDown) { - + public boolean shouldIgnoreShiftExit() { + return false; } + // **************************************** FUEL **************************************** + @Override - public boolean hurt(DamageSource source, float amount) { - amount++; - return true; + public int getFuelTankCapacity() { + return 100; } + // **************************************** INTERACTION **************************************** @Override public boolean canBeCollidedWith() { @@ -87,31 +117,44 @@ public InteractionResult interact(Player player, InteractionHand hand) { } } + // **************************************** TICK **************************************** + @Override public void tick() { super.tick(); } + @Override + public void inputTick(float leftImpulse, float forwardImpulse, boolean up, boolean down, boolean left, boolean right, boolean jumping, boolean shiftKeyDown) { + + } + + // **************************************** INVENTORY **************************************** + @Override public void containerChanged(Container sender) { } + @Nullable + public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { + return null; + } + @Override - public void setVariant(BuggyType variant) { + public void openCustomInventoryScreen(Player player) { } @Override - public BuggyType getVariant() { - return null; + public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { + } + // **************************************** MISC **************************************** + public enum BuggyType { } - public Item getDropItem() { - return ItemStack.EMPTY.getItem(); - } } From cafbb8bca02ec41975a93d70c589d8abf5dc299a Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:24:28 -0700 Subject: [PATCH 27/39] refactor: rocket reorganized based on new superclasses --- .../content/entity/vehicle/RocketEntity.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index d6913b9fd9..4ad2e8abb0 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -22,10 +22,12 @@ package dev.galacticraft.mod.content.entity.vehicle; +import dev.galacticraft.api.entity.IgnoreShift; import dev.galacticraft.api.registry.AddonRegistries; import dev.galacticraft.api.registry.RocketRegistries; import dev.galacticraft.api.rocket.LaunchStage; import dev.galacticraft.api.rocket.RocketData; +import dev.galacticraft.api.rocket.entity.PlayerRideable; import dev.galacticraft.api.rocket.entity.Rocket; import dev.galacticraft.api.rocket.part.*; import dev.galacticraft.api.universe.celestialbody.CelestialBody; @@ -89,7 +91,7 @@ import java.util.Objects; @SuppressWarnings("UnstableApiUsage") -public class RocketEntity extends GCPlayerRideableVehicleEntity implements Rocket { +public class RocketEntity extends GCFueledVehicleEntity implements Rocket, IgnoreShift, PlayerRideable { // **************************************** FIELDS **************************************** @@ -276,15 +278,6 @@ public void setFuel(long fuel) { } } - public boolean isTankEmpty() { - return this.getFuelTank().getAmount() <= 0 || this.getFuelTank().getResource().isBlank(); - } - - @Override - public @Nullable Fluid getFuelTankFluid() { - return this.tank.isResourceBlank() ? null : this.tank.variant.getFluid(); - } - @Override public int getFuelTankCapacity() { return 100; @@ -292,6 +285,11 @@ public int getFuelTankCapacity() { // **************************************** INTERACTION **************************************** +// @Override +// public boolean isPickable(){ +// return true; +// } + @Override public boolean hurt(DamageSource source, float amount) { if (!this.level().isClientSide && !this.isRemoved()) { @@ -844,4 +842,15 @@ public Entity asEntity() { public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { return null; } + + @Override + public void openCustomInventoryScreen(Player player) { + player.openMenu(this); + } + + @Override + public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { + buf.writeBoolean(false); + buf.writeVarInt(this.inventory.size()); + } } From beee0b9c5ff1f75329efc57698dc271eb06d3e20 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Tue, 4 Jun 2024 19:29:18 -0700 Subject: [PATCH 28/39] fix: fixed compiler error where fuel data needed to be a long --- .../dev/galacticraft/api/rocket/entity/RequiresFuel.java | 4 ++-- .../mod/content/entity/vehicle/AbstractLanderEntity.java | 4 ++-- .../dev/galacticraft/mod/content/entity/vehicle/Buggy.java | 4 ++-- .../mod/content/entity/vehicle/GCFueledVehicleEntity.java | 6 +++--- .../mod/content/entity/vehicle/RocketEntity.java | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java b/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java index 112e075a3e..f50e6c0487 100644 --- a/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java +++ b/src/main/java/dev/galacticraft/api/rocket/entity/RequiresFuel.java @@ -11,9 +11,9 @@ public interface RequiresFuel extends ScalableFuelLevel { @Nullable Fluid getFuelTankFluid(); - int getFuelTankAmount(); + long getFuelTankAmount(); - int getFuelTankCapacity(); + long getFuelTankCapacity(); boolean isTankEmpty(); diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index 9b73a71313..4c1a100eb9 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -70,8 +70,8 @@ public boolean shouldIgnoreShiftExit() { // **************************************** FUEL **************************************** @Override - public int getFuelTankCapacity() { - return 100; + public long getFuelTankCapacity() { + return 100L; } // **************************************** INTERACTION **************************************** diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java index cdbfa57c2b..a978ee2c98 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java @@ -97,8 +97,8 @@ public boolean shouldIgnoreShiftExit() { // **************************************** FUEL **************************************** @Override - public int getFuelTankCapacity() { - return 100; + public long getFuelTankCapacity() { + return 100L; } // **************************************** INTERACTION **************************************** diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java index e1d18ec259..763981c58d 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCFueledVehicleEntity.java @@ -17,7 +17,7 @@ public abstract class GCFueledVehicleEntity extends GCVehicleEntity implements R protected static final EntityDataAccessor FUEL = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.LONG); - protected final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets(this.getFuelTankCapacity()), () -> { + protected final SingleFluidStorage tank = SingleFluidStorage.withFixedCapacity(FluidUtil.bucketsToDroplets((int) this.getFuelTankCapacity()), () -> { this.entityData.set(FUEL, this.getFuelTank().getAmount()); }); @@ -35,8 +35,8 @@ public SingleFluidStorage getFuelTank() { } @Override - public int getFuelTankAmount() { - return this.entityData.get(FUEL).intValue(); + public long getFuelTankAmount() { + return this.entityData.get(FUEL); } public boolean isTankEmpty() { diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 4ad2e8abb0..16bed15c79 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -279,8 +279,8 @@ public void setFuel(long fuel) { } @Override - public int getFuelTankCapacity() { - return 100; + public long getFuelTankCapacity() { + return 100L; } // **************************************** INTERACTION **************************************** From e3438ac6acf140bf9e28da62d5e24ade61a84699 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Wed, 5 Jun 2024 19:52:20 -0700 Subject: [PATCH 29/39] refactor: removed PlayerRideable interface turns out it did not enforce implementing those methods since they are already implemented in Entity --- .../api/rocket/entity/PlayerRideable.java | 21 ------------------- .../entity/vehicle/AbstractLanderEntity.java | 4 ++-- .../mod/content/entity/vehicle/Buggy.java | 4 ++-- .../content/entity/vehicle/RocketEntity.java | 4 ++-- 4 files changed, 6 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java diff --git a/src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java b/src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java deleted file mode 100644 index 8629c3026d..0000000000 --- a/src/main/java/dev/galacticraft/api/rocket/entity/PlayerRideable.java +++ /dev/null @@ -1,21 +0,0 @@ -package dev.galacticraft.api.rocket.entity; - -import dev.galacticraft.api.entity.IgnoreShift; -import dev.galacticraft.mod.content.entity.ControllableEntity; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.phys.Vec3; - -public interface PlayerRideable extends IgnoreShift, ControllableEntity { - - default boolean isPickable() { //Required to interact with the entity - return true; - } - - InteractionResult interact(Player player, InteractionHand hand); - - Vec3 getDismountLocationForPassenger(LivingEntity passenger); - -} diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index 4c1a100eb9..c8a33e6cc8 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -23,7 +23,7 @@ package dev.galacticraft.mod.content.entity.vehicle; import dev.galacticraft.api.entity.IgnoreShift; -import dev.galacticraft.api.rocket.entity.PlayerRideable; +import dev.galacticraft.mod.content.entity.ControllableEntity; import dev.galacticraft.mod.screen.ParachestMenu; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.network.FriendlyByteBuf; @@ -42,7 +42,7 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; -public abstract class AbstractLanderEntity extends GCFueledVehicleEntity implements IgnoreShift, PlayerRideable, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { +public abstract class AbstractLanderEntity extends GCFueledVehicleEntity implements IgnoreShift, ControllableEntity, HasCustomInventoryScreen, ExtendedScreenHandlerFactory { // **************************************** FIELDS **************************************** diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java index a978ee2c98..6ae07dd920 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/Buggy.java @@ -23,7 +23,7 @@ package dev.galacticraft.mod.content.entity.vehicle; import dev.galacticraft.api.entity.IgnoreShift; -import dev.galacticraft.api.rocket.entity.PlayerRideable; +import dev.galacticraft.mod.content.entity.ControllableEntity; import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -44,7 +44,7 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -public class Buggy extends GCFueledVehicleEntity implements IgnoreShift, PlayerRideable, HasCustomInventoryScreen, ExtendedScreenHandlerFactory, ContainerListener, VariantHolder { +public class Buggy extends GCFueledVehicleEntity implements IgnoreShift, ControllableEntity, HasCustomInventoryScreen, ExtendedScreenHandlerFactory, ContainerListener, VariantHolder { // **************************************** FIELDS **************************************** diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 16bed15c79..027737eecb 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -27,7 +27,6 @@ import dev.galacticraft.api.registry.RocketRegistries; import dev.galacticraft.api.rocket.LaunchStage; import dev.galacticraft.api.rocket.RocketData; -import dev.galacticraft.api.rocket.entity.PlayerRideable; import dev.galacticraft.api.rocket.entity.Rocket; import dev.galacticraft.api.rocket.part.*; import dev.galacticraft.api.universe.celestialbody.CelestialBody; @@ -40,6 +39,7 @@ import dev.galacticraft.mod.content.advancements.GCTriggers; import dev.galacticraft.mod.content.block.special.rocketlaunchpad.RocketLaunchPadBlock; import dev.galacticraft.mod.content.block.special.rocketlaunchpad.RocketLaunchPadBlockEntity; +import dev.galacticraft.mod.content.entity.ControllableEntity; import dev.galacticraft.mod.content.entity.data.GCEntityDataSerializers; import dev.galacticraft.mod.content.item.GCItems; import dev.galacticraft.mod.events.RocketEvents; @@ -91,7 +91,7 @@ import java.util.Objects; @SuppressWarnings("UnstableApiUsage") -public class RocketEntity extends GCFueledVehicleEntity implements Rocket, IgnoreShift, PlayerRideable { +public class RocketEntity extends GCFueledVehicleEntity implements Rocket, IgnoreShift, ControllableEntity { // **************************************** FIELDS **************************************** From c5eddd7c3c1df525c27d704d9a35c364b5aa3540 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Wed, 5 Jun 2024 19:54:03 -0700 Subject: [PATCH 30/39] refactor: moved lerp back to Rocket --- .../entity/vehicle/GCVehicleEntity.java | 39 ------------------- .../content/entity/vehicle/RocketEntity.java | 37 ++++++++++++++++++ 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index 4968282bb4..5bef8dc312 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -31,7 +31,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.DamageTypeTags; -import net.minecraft.util.Mth; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; import net.minecraft.world.damagesource.DamageSource; @@ -67,13 +66,6 @@ public abstract class GCVehicleEntity extends Entity implements Container { protected static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); protected static final EntityDataAccessor DATA_ID_DAMAGE = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.FLOAT); - private int lerpSteps; - private double lerpX; - private double lerpY; - private double lerpZ; - private double lerpYRot; - private double lerpXRot; - protected NonNullList inventory; //protected InventoryStorage storage; @@ -219,8 +211,6 @@ public void animateHurt(float yaw) { public void tick() { super.tick(); - tickLerp(); - if (getHurtTime() > 0) { setHurtTime(getHurtTime() - 1); } @@ -236,35 +226,6 @@ protected void reapplyPosition() { this.getPassengers().forEach(this::positionRider); } - @Override - public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps) { - this.lerpX = x; - this.lerpY = y; - this.lerpZ = z; - this.lerpYRot = yaw; - this.lerpXRot = pitch; - this.lerpSteps = 10; - } - - private void tickLerp() { // Stolen from the boat class to fix the rocket from bugging out - if (this.isControlledByLocalInstance()) { - this.lerpSteps = 0; - this.syncPacketPositionCodec(this.getX(), this.getY(), this.getZ()); - } - - if (this.lerpSteps > 0) { - double lerpedX = this.getX() + (this.lerpX - getX()) / (double) this.lerpSteps; - double lerpedY = this.getY() + (this.lerpY - getY()) / (double) this.lerpSteps; - double lerpedZ = this.getZ() + (this.lerpZ - getZ()) / (double) this.lerpSteps; - double g = Mth.wrapDegrees(this.lerpYRot - (double) this.getYRot()); - setYRot(getYRot() + (float) g / (float) this.lerpSteps); - setXRot(getXRot() + (float) (this.lerpXRot - (double) getXRot()) / (float) this.lerpSteps); - --this.lerpSteps; - setPos(lerpedX, lerpedY, lerpedZ); - setRot(getYRot(), getXRot()); - } - } - // **************************************** CONTAINER **************************************** @Override diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 027737eecb..8245fcf0e6 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -118,6 +118,13 @@ public class RocketEntity extends GCFueledVehicleEntity implements Rocket, Ignor private float timeSinceLaunch; private long ticksSinceJump = 0; + private int lerpSteps; + private double lerpX; + private double lerpY; + private double lerpZ; + private double lerpYRot; + private double lerpXRot; + // **************************************** CONSTRUCTOR **************************************** public RocketEntity(EntityType entityType, Level level) { @@ -404,6 +411,7 @@ public void tick() { setTimeAsState(getTimeAsState() + 1); super.tick(); + tickLerp(); int particleChance; @@ -598,6 +606,35 @@ && level().getBlockState(getLinkedPad()).getValue(RocketLaunchPadBlock.PART) != } } + @Override + public void lerpTo(double x, double y, double z, float yaw, float pitch, int interpolationSteps) { + this.lerpX = x; + this.lerpY = y; + this.lerpZ = z; + this.lerpYRot = yaw; + this.lerpXRot = pitch; + this.lerpSteps = 10; + } + + private void tickLerp() { // Stolen from the boat class to fix the rocket from bugging out + if (this.isControlledByLocalInstance()) { + this.lerpSteps = 0; + this.syncPacketPositionCodec(this.getX(), this.getY(), this.getZ()); + } + + if (this.lerpSteps > 0) { + double lerpedX = this.getX() + (this.lerpX - getX()) / (double) this.lerpSteps; + double lerpedY = this.getY() + (this.lerpY - getY()) / (double) this.lerpSteps; + double lerpedZ = this.getZ() + (this.lerpZ - getZ()) / (double) this.lerpSteps; + double g = Mth.wrapDegrees(this.lerpYRot - (double) this.getYRot()); + setYRot(getYRot() + (float) g / (float) this.lerpSteps); + setXRot(getXRot() + (float) (this.lerpXRot - (double) getXRot()) / (float) this.lerpSteps); + --this.lerpSteps; + setPos(lerpedX, lerpedY, lerpedZ); + setRot(getYRot(), getXRot()); + } + } + @Override public void setDeltaMovement(double x, double y, double z) { this.setDeltaMovement(new Vec3(x, y, z)); From 92bee8a03f9b493973baab7bd84097b618b769d8 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Wed, 5 Jun 2024 19:54:50 -0700 Subject: [PATCH 31/39] refactor: initialized inventory --- .../mod/content/entity/vehicle/GCVehicleEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index 5bef8dc312..f4ccec8757 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -66,7 +66,7 @@ public abstract class GCVehicleEntity extends Entity implements Container { protected static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); protected static final EntityDataAccessor DATA_ID_DAMAGE = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.FLOAT); - protected NonNullList inventory; + protected NonNullList inventory = NonNullList.withSize(0, ItemStack.EMPTY);; //protected InventoryStorage storage; // **************************************** CONSTRUCTOR **************************************** From ea83fad9dbf7e53f94ff36eac4700ea69c9935ba Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Wed, 5 Jun 2024 19:55:08 -0700 Subject: [PATCH 32/39] refactor: reorganized AbstractLanderEntity again --- .../entity/vehicle/AbstractLanderEntity.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index c8a33e6cc8..e83c10f068 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -58,6 +58,16 @@ public Item getDropItem() { return ItemStack.EMPTY.getItem(); } + @Override + public float getDamageMultiplier() { + return 5; + } + + @Override + public float getMaxDamage() { + return 100; + } + public abstract boolean shouldMove(); public abstract boolean shouldSpawnParticles(); @@ -77,13 +87,8 @@ public long getFuelTankCapacity() { // **************************************** INTERACTION **************************************** @Override - public float getDamageMultiplier() { - return 5; - } - - @Override - public float getMaxDamage() { - return 100; + public boolean isPickable() { // Required to interact with the entity + return true; } @Override From 6d2cbb7c201e8725048ab92d326d922dd68caef1 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Wed, 5 Jun 2024 19:55:34 -0700 Subject: [PATCH 33/39] refactor: readded isPickable to rocket --- .../mod/content/entity/vehicle/RocketEntity.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 8245fcf0e6..fbeecf635d 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -81,7 +81,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -292,10 +291,10 @@ public long getFuelTankCapacity() { // **************************************** INTERACTION **************************************** -// @Override -// public boolean isPickable(){ -// return true; -// } + @Override + public boolean isPickable() { // Required to interact with the entity + return true; + } @Override public boolean hurt(DamageSource source, float amount) { From c3967cbc5c38d77a8c9ab8bd14336d2389693501 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Fri, 7 Jun 2024 22:30:50 -0700 Subject: [PATCH 34/39] trying to make the rocket inventory screen work --- src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java | 5 +++++ .../mod/content/entity/vehicle/GCVehicleEntity.java | 2 +- .../mod/content/entity/vehicle/RocketEntity.java | 8 ++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java b/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java index 3fcd8de83c..e4f1dcd452 100644 --- a/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java +++ b/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java @@ -23,6 +23,7 @@ package dev.galacticraft.mod.client; import dev.galacticraft.mod.client.gui.screen.ingame.CelestialSelectionScreen; +import dev.galacticraft.mod.content.entity.vehicle.RocketEntity; import dev.galacticraft.mod.util.Translations; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.KeyMapping; @@ -44,6 +45,10 @@ public static void handleKeybinds(Minecraft client) { while (OPEN_CELESTIAL_SCREEN.consumeClick()) { client.setScreen(new CelestialSelectionScreen(true, null, false, null)); } + } else if (client.player.getVehicle() instanceof RocketEntity rocket) { + while (OPEN_ROCKET_INVENTORY.consumeClick()) { + rocket.openCustomInventoryScreen(client.player); + } } } } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java index f4ccec8757..5bef8dc312 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/GCVehicleEntity.java @@ -66,7 +66,7 @@ public abstract class GCVehicleEntity extends Entity implements Container { protected static final EntityDataAccessor DATA_ID_HURTDIR = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.INT); protected static final EntityDataAccessor DATA_ID_DAMAGE = SynchedEntityData.defineId(GCVehicleEntity.class, EntityDataSerializers.FLOAT); - protected NonNullList inventory = NonNullList.withSize(0, ItemStack.EMPTY);; + protected NonNullList inventory; //protected InventoryStorage storage; // **************************************** CONSTRUCTOR **************************************** diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index fbeecf635d..a6fcd2fa33 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -46,6 +46,8 @@ import dev.galacticraft.mod.network.packets.RocketSpawnPacket; import dev.galacticraft.mod.particle.EntityParticleOption; import dev.galacticraft.mod.particle.GCParticleTypes; +import dev.galacticraft.mod.screen.ParachestMenu; +import dev.galacticraft.mod.screen.RocketMenu; import dev.galacticraft.mod.tag.GCTags; import dev.galacticraft.mod.util.Translations; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; @@ -128,6 +130,7 @@ public class RocketEntity extends GCFueledVehicleEntity implements Rocket, Ignor public RocketEntity(EntityType entityType, Level level) { super(entityType, level); + this.inventory = NonNullList.withSize(54, ItemStack.EMPTY); } // **************************************** DATA **************************************** @@ -875,8 +878,9 @@ public Entity asEntity() { @Nullable @Override - public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { - return null; + public AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { + //return new RocketMenu(containerId, inventory, player, this); + return new ParachestMenu(containerId, inventory, this); } @Override From 7106237c2b6722d0c48feeb2b507ee5a45045a58 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Fri, 7 Jun 2024 22:31:25 -0700 Subject: [PATCH 35/39] fix: changed rocket inventory default key to G F is already used for off-hand swap --- src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java b/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java index e4f1dcd452..b8e97717a4 100644 --- a/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java +++ b/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java @@ -32,7 +32,7 @@ public class GCKeyBinds { public static final KeyMapping OPEN_CELESTIAL_SCREEN = new KeyMapping(Translations.Keybindings.OPEN_CELESTIAL_SCREEN, GLFW.GLFW_KEY_M, KeyMapping.CATEGORY_MISC); - public static final KeyMapping OPEN_ROCKET_INVENTORY = new KeyMapping(Translations.Keybindings.ROCKET_INVENTORY, GLFW.GLFW_KEY_F, KeyMapping.CATEGORY_INVENTORY); + public static final KeyMapping OPEN_ROCKET_INVENTORY = new KeyMapping(Translations.Keybindings.ROCKET_INVENTORY, GLFW.GLFW_KEY_G, KeyMapping.CATEGORY_INVENTORY); public static void register() { KeyBindingHelper.registerKeyBinding(OPEN_CELESTIAL_SCREEN); From 42634916a2558f539162c822e657eed5dd2c4174 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Fri, 7 Jun 2024 22:38:02 -0700 Subject: [PATCH 36/39] style: made some changes based on IDEA suggestions --- .../content/entity/vehicle/RocketEntity.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index a6fcd2fa33..09cb7e57c4 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -111,8 +111,6 @@ public class RocketEntity extends GCFueledVehicleEntity implements Rocket, Ignor public static final EntityDataAccessor ROCKET_ENGINE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); public static final EntityDataAccessor ROCKET_UPGRADE = SynchedEntityData.defineId(RocketEntity.class, GCEntityDataSerializers.IDENTIFIER); - private final boolean debugMode = false && FabricLoader.getInstance().isDevelopmentEnvironment(); - private BlockPos linkedPad = BlockPos.ZERO; private int timeBeforeLaunch; @@ -338,7 +336,7 @@ public void onJump() { if (!this.getPassengers().isEmpty() && ticksSinceJump > 10) { if (this.getFirstPassenger() instanceof ServerPlayer) { if (getLaunchStage().ordinal() < LaunchStage.IGNITED.ordinal()) { - if (!isTankEmpty() || debugMode) { + if (!isTankEmpty()) { this.timeBeforeLaunch = getPreLaunchWait(); this.setLaunchStage(this.getLaunchStage().next()); if (getLaunchStage() == LaunchStage.WARNING) { @@ -375,13 +373,13 @@ private void dropRocket() { } @Override - public InteractionResult interactAt(Player player, Vec3 vec3d, InteractionHand hand) { + public @NotNull InteractionResult interactAt(Player player, Vec3 vec3d, InteractionHand hand) { player.startRiding(this); return InteractionResult.SUCCESS; } @Override - public InteractionResult interact(Player player, InteractionHand hand) { + public @NotNull InteractionResult interact(Player player, InteractionHand hand) { if (this.getPassengers().isEmpty()) { player.startRiding(this); return InteractionResult.SUCCESS; @@ -390,12 +388,12 @@ public InteractionResult interact(Player player, InteractionHand hand) { } @Override - protected Vector3f getPassengerAttachmentPoint(Entity entity, EntityDimensions dimensions, float scale) { + protected @NotNull Vector3f getPassengerAttachmentPoint(Entity entity, EntityDimensions dimensions, float scale) { return new Vector3f(0F, 1.5F, 0F); } @Override - public Vec3 getDismountLocationForPassenger(LivingEntity passenger) { + public @NotNull Vec3 getDismountLocationForPassenger(LivingEntity passenger) { return new Vec3(getX(), getY(), getZ() + 1f); } @@ -462,7 +460,7 @@ public void tick() { Entity passenger = getFirstPassenger(); if (getLaunchStage() == LaunchStage.IGNITED) { timeBeforeLaunch--; - if (isTankEmpty() && !debugMode) { + if (isTankEmpty()) { this.setLaunchStage(LaunchStage.IDLE); if (passenger instanceof ServerPlayer player) { @@ -499,7 +497,7 @@ && level().getBlockState(getLinkedPad()).getValue(RocketLaunchPadBlock.PART) != this.setSpeed(0.0f); } } else if (getLaunchStage() == LaunchStage.LAUNCHED) { - if (!debugMode && (isTankEmpty() || !this.getFuelTank().getResource().getFluid().is(GCTags.FUEL)) && FabricLoader.getInstance().isDevelopmentEnvironment()) { + if (isTankEmpty() || !this.getFuelTank().getResource().getFluid().is(GCTags.FUEL) && FabricLoader.getInstance().isDevelopmentEnvironment()) { this.setLaunchStage(LaunchStage.FAILED); } else { try (Transaction t = Transaction.openOuter()) { @@ -598,7 +596,7 @@ && level().getBlockState(getLinkedPad()).getValue(RocketLaunchPadBlock.PART) != } if (getLaunchStage().ordinal() >= LaunchStage.LAUNCHED.ordinal()) { - if (getPassengers().size() >= 1) { // When the screen changes to the + if (!getPassengers().isEmpty()) { // When the screen changes to the // map, the player is not riding // the rocket anymore. if (getPassengers().get(0) instanceof ServerPlayer player) { From 066d1eef6c0224b5c33fcf360c1acc827715617a Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 9 Jun 2024 08:16:44 -0700 Subject: [PATCH 37/39] style: style changes --- .../mod/client/gui/screen/ingame/ParachestScreen.java | 2 +- .../mod/client/gui/screen/ingame/RocketInventoryScreen.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/ParachestScreen.java b/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/ParachestScreen.java index a136f91df4..dcbf27f738 100644 --- a/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/ParachestScreen.java +++ b/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/ParachestScreen.java @@ -33,7 +33,7 @@ import net.minecraft.world.entity.player.Inventory; public class ParachestScreen extends AbstractContainerScreen { - private static ResourceLocation[] parachestTexture = new ResourceLocation[4]; + private static final ResourceLocation[] parachestTexture = new ResourceLocation[4]; static { for (int i = 0; i < 4; i++) { diff --git a/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketInventoryScreen.java b/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketInventoryScreen.java index f1bf8e19f4..e5e0980392 100644 --- a/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketInventoryScreen.java +++ b/src/main/java/dev/galacticraft/mod/client/gui/screen/ingame/RocketInventoryScreen.java @@ -33,6 +33,7 @@ import net.minecraft.world.entity.player.Inventory; public class RocketInventoryScreen extends AbstractContainerScreen { + public RocketInventoryScreen(RocketMenu abstractContainerMenu, Inventory inventory, Component component) { super(abstractContainerMenu, inventory, component); } From b63f88a7ba082445523b649d39ccb6e2af82cf46 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 9 Jun 2024 08:17:10 -0700 Subject: [PATCH 38/39] refactor: simplified abstract lander entity interaction code --- .../entity/vehicle/AbstractLanderEntity.java | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java index e83c10f068..d02bd227c3 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/AbstractLanderEntity.java @@ -93,31 +93,15 @@ public boolean isPickable() { // Required to interact with the entity @Override public InteractionResult interact(Player player, InteractionHand hand) { - if (this.level().isClientSide) { - if (!this.onGround()) { - return InteractionResult.FAIL; - } - - if (!this.getPassengers().isEmpty()) { - this.ejectPassengers(); - } - - return InteractionResult.SUCCESS; + if (!this.onGround()) { + return InteractionResult.FAIL; } - if (this.getPassengers().isEmpty()) { - openCustomInventoryScreen(player); - return InteractionResult.SUCCESS; - } else if (player instanceof ServerPlayer) { - if (!this.onGround()) { - return InteractionResult.FAIL; - } - - this.ejectPassengers(); - return InteractionResult.SUCCESS; + this.openCustomInventoryScreen(player); } else { - return InteractionResult.SUCCESS; + this.ejectPassengers(); } + return InteractionResult.SUCCESS; } // **************************************** TICK **************************************** From 8dbef2679665fc9fbd04e0d87be35f5dc3f36f17 Mon Sep 17 00:00:00 2001 From: LeMayday <21mayc@gmail.com> Date: Sun, 9 Jun 2024 08:17:50 -0700 Subject: [PATCH 39/39] feat: messing around with rocket inventory haven't got it quite working yet --- .../galacticraft/mod/client/GCKeyBinds.java | 32 ++++++++++++++----- .../content/entity/vehicle/RocketEntity.java | 4 +-- .../galacticraft/mod/screen/RocketMenu.java | 5 ++- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java b/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java index b8e97717a4..1aa324c82d 100644 --- a/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java +++ b/src/main/java/dev/galacticraft/mod/client/GCKeyBinds.java @@ -32,24 +32,40 @@ public class GCKeyBinds { public static final KeyMapping OPEN_CELESTIAL_SCREEN = new KeyMapping(Translations.Keybindings.OPEN_CELESTIAL_SCREEN, GLFW.GLFW_KEY_M, KeyMapping.CATEGORY_MISC); - public static final KeyMapping OPEN_ROCKET_INVENTORY = new KeyMapping(Translations.Keybindings.ROCKET_INVENTORY, GLFW.GLFW_KEY_G, KeyMapping.CATEGORY_INVENTORY); + //public static final KeyMapping OPEN_ROCKET_INVENTORY = new KeyMapping(Translations.Keybindings.ROCKET_INVENTORY, GLFW.GLFW_KEY_G, KeyMapping.CATEGORY_INVENTORY); public static void register() { KeyBindingHelper.registerKeyBinding(OPEN_CELESTIAL_SCREEN); - KeyBindingHelper.registerKeyBinding(OPEN_ROCKET_INVENTORY); + //KeyBindingHelper.registerKeyBinding(OPEN_ROCKET_INVENTORY); } public static void handleKeybinds(Minecraft client) { if (client.level != null && client.player != null) { - if (client.screen == null) { - while (OPEN_CELESTIAL_SCREEN.consumeClick()) { + while (OPEN_CELESTIAL_SCREEN.consumeClick()) { + if (client.screen == null) { client.setScreen(new CelestialSelectionScreen(true, null, false, null)); } - } else if (client.player.getVehicle() instanceof RocketEntity rocket) { - while (OPEN_ROCKET_INVENTORY.consumeClick()) { - rocket.openCustomInventoryScreen(client.player); - } } +// while (OPEN_ROCKET_INVENTORY.consumeClick()) { +// if (client.player.getVehicle() instanceof RocketEntity rocket) { +// rocket.openCustomInventoryScreen(client.player); +// } +// } +// if (client.screen == null) { +// while (OPEN_CELESTIAL_SCREEN.consumeClick()) { +// client.setScreen(new CelestialSelectionScreen(true, null, false, null)); +// } +// } +// if (client.player.getVehicle() instanceof RocketEntity rocket) { +// while (OPEN_ROCKET_INVENTORY.consumeClick()) { +// rocket.openCustomInventoryScreen(client.player); +// } +// } +// if (OPEN_CELESTIAL_SCREEN.consumeClick() && client.screen == null) { +// client.setScreen(new CelestialSelectionScreen(true, null, false, null)); +// } else if (OPEN_ROCKET_INVENTORY.consumeClick() && client.player.getVehicle() instanceof RocketEntity rocket) { +// rocket.openCustomInventoryScreen(client.player); +// } } } } diff --git a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java index 09cb7e57c4..942ebe7a5e 100644 --- a/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java +++ b/src/main/java/dev/galacticraft/mod/content/entity/vehicle/RocketEntity.java @@ -877,8 +877,8 @@ public Entity asEntity() { @Nullable @Override public AbstractContainerMenu createMenu(int containerId, Inventory inventory, Player player) { - //return new RocketMenu(containerId, inventory, player, this); - return new ParachestMenu(containerId, inventory, this); + return new RocketMenu(containerId, inventory, player, this); + //return new ParachestMenu(containerId, inventory, this); } @Override diff --git a/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java b/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java index 5f905b2611..05e4afca5d 100644 --- a/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java +++ b/src/main/java/dev/galacticraft/mod/screen/RocketMenu.java @@ -33,7 +33,7 @@ public class RocketMenu extends AbstractContainerMenu { public final Player player; public final RocketEntity rocket; - protected RocketMenu(int syncId, Inventory playerInventory, FriendlyByteBuf buf) { + public RocketMenu(int syncId, Inventory playerInventory, FriendlyByteBuf buf) { this(syncId, playerInventory, playerInventory.player, (RocketEntity) playerInventory.player.level().getEntity(buf.readInt())); } @@ -42,6 +42,7 @@ public RocketMenu(int syncId, Inventory playerInventory, Player player, RocketEn this.player = player; this.rocket = rocket; + this.rocket.startOpen(playerInventory.player); // Player main inv for (int slotY = 0; slotY < 3; ++slotY) { @@ -54,6 +55,8 @@ public RocketMenu(int syncId, Inventory playerInventory, Player player, RocketEn for (int slotY = 0; slotY < 9; ++slotY) { this.addSlot(new Slot(playerInventory, slotY, 8 + slotY * 18, 108)); } + + this.addSlot(new Slot(this.rocket, this.rocket.getContainerSize() - 3, 125, 24)); } @Override