papermc-skill 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +12 -12
- package/assets/banner-animated.svg +360 -0
- package/assets/banner.svg +360 -0
- package/bin/cli.js +107 -2
- package/docs/01-modern-paper-architecture.md +48 -51
- package/docs/02-adventure-and-minimessage.md +48 -52
- package/docs/03-persistent-data-container.md +39 -39
- package/docs/04-commands-and-brigadier.md +32 -35
- package/docs/05-concurrency-and-folia.md +44 -44
- package/docs/06-events-and-listeners.md +30 -31
- package/docs/07-best-practices-and-perf.md +39 -40
- package/docs/08-gui-and-menus.md +34 -37
- package/docs/09-custom-items-and-combat.md +25 -33
- package/docs/10-database-and-storage.md +27 -27
- package/docs/11-security-and-exploit-prevention.md +233 -0
- package/package.json +2 -1
- package/skills/paper-plugin-dev/SKILL.md +391 -114
- package/templates/paper-modern-template/.gradle/9.7.1/checksums/checksums.lock +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/checksums/md5-checksums.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/checksums/sha1-checksums.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/executionHistory/executionHistory.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/executionHistory/executionHistory.lock +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/fileHashes.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/fileHashes.lock +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/resourceHashesCache.bin +0 -0
- package/templates/paper-modern-template/.gradle/9.7.1/kotlin-dsl-plugin-entries/kotlin-dsl-plugin-entries.lock +0 -0
- package/templates/paper-modern-template/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/templates/paper-modern-template/.gradle/buildOutputCleanup/cache.properties +1 -1
- package/templates/paper-modern-template/build/classes/java/main/com/example/paperplugin/ExamplePaperPlugin.class +0 -0
- package/templates/paper-modern-template/build/classes/java/main/com/example/paperplugin/PaperPluginBootstrap.class +0 -0
- package/templates/paper-modern-template/build/classes/java/main/com/example/paperplugin/command/HelloCommand.class +0 -0
- package/templates/paper-modern-template/build/classes/java/main/com/example/paperplugin/listener/PlayerEventListener.class +0 -0
- package/templates/paper-modern-template/build/classes/java/main/com/example/paperplugin/util/SchedulerAdapter.class +0 -0
- package/templates/paper-modern-template/build/tmp/compileJava/previous-compilation-data.bin +0 -0
- package/templates/paper-modern-template/build.gradle.kts +7 -7
- package/templates/paper-modern-template/src/main/java/com/example/paperplugin/ExamplePaperPlugin.java +6 -6
- package/templates/paper-modern-template/src/main/java/com/example/paperplugin/PaperPluginBootstrap.java +2 -2
- package/templates/paper-modern-template/src/main/java/com/example/paperplugin/command/HelloCommand.java +2 -4
- package/templates/paper-modern-template/src/main/java/com/example/paperplugin/data/PluginDataKeys.java +2 -2
- package/templates/paper-modern-template/src/main/java/com/example/paperplugin/listener/PlayerEventListener.java +6 -7
- package/templates/paper-modern-template/src/main/java/com/example/paperplugin/util/SchedulerAdapter.java +6 -6
- package/templates/paper-modern-template/src/main/resources/config.yml +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.1.0] - 2026-10-01
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Plugin Security & Anti-Exploit Scanner CLI (`npx papermc-skill audit [path]`)**:
|
|
12
|
+
- Scans Java sources for known Bukkit/Paper vulnerabilities including legacy ChatColor usage, section sign formatting bugs, static collection memory leaks (`Set<Player>`), synchronous chunk freezes (`world.getChunkAt`), insecure SQL string concatenation, and unbounded float/double parsing.
|
|
13
|
+
- **Masterclass Guide 11: Security & Exploit Prevention (`docs/11-security-and-exploit-prevention.md`)**:
|
|
14
|
+
- Deep-dive architectural guide covering item dupe glitch elimination, inventory race conditions, PDC cryptographic tamper-proofing, numeric/economy validation (anti-NaN/overflow), asynchronous chunk loading teleportation, HikariCP connection leak prevention, and memory leak elimination.
|
|
15
|
+
- **Massively Enriched AI Agent Skill (`skills/paper-plugin-dev/SKILL.md`)**:
|
|
16
|
+
- Added dedicated Security & Exploit-Proofing protocol.
|
|
17
|
+
- Added production recipes for Secure Brigadier Commands with numeric bounds, Safe GUI Menu Controllers with 200ms click debounce and drag cancellation, Anti-Tamper PDC Item Utilities, Universal Folia/Paper Schedulers, and Async HikariCP Database Managers.
|
|
18
|
+
- Added 20-point Pre-Release Security Audit Checklist.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- **SchedulerAdapter Precision Hardening**:
|
|
22
|
+
- Fixed tick conversion in `SchedulerAdapter.java` to use exact millisecond calculation `timeUnit.toMillis(delay) / 50L`.
|
|
23
|
+
- **Documentation & Distribution**:
|
|
24
|
+
- Added `assets/` to package distribution files for local and offline tooling.
|
|
25
|
+
- Updated README documentation with Guide 11 and audit quickstart command.
|
|
26
|
+
|
|
8
27
|
## [1.0.1] - 2026-09-15
|
|
9
28
|
|
|
10
29
|
### Added
|
package/README.md
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
██████╔╝███████║██████╔╝█████╗ ██████╔╝██╔████╔██║██║
|
|
7
|
-
██╔═══╝ ██╔══██║██╔═══╝ ██╔══╝ ██╔══██╗██║╚██╔╝██║██║
|
|
8
|
-
██║ ██║ ██║██║ ███████╗██║ ██║██║ ╚═╝ ██║╚██████╗
|
|
9
|
-
╚═╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝
|
|
10
|
-
🎮 THE ULTIMATE PAPER & FOLIA ARSENAL 🎮
|
|
11
|
-
```
|
|
3
|
+
<a href="https://github.com/ardianryan/papermc-skill">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/ardianryan/papermc-skill/main/assets/banner-animated.svg" alt="PaperMC Skill - The Ultimate Paper & Folia Arsenal" width="100%" />
|
|
5
|
+
</a>
|
|
12
6
|
|
|
13
7
|
# ⚔️ PAPERMC PLUGIN SKILL & KNOWLEDGE BASE ⚔️
|
|
14
8
|
|
|
@@ -21,7 +15,7 @@
|
|
|
21
15
|
[](https://github.com/ardianryan/papermc-skill/releases/latest)
|
|
22
16
|
[](LICENSE)
|
|
23
17
|
|
|
24
|
-
[⚡ Quickstart](#-instant-quickstart-5-seconds) • [💎 Key Features](#-why-modern-paper-matters) • [📚
|
|
18
|
+
[⚡ Quickstart](#-instant-quickstart-5-seconds) • [💎 Key Features](#-why-modern-paper-matters) • [📚 11 Masterclass Guides](#-11-masterclass-technical-guides) • [🔍 Battle-Tested References](#-cloned-reference-plugins) • [🤖 AI Agent Skill](#-ai-agent-integration)
|
|
25
19
|
|
|
26
20
|
---
|
|
27
21
|
|
|
@@ -51,6 +45,11 @@ To check for the newest Minecraft & PaperMC releases from the official API:
|
|
|
51
45
|
npx papermc-skill check-update
|
|
52
46
|
```
|
|
53
47
|
|
|
48
|
+
To audit any plugin codebase for exploits, memory leaks, and anti-patterns:
|
|
49
|
+
```bash
|
|
50
|
+
npx papermc-skill audit
|
|
51
|
+
```
|
|
52
|
+
|
|
54
53
|
---
|
|
55
54
|
|
|
56
55
|
## 💎 Why Modern Paper Matters
|
|
@@ -67,7 +66,7 @@ The Minecraft server ecosystem has evolved dramatically. Legacy habits lead to s
|
|
|
67
66
|
|
|
68
67
|
---
|
|
69
68
|
|
|
70
|
-
## 📚
|
|
69
|
+
## 📚 11 Masterclass Technical Guides
|
|
71
70
|
|
|
72
71
|
Written by developers for developers, covering everything from basic setup to high-throughput concurrency:
|
|
73
72
|
|
|
@@ -83,6 +82,7 @@ Written by developers for developers, covering everything from basic setup to hi
|
|
|
83
82
|
| **08** | [Modern GUI & Inventory Menus](https://github.com/ardianryan/papermc-skill/blob/main/docs/08-gui-and-menus.md) | Custom `InventoryHolder` menus, PDC interactive buttons, and bulletproof duplication-exploit prevention. |
|
|
84
83
|
| **09** | [Custom Items, Abilities & Combat](https://github.com/ardianryan/papermc-skill/blob/main/docs/09-custom-items-and-combat.md) | Raycasting spells (`rayTraceEntities`), particle beam effects, vanilla visual cooldowns, and SFX. |
|
|
85
84
|
| **10** | [Asynchronous Database Storage](https://github.com/ardianryan/papermc-skill/blob/main/docs/10-database-and-storage.md) | SQLite & MySQL HikariCP connection pooling, thread-safe asynchronous DAO pattern with `CompletableFuture`. |
|
|
85
|
+
| **11** | [Security & Exploit Prevention](https://github.com/ardianryan/papermc-skill/blob/main/docs/11-security-and-exploit-prevention.md) | Eliminating dupe glitches, inventory race conditions, PDC tamper verification, numeric/economy validation, and packet DoS defense. |
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
@@ -135,7 +135,7 @@ When pair-programming with AI coding agents:
|
|
|
135
135
|
| :--- | :--- | :--- |
|
|
136
136
|
| **NPM Global** | `npx papermc-skill` | [](https://www.npmjs.com/package/papermc-skill) |
|
|
137
137
|
| **GitHub Packages** | `@ardianryan/papermc-skill` | [GitHub Packages Hub](https://github.com/users/ardianryan/packages?repo_name=papermc-skill) |
|
|
138
|
-
| **Release Asset** | `papermc-skill-v1.0.
|
|
138
|
+
| **Release Asset** | `papermc-skill-v1.1.0.zip` | [Latest GitHub Release](https://github.com/ardianryan/papermc-skill/releases/latest) |
|
|
139
139
|
|
|
140
140
|
---
|
|
141
141
|
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 320" width="100%" height="100%">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Background Gradient -->
|
|
4
|
+
<linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#0a0d17" />
|
|
6
|
+
<stop offset="45%" stop-color="#101524" />
|
|
7
|
+
<stop offset="75%" stop-color="#141a2e" />
|
|
8
|
+
<stop offset="100%" stop-color="#090c15" />
|
|
9
|
+
</linearGradient>
|
|
10
|
+
|
|
11
|
+
<!-- Title Cyan Gradients -->
|
|
12
|
+
<linearGradient id="titleCyan" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
13
|
+
<stop offset="0%" stop-color="#affaff" />
|
|
14
|
+
<stop offset="30%" stop-color="#38d9ff" />
|
|
15
|
+
<stop offset="70%" stop-color="#00a3ff" />
|
|
16
|
+
<stop offset="100%" stop-color="#0055b3" />
|
|
17
|
+
</linearGradient>
|
|
18
|
+
|
|
19
|
+
<linearGradient id="titleCyanGlow" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
20
|
+
<stop offset="0%" stop-color="#e0ffff" />
|
|
21
|
+
<stop offset="100%" stop-color="#00bfff" />
|
|
22
|
+
</linearGradient>
|
|
23
|
+
|
|
24
|
+
<!-- Portal & Beacon Radial Glow -->
|
|
25
|
+
<radialGradient id="portalCenterGlow" cx="50%" cy="40%" r="60%">
|
|
26
|
+
<stop offset="0%" stop-color="#9d4edd" stop-opacity="0.25" />
|
|
27
|
+
<stop offset="40%" stop-color="#38d9ff" stop-opacity="0.15" />
|
|
28
|
+
<stop offset="75%" stop-color="#101524" stop-opacity="0.05" />
|
|
29
|
+
<stop offset="100%" stop-color="#101524" stop-opacity="0" />
|
|
30
|
+
</radialGradient>
|
|
31
|
+
|
|
32
|
+
<linearGradient id="beaconBeam" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
33
|
+
<stop offset="0%" stop-color="#38d9ff" stop-opacity="0" />
|
|
34
|
+
<stop offset="50%" stop-color="#38d9ff" stop-opacity="0.18" />
|
|
35
|
+
<stop offset="100%" stop-color="#9d4edd" stop-opacity="0" />
|
|
36
|
+
</linearGradient>
|
|
37
|
+
|
|
38
|
+
<!-- Drop Shadow / Glow Filters -->
|
|
39
|
+
<filter id="textGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
40
|
+
<feGaussianBlur stdDeviation="5" result="blur" />
|
|
41
|
+
<feComposite in="SourceGraphic" in2="blur" operator="over" />
|
|
42
|
+
</filter>
|
|
43
|
+
|
|
44
|
+
<filter id="softAura" x="-40%" y="-40%" width="180%" height="180%">
|
|
45
|
+
<feGaussianBlur stdDeviation="10" result="blur" />
|
|
46
|
+
<feComposite in="SourceGraphic" in2="blur" operator="over" />
|
|
47
|
+
</filter>
|
|
48
|
+
|
|
49
|
+
<filter id="pixelShadow">
|
|
50
|
+
<feDropShadow dx="3" dy="4" stdDeviation="0" flood-color="#020408" flood-opacity="0.95" />
|
|
51
|
+
</filter>
|
|
52
|
+
|
|
53
|
+
<!-- Minecraft Grid Texture Pattern -->
|
|
54
|
+
<pattern id="mcGrid" width="24" height="24" patternUnits="userSpaceOnUse">
|
|
55
|
+
<rect width="24" height="24" fill="none" />
|
|
56
|
+
<path d="M 24 0 L 0 0 0 24" fill="none" stroke="#ffffff" stroke-width="0.75" stroke-opacity="0.03" />
|
|
57
|
+
<rect x="11" y="11" width="2" height="2" fill="#ffffff" fill-opacity="0.035" />
|
|
58
|
+
</pattern>
|
|
59
|
+
</defs>
|
|
60
|
+
|
|
61
|
+
<style>
|
|
62
|
+
<![CDATA[
|
|
63
|
+
/* CSS Animations */
|
|
64
|
+
@keyframes float-sword {
|
|
65
|
+
0%, 100% { transform: translateY(0px) rotate(-16deg); }
|
|
66
|
+
50% { transform: translateY(-14px) rotate(-12deg); }
|
|
67
|
+
}
|
|
68
|
+
@keyframes float-apple {
|
|
69
|
+
0%, 100% { transform: translateY(0px) rotate(10deg); }
|
|
70
|
+
50% { transform: translateY(-12px) rotate(14deg); }
|
|
71
|
+
}
|
|
72
|
+
@keyframes xp-drift {
|
|
73
|
+
0% { transform: translateY(0px); opacity: 0; }
|
|
74
|
+
25% { opacity: 0.9; }
|
|
75
|
+
80% { opacity: 0.8; }
|
|
76
|
+
100% { transform: translateY(-80px); opacity: 0; }
|
|
77
|
+
}
|
|
78
|
+
@keyframes star-flicker {
|
|
79
|
+
0%, 100% { opacity: 0.2; transform: scale(0.7); }
|
|
80
|
+
50% { opacity: 1; transform: scale(1.3); }
|
|
81
|
+
}
|
|
82
|
+
@keyframes radar-pulse {
|
|
83
|
+
0% { r: 4; opacity: 1; stroke-width: 2; }
|
|
84
|
+
100% { r: 13; opacity: 0; stroke-width: 0.5; }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.sword-group {
|
|
88
|
+
transform-box: fill-box;
|
|
89
|
+
transform-origin: center;
|
|
90
|
+
animation: float-sword 4.5s ease-in-out infinite;
|
|
91
|
+
}
|
|
92
|
+
.apple-group {
|
|
93
|
+
transform-box: fill-box;
|
|
94
|
+
transform-origin: center;
|
|
95
|
+
animation: float-apple 5s ease-in-out infinite;
|
|
96
|
+
}
|
|
97
|
+
.xp-drift-1 { animation: xp-drift 3.6s ease-in-out infinite; }
|
|
98
|
+
.xp-drift-2 { animation: xp-drift 4.4s ease-in-out infinite 1.2s; }
|
|
99
|
+
.xp-drift-3 { animation: xp-drift 5.0s ease-in-out infinite 2.2s; }
|
|
100
|
+
.xp-drift-4 { animation: xp-drift 3.8s ease-in-out infinite 0.7s; }
|
|
101
|
+
|
|
102
|
+
.star-1 { transform-origin: center; animation: star-flicker 2.2s ease-in-out infinite; }
|
|
103
|
+
.star-2 { transform-origin: center; animation: star-flicker 3.0s ease-in-out infinite 0.8s; }
|
|
104
|
+
.star-3 { transform-origin: center; animation: star-flicker 2.6s ease-in-out infinite 1.5s; }
|
|
105
|
+
|
|
106
|
+
.radar-pulse-anim { animation: radar-pulse 1.8s cubic-bezier(0, 0.2, 0.8, 1) infinite; }
|
|
107
|
+
|
|
108
|
+
.mc-header-font {
|
|
109
|
+
font-family: 'Courier New', Courier, monospace;
|
|
110
|
+
font-weight: 900;
|
|
111
|
+
letter-spacing: 2px;
|
|
112
|
+
}
|
|
113
|
+
]]>
|
|
114
|
+
</style>
|
|
115
|
+
|
|
116
|
+
<!-- Frame Background & Border -->
|
|
117
|
+
<rect x="2" y="2" width="996" height="316" rx="14" fill="url(#bgGrad)" stroke="#222b40" stroke-width="3" />
|
|
118
|
+
<rect x="6" y="6" width="988" height="308" rx="10" fill="none" stroke="#141a29" stroke-width="2" />
|
|
119
|
+
|
|
120
|
+
<!-- Subtle Minecraft Grid -->
|
|
121
|
+
<rect x="8" y="8" width="984" height="304" rx="8" fill="url(#mcGrid)" />
|
|
122
|
+
|
|
123
|
+
<!-- Center Ambient Beacon Aura -->
|
|
124
|
+
<ellipse cx="500" cy="140" rx="380" ry="130" fill="url(#portalCenterGlow)" />
|
|
125
|
+
<rect x="410" y="8" width="180" height="304" fill="url(#beaconBeam)" opacity="0.6">
|
|
126
|
+
<animate attributeName="opacity" values="0.3;0.7;0.3" dur="4s" repeatCount="indefinite" />
|
|
127
|
+
</rect>
|
|
128
|
+
|
|
129
|
+
<!-- Minecraft Bedrock / Obsidian Corner Accents -->
|
|
130
|
+
<!-- Top Left -->
|
|
131
|
+
<path d="M 8 36 L 36 8 L 60 8 L 8 60 Z" fill="#2d344d" opacity="0.6" />
|
|
132
|
+
<rect x="14" y="14" width="7" height="7" fill="#00f0ff" opacity="0.85" />
|
|
133
|
+
<rect x="23" y="14" width="5" height="5" fill="#55ff55" opacity="0.75" />
|
|
134
|
+
<!-- Top Right -->
|
|
135
|
+
<path d="M 992 36 L 964 8 L 940 8 L 992 60 Z" fill="#2d344d" opacity="0.6" />
|
|
136
|
+
<rect x="979" y="14" width="7" height="7" fill="#00f0ff" opacity="0.85" />
|
|
137
|
+
<rect x="972" y="14" width="5" height="5" fill="#ffaa00" opacity="0.75" />
|
|
138
|
+
<!-- Bottom Left -->
|
|
139
|
+
<path d="M 8 284 L 36 312 L 60 312 L 8 260 Z" fill="#2d344d" opacity="0.6" />
|
|
140
|
+
<!-- Bottom Right -->
|
|
141
|
+
<path d="M 992 284 L 964 312 L 940 312 L 992 260 Z" fill="#2d344d" opacity="0.6" />
|
|
142
|
+
|
|
143
|
+
<!-- Twinkling Critical Hit Stars / Sparkles -->
|
|
144
|
+
<g transform="translate(180, 52)" class="star-1">
|
|
145
|
+
<path d="M 0 -8 L 2.5 -2.5 L 8 0 L 2.5 2.5 L 0 8 L -2.5 2.5 L -8 0 L -2.5 -2.5 Z" fill="#55ffff" />
|
|
146
|
+
<animateTransform attributeName="transform" type="scale" values="0.7;1.3;0.7" dur="2.2s" repeatCount="indefinite" />
|
|
147
|
+
</g>
|
|
148
|
+
<g transform="translate(830, 58)" class="star-2">
|
|
149
|
+
<path d="M 0 -7 L 2 -2 L 7 0 L 2 2 L 0 7 L -2 2 L -7 0 L -2 -2 Z" fill="#ffff55" />
|
|
150
|
+
<animateTransform attributeName="transform" type="scale" values="0.8;1.4;0.8" dur="3.0s" repeatCount="indefinite" begin="0.8s" />
|
|
151
|
+
</g>
|
|
152
|
+
<g transform="translate(310, 36)" class="star-3">
|
|
153
|
+
<path d="M 0 -5 L 1.5 -1.5 L 5 0 L 1.5 1.5 L 0 5 L -1.5 1.5 L -5 0 L -1.5 -1.5 Z" fill="#ff55ff" />
|
|
154
|
+
<animateTransform attributeName="transform" type="scale" values="0.6;1.2;0.6" dur="2.6s" repeatCount="indefinite" begin="1.5s" />
|
|
155
|
+
</g>
|
|
156
|
+
<g transform="translate(690, 44)" class="star-1">
|
|
157
|
+
<path d="M 0 -5 L 1.5 -1.5 L 5 0 L 1.5 1.5 L 0 5 L -1.5 1.5 L -5 0 L -1.5 -1.5 Z" fill="#55ff55" />
|
|
158
|
+
</g>
|
|
159
|
+
|
|
160
|
+
<!-- Drifting Minecraft XP Orbs & Redstone Dust with SMIL Fallback -->
|
|
161
|
+
<g transform="translate(250, 240)" class="xp-drift-1">
|
|
162
|
+
<rect x="-4" y="-4" width="8" height="8" rx="2" fill="#55ff55" stroke="#00aa00" stroke-width="1.5" />
|
|
163
|
+
<rect x="-1" y="-1" width="3" height="3" fill="#ffffff" />
|
|
164
|
+
<animateTransform attributeName="transform" type="translate" values="250,240; 250,165" dur="3.6s" repeatCount="indefinite" />
|
|
165
|
+
<animate attributeName="opacity" values="0;0.9;0.8;0" dur="3.6s" repeatCount="indefinite" />
|
|
166
|
+
</g>
|
|
167
|
+
<g transform="translate(740, 230)" class="xp-drift-2">
|
|
168
|
+
<rect x="-3" y="-3" width="6" height="6" rx="1.5" fill="#55ffff" stroke="#00aaaa" stroke-width="1.5" />
|
|
169
|
+
<rect x="-1" y="-1" width="2" height="2" fill="#ffffff" />
|
|
170
|
+
<animateTransform attributeName="transform" type="translate" values="740,230; 740,150" dur="4.4s" repeatCount="indefinite" begin="1.2s" />
|
|
171
|
+
<animate attributeName="opacity" values="0;0.9;0.7;0" dur="4.4s" repeatCount="indefinite" begin="1.2s" />
|
|
172
|
+
</g>
|
|
173
|
+
<g transform="translate(200, 210)" class="xp-drift-3">
|
|
174
|
+
<rect x="-3" y="-3" width="6" height="6" fill="#ff4d4d" stroke="#990000" stroke-width="1" />
|
|
175
|
+
<animateTransform attributeName="transform" type="translate" values="200,210; 200,135" dur="5.0s" repeatCount="indefinite" begin="2.2s" />
|
|
176
|
+
<animate attributeName="opacity" values="0;0.85;0.6;0" dur="5.0s" repeatCount="indefinite" begin="2.2s" />
|
|
177
|
+
</g>
|
|
178
|
+
<g transform="translate(790, 250)" class="xp-drift-4">
|
|
179
|
+
<rect x="-4" y="-4" width="8" height="8" rx="2" fill="#ffea55" stroke="#d48800" stroke-width="1.5" />
|
|
180
|
+
<animateTransform attributeName="transform" type="translate" values="790,250; 790,175" dur="3.8s" repeatCount="indefinite" begin="0.7s" />
|
|
181
|
+
<animate attributeName="opacity" values="0;0.9;0.7;0" dur="3.8s" repeatCount="indefinite" begin="0.7s" />
|
|
182
|
+
</g>
|
|
183
|
+
|
|
184
|
+
<!-- ================= LEFT: PIXEL ART DIAMOND SWORD (ANIMATED) ================= -->
|
|
185
|
+
<g transform="translate(95, 140)">
|
|
186
|
+
<g class="sword-group">
|
|
187
|
+
<animateTransform attributeName="transform" type="translate" values="0,0; 0,-14; 0,0" dur="4.5s" repeatCount="indefinite" />
|
|
188
|
+
|
|
189
|
+
<!-- Aura Glow -->
|
|
190
|
+
<circle cx="0" cy="0" r="48" fill="#00f0ff" opacity="0.08" filter="url(#softAura)" />
|
|
191
|
+
<circle cx="0" cy="0" r="44" fill="none" stroke="#00f0ff" stroke-width="1.5" stroke-dasharray="6,6" opacity="0.35" />
|
|
192
|
+
|
|
193
|
+
<!-- Pixel Art Sword Body (Centered and Scaled) -->
|
|
194
|
+
<g transform="scale(3.4) translate(-10, -10)" filter="url(#pixelShadow)">
|
|
195
|
+
<!-- Blade Outer Edge / Highlights -->
|
|
196
|
+
<rect x="18" y="2" width="2" height="2" fill="#ffffff" />
|
|
197
|
+
<rect x="17" y="3" width="2" height="2" fill="#7bf5ff" />
|
|
198
|
+
<rect x="16" y="4" width="2" height="2" fill="#2de2e6" />
|
|
199
|
+
<rect x="15" y="5" width="2" height="2" fill="#ffffff" />
|
|
200
|
+
<rect x="14" y="6" width="2" height="2" fill="#7bf5ff" />
|
|
201
|
+
<rect x="13" y="7" width="2" height="2" fill="#2de2e6" />
|
|
202
|
+
<rect x="12" y="8" width="2" height="2" fill="#ffffff" />
|
|
203
|
+
<rect x="11" y="9" width="2" height="2" fill="#7bf5ff" />
|
|
204
|
+
<rect x="10" y="10" width="2" height="2" fill="#2de2e6" />
|
|
205
|
+
<rect x="9" y="11" width="2" height="2" fill="#ffffff" />
|
|
206
|
+
<rect x="8" y="12" width="2" height="2" fill="#7bf5ff" />
|
|
207
|
+
<rect x="7" y="13" width="2" height="2" fill="#2de2e6" />
|
|
208
|
+
|
|
209
|
+
<!-- Inner Blade Shading (Diamond Core) -->
|
|
210
|
+
<rect x="18" y="3" width="2" height="2" fill="#2de2e6" />
|
|
211
|
+
<rect x="17" y="4" width="2" height="2" fill="#0099bb" />
|
|
212
|
+
<rect x="15" y="6" width="2" height="2" fill="#0099bb" />
|
|
213
|
+
<rect x="14" y="7" width="2" height="2" fill="#006688" />
|
|
214
|
+
<rect x="12" y="9" width="2" height="2" fill="#0099bb" />
|
|
215
|
+
<rect x="11" y="10" width="2" height="2" fill="#006688" />
|
|
216
|
+
<rect x="9" y="12" width="2" height="2" fill="#0099bb" />
|
|
217
|
+
<rect x="8" y="13" width="2" height="2" fill="#006688" />
|
|
218
|
+
|
|
219
|
+
<!-- Sword Guard / Crossguard (Obsidian & Gold) -->
|
|
220
|
+
<rect x="6" y="13" width="2" height="2" fill="#3c3f41" />
|
|
221
|
+
<rect x="7" y="14" width="2" height="2" fill="#ffaa00" />
|
|
222
|
+
<rect x="8" y="14" width="2" height="2" fill="#3c3f41" />
|
|
223
|
+
<rect x="9" y="15" width="2" height="2" fill="#ffaa00" />
|
|
224
|
+
<rect x="5" y="14" width="2" height="2" fill="#27292a" />
|
|
225
|
+
<rect x="6" y="15" width="2" height="2" fill="#3c3f41" />
|
|
226
|
+
<rect x="9" y="13" width="2" height="2" fill="#27292a" />
|
|
227
|
+
<rect x="10" y="14" width="2" height="2" fill="#3c3f41" />
|
|
228
|
+
|
|
229
|
+
<!-- Sword Handle (Wood Oak) -->
|
|
230
|
+
<rect x="5" y="16" width="2" height="2" fill="#8b5a2b" />
|
|
231
|
+
<rect x="4" y="17" width="2" height="2" fill="#6d421e" />
|
|
232
|
+
|
|
233
|
+
<!-- Pommel (Obsidian) -->
|
|
234
|
+
<rect x="3" y="18" width="2" height="2" fill="#27292a" />
|
|
235
|
+
<rect x="2" y="19" width="2" height="2" fill="#3c3f41" />
|
|
236
|
+
</g>
|
|
237
|
+
</g>
|
|
238
|
+
</g>
|
|
239
|
+
|
|
240
|
+
<!-- ================= RIGHT: PIXEL ART ENCHANTED APPLE / ORB (ANIMATED) ================= -->
|
|
241
|
+
<g transform="translate(895, 140)">
|
|
242
|
+
<g class="apple-group">
|
|
243
|
+
<animateTransform attributeName="transform" type="translate" values="0,0; 0,-12; 0,0" dur="5s" repeatCount="indefinite" />
|
|
244
|
+
|
|
245
|
+
<!-- Enchantment Halo -->
|
|
246
|
+
<ellipse cx="0" cy="0" rx="46" ry="20" fill="none" stroke="#c77dff" stroke-width="2" stroke-dasharray="8,4" opacity="0.65" />
|
|
247
|
+
<circle cx="0" cy="0" r="38" fill="#c77dff" opacity="0.1" filter="url(#softAura)" />
|
|
248
|
+
|
|
249
|
+
<!-- Apple Pixel Art -->
|
|
250
|
+
<g transform="scale(3.2) translate(-11, -10)" filter="url(#pixelShadow)">
|
|
251
|
+
<!-- Stem & Leaf -->
|
|
252
|
+
<rect x="11" y="3" width="2" height="3" fill="#8b5a2b" />
|
|
253
|
+
<rect x="13" y="2" width="2" height="2" fill="#55ff55" />
|
|
254
|
+
|
|
255
|
+
<!-- Apple Body -->
|
|
256
|
+
<rect x="8" y="6" width="8" height="10" rx="1" fill="#ffaa00" />
|
|
257
|
+
<rect x="6" y="8" width="12" height="7" rx="1" fill="#ffaa00" />
|
|
258
|
+
<!-- Shiny Highlights -->
|
|
259
|
+
<rect x="7" y="7" width="4" height="4" fill="#ffff55" />
|
|
260
|
+
<rect x="7" y="7" width="2" height="2" fill="#ffffff" />
|
|
261
|
+
|
|
262
|
+
<!-- Shading & Outline -->
|
|
263
|
+
<rect x="7" y="14" width="10" height="2" fill="#cc7700" />
|
|
264
|
+
<rect x="8" y="15" width="8" height="1" fill="#884400" />
|
|
265
|
+
<rect x="5" y="9" width="1" height="5" fill="#884400" />
|
|
266
|
+
<rect x="18" y="9" width="1" height="5" fill="#884400" />
|
|
267
|
+
</g>
|
|
268
|
+
</g>
|
|
269
|
+
</g>
|
|
270
|
+
|
|
271
|
+
<!-- ================= CENTER: BRAND & TYPOGRAPHY ================= -->
|
|
272
|
+
<!-- Top Category Pill -->
|
|
273
|
+
<g transform="translate(500, 48)">
|
|
274
|
+
<rect x="-165" y="-14" width="330" height="28" rx="14" fill="#131929" stroke="#2b3754" stroke-width="1.5" />
|
|
275
|
+
<text x="0" y="5" text-anchor="middle" fill="#00d2ff" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" font-size="12" font-weight="800" letter-spacing="2.5">
|
|
276
|
+
MINECRAFT JAVA ARCHITECTURE
|
|
277
|
+
</text>
|
|
278
|
+
</g>
|
|
279
|
+
|
|
280
|
+
<!-- Main 3D Title: PAPERMC SKILL -->
|
|
281
|
+
<!-- Bevel Shadow 1 -->
|
|
282
|
+
<text x="502" y="127" text-anchor="middle" class="mc-header-font" font-size="56" fill="#040b17" opacity="0.95">
|
|
283
|
+
PAPERMC SKILL
|
|
284
|
+
</text>
|
|
285
|
+
<!-- Bevel Shadow 2 -->
|
|
286
|
+
<text x="500" y="125" text-anchor="middle" class="mc-header-font" font-size="56" fill="#0a3150">
|
|
287
|
+
PAPERMC SKILL
|
|
288
|
+
</text>
|
|
289
|
+
<!-- Main Glowing Gradient Text -->
|
|
290
|
+
<text x="500" y="122" text-anchor="middle" class="mc-header-font" font-size="56" fill="url(#titleCyan)" filter="url(#textGlow)">
|
|
291
|
+
PAPERMC SKILL
|
|
292
|
+
</text>
|
|
293
|
+
<text x="500" y="122" text-anchor="middle" class="mc-header-font" font-size="56" fill="url(#titleCyan)">
|
|
294
|
+
PAPERMC SKILL
|
|
295
|
+
</text>
|
|
296
|
+
|
|
297
|
+
<!-- High-Energy Tagline -->
|
|
298
|
+
<text x="500" y="165" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Minecraft', sans-serif" font-size="16" font-weight="700" fill="#e2e8f0" letter-spacing="1.2">
|
|
299
|
+
⚔️ NEXT-GEN MINECRAFT PLUGIN ARSENAL • FOLIA READY • JAVA 21+ ⚔️
|
|
300
|
+
</text>
|
|
301
|
+
|
|
302
|
+
<!-- Feature Pills -->
|
|
303
|
+
<g transform="translate(500, 206)">
|
|
304
|
+
<!-- Pill 1: Paper 1.21.11 -->
|
|
305
|
+
<g transform="translate(-235, 0)">
|
|
306
|
+
<rect x="-65" y="-12" width="130" height="24" rx="6" fill="#0c1d2e" stroke="#00aaff" stroke-width="1" />
|
|
307
|
+
<text x="0" y="4" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="11" font-weight="700" fill="#7bf5ff">
|
|
308
|
+
⚡ PAPER 1.21+
|
|
309
|
+
</text>
|
|
310
|
+
</g>
|
|
311
|
+
|
|
312
|
+
<!-- Pill 2: Folia Multithreaded -->
|
|
313
|
+
<g transform="translate(-80, 0)">
|
|
314
|
+
<rect x="-70" y="-12" width="140" height="24" rx="6" fill="#1b1233" stroke="#9d4edd" stroke-width="1" />
|
|
315
|
+
<text x="0" y="4" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="11" font-weight="700" fill="#d8b4fe">
|
|
316
|
+
🌌 FOLIA NATIVE
|
|
317
|
+
</text>
|
|
318
|
+
</g>
|
|
319
|
+
|
|
320
|
+
<!-- Pill 3: Fill v3 Auto-Updater -->
|
|
321
|
+
<g transform="translate(80, 0)">
|
|
322
|
+
<rect x="-70" y="-12" width="140" height="24" rx="6" fill="#1c1f10" stroke="#55ff55" stroke-width="1" />
|
|
323
|
+
<text x="0" y="4" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="11" font-weight="700" fill="#86efac">
|
|
324
|
+
🔄 FILL V3 TRACKER
|
|
325
|
+
</text>
|
|
326
|
+
</g>
|
|
327
|
+
|
|
328
|
+
<!-- Pill 4: Zero Tech-Debt -->
|
|
329
|
+
<g transform="translate(235, 0)">
|
|
330
|
+
<rect x="-65" y="-12" width="130" height="24" rx="6" fill="#241708" stroke="#ffaa00" stroke-width="1" />
|
|
331
|
+
<text x="0" y="4" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="11" font-weight="700" fill="#fde047">
|
|
332
|
+
🛡️ ZERO TECH-DEBT
|
|
333
|
+
</text>
|
|
334
|
+
</g>
|
|
335
|
+
</g>
|
|
336
|
+
|
|
337
|
+
<!-- Bottom Terminal Status Bar -->
|
|
338
|
+
<g transform="translate(500, 274)">
|
|
339
|
+
<rect x="-310" y="-17" width="620" height="34" rx="8" fill="#080a10" stroke="#1c2336" stroke-width="1.5" />
|
|
340
|
+
|
|
341
|
+
<!-- Radar Live Ping Circle (CSS + SMIL) -->
|
|
342
|
+
<g transform="translate(-280, 0)">
|
|
343
|
+
<circle class="radar-pulse-anim" cx="0" cy="0" r="4" fill="none" stroke="#22c55e">
|
|
344
|
+
<animate attributeName="r" values="4;13" dur="1.8s" repeatCount="indefinite" />
|
|
345
|
+
<animate attributeName="opacity" values="1;0" dur="1.8s" repeatCount="indefinite" />
|
|
346
|
+
</circle>
|
|
347
|
+
<circle cx="0" cy="0" r="4" fill="#22c55e" />
|
|
348
|
+
</g>
|
|
349
|
+
|
|
350
|
+
<text x="-260" y="4" font-family="'Courier New', Courier, monospace" font-size="13" font-weight="700" fill="#22c55e">
|
|
351
|
+
SYS_READY:
|
|
352
|
+
</text>
|
|
353
|
+
<text x="-165" y="4" font-family="'Courier New', Courier, monospace" font-size="12" font-weight="600" fill="#94a3b8">
|
|
354
|
+
LATEST ENGINE <tspan fill="#38d9ff">v1.1.0</tspan> | BUILD <tspan fill="#f59e0b">GRADLE 9.7.1</tspan> | JAVA <tspan fill="#e2e8f0">21 LTS</tspan>
|
|
355
|
+
</text>
|
|
356
|
+
<text x="275" y="4" text-anchor="end" font-family="'Courier New', Courier, monospace" font-size="12" font-weight="700" fill="#00d2ff">
|
|
357
|
+
[LIVE]
|
|
358
|
+
</text>
|
|
359
|
+
</g>
|
|
360
|
+
</svg>
|