Skip to content

Commit

Permalink
Fixed issues with giving achievements/advancements to players when ki…
Browse files Browse the repository at this point in the history
…lling entities (#450)
  • Loading branch information
OmerBenGera committed Feb 11, 2022
1 parent 5bbe80f commit 4e88dba
Show file tree
Hide file tree
Showing 9 changed files with 231 additions and 128 deletions.
18 changes: 4 additions & 14 deletions src/main/java/com/bgsoftware/wildstacker/nms/NMSAdapter.java
Expand Up @@ -7,7 +7,6 @@
import com.bgsoftware.wildstacker.utils.chunks.ChunkPosition;
import com.bgsoftware.wildstacker.utils.legacy.Materials;
import com.bgsoftware.wildstacker.utils.spawners.SyncedCreatureSpawner;
import org.bukkit.Achievement;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
Expand All @@ -19,7 +18,6 @@
import org.bukkit.entity.Chicken;
import org.bukkit.entity.Enderman;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.MushroomCow;
Expand Down Expand Up @@ -184,15 +182,7 @@ default boolean isDroppedItem(Entity entity) {
* World methods
*/

default void grandAchievement(Player player, EntityType victim, String name) {
grandAchievement(player, "", name);
}

default void grandAchievement(Player player, String criteria, String name) {
Achievement achievement = Achievement.valueOf(name);
if (!player.hasAchievement(achievement))
player.awardAchievement(achievement);
}
void awardKillScore(Entity bukkitDamaged, Entity damagerEntity);

void playPickupAnimation(LivingEntity livingEntity, Item item);

Expand Down Expand Up @@ -233,11 +223,11 @@ default void giveExp(Player player, int amount) {
}
}

default void enterVehicle(Vehicle vehicle, Entity entity){
default void enterVehicle(Vehicle vehicle, Entity entity) {
vehicle.setPassenger(entity);
}

default int getPassengersCount(Vehicle vehicle){
default int getPassengersCount(Vehicle vehicle) {
return vehicle.getPassenger() == null ? 0 : 1;
}

Expand Down Expand Up @@ -265,7 +255,7 @@ default Object getChatMessage(String message) {

MetadataStoreBase<Entity> getEntityMetadataStore();

default void runAtEndOfTick(Runnable code){
default void runAtEndOfTick(Runnable code) {
ServerTickListener.addTickEndTask(code);
}

Expand Down
Expand Up @@ -69,7 +69,7 @@ public static Result simulateDeath(StackedEntity stackedEntity, EntityDamageEven
return new Result(true, -1);
}

if(stackedEntity.hasFlag(EntityFlag.ATTACKED_ENTITY))
if (stackedEntity.hasFlag(EntityFlag.ATTACKED_ENTITY))
return new Result(true, -1);

Pair<Integer, Double> spreadDamageResult = checkForSpreadDamage(stackedEntity,
Expand All @@ -82,7 +82,7 @@ public static Result simulateDeath(StackedEntity stackedEntity, EntityDamageEven

Result result = new Result(false, 0);

if(handleFastKill(livingEntity, killer))
if (handleFastKill(livingEntity, killer))
result.cancelEvent = true;

if (killer != null) {
Expand All @@ -92,7 +92,7 @@ public static Result simulateDeath(StackedEntity stackedEntity, EntityDamageEven
livingEntity.setHealth(livingEntity.getMaxHealth() - damageToNextStack);

//Villager was killed by a zombie - should be turned into a zombie villager.
if(checkForZombieVillager(stackedEntity, entityKiller))
if (checkForZombieVillager(stackedEntity, entityKiller))
return result;

int originalAmount = stackedEntity.getStackAmount();
Expand Down Expand Up @@ -223,7 +223,7 @@ public static Result simulateDeath(StackedEntity stackedEntity, EntityDamageEven

private static Pair<Integer, Double> checkForSpreadDamage(StackedEntity stackedEntity,
boolean instantKill, double finalDamage,
ItemStack damagerTool){
ItemStack damagerTool) {
int entitiesToKill;
double damageToNextStack;

Expand Down Expand Up @@ -252,7 +252,7 @@ private static Pair<Integer, Double> checkForSpreadDamage(StackedEntity stackedE
return new Pair<>(entitiesToKill, damageToNextStack);
}

private static boolean handleFastKill(LivingEntity livingEntity, Player damager){
private static boolean handleFastKill(LivingEntity livingEntity, Player damager) {
if (plugin.getSettings().entitiesFastKill) {

if (damager != null) {
Expand All @@ -269,15 +269,15 @@ private static boolean handleFastKill(LivingEntity livingEntity, Player damager)
return false;
}

private static boolean checkForZombieVillager(StackedEntity stackedEntity, Entity entityDamager){
private static boolean checkForZombieVillager(StackedEntity stackedEntity, Entity entityDamager) {
LivingEntity livingEntity = stackedEntity.getLivingEntity();

if(livingEntity.getType() != EntityType.VILLAGER || !(entityDamager instanceof Zombie))
if (livingEntity.getType() != EntityType.VILLAGER || !(entityDamager instanceof Zombie))
return false;

switch (livingEntity.getWorld().getDifficulty()) {
case NORMAL:
if(!ThreadLocalRandom.current().nextBoolean())
if (!ThreadLocalRandom.current().nextBoolean())
return false;
break;
case EASY:
Expand All @@ -287,7 +287,7 @@ private static boolean checkForZombieVillager(StackedEntity stackedEntity, Entit

Zombie zombieVillager = plugin.getNMSAdapter().spawnZombieVillager((Villager) livingEntity);

if(zombieVillager == null)
if (zombieVillager == null)
return false;

StackedEntity stackedZombie = WStackedEntity.of(zombieVillager);
Expand All @@ -305,33 +305,22 @@ private static boolean checkForZombieVillager(StackedEntity stackedEntity, Entit
return true;
}

private static void giveStatisticsToKiller(Player killer, int unstackAmount, StackedEntity stackedEntity){
if(killer == null)
return;

private static void giveStatisticsToKiller(Entity entityKiller, int unstackAmount, StackedEntity stackedEntity) {
EntityType victimType = stackedEntity.getType();

try {
StatisticsUtils.incrementStatistic(killer, Statistic.MOB_KILLS, unstackAmount);
StatisticsUtils.incrementStatistic(killer, Statistic.KILL_ENTITY, victimType, unstackAmount);
} catch (IllegalArgumentException ignored) {}

//Monster Hunter
grandAchievement(killer, victimType, "KILL_ENEMY");
grandAchievement(killer, victimType, "adventure/kill_a_mob");

//Monsters Hunted
grandAchievement(killer, victimType, "adventure/kill_all_mobs");

//Sniper Duel
if (stackedEntity.getWorld().equals(killer.getWorld()) &&
killer.getLocation().distanceSquared(stackedEntity.getLocation()) >= 2500) {
grandAchievement(killer, "", "SNIPE_SKELETON");
grandAchievement(killer, "killed_skeleton", "adventure/sniper_duel");
if (entityKiller instanceof Player) {
Player killer = (Player) entityKiller;
try {
StatisticsUtils.incrementStatistic(killer, Statistic.MOB_KILLS, unstackAmount);
StatisticsUtils.incrementStatistic(killer, Statistic.KILL_ENTITY, victimType, unstackAmount);
} catch (IllegalArgumentException ignored) {
}
}

plugin.getNMSAdapter().awardKillScore(stackedEntity.getLivingEntity(), entityKiller);
}

private static void reduceKillerToolDurability(ItemStack damagerTool, Player killer){
private static void reduceKillerToolDurability(ItemStack damagerTool, Player killer) {
int damage = ItemUtils.isSword(damagerTool.getType()) ? 1 : ItemUtils.isTool(damagerTool.getType()) ? 2 : 0;
ThreadLocalRandom random = ThreadLocalRandom.current();
if (damage > 0) {
Expand All @@ -354,8 +343,8 @@ private static void reduceKillerToolDurability(ItemStack damagerTool, Player kil
}
}

private static void attemptJoinRaid(Player killer, LivingEntity livingEntity){
if(killer == null || !EntityTypes.fromEntity(livingEntity).isRaider())
private static void attemptJoinRaid(Player killer, LivingEntity livingEntity) {
if (killer == null || !EntityTypes.fromEntity(livingEntity).isRaider())
return;

org.bukkit.entity.Raider raider = (org.bukkit.entity.Raider) livingEntity;
Expand All @@ -381,20 +370,6 @@ private static EntityDamageEvent createDamageEvent(Entity entity, EntityDamageEv
}
}

private static void grandAchievement(Player killer, EntityType entityType, String name) {
try {
plugin.getNMSAdapter().grandAchievement(killer, entityType, name);
} catch (Throwable ignored) {
}
}

private static void grandAchievement(Player killer, String criteria, String name) {
try {
plugin.getNMSAdapter().grandAchievement(killer, criteria, name);
} catch (Throwable ignored) {
}
}

private static List<ItemStack> subtract(List<ItemStack> list1, List<ItemStack> list2) {
List<ItemStack> toReturn = new ArrayList<>(list2);
toReturn.removeAll(list1);
Expand Down
Expand Up @@ -23,6 +23,8 @@
import net.minecraft.server.v1_12_R1.Entity;
import net.minecraft.server.v1_12_R1.EntityAnimal;
import net.minecraft.server.v1_12_R1.EntityArmorStand;
import net.minecraft.server.v1_12_R1.EntityArrow;
import net.minecraft.server.v1_12_R1.EntityFireball;
import net.minecraft.server.v1_12_R1.EntityHuman;
import net.minecraft.server.v1_12_R1.EntityInsentient;
import net.minecraft.server.v1_12_R1.EntityItem;
Expand Down Expand Up @@ -76,11 +78,14 @@
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.Animals;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Chicken;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Vehicle;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Zombie;
Expand Down Expand Up @@ -473,6 +478,36 @@ public org.bukkit.inventory.ItemStack getPlayerSkull(org.bukkit.inventory.ItemSt
return CraftItemStack.asBukkitCopy(itemStack);
}

@Override
public void awardKillScore(org.bukkit.entity.Entity bukkitDamaged,
org.bukkit.entity.Entity damagerEntity) {
Entity damaged = ((CraftEntity) bukkitDamaged).getHandle();
Entity damager = ((CraftEntity) damagerEntity).getHandle();

DamageSource damageSource = null;

if (damagerEntity instanceof Player) {
damageSource = DamageSource.playerAttack((EntityHuman) damager);
} else if (damagerEntity instanceof Projectile) {
Projectile projectile = (Projectile) damagerEntity;
if (projectile instanceof Arrow) {
damageSource = DamageSource.arrow((EntityArrow) damager, ((CraftEntity) projectile.getShooter()).getHandle());
} else if (projectile instanceof Fireball) {
damageSource = DamageSource.fireball((EntityFireball) damager, ((CraftEntity) projectile.getShooter()).getHandle());
}
}

if (damageSource == null) {
if (damager instanceof EntityLiving) {
damageSource = DamageSource.mobAttack((EntityLiving) damager);
} else {
return;
}
}

damager.a(damaged, 0, damageSource);
}

/*
* World methods
*/
Expand Down
Expand Up @@ -29,6 +29,8 @@
import net.minecraft.server.v1_15_R1.Entity;
import net.minecraft.server.v1_15_R1.EntityAnimal;
import net.minecraft.server.v1_15_R1.EntityArmorStand;
import net.minecraft.server.v1_15_R1.EntityArrow;
import net.minecraft.server.v1_15_R1.EntityFireballFireball;
import net.minecraft.server.v1_15_R1.EntityHuman;
import net.minecraft.server.v1_15_R1.EntityInsentient;
import net.minecraft.server.v1_15_R1.EntityItem;
Expand Down Expand Up @@ -71,8 +73,6 @@
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Particle;
import org.bukkit.advancement.Advancement;
import org.bukkit.advancement.AdvancementProgress;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.block.data.BlockData;
Expand All @@ -97,13 +97,17 @@
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.Animals;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Chicken;
import org.bukkit.entity.Enderman;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.MushroomCow;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Trident;
import org.bukkit.entity.Vehicle;
import org.bukkit.entity.Villager;
import org.bukkit.entity.Zombie;
Expand Down Expand Up @@ -584,22 +588,35 @@ public org.bukkit.inventory.ItemStack getPlayerSkull(org.bukkit.inventory.ItemSt
}

@Override
public void grandAchievement(Player player, EntityType victim, String name) {
grandAchievement(player, victim.getKey().toString(), name);
}

@Override
public void grandAchievement(Player player, String criteria, String name) {
Advancement advancement = Bukkit.getAdvancement(NamespacedKey.minecraft(name));

if (advancement == null)
throw new NullPointerException("Invalid advancement " + name);

AdvancementProgress advancementProgress = player.getAdvancementProgress(advancement);
public void awardKillScore(org.bukkit.entity.Entity bukkitDamaged,
org.bukkit.entity.Entity damagerEntity) {
Entity damaged = ((CraftEntity) bukkitDamaged).getHandle();
Entity damager = ((CraftEntity) damagerEntity).getHandle();

DamageSource damageSource = null;

if (damagerEntity instanceof Player) {
damageSource = DamageSource.playerAttack((EntityHuman) damager);
} else if (damagerEntity instanceof Projectile) {
Projectile projectile = (Projectile) damagerEntity;
if (projectile instanceof Arrow) {
damageSource = DamageSource.arrow((EntityArrow) damager, ((CraftEntity) projectile.getShooter()).getHandle());
} else if (projectile instanceof Trident) {
damageSource = DamageSource.a(damager, ((CraftEntity) projectile.getShooter()).getHandle());
} else if (projectile instanceof Fireball) {
damageSource = DamageSource.fireball((EntityFireballFireball) damager, ((CraftEntity) projectile.getShooter()).getHandle());
}
}

if (!advancementProgress.isDone()) {
advancementProgress.awardCriteria(criteria);
if (damageSource == null) {
if (damager instanceof EntityLiving) {
damageSource = DamageSource.mobAttack((EntityLiving) damager);
} else {
return;
}
}

damager.a(damaged, 0, damageSource);
}

@Override
Expand Down

0 comments on commit 4e88dba

Please sign in to comment.