Skip to content

Commit f98dd14

Browse files
committed
progress
1 parent 00282c6 commit f98dd14

File tree

10 files changed

+73
-95
lines changed

10 files changed

+73
-95
lines changed

core/src/main/java/tc/oc/pgm/projectile/ProjectileDefinition.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
import java.time.Duration;
44
import java.util.List;
55
import org.bukkit.entity.Entity;
6+
import org.bukkit.entity.FallingBlock;
67
import org.bukkit.potion.PotionEffect;
78
import org.jetbrains.annotations.Nullable;
89
import tc.oc.pgm.api.filter.Filter;
910
import tc.oc.pgm.features.SelfIdentifyingFeatureDefinition;
1011
import tc.oc.pgm.util.material.BlockMaterialData;
12+
import tc.oc.pgm.util.nms.NMSHacks;
1113

1214
public class ProjectileDefinition extends SelfIdentifyingFeatureDefinition {
1315
protected @Nullable String name;
@@ -22,9 +24,6 @@ public class ProjectileDefinition extends SelfIdentifyingFeatureDefinition {
2224
protected boolean throwable;
2325
protected boolean precise;
2426
protected BlockMaterialData blockMaterial;
25-
protected float scale;
26-
protected boolean solidBlockCollision;
27-
protected Duration maxTravelTime;
2827

2928
public ProjectileDefinition(
3029
@Nullable String id,
@@ -39,10 +38,7 @@ public ProjectileDefinition(
3938
Duration coolDown,
4039
boolean throwable,
4140
boolean precise,
42-
BlockMaterialData blockMaterial,
43-
float scale,
44-
boolean solidBlockCollision,
45-
Duration maxTravelTime) {
41+
BlockMaterialData blockMaterial) {
4642
super(id);
4743
this.name = name;
4844
this.damage = damage;
@@ -56,29 +52,32 @@ public ProjectileDefinition(
5652
this.throwable = throwable;
5753
this.precise = precise;
5854
this.blockMaterial = blockMaterial;
59-
this.scale = scale;
60-
this.solidBlockCollision = solidBlockCollision;
61-
this.maxTravelTime = maxTravelTime;
6255
}
6356

64-
public static sealed class ProjectileEntity {
65-
public static final class RealEntity extends ProjectileEntity {
66-
public final Class<? extends Entity> entityType;
57+
public sealed interface ProjectileEntity permits ProjectileEntity.RealEntity, ProjectileEntity.CustomEntity {
58+
59+
boolean acceptsBlockMaterial();
6760

68-
public RealEntity(Class<? extends Entity> entityType) {
69-
this.entityType = entityType;
61+
record RealEntity(Class<? extends Entity> entityType) implements ProjectileEntity {
62+
@Override
63+
public boolean acceptsBlockMaterial() {
64+
return entityType.isAssignableFrom(FallingBlock.class) || NMSHacks.NMS_HACKS.isBlockDisplayEntity(entityType);
7065
}
7166
}
7267

73-
public static final class AbstractEntity extends ProjectileEntity {
74-
public final AbstractEntityType entityType;
75-
76-
public AbstractEntity(AbstractEntityType entityType) {
77-
this.entityType = entityType;
68+
record CustomEntity(
69+
CustomEntityType entityType,
70+
float size,
71+
boolean solidBlockCollision,
72+
Duration maxTravelTime
73+
) implements ProjectileEntity {
74+
@Override
75+
public boolean acceptsBlockMaterial() {
76+
return entityType == ProjectileDefinition.ProjectileEntity.CustomEntityType.BLOCK;
7877
}
7978
}
8079

81-
enum AbstractEntityType {
80+
enum CustomEntityType {
8281
BLOCK
8382
}
8483
}

core/src/main/java/tc/oc/pgm/projectile/ProjectileMatchModule.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import java.util.Collection;
99
import java.util.HashMap;
1010
import java.util.UUID;
11-
import java.util.concurrent.*;
11+
import java.util.concurrent.ScheduledExecutorService;
12+
import java.util.concurrent.ScheduledFuture;
13+
import java.util.concurrent.TimeUnit;
1214
import java.util.function.BooleanSupplier;
1315

1416
import org.bukkit.Location;
@@ -57,9 +59,7 @@
5759
import tc.oc.pgm.util.bukkit.MetadataUtils;
5860
import tc.oc.pgm.util.inventory.InventoryUtils;
5961
import tc.oc.pgm.util.nms.NMSHacks;
60-
import tc.oc.pgm.util.nms.packets.BlockEntity;
61-
import tc.oc.pgm.util.nms.packets.FakeEntity;
62-
import tc.oc.pgm.util.nms.packets.Packet;
62+
import tc.oc.pgm.util.nms.entities.BlockEntity;
6363

6464
@ListenerScope(MatchScope.RUNNING)
6565
public class ProjectileMatchModule implements MatchModule, Listener {
@@ -101,10 +101,12 @@ && isValidProjectileAction(event.getAction(), projectileDefinition.clickAction))
101101

102102
if (this.isCooldownActive(player, projectileDefinition)) return;
103103

104-
boolean realProjectile = false;
104+
var projType = projectileDefinition.projectile;
105+
boolean realProjectile = projType instanceof ProjectileDefinition.ProjectileEntity.RealEntity re
106+
&& Projectile.class.isAssignableFrom(re.entityType());
105107
if (projectileDefinition.projectile instanceof ProjectileDefinition.ProjectileEntity.RealEntity) {
106108
realProjectile = Projectile.class.isAssignableFrom(
107-
((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType
109+
((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType()
108110
);
109111
}
110112
Vector velocity =
@@ -116,7 +118,7 @@ && isValidProjectileAction(event.getAction(), projectileDefinition.clickAction))
116118
launchingDefinition.set(projectileDefinition);
117119
if (realProjectile) {
118120
projectile = player.launchProjectile(
119-
(((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType)
121+
(((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType())
120122
.asSubclass(Projectile.class),
121123
velocity
122124
);
@@ -125,20 +127,20 @@ && isValidProjectileAction(event.getAction(), projectileDefinition.clickAction))
125127
}
126128
} else {
127129
if ((projectileDefinition.projectile instanceof ProjectileDefinition.ProjectileEntity.RealEntity) &&
128-
FallingBlock.class.isAssignableFrom((((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType))) {
130+
FallingBlock.class.isAssignableFrom((((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType()))) {
129131
projectile =
130132
projectileDefinition.blockMaterial.spawnFallingBlock(player.getEyeLocation());
131133
} else {
132134
Location loc = player.getEyeLocation();
133-
if ((projectileDefinition.projectile instanceof ProjectileDefinition.ProjectileEntity.AbstractEntity) &&
134-
((ProjectileDefinition.ProjectileEntity.AbstractEntity) projectileDefinition.projectile).entityType == ProjectileDefinition.ProjectileEntity.AbstractEntityType.BLOCK) {
135+
if ((projectileDefinition.projectile instanceof ProjectileDefinition.ProjectileEntity.CustomEntity ce) &&
136+
ce.entityType() == ProjectileDefinition.ProjectileEntity.CustomEntityType.BLOCK) {
135137
loc.setPitch(0);
136138
loc.setYaw(0);
137139
blockEntity = ENTITIES.spawnBlockEntity(loc, projectileDefinition.blockMaterial);
138140
projectile = blockEntity.entity();
139-
} else if (projectileDefinition.projectile instanceof ProjectileDefinition.ProjectileEntity.RealEntity) {
141+
} else if (projectileDefinition.projectile instanceof ProjectileDefinition.ProjectileEntity.RealEntity re) {
140142
projectile =
141-
player.getWorld().spawn(loc, ((ProjectileDefinition.ProjectileEntity.RealEntity) projectileDefinition.projectile).entityType);
143+
player.getWorld().spawn(loc, re.entityType());
142144
}
143145
}
144146
projectile.setVelocity(velocity);
@@ -261,9 +263,9 @@ private Location calculateTo(
261263
}
262264

263265
private static void runFixedTimesAtPeriod(
264-
final ScheduledExecutorService scheduledExecutorService, final BooleanSupplier runnable,
265-
final long periodTicks, final long upperBoundMillis,
266-
final Runnable finishHandler
266+
final ScheduledExecutorService scheduledExecutorService, final BooleanSupplier runnable,
267+
final long periodTicks, final long upperBoundMillis,
268+
final Runnable finishHandler
267269
) {
268270
final ScheduledFuture<?>[] ref = new ScheduledFuture[2];
269271
final ScheduledFuture<?> mainTask = scheduledExecutorService.scheduleAtFixedRate(
Lines changed: 26 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
package tc.oc.pgm.projectile;
22

33
import com.google.common.collect.ImmutableList;
4-
import com.google.common.collect.ImmutableMap;
54
import com.google.common.collect.ImmutableSet;
6-
import java.time.Duration;
7-
import java.util.Collection;
8-
import java.util.HashSet;
9-
import java.util.List;
10-
import java.util.Map;
11-
import java.util.Set;
12-
import java.util.logging.Logger;
135
import org.bukkit.entity.Arrow;
146
import org.bukkit.entity.Entity;
15-
import org.bukkit.entity.FallingBlock;
167
import org.bukkit.potion.PotionEffect;
178
import org.jdom2.Document;
189
import org.jdom2.Element;
@@ -25,11 +16,19 @@
2516
import tc.oc.pgm.filters.parse.FilterParser;
2617
import tc.oc.pgm.kits.KitParser;
2718
import tc.oc.pgm.util.material.BlockMaterialData;
28-
import tc.oc.pgm.util.nms.NMSHacks;
2919
import tc.oc.pgm.util.xml.InvalidXMLException;
3020
import tc.oc.pgm.util.xml.Node;
21+
import tc.oc.pgm.util.xml.XMLFluentParser;
3122
import tc.oc.pgm.util.xml.XMLUtils;
3223

24+
import java.time.Duration;
25+
import java.util.Collection;
26+
import java.util.HashSet;
27+
import java.util.List;
28+
import java.util.Locale;
29+
import java.util.Set;
30+
import java.util.logging.Logger;
31+
3332
public class ProjectileModule implements MapModule<ProjectileMatchModule> {
3433
private final ImmutableSet<ProjectileDefinition> projectileDefinitions;
3534

@@ -65,9 +64,8 @@ public ProjectileModule parse(MapFactory factory, Logger logger, Document doc)
6564
Node.fromChildOrAttr(projectileElement, "velocity"), Double.class, 1.0);
6665
ClickAction clickAction = XMLUtils.parseEnum(
6766
Node.fromAttr(projectileElement, "click"), ClickAction.class, ClickAction.BOTH);
68-
ProjectileDefinition.ProjectileEntity entity =
69-
parseProjectileEntity(projectileElement, "projectile", Arrow.class);
70-
BlockMaterialData blockMaterial = acceptsBlockMaterial(entity)
67+
ProjectileDefinition.ProjectileEntity entity = parseProjectileEntity(projectileElement, factory.getParser());
68+
BlockMaterialData blockMaterial = entity.acceptsBlockMaterial()
7169
? XMLUtils.parseBlockMaterialData(Node.fromAttr(projectileElement, "material"))
7270
: null;
7371
Float power = XMLUtils.parseNumber(
@@ -79,9 +77,6 @@ public ProjectileModule parse(MapFactory factory, Logger logger, Document doc)
7977
boolean throwable =
8078
XMLUtils.parseBoolean(projectileElement.getAttribute("throwable"), true);
8179
boolean precise = XMLUtils.parseBoolean(projectileElement.getAttribute("precise"), true);
82-
float scale = XMLUtils.parseNumber(Node.fromChildOrAttr(projectileElement, "scale"), Float.class, 1.0f);
83-
boolean solidBlockCollision = XMLUtils.parseBoolean(projectileElement.getAttribute("solid-block-collision"), true);
84-
Duration maxTravelTime = XMLUtils.parseDuration(projectileElement.getAttribute("max-travel-time"), Duration.ofSeconds(1));
8580

8681
ProjectileDefinition projectileDefinition = new ProjectileDefinition(
8782
id,
@@ -96,10 +91,8 @@ public ProjectileModule parse(MapFactory factory, Logger logger, Document doc)
9691
coolDown,
9792
throwable,
9893
precise,
99-
blockMaterial,
100-
scale,
101-
solidBlockCollision,
102-
maxTravelTime);
94+
blockMaterial
95+
);
10396

10497
factory.getFeatures().addFeature(projectileElement, projectileDefinition);
10598
projectiles.add(projectileDefinition);
@@ -108,41 +101,25 @@ public ProjectileModule parse(MapFactory factory, Logger logger, Document doc)
108101
return projectiles.isEmpty() ? null : new ProjectileModule(ImmutableSet.copyOf(projectiles));
109102
}
110103

111-
private static final Map<String, ProjectileDefinition.ProjectileEntity.AbstractEntity> ABSTRACT_ENTITY_MAP =
112-
ImmutableMap.of(
113-
"block", new ProjectileDefinition.ProjectileEntity.AbstractEntity(
114-
ProjectileDefinition.ProjectileEntity.AbstractEntityType.BLOCK
115-
)
116-
);
117-
118104
private static ProjectileDefinition.ProjectileEntity parseProjectileEntity(
119-
final Element element,
120-
final String attributeName,
121-
final Class<? extends Entity> def
105+
final Element el, final XMLFluentParser parser
122106
) throws InvalidXMLException {
123-
final Node node = Node.fromAttr(element, attributeName);
107+
final String attributeName = "projectile";
108+
final Class<? extends Entity> def = Arrow.class;
109+
final Node node = Node.fromAttr(el, attributeName);
124110
if (node == null) {
125111
return new ProjectileDefinition.ProjectileEntity.RealEntity(def);
126112
}
127113
final String entityText = node.getValue();
128-
if (!entityText.matches("[a-zA-Z0-9_]+")) {
129-
throw new InvalidXMLException("Invalid entity type '" + entityText + "'", node);
130-
}
131-
if (ABSTRACT_ENTITY_MAP.containsKey(entityText.toLowerCase())) {
132-
return ABSTRACT_ENTITY_MAP.get(entityText.toLowerCase());
133-
}
134-
return new ProjectileDefinition.ProjectileEntity.RealEntity(XMLUtils.parseEntityTypeAttribute(element, attributeName, def));
135-
}
136-
137-
private static boolean acceptsBlockMaterial(final ProjectileDefinition.ProjectileEntity entity) {
138-
if (entity instanceof ProjectileDefinition.ProjectileEntity.RealEntity) {
139-
final Class<? extends Entity> cls = ((ProjectileDefinition.ProjectileEntity.RealEntity) entity).entityType;
140-
return cls.isAssignableFrom(FallingBlock.class) || NMSHacks.NMS_HACKS.isBlockDisplayEntity(cls);
141-
} else if (entity instanceof ProjectileDefinition.ProjectileEntity.AbstractEntity) {
142-
return ((ProjectileDefinition.ProjectileEntity.AbstractEntity) entity).entityType ==
143-
ProjectileDefinition.ProjectileEntity.AbstractEntityType.BLOCK;
144-
}
145-
return false;
114+
return switch (entityText.toLowerCase(Locale.ROOT)) {
115+
case "block" -> new ProjectileDefinition.ProjectileEntity.CustomEntity(
116+
ProjectileDefinition.ProjectileEntity.CustomEntityType.BLOCK,
117+
parser.parseFloat(el, "size").optional(1.0f),
118+
parser.parseBool(el, "solid-block-collision").orTrue(),
119+
parser.duration(el, "max-travel-time").optional(Duration.ofSeconds(1))
120+
);
121+
default -> new ProjectileDefinition.ProjectileEntity.RealEntity(XMLUtils.parseEntityType(el));
122+
};
146123
}
147124
}
148125
}

core/src/main/java/tc/oc/pgm/util/xml/XMLFluentParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ public NumberBuilder<Double> parseDouble(Element el, String... prop) {
9393
return number(Double.class, el, prop);
9494
}
9595

96+
public NumberBuilder<Float> parseFloat(Element el, String... prop) {
97+
return number(Float.class, el, prop);
98+
}
99+
96100
public <T extends Number> NumberBuilder<T> number(Class<T> cls, Element el, String... prop) {
97101
return new NumberBuilder<>(cls, el, prop);
98102
}

platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/entities/DisplayEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.joml.Matrix4f;
77
import org.joml.Quaternionf;
88
import org.joml.Vector3f;
9-
import tc.oc.pgm.util.nms.packets.BlockEntity;
9+
import tc.oc.pgm.util.nms.entities.BlockEntity;
1010

1111
public record DisplayEntity(Entity entity) implements BlockEntity {
1212
@Override

platform/platform-modern/src/main/java/tc/oc/pgm/platform/modern/packets/ModernEntityPackets.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import net.minecraft.world.entity.EntityType;
1818
import net.minecraft.world.entity.EquipmentSlot;
1919
import net.minecraft.world.entity.decoration.ArmorStand;
20-
import net.minecraft.world.phys.Vec3;
2120
import org.bukkit.Location;
2221
import org.bukkit.craftbukkit.entity.CraftEntity;
2322
import org.bukkit.craftbukkit.inventory.CraftItemStack;
@@ -28,14 +27,11 @@
2827
import org.bukkit.util.Vector;
2928
import tc.oc.pgm.platform.modern.entities.DisplayEntity;
3029
import tc.oc.pgm.util.material.BlockMaterialData;
31-
import tc.oc.pgm.util.nms.packets.BlockEntity;
30+
import tc.oc.pgm.util.nms.entities.BlockEntity;
3231
import tc.oc.pgm.util.nms.packets.EntityPackets;
3332
import tc.oc.pgm.util.nms.packets.Packet;
3433
import tc.oc.pgm.util.platform.Supports;
3534

36-
import java.util.List;
37-
import java.util.UUID;
38-
3935
import static net.minecraft.world.entity.Entity.FLAG_INVISIBLE;
4036
import static tc.oc.pgm.util.platform.Supports.Variant.PAPER;
4137

platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/entities/FallingBlock.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import org.bukkit.Material;
44
import org.bukkit.entity.Entity;
5-
import tc.oc.pgm.util.nms.packets.BlockEntity;
5+
import tc.oc.pgm.util.nms.entities.BlockEntity;
66

77
public record FallingBlock(Entity entity) implements BlockEntity {
88
@Override

platform/platform-sportpaper/src/main/java/tc/oc/pgm/platform/sportpaper/packets/SpEntityPackets.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@
1919
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
2020
import org.bukkit.entity.Entity;
2121
import org.bukkit.entity.EntityType;
22-
import org.bukkit.entity.FallingBlock;
2322
import org.bukkit.inventory.EquipmentSlot;
2423
import org.bukkit.inventory.ItemStack;
2524
import org.bukkit.util.Vector;
2625
import tc.oc.pgm.util.material.BlockMaterialData;
27-
import tc.oc.pgm.util.nms.packets.BlockEntity;
26+
import tc.oc.pgm.util.nms.entities.BlockEntity;
2827
import tc.oc.pgm.util.nms.packets.EntityPackets;
2928
import tc.oc.pgm.util.nms.packets.Packet;
3029
import tc.oc.pgm.util.platform.Supports;

util/src/main/java/tc/oc/pgm/util/nms/packets/BlockEntity.java renamed to util/src/main/java/tc/oc/pgm/util/nms/entities/BlockEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tc.oc.pgm.util.nms.packets;
1+
package tc.oc.pgm.util.nms.entities;
22

33
import org.bukkit.Material;
44
import org.bukkit.entity.Entity;

util/src/main/java/tc/oc/pgm/util/nms/packets/EntityPackets.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import tc.oc.pgm.util.StringUtils;
1717
import tc.oc.pgm.util.nms.EnumPlayerInfoAction;
1818
import tc.oc.pgm.util.material.BlockMaterialData;
19+
import tc.oc.pgm.util.nms.entities.BlockEntity;
1920

2021
public interface EntityPackets {
2122

0 commit comments

Comments
 (0)