Skip to content

Commit

Permalink
Pipe bomb and bound item components
Browse files Browse the repository at this point in the history
  • Loading branch information
Electro593 committed Jan 17, 2025
1 parent 97a9cbd commit 7cf41f9
Show file tree
Hide file tree
Showing 16 changed files with 97 additions and 95 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ public int openingTick() {
public UUID getOwnerUUID() {
return PresentItem.getOwner(this.presentStack).flatMap(ProfileComponent::id).orElse(null);
}

public ProfileComponent getOwner() {
return PresentItem.getOwner(this.presentStack).orElse(null);
}

@Override
public String getOwnerName() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package de.dafuqs.spectrum.component_type;

import com.mojang.serialization.*;
import com.mojang.serialization.codecs.*;
import io.netty.buffer.*;
import net.minecraft.network.codec.*;

public record PipeBombComponent(long timestamp, boolean isArmed) {

public static final PipeBombComponent DEFAULT = new PipeBombComponent(0, false);

public static final Codec<PipeBombComponent> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.LONG.fieldOf("timestamp").forGetter(c -> c.timestamp),
Codec.BOOL.fieldOf("is_armed").forGetter(c -> c.isArmed)
).apply(i, PipeBombComponent::new));

public static final PacketCodec<ByteBuf, PipeBombComponent> PACKET_CODEC = PacketCodec.tuple(
PacketCodecs.VAR_LONG,
c -> c.timestamp,
PacketCodecs.BOOL,
c -> c.isArmed,
PipeBombComponent::new
);

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package de.dafuqs.spectrum.items.item_frame;

