Description
i113w's Camera Lib
A NeoForge 1.21.1 client-side library that provides a complete RTS-style camera system — including camera movement, entity box-selection, right-click command zones, ray casting, and highlight rendering.
Designed to be consumed by other mods (e.g., Better Mine Team) via a thin API layer.
Requirements
| Item | Version |
|---|---|
| Minecraft | 1.21.1 |
| NeoForge | 21.1.209+ |
| Java | 21 |
| Side | Client-only |
Importing the Library
Local JAR (place the JAR in your mod's libs/ directory):
dependencies {
implementation files('libs/i113w_camera_lib-0.0.1.jar')
}
Declare the dependency in META-INF/neoforge.mods.toml:
[[dependencies."your_mod_id"]]
modId = "i113w_camera_lib"
type = "required"
versionRange = "[0.0.1,)"
ordering = "BEFORE"
side = "CLIENT"
Key Interfaces & Classes
CameraLibAPI — singleton entry point
CameraLibAPI api = CameraLibAPI.get();
// Register your delegate
api.setInteractionDelegate(new MyDelegate());
// Sync selected entity IDs to the library (drives outline rendering)
api.setSelectedEntities(Set<Integer> ids);
// Query hovered entity (-1 if none)
int id = api.getHoveredEntityId();
// Clear selection and hover state
api.clearSelection();
IRTSInteractionDelegate — inject business logic
public interface IRTSInteractionDelegate {
boolean isSelectable(Entity entity);
ResourceLocation getCursorIcon(@Nullable Entity hoveredEntity, boolean isAttackDragging);
}
Register via CameraLibAPI.get().setInteractionDelegate(impl).
Events (fired on NeoForge.EVENT_BUS)
RTSBoxSelectEvent — left-click or drag-box completed
@SubscribeEvent
public static void onSelect(RTSBoxSelectEvent event) {
List<Entity> candidates = event.getCandidates(); // pre-filtered by isSelectable()
}
RTSRightClickEvent — right-click or right-drag completed
@SubscribeEvent
public static void onRightClick(RTSRightClickEvent event) {
if (event.isDrag()) {
List<Entity> targets = event.getDragTargets();
} else {
HitResult hit = event.getSingleHitResult(); // BlockHitResult or EntityHitResult
}
}
RTSCameraController — camera state
RTSCameraController cam = RTSCameraController.get();
cam.toggleRTSMode(); // activate / deactivate
cam.toggleCameraStyle(); // switch RTS <-> FREE (while active)
cam.isActive(); // boolean
cam.reset(); // force-exit, use on logout / level unload
Camera Modes
| Mode | FOV | Zoom | Yaw Rotation |
|---|---|---|---|
| RTS | 25° (fixed) | Scroll wheel | Hold Left Ctrl + drag (snaps by rtsSnapAngle) |
| FREE | Standard | Scroll wheel (moves forward) | Hold Left Ctrl + drag (continuous) |
Highlight Rendering
The library automatically draws entity outlines when the camera is active. No rendering code is needed in the consumer mod — just keep CameraLibAPI.setSelectedEntities(...) in sync.
| Color | Condition |
|---|---|
| White | Entity ID is in the selected set |
| Yellow | Hovered entity (not in selected set) |
Configuration
Player-adjustable values in .minecraft/config/i113w_camera_lib-client.toml:
| Key | Default | Description |
|---|---|---|
rtsPitchMin / Max |
35 / 45 | Pitch clamp range in RTS mode |
freePitchMin / Max |
10 / 90 | Pitch clamp range in FREE mode |
rtsZoomMin / Max |
10 / 80 | Zoom distance clamp in RTS mode |
rtsZoomSpeedMultiplier |
3.5 | Scroll wheel zoom sensitivity |
rtsSnapAngle |
90 | Degrees per yaw snap step |
freeRotationSpeed |
5.0 | Mouse yaw sensitivity in FREE mode |
thresholdPx |
20 | Edge-pan trigger distance (pixels from screen edge) |
baseSpeed |
1.0 | WASD movement speed |
sprintMultiplier |
2.0 | Speed multiplier when sprint key is held |
License
MIT — see LICENSE
Author: i113w


