Skip to content

Commit 8327d58

Browse files
committed
更新: 给 ParticleObject 增加 calculateLocations 的抽象方法 可通过该方法获得粒子播放位置的 List
1 parent 1e28df4 commit 8327d58

23 files changed

Lines changed: 491 additions & 7 deletions

src/main/java/top/zoyn/particlelib/pobject/Arc.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Location;
45
import org.bukkit.scheduler.BukkitRunnable;
56
import top.zoyn.particlelib.ParticleLib;
67

8+
import java.util.List;
9+
710
/**
811
* 表示一个弧
912
*
@@ -33,7 +36,6 @@ public Arc(Location origin, double startAngle, double angle, double radius) {
3336
this(origin, startAngle, angle, radius, 1);
3437
}
3538

36-
3739
/**
3840
* 构造一个弧
3941
*
@@ -66,6 +68,18 @@ public Arc(Location origin, double startAngle, double angle, double radius, doub
6668
setPeriod(period);
6769
}
6870

71+
@Override
72+
public List<Location> calculateLocations() {
73+
List<Location> points = Lists.newArrayList();
74+
for (double i = startAngle; i < angle; i += step) {
75+
double radians = Math.toRadians(i);
76+
double x = radius * Math.cos(radians);
77+
double z = radius * Math.sin(radians);
78+
points.add(getOrigin().clone().add(x, 0, z));
79+
}
80+
return points;
81+
}
82+
6983
@Override
7084
public void show() {
7185
for (double i = startAngle; i < angle; i += step) {

src/main/java/top/zoyn/particlelib/pobject/Astroid.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Location;
45
import org.bukkit.scheduler.BukkitRunnable;
56
import top.zoyn.particlelib.ParticleLib;
67

8+
import java.util.List;
9+
710
/**
811
* 表示一个星形线
912
*
@@ -41,6 +44,20 @@ public Astroid(double radius, Location origin, double step) {
4144
setOrigin(origin);
4245
}
4346

47+
@Override
48+
public List<Location> calculateLocations() {
49+
List<Location> points = Lists.newArrayList();
50+
for (double t = 0.0D; t < 360.0D; t += step) {
51+
double radians = Math.toRadians(t);
52+
// 计算公式
53+
double x = Math.pow(this.radius * Math.cos(radians), 3.0D);
54+
double z = Math.pow(this.radius * Math.sin(radians), 3.0D);
55+
56+
points.add(getOrigin().clone().add(x, 0, z));
57+
}
58+
return points;
59+
}
60+
4461
@Override
4562
public void show() {
4663
for (double t = 0.0D; t < 360.0D; t += step) {

src/main/java/top/zoyn/particlelib/pobject/Cube.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Location;
45
import org.bukkit.util.Vector;
56
import top.zoyn.particlelib.utils.VectorUtils;
67

8+
import java.util.List;
9+
710
/**
811
* 表示一个立方体特效
912
*
@@ -69,6 +72,55 @@ public void setStep(double step) {
6972
this.step = step;
7073
}
7174

75+
@Override
76+
public List<Location> calculateLocations() {
77+
List<Location> points = Lists.newArrayList();
78+
// 获得最大最小的两个点
79+
double minX = Math.min(minLoc.getX(), maxLoc.getX());
80+
double minY = Math.min(minLoc.getY(), maxLoc.getY());
81+
double minZ = Math.min(minLoc.getZ(), maxLoc.getZ());
82+
83+
double maxX = Math.max(minLoc.getX(), maxLoc.getX());
84+
double maxY = Math.max(minLoc.getY(), maxLoc.getY());
85+
double maxZ = Math.max(minLoc.getZ(), maxLoc.getZ());
86+
87+
Location minLoc = new Location(this.minLoc.getWorld(), minX, minY, minZ);
88+
89+
// 获得立方体的 长 宽 高
90+
double width = maxX - minX;
91+
double height = maxY - minY;
92+
double depth = maxZ - minZ;
93+
94+
// 此处的 newOrigin是底部的四个点
95+
Location newOrigin = minLoc;
96+
double length;
97+
// 这里直接得到向X正半轴方向的向量
98+
Vector vector = RIGHT.clone();
99+
for (int i = 1; i <= 4; i++) {
100+
if (i % 2 == 0) {
101+
length = depth;
102+
} else {
103+
length = width;
104+
}
105+
106+
// 4条高
107+
for (double j = 0; j < height; j += step) {
108+
points.add(newOrigin.clone().add(UP.clone().multiply(j)));
109+
}
110+
111+
// 第n条边
112+
for (double j = 0; j < length; j += step) {
113+
Location spawnLoc = newOrigin.clone().add(vector.clone().multiply(j));
114+
points.add(spawnLoc);
115+
points.add(spawnLoc.add(0, height, 0));
116+
}
117+
// 获取结束时的坐标
118+
newOrigin = newOrigin.clone().add(vector.clone().multiply(length));
119+
vector = VectorUtils.rotateAroundAxisY(vector, 90D);
120+
}
121+
return points;
122+
}
123+
72124
@Override
73125
public void show() {
74126
// 获得最大最小的两个点

src/main/java/top/zoyn/particlelib/pobject/FilledCircle.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,22 @@ public void show() {
4949
}
5050
}
5151

52+
@Override
53+
public List<Location> calculateLocations() {
54+
List<Location> locations = new ArrayList<>();
55+
for (int i = 0; i < sample; i++) {
56+
double indices = i + 0.5;
57+
double r = Math.sqrt(indices / sample);
58+
double theta = Math.PI * (1 + Math.sqrt(5)) * indices;
59+
double x = radius * r * Math.cos(theta);
60+
double z = radius * r * Math.sin(theta);
61+
62+
Location spawnLocation = getOrigin().clone().add(x, 0, z);
63+
locations.add(spawnLocation);
64+
}
65+
return locations;
66+
}
67+
5268
/**
5369
* 获得实心圆中所有点的Location
5470
*

src/main/java/top/zoyn/particlelib/pobject/Grid.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Location;
45
import org.bukkit.util.Vector;
56

7+
import java.util.List;
8+
69
public class Grid extends ParticleObject {
710

811
private final double gridLength;
@@ -39,6 +42,82 @@ public Grid(Location minimumLocation, Location maximumLocation, double gridLengt
3942
this.gridLength = gridLength;
4043
}
4144

45+
@Override
46+
public List<Location> calculateLocations() {
47+
List<Location> points = Lists.newArrayList();
48+
// 为防止给定的最小和最高点出现反向的情况, 这里做了个查找操作
49+
Location minLocation = findMinimumLocation();
50+
Location maxLocation = findMaximumLocation();
51+
52+
double height;
53+
double width;
54+
55+
// 在Y平面下有点不一样
56+
if (isYDimension) {
57+
height = Math.abs(minLocation.getX() - maxLocation.getX());
58+
width = Math.abs(minLocation.getZ() - maxLocation.getZ());
59+
} else {
60+
height = Math.abs(maximumLocation.getY() - minimumLocation.getY());
61+
if (isXDimension) {
62+
width = Math.abs(maximumLocation.getX() - minimumLocation.getX());
63+
} else {
64+
width = Math.abs(maximumLocation.getZ() - minimumLocation.getZ());
65+
}
66+
}
67+
int heightSideLine = (int) (height / gridLength);
68+
int widthSideLine = (int) (width / gridLength);
69+
70+
if (isYDimension) {
71+
for (int i = 1; i <= heightSideLine; i++) {
72+
Vector vector = maxLocation.clone().subtract(minLocation).toVector();
73+
vector.setZ(0).normalize();
74+
75+
Location start = minLocation.clone().add(0, 0, i * gridLength);
76+
for (double j = 0; j < width; j += 0.2) {
77+
points.add(start.clone().add(vector.clone().multiply(j)));
78+
}
79+
}
80+
81+
for (int i = 1; i <= widthSideLine; i++) {
82+
Vector vector = maxLocation.clone().subtract(minLocation).toVector();
83+
vector.setX(0).normalize();
84+
Location start = minLocation.clone().add(i * gridLength, 0, 0);
85+
86+
for (double j = 0; j < height; j += 0.2) {
87+
points.add(start.clone().add(vector.clone().multiply(j)));
88+
}
89+
}
90+
return points;
91+
}
92+
93+
for (int i = 1; i <= heightSideLine; i++) {
94+
Vector vector = maxLocation.clone().subtract(minLocation).toVector();
95+
vector.setY(0).normalize();
96+
97+
Location start = minLocation.clone().add(0, i * gridLength, 0);
98+
for (double j = 0; j < width; j += 0.2) {
99+
points.add(start.clone().add(vector.clone().multiply(j)));
100+
}
101+
}
102+
103+
for (int i = 1; i <= widthSideLine; i++) {
104+
Vector vector = maxLocation.clone().subtract(minLocation).toVector();
105+
Location start;
106+
if (isXDimension) {
107+
vector.setX(0).normalize();
108+
start = minLocation.clone().add(i * gridLength, 0, 0);
109+
} else {
110+
vector.setZ(0).normalize();
111+
start = minLocation.clone().add(0, 0, i * gridLength);
112+
}
113+
114+
for (double j = 0; j < height; j += 0.2) {
115+
points.add(start.clone().add(vector.clone().multiply(j)));
116+
}
117+
}
118+
return points;
119+
}
120+
42121
@Override
43122
public void show() {
44123
// 为防止给定的最小和最高点出现反向的情况, 这里做了个查找操作

src/main/java/top/zoyn/particlelib/pobject/Heart.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Location;
45
import org.bukkit.scheduler.BukkitRunnable;
56
import top.zoyn.particlelib.ParticleLib;
67

8+
import java.util.List;
9+
710
/**
811
* 表示一颗心
912
*
@@ -66,6 +69,18 @@ public void setStep(double step) {
6669
this.step = step;
6770
}
6871

72+
@Override
73+
public List<Location> calculateLocations() {
74+
List<Location> points = Lists.newArrayList();
75+
for (double t = -1.0D; t <= 1.0D; t += step) {
76+
double x = xScaleRate * Math.sin(t) * Math.cos(t) * Math.log(Math.abs(t));
77+
double y = yScaleRate * Math.sqrt(Math.abs(t)) * Math.cos(t);
78+
79+
points.add(getOrigin().clone().add(x, 0, y));
80+
}
81+
return points;
82+
}
83+
6984
@Override
7085
public void show() {
7186
for (double t = -1.0D; t <= 1.0D; t += step) {

src/main/java/top/zoyn/particlelib/pobject/Line.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Color;
45
import org.bukkit.Location;
56
import org.bukkit.Particle;
67
import org.bukkit.scheduler.BukkitRunnable;
78
import org.bukkit.util.Vector;
89
import top.zoyn.particlelib.ParticleLib;
910

11+
import java.util.List;
12+
1013
/**
1114
* 表示一条线
1215
*
@@ -78,6 +81,16 @@ public static void buildLine(Location locA, Location locB, double step, Color co
7881
}
7982
}
8083

84+
@Override
85+
public List<Location> calculateLocations() {
86+
List<Location> points = Lists.newArrayList();
87+
for (double i = 0; i < length; i += step) {
88+
Vector vectorTemp = vector.clone().multiply(i);
89+
points.add(start.clone().add(vectorTemp));
90+
}
91+
return points;
92+
}
93+
8194
@Override
8295
public void show() {
8396
for (double i = 0; i < length; i += step) {

src/main/java/top/zoyn/particlelib/pobject/Lotus.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,71 @@
11
package top.zoyn.particlelib.pobject;
22

3+
import com.google.common.collect.Lists;
34
import org.bukkit.Location;
45
import top.zoyn.particlelib.utils.LocationUtils;
56

7+
import java.util.List;
8+
69
public class Lotus extends ParticleObject {
710

811
public Lotus(Location origin) {
912
setOrigin(origin);
1013
}
1114

15+
@Override
16+
public List<Location> calculateLocations() {
17+
List<Location> points = Lists.newArrayList();
18+
// 外围花瓣
19+
for (double t = -0.15D; t <= 0.15D; t += 0.005D) {
20+
double x = 5 * Math.sin(t) * Math.cos(t) * Math.log(Math.abs(t));
21+
double y = 5 * Math.sqrt(Math.abs(t)) * Math.cos(t);
22+
y -= 5;
23+
24+
Location spawn = getOrigin().clone().add(x, 0, y);
25+
for (int i = 0; i <= 8; i++) {
26+
Location temp = LocationUtils.rotateLocationAboutPoint(spawn, 360D / 8D * i, getOrigin());
27+
points.add(temp);
28+
}
29+
30+
points.add(spawn);
31+
}
32+
33+
// 内圈花瓣
34+
for (double t = -0.2D; t <= 0.2D; t += 0.01D) {
35+
double x = 3 * Math.sin(t) * Math.cos(t) * Math.log(Math.abs(t));
36+
double y = 3 * Math.sqrt(Math.abs(t)) * Math.cos(t);
37+
y -= 3.65;
38+
39+
Location spawn = getOrigin().clone().add(x, 0, y);
40+
spawn = LocationUtils.rotateLocationAboutPoint(spawn, 22D, getOrigin());
41+
42+
for (int i = 0; i <= 8; i++) {
43+
Location temp = LocationUtils.rotateLocationAboutPoint(spawn, 360D / 8D * i, getOrigin());
44+
points.add(temp);
45+
}
46+
47+
points.add(spawn);
48+
}
49+
50+
// 最外层小花瓣
51+
for (double t = -0.1D; t <= 0.1D; t += 0.01D) {
52+
double x = 2 * Math.sin(t) * Math.cos(t) * Math.log(Math.abs(t));
53+
double y = 2 * Math.sqrt(Math.abs(t)) * Math.cos(t);
54+
y -= 4.6;
55+
56+
Location spawn = getOrigin().clone().add(x, 0, y);
57+
spawn = LocationUtils.rotateLocationAboutPoint(spawn, 22D, getOrigin());
58+
59+
for (int i = 0; i <= 8; i++) {
60+
Location temp = LocationUtils.rotateLocationAboutPoint(spawn, 360D / 8D * i, getOrigin());
61+
points.add(temp);
62+
}
63+
64+
points.add(spawn);
65+
}
66+
return points;
67+
}
68+
1269
@Override
1370
public void show() {
1471
// 外围花瓣

0 commit comments

Comments
 (0)