🚀 快速开始:3步开发模组
javac 环境变量(SMALO软件会自动检测)。
| 步骤 | 做什么 | 在哪里操作 |
|---|---|---|
| 1️⃣ | 修改主配置:填写模组ID、名字、版本、作者信息 | my-mod/smalo.mod.json |
| 2️⃣ | 写Java代码:按需引入要用的包,在onInitialize()里写逻辑 | my-mod/src/main/java/.../MyModMain.java |
| 3️⃣ | 在SMALO软件内编译打包:打开软件「上传」页面,选择你的Java文件,一键编译打包并自动安装到mods文件夹 | SMALO启动器 → 左侧「上传」 |
打包完成后,重启游戏就能在模组列表看到你的模组了!
📁 SDK模板结构
smalo-sdk/
├── 开发文档.html ← 就是你现在看的这个文档
└── my-mod/ ← 你的模组源码模板
├── smalo.mod.json ← 模组主配置(必须改)
└── src/main/java/
└── com/example/mymod/
└── MyModMain.java ← 模组入口代码(在这里写逻辑)
📄 主配置:smalo.mod.json
这个文件是模组的身份证,放在JAR根目录,SMALO启动时读取。
{
"modId": "my-first-mod",
"name": "我的第一个模组",
"version": "1.0.0",
"author": "你的名字",
"description": "模组介绍(不超过26字)",
"entryClass": "com.example.mymod.MyModMain",
"supportedMcVersions": ["1.20.1", "1.21.4", "26.2"],
"dependencies": [],
"website": "",
"icon": "icon.png"
}
| 字段 | 必填 | 说明 |
|---|---|---|
modId | ✅ | 模组唯一ID,英文小写,用-分隔,不能有空格和中文 |
name | ✅ | 模组显示名称,可以用中文 |
version | ✅ | 版本号,推荐语义化版本如 1.0.0 |
author | ❌ | 作者名字 |
description | ❌ | 模组介绍,不超过26字 |
entryClass | ✅ | 入口类全名(包含包名),SMALO启动时调用这个类的onInitialize() |
supportedMcVersions | ❌ | 支持的Minecraft版本列表,不填默认支持所有版本 |
dependencies | ❌ | 依赖的其他模组ID列表 |
👋 第一个模组:进游戏发欢迎消息
这是最简单的示例,玩家一进游戏就收到一条彩色欢迎消息。
MyModMain.java 代码
package com.example.mymod;
// ==========================================
// 🔴 核心依赖:smalo-api.jar + smartapi-core.jar
// 打包脚本自动添加,你不用管!
// ==========================================
// 【推荐保留】日志:在控制台打印信息,方便调试
import com.smalo.api.util.Logger;
// 【事件系统】监听游戏里发生的事
import com.smalo.api.event.EventBus;
import com.smalo.api.event.PlayerLoginEvent; // 玩家登录事件
// 【玩家操作】给玩家发消息、传送、给物品等
import com.smalo.api.player.PlayerHelper;
// 其他想用什么功能,就import对应的包,不用的别引!
public class MyModMain {
/**
* 🔑 SMALO启动模组时自动调用这个方法
* 所有初始化逻辑都写在这里
*/
public void onInitialize() {
Logger.info("✅ 我的第一个模组加载成功!");
// 订阅事件:玩家登录时触发
EventBus.subscribe(PlayerLoginEvent.class, event -> {
// 给玩家发彩色欢迎消息
// §a=绿色 §e=黄色 §6=金色,颜色代码同原版
PlayerHelper.sendMessage(event.getPlayer(),
"§a欢迎来到服务器!§e我的模组已加载~");
});
}
}
§0黑 §1深蓝 §2深绿 §3深青 §4深红 §5紫 §6金 §7灰 §8深灰 §9蓝 §a绿 §b青 §c红 §d粉 §e黄 §f白 §l粗体 §o斜体 §r重置
📡 核心:事件系统 com.smalo.api.event
必须 90%的模组都要用到事件系统——监听游戏里发生的事情,然后执行你的代码。
用法
import com.smalo.api.event.EventBus;
import com.smalo.api.event.你要监听的事件类;
// 在 onInitialize() 里订阅事件
EventBus.subscribe(事件类.class, event -> {
// 事件触发时执行你的代码
// event 对象里包含事件相关的所有数据
});
常用事件列表
玩家相关事件
| 事件类 | 触发时机 |
|---|---|
PlayerLoginEvent | 玩家加入游戏 |
PlayerLogoutEvent | 玩家退出游戏 |
PlayerTickEvent | 玩家每tick执行(每秒20次) |
PlayerMoveEvent | 玩家移动 |
PlayerJumpEvent | 玩家跳跃 |
PlayerDamageEvent | 玩家受伤 |
PlayerDeathEvent | 玩家死亡 |
PlayerRespawnEvent | 玩家重生 |
PlayerChatEvent | 玩家发送聊天消息(可取消) |
PlayerCommandEvent | 玩家执行指令(可取消) |
PlayerInteractEvent | 玩家右键交互(方块/实体/空气) |
PlayerInteractEntityEvent | 玩家右键实体 |
PlayerBreakBlockEvent | 玩家挖方块(可取消) |
PlayerPlaceBlockEvent | 玩家放置方块(可取消) |
PlayerItemUseEvent | 玩家使用物品 |
PlayerItemPickupEvent | 玩家捡起物品 |
PlayerItemDropEvent | 玩家丢弃物品(可取消) |
PlayerFoodLevelChangeEvent | 玩家饥饿值变化 |
PlayerExpChangeEvent | 玩家经验值变化 |
PlayerLevelChangeEvent | 玩家升级 |
PlayerGameModeChangeEvent | 玩家切换游戏模式 |
PlayerTeleportEvent | 玩家传送(可取消) |
PlayerOpenContainerEvent | 玩家打开容器(箱子/熔炉等) |
PlayerCloseContainerEvent | 玩家关闭容器 |
PlayerSleepEvent | 玩家睡觉 |
PlayerWakeUpEvent | 玩家起床 |
世界/方块/实体事件
| 事件类 | 触发时机 |
|---|---|
WorldLoadEvent | 世界加载完成 |
WorldUnloadEvent | 世界卸载 |
WorldTickEvent | 世界每tick执行 |
WorldSaveEvent | 世界保存 |
BlockUpdateEvent | 方块更新(邻居变化) |
BlockRedstoneEvent | 红石信号变化 |
BlockGrowEvent | 方块生长(作物/树苗)(可取消) |
BlockFormEvent | 方块自然形成(冰/雪/石头) |
BlockSpreadEvent | 方块蔓延(火/草/藤蔓) |
BlockFadeEvent | 方块消失(冰融化/雪融化) |
LeavesDecayEvent | 树叶腐烂(可取消) |
LiquidFlowEvent | 液体流动(可取消) |
PistonEvent | 活塞推拉(可取消) |
ExplosionEvent | 爆炸发生(可取消) |
EntitySpawnEvent | 实体生成(可取消) |
EntityDeathEvent | 实体死亡 |
EntityDamageEvent | 实体受伤(可取消) |
EntityTameEvent | 实体被驯服 |
EntityBreedEvent | 实体繁殖 |
EntityExplodeEvent | 实体爆炸(苦力怕/TNT等) |
ItemSpawnEvent | 掉落物生成 |
ItemDespawnEvent | 掉落物消失 |
ProjectileHitEvent | 弹射物命中(箭/火球/三叉戟) |
ProjectileLaunchEvent | 弹射物发射(可取消) |
游戏生命周期事件
| 事件类 | 触发时机 |
|---|---|
GameStartEvent | 游戏启动完成,主菜单显示 |
GameStopEvent | 游戏关闭 |
ServerStartEvent | 内置服务器启动(单人/联机) |
ServerStopEvent | 服务器关闭 |
ServerTickEvent | 服务器每tick执行 |
ReloadEvent | 数据包/资源包重载 |
ModLoadEvent | 所有模组加载完成 |
可取消事件
标注"(可取消)"的事件,你可以调用 event.setCanceled(true) 阻止原事件发生:
import com.smalo.api.event.PlayerChatEvent;
EventBus.subscribe(PlayerChatEvent.class, event -> {
String msg = event.getMessage();
if (msg.contains("脏话")) {
event.setCanceled(true); // 拦截消息,不让发出去
PlayerHelper.sendMessage(event.getPlayer(), "§c不许说脏话!");
}
});
📦 核心:注册系统 com.smalo.api.registry
必须 往游戏里添加新物品、新方块、新实体、新配方等都用注册系统。
| 类 | 功能 |
|---|---|
ItemRegistry | 注册新物品 |
BlockRegistry | 注册新方块 |
EntityRegistry | 注册新实体/生物 |
RecipeRegistry | 注册合成配方 |
EnchantmentRegistry | 注册新附魔 |
PotionRegistry | 注册新药水效果 |
PotionTypeRegistry | 注册新药水瓶类型 |
SoundRegistry | 注册新声音 |
GuiRegistry | 注册新GUI界面 |
ContainerRegistry | 注册新容器类型 |
CommandRegistry | 注册新指令 |
ParticleRegistry | 注册新粒子效果 |
BiomeRegistry | 注册新生物群系 |
DimensionRegistry | 注册新维度 |
StructureRegistry | 注册新结构(地牢/城堡等) |
LootTableRegistry | 注册新战利品表 |
AdvancementRegistry | 注册新进度/成就 |
StatRegistry | 注册新统计数据 |
VillagerProfessionRegistry | 注册新村民职业 |
MenuRegistry | 注册新菜单 |
示例:注册一个新物品
import com.smalo.api.registry.ItemRegistry;
import com.smalo.api.item.SmaloItem;
import com.smalo.api.item.ItemSettings;
// 在 onInitialize() 里:
ItemRegistry.register("ruby", () -> new SmaloItem(
new ItemSettings()
.maxCount(64) // 最大堆叠64
.maxDamage(0) // 无耐久(工具/武器设耐久)
.fireproof(false) // 不是抗火的
))
.setName("§c红宝石") // 显示名字
.setTexture("ruby.png") // 贴图(放resources/assets/modid/textures/item/)
.setTooltip("§7闪耀的红色宝石") // 鼠标悬停提示
.setCreativeTab(CreativeTab.MATERIALS); // 创造模式物品栏分类
📝 核心:日志 com.smalo.api.util.Logger
必须 在控制台打印日志,方便调试模组。
import com.smalo.api.util.Logger;
// 在代码任何地方调用:
Logger.info("普通信息"); // 白色信息日志
Logger.debug("调试信息"); // 灰色调试日志(生产环境不显示)
Logger.warn("警告信息"); // 黄色警告
Logger.error("错误信息"); // 红色错误
Logger.error("发生异常", exception); // 带异常栈的错误
debug日志自动不显示。
🔌 核心:模组入口
@SmaloMod 注解(可选)
在入口类上加注解可以声明模组信息,会覆盖smalo.mod.json里的部分内容:
import com.smalo.api.SmaloMod;
@SmaloMod(
modId = "my-mod",
name = "我的模组",
version = "1.0.0"
)
public class MyModMain {
public void onInitialize() {
// ...
}
}
ModContainer
获取当前模组的信息、资源路径等:
import com.smalo.api.ModContainer;
import com.smalo.api.SmaloLoader;
ModContainer mod = SmaloLoader.getMod("my-mod");
String modId = mod.getModId();
String version = mod.getVersion();
Path configDir = mod.getConfigDir(); // 模组配置文件夹
Path dataDir = mod.getDataDir(); // 模组数据文件夹
👤 常用:玩家操作 com.smalo.api.player
常用 对玩家进行各种操作:发消息、传送、给物品、修改属性等。
PlayerHelper 静态方法(最常用)
| 方法 | 功能 |
|---|---|
sendMessage(player, message) | 给玩家发聊天消息 |
sendTitle(player, title, subtitle, fadeIn, stay, fadeOut) | 发屏幕大标题 |
sendActionBar(player, message) | 发物品栏上方小字 |
sendBossBar(player, id, text, color, style, progress) | 发Boss条消息 |
teleport(player, x, y, z) | 传送到坐标 |
teleport(player, dimension, x, y, z, yaw, pitch) | 跨维度传送 |
giveItem(player, itemStack) | 给玩家物品(背包满了掉地上) |
giveItem(player, item, count) | 给玩家指定数量物品 |
clearInventory(player) | 清空背包 |
clearItem(player, item) | 清除指定物品 |
setHealth(player, health) | 设置血量(0~20) |
setFoodLevel(player, level) | 设置饥饿值(0~20) |
setSaturation(player, saturation) | 设置饱和度 |
setExpLevel(player, level) | 设置经验等级 |
setExpProgress(player, progress) | 设置经验进度(0.0~1.0) |
giveExp(player, amount) | 给经验值 |
giveExpLevels(player, levels) | 给经验等级 |
setGameMode(player, gameMode) | 设置游戏模式(SURVIVAL/CREATIVE/ADVENTURE/SPECTATOR) |
setFlying(player, flying) | 设置是否飞行 |
setAllowFlight(player, allow) | 设置是否允许飞行 |
setInvulnerable(player, invulnerable, ticks) | 设置无敌时间(tick) |
playSound(player, sound, volume, pitch) | 给玩家播放声音 |
spawnParticle(player, particle, x, y, z, count, offsetX, offsetY, offsetZ, speed) | 生成粒子特效 |
closeContainer(player) | 关闭当前打开的界面 |
openGui(player, gui) | 打开自定义GUI |
kick(player, reason) | 踢出玩家 |
ban(player, reason) | 封禁玩家 |
getOnlinePlayers() | 获取所有在线玩家列表 |
getPlayerByName(name) | 通过名字获取玩家 |
getPlayerByUuid(uuid) | 通过UUID获取玩家 |
getLookingAtBlock(player, maxDistance) | 获取玩家视线看的方块 |
getLookingAtEntity(player, maxDistance) | 获取玩家视线看的实体 |
PlayerHelper 示例
import com.smalo.api.player.PlayerHelper;
import static com.smalo.api.util.ChatColor.*;
// 给玩家发标题
PlayerHelper.sendTitle(player,
GOLD + BOLD + "欢迎", // 大标题
GREEN + "进入服务器", // 副标题
10, 70, 10); // 淡入10tick,停留70tick,淡出10tick
// 传送到主城
PlayerHelper.teleport(player, 0, 64, 0);
// 给玩家64个钻石
PlayerHelper.giveItem(player, Items.DIAMOND, 64);
// 粒子特效:在玩家位置生成本地粒子
PlayerHelper.spawnParticle(player,
ParticleTypes.HEART,
player.getX(), player.getY() + 2, player.getZ(),
10, 0.5, 0.5, 0.5, 0.1);
🌍 常用:世界操作 com.smalo.api.world
常用 修改世界、放置/破坏方块、获取方块信息等。
| 类 | 功能 |
|---|---|
WorldHelper | 世界操作工具类(放方块、炸方块、获取方块) |
BlockPos | 方块坐标(x,y,z) |
BlockState | 方块状态(类型+朝向+属性等) |
WorldEdit | 类似WorldEdit的批量编辑(填充/复制/粘贴/替换) |
ChunkHelper | 区块操作(强制加载/保存区块) |
BiomeAPI | 生物群系查询/修改 |
DimensionAPI | 维度操作(传送到其他维度、获取维度信息) |
ExplosionAPI | 创建爆炸 |
StructureGen | 在指定位置生成结构 |
LightAPI | 操作方块光照等级 |
WeatherAPI | 天气控制(下雨/打雷/晴天) |
TimeAPI | 时间控制(设置时间为白天/夜晚) |
DifficultyAPI | 难度设置(和平/简单/普通/困难) |
GameRuleAPI | 游戏规则修改(keepInventory等) |
SpawnHelper | 出生点操作 |
WorldBorderAPI | 世界边界控制 |
WorldHelper 示例
import com.smalo.api.world.WorldHelper;
import com.smalo.api.world.BlockPos;
import com.smalo.api.world.BlockState;
// 在玩家位置放一个钻石块
BlockPos pos = new BlockPos(player.getBlockX(), player.getBlockY() - 1, player.getBlockZ());
WorldHelper.setBlock(player.world, pos, Blocks.DIAMOND_BLOCK);
// 获取某位置的方块
BlockState state = WorldHelper.getBlock(player.world, pos);
if (state.is(Blocks.DIAMOND_BLOCK)) {
player.sendMessage("§a你站在钻石块上!");
}
// 用WorldEdit填充区域
WorldEdit.fill(player.world,
new BlockPos(0, 60, 0), // 起点
new BlockPos(10, 70, 10), // 终点
Blocks.GOLD_BLOCK); // 填充金块
💎 常用:物品操作 com.smalo.api.item
常用 创建物品、修改NBT、操作背包等。
| 类 | 功能 |
|---|---|
ItemHelper | 物品工具类(创建物品、判断物品、比较物品) |
ItemStack | 物品堆对象(物品类型+数量+NBT) |
ItemBuilder | 链式构建物品(推荐) |
NBTUtil | NBT数据读写工具类 |
EnchantmentHelper | 附魔操作(给物品加附魔、查附魔) |
InventoryUtil | 背包工具类(查找物品、移动物品、统计物品数量) |
PotionUtil | 药水操作 |
FireworkBuilder | 构建烟花 |
BookBuilder | 构建成书(有文字内容) |
HeadBuilder | 构建玩家头颅 |
BannerBuilder | 构建旗帜(带图案) |
AttributeHelper | 物品属性修改(攻击伤害/速度/护甲) |
FoodComponent | 食物组件(设置饥饿值/饱和度/效果) |
ArmorMaterial | 护甲材质接口 |
ToolMaterial | 工具材质接口 |
ItemBuilder 链式创建物品示例
import com.smalo.api.item.ItemBuilder;
import com.smalo.api.item.EnchantmentHelper;
import static com.smalo.api.util.ChatColor.*;
// 链式创建一把神剑
ItemStack godSword = new ItemBuilder(Items.DIAMOND_SWORD)
.setName(RED + BOLD + "神剑·灭世") // 自定义名字
.addLore(GRAY + "传说中的武器") // 第一行介绍
.addLore(GOLD + "攻击力: +100") // 第二行介绍
.addEnchantment(Enchantments.SHARPNESS, 10) // 锋利10
.addEnchantment(Enchantments.FIRE_ASPECT, 5) // 火焰附加5
.addEnchantment(Enchantments.UNBREAKING, 10) // 耐久10
.addEnchantment(Enchantments.MENDING, 1) // 经验修补
.setUnbreakable(true) // 无法破坏
.setAttackDamage(100) // 攻击力100
.glow() // 附魔发光效果
.build();
// 给玩家
PlayerHelper.giveItem(player, godSword);
🐷 常用:实体/生物 com.smalo.api.entity
常用 生成实体、修改AI、操作生物属性。
| 类 | 功能 |
|---|---|
EntityHelper | 实体工具类(生成、传送、杀怪、获取实体) |
LivingEntity | 生物实体基类(有血量的实体) |
MobHelper | 怪物工具类(设置目标、设置属性、装备) |
EntityAI | 修改实体AI(添加/移除AI目标) |
EntityAttribute | 实体属性修改(最大血量、移动速度、攻击伤害、跟随范围) |
ProjectileHelper | 弹射物工具(发射箭/火球/三叉戟) |
VillagerHelper | 村民交易操作 |
AnimalHelper | 动物相关(喂养、繁殖、变种) |
HorseHelper | 马相关(驯化、装备、属性) |
ArmorStandHelper | 盔甲架操作(姿势、装备、隐形) |
ItemFrameHelper | 物品展示框操作 |
PaintingHelper | 画操作 |
EntityEquipment | 实体装备(头盔/胸甲/护腿/靴子/主手/副手) |
EffectHelper | 给实体加药水效果 |
NameTagHelper | 实体命名牌操作 |
EntityMount | 实体骑乘操作 |
EntityTracker | 实体追踪器(追踪实体位置变化) |
EntityHelper 示例:在玩家位置生成一只僵尸
import com.smalo.api.entity.EntityHelper;
import com.smalo.api.entity.EntityAttribute;
import com.smalo.api.entity.EntityEquipment;
import com.smalo.api.item.ItemStack;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.Items;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.effect.MobEffectInstance;
// 在玩家前方3格生成一只BOSS级僵尸
LivingEntity zombie = EntityHelper.spawn(
player.world,
EntityType.ZOMBIE,
player.getX() + 3, player.getY(), player.getZ()
);
// 设置名字和属性
EntityHelper.setCustomName(zombie, "§c§l僵尸王");
EntityHelper.setCustomNameVisible(zombie, true);
EntityAttribute.setMaxHealth(zombie, 200); // 200血
EntityAttribute.setHealth(zombie, 200);
EntityAttribute.setAttackDamage(zombie, 15); // 攻击15
EntityAttribute.setMovementSpeed(zombie, 0.35); // 移速加快
EntityHelper.setBaby(zombie, false);
// 给僵尸穿装备
EntityEquipment.setHelmet(zombie, new ItemStack(Items.DIAMOND_HELMET));
EntityEquipment.setChestplate(zombie, new ItemStack(Items.DIAMOND_CHESTPLATE));
EntityEquipment.setLeggings(zombie, new ItemStack(Items.DIAMOND_LEGGINGS));
EntityEquipment.setBoots(zombie, new ItemStack(Items.DIAMOND_BOOTS));
EntityEquipment.setMainHand(zombie, new ItemStack(Items.DIAMOND_SWORD));
// 给僵尸加力量效果
zombie.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 999999, 2));
💬 常用:聊天/消息 com.smalo.api.chat
常用 构建彩色消息、发送标题、ActionBar、Boss条等。
| 类 | 功能 |
|---|---|
ChatMessage | 聊天消息组件 |
TextComponent | 文字组件(支持颜色、点击事件、悬停事件) |
TranslatableComponent | 可翻译文字组件 |
TitleBuilder | 构建屏幕大标题 |
ActionBar | 发送ActionBar消息 |
BossBarAPI | 创建/更新Boss条 |
BossBarBuilder | Boss条链式构建 |
ChatColor | 颜色代码常量类 |
ClickEvent | 点击事件(执行指令/打开URL/复制文字/建议指令) |
HoverEvent | 悬停事件(显示文字/显示物品/显示实体信息) |
BookPageBuilder | 构建成书页面 |
JsonMessage | JSON格式消息构建(旧版兼容) |
ClickEvent示例:可点击的消息
import com.smalo.api.chat.TextComponent;
import static com.smalo.api.util.ChatColor.*;
TextComponent message = new TextComponent(GOLD + "[传送]" + GREEN + "点击传送到主城 ");
TextComponent clickHere = new TextComponent(AQUA + BOLD + "[点我]");
clickHere.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/spawn"));
clickHere.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
new TextComponent(GRAY + "点击立即传送到主城")));
message.addExtra(clickHere);
PlayerHelper.sendMessage(player, message);
⚙️ 常用:配置/存档 com.smalo.api.config
常用 保存模组配置、玩家数据、世界数据,重启不丢失。
| 类 | 功能 |
|---|---|
ConfigFile | JSON配置文件(自动保存/自动加载/默认值) |
ConfigManager | 配置管理器(统一管理多个配置文件) |
JsonConfig | 通用JSON配置读写 |
YamlConfig | YAML配置读写 |
TOMLConfig | TOML配置读写 |
DataStorage | 世界/玩家持久化NBT数据 |
PersistentData | 实体/方块持久化数据存储 |
PlayerDataManager | 玩家数据管理(每个玩家独立数据) |
WorldDataManager | 世界数据管理 |
SqlStorage | SQLite数据库存储(大量数据用) |
ConfigFile 示例
import com.smalo.api.config.ConfigFile;
import com.smalo.api.SmaloLoader;
import java.nio.file.Path;
// 获取模组配置目录,自动创建config文件
Path configPath = SmaloLoader.getMod("my-mod").getConfigDir().resolve("config.json");
ConfigFile config = new ConfigFile(configPath);
// 设置默认值(如果文件里没有这个键,就用默认值)
config.setDefault("welcome-message", "§a欢迎来到服务器!");
config.setDefault("teleport-cooldown", 30);
config.setDefault("enable-pvp", true);
// 读取配置
String welcomeMsg = config.getString("welcome-message");
int cooldown = config.getInt("teleport-cooldown");
boolean pvpEnabled = config.getBoolean("enable-pvp");
// 修改配置并保存
config.set("teleport-cooldown", 60);
config.save(); // 写入文件
PlayerDataManager 示例:存玩家金币
import com.smalo.api.config.PlayerDataManager;
PlayerDataManager pdb = new PlayerDataManager("my-mod", "player_data");
// 玩家登录时,初始化数据(默认0金币)
EventBus.subscribe(PlayerLoginEvent.class, event -> {
var player = event.getPlayer();
pdb.initData(player, data -> {
data.setDefault("coins", 0);
data.setDefault("kills", 0);
data.setDefault("deaths", 0);
});
});
// 给玩家加金币
int coins = pdb.get(player).getInt("coins");
pdb.get(player).set("coins", coins + 100);
pdb.get(player).save();
// 查询玩家击杀数
int kills = pdb.get(player).getInt("kills");
🌐 常用:网络通信 com.smalo.api.network
常用 客户端-服务器通信,自定义网络包(比如GUI点击、技能释放)。
| 类 | 功能 |
|---|---|
NetworkHandler | 网络通道注册 |
SimpleChannel | 简单网络通道(推荐用这个) |
PacketBuffer | 包数据读写(字符串/数字/坐标/NBT/物品) |
PacketContext | 包上下文(获取发送玩家、回复包) |
⏱️ 常用:任务调度 com.smalo.api.task
常用 延时执行任务、重复执行任务、异步任务(不卡主线程)。
| 类 | 功能 |
|---|---|
TaskScheduler | 任务调度器 |
AsyncTask | 异步任务(在其他线程执行,不卡主线程) |
TickTask | 每tick执行的任务 |
DelayedTask | 延时任务 |
RepeatingTask | 重复任务 |
ThreadPool | 线程池(大量异步任务用) |
示例
import com.smalo.api.task.TaskScheduler;
// 延时5秒(100tick)后执行
TaskScheduler.scheduleDelayed(() -> {
PlayerHelper.sendMessage(player, "§e5秒到了!");
}, 100);
// 每隔1秒(20tick)重复执行
TaskScheduler.scheduleRepeating(() -> {
PlayerHelper.sendMessage(player, "§e每秒弹一次消息");
}, 0, 20);
// 异步执行IO操作(不卡游戏主线程)
AsyncTask.runAsync(() -> {
// 这里执行耗时操作:HTTP请求、文件读写、数据库查询
String result = httpClient.get("https://api.example.com/data");
// 异步操作完成后,回到主线程操作游戏
TaskScheduler.scheduleDelayed(() -> {
PlayerHelper.sendMessage(player, "§a数据加载完成:" + result);
}, 0);
});
🛠️ 常用:工具类 com.smalo.api.util
常用 各种方便的小工具。
🎨 高级:渲染/UI com.smalo.api.render
可选 在屏幕上画东西、自定义GUI界面、粒子特效。客户端模组常用。
| 类 | 功能 |
|---|---|
HudRenderer | HUD渲染(在游戏屏幕上画文字/图片/血条等) |
ScreenBuilder | 自定义GUI界面(容器界面) |
ScreenHelper | GUI工具类 |
ParticleBuilder | 粒子特效链式构建 |
RenderHelper | GL渲染工具类(画方块/模型/线条/图形) |
FontRenderer | 字体渲染 |
TextureUtil | 贴图加载/绑定 |
GlStateManager | OpenGL状态管理 |
Tessellator | 顶点缓冲绘制(底层) |
BufferBuilder | 顶点构建器 |
ModelHelper | 模型渲染辅助 |
CameraHelper | 摄像机操作(视角控制) |
ShaderHelper | 着色器加载/使用 |
ToastHelper | 右上角弹出提示(类似成就提示) |
OverlayRenderer | 全屏覆盖层渲染 |
WorldRenderer | 世界中渲染(方块高亮、范围显示、路径画线) |
⌨️ 高级:指令系统 com.smalo.api.command
可选 注册自定义指令(如 /spawn /home /tpa 等)。
import com.smalo.api.command.*;
import static com.smalo.api.command.Commands.*;
CommandRegistry.register("heal", "治疗自己", (ctx) -> {
Player player = ctx.getPlayer();
player.setHealth(20);
player.getFoodData().setFoodLevel(20);
PlayerHelper.sendMessage(player, "§a你已经被治疗!");
return 1;
})
.requires(src -> src.hasPermission("mymod.heal")) // 需要权限
.then(argument("玩家", PlayerArgument.player()) // 可以带参数:/heal 玩家名
.executes(ctx -> {
Player target = PlayerArgument.getPlayer(ctx, "玩家");
target.setHealth(20);
PlayerHelper.sendMessage(target, "§a你被管理员治疗了!");
PlayerHelper.sendMessage(ctx.getPlayer(), "§a已治疗 " + target.getName().getString());
return 1;
})
);
🔊 高级:声音系统 com.smalo.api.sound
注册自定义声音、播放声音。SoundRegistry注册自定义声音事件,PlayerHelper.playSound()播放声音。
✨ 高级:附魔系统 com.smalo.api.enchantment
注册自定义附魔效果。
🧪 高级:药水效果 com.smalo.api.potion
注册自定义药水效果。
💰 高级:经济系统 com.smalo.api.economy
提供统一经济接口,兼容Vault等经济插件。EconomyAPI.deposit(player, amount)存钱、EconomyAPI.withdraw(player, amount)取钱、EconomyAPI.getBalance(player)查余额。
🔑 高级:权限系统 com.smalo.api.permission
权限检查,PermissionAPI.hasPermission(player, "mymod.admin")。
💬 高级:浮空字 com.smalo.api.hologram
创建/更新/删除浮空字(盔甲架实现)。
📊 高级:计分板 com.smalo.api.scoreboard
创建侧边栏计分板、队伍计分板。
🧠 高级:实体AI com.smalo.api.ai
自定义实体AI目标、路径导航。PathfinderGoal自定义路径目标。
🏷️ 高级:NBT数据 com.smalo.api.nbt
直接读写NBT标签(物品NBT、方块实体NBT、实体NBT)。
🌍 高级:HTTP请求 com.smalo.api.http
HTTP客户端,GET/POST/PUT/DELETE请求,异步执行。必须用AsyncTask.runAsync()包裹,不能在主线程调用。
🔌 高级:WebSocket com.smalo.api.websocket
WebSocket客户端连接,双向实时通信。
🌲 高级:生物群系 com.smalo.api.biome
自定义生物群系,修改群系属性(温度、湿度、生成生物、植被)。
🌀 高级:维度 com.smalo.api.dimension
注册自定义维度(类似下界、末地)。
💾 高级:数据处理 com.smalo.api.data
包含以下子包:
com.smalo.api.data.cache- 缓存系统com.smalo.api.data.encrypt- 加密解密com.smalo.api.data.search- 搜索引擎com.smalo.api.data.sort- 排序算法com.smalo.api.data.filter- 过滤器链com.smalo.api.data.index- 索引系统com.smalo.api.data.parser- 解析器(AST解析)com.smalo.api.data.etl- ETL数据抽取转换加载com.smalo.api.data.batch- 批量任务处理
🛡️ 高级:安全沙箱 com.smalo.api.guard
注意:这些类是SMALO内部安全组件,模组开发者一般不需要直接使用:
ModSandboxManager- 模组沙箱隔离(限制模组文件访问/网络访问)ModSigningManager- 模组签名验证ApiQuotaManager- API调用配额管理
🧬 底层:Mixin字节码注入 com.smalo.api.mixin
进阶 直接修改原版Minecraft代码,实现Forge/Fabric的Mixin功能。这是最高级的功能,普通模组不需要用。
⚙️ 底层:Instrumentation com.smalo.api.instrumentation
Java Instrumentation API,SMALO内部使用,模组开发者一般不用。
📂 底层:类加载器 com.smalo.api.classloader
JoinClassLoader类隔离加载器,SMALO内部使用,模组开发者一般不用。
⚙️ 扩展:机械/方块 block_* 包
519包中包含大量工业/机械类方块预定义API:
🗡️ 扩展:装备/物品 item_* 包
🏗️ 扩展:建筑系统 build_* 包
🍕 扩展:食物/烹饪 food_* 包
🧬 扩展:生物系统 bio_* 包
高级生物/医学/基因系统:
✨ 扩展:魔法系统 magic_* 包
⚗️ 扩展:化学系统 chem_* 包
🌪️ 扩展:自然灾害/天气/地质
🖥️ 扩展:UI/信息显示 info_* 包
🐺 扩展:实体行为 entity_* 包
🥚 刷怪蛋(Spawn Egg) com.smalo.api.entity.spawn
常用 刷怪蛋是 SMALO 加载器内置的跨版本功能,无需安装任何模组即可在十个 Minecraft 版本中使用。玩家手持刷怪蛋右键地面可生成生物,右键已有生物可将其变异转换。
| 类 | 功能 |
|---|---|
SpawnEggRegistry | 刷怪蛋注册表(注册自定义蛋、获取内置蛋、查询蛋信息) |
SpawnEggItem | 刷怪蛋物品对象(绑定生物类型、显示名、贴图) |
EntityTypeMapping | 跨版本生物类型映射(统一生物名 → 各版本真实注册名) |
SpawnEggConversionHandler | 变异转换处理器(右键生物时触发类型转换) |
SpawnEggUseHandler | 使用处理器(右键地面生成生物、消耗耐久) |
SpawnEggInventoryBuilder | 创造模式物品栏构建器(自动注入内置蛋) |
功能一览
| 操作 | 效果 | 说明 |
|---|---|---|
| 右键地面 | 生成生物 | 在目标方块上方生成刷怪蛋绑定的生物,生存模式消耗 1 个蛋 |
| 右键生物 | 变异转换 | 将目标生物转换为刷怪蛋绑定的生物(如僵尸→尸壳),保留可迁移 NBT |
| 创造模式物品栏 | 获取刷怪蛋 | 打开物品栏搜索即可获取,不消耗 |
内置刷怪蛋列表(60 种)
SMALO 内置刷怪蛋覆盖原版未提供或行为不一致的生物,按类别分组:
- 友好生物:牛、羊、猪、鸡、兔、猫、狼、马、驴、骡、羊驼、狐狸、蜜蜂、海龟、熊猫、鹦鹉、村民
- 敌对生物:僵尸、骷髅、苦力怕、蜘蛛、末影人、末影螨、蠹虫、烈焰人、恶魂、岩浆怪、史莱姆、女巫、守卫者、远古守卫者、凋零骷髅、流浪者、尸壳、僵尸村民、掠夺者、劫兽、唤魔者、恼鬼
- 水生生物:鱿鱼、海豚、鳕鱼、鲑鱼、河豚、热带鱼、海葵、水下守卫者
- 特殊生物:铁傀儡、雪傀儡、凋灵、末影龙、僵尸马、骷髅马、骆驼、嗅探兽、青蛙、蝌蚪、悦灵、全息投影
跨版本生物映射
SMALO 统一生物名(如 smalo:zombie)到各版本真实注册名的映射按版本分三档:
| 版本档位 | 覆盖版本 | 映射策略 |
|---|---|---|
| 古老版 | 1.7.10, 1.12.2 | 原版刷怪蛋覆盖不全,SMALO 内置蛋补齐缺失生物 |
| 中间版 | 1.16.5 ~ 1.21.1 | 原版已有刷怪蛋,SMALO 统一行为一致性 |
| 现代版 | 26.1.2, 26.2 | DataComponent 重构后适配新 API |
变异转换示例
| 原生物 | 目标生物 | 条件 |
|---|---|---|
| 僵尸 | 尸壳 | 1.10+ 版本支持 |
| 僵尸 | 僵尸村民 | 所有版本 |
| 村民 | 僵尸村民 | 所有版本 |
| 骷髅 | 凋零骷髅 | 1.10+ 版本支持 |
| 骷髅 | 流浪者 | 1.10+ 版本支持 |
| 鲑鱼 | 河豚 | 1.13+ 版本支持 |
不支持变异时:退化为"在生物旁生成新生物"或拒绝操作,不会静默失败。
生成失败诊断
当刷怪蛋生成失败时,SMALO 输出结构化错误码,不会静默吞掉:
[SpawnEgg] 生成失败: ErrorCode=ENTITY_TYPE_NOT_FOUND
生物: smalo:warden
版本: 1.16.5
根因: 该版本不存在监守者生物
建议: 使用 1.19+ 版本
在游戏中使用
- 进入创造模式(或使用
/gamemode creative) - 打开物品栏(按
E键) - 搜索栏输入生物名(如
zombie)即可找到对应刷怪蛋 - 将刷怪蛋放入快捷栏,右键地面生成生物
- 右键已有生物可触发变异转换
开发者 API
模组开发者可通过 SmartAPI 注册自定义刷怪蛋:
import com.smalo.api.entity.spawn.SpawnEggRegistry;
import com.smalo.api.entity.spawn.SpawnEggItem;
import com.smalo.api.entity.spawn.EntityTypeMapping;
import java.util.List;
// 注册自定义刷怪蛋
SpawnEggRegistry.register("mymod:custom_mob",
"自定义生物蛋",
EntityTypeMapping.map("mymod:custom_mob"));
// 获取所有内置刷怪蛋
List<SpawnEggItem> eggs = SpawnEggRegistry.getBuiltinEggs();
📦 编译打包(在软件内完成)
操作步骤:
- 打开SMALO启动器
- 点击左侧导航栏的「上传」按钮
- 在SmartAPI单文件开发区域,点击选择你的
MyModMain.java文件 - 选择目标Minecraft版本
- 点击「编译打包」按钮
- 软件自动完成:
- ✅ JDK环境检测(没装会提示你安装)
- ✅ 自动带上 smalo-api.jar + smartapi-core.jar 到classpath
- ✅ 自动解析
@SmartMod注解读取模组信息 - ✅ javac编译 + jar打包
- ✅ 自动复制到所有版本的mods文件夹
- ✅ 显示完整编译日志,出错直接告诉你哪行错了
- 编译成功后,重启游戏就能在模组列表看到你的模组
手动编译(高级用户参考)
如果你熟悉Java开发,也可以手动用命令行编译:
# 编译(确保smalo-api.jar和smartapi-core.jar在classpath)
javac -encoding UTF-8 -cp "path/to/smalo-api.jar;path/to/smartapi-core.jar" -d build/classes src/main/java/com/example/mymod/*.java
# 打包成JAR(确保smalo.mod.json在根目录)
cd build/classes
jar cf ../../my-mod.jar .
cd ../../my-mod
jar uf ../my-mod.jar smalo.mod.json
# 把成品JAR复制到mods文件夹(版本隔离目录下的mods文件夹)
copy my-mod.jar "%USERPROFILE%\Desktop\SMALO\versions\{版本名}-SMALO\mods\"
🚀 发布模组
打包好的 .jar 文件就是成品模组,可以直接分享给别人:
- 别人拿到JAR文件后,丢进 SMALO启动器的 mods 文件夹
- 启动SMALO启动器,就能在模组列表看到你的模组
- 启动游戏自动加载
❓ 常见问题
Q:我不会写Java怎么办?
声明式JSON模组完全不用写Java,只写JSON配置就能加物品/方块/配方。后续会出专门的JSON模组教程。Java模组从简单的事件监听开始学,复制例子改改就能用。
Q:编译报错"找不到符号"怎么办?
检查import语句是不是写错了,类名/包名有没有拼错。使用软件内置编译器会自动处理classpath依赖,不需要手动配置。
Q:模组加载了但功能不生效?
- 检查入口类在
smalo.mod.json的entryClass有没有写对(包含完整包名) - 检查事件是不是订阅对了,lambda有没有写错
- 看游戏日志有没有报错信息,用
Logger.info()在关键位置打日志调试
Q:怎么让模组兼容Forge/Fabric的模组?
SMALO已经内置了Forge/Fabric兼容层,大部分现成的Forge/Fabric模组JAR直接丢进mods文件夹就能用,不用你做任何修改。你自己开发的模组如果用了Forge注解,SMALO也能识别加载。
Q:客户端模组和服务器模组怎么区分?
SMALO默认自动处理:只在客户端有效的类(渲染、GUI、声音)在客户端加载,服务器逻辑在服务器加载。你只需要正常写代码,不用手动区分。
Q:500多个包我都要学吗?
不用!90%的普通模组只用核心包+常用包(事件、注册、玩家、物品、世界、配置、任务)就够了。其他扩展包需要的时候再查文档就行,不用背。