Skip to content

Commit b9c668d

Browse files
Added optional coordinate for sequencer feature
1 parent 1b1926d commit b9c668d

File tree

4 files changed

+63
-44
lines changed

4 files changed

+63
-44
lines changed

src/main/java/me/m64diamondstar/effectmaster/locations/LocationUtils.kt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -269,27 +269,27 @@ object LocationUtils {
269269
* Gets a list of all the values in the sequencer
270270
* @param value The sequencer value in the format of "ticks:width,height;ticks:width,height;..."
271271
*/
272-
fun getDoubleSequencerValues(value: String): Map<Int, Triple<Double, Double, Material?>>?{
272+
fun getDoubleSequencerValues(value: String): Map<Int, Triple<Double?, Double?, Material?>>?{
273273
try {
274274
val values = value.split(";")
275-
val list = mutableMapOf<Int, Triple<Double, Double, Material?>>()
275+
val list = mutableMapOf<Int, Triple<Double?, Double?, Material?>>()
276276
for (v in values) {
277277
val parts = v.split(":")
278278
if (parts.size == 2) {
279279
val ticks = parts[0].replace(" ", "").toInt()
280280
val whm = parts[1].split(",")
281281
if (whm.size >= 2) {
282-
val width = whm[0].replace(" ", "").toDouble()
283-
val height = whm[1].replace(" ", "").toDouble()
282+
val width = if(whm[0].replace(" ", "") == "~") null else whm[0].replace(" ", "").toDouble()
283+
val height = if(whm[1].replace(" ", "") == "~") null else whm[1].replace(" ", "").toDouble()
284284

285285
if(whm.size == 3){
286286
val material = if(Material.entries.toTypedArray()
287-
.contains(Material.valueOf(whm[3].replace(" ", ""))))
288-
Material.valueOf(whm[3].replace(" ", ""))
287+
.contains(Material.valueOf(whm[2].replace(" ", "").uppercase())))
288+
Material.valueOf(whm[2].replace(" ", "").uppercase())
289289
else return null
290290
list[ticks] = Triple(width, height, material)
291-
}
292-
list[ticks] = Triple(width, height, null)
291+
}else
292+
list[ticks] = Triple(width, height, null)
293293
}
294294
}
295295
}
@@ -303,24 +303,24 @@ object LocationUtils {
303303
* Gets a list of all the values in the sequencer
304304
* @param value The sequencer value in the format of "ticks:width,height,depth;ticks:width,height,depth;..."
305305
*/
306-
fun getTripleSequencerValues(value: String): Map<Int, Quadruple<Double, Double, Double, Material?>>?{
306+
fun getTripleSequencerValues(value: String): Map<Int, Quadruple<Double?, Double?, Double?, Material?>>?{
307307
try {
308308
val values = value.split(";")
309-
val list = mutableMapOf<Int, Quadruple<Double, Double, Double, Material?>>()
309+
val list = mutableMapOf<Int, Quadruple<Double?, Double?, Double?, Material?>>()
310310
for (v in values) {
311311
val parts = v.split(":")
312312
if (parts.size == 2) {
313313
val ticks = parts[0].replace(" ", "").toInt()
314314
val whdm = parts[1].split(",")
315315
if (whdm.size >= 3) {
316-
val width = whdm[0].replace(" ", "").toDouble()
317-
val height = whdm[1].replace(" ", "").toDouble()
318-
val depth = whdm[2].replace(" ", "").toDouble()
316+
val width = if(whdm[0].replace(" ", "") == "~") null else whdm[0].replace(" ", "").toDouble()
317+
val height = if(whdm[1].replace(" ", "") == "~") null else whdm[1].replace(" ", "").toDouble()
318+
val depth = if(whdm[2].replace(" ", "") == "~") null else whdm[2].replace(" ", "").toDouble()
319319

320320
if(whdm.size == 4){
321321
val material = if(Material.entries.toTypedArray()
322-
.contains(Material.valueOf(whdm[3].replace(" ", ""))))
323-
Material.valueOf(whdm[3].replace(" ", ""))
322+
.contains(Material.valueOf(whdm[3].replace(" ", "").uppercase())))
323+
Material.valueOf(whdm[3].replace(" ", "").uppercase())
324324
else return null
325325

326326
list[ticks] = Quadruple(width, height, depth, material)

src/main/java/me/m64diamondstar/effectmaster/shows/effect/FountainBloom.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,29 +112,38 @@ class FountainBloom : Effect() {
112112
}
113113
}
114114

115-
private fun interpolateKeyframes(sequencer: Map<Int, Pair<Double, Double>>, tick: Int): Pair<Double, Double> {
115+
private fun interpolateKeyframes(sequencer: Map<Int, Pair<Double?, Double?>>, tick: Int): Pair<Double, Double> {
116116
val keys = sequencer.keys.sorted()
117-
val (prevKey, nextKey) = findKeyframes(keys, tick)
118117

119-
val prevValue = sequencer[prevKey] ?: return Pair(0.0, 0.0)
120-
val nextValue = sequencer[nextKey] ?: prevValue
118+
// Helper function to interpolate a single value (width or height)
119+
fun interpolateFor(tick: Int, selector: (Pair<Double?, Double?>) -> Double?): Double {
120+
val (prevKey, nextKey) = findKeyframes(keys, tick) { key ->
121+
sequencer[key]?.let(selector) != null
122+
}
123+
124+
val prevValue = sequencer[prevKey]?.let(selector) ?: 0.0
125+
val nextValue = sequencer[nextKey]?.let(selector) ?: prevValue
126+
127+
if (prevKey == nextKey) {
128+
return prevValue
129+
}
121130

122-
if (prevKey == nextKey) {
123-
return prevValue
131+
val t = (tick - prevKey).toDouble() / (nextKey - prevKey)
132+
return prevValue + t * (nextValue - prevValue)
124133
}
125134

126-
val t = (tick - prevKey).toDouble() / (nextKey - prevKey)
127-
val width = prevValue.first + t * (nextValue.first - prevValue.first)
128-
val height = prevValue.second + t * (nextValue.second - prevValue.second)
135+
val width = interpolateFor(tick) { it.first }
136+
val height = interpolateFor(tick) { it.second }
129137

130138
return Pair(width, height)
131139
}
132140

133-
private fun findKeyframes(keys: List<Int>, tick: Int): Pair<Int, Int> {
134-
var prevKey = keys.first()
135-
var nextKey = keys.last()
136141

137-
for (key in keys) {
142+
private fun findKeyframes(keys: List<Int>, tick: Int, predicate: (Int) -> Boolean): Pair<Int, Int> {
143+
var prevKey = keys.firstOrNull(predicate) ?: keys.first()
144+
var nextKey = keys.lastOrNull(predicate) ?: keys.last()
145+
146+
for (key in keys.filter(predicate)) {
138147
if (key <= tick) {
139148
prevKey = key
140149
}
@@ -147,6 +156,7 @@ class FountainBloom : Effect() {
147156
return Pair(prevKey, nextKey)
148157
}
149158

159+
150160
override fun getIdentifier(): String {
151161
return "FOUNTAIN_BLOOM"
152162
}

src/main/java/me/m64diamondstar/effectmaster/shows/effect/FountainDancing.kt

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,30 +110,39 @@ class FountainDancing : Effect() {
110110
}
111111
}
112112

113-
private fun interpolateKeyframes(sequencer: Map<Int, Triple<Double, Double, Double>>, tick: Int): Triple<Double, Double, Double> {
113+
private fun interpolateKeyframes(sequencer: Map<Int, Triple<Double?, Double?, Double?>>, tick: Int): Triple<Double, Double, Double> {
114114
val keys = sequencer.keys.sorted()
115-
val (prevKey, nextKey) = findKeyframes(keys, tick)
116115

117-
val prevValue = sequencer[prevKey] ?: return Triple(0.0, 0.0, 0.0)
118-
val nextValue = sequencer[nextKey] ?: prevValue
116+
// Helper function to interpolate a single value (width or height)
117+
fun interpolateFor(tick: Int, selector: (Triple<Double?, Double?, Double?>) -> Double?): Double {
118+
val (prevKey, nextKey) = findKeyframes(keys, tick) { key ->
119+
sequencer[key]?.let(selector) != null
120+
}
121+
122+
val prevValue = sequencer[prevKey]?.let(selector) ?: 0.0
123+
val nextValue = sequencer[nextKey]?.let(selector) ?: prevValue
119124

120-
if (prevKey == nextKey) {
121-
return prevValue
125+
if (prevKey == nextKey) {
126+
return prevValue
127+
}
128+
129+
val t = (tick - prevKey).toDouble() / (nextKey - prevKey)
130+
return prevValue + t * (nextValue - prevValue)
122131
}
123132

124-
val t = (tick - prevKey).toDouble() / (nextKey - prevKey)
125-
val width = prevValue.first + t * (nextValue.first - prevValue.first)
126-
val height = prevValue.second + t * (nextValue.second - prevValue.second)
127-
val depth = prevValue.third + t * (nextValue.third - prevValue.third)
133+
val width = interpolateFor(tick) { it.first }
134+
val height = interpolateFor(tick) { it.second }
135+
val depth = interpolateFor(tick) { it.third }
128136

129137
return Triple(width, height, depth)
130138
}
131139

132-
private fun findKeyframes(keys: List<Int>, tick: Int): Pair<Int, Int> {
133-
var prevKey = keys.first()
134-
var nextKey = keys.last()
135140

136-
for (key in keys) {
141+
private fun findKeyframes(keys: List<Int>, tick: Int, predicate: (Int) -> Boolean): Pair<Int, Int> {
142+
var prevKey = keys.firstOrNull(predicate) ?: keys.first()
143+
var nextKey = keys.lastOrNull(predicate) ?: keys.last()
144+
145+
for (key in keys.filter(predicate)) {
137146
if (key <= tick) {
138147
prevKey = key
139148
}

src/main/java/me/m64diamondstar/effectmaster/utils/Converter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.bukkit.Material
66
* This is used to convert a sequencer which features 3 dimensions and a material into a sequencer with just the dimensions.
77
* @return A map with 3 dimensions x, y and z for each index
88
*/
9-
fun Map<Int, Quadruple<Double, Double, Double, Material?>>?.toTriple(): Map<Int, Triple<Double, Double, Double>>? {
9+
fun Map<Int, Quadruple<Double?, Double?, Double?, Material?>>?.toTriple(): Map<Int, Triple<Double?, Double?, Double?>>? {
1010
return this?.mapValues { (_, value) ->
1111
Triple(value.first, value.second, value.third)
1212
}
@@ -16,7 +16,7 @@ fun Map<Int, Quadruple<Double, Double, Double, Material?>>?.toTriple(): Map<Int,
1616
* This is used to convert a sequencer which features 2 dimensions and a material into a sequencer with just the dimensions.
1717
* @return A map with 2 dimensions width and depth for each index
1818
*/
19-
fun Map<Int, Triple<Double, Double, Material?>>?.toPair(): Map<Int, kotlin.Pair<Double, Double>>? {
19+
fun Map<Int, Triple<Double?, Double?, Material?>>?.toPair(): Map<Int, kotlin.Pair<Double?, Double?>>? {
2020
return this?.mapValues { (_, value) ->
2121
kotlin.Pair(value.first, value.second)
2222
}

0 commit comments

Comments
 (0)