papermc-skill 1.1.0 → 1.2.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.
Files changed (26) hide show
  1. package/.cursor/rules/paper-plugin-dev.mdc +23 -0
  2. package/.cursorrules +6 -0
  3. package/.paseo/rules.md +8 -0
  4. package/.pi/rules.md +8 -0
  5. package/.windsurfrules +7 -0
  6. package/CHANGELOG.md +31 -0
  7. package/CLAUDE.md +27 -0
  8. package/CODEX.md +12 -0
  9. package/DEEPSEEK.md +18 -0
  10. package/README.md +66 -26
  11. package/bin/cli.js +461 -36
  12. package/docs/12-data-components-and-display-entities.md +264 -0
  13. package/docs/13-multi-agent-system-and-tooling.md +90 -0
  14. package/package.json +16 -4
  15. package/skills/paper-plugin-dev/SKILL.md +144 -110
  16. package/templates/paper-modern-template/.gradle/9.7.1/checksums/checksums.lock +0 -0
  17. package/templates/paper-modern-template/.gradle/9.7.1/checksums/md5-checksums.bin +0 -0
  18. package/templates/paper-modern-template/.gradle/9.7.1/checksums/sha1-checksums.bin +0 -0
  19. package/templates/paper-modern-template/.gradle/9.7.1/executionHistory/executionHistory.bin +0 -0
  20. package/templates/paper-modern-template/.gradle/9.7.1/executionHistory/executionHistory.lock +0 -0
  21. package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/fileHashes.bin +0 -0
  22. package/templates/paper-modern-template/.gradle/9.7.1/fileHashes/fileHashes.lock +0 -0
  23. package/templates/paper-modern-template/.gradle/9.7.1/kotlin-dsl-plugin-entries/kotlin-dsl-plugin-entries.lock +0 -0
  24. package/templates/paper-modern-template/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  25. package/templates/paper-modern-template/.gradle/buildOutputCleanup/cache.properties +1 -1
  26. package/templates/paper-modern-template/build/tmp/compileJava/previous-compilation-data.bin +0 -0
