🚀 快速开始:3步开发模组

前置要求:安装 JDK 8 或更高版本,配置好 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 ← 模组入口代码(在这里写逻辑)
提示:不需要使用任何外部bat脚本,所有编译打包都在SMALO软件内完成,自动处理依赖、路径、权限问题。

📄 主配置: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链式构建物品(推荐)
NBTUtilNBT数据读写工具类
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条
BossBarBuilderBoss条链式构建
ChatColor颜色代码常量类
ClickEvent点击事件(执行指令/打开URL/复制文字/建议指令)
HoverEvent悬停事件(显示文字/显示物品/显示实体信息)
BookPageBuilder构建成书页面
JsonMessageJSON格式消息构建(旧版兼容)

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

常用 保存模组配置、玩家数据、世界数据,重启不丢失。

功能
ConfigFileJSON配置文件(自动保存/自动加载/默认值)
ConfigManager配置管理器(统一管理多个配置文件)
JsonConfig通用JSON配置读写
YamlConfigYAML配置读写
TOMLConfigTOML配置读写
DataStorage世界/玩家持久化NBT数据
PersistentData实体/方块持久化数据存储
PlayerDataManager玩家数据管理(每个玩家独立数据)
WorldDataManager世界数据管理
SqlStorageSQLite数据库存储(大量数据用)

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

常用 各种方便的小工具。

功能
Logger日志(前面讲过了)
MathUtil数学工具(随机数、向量运算、距离计算、角度计算)
RandomUtil增强随机数(随机整数/浮点数/布尔/从列表随机选)
TimeUtil时间工具(游戏时间↔现实时间、格式化时间、倒计时)
StringUtil字符串工具(判空、截断、中文判断、颜色代码处理)
FileUtil文件读写工具(读文本/写文本/复制/删除/遍历)
ImageUtil图片操作
Location坐标+朝向封装
Vector3d3D向量
Pair两个值的配对
Triple三个值的组合
ChatColor颜色代码常量
EnumUtil枚举工具
ReflectionUtil反射工具(访问私有字段/方法)
VersionUtil版本比较工具
PermissionUtil权限检查工具
ItemUtil物品工具(同item包)
BlockUtil方块工具
EntityUtil实体工具
NMSUtilNMS/CraftBukkit反射工具
MetricsbStats统计(可选)
UpdateChecker模组更新检查
JsonUtilJSON序列化/反序列化
SerializationUtil对象序列化

🎨 高级:渲染/UI com.smalo.api.render

可选 在屏幕上画东西、自定义GUI界面、粒子特效。客户端模组常用。

功能
HudRendererHUD渲染(在游戏屏幕上画文字/图片/血条等)
ScreenBuilder自定义GUI界面(容器界面)
ScreenHelperGUI工具类
ParticleBuilder粒子特效链式构建
RenderHelperGL渲染工具类(画方块/模型/线条/图形)
FontRenderer字体渲染
TextureUtil贴图加载/绑定
GlStateManagerOpenGL状态管理
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功能。这是最高级的功能,普通模组不需要用。

注意:Mixin直接修改原版字节码,写错了会直接崩游戏。普通功能请用事件系统,不要滥用Mixin。

⚙️ 底层:Instrumentation com.smalo.api.instrumentation

Java Instrumentation API,SMALO内部使用,模组开发者一般不用。

📂 底层:类加载器 com.smalo.api.classloader

JoinClassLoader类隔离加载器,SMALO内部使用,模组开发者一般不用。

⚙️ 扩展:机械/方块 block_* 包

519包中包含大量工业/机械类方块预定义API:

