Skip to content

Commit 2a73929

Browse files
committed
⚡️ (mapScript) 优化mapPatches的加载逻辑,自动解析依赖
1 parent 0a6cbcd commit 2a73929

8 files changed

Lines changed: 142 additions & 111 deletions

File tree

scripts/mapScript/1004.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@file:Depends("mapScript/shared/hexed")
2-
@file:Depends("mapScript/13545", "CoreWar", soft = true)
2+
@file:Depends("mapScript/tags/coreWar", "CoreWar", soft = true)
33

44
package mapScript
55

@@ -21,7 +21,7 @@ val generator = HexedGenerator(4, 5, 78)
2121
registerGenerator(
2222
"HEXed * CoreWar", "WayZer", """
2323
塔防掉落[@TDDrop=all]
24-
招兵买马(CoreWar)模式 @13545
24+
招兵买马(CoreWar)模式
2525
[@pvpProtect=0]
2626
""".trimIndent(),
2727
mode = Gamemode.pvp,

scripts/mapScript/13545.kts

Lines changed: 2 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,3 @@
1-
@file:Depends("coreMindustry/menu", "调用菜单")
2-
@file:Depends("coreMindustry/util/spawnAround")
1+
@file:Depends("mapScript/tags/coreWar", "新位置")
32

4-
/**@author WayZer*/
5-
6-
package mapScript
7-
8-
import arc.util.Align
9-
import coreLibrary.lib.util.loop
10-
import mindustry.game.Team
11-
import mindustry.gen.Iconc
12-
import mindustry.net.Administration
13-
import mindustry.world.blocks.storage.CoreBlock
14-
import org.intellij.lang.annotations.Language
15-
16-
modeIntroduce(
17-
"招兵买马 CoreWar", """
18-
点击核心可以打开菜单
19-
使用铜为队伍购买单位和属性升级
20-
价格会随购买逐渐变贵
21-
Tip1: 不要乱花钱被队友嫌弃哦
22-
Tip2: 单位会随机刷在核心附近(5格左右),周围没水船会白给
23-
""".trimIndent()
24-
)
25-
26-
@Language("JSON5")
27-
val patch = """
28-
{
29-
"name": "CoreWar",
30-
"block.core-foundation.unitType": "alpha",
31-
"block.core-nucleus.unitType": "alpha",
32-
"block.core-nucleus.itemCapacity": 1000000,
33-
}
34-
""".trimIndent()
35-
mapPatches = listOf(patch)
36-
37-
data class TeamData(val team: Team) {
38-
var blockDamageMultiplier by team.rules()::blockDamageMultiplier
39-
var blockHealthMultiplier by team.rules()::blockHealthMultiplier
40-
var unitDamageMultiplier by team.rules()::unitDamageMultiplier
41-
var unitHealthMultiplier by team.rules()::unitHealthMultiplier
42-
}
43-
44-
val teamData = mutableMapOf<Team, TeamData>()
45-
val Team.myData get() = teamData.getOrPut(this) { TeamData(this) }
46-
onDisable { teamData.clear() }
47-
48-
registerActionFilter {
49-
if(it.type == Administration.ActionType.control || it.type==Administration.ActionType.command){
50-
if(it.unit.type == UnitTypes.mono)
51-
return@registerActionFilter false
52-
}
53-
true
54-
}
55-
56-
listen<EventType.TapEvent> {
57-
(it.tile.build as? CoreBlock.CoreBuild)?.let { core ->
58-
val player = it.player
59-
if (!player.dead() && core.team == player.team())
60-
launch(Dispatchers.game) {
61-
CoreWarMenu(player, core).sendTo(player, 60_000)
62-
}
63-
}
64-
}
65-
66-
onEnable {
67-
state.rules.bannedBlocks.add(Blocks.deconstructor)
68-
Call.setRules(state.rules)
69-
loop(Dispatchers.game) {
70-
delay(2000)
71-
val teams = Groups.player.mapTo(mutableSetOf()) { it.team() }
72-
teams.removeAll { !it.active() }
73-
val text = "[green]点击核心可以打开升级菜单\n" +
74-
"[yellow]更新:所有单位价格不再增长\n" +
75-
teams.sortedByDescending { it.myData.unitDamageMultiplier }.take(5)
76-
.joinToString("\n") { team ->
77-
"[#${team.color}]${team.name}[white]属性:" +
78-
"${Iconc.modePvp}${team.myData.unitDamageMultiplier} " +
79-
"${team.myData.unitHealthMultiplier} " +
80-
"${Iconc.turret}${team.myData.blockDamageMultiplier} " +
81-
"${Iconc.defense}${team.myData.blockHealthMultiplier} "
82-
}
83-
Call.infoPopup(
84-
text, 2.013f,
85-
Align.topLeft, 350, 0, 0, 0
86-
)
87-
}
88-
}
3+
package mapScript

scripts/mapScript/lib/ScriptMapGenerator.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class ScriptMapGenerator(val script: Script, val width: Int, val height: Int) {
5858
script.logger.log(Level.SEVERE, "loadGenerator出错", e)
5959
MapManager.loadMap()
6060
}
61+
if (script.enabled) return// Already enabled inside WorldLoadEvent
6162
MindustryDispatcher.safeBlocking {
6263
ScriptManager.enableScript(script, true)
6364
}
@@ -92,6 +93,8 @@ class ScriptMapGenerator(val script: Script, val width: Int, val height: Int) {
9293
)
9394
}
9495

