Debug for all the experience source.

Added VanillaExperience & Resource ExperienceSource and added inCombat for Playing Experience Source.
This commit is contained in:
Guillaume 2022-05-09 18:59:17 +02:00
parent 3579a5f520
commit 68b309ec61
33 changed files with 136 additions and 88 deletions

11
pom.xml
View File

@ -39,10 +39,21 @@
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<outputDirectory>C:\Users\guill\Minecraft Server\Server\plugins</outputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>9</source>
<target>9</target>

View File

@ -2,12 +2,14 @@ package net.Indyuce.mmocore.api.load;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.*;
import net.Indyuce.mmocore.loot.chest.condition.*;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.api.block.SkullBlockType;
import net.Indyuce.mmocore.api.block.VanillaBlockType;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropTableDropItem;
import net.Indyuce.mmocore.loot.droptable.dropitem.GoldDropItem;
import net.Indyuce.mmocore.loot.droptable.dropitem.NoteDropItem;
@ -119,9 +121,6 @@ public class DefaultMMOLoader extends MMOLoader {
if (config.getKey().equals("resource"))
return new ResourceExperienceSource(dispenser, config);
if (config.getKey().equals("vanillaexperience"))
return new VanillaExperienceExperienceSource(dispenser, config);
if (config.getKey().equals("climb"))
return new ClimbExperienceSource(dispenser, config);

View File

@ -2,7 +2,7 @@ package net.Indyuce.mmocore.api.load;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;

View File

@ -321,7 +321,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
giveExperience(total, source);
}
public void setExperience(int value) {
public void setExperience(double value) {
experience = Math.max(0, value);
refreshVanillaExp();
}
@ -517,7 +517,7 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc
* @param value Experience to give the player
* @param source How the player earned experience
*/
public void giveExperience(int value, EXPSource source) {
public void giveExperience(double value, EXPSource source) {
giveExperience(value, source, null, true);
}

View File

@ -17,13 +17,14 @@ import net.Indyuce.mmocore.skill.RegisteredSkill;
import net.Indyuce.mmocore.manager.data.PlayerDataManager.DefaultPlayerData;
public class SavedClassInformation {
private final int level, experience, skillPoints, attributePoints, attributeReallocationPoints;
private final int level, skillPoints, attributePoints, attributeReallocationPoints;
private final double experience;
private final Map<String, Integer> attributes;
private final Map<String, Integer> skills;
public SavedClassInformation(ConfigurationSection config) {
level = config.getInt("level");
experience = config.getInt("experience");
experience = config.getDouble("experience");
skillPoints = config.getInt("skill-points");
attributePoints = config.getInt("attribute-points");
attributeReallocationPoints = config.getInt("attribute-realloc-points");
@ -38,7 +39,7 @@ public class SavedClassInformation {
public SavedClassInformation(JsonObject json) {
level = json.get("level").getAsInt();
experience = json.get("experience").getAsInt();
experience = json.get("experience").getAsDouble();
skillPoints = json.get("skill-points").getAsInt();
attributePoints = json.get("attribute-points").getAsInt();
attributeReallocationPoints = json.get("attribute-realloc-points").getAsInt();
@ -63,11 +64,11 @@ public class SavedClassInformation {
this(data.getLevel(), 0, data.getSkillPoints(), data.getAttributePoints(), data.getAttrReallocPoints());
}
public SavedClassInformation(int level, int experience, int skillPoints, int attributePoints, int attributeReallocationPoints) {
public SavedClassInformation(int level, double experience, int skillPoints, int attributePoints, int attributeReallocationPoints) {
this(level, experience, skillPoints, attributePoints, attributeReallocationPoints, new HashMap<>(), new HashMap<>());
}
private SavedClassInformation(int level, int experience, int skillPoints, int attributePoints, int attributeReallocationPoints,
private SavedClassInformation(int level, double experience, int skillPoints, int attributePoints, int attributeReallocationPoints,
Map<String, Integer> attributes, Map<String, Integer> skills) {
this.level = level;
this.experience = experience;
@ -82,7 +83,7 @@ public class SavedClassInformation {
return level;
}
public int getExperience() {
public double getExperience() {
return experience;
}

View File

@ -3,8 +3,8 @@ package net.Indyuce.mmocore.comp.region;
import java.util.Arrays;
import java.util.List;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import io.lumine.mythic.lib.api.MMOLineConfig;
public class RegionCondition extends Condition {

View File

@ -1,6 +1,6 @@
package net.Indyuce.mmocore.comp.region;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.api.load.MMOLoader;
import io.lumine.mythic.lib.api.MMOLineConfig;

View File

@ -196,7 +196,7 @@ public class PlayerProfessions {
this.exp.put(profession.getId(), exp - needed);
this.level.put(profession.getId(), level + 1);
check = true;
playerData.giveExperience((int) profession.getExperience().calculate(level), null);
playerData.giveExperience(profession.getExperience().calculate(level), null);
}
if (check) {

View File

@ -17,7 +17,7 @@ public class ClassExperienceDispenser implements ExperienceDispenser {
@Override
public void giveExperience(PlayerData playerData, double experience, @Nullable Location hologramLocation, EXPSource source) {
hologramLocation = !MMOCore.plugin.getConfig().getBoolean("display-main-class-exp-holograms") ? null
: hologramLocation == null ? getPlayerLocation(playerData) : hologramLocation;
: hologramLocation;
playerData.giveExperience(experience, source, hologramLocation, true);
}

View File

@ -13,7 +13,10 @@ import java.util.Random;
public class ExperienceItem {
private final String id;
//A period of 0 means the item will only trigger one time.
private final int period;
private final int firstTrigger;
private final double claimChance, failReduction;
private final List<Trigger> triggers;
@ -23,6 +26,7 @@ public class ExperienceItem {
* One item for an experience table
*
* @param period The experience item is claimed every X level ups
* @param firstTrigger The experience item if claimed for the first time at X level ups.
* @param claimChance Chance for that item to be claimed every X level ups
* @param failReduction Between 0 and 1, by how much the fail chance is reduced
* every time the item is not claimed when leveling up.
@ -32,19 +36,22 @@ public class ExperienceItem {
* where n is the amount of successive claiming fails
* @param triggers Actions cast when the exp item is claimed
*/
public ExperienceItem(String id, int period, double claimChance, double failReduction, List<Trigger> triggers) {
public ExperienceItem(String id, int period, int firstTrigger,double claimChance, double failReduction, List<Trigger> triggers) {
this.id = id;
this.period = period;
this.claimChance = claimChance;
this.failReduction = failReduction;
this.triggers = triggers;
this.firstTrigger=firstTrigger;
}
public ExperienceItem(ConfigurationSection config) {
Validate.notNull(config, "Config cannot be null");
Validate.isTrue(config.contains("triggers"));
id = config.getName();
period = config.getInt("period", 1);
period = config.getInt("period", 0);
firstTrigger=config.getInt("first-trigger",period);
claimChance = config.getDouble("chance", 100) / 100;
failReduction = config.getDouble("fail-reduction", 80) / 100;
triggers = new ArrayList<>();
@ -64,7 +71,7 @@ public class ExperienceItem {
* account the randomness factor from the 'chance' parameter
*/
public boolean roll(int professionLevel, int timesCollected) {
int claimsRequired = professionLevel - (timesCollected + 1) * period;
int claimsRequired = professionLevel+1 - (firstTrigger-+timesCollected * period);
if (claimsRequired < 1)
return false;

View File

@ -168,7 +168,7 @@ public class BrewPotionExperienceSource extends ExperienceSource<PotionMeta> {
*/
// exp += getTotal(mapEffectDurations());
getDispenser().giveExperience(PlayerData.get(player), (int) exp * multiplier, null, EXPSource.SOURCE);
getDispenser().giveExperience(PlayerData.get(player), exp * multiplier, player.getLocation(), EXPSource.SOURCE);
}
}
}

View File

@ -0,0 +1,58 @@
package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.apache.commons.lang3.Validate;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.inventory.ItemStack;
public class EatExperienceSource extends SpecificExperienceSource<ItemStack> {
private final Material type;
/**
* Gives xp when you eat a certain type of food. If not type is given it will give xp from all the food sources.
* The amount of xp given is the xp per food regenerated.
*/
public EatExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) {
super(dispenser, config);
if(!config.contains("type"))
type=null;
else {
Material material=Material.valueOf(config.getString("type").toUpperCase().replace("-","_"));
Validate.isTrue(material!=null,"You must precise a valid material!");
type=material;
}
}
@Override
public ExperienceSourceManager<EatExperienceSource> newManager() {
return new ExperienceSourceManager<EatExperienceSource>() {
@EventHandler
public void a(FoodLevelChangeEvent e) {
if (!(e.getEntity() instanceof Player) || e.getEntity().hasMetadata("NPC"))
return;
PlayerData playerData = PlayerData.get((OfflinePlayer) e.getEntity());
for (EatExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, e.getItem()))
source.giveExperience(playerData, e.getFoodLevel(), null);
}
}
};
}
@Override
public boolean matchesParameter(PlayerData player, ItemStack obj) {
if(type==null)
return true;
return type.equals(obj.getType());
}
}

View File

@ -60,7 +60,7 @@ public class EnchantItemExperienceSource extends ExperienceSource<Void> {
double exp = 0;
for (Entry<Enchantment, Integer> entry : applicableEnchants.entrySet())
exp += MMOCore.plugin.enchantManager.getBaseExperience(entry.getKey()) * entry.getValue();
getDispenser().giveExperience(player, (int) exp, event.getEnchantBlock().getLocation(), EXPSource.SOURCE);
getDispenser().giveExperience(player, exp, event.getEnchantBlock().getLocation(), EXPSource.SOURCE);
}
}
};

View File

@ -15,6 +15,7 @@ import org.bukkit.Location;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.scheduler.BukkitRunnable;
@ -47,14 +48,23 @@ public class ProjectileExperienceSource extends SpecificExperienceSource<Project
HashMap<Projectile, Location> projectiles = new HashMap<>();
@EventHandler
public void onHit(EntityDamageByEntityEvent e) {
public void onHit(ProjectileHitEvent e) {
if (e.getHitBlock() != null && projectiles.containsKey(e.getEntity()))
projectiles.remove(e.getEntity());
if (e.getDamager() instanceof Projectile) {
Projectile projectile = (Projectile) e.getDamager();
}
@EventHandler
public void onDamage(EntityDamageByEntityEvent e) {
if (e.getEntity() instanceof Projectile) {
Projectile projectile = (Projectile) e.getEntity();
if(!projectiles.containsKey(projectile))
return;
if (projectile.getShooter() instanceof Player && !((Player) projectile.getShooter()).hasMetadata("NPC")) {
Player player = (Player) projectile.getShooter();
PlayerData playerData = PlayerData.get(player);
double distance = projectiles.get(projectile).distance(e.getDamager().getLocation());
double distance = projectiles.get(projectile).distance(e.getEntity().getLocation());
for (ProjectileExperienceSource source : getSources()) {
if (source.matchesParameter(playerData, projectile))
source.giveExperience(playerData, e.getFinalDamage() * distance, null);
@ -62,6 +72,7 @@ public class ProjectileExperienceSource extends SpecificExperienceSource<Project
}
projectiles.remove(projectile);
}
}

View File

@ -75,7 +75,7 @@ public class RepairItemExperienceSource extends ExperienceSource<ItemStack> {
*/
double exp = MMOCore.plugin.smithingManager.getBaseExperience(item.getType())
* Math.max(0, ((Damageable) old.getItemMeta()).getDamage() - ((Damageable) item.getItemMeta()).getDamage()) / 100;
getDispenser().giveExperience(data, (int) exp, null, EXPSource.SOURCE);
getDispenser().giveExperience(data, exp, data.getPlayer().getLocation(), EXPSource.SOURCE);
}
}
}

View File

@ -1,39 +0,0 @@
package net.Indyuce.mmocore.experience.source;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import org.apache.commons.lang.Validate;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerExpChangeEvent;
public class VanillaExperienceExperienceSource extends SpecificExperienceSource {
public VanillaExperienceExperienceSource(ExperienceDispenser dispenser, MMOLineConfig config) {
super(dispenser, config);
}
@Override
public ExperienceSourceManager<VanillaExperienceExperienceSource> newManager() {
return new ExperienceSourceManager<VanillaExperienceExperienceSource>() {
@EventHandler
public void onExp(PlayerExpChangeEvent e) {
if(e.getPlayer().hasMetadata("NPC"))
return;
PlayerData playerData=PlayerData.get(e.getPlayer());
for(VanillaExperienceExperienceSource source:getSources()) {
if(source.matchesParameter(playerData,null))
giveExperience(playerData,e.getAmount(),null);
}
}
};
}
@Override
public boolean matchesParameter(PlayerData player, Object obj) {
return true;
}
}

View File

@ -11,7 +11,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.experience.source.MineBlockExperienceSource;
import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;

View File

@ -16,7 +16,7 @@ public class RedirectVanillaExp implements Listener {
@EventHandler
public void a(PlayerExpChangeEvent event) {
int a = (int) (event.getAmount() * ratio);
double a = (event.getAmount() * ratio);
if (a > 0)
PlayerData.get(event.getPlayer()).giveExperience(a, EXPSource.VANILLA);
}

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import java.util.Arrays;
import java.util.List;

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import io.lumine.mythic.lib.api.MMOLineConfig;

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import java.util.List;
import java.util.stream.Stream;

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import io.lumine.mythic.lib.api.MMOLineConfig;
import org.apache.commons.lang.Validate;

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import net.Indyuce.mmocore.api.player.PlayerData;
import io.lumine.mythic.lib.api.MMOLineConfig;

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import io.lumine.mythic.lib.api.MMOLineConfig;
import org.bukkit.entity.Player;

View File

@ -1,4 +1,4 @@
package net.Indyuce.mmocore.loot.condition;
package net.Indyuce.mmocore.loot.chest.condition;
import java.util.Arrays;
import java.util.List;

View File

@ -5,8 +5,8 @@ import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;

View File

@ -3,7 +3,7 @@ package net.Indyuce.mmocore.loot.droptable.dropitem;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.loot.droptable.DropTable;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.api.player.PlayerData;
import org.apache.commons.lang.Validate;

View File

@ -11,7 +11,7 @@ import org.bukkit.configuration.ConfigurationSection;
import com.google.gson.JsonParseException;
import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.droptable.dropitem.DropItem;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.api.load.DefaultMMOLoader;

View File

@ -7,8 +7,8 @@ import net.Indyuce.mmocore.api.block.BlockInfo.RegeneratingBlock;
import net.Indyuce.mmocore.api.block.BlockType;
import net.Indyuce.mmocore.api.block.SkullBlockType;
import net.Indyuce.mmocore.api.block.VanillaBlockType;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import io.lumine.mythic.lib.api.MMOLineConfig;
import org.bukkit.Bukkit;

View File

@ -4,8 +4,8 @@ import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.stats.StatType;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.droptable.dropitem.fishing.FishingDropItem;
import org.apache.commons.lang.Validate;
import org.bukkit.configuration.ConfigurationSection;

View File

@ -58,8 +58,8 @@ public class BoosterManager {
return d;
}
public int calculateExp(Profession profession, double exp) {
return (int) (exp * getMultiplier(profession));
public double calculateExp(Profession profession, double exp) {
return (exp * getMultiplier(profession));
}
/**

View File

@ -2,8 +2,8 @@ package net.Indyuce.mmocore.waypoint;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.loot.condition.Condition;
import net.Indyuce.mmocore.loot.condition.ConditionInstance;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.player.Unlockable;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;

View File

@ -8,7 +8,7 @@
diamond-drop-table:
items:
- 'vanilla{type=DIAMOND} 1 1-3'
# - 'mmoitem{type=material;id=RARE_DIAMOND} .1 1-3'
# - 'mmoitem{type=material;id=RARE_DIAMOND;period=} .1 1-3'
- 'droptable{id=other-drop-table} .1'
other-drop-table: