mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-25 06:36:45 +01:00
Rewrote how Arrow Retrieval subskill is handled
This commit is contained in:
parent
39b5719e12
commit
80beb92a06
@ -32,6 +32,7 @@ Version 2.2.0
|
|||||||
Acrobatic's Dodge XP increased from 120 -> 480
|
Acrobatic's Dodge XP increased from 120 -> 480
|
||||||
Fishing's always catch fish setting now defaults to true instead of false
|
Fishing's always catch fish setting now defaults to true instead of false
|
||||||
Optimized code related to Fishing
|
Optimized code related to Fishing
|
||||||
|
Tracking arrows for Arrow Retrieval with Archery has been rewritten to a much more efficient system
|
||||||
Added a new command 'mcmmoreload' to reload config values
|
Added a new command 'mcmmoreload' to reload config values
|
||||||
Added new locale string 'Commands.Reload.Start'
|
Added new locale string 'Commands.Reload.Start'
|
||||||
Added new locale string 'Commands.Reload.Finished'
|
Added new locale string 'Commands.Reload.Finished'
|
||||||
|
@ -6,7 +6,8 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
|
|||||||
@ConfigSerializable
|
@ConfigSerializable
|
||||||
public class ConfigExperienceArchery {
|
public class ConfigExperienceArchery {
|
||||||
|
|
||||||
public static final double DISTANCE_MULTIPLIER_DEFAULT = 0.025;
|
private static final double DISTANCE_MULTIPLIER_DEFAULT = 0.025;
|
||||||
|
private static final double ARROW_FORCE_XP_MULTIPLIER = 2.0D;
|
||||||
|
|
||||||
@Setting(value = "Distance-Multiplier", comment = "The distance multiplier is multiplied against the distance an " +
|
@Setting(value = "Distance-Multiplier", comment = "The distance multiplier is multiplied against the distance an " +
|
||||||
"arrow travels before hitting its target to determine final XP values awarded." +
|
"arrow travels before hitting its target to determine final XP values awarded." +
|
||||||
@ -16,6 +17,14 @@ public class ConfigExperienceArchery {
|
|||||||
"\nDefault value: " + DISTANCE_MULTIPLIER_DEFAULT)
|
"\nDefault value: " + DISTANCE_MULTIPLIER_DEFAULT)
|
||||||
private double distanceMultiplier = DISTANCE_MULTIPLIER_DEFAULT;
|
private double distanceMultiplier = DISTANCE_MULTIPLIER_DEFAULT;
|
||||||
|
|
||||||
|
@Setting(value = "Arrow-Force-XP-Multiplier", comment = "How much velocity the arrow has after leaving the players bow is used in the XP formula for handing out Archery XP." +
|
||||||
|
"\nDefault value: "+ARROW_FORCE_XP_MULTIPLIER)
|
||||||
|
private double forceMultiplier = ARROW_FORCE_XP_MULTIPLIER;
|
||||||
|
|
||||||
|
public double getForceMultiplier() {
|
||||||
|
return forceMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
public double getDistanceMultiplier() {
|
public double getDistanceMultiplier() {
|
||||||
return distanceMultiplier;
|
return distanceMultiplier;
|
||||||
}
|
}
|
||||||
|
@ -7,17 +7,6 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
|
|||||||
@ConfigSerializable
|
@ConfigSerializable
|
||||||
public class ConfigArchery {
|
public class ConfigArchery {
|
||||||
|
|
||||||
/* ARCHERY */
|
|
||||||
|
|
||||||
//
|
|
||||||
// public double getDazeBonusDamage() {
|
|
||||||
// return getDoubleValue(SKILLS, ARCHERY, DAZE, BONUS_DAMAGE);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public double getForceMultiplier() {
|
|
||||||
// return getDoubleValue(SKILLS, ARCHERY, FORCE_MULTIPLIER);
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Setting(value = "Daze")
|
@Setting(value = "Daze")
|
||||||
private ConfigArcheryDaze daze = new ConfigArcheryDaze();
|
private ConfigArcheryDaze daze = new ConfigArcheryDaze();
|
||||||
|
|
||||||
@ -49,6 +38,6 @@ public class ConfigArchery {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public double getBonusDamage() {
|
public double getBonusDamage() {
|
||||||
return daze.getBonusDamage();
|
return daze.getDazeBonusDamage();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -30,7 +30,7 @@ public class ConfigArcheryDaze {
|
|||||||
return maxBonusLevel;
|
return maxBonusLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getBonusDamage() {
|
public double getDazeBonusDamage() {
|
||||||
return bonusDamage;
|
return bonusDamage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ public class MetadataConstants {
|
|||||||
public final static String INFINITE_ARROW_METAKEY = "mcMMO: Infinite Arrow";
|
public final static String INFINITE_ARROW_METAKEY = "mcMMO: Infinite Arrow";
|
||||||
public final static String BOW_FORCE_METAKEY = "mcMMO: Bow Force";
|
public final static String BOW_FORCE_METAKEY = "mcMMO: Bow Force";
|
||||||
public final static String ARROW_DISTANCE_METAKEY = "mcMMO: Arrow Distance";
|
public final static String ARROW_DISTANCE_METAKEY = "mcMMO: Arrow Distance";
|
||||||
|
public final static String ARROW_TRACKER_METAKEY = "mcMMO: Arrow Tracker";
|
||||||
public final static String BONUS_DROPS_METAKEY = "mcMMO: Bonus Drops";
|
public final static String BONUS_DROPS_METAKEY = "mcMMO: Bonus Drops";
|
||||||
public final static String DISARMED_ITEM_METAKEY = "mcMMO: Disarmed Item";
|
public final static String DISARMED_ITEM_METAKEY = "mcMMO: Disarmed Item";
|
||||||
public final static String PLAYER_DATA_METAKEY = "mcMMO: Player Data";
|
public final static String PLAYER_DATA_METAKEY = "mcMMO: Player Data";
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.gmail.nossr50.datatypes.meta;
|
||||||
|
|
||||||
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
public class TrackedArrowMeta extends FixedMetadataValue {
|
||||||
|
/**
|
||||||
|
* Initializes a FixedMetadataValue with an Object
|
||||||
|
*
|
||||||
|
* @param owningPlugin the {@link Plugin} that created this metadata value
|
||||||
|
* @param value the value assigned to this metadata value
|
||||||
|
*/
|
||||||
|
public TrackedArrowMeta(@NotNull Plugin owningPlugin, @Nullable Integer value) {
|
||||||
|
super(owningPlugin, value);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package com.gmail.nossr50.listeners;
|
package com.gmail.nossr50.listeners;
|
||||||
|
|
||||||
import com.gmail.nossr50.config.AdvancedConfig;
|
|
||||||
import com.gmail.nossr50.config.WorldBlacklist;
|
import com.gmail.nossr50.config.WorldBlacklist;
|
||||||
import com.gmail.nossr50.core.MetadataConstants;
|
import com.gmail.nossr50.core.MetadataConstants;
|
||||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
|
||||||
@ -103,7 +102,10 @@ public class EntityListener implements Listener {
|
|||||||
projectile.setMetadata(MetadataConstants.INFINITE_ARROW_METAKEY, MetadataConstants.metadataValue);
|
projectile.setMetadata(MetadataConstants.INFINITE_ARROW_METAKEY, MetadataConstants.metadataValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY, new FixedMetadataValue(plugin, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0)));
|
projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY,
|
||||||
|
new FixedMetadataValue(plugin,
|
||||||
|
Math.min(event.getForce()
|
||||||
|
* mcMMO.getConfigManager().getConfigExperience().getExperienceArchery().getForceMultiplier(), 1.0)));
|
||||||
projectile.setMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY, new FixedMetadataValue(plugin, projectile.getLocation()));
|
projectile.setMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY, new FixedMetadataValue(plugin, projectile.getLocation()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.gmail.nossr50.skills.archery;
|
package com.gmail.nossr50.skills.archery;
|
||||||
|
|
||||||
import com.gmail.nossr50.config.AdvancedConfig;
|
import com.gmail.nossr50.core.MetadataConstants;
|
||||||
|
import com.gmail.nossr50.datatypes.meta.TrackedArrowMeta;
|
||||||
import com.gmail.nossr50.datatypes.skills.SubSkillType;
|
import com.gmail.nossr50.datatypes.skills.SubSkillType;
|
||||||
import com.gmail.nossr50.mcMMO;
|
import com.gmail.nossr50.mcMMO;
|
||||||
import com.gmail.nossr50.util.Misc;
|
import com.gmail.nossr50.util.Misc;
|
||||||
@ -9,101 +10,48 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class Archery {
|
public class Archery {
|
||||||
private static List<TrackedEntity> trackedEntities;
|
|
||||||
|
|
||||||
private static double skillShotDamageCap;
|
|
||||||
|
|
||||||
private static double dazeBonusDamage;
|
|
||||||
|
|
||||||
private static double distanceXpMultiplier;
|
|
||||||
|
|
||||||
private static Archery archery;
|
|
||||||
|
|
||||||
public Archery() {
|
|
||||||
List<TrackedEntity> trackedEntities = new ArrayList<>();
|
|
||||||
|
|
||||||
skillShotDamageCap = AdvancedConfig.getInstance().getSkillShotDamageMax();
|
|
||||||
|
|
||||||
dazeBonusDamage = AdvancedConfig.getInstance().getDazeBonusDamage();
|
|
||||||
|
|
||||||
distanceXpMultiplier = mcMMO.getConfigManager().getConfigExperience().getDistanceMultiplier();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Archery getInstance() {
|
|
||||||
if (archery == null)
|
|
||||||
archery = new Archery();
|
|
||||||
|
|
||||||
return archery;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void incrementTrackerValue(LivingEntity livingEntity) {
|
|
||||||
for (TrackedEntity trackedEntity : trackedEntities) {
|
|
||||||
if (trackedEntity.getLivingEntity().getEntityId() == livingEntity.getEntityId()) {
|
|
||||||
trackedEntity.incrementArrowCount();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addToTracker(livingEntity); // If the entity isn't tracked yet
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void addToTracker(LivingEntity livingEntity) {
|
|
||||||
TrackedEntity trackedEntity = new TrackedEntity(livingEntity);
|
|
||||||
|
|
||||||
trackedEntity.incrementArrowCount();
|
|
||||||
trackedEntities.add(trackedEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void removeFromTracker(TrackedEntity trackedEntity) {
|
|
||||||
trackedEntities.remove(trackedEntity);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for arrow retrieval.
|
* Check for arrow retrieval.
|
||||||
*
|
*
|
||||||
* @param livingEntity The entity hit by the arrows
|
* @param livingEntity The entity hit by the arrows
|
||||||
*/
|
*/
|
||||||
public static void arrowRetrievalCheck(LivingEntity livingEntity) {
|
public static void arrowRetrievalCheck(LivingEntity livingEntity) {
|
||||||
for (Iterator<TrackedEntity> entityIterator = trackedEntities.iterator(); entityIterator.hasNext(); ) {
|
if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
|
||||||
TrackedEntity trackedEntity = entityIterator.next();
|
Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt());
|
||||||
|
|
||||||
if (trackedEntity.getID() == livingEntity.getUniqueId()) {
|
|
||||||
Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), trackedEntity.getArrowCount());
|
|
||||||
entityIterator.remove();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void incrementArrowCount(LivingEntity livingEntity) {
|
||||||
|
if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
|
||||||
|
int arrowCount = livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt();
|
||||||
|
livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).set(0, new FixedMetadataValue(mcMMO.p, arrowCount + 1));
|
||||||
|
} else {
|
||||||
|
livingEntity.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, new TrackedArrowMeta(mcMMO.p, 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double getSkillShotBonusDamage(Player player, double oldDamage) {
|
public static double getSkillShotBonusDamage(Player player, double oldDamage) {
|
||||||
double damageBonusPercent = getDamageBonusPercent(player);
|
double damageBonusPercent = getDamageBonusPercent(player);
|
||||||
double newDamage = oldDamage + (oldDamage * damageBonusPercent);
|
double newDamage = oldDamage + (oldDamage * damageBonusPercent);
|
||||||
return Math.min(newDamage, Archery.skillShotDamageCap);
|
return Math.min(newDamage, getSkillShotDamageCap());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double getDamageBonusPercent(Player player) {
|
public static double getDamageBonusPercent(Player player) {
|
||||||
return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * AdvancedConfig.getInstance().getSkillShotRankDamageMultiplier()) / 100.0D;
|
return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * mcMMO.getConfigManager().getConfigArchery().getSkillShotDamageMultiplier()) / 100.0D;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TrackedEntity> getTrackedEntities() {
|
public static double getSkillShotDamageCap() {
|
||||||
return trackedEntities;
|
return mcMMO.getConfigManager().getConfigArchery().getSkillShotDamageCeiling();
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getSkillShotDamageCap() {
|
public static double getDazeBonusDamage() {
|
||||||
return skillShotDamageCap;
|
return mcMMO.getConfigManager().getConfigArchery().getDaze().getDazeBonusDamage();
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getDazeBonusDamage() {
|
public static double getDistanceXpMultiplier() {
|
||||||
return dazeBonusDamage;
|
return mcMMO.getConfigManager().getConfigExperience().getExperienceArchery().getDistanceMultiplier();
|
||||||
}
|
|
||||||
|
|
||||||
public double getDistanceXpMultiplier() {
|
|
||||||
return distanceXpMultiplier;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ public class ArcheryManager extends SkillManager {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + Math.min(firedLocation.distance(targetLocation), 50) * Archery.getInstance().getDistanceXpMultiplier();
|
return 1 + Math.min(firedLocation.distance(targetLocation), 50) * Archery.getDistanceXpMultiplier();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,9 +67,9 @@ public class ArcheryManager extends SkillManager {
|
|||||||
*
|
*
|
||||||
* @param target The {@link LivingEntity} damaged by the arrow
|
* @param target The {@link LivingEntity} damaged by the arrow
|
||||||
*/
|
*/
|
||||||
public void retrieveArrows(LivingEntity target) {
|
public void processArrowRetrievalActivation(LivingEntity target) {
|
||||||
if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, getPlayer())) {
|
if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, getPlayer())) {
|
||||||
Archery.incrementTrackerValue(target);
|
Archery.incrementArrowCount(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ public class ArcheryManager extends SkillManager {
|
|||||||
NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed");
|
NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Archery.getInstance().getDazeBonusDamage();
|
return Archery.getDazeBonusDamage();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
package com.gmail.nossr50.skills.archery;
|
|
||||||
|
|
||||||
import com.gmail.nossr50.mcMMO;
|
|
||||||
import org.bukkit.entity.LivingEntity;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class TrackedEntity extends BukkitRunnable {
|
|
||||||
private LivingEntity livingEntity;
|
|
||||||
private UUID id;
|
|
||||||
private int arrowCount;
|
|
||||||
|
|
||||||
protected TrackedEntity(LivingEntity livingEntity) {
|
|
||||||
this.livingEntity = livingEntity;
|
|
||||||
this.id = livingEntity.getUniqueId();
|
|
||||||
|
|
||||||
this.runTaskTimer(mcMMO.p, 12000, 12000);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!livingEntity.isValid()) {
|
|
||||||
Archery.removeFromTracker(this);
|
|
||||||
this.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected LivingEntity getLivingEntity() {
|
|
||||||
return livingEntity;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected UUID getID() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getArrowCount() {
|
|
||||||
return arrowCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void incrementArrowCount() {
|
|
||||||
arrowCount++;
|
|
||||||
}
|
|
||||||
}
|
|
@ -105,7 +105,7 @@ public final class Misc {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return location.getWorld().dropItem(location, itemStack);
|
return location.getWorld().dropItemNaturally(location, itemStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void profileCleanup(String playerName) {
|
public static void profileCleanup(String playerName) {
|
||||||
|
@ -218,7 +218,7 @@ public final class CombatUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!arrow.hasMetadata(MetadataConstants.INFINITE_ARROW_METAKEY) && archeryManager.canRetrieveArrows()) {
|
if (!arrow.hasMetadata(MetadataConstants.INFINITE_ARROW_METAKEY) && archeryManager.canRetrieveArrows()) {
|
||||||
archeryManager.retrieveArrows(target);
|
archeryManager.processArrowRetrievalActivation(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canUseLimitBreak(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {
|
if (canUseLimitBreak(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user