Skip to content

Commit

Permalink
cases now spawn in chest loot tables 1/4 times
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMarstonConnell committed Sep 4, 2023
1 parent 5d813cc commit 05dabee
Show file tree
Hide file tree
Showing 12 changed files with 436 additions and 33 deletions.
57 changes: 57 additions & 0 deletions src/main/java/dev/marston/randomloot/CaseModifier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package dev.marston.randomloot;

import org.jetbrains.annotations.NotNull;

import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;

import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.data.PackOutput;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.minecraftforge.common.data.GlobalLootModifierProvider;
import net.minecraftforge.common.loot.IGlobalLootModifier;
import net.minecraftforge.common.loot.LootModifier;
import net.minecraftforge.registries.ForgeRegistries;

public class CaseModifier extends LootModifier {
private final Item item;

public static final Supplier<Codec<CaseModifier>> CODEC = Suppliers.memoize(() -> RecordCodecBuilder.create(
inst -> codecStart(inst).and(ForgeRegistries.ITEMS.getCodec().fieldOf("item").forGetter(m -> m.item))
.apply(inst, CaseModifier::new)));

protected CaseModifier(LootItemCondition[] conditionsIn, Item item) {
super(conditionsIn);
this.item = item;

}

@Override
public Codec<? extends IGlobalLootModifier> codec() {
return CODEC.get();
}

@Override
protected @NotNull ObjectArrayList<ItemStack> doApply(ObjectArrayList<ItemStack> generatedLoot,
LootContext context) {

String path = context.getQueriedLootTableId().getPath() ;


if (!path.contains("chests")) {
return generatedLoot;
}


if (context.getRandom().nextFloat() < 0.25f) {
generatedLoot.add(new ItemStack(item));
}

return generatedLoot;
}
}
21 changes: 21 additions & 0 deletions src/main/java/dev/marston/randomloot/ModLootModifiers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.marston.randomloot;

import net.minecraftforge.common.loot.IGlobalLootModifier;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import com.mojang.serialization.Codec;

public class ModLootModifiers {
public static final DeferredRegister<Codec<? extends IGlobalLootModifier>> LOOT_MODIFIER_SERIALIZERS =
DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, RandomLootMod.MODID);

public static final RegistryObject<Codec<? extends IGlobalLootModifier>> ADD_ITEM =
LOOT_MODIFIER_SERIALIZERS.register("case_item", CaseModifier.CODEC);


