|
4 | 4 | import com.springwater.easybot.bridge.packet.PlayerInfoWithRaw; |
5 | 5 | import com.springwater.easybot.utils.BridgeUtils; |
6 | 6 | import com.springwater.easybot.utils.FakePlayerUtils; |
| 7 | +import net.kyori.adventure.text.Component; |
| 8 | +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; |
7 | 9 | import org.bukkit.block.Block; |
8 | 10 | import org.bukkit.entity.Arrow; |
9 | 11 | import org.bukkit.entity.Entity; |
|
16 | 18 | import org.bukkit.event.entity.EntityDamageEvent; |
17 | 19 | import org.bukkit.event.entity.PlayerDeathEvent; |
18 | 20 |
|
| 21 | +import java.lang.reflect.Method; |
| 22 | + |
19 | 23 | public class PlayerDeathSyncEvents implements Listener { |
| 24 | + |
| 25 | + private final boolean hasModernMessageApi; |
| 26 | + |
| 27 | + public PlayerDeathSyncEvents(){ |
| 28 | + boolean modernMessageApi = false; |
| 29 | + try { |
| 30 | + PlayerDeathEvent.class.getMethod("deathMessage"); |
| 31 | + modernMessageApi = true; |
| 32 | + } catch (NoSuchMethodException | NoClassDefFoundError ignored) { |
| 33 | + } |
| 34 | + this.hasModernMessageApi = modernMessageApi; |
| 35 | + } |
| 36 | + |
20 | 37 | public String getKiller(Player player) { |
21 | 38 | EntityDamageEvent lastDamageCause = player.getLastDamageCause(); |
22 | 39 | if (lastDamageCause instanceof EntityDamageByEntityEvent) { |
23 | 40 | Entity damager = ((EntityDamageByEntityEvent) lastDamageCause).getDamager(); |
24 | | - if(damager instanceof Arrow){ |
| 41 | + if (damager instanceof Arrow) { |
25 | 42 | Arrow arrow = (Arrow) damager; |
26 | | - if(arrow.getShooter() instanceof Entity){ |
| 43 | + if (arrow.getShooter() instanceof Entity) { |
27 | 44 | return ((Entity) arrow.getShooter()).getName(); |
28 | 45 | } |
29 | 46 | return "箭"; |
30 | 47 | } |
| 48 | + //noinspection ConstantValue |
31 | 49 | return damager != null ? damager.getName() : "一股神秘的力量"; |
32 | 50 | } else if (lastDamageCause instanceof EntityDamageByBlockEvent) { |
33 | 51 | Block damager = ((EntityDamageByBlockEvent) lastDamageCause).getDamager(); |
34 | | - return damager != null ? damager.getState().getData().getItemType().name() : "一股神秘的力量"; |
| 52 | + return damager != null ? damager.getState().getType().name() : "一股神秘的力量"; |
35 | 53 | } else { |
36 | 54 | return "一股神秘的力量"; |
37 | 55 | } |
38 | 56 | } |
39 | 57 |
|
40 | 58 | @EventHandler(priority = EventPriority.LOWEST) |
41 | 59 | public void onPlayerDeath(PlayerDeathEvent event) { |
42 | | - if(Easybot.instance.getConfig().getBoolean("skip_options.skip_death")) return; |
43 | | - if(FakePlayerUtils.isFake(event.getPlayer())) return; |
| 60 | + if (Easybot.instance.getConfig().getBoolean("skip_options.skip_death")) return; |
| 61 | + if (FakePlayerUtils.isFake(event.getEntity())) return; |
44 | 62 | PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getEntity()); |
45 | | - String deathMessage = event.getDeathMessage(); |
46 | | - if(deathMessage == null){ |
| 63 | + String deathMessage; |
| 64 | + |
| 65 | + if(hasModernMessageApi) { |
| 66 | + Component component = event.deathMessage(); |
| 67 | + deathMessage = LegacyComponentSerializer.legacySection().serializeOrNull(component); |
| 68 | + }else{ |
| 69 | + //noinspection deprecation |
| 70 | + deathMessage = event.getDeathMessage(); |
| 71 | + } |
| 72 | + |
| 73 | + if (deathMessage == null) { |
47 | 74 | deathMessage = event.getEntity().getName() + " died"; |
48 | 75 | } |
49 | 76 | final String message = deathMessage; |
50 | 77 | String killer = getKiller(event.getEntity()); |
51 | | - new Thread(() -> { |
52 | | - Easybot |
53 | | - .getClient() |
54 | | - .syncDeathMessage(playerInfo, message, killer); |
55 | | - }, "EasyBotThread-SyncPlayerDeath").start(); |
| 78 | + new Thread(() -> Easybot.getClient().syncDeathMessage(playerInfo, message, killer), "EasyBotThread-SyncPlayerDeath").start(); |
56 | 79 | } |
57 | 80 | } |
0 commit comments