I have a problem, I am trying to put two different effects to two different armors but when I run it only the emerald armor effect works. This is the code
public class ModArmorItem extends ArmorItem{
private static final Map<ArmorMaterial, MobEffectInstance> MATERIAL_TO_EFFECT_MAP =
(new ImmutableMap.Builder<ArmorMaterial, MobEffectInstance>())
.put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE,200, 1,false,false, true))
.put(ModArmorMaterials.OBSIDIAN, new MobEffectInstance(MobEffects.FIRE_RESISTANCE,200, 1,false,false, true)).build();
public ModArmorItem(ArmorMaterial pMaterial, Type pType, Properties pProperties) {
super(pMaterial, pType, pProperties);
}
@Override
public void onArmorTick(ItemStack stack, Level world, Player player){
if (!world.isClientSide()) {
if (hasFullSuitOfArmorOn(player)) {
evaluateArmorEffects(player);
}
}
}
private void evaluateArmorEffects(Player player) {
for (Map.Entry<ArmorMaterial,MobEffectInstance> entry : MATERIAL_TO_EFFECT_MAP.entrySet()){
ArmorMaterial mapArmorMaterial = entry.getKey();
MobEffectInstance mapStatusEffect = entry.getValue();
if (hasCorrectArmorOn(mapArmorMaterial, player)) {
addStatusEffectForMaterial(player, mapArmorMaterial, mapStatusEffect);
}
}
}
private void addStatusEffectForMaterial(Player player, ArmorMaterial mapArmorMaterial, MobEffectInstance mapStatusEffect) {
boolean hasPlayerEffect = player.hasEffect(mapStatusEffect.getEffect());
if (hasCorrectArmorOn(mapArmorMaterial, player) && !hasPlayerEffect) {
player.addEffect(new MobEffectInstance(mapStatusEffect));
}
}
private boolean hasCorrectArmorOn(ArmorMaterial material, Player player) {
for (ItemStack armorStack : player.getInventory().armor){
if (!(armorStack.getItem() instanceof ArmorItem)) {
return false;
}
}
ArmorItem helmet = ((ArmorItem)player.getInventory().getArmor(3).getItem());
ArmorItem breastplace = ((ArmorItem)player.getInventory().getArmor(2).getItem());
ArmorItem leggins = ((ArmorItem)player.getInventory().getArmor(1).getItem());
ArmorItem boots = ((ArmorItem)player.getInventory().getArmor(0).getItem());
return helmet.getMaterial() == material && breastplace.getMaterial() == material && leggins.getMaterial() == material && boots.getMaterial() == material;
}
private boolean hasFullSuitOfArmorOn(Player player){
ItemStack helmet = player.getInventory().getArmor(3);
ItemStack breastplace = player.getInventory().getArmor(2);
ItemStack leggins = player.getInventory().getArmor(1);
ItemStack boots = player.getInventory().getArmor(0);
return !helmet.isEmpty() && !breastplace.isEmpty() && !leggins.isEmpty() && !boots.isEmpty();
}
}
Also when I place two effects on the same armor, the game crashes. Here is the crash file.
The code is the same, only this part is different
private static final Map<ArmorMaterial, MobEffectInstance> MATERIAL_TO_EFFECT_MAP =
(new ImmutableMap.Builder<ArmorMaterial, MobEffectInstance>())
.put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE,200, 1,false,false, true))
.put(ModArmorMaterials.EMERALD, new MobEffectInstance(MobEffects.FIRE_RESISTANCE,200, 1,false,false, true)).build();
I hope you guys can help me. Thanks.