-
Notifications
You must be signed in to change notification settings - Fork 755
/
MeleeHarvestMaterialStatProvider.java
56 lines (50 loc) · 2.81 KB
/
MeleeHarvestMaterialStatProvider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package slimeknights.tconstruct.tools.stats;
import com.google.common.annotations.VisibleForTesting;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Tier;
import net.minecraftforge.common.TierSortingRegistry;
import slimeknights.tconstruct.library.tools.definition.module.material.MaterialStatsModule.WeightedStatType;
import slimeknights.tconstruct.library.tools.nbt.MaterialNBT;
import slimeknights.tconstruct.library.tools.stat.MaterialStatProvider;
import slimeknights.tconstruct.library.tools.stat.ModifierStatsBuilder;
import slimeknights.tconstruct.library.tools.stat.ToolStats;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
/**
* Standard stat builder for melee and harvest tools. Calculates the five main stat types, and handles the bonuses for other types
*/
public final class MeleeHarvestMaterialStatProvider extends MaterialStatProvider {
@VisibleForTesting
public MeleeHarvestMaterialStatProvider(ResourceLocation id) {
super(id, Set.of(HeadMaterialStats.ID), Set.of(HandleMaterialStats.ID, ExtraMaterialStats.ID));
}
@Override
public void addStats(List<WeightedStatType> statTypes, MaterialNBT materials, ModifierStatsBuilder builder) {
List<HeadMaterialStats> heads = listOfCompatibleWith(HeadMaterialStats.ID, materials, statTypes);
if (!heads.isEmpty()) {
addStats(heads, listOfCompatibleWith(HandleMaterialStats.ID, materials, statTypes), builder);
}
}
@VisibleForTesting
public void addStats(List<HeadMaterialStats> heads, List<HandleMaterialStats> handles, ModifierStatsBuilder builder) {
// add in specific stat types handled by our materials
ToolStats.DURABILITY.update(builder, getAverageValue(heads, HeadMaterialStats::getDurability));
ToolStats.DURABILITY.multiply(builder, getAverageValue(handles, HandleMaterialStats::getDurability, 1f));
ToolStats.HARVEST_TIER.update(builder, buildHarvestLevel(heads));
ToolStats.ATTACK_DAMAGE.update(builder, getAverageValue(heads, HeadMaterialStats::getAttack));
ToolStats.ATTACK_DAMAGE.multiply(builder, getAverageValue(handles, HandleMaterialStats::getAttackDamage, 1f));
ToolStats.ATTACK_SPEED.multiply(builder, getAverageValue(handles, HandleMaterialStats::getAttackSpeed, 1f));
// ignore default value
ToolStats.MINING_SPEED.update(builder, getAverageValue(heads, HeadMaterialStats::getMiningSpeed));
ToolStats.MINING_SPEED.multiply(builder, getAverageValue(handles, HandleMaterialStats::getMiningSpeed, 1));
}
/** Builds the harvest level for the tool */
private static Tier buildHarvestLevel(List<HeadMaterialStats> heads) {
List<Tier> sortedTiers = TierSortingRegistry.getSortedTiers();
return heads.stream()
.map(HeadMaterialStats::getTier)
.max(Comparator.comparingInt(sortedTiers::indexOf))
.orElse(sortedTiers.get(0));
}
}