import net.minecraft.component.*;
import net.minecraft.component.type.*;
import net.minecraft.entity.*;
import net.minecraft.entity.decoration.*;
import net.minecraft.entity.player.*;
import net.minecraft.item.*;
import net.minecraft.nbt.*;
import net.minecraft.util.*;
import net.minecraft.util.math.*;
import net.minecraft.world.*;
Expand All @@ -31,9 +32,9 @@ public ActionResult useOnBlock(ItemUsageContext context) {
World world = context.getWorld();
ItemFrameEntity invisibleItemFrameEntity = getItemFrameEntity(world, blockPos2, direction);

NbtCompound nbtCompound = itemStack.getNbt();
if (nbtCompound != null) {
EntityType.loadFromEntityNbt(world, playerEntity, invisibleItemFrameEntity, nbtCompound);
var nbtComponent = itemStack.getOrDefault(DataComponentTypes.ENTITY_DATA, NbtComponent.DEFAULT);
if (!nbtComponent.isEmpty()) {
EntityType.loadFromEntityNbt(world, playerEntity, invisibleItemFrameEntity, nbtComponent);
}

if (invisibleItemFrameEntity.canStayAttached()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import de.dafuqs.spectrum.entity.entity.*;
import de.dafuqs.spectrum.registries.*;
import net.minecraft.client.item.*;
import net.minecraft.entity.player.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
Expand All @@ -11,7 +10,6 @@
import net.minecraft.text.*;
import net.minecraft.util.*;
import net.minecraft.world.*;
import org.jetbrains.annotations.*;

import java.util.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import de.dafuqs.spectrum.api.energy.color.*;
import de.dafuqs.spectrum.networking.s2c_payloads.*;
import de.dafuqs.spectrum.registries.*;
import net.minecraft.client.*;
import net.minecraft.entity.player.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
Expand Down Expand Up @@ -94,6 +95,7 @@ private static void advanceTime(@NotNull ServerWorld world, int additionalTime)
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
super.appendTooltip(stack, context, tooltip, type);

var world = MinecraftClient.getInstance().world;
if (world != null) {
switch (canAdvanceTime(world)) {
case FAILED_GAME_RULE ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import net.fabricmc.api.*;
import net.minecraft.block.*;
import net.minecraft.client.*;
import net.minecraft.client.item.*;
import net.minecraft.entity.player.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public static boolean tryCraftRecipe(PlayerEntity serverPlayerEntity, Recipe<?>
@Override
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
super.appendTooltip(stack, context, tooltip, type);
var recipe = getStoredRecipe(world, stack);
var recipe = getStoredRecipe(MinecraftClient.getInstance().world, stack);
if (recipe == null) {
tooltip.add(Text.translatable("item.spectrum.crafting_tablet.tooltip.no_recipe").formatted(Formatting.GRAY));
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package de.dafuqs.spectrum.items.magic_items;

import de.dafuqs.spectrum.helpers.*;
import net.minecraft.client.item.*;
import de.dafuqs.spectrum.registries.*;
import net.minecraft.component.*;
import net.minecraft.enchantment.*;
import net.minecraft.entity.*;
import net.minecraft.entity.player.*;
import net.minecraft.inventory.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
import net.minecraft.nbt.*;
import net.minecraft.registry.*;
import net.minecraft.screen.slot.*;
import net.minecraft.sound.*;
import net.minecraft.text.*;
import net.minecraft.util.*;
import net.minecraft.world.*;
import org.jetbrains.annotations.*;

import java.util.*;
Expand Down Expand Up @@ -64,8 +62,8 @@ public static boolean tryExchangeEnchantments(ItemStack canvasStack, ItemStack t
return false;
}

Map<Enchantment, Integer> canvasEnchantments = EnchantmentHelper.fromNbt(EnchantedBookItem.getEnchantmentNbt(canvasStack));
Map<Enchantment, Integer> targetEnchantments = EnchantmentHelper.fromNbt(targetStack.getEnchantments());
var canvasEnchantments = canvasStack.getEnchantments();
var targetEnchantments = targetStack.getEnchantments();
if (canvasEnchantments.isEmpty() && targetEnchantments.isEmpty()) {
return false;
}
Expand All @@ -80,8 +78,8 @@ public static boolean tryExchangeEnchantments(ItemStack canvasStack, ItemStack t
if (itemLock.isEmpty() && !targetEnchantments.isEmpty()) {
bindTo(canvasStack, targetStack);
}
SpectrumEnchantmentHelper.setStoredEnchantments(targetEnchantments, canvasStack);
EnchantmentHelper.set(canvasEnchantments, targetStack);
canvasStack.set(DataComponentTypes.STORED_ENCHANTMENTS, targetEnchantments);
EnchantmentHelper.set(targetStack, canvasEnchantments);

if (drop && receiver != null) {
if (receiver instanceof PlayerEntity player) {
Expand All @@ -107,27 +105,17 @@ public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> to
tooltip.add(Text.translatable("item.spectrum.enchantment_canvas.tooltip.not_bound"));
tooltip.add(Text.translatable("item.spectrum.enchantment_canvas.tooltip.not_bound2"));
}
ItemStack.appendEnchantments(tooltip, EnchantedBookItem.getEnchantmentNbt(stack));
}

@Override
public boolean hasGlint(ItemStack stack) {
return !EnchantedBookItem.getEnchantmentNbt(stack).isEmpty();
}

private static void bindTo(ItemStack enchantmentExchangerStack, ItemStack targetStack) {
NbtCompound nbt = enchantmentExchangerStack.getOrCreateNbt();
nbt.putString("BoundItem", Registries.ITEM.getId(targetStack.getItem()).toString());
enchantmentExchangerStack.setNbt(nbt);
enchantmentExchangerStack.set(SpectrumDataComponentTypes.BOUND_ITEM, Registries.ITEM.getId(targetStack.getItem()));
}

private static Optional<Item> getItemBoundTo(ItemStack enchantmentExchangerStack) {
NbtCompound nbt = enchantmentExchangerStack.getNbt();
if (nbt == null || !nbt.contains("BoundItem", NbtElement.STRING_TYPE)) {
var boundId = enchantmentExchangerStack.get(SpectrumDataComponentTypes.BOUND_ITEM);
if (boundId == null)
return Optional.empty();
}
String targetItemString = nbt.getString("BoundItem");
return Optional.of(Registries.ITEM.get(Identifier.tryParse(targetItemString)));
return Optional.of(Registries.ITEM.get(boundId));
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package de.dafuqs.spectrum.items.magic_items;

import net.minecraft.client.item.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
import net.minecraft.text.*;
import net.minecraft.util.*;
import net.minecraft.world.*;
import org.jetbrains.annotations.*;

import java.util.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@
import de.dafuqs.spectrum.blocks.*;
import de.dafuqs.spectrum.registries.*;
import net.minecraft.block.*;
import net.minecraft.client.item.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
import net.minecraft.text.*;
import net.minecraft.util.*;
import net.minecraft.util.math.*;
import net.minecraft.world.*;
import org.jetbrains.annotations.*;

import java.util.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package de.dafuqs.spectrum.items.magic_items;

import com.mojang.authlib.*;
import de.dafuqs.spectrum.api.item.*;
import de.dafuqs.spectrum.component_type.*;
import de.dafuqs.spectrum.registries.*;
import de.dafuqs.spectrum.sound.*;
import net.fabricmc.api.*;
import net.fabricmc.api.Environment;
import net.minecraft.client.*;
import net.minecraft.component.*;
import net.minecraft.component.type.*;
import net.minecraft.entity.*;
import net.minecraft.entity.damage.*;
import net.minecraft.entity.player.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.*;
import net.minecraft.nbt.*;
import net.minecraft.registry.tag.*;
import net.minecraft.server.world.*;
import net.minecraft.sound.*;
Expand Down Expand Up @@ -53,67 +57,51 @@ public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) {
}

public static void arm(ItemStack stack, World world, Vec3d pos, @Nullable Entity user) {
var nbt = stack.getOrCreateNbt();
nbt.putBoolean("armed", true);
nbt.putLong("timestamp", world.getTime());
if (user != null) {
nbt.putUuid("owner", user.getUuid());
}
stack.set(SpectrumDataComponentTypes.PIPE_BOMB, new PipeBombComponent(world.getTime(), true));
if (user != null)
stack.set(DataComponentTypes.PROFILE, new ProfileComponent(new GameProfile(user.getUuid(), user.getName().toString())));
world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SpectrumSoundEvents.INCANDESCENT_ARM, SoundCategory.PLAYERS, 2F, 0.9F);
}

@Override
public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
if (world.isClient())
return;

NbtCompound nbt = stack.getNbt();
if (nbt == null || !isArmed(stack)) {
return;
if (world instanceof ServerWorld serverWorld) {
if (tryGetOwner(stack, serverWorld) != entity || timeIsUp(world, stack))
explode(stack, serverWorld, entity.getPos(), entity);
}

if (tryGetOwner(stack, (ServerWorld) world) == entity && world.getTime() - nbt.getLong("timestamp") < 100)
return;

explode(stack, (ServerWorld) world, entity.getPos(), Optional.of(entity));
}

@Override
public void onItemEntityTicked(ItemEntity itemEntity) {
var world = itemEntity.getWorld();
var stack = itemEntity.getStack();
var nbt = stack.getOrCreateNbt();

if (world.isClient() || !isArmed(stack))
return;

if (world.getTime() - nbt.getLong("timestamp") > 100)
explode(stack, (ServerWorld) world, itemEntity.getEyePos(), Optional.empty());
if (itemEntity.getWorld() instanceof ServerWorld world) {
if (timeIsUp(world, stack))
explode(stack, world, itemEntity.getEyePos(), null);
}
}

@Override
public void onItemEntityDamaged(DamageSource source, float amount, ItemEntity itemEntity) {
if ((source.isIn(DamageTypeTags.IS_FIRE) || source.isIn(DamageTypeTags.IS_EXPLOSION)) && !itemEntity.getWorld().isClient()) {
explode(itemEntity.getStack(), (ServerWorld) itemEntity.getWorld(), itemEntity.getPos(), Optional.empty());
if (itemEntity.getWorld() instanceof ServerWorld world) {
if (source.isIn(DamageTypeTags.IS_FIRE) || source.isIn(DamageTypeTags.IS_EXPLOSION))
explode(itemEntity.getStack(), world, itemEntity.getPos(), null);
}
}

private void explode(ItemStack stack, ServerWorld world, Vec3d pos, Optional<Entity> target) {
private void explode(ItemStack stack, ServerWorld world, Vec3d pos, @Nullable Entity target) {
stack.decrement(1);
Entity owner = tryGetOwner(stack, world);

target.ifPresent(entity -> entity.damage(SpectrumDamageTypes.incandescence(world, owner instanceof LivingEntity living ? living : null), 200F));
if (target != null)
target.damage(SpectrumDamageTypes.incandescence(world, owner instanceof LivingEntity living ? living : null), 200F);
world.createExplosion(null, SpectrumDamageTypes.incandescence(world), new ExplosionBehavior(), pos.getX(), pos.getY(), pos.getZ(), 7.5F, true, World.ExplosionSourceType.NONE);
}

public Entity tryGetOwner(ItemStack stack, ServerWorld world) {
NbtCompound nbt = stack.getNbt();

if (nbt == null || !nbt.contains("owner")) {
var profile = stack.get(DataComponentTypes.PROFILE);
if (profile == null || profile.id().isEmpty())
return null;
}

return world.getEntity(nbt.getUuid("owner"));
return world.getEntity(profile.id().get());
}

@Override
Expand All @@ -122,8 +110,15 @@ public int getMaxUseTime(ItemStack stack, LivingEntity user) {
}

public static boolean isArmed(ItemStack stack) {
var nbt = stack.getNbt();
return nbt != null && nbt.getBoolean("armed");
return stack.getOrDefault(SpectrumDataComponentTypes.PIPE_BOMB, PipeBombComponent.DEFAULT).isArmed();
}

public static boolean timeIsUp(World world, ItemStack stack) {
return world.getTime() - getTimestamp(stack) >= 100;
}

private static long getTimestamp(ItemStack stack) {
return stack.getOrDefault(SpectrumDataComponentTypes.PIPE_BOMB, PipeBombComponent.DEFAULT).timestamp();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public int getMaxUseTime(ItemStack stack, LivingEntity user) {
public void usageTick(World world, LivingEntity user, ItemStack stack, int remainingUseTicks) {
// trigger the items' usage action every x ticks
if (user instanceof ServerPlayerEntity serverPlayerEntity && user.getItemUseTime() > USE_DURATION && user.getItemUseTime() % USE_DURATION == 0) {
usage(world, stack, serverPlayerEntity);
usage(world, serverPlayerEntity);
}
}

Expand Down Expand Up @@ -141,7 +141,7 @@ public ActionResult useOnBlock(ItemUsageContext context) {
return ActionResult.PASS;
}

public void usage(World world, ItemStack stack, ServerPlayerEntity user) {
public void usage(World world, ServerPlayerEntity user) {
int useTimes = (user.getItemUseTime() / USE_DURATION);
int maxCheckDistance = Math.min(MAX_REACH_STEPS, useTimes);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import de.dafuqs.spectrum.entity.entity.*;
import de.dafuqs.spectrum.registries.*;
import net.minecraft.client.item.*;
import net.minecraft.entity.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
import de.dafuqs.spectrum.api.energy.*;
import de.dafuqs.spectrum.api.item.*;
import de.dafuqs.spectrum.entity.entity.*;
import net.minecraft.client.item.*;
import net.minecraft.entity.*;
import net.minecraft.entity.effect.*;
import net.minecraft.entity.player.*;
import net.minecraft.item.*;
import net.minecraft.item.tooltip.TooltipType;
import net.minecraft.text.*;
import net.minecraft.util.*;
import net.minecraft.world.*;
import org.jetbrains.annotations.*;

import java.util.*;
Expand Down
Loading

0 comments on commit 7cf41f9

Please sign in to comment.