96+
override fun toString(): String = "ScriptGeneratorMap"
97+
9598
override suspend fun loadMap(info: MapInfo) {
9699
val generator = knownMaps[info.id]?.generator ?: return MapManager.loadMap()
97100
generator.load()

scripts/mapScript/module.kts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,18 @@ fun getToLoadMapScripts(): List<ScriptInfo> {
5959
ScriptRegistry.getScriptInfo(scriptId) ?: null.also {
6060
delayBroadcast("[red]该服务器不存在对应地图脚本,请联系管理员: {id}".with("id" to scriptId))
6161
}
62-
}
62+
}.flatMap {
63+
listOf(it) + ScriptRegistry.allScripts { dep ->
64+
!dep.enabled && it.dependsOn(dep, includeSoft = true)
65+
}
66+
}.toSet().toList()
6367
}
6468

65-
listen<EventType.ContentPatchLoadEvent> {
69+
listen<EventType.ContentPatchLoadEvent> { e ->
6670
val patches = getToLoadMapScripts().flatMap { it.inst?.mapPatches.orEmpty() }
6771
if (patches.isEmpty()) return@listen
6872
logger.info("Patches loaded: ${patches.size}")
69-
it.patches.addAll(patches)
73+
e.patches.addAll(patches)
7074
}
7175

7276
listen<EventType.WorldLoadEvent> {

scripts/mapScript/tags/autoExchange.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ val cores = content?.run {
3030
@Language("JSON5")
3131
val patch = """
3232
{
33-
"name": "CoreWar",
33+
"name": "AutoExchange",
3434
${cores.joinToString("\n")}
3535
}
3636
""".trimIndent()

scripts/mapScript/tags/coreWar.kts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
@file:Depends("coreMindustry/menu", "调用菜单")
2+
@file:Depends("coreMindustry/util/spawnAround")
3+
4+
/**@author WayZer*/
5+
6+
package mapScript.tags
7+
8+
import arc.util.Align
9+
import coreLibrary.lib.util.loop
10+
import mindustry.game.Team
11+
import mindustry.gen.Iconc
12+
import mindustry.net.Administration
13+
import mindustry.world.blocks.storage.CoreBlock
14+
import org.intellij.lang.annotations.Language
15+
16+
registerMapTag("@coreWar")
17+
modeIntroduce(
18+
"招兵买马 CoreWar", """
19+
点击核心可以打开菜单
20+
使用铜为队伍购买单位和属性升级
21+
价格会随购买逐渐变贵
22+
Tip1: 不要乱花钱被队友嫌弃哦
23+
Tip2: 单位会随机刷在核心附近(5格左右),周围没水船会白给
24+
""".trimIndent()
25+
)
26+
27+
@Language("JSON5")
28+
val patch = """
29+
{
30+
"name": "CoreWar",
31+
"block.core-foundation.unitType": "alpha",
32+
"block.core-nucleus.unitType": "alpha",
33+
"block.core-nucleus.itemCapacity": 1000000,
34+
}
35+
""".trimIndent()
36+
mapPatches = listOf(patch)
37+
38+
data class TeamData(val team: Team) {
39+
var blockDamageMultiplier by team.rules()::blockDamageMultiplier
40+
var blockHealthMultiplier by team.rules()::blockHealthMultiplier
41+
var unitDamageMultiplier by team.rules()::unitDamageMultiplier
42+
var unitHealthMultiplier by team.rules()::unitHealthMultiplier
43+
}
44+
45+
val teamData = mutableMapOf<Team, TeamData>()
46+
val Team.myData get() = teamData.getOrPut(this) { TeamData(this) }
47+
onDisable { teamData.clear() }
48+
49+
registerActionFilter {
50+
if(it.type == Administration.ActionType.control || it.type==Administration.ActionType.command){
51+
if(it.unit.type == UnitTypes.mono)
52+
return@registerActionFilter false
53+
}
54+
true
55+
}
56+
57+
listen<EventType.TapEvent> {
58+
(it.tile.build as? CoreBlock.CoreBuild)?.let { core ->
59+
val player = it.player
60+
if (!player.dead() && core.team == player.team())
61+
launch(Dispatchers.game) {
62+
CoreWarMenu(player, core).sendTo(player, 60_000)
63+
}
64+
}
65+
}
66+
67+
onEnable {
68+
state.rules.bannedBlocks.add(Blocks.deconstructor)
69+
Call.setRules(state.rules)
70+
loop(Dispatchers.game) {
71+
delay(2000)
72+
val teams = Groups.player.mapTo(mutableSetOf()) { it.team() }
73+
teams.removeAll { !it.active() }
74+
val text = "[green]点击核心可以打开升级菜单\n" +
75+
"[yellow]更新:所有单位价格不再增长\n" +
76+
teams.sortedByDescending { it.myData.unitDamageMultiplier }.take(5)
77+
.joinToString("\n") { team ->
78+
"[#${team.color}]${team.name}[white]属性:" +
79+
"${Iconc.modePvp}${team.myData.unitDamageMultiplier} " +
80+
"${team.myData.unitHealthMultiplier} " +
81+
"${Iconc.turret}${team.myData.blockDamageMultiplier} " +
82+
"${Iconc.defense}${team.myData.blockHealthMultiplier} "
83+
}
84+
Call.infoPopup(
85+
text, 2.013f,
86+
Align.topLeft, 350, 0, 0, 0
87+
)
88+
}
89+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mapScript
1+
package mapScript.tags
22

33
import arc.math.Mathf
44
import cf.wayzer.scriptAgent.contextScript
@@ -25,7 +25,7 @@ import kotlin.reflect.KMutableProperty0
2525
private val confirmed = mutableSetOf<String>()
2626

2727
class CoreWarMenu(val player: Player, val build: Building) : MenuBuilder<Unit>(followup = true) {
28-
private val script = contextScript<_13545>()
28+
private val script = contextScript<CoreWar>()
2929
private val isErekir = build.block in arrayOf(Blocks.coreAcropolis, Blocks.coreBastion, Blocks.coreCitadel)
3030
private val item = if (isErekir) Items.beryllium else Items.copper
3131
private fun Building.getResource() = items.get(item)
Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
ID mapScript
22
FQ_NAME mapScript.Module
3-
+DEPENDS coreMindustry
4-
+DEPENDS wayzer/maps
3+
+DEPENDS coreMindustry
54
+DEPENDS wayzer/maps 获取地图信息
65
+IMPORT DefaultImport mapScript.lib.*
76
+SOFT_DEPENDS wayzer/map/mapInfo 显示地图信息
87

98
ID mapScript/1001
109
FQ_NAME mapScript._1001
11-
+DEPENDS coreMindustry/utilMapRule
12-
+DEPENDS coreMindustry/utilMapRule 参数平衡
1310
+DEPENDS mapScript module
1411
+DEPENDS mapScript/shared/hexed
1512

1613
ID mapScript/1002
1714
FQ_NAME mapScript._1002
1815
+DEPENDS mapScript module
19-
+DEPENDS mapScript/shared/hexed
20-
+SOFT_DEPENDS mapScript/tags/autoExchange 等价交换
16+
+DEPENDS mapScript/shared/hexed
2117

2218
ID mapScript/1003
2319
FQ_NAME mapScript._1003
24-
+DEPENDS coreMindustry/utilMapRule
25-
+DEPENDS coreMindustry/utilMapRule 参数平衡
2620
+DEPENDS mapScript module
27-
+DEPENDS mapScript/shared/hexed
21+
+DEPENDS mapScript/shared/hexed
22+
23+
ID mapScript/1004
24+
FQ_NAME mapScript._1004
25+
+DEPENDS mapScript module
26+
+DEPENDS mapScript/shared/hexed
27+
28+
ID mapScript/1005
29+
FQ_NAME mapScript._1005
30+
+DEPENDS mapScript module
31+
+DEPENDS mapScript/14562 填海造陆
32+
+DEPENDS mapScript/shared/hexed
2833

2934
ID mapScript/1009
3035
FQ_NAME mapScript._1009
31-
+DEPENDS coreMindustry/utilMapRule
32-
+DEPENDS coreMindustry/utilMapRule 参数平衡
3336
+DEPENDS mapScript module
3437
+DEPENDS mapScript/shared/hexed
3538

@@ -43,14 +46,31 @@ ID mapScript/shared/posMark
4346
FQ_NAME mapScript.shared.PosMark
4447
+DEPENDS mapScript module
4548

49+
ID mapScript/tags/TDDrop
50+
FQ_NAME mapScript.tags.TDDrop
51+
+DEPENDS mapScript module
52+
53+
4654
ID mapScript/tags/autoExchange
4755
FQ_NAME mapScript.tags.AutoExchange
48-
+DEPENDS coreMindustry/utilMapRule
49-
+DEPENDS coreMindustry/utilMapRule 修改核心容量
5056
+DEPENDS mapScript module
5157

52-
ID mapScript/tags/voidProduce
53-
FQ_NAME mapScript.tags.VoidProduce
54-
+DEPENDS coreMindustry/contentsTweaker
58+
ID mapScript/tags/coreWar
59+
FQ_NAME mapScript.tags.CoreWar
60+
+DEPENDS coreMindustry/menu 调用菜单
61+
+DEPENDS coreMindustry/util/spawnAround
62+
+DEPENDS mapScript module
63+
64+
ID mapScript/tags/limitAir
65+
FQ_NAME mapScript.tags.LimitAir
66+
+DEPENDS mapScript module
67+
68+
ID mapScript/tags/mapRule
69+
FQ_NAME mapScript.tags.MapRule
70+
+DEPENDS mapScript module
71+
72+
ID mapScript/tags/towerDefend
73+
FQ_NAME mapScript.tags.TowerDefend
5574
+DEPENDS mapScript module
75+
+SOFT_DEPENDS mapScript/tags/TDDrop 掉落
5676

0 commit comments

Comments
 (0)