Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package vg.civcraft.mc.civchat2.listeners;

import java.util.Optional;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand Down Expand Up @@ -42,35 +44,62 @@ public void onPlayerKill(PlayerDeathEvent event) {
if (!settingsMan.getSendOwnKills(killer.getUniqueId())) {
return;
}
String msg;
ItemStack item = killer.getInventory().getItemInMainHand();
String victimFormattedName = String.format("%s%s", ChatColor.ITALIC, victim.getDisplayName());
String killerFormattedName = String.format("%s%s", ChatColor.ITALIC, killer.getDisplayName());

Component killerComponent = Component.text(killer.getDisplayName(), NamedTextColor.DARK_GRAY);
Component victimComponent = Component.text(victim.getDisplayName(), NamedTextColor.DARK_GRAY);
Component verb = Component.text("killed", NamedTextColor.DARK_GRAY);
Component accent = Component.text("> ", NamedTextColor.DARK_GRAY).decorate(TextDecoration.BOLD);
Component killMessage;
if (item == null || MaterialUtils.isAir(item.getType())) {
msg = String.format("%s%s %swas killed by %s %sby hand", ChatColor.DARK_GRAY, victimFormattedName,
ChatColor.DARK_GRAY, killerFormattedName, ChatColor.DARK_GRAY);
killMessage = Component.text()
.append(accent)
.append(killerComponent)
.append(Component.space())
.append(verb)
.append(Component.space())
.append(victimComponent)
.append(Component.space())
.append(Component.text("by hand", NamedTextColor.DARK_GRAY))
.build();
} else {
String itemName = ItemUtils.getItemName(item);
String displayName = ItemUtils.getDisplayName(item);
Boolean hasWordBank = Optional.ofNullable(ItemUtils.getItemMeta(item))
.map(r -> r.displayName())
.map(f -> f.children().size() > 0)
.orElse(false);

Component itemName = item.hasItemMeta() && item.getItemMeta().hasDisplayName()
? item.getItemMeta().displayName()
: Component.translatable(item.getType());

String connector;
if (!hasWordBank) {
displayName = String.format("with a %s", itemName);
connector = "with";
} else {
String killMessageFormat = settingsMan.getKillMessageFormat(killer.getUniqueId()).simpleDescription;
if (killMessageFormat.isBlank()) {
displayName = String.format("%s%s", killMessageFormat, displayName);
} else {
displayName = String.format("%s %s", killMessageFormat, displayName);
}
connector = settingsMan.getKillMessageFormat(killer.getUniqueId()).simpleDescription;
}

msg = String.format("%s%s %swas killed by %s %s%s", ChatColor.DARK_GRAY, victimFormattedName,
ChatColor.DARK_GRAY, killerFormattedName, ChatColor.DARK_GRAY, displayName);
Component itemPhrase;
if (connector.isBlank()) {
itemPhrase = itemName;
} else {
itemPhrase = Component.text(connector + " ")
.append(itemName);
}
itemPhrase = itemPhrase.color(NamedTextColor.DARK_GRAY)
.hoverEvent(item.asHoverEvent());

killMessage = Component.text()
.append(accent)
.append(killerComponent)
.append(Component.space())
.append(verb)
.append(Component.space())
.append(victimComponent)
.append(Component.space())
.append(itemPhrase)
.build();
}

Location killLoc = victim.getLocation();
for (Player p : Bukkit.getOnlinePlayers()) {
Location loc = p.getLocation();
Expand All @@ -87,7 +116,7 @@ public void onPlayerKill(PlayerDeathEvent event) {
&& dao.isIgnoringPlayer(p.getUniqueId(), killer.getUniqueId())) {
continue;
}
p.sendMessage(msg);
p.sendMessage(killMessage);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -337,14 +337,12 @@ public String getRandomNamePrefix() {
return plugin.getConfig().getString("random-name-prefix");
}

public String getKillMessage() {
String message = plugin.getConfig().getString("kill-message", "");
return ChatColor.translateAlternateColorCodes('&', message);
public List<String> getKillMessages() {
return plugin.getConfig().getStringList("kill-messages");
}

public String getKillMessageItem() {
String message = plugin.getConfig().getString("kill-message-item", "");
return ChatColor.translateAlternateColorCodes('&', message);
public List<String> getKillMessagesItem() {
return plugin.getConfig().getStringList("kill-messages-item");
}

public boolean useBarApi() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package net.minelink.ctplus.listener;

import java.util.List;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextReplacementConfig;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.minelink.ctplus.CombatTagPlus;
import net.minelink.ctplus.Tag;
import net.minelink.ctplus.event.CombatLogEvent;
Expand All @@ -10,7 +15,6 @@
import net.minelink.ctplus.task.SafeLogoutTask;
import net.minelink.ctplus.task.TagUpdateTask;

import org.apache.commons.lang3.text.WordUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -105,9 +109,9 @@ public void updateTag(PlayerJoinEvent event) {
@EventHandler(priority = EventPriority.LOWEST)
public void broadcastKill(PlayerDeathEvent event) {
// Do nothing if both kill messages are blank
String message = plugin.getSettings().getKillMessage();
String messageItem = plugin.getSettings().getKillMessageItem();
if (message.isEmpty() && messageItem.isEmpty()) return;
List<String> messages = plugin.getSettings().getKillMessages();
List<String> messagesItem = plugin.getSettings().getKillMessagesItem();
if (messages.isEmpty() && messagesItem.isEmpty()) return;

Player player = event.getEntity();
UUID playerId = player.getUniqueId();
Expand Down Expand Up @@ -136,18 +140,36 @@ public void broadcastKill(PlayerDeathEvent event) {
attacker = tag.getVictimName();
}

// Use item-based kill message?
ItemStack item = p.getItemInHand();
if (item.getType() != Material.AIR) {
String name = WordUtils.capitalizeFully(item.getType().name().replace("_", " "));
message = messageItem.replace("{item}", name);
// Determine item name and build hoverable item component
Component itemComponent = null;
ItemStack item = p.getInventory().getItemInMainHand();
if (item != null && item.getType() != Material.AIR) {
Component itemName = item.hasItemMeta() && item.getItemMeta().hasDisplayName()
? item.getItemMeta().displayName()
: Component.translatable(item.getType());
itemComponent = itemName.hoverEvent(item.asHoverEvent());
}

// Insert victim and attacker names into message
message = message.replace("{victim}", victim).replace("{attacker}", attacker);
// Choose a random message from the appropriate pool
String template;
if (itemComponent != null && !messagesItem.isEmpty()) {
template = messagesItem.get(ThreadLocalRandom.current().nextInt(messagesItem.size()));
} else if (!messages.isEmpty()) {
template = messages.get(ThreadLocalRandom.current().nextInt(messages.size()));
} else {
return;
}

Component killMessage = LegacyComponentSerializer.legacyAmpersand().deserialize(template)
.replaceText(TextReplacementConfig.builder().matchLiteral("{victim}").replacement(Component.text(victim)).build())
.replaceText(TextReplacementConfig.builder().matchLiteral("{attacker}").replacement(Component.text(attacker)).build());

if (itemComponent != null) {
killMessage = killMessage.replaceText(TextReplacementConfig.builder().matchLiteral("{item}").replacement(itemComponent).build());
}

// Broadcast kill message
Bukkit.broadcast(message, "ctplus.notify.kill");
Bukkit.broadcast(killMessage, "ctplus.notify.kill");
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package net.minelink.ctplus.listener;

import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.title.Title;
import net.minelink.ctplus.CombatTagPlus;
import net.minelink.ctplus.Tag;
import net.minelink.ctplus.TagManager;
Expand Down Expand Up @@ -279,9 +285,10 @@ public void cancelLogout(PlayerCombatTagEvent event) {
if (!SafeLogoutTask.cancel(player)) return;

// Inform player
if (!plugin.getSettings().getLogoutCancelledMessage().isEmpty()) {
player.sendMessage(plugin.getSettings().getLogoutCancelledMessage());
}
player.showTitle(Title.title(
Component.text("LOGOUT CANCELLED").color(NamedTextColor.DARK_RED).decorate(TextDecoration.BOLD),
Component.text("You were PvP tagged").color(NamedTextColor.RED),
Title.Times.times(Duration.ofMillis(500), Duration.ofSeconds(3), Duration.ofSeconds(1))));
}

@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
Expand Down
Loading