Skip to content

Commit 0980ba5

Browse files
committed
fix #3633
1 parent ba07d62 commit 0980ba5

File tree

6 files changed

+82
-0
lines changed

6 files changed

+82
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"values": [
3+
"iceandfire:dragonsteel_lightning_sword",
4+
"iceandfire:dragonbone_sword_lightning"
5+
]
6+
}

src/main/java/com/github/alexthe666/iceandfire/datagen/DataGenerators.java

+4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import com.github.alexthe666.iceandfire.IceAndFire;
44
import com.github.alexthe666.iceandfire.datagen.tags.BannerPatternTagGenerator;
5+
import com.github.alexthe666.iceandfire.datagen.tags.IafItemTags;
56
import com.github.alexthe666.iceandfire.datagen.tags.POITagGenerator;
67
import com.google.gson.JsonElement;
78
import com.mojang.serialization.JsonOps;
89
import net.minecraft.core.Registry;
910
import net.minecraft.core.RegistryAccess;
1011
import net.minecraft.data.DataGenerator;
12+
import net.minecraft.data.tags.BlockTagsProvider;
1113
import net.minecraft.resources.RegistryOps;
1214
import net.minecraftforge.common.data.ExistingFileHelper;
1315
import net.minecraftforge.common.data.JsonCodecProvider;
@@ -32,6 +34,8 @@ public static void gatherData(GatherDataEvent event) {
3234
// DetectedVersion.BUILT_IN.getPackVersion(PackType.CLIENT_RESOURCES),
3335
// Arrays.stream(PackType.values()).collect(Collectors.toMap(Function.identity(), DetectedVersion.BUILT_IN::getPackVersion)))));
3436
generator.addProvider(event.includeServer(), new IafBiomeTagGenerator(generator, helper));
37+
BlockTagsProvider blockTagsProvider = new BlockTagsProvider(generator, IceAndFire.MODID, helper);
38+
generator.addProvider(event.includeServer(), new IafItemTags(generator, blockTagsProvider, helper));
3539

3640
RegistryOps<JsonElement> registryOps = RegistryOps.create(JsonOps.INSTANCE, RegistryAccess.builtinCopy());
3741

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.github.alexthe666.iceandfire.datagen.tags;
2+
3+
import com.github.alexthe666.iceandfire.IceAndFire;
4+
import com.github.alexthe666.iceandfire.item.IafItemRegistry;
5+
import net.minecraft.core.Registry;
6+
import net.minecraft.data.DataGenerator;
7+
import net.minecraft.data.tags.BlockTagsProvider;
8+
import net.minecraft.data.tags.ItemTagsProvider;
9+
import net.minecraft.resources.ResourceLocation;
10+
import net.minecraft.tags.TagKey;
11+
import net.minecraft.world.item.Item;
12+
import net.minecraftforge.common.data.ExistingFileHelper;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
public class IafItemTags extends ItemTagsProvider {
16+
public static TagKey<Item> MAKE_ITEM_DROPS_FIREIMMUNE = createKey("make_item_drops_fireimmune");
17+
18+
public IafItemTags(final DataGenerator generator, final BlockTagsProvider blockTagsProvider, @Nullable final ExistingFileHelper existingFileHelper) {
19+
super(generator, blockTagsProvider, IceAndFire.MODID, existingFileHelper);
20+
}
21+
22+
@Override
23+
protected void addTags() {
24+
tag(MAKE_ITEM_DROPS_FIREIMMUNE)
25+
.add(IafItemRegistry.DRAGONSTEEL_LIGHTNING_SWORD.get())
26+
.add(IafItemRegistry.DRAGONBONE_SWORD_LIGHTNING.get());
27+
}
28+
29+
private static TagKey<Item> createKey(final String name) {
30+
return TagKey.create(Registry.ITEM_REGISTRY, new ResourceLocation(IceAndFire.MODID, name));
31+
}
32+
}

src/main/java/com/github/alexthe666/iceandfire/event/ServerEvents.java

+36
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.alexthe666.iceandfire.IafConfig;
44
import com.github.alexthe666.iceandfire.IceAndFire;
55
import com.github.alexthe666.iceandfire.block.IafBlockRegistry;
6+
import com.github.alexthe666.iceandfire.datagen.tags.IafItemTags;
67
import com.github.alexthe666.iceandfire.entity.*;
78
import com.github.alexthe666.iceandfire.entity.ai.AiDebug;
89
import com.github.alexthe666.iceandfire.entity.ai.EntitySheepAIFollowCyclops;
@@ -63,6 +64,7 @@
6364
import net.minecraft.world.phys.EntityHitResult;
6465
import net.minecraftforge.event.LootTableLoadEvent;
6566
import net.minecraftforge.event.entity.EntityJoinLevelEvent;
67+
import net.minecraftforge.event.entity.EntityStruckByLightningEvent;
6668
import net.minecraftforge.event.entity.ProjectileImpactEvent;
6769
import net.minecraftforge.event.entity.living.*;
6870
import net.minecraftforge.event.entity.player.AttackEntityEvent;
@@ -71,12 +73,14 @@
7173
import net.minecraftforge.event.level.BlockEvent;
7274
import net.minecraftforge.event.server.ServerAboutToStartEvent;
7375
import net.minecraftforge.event.village.VillagerTradesEvent;
76+
import net.minecraftforge.eventbus.api.EventPriority;
7477
import net.minecraftforge.eventbus.api.SubscribeEvent;
7578
import net.minecraftforge.fml.common.Mod;
7679
import net.minecraftforge.registries.ForgeRegistries;
7780

7881
import javax.annotation.Nullable;
7982
import java.util.*;
83+
import java.util.stream.Collectors;
8084

8185
@Mod.EventBusSubscriber(modid = IceAndFire.MODID)
8286
public class ServerEvents {
@@ -287,6 +291,29 @@ public void onEntityDrop(LivingDropsEvent event) {
287291
}
288292
}
289293

294+
@SubscribeEvent(priority = EventPriority.LOWEST)
295+
public void makeItemDropsFireImmune(LivingDropsEvent event) {
296+
boolean makeFireImmune = false;
297+
298+
if (event.getSource().getDirectEntity() instanceof LightningBolt bolt && bolt.getTags().contains(BOLT_DONT_DESTROY_ITEMS)) {
299+
makeFireImmune = true;
300+
} else if (event.getSource().getEntity() instanceof Player player && player.getItemInHand(player.getUsedItemHand()).is(IafItemTags.MAKE_ITEM_DROPS_FIREIMMUNE)) {
301+
makeFireImmune = true;
302+
}
303+
304+
if (makeFireImmune) {
305+
Set<ItemEntity> fireImmuneDrops = event.getDrops().stream().map(itemEntity -> new ItemEntity(itemEntity.level, itemEntity.getX(), itemEntity.getY(), itemEntity.getZ(), itemEntity.getItem()) {
306+
@Override
307+
public boolean fireImmune() {
308+
return true;
309+
}
310+
}).collect(Collectors.toSet());
311+
312+
event.getDrops().clear();
313+
event.getDrops().addAll(fireImmuneDrops);
314+
}
315+
}
316+
290317
@SubscribeEvent
291318
public void onLivingAttacked(final LivingAttackEvent event) {
292319
if (event.getSource() != null && event.getSource().getEntity() != null) {
@@ -650,4 +677,13 @@ public void onVillagerTrades(VillagerTradesEvent event) {
650677
IafVillagerRegistry.addScribeTrades(event.getTrades());
651678
}
652679
}
680+
681+
public static String BOLT_DONT_DESTROY_ITEMS = "skip_items";
682+
683+
@SubscribeEvent
684+
public void onLightningHit(EntityStruckByLightningEvent event) {
685+
if (event.getLightning().getTags().contains(BOLT_DONT_DESTROY_ITEMS) && event.getEntity() instanceof ItemEntity) {
686+
event.setCanceled(true);
687+
}
688+
}
653689
}

src/main/java/com/github/alexthe666/iceandfire/item/DragonSteelOverrides.java

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.github.alexthe666.iceandfire.IafConfig;
44
import com.github.alexthe666.iceandfire.entity.EntityDeathWorm;
55
import com.github.alexthe666.iceandfire.entity.props.FrozenProperties;
6+
import com.github.alexthe666.iceandfire.event.ServerEvents;
67
import com.google.common.collect.Multimap;
78
import net.minecraft.ChatFormatting;
89
import net.minecraft.network.chat.Component;
@@ -93,6 +94,7 @@ default void hurtEnemy(T item, ItemStack stack, LivingEntity target, LivingEntit
9394
}
9495
if (!attacker.level.isClientSide && flag) {
9596
LightningBolt lightningboltentity = EntityType.LIGHTNING_BOLT.create(target.level);
97+
lightningboltentity.getTags().add(ServerEvents.BOLT_DONT_DESTROY_ITEMS);
9698
lightningboltentity.moveTo(target.position());
9799
if (!target.level.isClientSide) {
98100
target.level.addFreshEntity(lightningboltentity);

src/main/java/com/github/alexthe666/iceandfire/item/ItemAlchemySword.java

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.github.alexthe666.iceandfire.entity.EntityFireDragon;
66
import com.github.alexthe666.iceandfire.entity.EntityIceDragon;
77
import com.github.alexthe666.iceandfire.entity.props.FrozenProperties;
8+
import com.github.alexthe666.iceandfire.event.ServerEvents;
89
import net.minecraft.ChatFormatting;
910
import net.minecraft.network.chat.Component;
1011
import net.minecraft.world.damagesource.DamageSource;
@@ -54,6 +55,7 @@ public boolean hurtEnemy(@NotNull ItemStack stack, @NotNull LivingEntity target,
5455
}
5556
if (!attacker.level.isClientSide && flag) {
5657
LightningBolt lightningboltentity = EntityType.LIGHTNING_BOLT.create(target.level);
58+
lightningboltentity.getTags().add(ServerEvents.BOLT_DONT_DESTROY_ITEMS);
5759
lightningboltentity.moveTo(target.position());
5860
if (!target.level.isClientSide) {
5961
target.level.addFreshEntity(lightningboltentity);

0 commit comments

Comments
 (0)