-
-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathTNTTracking.java
More file actions
134 lines (116 loc) · 4.9 KB
/
Copy pathTNTTracking.java
File metadata and controls
134 lines (116 loc) · 4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package net.countercraft.movecraft.combat.features.tracking;
import net.countercraft.movecraft.combat.MovecraftCombat;
import net.countercraft.movecraft.combat.event.ExplosionDamagePlayerCraftEvent;
import net.countercraft.movecraft.combat.features.directors.CannonDirectors;
import net.countercraft.movecraft.combat.features.tracking.events.CraftDamagedByEvent;
import net.countercraft.movecraft.combat.features.tracking.events.CraftFireWeaponEvent;
import net.countercraft.movecraft.combat.features.tracking.types.TNTCannon;
import net.countercraft.movecraft.craft.Craft;
import net.countercraft.movecraft.craft.CraftManager;
import net.countercraft.movecraft.craft.PlayerCraft;
import net.countercraft.movecraft.craft.SinkingCraft;
import net.countercraft.movecraft.util.MathUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Dispenser;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.UUID;
public class TNTTracking implements Listener {
@NotNull
private final DamageTracking manager;
@NotNull
private final CannonDirectors directors;
public TNTTracking(@NotNull DamageTracking manager, @NotNull CannonDirectors directors) {
this.manager = manager;
this.directors = directors;
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onExplosionDamagePlayerCraft(@NotNull ExplosionDamagePlayerCraftEvent e) {
if (!DamageTracking.EnableTNTTracking)
return;
if (!(e.getDamaging() instanceof TNTPrimed))
return;
TNTPrimed tnt = (TNTPrimed) e.getDamaging();
List<MetadataValue> meta = tnt.getMetadata("MCC-Sender");
if (meta.isEmpty())
return;
UUID sender = UUID.fromString(meta.get(0).asString());
Player cause = Bukkit.getServer().getPlayer(sender);
if (cause == null || !cause.isOnline())
return;
var craft = e.getDamaged();
DamageRecord damageRecord = new DamageRecord(cause, craft.getPilot(), new TNTCannon());
Bukkit.getPluginManager().callEvent(new CraftDamagedByEvent(craft, damageRecord));
}
@NotNull
private Vector getTNTVector() {
Vector v = new Vector(0, 0.2, 0);
double angle = Math.random() * 2 * Math.PI;
v.setX(0.02 * Math.cos(angle));
v.setZ(0.02 * Math.sin(angle));
return v;
}
@EventHandler
public void onEntitySpawn(@NotNull EntitySpawnEvent e) {
if (!DamageTracking.EnableTNTTracking)
return;
if (!e.getEntityType().equals(EntityType.TNT))
return;
TNTPrimed tnt = (TNTPrimed) e.getEntity();
// Find nearest craft
Craft craft = MathUtils.fastNearestCraftToLoc(CraftManager.getInstance().getCrafts(),
tnt.getLocation());
if (craft instanceof SinkingCraft && DamageTracking.DisableSinkingCraftTNT) {
e.setCancelled(true);
return;
}
else if (craft != null && craft.getDisabled() && DamageTracking.DisableDisabledCraftTNT) {
e.setCancelled(true);
return;
}
if (!(craft instanceof PlayerCraft))
return;
if (!craft.getHitBox().contains(MathUtils.bukkit2MovecraftLoc(tnt.getLocation()))) {
//check adjacent blocks
boolean found = false;
Block center = tnt.getLocation().getBlock();
for (BlockFace face : BlockFace.values()) {
if (craft.getHitBox().contains(MathUtils.bukkit2MovecraftLoc(center.getRelative(face).getLocation()))) {
found = true;
break;
}
}
if (!found) return;
}
// Report to tracking
PlayerCraft playerCraft = (PlayerCraft) craft;
Player sender;
if (directors.hasDirector(playerCraft))
sender = directors.getDirector(playerCraft);
else
sender = playerCraft.getPilot();
if (sender == null)
return;
tnt.setMetadata("MCC-Sender", new FixedMetadataValue(MovecraftCombat.getInstance(), sender.getUniqueId().toString()));
CraftFireWeaponEvent event = new CraftFireWeaponEvent(playerCraft, new TNTCannon());
Bukkit.getPluginManager().callEvent(event);
}
}