57 lines
2.1 KiB
Java
57 lines
2.1 KiB
Java
package com.atsuishio.superbwarfare.perk.functional;
|
|
|
|
import com.atsuishio.superbwarfare.init.ModAttachments;
|
|
import com.atsuishio.superbwarfare.init.ModTags;
|
|
import com.atsuishio.superbwarfare.item.gun.data.GunData;
|
|
import com.atsuishio.superbwarfare.perk.Perk;
|
|
import com.atsuishio.superbwarfare.perk.PerkInstance;
|
|
import com.atsuishio.superbwarfare.tools.DamageTypeTool;
|
|
import com.atsuishio.superbwarfare.tools.InventoryTool;
|
|
import net.minecraft.world.damagesource.DamageSource;
|
|
import net.minecraft.world.entity.LivingEntity;
|
|
import net.minecraft.world.entity.player.Player;
|
|
import net.minecraft.world.entity.projectile.Projectile;
|
|
import net.minecraft.world.item.ItemStack;
|
|
|
|
public class Subsistence extends Perk {
|
|
|
|
public Subsistence() {
|
|
super("subsistence", Perk.Type.FUNCTIONAL);
|
|
}
|
|
|
|
@Override
|
|
public void onKill(GunData data, PerkInstance instance, LivingEntity target, DamageSource source) {
|
|
Player attacker = null;
|
|
if (source.getEntity() instanceof Player player) {
|
|
attacker = player;
|
|
}
|
|
if (source.getDirectEntity() instanceof Projectile p && p.getOwner() instanceof Player player) {
|
|
attacker = player;
|
|
}
|
|
|
|
if (DamageTypeTool.isGunDamage(source) && attacker != null) {
|
|
ItemStack stack = data.stack;
|
|
|
|
float rate = instance.level() * (0.1f + (stack.is(ModTags.Items.SMG) || stack.is(ModTags.Items.RIFLE) ? 0.07f : 0f));
|
|
|
|
var cap = attacker.getData(ModAttachments.PLAYER_VARIABLE).watch();
|
|
|
|
int mag = data.magazine();
|
|
int ammo = data.ammo.get();
|
|
int ammoReload = (int) Math.min(mag, mag * rate);
|
|
int ammoNeed = Math.min(mag - ammo, ammoReload);
|
|
|
|
boolean flag = attacker.isCreative() || InventoryTool.hasCreativeAmmoBox(attacker);
|
|
|
|
int ammoFinal = Math.min(data.countBackupAmmo(attacker), ammoNeed);
|
|
if (flag) {
|
|
ammoFinal = ammoNeed;
|
|
} else {
|
|
data.consumeBackupAmmo(attacker, ammoFinal);
|
|
}
|
|
data.ammo.set(Math.min(mag, ammo + ammoFinal));
|
|
|
|
cap.sync(attacker);
|
|
}
|
|
}
|
|
}
|