com.smalo.api.block_energy
能量系统(RF/FE能源)、能量端口
com.smalo.api.block_fluid
流体管道、流体储罐、流体端口
com.smalo.api.block_pipe
物品管道网络、管道路由
com.smalo.api.block_generator
发电机、燃料类型
com.smalo.api.block_solar
太阳能板
com.smalo.api.block_wind
风力发电机
com.smalo.api.block_hydro
水力发电
com.smalo.api.block_pump
流体泵
com.smalo.api.block_quarry
采石场/自动挖矿机
com.smalo.api.block_farm
自动农场、作物播种机
com.smalo.api.block_sorter
物品分类机、排序规则
com.smalo.api.block_washer
洗矿机、洗矿配方
com.smalo.api.block_press
压床、模具
com.smalo.api.block_logic
逻辑门(红石逻辑扩展)
com.smalo.api.block_planter
种植机

🗡️ 扩展:装备/物品 item_* 包

com.smalo.api.item_relic
遗物套装、遗物能力、套装效果
com.smalo.api.item_wing
翅膀/飞行器、飞行模式
com.smalo.api.item_bomb
炸弹、引信、爆炸效果
com.smalo.api.item_gun
枪械系统、子弹类型(有item_bullet)
com.smalo.api.item_amulet
护身符、护符等级、护身符效果
com.smalo.api.item_ring
戒指、戒指附魔、戒指效果
com.smalo.api.item_charm
饰品槽、饰品效果
com.smalo.api.item_belt
腰带、腰带槽、腰带效果
com.smalo.api.item_cape
披风、披风样式、披风效果
com.smalo.api.item_hat
帽子、帽子样式、帽子效果
com.smalo.api.item_mask
面具、面具类型、面具效果
com.smalo.api.item_quiver
箭袋、箭袋槽、箭矢类型
com.smalo.api.item_trap
陷阱、触发器、陷阱效果
com.smalo.api.item_boots
靴子、靴子升级、靴子效果
com.smalo.api.item_modular
模块化物品、模块部件
com.smalo.api.item_skin
物品皮肤、皮肤染色、皮肤图案
com.smalo.api.item_currency
货币系统、硬币类型
com.smalo.api.item_key_special
特殊钥匙、锁
com.smalo.api.item_dye_advanced
高级染料、染料混合
com.smalo.api.item_gem_advanced
高级宝石切割

🏗️ 扩展:建筑系统 build_* 包

com.smalo.api.build_frame
建筑框架结构
com.smalo.api.build_floor
地板铺设、地板梁、地砖
com.smalo.api.build_wall
墙壁、墙层、墙壁裂缝
com.smalo.api.build_roof
屋顶、瓦片、排水
com.smalo.api.build_stair
楼梯、旋转楼梯
com.smalo.api.build_door
门、门框、合页、门锁
com.smalo.api.build_fence
栅栏、栅栏门、栅栏柱
com.smalo.api.build_pillar
柱子、承重计算
com.smalo.api.build_bridge
桥梁、桥墩、桥跨
com.smalo.api.build_road
道路、路面层、道路标线
com.smalo.api.build_tunnel
隧道、隧道掘进机
com.smalo.api.build_chimney
烟囱、烟囱帽
com.smalo.api.build_pool
水池、泳池
com.smalo.api.build_statue
雕像、雕像基座
com.smalo.api.build_sign
招牌、标识牌、内容
com.smalo.api.build_path
路径、路径曲线、排水系统
com.smalo.api.build_carpet
地毯铺设
com.smalo.api.build_paint
油漆类型、涂色
com.smalo.api.build_move
建筑移动、移动路径

🍕 扩展:食物/烹饪 food_* 包