public static void register(IEventBus bus) {
LOOT_MODIFIER_SERIALIZERS.register(bus);
}
}
1 change: 1 addition & 0 deletions src/main/java/dev/marston/randomloot/RandomLootMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ public RandomLootMod() {
modEventBus.addListener(this::commonSetup);

// BLOCKS.register(modEventBus);
ModLootModifiers.register(modEventBus);

// CREATIVE_MODE_TABS.register(modEventBus);

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/dev/marston/randomloot/loot/LootCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ public class LootCase extends Item {
public LootCase() {
super(new Properties().stacksTo(1));
}

@Override
public boolean isFoil(ItemStack stack) {
return true;
}

@Override
public InteractionResult useOn(UseOnContext useContext) {
Expand All @@ -33,6 +38,8 @@ public InteractionResult useOn(UseOnContext useContext) {
return InteractionResult.SUCCESS;
}



@Override
public void appendHoverText(ItemStack stack, @Nullable Level level, List<Component> tipList, TooltipFlag flag) {

Expand Down
178 changes: 168 additions & 10 deletions src/main/java/dev/marston/randomloot/loot/LootItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

import javax.annotation.Nullable;

import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;

import dev.marston.randomloot.loot.modifiers.BlockBreakModifier;
import dev.marston.randomloot.loot.modifiers.EntityHurtModifier;
import dev.marston.randomloot.loot.modifiers.Modifier;
import dev.marston.randomloot.loot.modifiers.UseModifier;
import net.minecraft.ChatFormatting;
Expand All @@ -22,6 +26,9 @@
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
Expand All @@ -34,17 +41,81 @@

public class LootItem extends Item {
public static enum ToolType {
PICKAXE, SHOVEL, AXE, SWORD, NULL
PICKAXE, SHOVEL, AXE, SWORD, NULL;

@Override
public String toString() {
switch (this) {
case PICKAXE:
return "Pickaxe";
case SHOVEL:
return "Shovel";
case AXE:
return "Axe";
case SWORD:
return "Sword";
default:
return "Null";
}
}
}

public LootItem() {
super(new Properties().stacksTo(1).durability(100));
}

public static float getDigSpeed(ItemStack stack) {
public static float getDigSpeed(ItemStack stack, ToolType type) {

if (type.equals(ToolType.SWORD)) {
return 1.0f;
}

float speed = (LootUtils.getStats(stack) / 2.0f) + 6.0f;
return speed;
}

public static float getAttackSpeed(ItemStack stack, ToolType type) {

float speed = 0.0f;

switch (type) {
case PICKAXE:
speed = -2.8F;
break;
case AXE:
speed = -3.0F;
break;
case SHOVEL:
speed = -3.0F;
break;
case SWORD:
speed = -2.4F;
break;
}


return speed;
}

public static float getAttackDamage(ItemStack stack, ToolType type) {

float damage = (LootUtils.getStats(stack)) + 1.0f;

switch (type) {
case PICKAXE:
damage = damage * 0.5f;
break;
case AXE:
damage = damage * 1.2f;
break;
case SHOVEL:
damage = damage * 0.6f;
break;
}


return damage;
}

@Override
public float getDestroySpeed(ItemStack stack, BlockState block) {
Expand All @@ -55,9 +126,15 @@ public float getDestroySpeed(ItemStack stack, BlockState block) {

if (type == ToolType.PICKAXE) {
blocks = BlockTags.MINEABLE_WITH_PICKAXE;
} else if (type == ToolType.AXE) {
blocks = BlockTags.MINEABLE_WITH_AXE;
} else if (type == ToolType.SHOVEL) {
blocks = BlockTags.MINEABLE_WITH_SHOVEL;
} else {
return 1.0f;
}

return block.is(blocks) ? getDigSpeed(stack) : 1.0F;
return block.is(blocks) ? getDigSpeed(stack, type) : 1.0F;
}

@Override
Expand All @@ -69,11 +146,62 @@ public boolean isCorrectToolForDrops(ItemStack stack, BlockState state) {

if (type == ToolType.PICKAXE) {
blocks = BlockTags.MINEABLE_WITH_PICKAXE;
} else if (type == ToolType.SHOVEL) {
blocks = BlockTags.MINEABLE_WITH_SHOVEL;
} else if (type == ToolType.AXE) {
blocks = BlockTags.MINEABLE_WITH_AXE;
} else {
return false;
}

return state.is(blocks)
&& net.minecraftforge.common.TierSortingRegistry.isCorrectTierForDrops(Tiers.DIAMOND, state);
}

@Override
public Multimap<Attribute, AttributeModifier> getAttributeModifiers(EquipmentSlot slot, ItemStack stack)
{

if (!slot.equals(EquipmentSlot.MAINHAND)) {
return super.getAttributeModifiers(slot, stack);
}

ToolType tt = LootUtils.getToolType(stack);

float damage = getAttackDamage(stack, tt);

ImmutableMultimap.Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
builder.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(BASE_ATTACK_DAMAGE_UUID, "Weapon modifier", (double)damage, AttributeModifier.Operation.ADDITION));
builder.put(Attributes.ATTACK_SPEED, new AttributeModifier(BASE_ATTACK_SPEED_UUID, "Weapon modifier", (double)getAttackSpeed(stack, tt), AttributeModifier.Operation.ADDITION));

return builder.build();
}

@Override
public boolean hurtEnemy(ItemStack itemstack, LivingEntity p_43279_, LivingEntity p_43280_) {

ToolType type = LootUtils.getToolType(itemstack);

if (type == ToolType.AXE || type == ToolType.SWORD) {
LootUtils.addXp(itemstack, 1);

}

List<Modifier> mods = LootUtils.getModifiers(itemstack);

for (Modifier mod : mods) {
if (mod instanceof EntityHurtModifier) {
EntityHurtModifier ehm = (EntityHurtModifier) mod;

ehm.hurtEnemy(itemstack, p_43279_, p_43280_);
}
}

itemstack.hurtAndBreak(1, p_43280_, (p_43296_) -> {
p_43296_.broadcastBreakEvent(EquipmentSlot.MAINHAND);
});
return true;
}

@Override
public boolean mineBlock(ItemStack stack, Level level, BlockState blockState, BlockPos pos, LivingEntity player) {
Expand Down Expand Up @@ -109,6 +237,14 @@ public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, Player playe

return super.onBlockStartBreak(itemstack, pos, player);
}

@Override
public int getMaxDamage(ItemStack stack)
{
float stats = (LootUtils.getStats(stack) + 10.0f) * 80.0f;

return (int) stats;
}

@Override
public InteractionResult useOn(UseOnContext ctx) {
Expand Down Expand Up @@ -146,6 +282,14 @@ private void newLine(List<Component> tipList) {
public void appendHoverText(ItemStack item, @Nullable Level level, List<Component> tipList, TooltipFlag flag) {

boolean show = Screen.hasShiftDown();

boolean showDescription = Screen.hasControlDown();

ToolType tt = LootUtils.getToolType(item);

if (show) {
tipList.add(makeComp(tt.toString(), ChatFormatting.BLUE));
}

MutableComponent desc = makeComp(LootUtils.getItemLore(item), ChatFormatting.GRAY);
tipList.add(desc);
Expand Down Expand Up @@ -179,22 +323,36 @@ public int compare(final Modifier object1, final Modifier object2) {
tipList.add(detailComp);
}
}
if (showDescription) {
MutableComponent detailComp = makeComp("", ChatFormatting.GRAY);
detailComp.append(modifier.description());
tipList.add(detailComp);
}
}

if (show) {
newLine(tipList);

float digSpeed = LootItem.getDigSpeed(item);
float digSpeed = LootItem.getDigSpeed(item, tt);
tipList.add(makeComp(String.format("Speed: %.2f", digSpeed), ChatFormatting.GRAY));
}

newLine(tipList);
MutableComponent comp = MutableComponent.create(ComponentContents.EMPTY);
comp.append("[Shift for details]");
comp = comp.withStyle(ChatFormatting.GRAY);
float attackDamage = LootItem.getAttackDamage(item, tt);
tipList.add(makeComp(String.format("Damage: %.2f", attackDamage), ChatFormatting.GRAY));

tipList.add(comp);
}

if (!show && !showDescription){
newLine(tipList);
MutableComponent comp = MutableComponent.create(ComponentContents.EMPTY);
comp.append("[Shift for more]");
comp = comp.withStyle(ChatFormatting.GRAY);
tipList.add(comp);
MutableComponent descComp = MutableComponent.create(ComponentContents.EMPTY);
descComp.append("[Ctrl for trait info]");
descComp = descComp.withStyle(ChatFormatting.GRAY);
tipList.add(descComp);

}
}

}
Loading

0 comments on commit 05dabee

Please sign in to comment.