Skip to content

Commit c4e8dc8

Browse files
authored
feat: add soul gem support to containment jar
Merge pull request #9 from Vonr/feat/soul-gem-jar-compat feat: soul gem containment jar compat
2 parents 76c8202 + 3aace6d commit c4e8dc8

File tree

3 files changed

+156
-1
lines changed

3 files changed

+156
-1
lines changed

src/main/java/com/mystchonky/arsocultas/ArsOcultas.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import com.mystchonky.arsocultas.init.Registrar;
55
import net.minecraft.resources.ResourceLocation;
66
import net.neoforged.bus.api.IEventBus;
7+
import net.neoforged.fml.ModContainer;
78
import net.neoforged.fml.common.Mod;
9+
import net.neoforged.fml.config.ModConfig;
810
import org.slf4j.Logger;
911

1012
@Mod(ArsOcultas.MODID)
@@ -13,7 +15,9 @@ public class ArsOcultas {
1315

1416
public static final Logger LOGGER = LogUtils.getLogger();
1517

16-
public ArsOcultas(IEventBus modbus) {
18+
public ArsOcultas(IEventBus modbus, ModContainer container) {
19+
container.registerConfig(ModConfig.Type.SERVER, Config.SERVER_SPEC, MODID + "/base-server.toml");
20+
1721
Registrar.init(modbus);
1822
}
1923

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.mystchonky.arsocultas;
2+
3+
import net.neoforged.neoforge.common.ModConfigSpec;
4+
5+
public class Config {
6+
public static final Server SERVER;
7+
public static final ModConfigSpec SERVER_SPEC;
8+
9+
static {
10+
var serverSpecPair = new ModConfigSpec.Builder().configure(Server::new);
11+
SERVER = serverSpecPair.getLeft();
12+
SERVER_SPEC = serverSpecPair.getRight();
13+
}
14+
15+
public static class Server {
16+
public final ModConfigSpec.BooleanValue CONTAINMENT_JARS_SOUL_GEM_PICKUP;
17+
public final ModConfigSpec.BooleanValue CONTAINMENT_JARS_SOUL_GEM_PLACE;
18+
19+
public Server(ModConfigSpec.Builder builder) {
20+
CONTAINMENT_JARS_SOUL_GEM_PICKUP = builder.comment("Allow empty Soul Gems to be used on filled Containment Jars to pickup the contained mob").define("containment_jar.soul_gem.pickup", true);
21+
CONTAINMENT_JARS_SOUL_GEM_PLACE = builder.comment("Allow filled Soul Gems to be used on empty Containment Jars to place the mob into the jar").define("containment_jar.soul_gem.place", true);
22+
}
23+
24+
}
25+
26+
}

src/main/java/com/mystchonky/arsocultas/content/EventHandler.java

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,33 @@
22

33
import com.hollingsworth.arsnouveau.common.block.tile.MobJarTile;
44
import com.hollingsworth.arsnouveau.common.items.MobJarItem;
5+
import com.hollingsworth.arsnouveau.common.lib.EntityTags;
56
import com.klikli_dev.occultism.Occultism;
67
import com.klikli_dev.occultism.common.entity.job.CrusherJob;
78
import com.klikli_dev.occultism.common.entity.job.CrystallizerJob;
89
import com.klikli_dev.occultism.common.entity.job.SmelterJob;
910
import com.klikli_dev.occultism.common.entity.job.TraderJob;
1011
import com.klikli_dev.occultism.common.entity.spirit.SpiritEntity;
12+
import com.klikli_dev.occultism.common.item.tool.SoulGemItem;
13+
import com.klikli_dev.occultism.registry.OccultismItems;
14+
import com.klikli_dev.occultism.registry.OccultismTags;
15+
import com.klikli_dev.occultism.util.EntityUtil;
1116
import com.mystchonky.arsocultas.ArsOcultas;
17+
import com.mystchonky.arsocultas.Config;
1218
import com.mystchonky.arsocultas.content.spirit_jar.SpiritBehaviour;
1319
import net.minecraft.ChatFormatting;
1420
import net.minecraft.client.resources.language.I18n;
21+
import net.minecraft.core.component.DataComponents;
22+
import net.minecraft.nbt.CompoundTag;
1523
import net.minecraft.network.chat.Component;
24+
import net.minecraft.world.InteractionResult;
25+
import net.minecraft.world.entity.Entity;
26+
import net.minecraft.world.entity.EntityType;
27+
import net.minecraft.world.item.component.CustomData;
1628
import net.neoforged.bus.api.SubscribeEvent;
1729
import net.neoforged.fml.common.EventBusSubscriber;
1830
import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent;
31+
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
1932
import org.apache.commons.lang3.StringUtils;
2033

2134
@EventBusSubscriber(modid = ArsOcultas.MODID)
@@ -102,4 +115,116 @@ public static void itemTooltips(ItemTooltipEvent event) {
102115
}
103116
}
104117

118+
@SubscribeEvent
119+
public static void playerRightClick(PlayerInteractEvent.RightClickBlock event) {
120+
var player = event.getEntity();
121+
var stack = event.getItemStack();
122+
if (!(stack.getItem() instanceof SoulGemItem)) {
123+
return;
124+
}
125+
126+
var level = event.getLevel();
127+
var hit = event.getHitVec();
128+
var be = level.getBlockEntity(hit.getBlockPos());
129+
if (!(be instanceof MobJarTile jar)) {
130+
return;
131+
}
132+
133+
var gemData = stack.get(DataComponents.ENTITY_DATA);
134+
var jarEntity = jar.getEntity();
135+
136+
if (gemData == null && jarEntity != null) {
137+
if (!Config.SERVER.CONTAINMENT_JARS_SOUL_GEM_PICKUP.get()) {
138+
// We cancel regardless to prevent an entity dupe.
139+
event.setCancellationResult(InteractionResult.FAIL);
140+
event.setCanceled(true);
141+
return;
142+
}
143+
144+
var type = jarEntity.getType();
145+
146+
if (type.is(EntityTags.JAR_RELEASE_BLACKLIST) || (!type.is(EntityTags.JAR_WHITELIST) && type.is(EntityTags.JAR_BLACKLIST))) {
147+
player.sendSystemMessage(
148+
Component.translatable(stack.getDescriptionId() + ".message.entity_type_denied"));
149+
event.setCancellationResult(InteractionResult.FAIL);
150+
event.setCanceled(true);
151+
return;
152+
}
153+
154+
if (type.is(OccultismTags.Entities.SOUL_GEM_DENY_LIST) && stack.getItem().equals(OccultismItems.SOUL_GEM_ITEM.get())) {
155+
player.sendSystemMessage(
156+
Component.translatable(stack.getDescriptionId() + ".message.entity_type_denied"));
157+
event.setCancellationResult(InteractionResult.FAIL);
158+
event.setCanceled(true);
159+
return;
160+
}
161+
162+
if (type.is(OccultismTags.Entities.TRINITY_GEM_DENY_LIST) && stack.getItem().equals(OccultismItems.TRINITY_GEM_ITEM.get())) {
163+
player.sendSystemMessage(
164+
Component.translatable(stack.getDescriptionId() + ".message.entity_type_denied"));
165+
event.setCancellationResult(InteractionResult.FAIL);
166+
event.setCanceled(true);
167+
return;
168+
}
169+
170+
var entityData = new CompoundTag();
171+
var id = jarEntity.getEncodeId();
172+
if (id != null) {
173+
entityData.putString("id", id);
174+
}
175+
176+
entityData = jarEntity.saveWithoutId(entityData);
177+
stack.set(DataComponents.ENTITY_DATA, CustomData.of(entityData));
178+
jar.removeEntity();
179+
180+
event.setCancellationResult(InteractionResult.SUCCESS);
181+
event.setCanceled(true);
182+
} else if (gemData != null && jarEntity == null) {
183+
if (!Config.SERVER.CONTAINMENT_JARS_SOUL_GEM_PLACE.get()) {
184+
return;
185+
}
186+
187+
CompoundTag entityData = stack.get(DataComponents.ENTITY_DATA).getUnsafe();
188+
stack.remove(DataComponents.ENTITY_DATA);
189+
190+
EntityType<?> type = EntityUtil.entityTypeFromNbt(entityData);
191+
192+
if (!type.is(EntityTags.JAR_WHITELIST) && type.is(EntityTags.JAR_BLACKLIST)) {
193+
player.sendSystemMessage(
194+
Component.translatable(stack.getDescriptionId() + ".message.entity_type_denied"));
195+
event.setCancellationResult(InteractionResult.FAIL);
196+
event.setCanceled(true);
197+
}
198+
199+
if (type.is(OccultismTags.Entities.SOUL_GEM_DENY_LIST) && stack.getItem().equals(OccultismItems.SOUL_GEM_ITEM.get())) {
200+
player.sendSystemMessage(
201+
Component.translatable(stack.getDescriptionId() + ".message.entity_type_denied"));
202+
event.setCancellationResult(InteractionResult.FAIL);
203+
event.setCanceled(true);
204+
return;
205+
}
206+
207+
if (type.is(OccultismTags.Entities.TRINITY_GEM_DENY_LIST) && stack.getItem().equals(OccultismItems.TRINITY_GEM_ITEM.get())) {
208+
player.sendSystemMessage(
209+
Component.translatable(stack.getDescriptionId() + ".message.entity_type_denied"));
210+
event.setCancellationResult(InteractionResult.FAIL);
211+
event.setCanceled(true);
212+
return;
213+
}
214+
215+
Entity entity = type.create(level);
216+
if (entity == null) {
217+
event.setCancellationResult(InteractionResult.FAIL);
218+
event.setCanceled(true);
219+
return;
220+
}
221+
222+
entity.load(entityData);
223+
jar.setEntityData(entity);
224+
225+
event.setCancellationResult(InteractionResult.SUCCESS);
226+
event.setCanceled(true);
227+
}
228+
}
229+
105230
}

0 commit comments

Comments
 (0)