com.smalo.api.food_cooking
烹饪锅、烹饪配方
com.smalo.api.food_bakery
烘焙、烤箱、烘焙食品
com.smalo.api.food_brewing
酿造、酿酒桶、酿造配方
com.smalo.api.food_aging
陈酿/窖藏、酒窖、陈酿时间
com.smalo.api.food_candy
糖果、糖果模具、糖果类型
com.smalo.api.food_drink
饮料、调酒配方、饮料类型
com.smalo.api.food_juice
果汁、榨汁机
com.smalo.api.food_tea
茶、茶调配、茶叶类型
com.smalo.api.food_coffee
咖啡、咖啡豆烘焙、咖啡冲调
com.smalo.api.food_meat
肉类、切肉、肉类保存
com.smalo.api.food_dairy
乳制品、奶源、乳制品类型
com.smalo.api.food_fish_food
鱼类、捕鱼、鱼类型
com.smalo.api.food_grain
谷物、磨粉、谷物类型
com.smalo.api.food_vegetable
蔬菜、蔬菜生长
com.smalo.api.food_crop
作物、作物生长、收获、作物类型
com.smalo.api.food_herb
香草/药草、干燥、药草类型
com.smalo.api.food_spice
香料、香料干燥、香料类型
com.smalo.api.food_sauce
酱料、发酵、酱料配方
com.smalo.api.food_rotting
食物腐烂、腐烂阶段、防腐
com.smalo.api.food_diet
饮食系统、饮食平衡、饮食效果、饮食计划

🧬 扩展:生物系统 bio_* 包

高级生物/医学/基因系统:

com.smalo.api.bio_cell
细胞系统、细胞膜、细胞类型
com.smalo.api.bio_dna
DNA双螺旋、DNA序列
com.smalo.api.bio_rna
RNA链、转录
com.smalo.api.bio_gene_edit
CRISPR基因编辑工具
com.smalo.api.bio_genome
基因组系统、基因序列
com.smalo.api.bio_protein
蛋白质折叠
com.smalo.api.bio_enzyme
酶系统、酶类型
com.smalo.api.bio_blood
血液系统、血细胞、血型
com.smalo.api.bio_brain
大脑系统、脑区、脑功能、神经通路
com.smalo.api.bio_nerve
神经系统、神经元细胞、神经通路
com.smalo.api.bio_organ
器官系统、器官类型、器官功能
com.smalo.api.bio_tissue
组织系统、组织类型
com.smalo.api.bio_hormone
激素类型、激素系统
com.smalo.api.bio_clone
克隆系统、克隆槽、克隆生长
com.smalo.api.bio_immune_bio
生物免疫系统
com.smalo.api.bio_evolution_bio
生物进化系统
com.smalo.api.bio_mutation_bio
生物变异系统
com.smalo.api.bio_metabolism
新陈代谢系统

✨ 扩展:魔法系统 magic_* 包

com.smalo.api.magic_portal
传送门、传送门钥匙
com.smalo.api.magic_ward
魔法结界/守护石、结界区域、破界器
com.smalo.api.altar_magic
魔法祭坛
com.smalo.api.mana_system
法力系统、法力池、法力恢复、法力消耗
com.smalo.api.curse_system
诅咒系统、诅咒类型
com.smalo.api.elemental
元素系统、元素类型(火/水/风/土/雷/冰)
com.smalo.api.alchemy
炼金术、催化剂、炼金配方、嬗变

⚗️ 扩展:化学系统 chem_* 包

com.smalo.api.chem_acid
酸系统、酸强度、酸类型、酸反应
com.smalo.api.chem_base
碱系统、碱强度、碱类型、碱反应
com.smalo.api.chem_gas
气体系统、气体压力、气体类型、气体反应
com.smalo.api.chem_alloy
合金冶炼、合金配方、合金类型
com.smalo.api.chem_salt
盐类、盐形成、盐性质、盐类型
com.smalo.api.chem_glass
玻璃熔炼、玻璃类型
com.smalo.api.chem_resin
树脂固化、树脂类型
com.smalo.api.chem_fiber
纤维类型
com.smalo.api.chem_mixture
混合比例、混合物系统

🌪️ 扩展:自然灾害/天气/地质

