StarScript
StarScript transforms Minecraft into a powerful story-driven experience engine. It enables creators to build branching narratives, interactive quests, and dynamic storytelling experiences entirely through JSON configuration, without requiring Java programming knowledge.
Vision and Purpose
StarScript was created to bridge the gap between traditional Minecraft gameplay and narrative-driven experiences. While Minecraft excels at sandbox creativity, telling structured stories with branching paths and player choices has historically required significant programming expertise. StarScript changes that by providing a complete storytelling framework accessible to content creators, world builders, and story writers.
Core Philosophy
JSON-Driven Design
Every aspect of a story is defined in JSON files. This approach offers several advantages:
- Accessibility: Non-programmers can create complex narratives
- Versioning: Stories can be tracked in version control
- Sharing: Stories are data packs that can be easily distributed
- Iteration: Quick changes without recompiling code
- Documentation: JSON structure serves as self-documenting format
Event-Driven Architecture
StarScript uses an efficient event-driven system where triggers only execute when relevant game events occur. This design ensures:
- Minimal performance overhead
- Scalability to hundreds of concurrent stories
- No polling or constant checking
- Clean integration with Minecraft's event system
Player-Centric State Management
Each player maintains their own story state independently. This allows:
- Multiplayer servers where players experience different story paths
- No interference between players' narrative choices
- Individual save systems
- Flexible difficulty and pacing per player
Story Structure
Nodes as Building Blocks
Stories are composed of nodes, each representing a scene, dialogue, or decision point. Nodes contain:
Core Properties
id: Unique identifier for the nodetype: Node category (dialogue, journal, discovery, ending)text: Array of text lines to displayspeaker: Optional character namechoices: Array of player choicestriggers: Conditions that advance the story automaticallyon_start: Actions executed when entering the nodeon_complete: Actions executed when leaving the noderequires: Conditions that must be met to access the node
Example Node
{
"id": "village_elder",
"type": "dialogue",
"speaker": "Elder Thoran",
"text": [
"Greetings, traveler. Dark times have befallen our village.",
"The ancient artifact has been stolen by raiders."
],
"choices": [
{
"text": "I will help you recover it",
"next": "accept_quest",
"actions": [
{"type": "set_flag", "flag": "quest_accepted"}
]
},
{
"text": "This is not my concern",
"next": "reject_quest",
"requires": ["var:reputation<50"]
}
]
}
Branching Narratives
StarScript supports complex branching through:
Linear Paths: Sequential story progression Conditional Branches: Paths based on player state Parallel Tracks: Multiple concurrent storylines Convergent Paths: Different routes leading to common outcomes Multiple Endings: Varied conclusions based on player choices
Variable System
Three types of variables track story state:
Flags (Boolean)
Simple true/false markers for story events:
{"type": "set_flag", "flag": "dragon_defeated"}
{"type": "clear_flag", "flag": "in_combat"}
// Check in requirements
"requires": ["flag:dragon_defeated"]
Integers
Numeric values for scores, counts, reputation:
{"type": "set_var", "name": "gold", "value": 100}
{"type": "increment_var", "name": "reputation", "amount": 10}
{"type": "decrement_var", "name": "health_potions", "amount": 1}
// Check in requirements
"requires": ["var:gold>=50", "var:reputation>80"]
Strings
Text values for names, factions, status:
{"type": "set_var", "name": "faction", "value": "rebels"}
{"type": "set_var", "name": "title", "value": "Knight"}
// Check in requirements
"requires": ["var:faction=rebels"]
Trigger System
Triggers cause story progression based on game events rather than explicit player choices.
Player Action Triggers
Item Interaction
{
"type": "item_used",
"item": "minecraft:diamond_pickaxe",
"next": "discovered_diamonds"
}
Block Interaction
{
"type": "block_interact",
"block": "minecraft:lectern",
"next": "found_ancient_text"
}
Crafting
{
"type": "crafting",
"item": "minecraft:enchanting_table",
"next": "learned_enchanting"
}
Combat Triggers
Entity Kills
{
"type": "kill_entity",
"entity": "minecraft:zombie",
"count": 10,
"next": "cleared_zombies"
}
Boss Defeats
{
"type": "boss_kill",
"entity": "minecraft:ender_dragon",
"next": "dragon_slayer"
}
Exploration Triggers
Biome Discovery
{
"type": "biome_discover",
"biome": "minecraft:desert_temple",
"next": "found_temple"
}
Structure Entry
{
"type": "structure_enter",
"structure": "*stronghold*",
"next": "discovered_stronghold"
}
Proximity
{
"type": "proximity",
"x": 1000,
"y": 64,
"z": -500,
"radius": 20,
"next": "arrived_at_ruins"
}
Advanced Triggers
Time-Based
{
"type": "time_change",
"time": "midnight",
"next": "midnight_event"
}
{
"type": "day_count",
"day": 7,
"next": "week_passed"
}
Dimension Changes
{
"type": "dimension_enter",
"dimension": "minecraft:the_nether",
"next": "entered_nether"
}
Health/Status
{
"type": "health_below",
"threshold": 6.0,
"next": "low_health_event"
}
Action System
Actions execute automatically when nodes activate or choices are made.
Item Actions
{"type": "give_item", "item": "minecraft:diamond_sword", "count": 1}
{"type": "remove_item", "item": "minecraft:key", "count": 1}
{"type": "clear_inventory"}
Player Manipulation
{"type": "teleport", "x": 100, "y": 64, "z": 200, "dimension": "minecraft:overworld"}
{"type": "set_spawn", "x": 50, "y": 70, "z": 150}
{"type": "heal", "amount": 20.0}
{"type": "damage", "amount": 5.0}
World Interaction
{"type": "run_command", "command": "time set day"}
{"type": "set_block", "x": 100, "y": 64, "z": 200, "block": "minecraft:diamond_block"}
{"type": "spawn_entity", "entity": "minecraft:villager", "x": 100, "y": 64, "z": 200}
Effects and Audio
{"type": "play_sound", "sound": "minecraft:entity.ender_dragon.roar", "volume": 1.0}
{"type": "add_effect", "effect": "minecraft:strength", "duration": 600, "amplifier": 1}
{"type": "particle", "particle": "minecraft:flame", "x": 100, "y": 65, "z": 200}
Cinematic Actions
{
"type": "scene",
"transition": "fade",
"direction": "in",
"duration": 60,
"overlay": "vignette",
"intensity": 0.7
}
Boss System
StarScript includes an advanced boss encounter system introduced in version 0.7.0.
Boss Phases
Bosses can have multiple phases triggered by health thresholds:
{
"boss_phases": [
{
"health_threshold": 0.75,
"node_id": "boss_phase_2",
"actions": [
{"type": "play_sound", "sound": "entity.ender_dragon.roar"},
{"type": "send_message", "message": "§cThe boss grows stronger!"}
]
},
{
"health_threshold": 0.25,
"node_id": "boss_desperate",
"arena_effects": ["lightning", "fire"]
}
]
}
Arena Locking
Prevent players from escaping boss fights:
{
"arena": {
"center_x": 100,
"center_z": 200,
"radius": 50,
"locked": true,
"barrier_type": "bedrock"
}
}
Custom Bosses
Define bosses with enhanced attributes:
{
"custom_bosses": [
{
"id": "shadow_lord",
"name": "§4§lShadow Lord",
"base_entity": "minecraft:wither_skeleton",
"health_multiplier": 5.0,
"damage_multiplier": 2.0,
"speed_multiplier": 1.3,
"abilities": ["regeneration", "strength"],
"show_boss_bar": true,
"drops": [
{"item": "minecraft:diamond", "min_count": 5, "max_count": 10}
]
}
]
}
Death Consequences
Ten different death consequence types:
- XP loss
- Item loss
- Curse effects
- Corruption
- Teleportation
- Stat reduction
- Quest failure
- Story branching
- Respawn delay
- Permanent debuffs
GUI System
Display Modes
Traditional Mode
Centered dialogue box with choices displayed as buttons below the text. This mode works well for:
- Quest dialogues
- NPC conversations
- Information delivery
- Multiple choice selections
Visual Novel Mode
Text positioned at the bottom of the screen with optional character names, creating an immersive reading experience. Best for:
- Story-heavy narratives
- Character development
- Dramatic scenes
- Cinematic sequences
Customization
Each node can have custom styling:
{
"gui_style": {
"panel_color": "#DD1a1a2e",
"border_color": "#FF16c784",
"text_color": "#FFFFFFFF",
"text_position": "bottom",
"button_position": "middle",
"typewriter_speed": 20
}
}
Text Effects
Typewriter Effect
Text appears character by character with adjustable speed:
{"typewriter_delay_ms": 50}
Text Formatting
Support for Minecraft formatting codes:
§l - Bold
§o - Italic
§n - Underline
§4 - Color (red)
Button Layouts
Automatic layout adjustment based on number of choices:
- 1-2 choices: Vertical stack
- 3-4 choices: Side-by-side
- 5+ choices: Scrollable list
Builder Pattern API
Version 1.0.0 introduced a programmatic API for creating stories through code.
Story Builder
Story story = new StoryBuilder()
.setId("epic_quest")
.setName("The Epic Quest")
.setDescription("A grand adventure awaits")
.setStartNode("intro")
.addNode(new StoryNodeBuilder()
.setId("intro")
.setType(NodeType.DIALOGUE)
.addText("Welcome, brave adventurer!")
.addChoice(new StoryChoiceBuilder()
.setText("I accept the quest!")
.setNext("quest_start")
.addAction(StoryActionBuilder.giveItem("quest_token", 1).build())
.build())
.build())
.build();
Factory Methods
33 factory methods for common operations:
// Actions
StoryActionBuilder.giveItem("diamond", 5)
StoryActionBuilder.teleport(100, 64, 200)
StoryActionBuilder.playSound("entity.player.levelup")
StoryActionBuilder.sendMessage("Quest Complete!")
// Triggers
StoryTriggerBuilder.onBossKill("ender_dragon", "victory")
StoryTriggerBuilder.onProximity(100, 64, 200, 20, "arrived")
StoryTriggerBuilder.onItemPickup("special_key", "found_key")
Nested Builders
Support for complex configurations:
.addChoice(new StoryChoiceBuilder()
.setText("Ancient wisdom")
.setNext("wisdom_path")
.setGuiStyle(new GuiStyleBuilder()
.setPanelColor("#1a1a2e")
.setBorderColor("#16c784")
.build())
.addTextEffect(new TextEffectBuilder()
.setTypewriterSpeed(30)
.setColor("#FFD700")
.build())
.build())
Modifying Existing Stories
Story modified = new StoryBuilder()
.from(existingStory)
.setDescription("Updated description")
.addNode(newNode)
.build();
Relic System
Version 0.7.0 introduced a relic progression system.
Relic States
Relics transform through states:
- Dormant: Initial state, basic functionality
- Awakened: Enhanced powers unlocked
- Corrupted: Dark powers with consequences
Relic Crafting
Progressive crafting system:
{
"relic_crafting": {
"id": "ancient_sword",
"recipe": [
{"item": "minecraft:diamond_sword", "count": 1},
{"item": "minecraft:nether_star", "count": 1},
{"item": "custom:ancient_fragment", "count": 3}
],
"result_state": "awakened",
"requires_node": "altar_discovered"
}
}
Recipe Unlocking
Control when players can craft items:
{
"type": "unlock_recipe",
"recipe": "custom:ancient_sword",
"requires": ["flag:altar_activated", "var:wisdom>=50"]
}
World Integration
Soft Discovery
Environmental hints guide players without explicit markers:
{
"soft_discovery": {
"sounds": ["ambient.cave"],
"particles": ["minecraft:smoke"],
"frequency": 100,
"radius": 50
}
}
Region Memory
World regions remember story events:
{
"region": {
"min_x": -100,
"max_x": 100,
"min_z": -100,
"max_z": 100,
"state": "corrupted",
"effects": ["darkness", "fog"]
}
}
Structure Variants
Buildings transform based on story progression:
{
"structure_variants": {
"village_temple": [
{"state": "pristine", "structure": "temple_clean"},
{"state": "corrupted", "structure": "temple_dark"},
{"state": "destroyed", "structure": "temple_ruins"}
]
}
}
Save System
Players can save and load progress across 10 slots.
Saving
/story save <slot_number>
Saves:
- Current node position
- All flags
- All variables
- Completion status
- Timestamp
Loading
/story load <slot_number>
Auto-Save
Automatic saving on:
- Player disconnect
- Server shutdown
- Node completion
- Major story events
Performance Optimization
Rendering Optimizations
Version 0.7.0 included major rendering improvements:
- Multi-layer rendering pipeline
- Adaptive Bezier curve segments
- Smart pin label rendering
- Grid depth perception
- Efficient connection rendering
Benchmarks:
- Frame time impact: < 5ms
- 100+ triggers: < 1ms per tick
- Story hot-reload: < 100ms
Memory Management
- Lazy loading of story files
- Efficient state caching
- Automatic cleanup on disconnect
- Smart trigger registration
Network Optimization
- Delta-based state updates
- Compressed packet transmission
- Batched updates
- Client-side prediction
Blueprint Editor
Visual node-based story editor within Minecraft.
Features
- Modern gradient background
- Multi-layer grid system
- Card-style nodes with shadows
- Animated connections with pulse effects
- Minimap for navigation
- Glass morphism info panel
- Rich multi-line tooltips
- Drag-and-drop interface
Node Palette
Pre-configured node types:
- Dialogue nodes
- Choice nodes
- Action nodes
- Trigger nodes
- Conditional nodes
Real-Time Preview
Changes visible immediately:
- Live text updates
- Dynamic connection rendering
- Interactive testing mode
- Error highlighting
Development Integration
Custom Mod Integration
// Start stories from your mod
StoryEngine.activateNode(player, "mymod:quest", "intro");
// Check player state
StoryState state = StoryStateManager.getState(player, "mymod:quest");
if (state.hasFlag("completed")) {
// Reward logic
}
// Set variables
StoryStateManager.setIntVariable(player, "mymod:quest", "score", 100);
Event Listeners
Listen for story events:
@EventHandler
public void onStoryComplete(StoryCompleteEvent event) {
Player player = event.getPlayer();
String storyId = event.getStoryId();
// Custom logic
}
Custom Triggers
Register custom trigger types:
TriggerRegistry.register("custom_trigger",
new CustomTriggerHandler());
Commands
Player Commands
/story list - View available stories
/story start <id> - Begin a story
/story stop - End current story
/story progress - Show progress
/story save <slot> - Save to slot
/story load <slot> - Load from slot
Admin Commands
/story reload - Reload all stories
/story debug - Toggle debug mode
/story flag set <story> <flag> - Set flag
/story var set <story> <name> <value> - Set variable
/story choose <story> <node> <choice> - Force choice
Debug Commands
/story scene fade_in - Test effects
/story trigger <type> - Test triggers
/story state <player> - View player state
Configuration
Main Configuration
Located at .minecraft/config/starscript.json:
{
"debugMode": false,
"showObjectivesHud": true,
"autoSaveEnabled": true,
"textSpeed": 20,
"uiScale": 1.0,
"maxSaveSlots": 10,
"enableTelemetry": false
}
Per-Story Configuration
Each story can override global settings:
{
"id": "mystory",
"config": {
"allowSaving": true,
"showProgress": true,
"timeout": 0
}
}
Best Practices
Story Design
- Start simple, add complexity gradually
- Test all choice combinations
- Provide clear player feedback
- Balance text length for readability
- Use scene effects sparingly for impact
Performance
- Limit active triggers per player
- Use event-based triggers over proximity when possible
- Clear unused flags and variables
- Combine related triggers in single nodes
Player Experience
- Show consequences of choices
- Provide meaningful decisions
- Balance difficulty appropriately
- Test with real players
- Gather feedback early
Requirements
- Minecraft: 1.21.11
- Fabric Loader: 0.18.2+
- Fabric API: 0.139.4+
- Java: 21+
Optional:
- ModMenu (for config GUI)
- YACL (for advanced config)
License
StarScript is released under the MIT License, allowing free use, modification, and distribution with proper attribution.
Community
- GitHub Repository: For issues and contributions
- Documentation: Complete guides in the docs folder
- Examples: Sample stories in resources
- Discord: Community support and discussion