This commit is contained in:
Vos
2026-03-11 00:08:20 -05:00
parent 5439c73f99
commit 1449c553f8
17 changed files with 293 additions and 13 deletions
@@ -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
}
@@ -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
}
@@ -15,6 +15,7 @@ import com.acethewildfire.acesbs.recipe.ModRecipies;
import com.acethewildfire.acesbs.screen.ModScreenHandlers; import com.acethewildfire.acesbs.screen.ModScreenHandlers;
import com.acethewildfire.acesbs.sounds.ModSounds; import com.acethewildfire.acesbs.sounds.ModSounds;
import com.acethewildfire.acesbs.util.HammerUsageEvent; import com.acethewildfire.acesbs.util.HammerUsageEvent;
import com.acethewildfire.acesbs.util.ModStats;
import com.acethewildfire.acesbs.util.UpdateRecipies; import com.acethewildfire.acesbs.util.UpdateRecipies;
import com.acethewildfire.acesbs.util.YouMonsterEvent; import com.acethewildfire.acesbs.util.YouMonsterEvent;
import com.acethewildfire.acesbs.world.gen.ModWorldGeneration; import com.acethewildfire.acesbs.world.gen.ModWorldGeneration;
@@ -59,6 +60,7 @@ public class AcesBS implements ModInitializer {
ModScreenHandlers.registerScreenHandlers(); ModScreenHandlers.registerScreenHandlers();
ModRecipies.registerRecipes(); ModRecipies.registerRecipes();
ModParticles.registerModParticles(); ModParticles.registerModParticles();
ModStats.registerStats();
ModDataComponentTypes.registerDataComponentsTypes(); ModDataComponentTypes.registerDataComponentsTypes();
@@ -22,6 +22,7 @@ public class AcesBSDataGenerator implements DataGeneratorEntrypoint {
pack.addProvider(ModModelProvider::new); pack.addProvider(ModModelProvider::new);
pack.addProvider(ModRecipeProvider::new); pack.addProvider(ModRecipeProvider::new);
pack.addProvider(ModRegistryDataGenerator::new); pack.addProvider(ModRegistryDataGenerator::new);
pack.addProvider(ModAdvancementProvider::new);
} }
@Override @Override
@@ -24,8 +24,6 @@ X Bricked Up (Brick + End-tropy)
X Stomach grumble X Stomach grumble
X Fart reverb and shoot into sky X Fart reverb and shoot into sky
X Infernal Beef (Mob/Ashes + Cooked Beef) X Infernal Beef (Mob/Ashes + Cooked Beef)
- Hyper Stimulants (Hyper Sugar)
- Narcan (Stimulants + Entropic Eviscerator)
O Tobacco (Makes you sick) O Tobacco (Makes you sick)
- Cigarette (Speed for 5, slow for 5, 30 of jittery) (Acheivements) (Stats) - Cigarette (Speed for 5, slow for 5, 30 of jittery) (Acheivements) (Stats)
- Cigarette (Funny) (Blows inordinate amounts of smoke) - Cigarette (Funny) (Blows inordinate amounts of smoke)
@@ -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<RegistryWrapper.WrapperLookup> registryLookup) {
super(output, registryLookup);
}
@Override
public void generateAdvancement(RegistryWrapper.WrapperLookup wrapperLookup, Consumer<AdvancementEntry> 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");
}
}
@@ -8,10 +8,7 @@ import com.acethewildfire.acesbs.potion.ModPotions;
import com.acethewildfire.acesbs.sounds.ModSounds; import com.acethewildfire.acesbs.sounds.ModSounds;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.AttributeModifierSlot; import net.minecraft.component.type.*;
import net.minecraft.component.type.AttributeModifiersComponent;
import net.minecraft.component.type.LoreComponent;
import net.minecraft.component.type.PotionContentsComponent;
import net.minecraft.entity.attribute.EntityAttributeModifier; import net.minecraft.entity.attribute.EntityAttributeModifier;
import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.item.*; import net.minecraft.item.*;
@@ -2,21 +2,27 @@ package com.acethewildfire.acesbs.item.custom;
import com.acethewildfire.acesbs.component.ModDataComponentTypes; import com.acethewildfire.acesbs.component.ModDataComponentTypes;
import com.acethewildfire.acesbs.effect.ModEffects; 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.LivingEntity;
import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.stat.Stats;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.UseAction; import net.minecraft.util.UseAction;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import static com.acethewildfire.acesbs.util.ModStats.grantAdvancement;
public class Cigarette extends Item { public class Cigarette extends Item {
public Cigarette(Settings settings) { public Cigarette(Settings settings) {
super(settings); super(settings);
@@ -50,7 +56,7 @@ public class Cigarette extends Item {
@Override @Override
public int getMaxUseTime(ItemStack stack, LivingEntity user) { public int getMaxUseTime(ItemStack stack, LivingEntity user) {
return 50; // basically infinite hold return 50;
} }
@Override @Override
@@ -113,7 +119,22 @@ public class Cigarette extends Item {
if (user instanceof PlayerEntity player) { if (user instanceof PlayerEntity player) {
player.getItemCooldownManager().set(this, 2400); player.getItemCooldownManager().set(this, 2400);
stack.decrement(1); 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; return stack;
} }
} }
@@ -1,9 +1,12 @@
package com.acethewildfire.acesbs.item.custom; package com.acethewildfire.acesbs.item.custom;
import com.acethewildfire.acesbs.AcesBS;
import com.acethewildfire.acesbs.component.ModDataComponentTypes; import com.acethewildfire.acesbs.component.ModDataComponentTypes;
import com.acethewildfire.acesbs.effect.ModEffects; import com.acethewildfire.acesbs.effect.ModEffects;
import com.acethewildfire.acesbs.item.ModItems;
import com.acethewildfire.acesbs.sounds.ModSounds; import com.acethewildfire.acesbs.sounds.ModSounds;
import com.acethewildfire.acesbs.sounds.PlayerAttachedSound; import com.acethewildfire.acesbs.sounds.PlayerAttachedSound;
import com.acethewildfire.acesbs.util.ModStats;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffectInstance; 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.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.stat.Stats;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.UseAction; import net.minecraft.util.UseAction;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import static com.acethewildfire.acesbs.util.ModStats.grantAdvancement;
public class CigaretteFunny extends Item { public class CigaretteFunny extends Item {
public CigaretteFunny(Settings settings) { public CigaretteFunny(Settings settings) {
super(settings); super(settings);
@@ -46,6 +53,20 @@ public class CigaretteFunny extends Item {
activeSound = null; 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); stack.set(ModDataComponentTypes.SMOKING, false);
} }
@@ -130,6 +151,10 @@ public class CigaretteFunny extends Item {
if (user instanceof PlayerEntity player) { if (user instanceof PlayerEntity player) {
player.getItemCooldownManager().set(this, 2400); player.getItemCooldownManager().set(this, 2400);
stack.decrement(1); stack.decrement(1);
if (!world.isClient) {
player.incrementStat(ModStats.CIGARETTES_USED);
}
} }
return stack; return stack;
} }
@@ -1,14 +1,18 @@
package com.acethewildfire.acesbs.item.custom; package com.acethewildfire.acesbs.item.custom;
import com.acethewildfire.acesbs.component.ModDataComponentTypes; 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.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.particle.ParticleTypes; import net.minecraft.particle.ParticleTypes;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.stat.Stats;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult; import net.minecraft.util.TypedActionResult;
import net.minecraft.util.UseAction; import net.minecraft.util.UseAction;
@@ -16,6 +20,8 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.explosion.Explosion; import net.minecraft.world.explosion.Explosion;
import static com.acethewildfire.acesbs.util.ModStats.grantAdvancement;
public class CigaretteLemon extends Item { public class CigaretteLemon extends Item {
public CigaretteLemon(Settings settings) { public CigaretteLemon(Settings settings) {
super(settings); super(settings);
@@ -139,6 +145,19 @@ public class CigaretteLemon extends Item {
if (user instanceof PlayerEntity player) { if (user instanceof PlayerEntity player) {
player.getItemCooldownManager().set(this, 2400); player.getItemCooldownManager().set(this, 2400);
stack.decrement(1); 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; return stack;
} }
@@ -1,5 +1,7 @@
package com.acethewildfire.acesbs.item.custom; 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.Entity;
import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
@@ -7,6 +9,7 @@ import net.minecraft.item.ArmorItem;
import net.minecraft.item.ArmorMaterial; import net.minecraft.item.ArmorMaterial;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
public class SovsPlateCarrierArmorItem extends ArmorItem { public class SovsPlateCarrierArmorItem extends ArmorItem {
@@ -14,7 +17,21 @@ public class SovsPlateCarrierArmorItem extends ArmorItem {
super(material, type, settings); 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) { public static float getDamageMultiplier(ItemStack stack) {
float durabilityRatio = float durabilityRatio =
@@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ItemStack.class) @Mixin(ItemStack.class)
public abstract class ItemStackMixin { public abstract class ItemStackMixin {
@Inject(method = "damage*", at = @At("HEAD"), cancellable = true) @Inject(method = "damage", at = @At("HEAD"), cancellable = true)
private void preventChestplateBreak( private void preventChestplateBreak(
int amount, int amount,
LivingEntity entity, LivingEntity entity,
@@ -1,10 +1,13 @@
package com.acethewildfire.acesbs.mixin; package com.acethewildfire.acesbs.mixin;
import com.acethewildfire.acesbs.item.ModItems; 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.damage.DamageSource;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text; 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.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; 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.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@@ -38,5 +42,31 @@ public abstract class PlayerEntityMixin{
} }
cir.setReturnValue(true); 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
}
} }
} }
@@ -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() {
}
}
+3 -4
View File
@@ -8,14 +8,13 @@
"CreeperTransformStateMixin", "CreeperTransformStateMixin",
"EntityMixin", "EntityMixin",
"LivingEntityMixin", "LivingEntityMixin",
"ItemStackMixin", "ExampleMixin",
"ExampleMixin" "PlayerEntityMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1
}, },
"client": [ "client": [
"AbstractClientPlayerEntityMixin", "AbstractClientPlayerEntityMixin"
"PlayerEntityMixin"
] ]
} }
@@ -201,5 +201,7 @@
"effect.acesbs.bricked_up": "Bricked Up", "effect.acesbs.bricked_up": "Bricked Up",
"effect.acesbs.cigarette": "Cigarette", "effect.acesbs.cigarette": "Cigarette",
"effect.acesbs.withdrawal": "Withdrawal", "effect.acesbs.withdrawal": "Withdrawal",
"effect.acesbs.jittery": "Jittery" "effect.acesbs.jittery": "Jittery",
"stat.acesbs.cigarettes_used": "Times Used Cigarettes (Any)"
} }
@@ -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
}
}