com.smalo.api.earthquake
地震、地震事件、地震伤害
com.smalo.api.flood
洪水、洪水位、洪水伤害
com.smalo.api.drought
干旱、干旱等级、作物枯萎
com.smalo.api.hurricane
飓风、风暴路径、风暴潮
com.smalo.api.blizzard
暴风雪、冰冻伤害
com.smalo.api.avalanche
雪崩、雪层稳定性、雪崩路径
com.smalo.api.landslide
山体滑坡/泥石流
com.smalo.api.meteor
陨石坠落、陨石坑
com.smalo.api.eclipse
日食/月食、日食类型、持续时间
com.smalo.api.glacier
冰川、冰川流动、冰川效应
com.smalo.api.humidity
湿度层、湿度效果
com.smalo.api.aurora
极光、极光颜色、极光条件
com.smalo.api.cosmic_ray
宇宙射线、射线探测器、射线效果
com.smalo.api.gravity_well
重力井效果
com.smalo.api.cave_ecology
洞穴生态
com.smalo.api.kelp_forest
海带森林生态
com.smalo.api.coral_reef
珊瑚礁生态

🖥️ 扩展:UI/信息显示 info_* 包

com.smalo.api.info_hud_adv
高级HUD元素、HUD布局
com.smalo.api.info_health_bar
自定义血条样式、血条颜色
com.smalo.api.info_mana_bar
法力条、法力最大值、法力恢复
com.smalo.api.info_minimap
小地图、地图标记、小地图渲染
com.smalo.api.info_worldmap
世界地图、地图区块
com.smalo.api.info_itempedia
物品百科/物品图鉴
com.smalo.api.info_codex
图鉴/百科系统、条目
com.smalo.api.info_guide
引导系统、引导条目
com.smalo.api.info_help
帮助系统、帮助搜索、帮助条目
com.smalo.api.info_chat_adv
高级聊天过滤、聊天频道
com.smalo.api.info_debug_adv
高级调试信息显示

🐺 扩展:实体行为 entity_* 包

com.smalo.api.entity_age
年龄系统、年龄阶段、老化过程
com.smalo.api.entity_gender
性别系统、性别类型
com.smalo.api.entity_fear
恐惧系统、恐惧记忆、恐惧触发条件
com.smalo.api.entity_bond
羁绊系统、羁绊记忆
com.smalo.api.entity_herd
群体行为、群体首领
com.smalo.api.entity_pack
狼群/兽群、群体首领、群体狩猎
com.smalo.api.entity_guard
守卫AI、守卫岗哨、守卫职责
com.smalo.api.entity_nest
巢穴建造、筑巢AI
com.smalo.api.entity_sleep
睡眠周期、昼夜节律

🥚 刷怪蛋(Spawn Egg) com.smalo.api.entity.spawn

常用 刷怪蛋是 SMALO 加载器内置的跨版本功能,无需安装任何模组即可在十个 Minecraft 版本中使用。玩家手持刷怪蛋右键地面可生成生物,右键已有生物可将其变异转换。

功能
SpawnEggRegistry刷怪蛋注册表(注册自定义蛋、获取内置蛋、查询蛋信息)
SpawnEggItem刷怪蛋物品对象(绑定生物类型、显示名、贴图)
EntityTypeMapping跨版本生物类型映射(统一生物名 → 各版本真实注册名)
SpawnEggConversionHandler变异转换处理器(右键生物时触发类型转换)
SpawnEggUseHandler使用处理器(右键地面生成生物、消耗耐久)
SpawnEggInventoryBuilder创造模式物品栏构建器(自动注入内置蛋)
一句话引入:SMALO 内置 60 种刷怪蛋,覆盖十个版本矩阵(1.7.10 ~ 26.2),右键地面生成生物、右键生物变异转换,一次定义跨版本可用。

功能一览

操作效果说明
右键地面生成生物在目标方块上方生成刷怪蛋绑定的生物,生存模式消耗 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.2DataComponent 重构后适配新 API

变异转换示例

原生物目标生物条件
僵尸尸壳1.10+ 版本支持
僵尸僵尸村民所有版本
村民僵尸村民所有版本
骷髅凋零骷髅1.10+ 版本支持
骷髅流浪者1.10+ 版本支持
鲑鱼河豚1.13+ 版本支持

不支持变异时:退化为"在生物旁生成新生物"或拒绝操作,不会静默失败。

