Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/java/fr/korastrip/paperplugin/SharedStats.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public void onEnable() {
this.getServer().getPluginManager().registerEvents(new PlayerDeathListener(this), this);
this.getServer().getPluginManager().registerEvents(new RegenerationListener(this), this);
this.getServer().getPluginManager().registerEvents(new PlayerRespawnListener(this), this);
this.getServer().getPluginManager().registerEvents(new EntityResurrectListener(this), this);

this.getLifecycleManager().registerEventHandler(
LifecycleEvents.COMMANDS,
Expand Down
81 changes: 16 additions & 65 deletions src/main/java/fr/korastrip/paperplugin/listener/DamageListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,14 @@

import fr.korastrip.paperplugin.SharedStats;
import fr.korastrip.paperplugin.model.SharedGroup;
import fr.korastrip.paperplugin.services.TotemService;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.title.Title;
import fr.korastrip.paperplugin.services.SharedHealthService;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;

import java.util.List;

public class DamageListener implements Listener {

private final SharedStats plugin;
Expand All @@ -23,7 +18,7 @@ public DamageListener(SharedStats plugin) {
this.plugin = plugin;
}

@EventHandler(ignoreCancelled = true)
@EventHandler
public void onDamageReceive(EntityDamageEvent event) {
if (event.getEntity() instanceof Player player) {

Expand All @@ -34,67 +29,23 @@ public void onDamageReceive(EntityDamageEvent event) {

if (group.isGroupDying) {
event.setCancelled(true);
return;
}
}
}

var finalDamage = event.getFinalDamage();
event.setDamage(0);

var newHealth = group.getHealth() - finalDamage;

List<Player> players = group.getOnlinePlayers();

if (newHealth <= 0) {

TotemService totemService = new TotemService(plugin);

if(totemService.check()) {
totemService.applyEffect();
return;
}

group.isGroupDying = true;

Bukkit.getScheduler().runTask(
plugin,
() -> {
if (group.getIsPlaying()) {
players.forEach(Player::kill);
}
}
);

final Component mainTitle = player.displayName()
.color(NamedTextColor.RED);
final Component subtitle = Component.text("is dead", NamedTextColor.WHITE);
final Title title = Title.title(mainTitle, subtitle);

group.addPlayerDeath(player);

players.forEach(p -> {
p.showTitle(title);

p.playSound(
p.getLocation(),
Sound.ENTITY_WITHER_SPAWN,
1.0f,
1.0f
);
});
group.incrementsDeadCount();

return;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onDamageApplied(EntityDamageEvent event) {
if (event.getEntity() instanceof Player player) {

group.setHealth(newHealth);
group.syncHealth();
player.playHurtAnimation(0);
SharedGroup group = this.plugin.getGroup();
if (!group.getIsPlaying()) return;
if (!group.getPlayersId().contains(player.getUniqueId())) return;

player.playSound(
player.getLocation(),
Sound.ENTITY_PLAYER_HURT,
1.0f,
1.0f
Bukkit.getScheduler().runTask(plugin,
() -> {
SharedHealthService sharedHealthService = new SharedHealthService(this.plugin);
sharedHealthService.shareLoss();
}
);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package fr.korastrip.paperplugin.listener;

import fr.korastrip.paperplugin.SharedStats;
import fr.korastrip.paperplugin.model.SharedGroup;
import fr.korastrip.paperplugin.services.SharedHealthService;
import fr.korastrip.paperplugin.services.TotemService;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityResurrectEvent;

public class EntityResurrectListener implements Listener {

private final SharedStats plugin;

public EntityResurrectListener(SharedStats plugin) {
this.plugin = plugin;
}

@EventHandler(priority = EventPriority.HIGHEST)
public void onEntityResurrect(EntityResurrectEvent e) {
if (e.getEntity() instanceof Player player) {

TotemService totemService = new TotemService(this.plugin);
SharedGroup group = this.plugin.getGroup();

if (!group.getIsPlaying()) return;
if (!group.getPlayersId().contains(player.getUniqueId())) return;

if (group.isGroupDying) {
e.setCancelled(true);
return;
}

if (!e.isCancelled()) {
totemService.applyEffect();
} else if (totemService.check()) {
e.setCancelled(false);
totemService.applyEffect();
} else {
SharedHealthService sharedHealthService = new SharedHealthService(this.plugin);
sharedHealthService.groupDeath(player);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import fr.korastrip.paperplugin.SharedStats;
import fr.korastrip.paperplugin.model.SharedGroup;
import fr.korastrip.paperplugin.services.SharedHealthService;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand All @@ -24,6 +25,11 @@ public void onPlayerDeath(PlayerDeathEvent event) {
if (!group.getIsPlaying()) return;
if (!group.getPlayersId().contains(player.getUniqueId())) return;

if(!group.isGroupDying) {
SharedHealthService sharedHealthService = new SharedHealthService(this.plugin);
sharedHealthService.groupDeath(player);
}

Bukkit.getScheduler().runTaskLater(
plugin,
() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import fr.korastrip.paperplugin.SharedStats;
import fr.korastrip.paperplugin.model.SharedGroup;
import fr.korastrip.paperplugin.services.SharedHealthService;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
Expand All @@ -23,6 +24,10 @@ public void onRegeneration(EntityRegainHealthEvent event) {
if(group.getPlayersId().contains(player.getUniqueId()) && group.getIsPlaying()) {

event.setCancelled(true);
SharedHealthService sharedHealthService = new SharedHealthService(this.plugin);
sharedHealthService.shareLoss();

if(group.isGroupDying) return;

double healthAmount = event.getAmount();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public List<Player> getOnlinePlayers() {
}

public void syncHealth() {
this.getOnlinePlayers().forEach(p -> p.setHealth(this.getHealth()));
this.getOnlinePlayers().stream().filter(p -> !p.isDead()).forEach(p -> p.setHealth(this.getHealth()));
}

public void addPlayerDeath(Player player) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package fr.korastrip.paperplugin.services;

import fr.korastrip.paperplugin.SharedStats;
import fr.korastrip.paperplugin.model.SharedGroup;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.title.Title;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.entity.Damageable;
import org.bukkit.entity.Player;

public class SharedHealthService {

private final SharedStats plugin;

public SharedHealthService(SharedStats plugin) {
this.plugin = plugin;
}


public void groupDeath(Player deathPlayer) {
SharedGroup group = this.plugin.getGroup();
group.isGroupDying = true;

var players = group.getOnlinePlayers();

Bukkit.getScheduler().runTask(
plugin,
() -> {
if (group.getIsPlaying()) {
group.getOnlinePlayers().stream().filter(p -> !p.isDead()).forEach(Damageable::kill);
}
}
);

final Component mainTitle = deathPlayer.displayName()
.color(NamedTextColor.RED);
final Component subtitle = Component.text("is dead", NamedTextColor.WHITE);
final Title title = Title.title(mainTitle, subtitle);

group.addPlayerDeath(deathPlayer);

players.forEach(p -> {
p.showTitle(title);

p.playSound(
p.getLocation(),
Sound.ENTITY_WITHER_SPAWN,
1.0f,
1.0f
);
});
group.incrementsDeadCount();
}

public void shareLoss() {
SharedGroup group = this.plugin.getGroup();

if (!group.getIsPlaying() || group.isGroupDying) return;

double totalLost = 0;
Player mostHurtPlayer = null;
double currentDamage = 0;
for (Player member : group.getOnlinePlayers()) {
if (member.isDead()) continue;

// Players store health as a float: compare at the same precision to avoid fake losses.
double playerLost = (float) group.getHealth() - member.getHealth();
if (playerLost > 0) {
totalLost += playerLost;

if(playerLost > currentDamage) {
currentDamage = playerLost;
mostHurtPlayer = member;
}

}
}

if (totalLost == 0) return;

var newHealth = group.getHealth() - totalLost;

if (newHealth <= 0) {
TotemService totemService = new TotemService(this.plugin);
if (totemService.check()) {
totemService.applyEffect();
} else {
this.groupDeath(mostHurtPlayer);
}
return;
}

group.setHealth(newHealth);
group.syncHealth();
}
}
Loading