Skeleton go pew pew

Also zombie go boom
This commit is contained in:
2024-07-29 23:32:42 +02:00
parent 8d00672806
commit 653171cbb2
17 changed files with 623 additions and 139 deletions

View File

@@ -0,0 +1,83 @@
package systems.brn.plasticgun.mixins;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.mob.ZombieEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.Difficulty;
import net.minecraft.world.LocalDifficulty;
import net.minecraft.world.World;
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 systems.brn.plasticgun.PlasticGun;
import systems.brn.plasticgun.grenades.GrenadeItem;
import java.util.Arrays;
import static systems.brn.plasticgun.PlasticGun.grenades;
import static systems.brn.plasticgun.lib.Util.getDifficultyAdjustedChance;
import static systems.brn.plasticgun.lib.Util.selectWeaponIndex;
@Mixin(ZombieEntity.class)
public abstract class ZombieGrenadeMixin extends MobEntity {
@Shadow
public abstract void tick();
// Constructor required for the Mixin
protected ZombieGrenadeMixin(EntityType<? extends MobEntity> entityType, World world) {
super(entityType, world);
}
@Inject(method = "initEquipment", at = @At("HEAD"), cancellable = true)
protected void initEquipment(Random random, LocalDifficulty localDifficulty, CallbackInfo ci) {
super.initEquipment(random, localDifficulty);
World world = this.getWorld();
int difficultyAdjustedChance = getDifficultyAdjustedChance(localDifficulty, world);
// Equip item based on adjusted chance
if (random.nextInt(difficultyAdjustedChance) == 0) {
int i = random.nextInt(20);
ItemStack stackToEquip;
if (i < 8) {
stackToEquip = new ItemStack(Items.IRON_SWORD);
} else if (i < 14) {
int grenadeIndex = selectWeaponIndex(random, localDifficulty, grenades.size());
stackToEquip = new ItemStack(grenades.get(grenadeIndex));
Arrays.fill(this.handDropChances, 0F);
} else {
stackToEquip = new ItemStack(Items.IRON_SHOVEL);
}
this.equipStack(EquipmentSlot.MAINHAND, stackToEquip);
}
ci.cancel();
}
@Inject(method = "dropEquipment", at = @At("RETURN"))
protected void dropEquipment(ServerWorld world, DamageSource source, boolean causedByPlayer, CallbackInfo ci) {
ItemStack mainHandItem = this.getEquippedStack(EquipmentSlot.MAINHAND);
ItemStack offHandItem = this.getEquippedStack(EquipmentSlot.OFFHAND);
for (GrenadeItem grenadeItem : grenades) {
if (mainHandItem.getItem() == grenadeItem) {
grenadeItem.turnIntoEntity(this, mainHandItem, 0, grenadeItem.explosionTarget);
break;
}
if (offHandItem.getItem() == grenadeItem) {
grenadeItem.turnIntoEntity(this, offHandItem, 0, grenadeItem.explosionTarget);
break;
}
}
}
}