diff --git a/src/main/generated/data/minecraft/advancement/acesbs/root.json b/src/main/generated/data/minecraft/advancement/acesbs/root.json new file mode 100644 index 0000000..385871f --- /dev/null +++ b/src/main/generated/data/minecraft/advancement/acesbs/root.json @@ -0,0 +1,24 @@ +{ + "criteria": { + "tick": { + "trigger": "minecraft:tick" + } + }, + "display": { + "announce_to_chat": false, + "background": "minecraft:textures/block/stone.png", + "description": "Advancements for Ace's BS", + "icon": { + "count": 1, + "id": "minecraft:diamond" + }, + "show_toast": false, + "title": "Ace's BS" + }, + "requirements": [ + [ + "tick" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/advancement/acesbs/test.json b/src/main/generated/data/minecraft/advancement/acesbs/test.json new file mode 100644 index 0000000..5f46d1c --- /dev/null +++ b/src/main/generated/data/minecraft/advancement/acesbs/test.json @@ -0,0 +1,29 @@ +{ + "parent": "minecraft:acesbs/root", + "criteria": { + "iron": { + "conditions": { + "items": [ + { + "items": "minecraft:iron_ingot" + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "display": { + "description": "Test advancement", + "icon": { + "count": 1, + "id": "minecraft:iron_ingot" + }, + "title": "Test" + }, + "requirements": [ + [ + "iron" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/main/java/com/acethewildfire/acesbs/AcesBS.java b/src/main/java/com/acethewildfire/acesbs/AcesBS.java index 1ec5d33..4f284a7 100644 --- a/src/main/java/com/acethewildfire/acesbs/AcesBS.java +++ b/src/main/java/com/acethewildfire/acesbs/AcesBS.java @@ -15,6 +15,7 @@ import com.acethewildfire.acesbs.recipe.ModRecipies; import com.acethewildfire.acesbs.screen.ModScreenHandlers; import com.acethewildfire.acesbs.sounds.ModSounds; import com.acethewildfire.acesbs.util.HammerUsageEvent; +import com.acethewildfire.acesbs.util.ModStats; import com.acethewildfire.acesbs.util.UpdateRecipies; import com.acethewildfire.acesbs.util.YouMonsterEvent; import com.acethewildfire.acesbs.world.gen.ModWorldGeneration; @@ -59,6 +60,7 @@ public class AcesBS implements ModInitializer { ModScreenHandlers.registerScreenHandlers(); ModRecipies.registerRecipes(); ModParticles.registerModParticles(); + ModStats.registerStats(); ModDataComponentTypes.registerDataComponentsTypes(); diff --git a/src/main/java/com/acethewildfire/acesbs/AcesBSDataGenerator.java b/src/main/java/com/acethewildfire/acesbs/AcesBSDataGenerator.java index a080281..7662005 100644 --- a/src/main/java/com/acethewildfire/acesbs/AcesBSDataGenerator.java +++ b/src/main/java/com/acethewildfire/acesbs/AcesBSDataGenerator.java @@ -22,6 +22,7 @@ public class AcesBSDataGenerator implements DataGeneratorEntrypoint { pack.addProvider(ModModelProvider::new); pack.addProvider(ModRecipeProvider::new); pack.addProvider(ModRegistryDataGenerator::new); + pack.addProvider(ModAdvancementProvider::new); } @Override diff --git a/src/main/java/com/acethewildfire/acesbs/TODO.txt b/src/main/java/com/acethewildfire/acesbs/TODO.txt index 9a3ddec..bc07c10 100644 --- a/src/main/java/com/acethewildfire/acesbs/TODO.txt +++ b/src/main/java/com/acethewildfire/acesbs/TODO.txt @@ -24,8 +24,6 @@ X Bricked Up (Brick + End-tropy) X Stomach grumble X Fart reverb and shoot into sky X Infernal Beef (Mob/Ashes + Cooked Beef) -- Hyper Stimulants (Hyper Sugar) -- Narcan (Stimulants + Entropic Eviscerator) O Tobacco (Makes you sick) - Cigarette (Speed for 5, slow for 5, 30 of jittery) (Acheivements) (Stats) - Cigarette (Funny) (Blows inordinate amounts of smoke) diff --git a/src/main/java/com/acethewildfire/acesbs/datagen/ModAdvancementProvider.java b/src/main/java/com/acethewildfire/acesbs/datagen/ModAdvancementProvider.java new file mode 100644 index 0000000..345a32d --- /dev/null +++ b/src/main/java/com/acethewildfire/acesbs/datagen/ModAdvancementProvider.java @@ -0,0 +1,43 @@ +package com.acethewildfire.acesbs.datagen; + +import com.acethewildfire.acesbs.item.ModItems; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricAdvancementProvider; +import net.minecraft.advancement.Advancement; +import net.minecraft.advancement.AdvancementEntry; +import net.minecraft.advancement.AdvancementFrame; +import net.minecraft.advancement.criterion.ImpossibleCriterion; +import net.minecraft.advancement.criterion.InventoryChangedCriterion; +import net.minecraft.advancement.criterion.TickCriterion; +import net.minecraft.item.Items; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; + +public class ModAdvancementProvider extends FabricAdvancementProvider { + + + public ModAdvancementProvider(FabricDataOutput output, CompletableFuture registryLookup) { + super(output, registryLookup); + } + + @Override + public void generateAdvancement(RegistryWrapper.WrapperLookup wrapperLookup, Consumer consumer) { + AdvancementEntry root = Advancement.Builder.create() + .display( + Items.DIAMOND, + Text.literal("Ace's BS"), + Text.literal("Advancements for Ace's BS"), + Identifier.ofVanilla("textures/block/stone.png"), + AdvancementFrame.TASK, + false, + false, + false + ) + .criterion("tick", TickCriterion.Conditions.createTick()) + .build(consumer, "acesbs/root"); + } +} diff --git a/src/main/java/com/acethewildfire/acesbs/item/ModItems.java b/src/main/java/com/acethewildfire/acesbs/item/ModItems.java index 49c32d2..95c8e6c 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/ModItems.java +++ b/src/main/java/com/acethewildfire/acesbs/item/ModItems.java @@ -8,10 +8,7 @@ import com.acethewildfire.acesbs.potion.ModPotions; import com.acethewildfire.acesbs.sounds.ModSounds; import net.minecraft.client.gui.screen.Screen; import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.AttributeModifierSlot; -import net.minecraft.component.type.AttributeModifiersComponent; -import net.minecraft.component.type.LoreComponent; -import net.minecraft.component.type.PotionContentsComponent; +import net.minecraft.component.type.*; import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.*; diff --git a/src/main/java/com/acethewildfire/acesbs/item/custom/Cigarette.java b/src/main/java/com/acethewildfire/acesbs/item/custom/Cigarette.java index 6fbae02..47d7e44 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/custom/Cigarette.java +++ b/src/main/java/com/acethewildfire/acesbs/item/custom/Cigarette.java @@ -2,21 +2,27 @@ package com.acethewildfire.acesbs.item.custom; import com.acethewildfire.acesbs.component.ModDataComponentTypes; import com.acethewildfire.acesbs.effect.ModEffects; +import com.acethewildfire.acesbs.item.ModItems; +import com.acethewildfire.acesbs.util.ModStats; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.particle.ParticleTypes; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import static com.acethewildfire.acesbs.util.ModStats.grantAdvancement; + public class Cigarette extends Item { public Cigarette(Settings settings) { super(settings); @@ -50,7 +56,7 @@ public class Cigarette extends Item { @Override public int getMaxUseTime(ItemStack stack, LivingEntity user) { - return 50; // basically infinite hold + return 50; } @Override @@ -113,7 +119,22 @@ public class Cigarette extends Item { if (user instanceof PlayerEntity player) { player.getItemCooldownManager().set(this, 2400); stack.decrement(1); + + if (!world.isClient) { + player.incrementStat(ModStats.CIGARETTES_USED); + player.incrementStat(Stats.USED.getOrCreateStat(ModItems.CIGARETTE)); + if (player instanceof ServerPlayerEntity s_player){ + int uses = s_player.getStatHandler().getStat(Stats.CUSTOM.getOrCreateStat(ModStats.CIGARETTES_USED)); + + if (uses >= 500) { + grantAdvancement(s_player, "500_cigarettes"); + } + } + } } + + + return stack; } } diff --git a/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteFunny.java b/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteFunny.java index 4adc11a..96b921e 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteFunny.java +++ b/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteFunny.java @@ -1,9 +1,12 @@ package com.acethewildfire.acesbs.item.custom; +import com.acethewildfire.acesbs.AcesBS; import com.acethewildfire.acesbs.component.ModDataComponentTypes; import com.acethewildfire.acesbs.effect.ModEffects; +import com.acethewildfire.acesbs.item.ModItems; import com.acethewildfire.acesbs.sounds.ModSounds; import com.acethewildfire.acesbs.sounds.PlayerAttachedSound; +import com.acethewildfire.acesbs.util.ModStats; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffectInstance; @@ -11,14 +14,18 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.particle.ParticleTypes; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import static com.acethewildfire.acesbs.util.ModStats.grantAdvancement; + public class CigaretteFunny extends Item { public CigaretteFunny(Settings settings) { super(settings); @@ -46,6 +53,20 @@ public class CigaretteFunny extends Item { activeSound = null; } + if (user instanceof PlayerEntity player) { + if (!world.isClient) { + player.incrementStat(ModStats.CIGARETTES_USED); + player.incrementStat(Stats.USED.getOrCreateStat(ModItems.CIGARETTE_FUNNY)); + if (player instanceof ServerPlayerEntity s_player){ + int uses = s_player.getStatHandler().getStat(Stats.CUSTOM.getOrCreateStat(ModStats.CIGARETTES_USED)); + + if (uses >= 500) { + grantAdvancement(s_player, AcesBS.MOD_ID + "/memes/500_cigarettes"); + } + } + } + } + stack.set(ModDataComponentTypes.SMOKING, false); } @@ -130,6 +151,10 @@ public class CigaretteFunny extends Item { if (user instanceof PlayerEntity player) { player.getItemCooldownManager().set(this, 2400); stack.decrement(1); + + if (!world.isClient) { + player.incrementStat(ModStats.CIGARETTES_USED); + } } return stack; } diff --git a/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteLemon.java b/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteLemon.java index 506b0e7..8e01003 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteLemon.java +++ b/src/main/java/com/acethewildfire/acesbs/item/custom/CigaretteLemon.java @@ -1,14 +1,18 @@ package com.acethewildfire.acesbs.item.custom; import com.acethewildfire.acesbs.component.ModDataComponentTypes; +import com.acethewildfire.acesbs.item.ModItems; +import com.acethewildfire.acesbs.util.ModStats; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.particle.ParticleTypes; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import net.minecraft.util.UseAction; @@ -16,6 +20,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraft.world.explosion.Explosion; +import static com.acethewildfire.acesbs.util.ModStats.grantAdvancement; + public class CigaretteLemon extends Item { public CigaretteLemon(Settings settings) { super(settings); @@ -139,6 +145,19 @@ public class CigaretteLemon extends Item { if (user instanceof PlayerEntity player) { player.getItemCooldownManager().set(this, 2400); stack.decrement(1); + + if (!world.isClient) { + player.incrementStat(ModStats.CIGARETTES_USED); + player.incrementStat(Stats.USED.getOrCreateStat(ModItems.CIGARETTE_LEMON)); + } + + if (player instanceof ServerPlayerEntity s_player){ + int uses = s_player.getStatHandler().getStat(Stats.CUSTOM.getOrCreateStat(ModStats.CIGARETTES_USED)); + + if (uses >= 500) { + grantAdvancement(s_player, "500_cigarettes"); + } + } } return stack; } diff --git a/src/main/java/com/acethewildfire/acesbs/item/custom/SovsPlateCarrierArmorItem.java b/src/main/java/com/acethewildfire/acesbs/item/custom/SovsPlateCarrierArmorItem.java index f2c9344..ae45cb5 100644 --- a/src/main/java/com/acethewildfire/acesbs/item/custom/SovsPlateCarrierArmorItem.java +++ b/src/main/java/com/acethewildfire/acesbs/item/custom/SovsPlateCarrierArmorItem.java @@ -1,5 +1,7 @@ package com.acethewildfire.acesbs.item.custom; +import com.acethewildfire.acesbs.item.ModItems; +import com.acethewildfire.acesbs.item.PrismaSteelItems; import net.minecraft.entity.Entity; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; @@ -7,6 +9,7 @@ import net.minecraft.item.ArmorItem; import net.minecraft.item.ArmorMaterial; import net.minecraft.item.ItemStack; import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; public class SovsPlateCarrierArmorItem extends ArmorItem { @@ -14,7 +17,21 @@ public class SovsPlateCarrierArmorItem extends ArmorItem { super(material, type, settings); } + @Override + public boolean isItemBarVisible(ItemStack stack) { + return true; + } + @Override + public int getItemBarStep(ItemStack stack) { + return Math.round(13.0F * (1.0F - (float) stack.getDamage() / stack.getMaxDamage())); + } + + @Override + public int getItemBarColor(ItemStack stack) { + float f = Math.max(0.0F, ((float) stack.getMaxDamage() - stack.getDamage()) / stack.getMaxDamage()); + return MathHelper.hsvToRgb(f / 3.0F, 1.0F, 1.0F); + } public static float getDamageMultiplier(ItemStack stack) { float durabilityRatio = diff --git a/src/main/java/com/acethewildfire/acesbs/mixin/ItemStackMixin.java b/src/main/java/com/acethewildfire/acesbs/mixin/ItemStackMixin.java index 12b534c..75cb638 100644 --- a/src/main/java/com/acethewildfire/acesbs/mixin/ItemStackMixin.java +++ b/src/main/java/com/acethewildfire/acesbs/mixin/ItemStackMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ItemStack.class) public abstract class ItemStackMixin { - @Inject(method = "damage*", at = @At("HEAD"), cancellable = true) + @Inject(method = "damage", at = @At("HEAD"), cancellable = true) private void preventChestplateBreak( int amount, LivingEntity entity, diff --git a/src/main/java/com/acethewildfire/acesbs/mixin/PlayerEntityMixin.java b/src/main/java/com/acethewildfire/acesbs/mixin/PlayerEntityMixin.java index 7fde898..f30a558 100644 --- a/src/main/java/com/acethewildfire/acesbs/mixin/PlayerEntityMixin.java +++ b/src/main/java/com/acethewildfire/acesbs/mixin/PlayerEntityMixin.java @@ -1,10 +1,13 @@ package com.acethewildfire.acesbs.mixin; import com.acethewildfire.acesbs.item.ModItems; +import com.acethewildfire.acesbs.item.custom.SovsPlateCarrierArmorItem; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; @@ -14,6 +17,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -38,5 +42,31 @@ public abstract class PlayerEntityMixin{ } cir.setReturnValue(true); } + + PlayerEntity player = (PlayerEntity)(Object)this; + + ItemStack chest = player.getEquippedStack(EquipmentSlot.CHEST); + + if (chest.getItem() instanceof SovsPlateCarrierArmorItem) { + + int durabilityDamage = 1; + + chest.setDamage(Math.min( + chest.getDamage() + durabilityDamage, + chest.getMaxDamage() - 1 + )); + } + } + + @Inject(method = "damageArmor", at = @At("HEAD"), cancellable = true) + private void stopVanillaArmorDamage(DamageSource source, float amount, CallbackInfo ci) { + + PlayerEntity player = (PlayerEntity)(Object)this; + + ItemStack chest = player.getEquippedStack(EquipmentSlot.CHEST); + + if (chest.getItem() instanceof SovsPlateCarrierArmorItem) { + ci.cancel(); // prevent vanilla durability loss + } } } diff --git a/src/main/java/com/acethewildfire/acesbs/util/ModStats.java b/src/main/java/com/acethewildfire/acesbs/util/ModStats.java new file mode 100644 index 0000000..ed7856c --- /dev/null +++ b/src/main/java/com/acethewildfire/acesbs/util/ModStats.java @@ -0,0 +1,51 @@ +package com.acethewildfire.acesbs.util; + +import com.acethewildfire.acesbs.AcesBS; +import com.acethewildfire.acesbs.item.ModItems; +import net.minecraft.advancement.Advancement; +import net.minecraft.advancement.AdvancementEntry; +import net.minecraft.advancement.AdvancementProgress; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.stat.StatFormatter; +import net.minecraft.stat.Stats; +import net.minecraft.util.Identifier; + +import java.util.Objects; + +public class ModStats { + + public static final Identifier CIGARETTES_USED = createStat(Identifier.of(AcesBS.MOD_ID, "cigarettes_used")); + + public static Identifier createStat(Identifier id){ + Registry.register(Registries.CUSTOM_STAT, id, id); + Stats.CUSTOM.getOrCreateStat(id, StatFormatter.DEFAULT); + + return id; + } + + public static void grantAdvancement(ServerPlayerEntity player, String id) { + + AdvancementEntry advancement = + Objects.requireNonNull(player.getServer()).getAdvancementLoader().get(Identifier.ofVanilla(id)); + + if (advancement == null) { + AcesBS.LOGGER.info("Granting null"); + return; + }; + + AcesBS.LOGGER.info("Granting {}", advancement.toString()); + + AdvancementProgress progress = player.getAdvancementTracker().getProgress(advancement); + + if (!progress.isDone()) { + for (String criterion : progress.getUnobtainedCriteria()) { + player.getAdvancementTracker().grantCriterion(advancement, criterion); + } + } + } + + public static void registerStats() { + } +} diff --git a/src/main/resources/acesbs.mixins.json b/src/main/resources/acesbs.mixins.json index 7b0f6ce..33292f4 100644 --- a/src/main/resources/acesbs.mixins.json +++ b/src/main/resources/acesbs.mixins.json @@ -8,14 +8,13 @@ "CreeperTransformStateMixin", "EntityMixin", "LivingEntityMixin", - "ItemStackMixin", - "ExampleMixin" + "ExampleMixin", + "PlayerEntityMixin" ], "injectors": { "defaultRequire": 1 }, "client": [ - "AbstractClientPlayerEntityMixin", - "PlayerEntityMixin" + "AbstractClientPlayerEntityMixin" ] } \ No newline at end of file diff --git a/src/main/resources/assets/acesbs/lang/en_us.json b/src/main/resources/assets/acesbs/lang/en_us.json index b9740ad..36680ab 100644 --- a/src/main/resources/assets/acesbs/lang/en_us.json +++ b/src/main/resources/assets/acesbs/lang/en_us.json @@ -201,5 +201,7 @@ "effect.acesbs.bricked_up": "Bricked Up", "effect.acesbs.cigarette": "Cigarette", "effect.acesbs.withdrawal": "Withdrawal", - "effect.acesbs.jittery": "Jittery" + "effect.acesbs.jittery": "Jittery", + + "stat.acesbs.cigarettes_used": "Times Used Cigarettes (Any)" } \ No newline at end of file diff --git a/src/main/resources/data/minecraft/advancement/acesbs/memes/500_cigarettes.json b/src/main/resources/data/minecraft/advancement/acesbs/memes/500_cigarettes.json new file mode 100644 index 0000000..b0866dd --- /dev/null +++ b/src/main/resources/data/minecraft/advancement/acesbs/memes/500_cigarettes.json @@ -0,0 +1,22 @@ +{ + "criteria": { + "500_cigarettes": { + "trigger": "minecraft:impossible" + } + }, + "rewards": { + "experience": 50 + }, + "parent": "minecraft:acesbs/root", + "display": { + "icon": { + "id": "acesbs:cigarette" + }, + "title": "Five Hundred Cigarettes", + "description": "Smoke 500 Cigarettes. The sensation is... wonderful!", + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + } +} \ No newline at end of file