use of com.archyx.aureliumskills.source.Source in project AureliumSkills by Archy-X.
the class LootHandler method selectLoot.
@Nullable
protected Loot selectLoot(LootPool pool, @Nullable Source source) {
List<Loot> lootList = new ArrayList<>();
// Add applicable loot to list for selection
for (Loot loot : pool.getLoot()) {
if (loot.getSources().size() > 0 && source != null) {
for (Source lootSource : loot.getSources()) {
if (lootSource.equals(source)) {
lootList.add(loot);
break;
}
}
} else {
lootList.add(loot);
}
}
// Loot selected based on weight
int totalWeight = 0;
for (Loot loot : lootList) {
totalWeight += loot.getWeight();
}
if (totalWeight == 0) {
// Don't attempt selection if no loot entries are applicable
return null;
}
int selected = random.nextInt(totalWeight);
int currentWeight = 0;
Loot selectedLoot = null;
for (Loot loot : lootList) {
if (selected >= currentWeight && selected < currentWeight + loot.getWeight()) {
selectedLoot = loot;
break;
}
currentWeight += loot.getWeight();
}
return selectedLoot;
}
use of com.archyx.aureliumskills.source.Source in project AureliumSkills by Archy-X.
the class LootParser method parseSources.
@NotNull
protected Set<Source> parseSources(Map<?, ?> map) {
if (map.containsKey("sources")) {
Set<Source> sources = new HashSet<>();
for (String entry : getStringList(map, "sources")) {
// Try get source name
Source source = plugin.getSourceRegistry().valueOf(entry);
if (source != null) {
sources.add(source);
} else {
// Try to get tag if not found
SourceTag tag = SourceTag.valueOf(entry.toUpperCase(Locale.ROOT));
// All all sources in tag
sources.addAll(plugin.getSourceManager().getTag(tag));
}
}
return sources;
} else {
return new HashSet<>();
}
}
use of com.archyx.aureliumskills.source.Source in project AureliumSkills by Archy-X.
the class BlockLootHandler method onBreak.
@EventHandler(priority = EventPriority.HIGH)
public void onBreak(BlockBreakEvent event) {
if (!OptionL.isEnabled(skill))
return;
if (event.isCancelled())
return;
Block block = event.getBlock();
if (getSource(block) == null)
return;
Player player = event.getPlayer();
if (blockAbility(player))
return;
if (player.getGameMode() != GameMode.SURVIVAL) {
// Only drop loot in survival mode
return;
}
PlayerData playerData = plugin.getPlayerManager().getPlayerData(player);
if (playerData == null)
return;
Source originalSource = getSource(block);
LootTable table = plugin.getLootTableManager().getLootTable(skill);
if (table == null)
return;
for (LootPool pool : table.getPools()) {
// Calculate chance for pool
double chance = getChance(pool, playerData);
LootDropCause cause = getCause(pool);
// Select pool and give loot
if (selectBlockLoot(pool, player, chance, originalSource, event, cause)) {
break;
}
}
}
use of com.archyx.aureliumskills.source.Source in project AureliumSkills by Archy-X.
the class FishingLootHandler method onFish.
@EventHandler(priority = EventPriority.HIGH)
public void onFish(PlayerFishEvent event) {
if (!OptionL.isEnabled(Skills.FISHING))
return;
Player player = event.getPlayer();
if (blockAbility(player))
return;
if (plugin.getWorldManager().isInBlockedWorld(player.getLocation())) {
return;
}
if (plugin.isWorldGuardEnabled()) {
if (plugin.getWorldGuardSupport().isInBlockedRegion(player.getLocation())) {
return;
} else // Check if blocked by flags
if (plugin.getWorldGuardSupport().blockedByFlag(player.getLocation(), player, WorldGuardFlags.FlagKey.XP_GAIN)) {
return;
}
}
if (!(event.getCaught() instanceof Item))
return;
if (!event.getState().equals(PlayerFishEvent.State.CAUGHT_FISH))
return;
if (event.getExpToDrop() == 0)
return;
PlayerData playerData = plugin.getPlayerManager().getPlayerData(player);
if (playerData == null)
return;
ItemStack originalItem = ((Item) event.getCaught()).getItemStack();
FishingSource originalSource = FishingSource.valueOf(originalItem);
LootTable table = plugin.getLootTableManager().getLootTable(Skills.FISHING);
if (table == null)
return;
for (LootPool pool : table.getPools()) {
// Calculate chance for pool
Source source;
double chance = getCommonChance(pool, playerData);
LootDropCause cause = LootDropCause.FISHING_OTHER_LOOT;
if (pool.getName().equals("rare") && plugin.getAbilityManager().isEnabled(Ability.TREASURE_HUNTER)) {
chance += (getValue(Ability.TREASURE_HUNTER, playerData) / 100);
source = FishingSource.RARE;
cause = LootDropCause.TREASURE_HUNTER;
} else if (pool.getName().equals("epic") && plugin.getAbilityManager().isEnabled(Ability.EPIC_CATCH)) {
chance += (getValue(Ability.EPIC_CATCH, playerData) / 100);
source = FishingSource.EPIC;
cause = LootDropCause.EPIC_CATCH;
} else {
source = originalSource;
}
if (random.nextDouble() < chance) {
// Pool is selected
Loot selectedLoot = selectLoot(pool, originalSource);
// Give loot
if (selectedLoot != null) {
if (selectedLoot instanceof ItemLoot) {
ItemLoot itemLoot = (ItemLoot) selectedLoot;
giveFishingItemLoot(player, itemLoot, event, source, cause);
} else if (selectedLoot instanceof CommandLoot) {
CommandLoot commandLoot = (CommandLoot) selectedLoot;
giveCommandLoot(player, commandLoot, source);
}
break;
}
}
}
}
Aggregations