@@ -0,0 +1,264 @@
1
+ # 12. Modern Data Components & Display Entities (MC 1.20.5 — 26.x)
2
+
3
+ ## 📌 Paradigm Shift: From Legacy NBT & ItemMeta to Data Components
4
+
5
+ Beginning with **Minecraft 1.20.5** and continuing through **Minecraft 1.21+ and 26.x**, Mojang completely overhauled the item stack architecture.
6
+ - **Legacy NBT tags on ItemStacks are gone**.
7
+ - In their place is the **Data Component System**: a strictly-typed, immutable, performant, and schema-validated component pipeline.
8
+ - Paper exposes this via `io.papermc.paper.datacomponent.DataComponentTypes` and modern item manipulation methods directly on `ItemStack`.
9
+
10
+ > [!IMPORTANT]
11
+ > Never use legacy `net.minecraft.nbt` or reflection to modify item properties in modern Paper plugins. Use `ItemStack#setData(DataComponentType, Object)` or `ItemStack#getData(DataComponentType)`.
12
+
13
+ ---
14
+
15
+ ## 🛠️ 1. Modern Data Components in Action
16
+
17
+ ### A. Modifying Data Components Directly on ItemStack
18
+ Paper allows direct mutation of components without cloning `ItemMeta`:
19
+
20
+ ```java
21
+ package com.example.paperplugin.item;
22
+
23
+ import io.papermc.paper.datacomponent.DataComponentTypes;
24
+ import io.papermc.paper.datacomponent.item.CustomModelData;
25
+ import io.papermc.paper.datacomponent.item.FoodProperties;
26
+ import io.papermc.paper.datacomponent.item.ItemLore;
27
+ import io.papermc.paper.datacomponent.item.Tool;
28
+ import net.kyori.adventure.text.Component;
29
+ import net.kyori.adventure.text.format.NamedTextColor;
30
+ import net.kyori.adventure.text.format.TextDecoration;
31
+ import org.bukkit.Material;
32
+ import org.bukkit.inventory.ItemStack;
33
+
34
+ import java.util.List;
35
+
36
+ public final class ModernItemFactory {
37
+
38
+ public static ItemStack createMythicBlade() {
39
+ ItemStack blade = ItemStack.of(Material.NETHERITE_SWORD);
40
+
41
+ // 1. Direct Item Name (styled with MiniMessage/Adventure)
42
+ blade.setData(DataComponentTypes.ITEM_NAME, Component.text("Voidreaver Blade", NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD));
43
+
44
+ // 2. Direct Item Lore
45
+ blade.setData(DataComponentTypes.LORE, ItemLore.lore(List.of(
46
+ Component.text("Forged in the heart of the End dimension.", NamedTextColor.GRAY),
47
+ Component.empty(),
48
+ Component.text("⚡ Right-click to discharge void kinetic energy.", NamedTextColor.DARK_PURPLE)
49
+ )));
50
+
51
+ // 3. Custom Model Data (Modern float/flag/string/int support)
52
+ blade.setData(DataComponentTypes.CUSTOM_MODEL_DATA, CustomModelData.customModelData()
53
+ .addFloat(1.5f)
54
+ .addFlag(true)
55
+ .addString("mythic_blade_tier_3")
56
+ .build()
57
+ );
58
+
59
+ // 4. Custom Max Stack Size
60
+ blade.setData(DataComponentTypes.MAX_STACK_SIZE, 1);
61
+
62
+ // 5. Enchantment Glint Override (Glow without dummy enchantments!)
63
+ blade.setData(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true);
64
+
65
+ // 6. Unbreakable Flag
66
+ blade.setData(DataComponentTypes.UNBREAKABLE, true);
67
+
68
+ return blade;
69
+ }
70
+
71
+ public static ItemStack createEnchantedGoldenBerry() {
72
+ ItemStack berry = ItemStack.of(Material.SWEET_BERRIES);
73
+
74
+ // Set custom edible Food Properties on ANY item!
75
+ bladeLikeFood(berry);
76
+
77
+ return berry;
78
+ }
79
+
80
+ private static void bladeLikeFood(ItemStack item) {
81
+ item.setData(DataComponentTypes.FOOD, FoodProperties.food()
82
+ .nutrition(6)
83
+ .saturation(10.0f)
84
+ .canAlwaysEat() // Can eat even when hunger bar is full
85
+ .build()
86
+ );
87
+ item.setData(DataComponentTypes.ITEM_NAME, Component.text("Aetheria Nectar Berry", NamedTextColor.GOLD));
88
+ }
89
+ }
90
+ ```
91
+
92
+ ---
93
+
94
+ ## 🎭 2. Display Entities: Zero-Lag Visual FX & Holograms
95
+
96
+ In legacy plugins, floating text and custom visuals required invisible `ArmorStand` entities.
97
+ **Armor stands are notoriously laggy**: they tick gravity, collisions, equipment slots, and poses every server tick.
98
+
99
+ **Display Entities** (`TextDisplay`, `ItemDisplay`, `BlockDisplay`) introduced in modern Minecraft are:
100
+ 1. **Zero-Tick Lag**: Display entities do not have AI or physics ticking loops.
101
+ 2. **Smooth Interpolation**: The Minecraft client natively interpolates translation, rotation, and scale at full client framerate (60-240 FPS).
102
+ 3. **Billboarding**: Automatic camera tracking (`CENTER`, `VERTICAL`, `HORIZONTAL`).
103
+
104
+ ### Smooth Matrix Transformations (`org.joml.Matrix4f`)
105
+ Paper integrates the high-performance **JOML** (Java OpenGL Math Library) for 3D transformations.
106
+
107
+ ```java
108
+ package com.example.paperplugin.display;
109
+
110
+ import net.kyori.adventure.text.Component;
111
+ import net.kyori.adventure.text.format.NamedTextColor;
112
+ import net.kyori.adventure.text.format.TextDecoration;
113
+ import org.bukkit.Color;
114
+ import org.bukkit.Location;
115
+ import org.bukkit.Material;
116
+ import org.bukkit.entity.Display;
117
+ import org.bukkit.entity.ItemDisplay;
118
+ import org.bukkit.entity.TextDisplay;
119
+ import org.bukkit.inventory.ItemStack;
120
+ import org.bukkit.util.Transformation;
121
+ import org.joml.AxisAngle4f;
122
+ import org.joml.Vector3f;
123
+
124
+ public final class HologramManager {
125
+
126
+ /**
127
+ * Spawns a floating holographic sign with smooth client-side interpolation.
128
+ */
129
+ public static TextDisplay spawnFloatingTitle(Location loc, Component text) {
130
+ return loc.getWorld().spawn(loc, TextDisplay.class, display -> {
131
+ display.text(text);
132
+ display.setBillboard(Display.Billboard.CENTER); // Always faces player
133
+ display.setDefaultBackground(false);
134
+ display.setBackgroundColor(Color.fromARGB(140, 15, 15, 25));
135
+ display.setShadowed(true);
136
+ display.setSeeThrough(false);
137
+
138
+ // Display view distance
139
+ display.setViewRange(0.8f);
140
+
141
+ // Initial scale & position transformation
142
+ Transformation transform = new Transformation(
143
+ new Vector3f(0f, 0f, 0f), // Translation
144
+ new AxisAngle4f(0f, 0f, 1f, 0f), // Left rotation
145
+ new Vector3f(1.2f, 1.2f, 1.2f), // Scale (120%)
146
+ new AxisAngle4f(0f, 0f, 1f, 0f) // Right rotation
147
+ );
148
+ display.setTransformation(transform);
149
+ });
150
+ }
151
+
152
+ /**
153
+ * Spawns a spinning, floating 3D item icon above a pedestal.
154
+ */
155
+ public static ItemDisplay spawnRotatingPedestalItem(Location loc, ItemStack item) {
156
+ return loc.getWorld().spawn(loc, ItemDisplay.class, display -> {
157
+ display.setItemStack(item);
158
+ display.setItemDisplayTransform(ItemDisplay.ItemDisplayTransform.GROUND);
159
+ display.setBillboard(Display.Billboard.FIXED);
160
+
161
+ // Set up client-side 20-tick smooth interpolation
162
+ display.setInterpolationDuration(20);
163
+ display.setInterpolationDelay(0);
164
+
165
+ // Initial transformation
166
+ Transformation initial = new Transformation(
167
+ new Vector3f(0f, 0.5f, 0f),
168
+ new AxisAngle4f(0f, 0f, 1f, 0f),
169
+ new Vector3f(1.5f, 1.5f, 1.5f),
170
+ new AxisAngle4f(0f, 0f, 1f, 0f)
171
+ );
172
+ display.setTransformation(initial);
173
+ });
174
+ }
175
+
176
+ /**
177
+ * Smoothly rotates the display entity over time using client interpolation.
178
+ */
179
+ public static void rotateDisplaySmoothly(Display display, float angleRadians, int durationTicks) {
180
+ display.setInterpolationDuration(durationTicks);
181
+ display.setInterpolationDelay(0);
182
+
183
+ Transformation current = display.getTransformation();
184
+ Transformation next = new Transformation(
185
+ current.getTranslation(),
186
+ new AxisAngle4f(angleRadians, 0f, 1f, 0f), // Rotate around Y axis
187
+ current.getScale(),
188
+ current.getRightRotation()
189
+ );
190
+
191
+ display.setTransformation(next);
192
+ }
193
+ }
194
+ ```
195
+
196
+ ---
197
+
198
+ ## ⚡ 3. 1.21 Tricky Trials & Mace Combat Kinematics
199
+
200
+ Minecraft 1.21 introduced the **Mace**, **Wind Charges**, and dynamic physics combat mechanics.
201
+
202
+ ### Mace Kinetic Smash Mechanics
203
+ The Mace scales damage dynamically based on fall distance, resetting the attacker's fall distance upon a successful hit:
204
+
205
+ ```java
206
+ package com.example.paperplugin.combat;
207
+
208
+ import net.kyori.adventure.text.Component;
209
+ import net.kyori.adventure.text.format.NamedTextColor;
210
+ import org.bukkit.Location;
211
+ import org.bukkit.Material;
212
+ import org.bukkit.Particle;
213
+ import org.bukkit.Sound;
214
+ import org.bukkit.entity.LivingEntity;
215
+ import org.bukkit.entity.Player;
216
+ import org.bukkit.event.EventHandler;
217
+ import org.bukkit.event.EventPriority;
218
+ import org.bukkit.event.Listener;
219
+ import org.bukkit.event.entity.EntityDamageByEntityEvent;
220
+ import org.bukkit.util.Vector;
221
+
222
+ public final class ModernCombatListener implements Listener {
223
+
224
+ @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
225
+ public void onMaceSmash(EntityDamageByEntityEvent event) {
226
+ if (!(event.getDamager() instanceof Player attacker)) return;
227
+ if (!(event.getEntity() instanceof LivingEntity victim)) return;
228
+
229
+ // Verify weapon
230
+ if (attacker.getInventory().getItemInMainHand().getType() != Material.MACE) return;
231
+
232
+ float fallDistance = attacker.getFallDistance();
233
+ if (fallDistance > 1.5f) {
234
+ // Smash attack succeeded!
235
+ double bonusDamage = Math.min(fallDistance * 3.5, 40.0); // Safe numeric cap
236
+ event.setDamage(event.getDamage() + bonusDamage);
237
+
238
+ Location hitLoc = victim.getLocation();
239
+
240
+ // Spawn modern Tricky Trials visual & acoustic feedback
241
+ hitLoc.getWorld().spawnParticle(Particle.TRIAL_SPAWNER_DETECTION, hitLoc.add(0, 0.5, 0), 25, 0.4, 0.2, 0.4, 0.05);
242
+ hitLoc.getWorld().playSound(hitLoc, Sound.ITEM_MACE_SMASH_GROUND, 1.2f, 1.0f);
243
+
244
+ // Produce kinetic radial shockwave knockback on nearby hostile entities
245
+ hitLoc.getWorld().getNearbyLivingEntities(hitLoc, 4.0, e -> !e.equals(attacker) && !e.equals(victim))
246
+ .forEach(nearby -> {
247
+ Vector impulse = nearby.getLocation().toVector().subtract(hitLoc.toVector()).normalize().multiply(1.2).setY(0.4);
248
+ nearby.setVelocity(impulse);
249
+ });
250
+
251
+ attacker.sendActionBar(Component.text("⚡ KINETIC SMASH: +" + String.format("%.1f", bonusDamage) + " DMG", NamedTextColor.GOLD));
252
+ }
253
+ }
254
+ }
255
+ ```
256
+
257
+ ---
258
+
259
+ ## 🛡️ Best Practices & Gotchas
260
+
261
+ 1. **Never Cast Data Components**: Always check `itemStack.hasData(DataComponentTypes.XXX)` before reading `itemStack.getData(DataComponentTypes.XXX)`.
262
+ 2. **Clean Display Entity Lifecycles**: When removing holograms, always invoke `display.remove()` and clean up stored entity UUIDs. Never store `TextDisplay` references in static collections.
263
+ 3. **JOML Thread Safety**: `Matrix4f`, `Vector3f`, and `Transformation` are value objects. Create them locally on demand rather than sharing mutable instances across async threads.
264
+ 4. **Folia Compatibility**: Always execute `world.spawn(loc, Display.class, ...)` on the Folia region scheduler corresponding to `loc`.
@@ -0,0 +1,90 @@
1
+ # 13. Multi-Agent System & Universal AI Tooling Setup
2
+
3
+ Modern Minecraft plugin engineering demands high precision, zero memory leaks, thread safety across Folia regions, and exploit-proof business logic.
4
+ **PaperMC Skill** is designed to work seamlessly as a universal agentic skill across all premier AI coding platforms:
5
+
6
+ - 🌌 **Antigravity / agy** (Google Antigravity & AGY CLI)
7
+ - 🧠 **Claude Code** (Anthropic)
8
+ - ⚡ **OpenAI Codex / Codex CLI**
9
+ - 🖱️ **Cursor IDE**
10
+ - 🐋 **DeepSeek Harness**
11
+ - 🧭 **Paseo**
12
+ - 🥧 **pi.dev**
13
+ - 🏄 **Windsurf IDE**
14
+
15
+ ---
16
+
17
+ ## 🚀 One-Command Universal Installation
18
+
19
+ Install the PaperMC development skill into any agent environment using the zero-dependency CLI:
20
+
21
+ ```bash
22
+ # Interactive Mode (choose your target agent)
23
+ npx papermc-skill install-skill
24
+
25
+ # Install globally to all supported agent configurations
26
+ npx papermc-skill install-skill --all
27
+
28
+ # Target a specific AI Agent
29
+ npx papermc-skill install-skill --agent agy # Antigravity (~/.gemini/config/skills)
30
+ npx papermc-skill install-skill --agent claude # Claude Code (~/.claude & CLAUDE.md)
31
+ npx papermc-skill install-skill --agent codex # OpenAI Codex (~/.codex & CODEX.md)
32
+ npx papermc-skill install-skill --agent cursor # Cursor (.cursor/rules & .cursorrules)
33
+ npx papermc-skill install-skill --agent deepseek # DeepSeek Harness (~/.deepseek & DEEPSEEK.md)
34
+ npx papermc-skill install-skill --agent paseo # Paseo (~/.paseo & .paseo/rules.md)
35
+ npx papermc-skill install-skill --agent pi # pi.dev (~/.pi & .pi/rules.md)
36
+ npx papermc-skill install-skill --agent windsurf # Windsurf (.windsurfrules)
37
+ ```
38
+
39
+ ---
40
+
41
+ ## 🤖 Detailed Agent Configuration Guidelines
42
+
43
+ ### 1. Google Antigravity / agy CLI
44
+ - **Global Path**: `~/.gemini/config/skills/paper-plugin-dev/`
45
+ - **Workspace Path**: `.agents/skills/paper-plugin-dev/`
46
+ - **Behavior**: Antigravity automatically indexes `SKILL.md` in its semantic agent registry. When working on any repository with Java, Gradle, or `paper-plugin.yml`, Antigravity activates the skill to enforce Folia threading rules, MiniMessage color parsing, and exploit prevention.
47
+
48
+ ### 2. Claude Code (Anthropic)
49
+ - **Local Rule File**: `CLAUDE.md` in workspace root.
50
+ - **Global Skill Directory**: `~/.claude/skills/paper-plugin-dev/`
51
+ - **Claude Code Invocation**:
52
+ Claude Code reads `CLAUDE.md` upon session startup. The file instructs Claude to:
53
+ 1. Ban legacy `ChatColor` and `org.bukkit.scheduler.BukkitRunnable`.
54
+ 2. Implement `io.papermc.paper.threadedregions.scheduler.RegionScheduler` on Folia.
55
+ 3. Validate all economy / number arguments against NaN and infinite numbers.
56
+ 4. Run `npx papermc-skill audit` before concluding PRs or git commits.
57
+
58
+ ### 3. OpenAI Codex
59
+ - **Workspace Directive**: `CODEX.md` in workspace root.
60
+ - **Global Store**: `~/.codex/skills/paper-plugin-dev/`
61
+ - **Codex Instructions**: Codex references the strict recipes in `skills/paper-plugin-dev/SKILL.md` when generating commands with Brigadier or storing persistent data via `PersistentDataContainer`.
62
+
63
+ ### 4. Cursor IDE
64
+ - **Rule Specification**: `.cursor/rules/paper-plugin-dev.mdc`
65
+ - **Glob Pattern**: `**/*.java`, `**/*.gradle.kts`, `**/paper-plugin.yml`, `**/config.yml`
66
+ - **Cursor Integration**: Whenever you edit Java files or gradle configurations in Cursor, Cursor applies the MDC rule to enforce Adventure component building, asynchronous database queries, and debounce-protected GUI handlers.
67
+
68
+ ### 5. DeepSeek Harness
69
+ - **Workspace File**: `DEEPSEEK.md`
70
+ - **Global Harness**: `~/.deepseek/skills/paper-plugin-dev/`
71
+ - **DeepSeek Execution**: DeepSeek models use step-by-step reasoning on concurrency boundaries to ensure no synchronous block or inventory mutation occurs off the Bukkit/Folia main tick thread.
72
+
73
+ ### 6. Paseo & pi.dev
74
+ - **Paseo**: `.paseo/rules.md` and `~/.paseo/skills/paper-plugin-dev/`
75
+ - **pi.dev**: `.pi/rules.md` and `~/.pi/skills/paper-plugin-dev/`
76
+ - Both agents automatically digest the markdown instructions and provide proactive suggestions when scaffolding plugins.
77
+
78
+ ---
79
+
80
+ ## 🛡️ Built-in Security & Quality Gate
81
+
82
+ No matter which agent you use, ensure the AI executes the automated auditor before shipping code:
83
+
84
+ ```bash
85
+ # Audit plugin codebase for vulnerabilities and outdated APIs
86
+ npx papermc-skill audit
87
+
88
+ # Verify PaperMC version compatibility
89
+ npx papermc-skill check-update
90
+ ```
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "papermc-skill",
3
- "version": "1.1.0",
4
- "description": "Interactive CLI and architectural development skill for modern Paper & Folia Minecraft Java plugins",
3
+ "version": "1.2.0",
4
+ "description": "Interactive CLI, multi-agent AI installer, and architectural development skill for modern Paper & Folia Minecraft Java plugins",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {
7
7
  "papermc-skill": "bin/cli.js"
@@ -13,6 +13,14 @@
13
13
  "docs",
14
14
  "skills",
15
15
  "assets",
16
+ "CLAUDE.md",
17
+ "CODEX.md",
18
+ "DEEPSEEK.md",
19
+ ".cursor",
20
+ ".cursorrules",
21
+ ".paseo",
22
+ ".pi",
23
+ ".windsurfrules",
16
24
  "README.md",
17
25
  "CHANGELOG.md",
18
26
  "LICENSE"
@@ -25,8 +33,12 @@
25
33
  "minecraft-plugin",
26
34
  "adventure-api",
27
35
  "minimessage",
28
- "spigot",
29
- "bukkit",
36
+ "data-components",
37
+ "display-entities",
38
+ "claude-code",
39
+ "cursor",
40
+ "deepseek",
41
+ "openai-codex",
30
42
  "npx"
31
43
  ],
32
44
  "author": "Ardian Ryan <https://github.com/ardianryan>",