生成失败诊断

当刷怪蛋生成失败时,SMALO 输出结构化错误码,不会静默吞掉:

[SpawnEgg] 生成失败: ErrorCode=ENTITY_TYPE_NOT_FOUND
  生物: smalo:warden
  版本: 1.16.5
  根因: 该版本不存在监守者生物
  建议: 使用 1.19+ 版本

在游戏中使用

  1. 进入创造模式(或使用 /gamemode creative
  2. 打开物品栏(按 E 键)
  3. 搜索栏输入生物名(如 zombie)即可找到对应刷怪蛋
  4. 将刷怪蛋放入快捷栏,右键地面生成生物
  5. 右键已有生物可触发变异转换
生存模式下每次使用消耗 1 个刷怪蛋;创造模式下不消耗。生成频率有内置限流(每秒最多 10 次),防止刷怪卡服。

开发者 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编译器,自动处理JDK检测、classpath、权限、文件复制等所有问题,不需要手动敲命令。

操作步骤:

  1. 打开SMALO启动器
  2. 点击左侧导航栏的「上传」按钮
  3. 在SmartAPI单文件开发区域,点击选择你的 MyModMain.java 文件
  4. 选择目标Minecraft版本
  5. 点击「编译打包」按钮
  6. 软件自动完成:
    • ✅ JDK环境检测(没装会提示你安装)
    • ✅ 自动带上 smalo-api.jar + smartapi-core.jar 到classpath
    • ✅ 自动解析 @SmartMod 注解读取模组信息
    • ✅ javac编译 + jar打包
    • ✅ 自动复制到所有版本的mods文件夹
    • ✅ 显示完整编译日志,出错直接告诉你哪行错了
  7. 编译成功后,重启游戏就能在模组列表看到你的模组
注意:不要使用任何外部bat脚本进行打包,可能存在路径错误、权限问题、依赖不全等可靠性问题。所有编译打包请在SMALO软件内完成。

手动编译(高级用户参考)

如果你熟悉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 文件就是成品模组,可以直接分享给别人:

  1. 别人拿到JAR文件后,丢进 SMALO启动器的 mods 文件夹
  2. 启动SMALO启动器,就能在模组列表看到你的模组
  3. 启动游戏自动加载
注意:你的模组JAR里不需要包含 smalo-api.jar 和 smartapi-core.jar,这两个是SMALO启动器自带的,所有模组共用。打包脚本不会把它们打进去,保持模组体积小。

❓ 常见问题

Q:我不会写Java怎么办?

声明式JSON模组完全不用写Java,只写JSON配置就能加物品/方块/配方。后续会出专门的JSON模组教程。Java模组从简单的事件监听开始学,复制例子改改就能用。

Q:编译报错"找不到符号"怎么办?

检查import语句是不是写错了,类名/包名有没有拼错。使用软件内置编译器会自动处理classpath依赖,不需要手动配置。

Q:模组加载了但功能不生效?

  1. 检查入口类在 smalo.mod.jsonentryClass 有没有写对(包含完整包名)
  2. 检查事件是不是订阅对了,lambda有没有写错
  3. 看游戏日志有没有报错信息,用 Logger.info() 在关键位置打日志调试

Q:怎么让模组兼容Forge/Fabric的模组?

SMALO已经内置了Forge/Fabric兼容层,大部分现成的Forge/Fabric模组JAR直接丢进mods文件夹就能用,不用你做任何修改。你自己开发的模组如果用了Forge注解,SMALO也能识别加载。

Q:客户端模组和服务器模组怎么区分?

SMALO默认自动处理:只在客户端有效的类(渲染、GUI、声音)在客户端加载,服务器逻辑在服务器加载。你只需要正常写代码,不用手动区分。

Q:500多个包我都要学吗?

不用!90%的普通模组只用核心包+常用包(事件、注册、玩家、物品、世界、配置、任务)就够了。其他扩展包需要的时候再查文档就行,不用背。