This commit is contained in:
2026-05-13 20:38:59 +03:00
parent 9055c9c93c
commit 5620324b2e
4904 changed files with 391162 additions and 0 deletions
@@ -0,0 +1,67 @@
public net.minecraft.client.renderer.block.ModelBlockRenderer$Cache
public net.minecraft.server.level.ChunkHolder entityTickingChunkFuture
public net.minecraft.server.level.ChunkHolder tickingChunkFuture
public net.minecraft.server.level.ChunkHolder fullChunkFuture
public net.minecraft.client.renderer.block.BlockRenderDispatcher modelRenderer
public net.minecraft.client.renderer.block.ModelBlockRenderer$AmbientOcclusionFace
public net.minecraft.server.level.ServerChunkCache$MainThreadExecutor
public net.minecraft.client.renderer.LevelRenderer cullingFrustum
public net.minecraft.world.entity.projectile.AbstractHurtingProjectile accelerationPower
public net.minecraft.world.entity.projectile.Projectile Projectile(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V
public net.minecraft.server.level.ServerChunkCache$ChunkAndHolder
public net.minecraft.server.level.ServerChunkCache$ChunkAndHolder <init>(Lnet/minecraft/world/level/chunk/LevelChunk;Lnet/minecraft/server/level/ChunkHolder;)V
public-f net.minecraft.client.renderer.chunk.SectionRenderDispatcher bufferPool
public-f net.minecraft.world.entity.ai.attributes.AttributeSupplier instances
public net.minecraft.server.level.ServerPlayer findRespawnAndUseSpawnBlock(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;FZZ)Ljava/util/Optional;
public net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection updateGlobalBlockEntities(Ljava/util/Collection;)V
public net.minecraft.client.renderer.chunk.SectionRenderDispatcher$RenderSection setCompiled(Lnet/minecraft/client/renderer/chunk/SectionRenderDispatcher$CompiledSection;)V
public net.minecraft.world.entity.Entity removalReason
public net.minecraft.world.entity.Entity levelCallback
public-f net.minecraft.world.entity.Entity getEyePosition(F)Lnet/minecraft/world/phys/Vec3;
public-f net.minecraft.world.entity.Entity setRemoved(Lnet/minecraft/world/entity/Entity$RemovalReason;)V
public net.minecraft.server.level.ChunkLevel ENTITY_TICKING_LEVEL
public net.minecraft.server.level.ChunkLevel BLOCK_TICKING_LEVEL
public net.minecraft.world.entity.decoration.HangingEntity calculateSupportBox()Lnet/minecraft/world/phys/AABB;
public net.minecraft.world.entity.LivingEntity dismountVehicle(Lnet/minecraft/world/entity/Entity;)V
public net.minecraft.world.level.lighting.LevelLightEngine skyEngine
public net.minecraft.world.level.lighting.LevelLightEngine blockEngine
public net.minecraft.server.level.ThreadedLevelLightEngine runUpdate()V
public net.minecraft.server.level.ThreadedLevelLightEngine updateChunkStatus(Lnet/minecraft/world/level/ChunkPos;)V
public net.minecraft.client.renderer.block.ModelBlockRenderer CACHE
public net.minecraft.server.network.PlayerChunkSender sendChunk(Lnet/minecraft/server/network/ServerGamePacketListenerImpl;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/LevelChunk;)V
public net.minecraft.server.network.ServerCommonPacketListenerImpl connection
public net.minecraft.client.multiplayer.ClientChunkCache$Storage
public net.minecraft.network.Connection channel
public net.minecraft.client.renderer.RenderStateShard name
public net.minecraft.client.renderer.ShaderInstance samplerLocations
public net.minecraft.world.level.entity.PersistentEntitySectionManager sectionStorage
public net.minecraft.world.level.storage.DimensionDataStorage dataFolder
public net.minecraft.client.renderer.GameRenderer getFov(Lnet/minecraft/client/Camera;FZ)D
public-f net.minecraft.server.level.GenerationChunkHolder rescheduleChunkTask(Lnet/minecraft/server/level/ChunkMap;Lnet/minecraft/world/level/chunk/status/ChunkStatus;)V
public net.minecraft.client.particle.Particle zo
public net.minecraft.client.particle.Particle yo
public net.minecraft.client.particle.Particle xo
public net.minecraft.client.particle.Particle x
public net.minecraft.client.particle.Particle y
public net.minecraft.client.particle.Particle zd
public net.minecraft.client.particle.Particle z
public net.minecraft.client.particle.Particle yd
public net.minecraft.client.particle.Particle xd
public net.minecraft.world.level.ClipContext collisionContext
public net.minecraft.world.level.ClipContext fluid
public net.minecraft.world.level.ClipContext block
public net.minecraft.server.level.ChunkMap$DistanceManager
public net.minecraft.server.level.ServerPlayer$RespawnPosAngle
public net.minecraft.server.level.ServerPlayer$RespawnPosAngle <init>(Lnet/minecraft/world/phys/Vec3;F)V
public net.minecraft.server.level.ChunkMap unloadQueue
public net.minecraft.server.level.ChunkMap toDrop
public net.minecraft.server.level.ChunkMap updatingChunkMap
public net.minecraft.server.level.ChunkMap visibleChunkMap
public net.minecraft.server.level.ChunkMap modified
public net.minecraft.server.level.ChunkMap chunkSaveCooldowns
public net.minecraft.server.level.ChunkMap scheduleUnload(JLnet/minecraft/server/level/ChunkHolder;)V
public net.minecraft.server.level.ChunkMap onFullChunkStatusChange(Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/server/level/FullChunkStatus;)V
public net.minecraft.server.level.ChunkMap getChunks()Ljava/lang/Iterable;
public net.minecraft.server.level.ChunkMap saveChunkIfNeeded(Lnet/minecraft/server/level/ChunkHolder;)Z
public net.minecraft.server.level.ServerLevel entityManager
@@ -0,0 +1,67 @@
modLoader = "javafml"
loaderVersion = "[4,)"
issueTrackerURL = "https://github.com/ryanhcode/sable/issues"
license = "PolyForm Shield License 1.0.0"
[[mods]]
modId = "sable"
version = "1.2.2"
displayName = "Sable"
authors = "RyanHCode"
credits = "Ocelot, Eriksonn, Cyvack, Bee, Kyan, Cake, Rhyguy1"
description = '''Interactive moving block structures with physics.'''
logoFile = "icon.png"
["lithium:options"]
"mixin.entity.collisions.unpushable_cramming" = false
"mixin.world.chunk_access" = false
"mixin.world.chunk_ticking" = false
"mixin.world.tick_scheduler" = false
[[mixins]]
config = "sable.mixins.json"
[[mixins]]
config = "sable-neoforge.mixins.json"
[[dependencies.sable]]
modId = "neoforge"
type = "required"
versionRange = "[21.1.219,)"
ordering = "NONE"
side = "BOTH"
[[dependencies.sable]]
modId = "minecraft"
type = "required"
versionRange = "[1.21.1]"
ordering = "NONE"
side = "BOTH"
[[dependencies.sable]]
modId = "flywheel"
type = "optional"
versionRange = "[1.0.6,)"
ordering = "AFTER"
side = "CLIENT"
[[dependencies.sable]]
modId = "create"
type = "optional"
versionRange = "[6.0.10,6.1.0)"
ordering = "AFTER"
side = "CLIENT"
[[dependencies.sable]]
modId = "sablecompanion"
type = "incompatible"
versionRange = "(1.6.0,)"
reason = "Sable is out of date"
[[dependencies.sable]]
modId = "scalablelux"
type = "incompatible"
[[dependencies.sable]]
modId = "littletiles"
type = "incompatible"
@@ -0,0 +1 @@
dev.ryanhcode.sable.ActiveSableCompanion
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SableAssemblyPlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SableChunkEventPlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SableEventPlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SableEventPublishPlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SableLoaderPlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SablePlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SablePlotPlatformImpl
@@ -0,0 +1 @@
dev.ryanhcode.sable.neoforge.platform.SableSubLevelRenderPlatformImpl
@@ -0,0 +1,2 @@
{
}
@@ -0,0 +1,7 @@
Sable's sub-levels each contain their own lighting sections, and lighting data.
We need Flywheel shaders to be aware of this, so we change and override the lighting storage, LUT, and shaders to respect an additional "scene ID".
I'm not happy with the large amounts of duplicated shader code in these overrides, but it's the route we are going with for now.
Reference https://github.com/Engine-Room/Flywheel/tree/1.21.1/dev for the original shaders and lighting code that these overrides are based on.
@@ -0,0 +1,31 @@
#include "flywheel:internal/material.glsl"
#include "flywheel:internal/api_impl.glsl"
#include "flywheel:internal/uniforms/uniforms.glsl"
in vec4 flw_vertexPos;
in vec4 flw_vertexColor;
in vec2 flw_vertexTexCoord;
flat in ivec2 flw_vertexOverlay;
in vec2 flw_vertexLight;
in vec3 flw_vertexNormal;
in float flw_distance;
#ifdef FLW_EMBEDDED
flat in float flw_skyLightScale;
flat in uint flw_vertexLightingSceneId;
in vec4 flw_vertexLightingPos;
#endif
vec4 flw_sampleColor;
FlwMaterial flw_material;
bool flw_fragDiffuse;
vec4 flw_fragColor;
ivec2 flw_fragOverlay;
vec2 flw_fragLight;
uniform sampler2D flw_diffuseTex;
uniform sampler2D flw_overlayTex;
uniform sampler2D flw_lightTex;
@@ -0,0 +1,26 @@
struct FlwLightAo {
vec2 light;
float ao;
};
/// Get the light at the given world position relative to flw_renderOrigin from the given normal.
/// This may be interpolated for smooth lighting.
bool flw_light(uint scene, vec3 worldPos, vec3 normal, ivec3 renderOrigin, out FlwLightAo light);
/// Fetches the light value at the given block position.
/// Returns false if the light for the given block is not available.
bool flw_lightFetch(uint scene, ivec3 blockPos, out vec2 light);
// Backwards compatible overloads
/// Get the light at the given world position relative to flw_renderOrigin from the given normal.
/// This may be interpolated for smooth lighting.
bool flw_light(vec3 worldPos, vec3 normal, ivec3 renderOrigin, out FlwLightAo light) {
return flw_light(0u, worldPos, normal, renderOrigin, light);
}
/// Fetches the light value at the given block position.
/// Returns false if the light for the given block is not available.
bool flw_lightFetch(ivec3 blockPos, out vec2 light) {
return flw_lightFetch(0u, blockPos, light);
}
@@ -0,0 +1,112 @@
#include "flywheel:internal/fog_distance.glsl"
#ifdef _FLW_CRUMBLING
out vec2 _flw_crumblingTexCoord;
const int DOWN = 0;
const int UP = 1;
const int NORTH = 2;
const int SOUTH = 3;
const int WEST = 4;
const int EAST = 5;
// based on net.minecraftforge.client.ForgeHooksClient.getNearestStable
int getNearestFacing(vec3 normal) {
float maxAlignment = -2;
int face = 2;
// Calculate the alignment of the normal vector with each axis.
// Note that `-dot(normal, axis) == dot(normal, -axis)`.
vec3 alignment = vec3(
dot(normal, vec3(1., 0., 0.)),
dot(normal, vec3(0., 1., 0.)),
dot(normal, vec3(0., 0., 1.))
);
if (-alignment.y > maxAlignment) {
maxAlignment = -alignment.y;
face = DOWN;
}
if (alignment.y > maxAlignment) {
maxAlignment = alignment.y;
face = UP;
}
if (-alignment.z > maxAlignment) {
maxAlignment = -alignment.z;
face = NORTH;
}
if (alignment.z > maxAlignment) {
maxAlignment = alignment.z;
face = SOUTH;
}
if (-alignment.x > maxAlignment) {
maxAlignment = -alignment.x;
face = WEST;
}
if (alignment.x > maxAlignment) {
maxAlignment = alignment.x;
face = EAST;
}
return face;
}
vec2 getCrumblingTexCoord() {
switch (getNearestFacing(flw_vertexNormal)) {
case DOWN: return vec2(flw_vertexPos.x, -flw_vertexPos.z);
case UP: return vec2(flw_vertexPos.x, flw_vertexPos.z);
case NORTH: return vec2(-flw_vertexPos.x, -flw_vertexPos.y);
case SOUTH: return vec2(flw_vertexPos.x, -flw_vertexPos.y);
case WEST: return vec2(-flw_vertexPos.z, -flw_vertexPos.y);
case EAST: return vec2(flw_vertexPos.z, -flw_vertexPos.y);
}
// default to north
return vec2(-flw_vertexPos.x, -flw_vertexPos.y);
}
#endif
#ifdef FLW_EMBEDDED
mat4 _flw_modelMatrix;
mat3 _flw_normalMatrix;
uint _flw_lightingSceneId;
float _flw_skyLightScale;
mat4 _flw_lightingSceneMatrix;
flat out uint flw_vertexLightingSceneId;
flat out float flw_skyLightScale;
out vec4 flw_vertexLightingPos;
#endif
#ifdef _FLW_DEBUG
flat out uvec2 _flw_ids;
#endif
void _flw_main(in FlwInstance instance, in uint stableInstanceID, in uint baseVertex) {
flw_vertexId = gl_VertexID - baseVertex;
_flw_layoutVertex();
flw_instanceVertex(instance);
flw_materialVertex();
#ifdef _FLW_CRUMBLING
_flw_crumblingTexCoord = getCrumblingTexCoord();
#endif
#ifdef FLW_EMBEDDED
flw_vertexLightingPos = _flw_lightingSceneMatrix * flw_vertexPos;
flw_vertexPos = _flw_modelMatrix * flw_vertexPos;
flw_vertexNormal = _flw_normalMatrix * flw_vertexNormal;
flw_vertexLightingSceneId = _flw_lightingSceneId;
flw_skyLightScale = _flw_skyLightScale;
#endif
flw_vertexNormal = normalize(flw_vertexNormal);
flw_distance = fogDistance(flw_vertexPos.xyz, flw_cameraPos, flw_fogShape);
gl_Position = flw_viewProjection * flw_vertexPos;
#ifdef _FLW_DEBUG
_flw_ids = uvec2(stableInstanceID, baseVertex);
#endif
}
@@ -0,0 +1,55 @@
#include "flywheel:internal/common.vert"
#include "flywheel:internal/packed_material.glsl"
#include "flywheel:internal/indirect/buffer_bindings.glsl"
#include "flywheel:internal/indirect/draw_command.glsl"
#include "flywheel:internal/indirect/light.glsl"
#include "flywheel:internal/indirect/matrices.glsl"
layout(std430, binding = _FLW_DRAW_INSTANCE_INDEX_BUFFER_BINDING) restrict readonly buffer TargetBuffer {
uint _flw_instanceIndices[];
};
layout(std430, binding = _FLW_DRAW_BUFFER_BINDING) restrict readonly buffer DrawBuffer {
MeshDrawCommand _flw_drawCommands[];
};
#ifdef FLW_EMBEDDED
layout(std430, binding = _FLW_MATRIX_BUFFER_BINDING) restrict buffer MatrixBuffer {
Matrices _flw_matrices[];
};
#endif
uniform uint _flw_baseDraw;
flat out uvec2 _flw_packedMaterial;
#if __VERSION__ < 460
#define flw_baseInstance gl_BaseInstanceARB
#define flw_drawId gl_DrawIDARB
#else
#define flw_baseInstance gl_BaseInstance
#define flw_drawId gl_DrawID
#endif
void main() {
uint drawIndex = flw_drawId + _flw_baseDraw;
MeshDrawCommand draw = _flw_drawCommands[drawIndex];
uint packedMaterialProperties = draw.packedMaterialProperties;
_flw_unpackMaterialProperties(packedMaterialProperties, flw_material);
_flw_packedMaterial = uvec2(draw.packedFogAndCutout, packedMaterialProperties);
#ifdef FLW_EMBEDDED
_flw_unpackMatrices(_flw_matrices[draw.matrixIndex], _flw_modelMatrix, _flw_normalMatrix, _flw_lightingSceneId, _flw_skyLightScale, _flw_lightingSceneMatrix);
#endif
#ifdef _FLW_CRUMBLING
uint instanceIndex = flw_baseInstance;
#else
uint instanceIndex = _flw_instanceIndices[flw_baseInstance + gl_InstanceID];
#endif
FlwInstance instance = _flw_unpackInstance(instanceIndex);
_flw_main(instance, instanceIndex, draw.vertexOffset);
}
@@ -0,0 +1,19 @@
struct Matrices {
mat4 pose;
vec4 normalA;
vec4 normalB;
vec4 normalC;
float skyLightScale;
uint sceneID;
float _padding1;
float _padding2;
mat4 lightingSceneMatrix;
};
void _flw_unpackMatrices(in Matrices mats, out mat4 pose, out mat3 normal, out uint lightingSceneId, out float skyLightScale, out mat4 lightingSceneMatrix) {
pose = mats.pose;
normal = mat3(mats.normalA.xyz, mats.normalB.xyz, mats.normalC.xyz);
lightingSceneId = mats.sceneID;
skyLightScale = mats.skyLightScale;
lightingSceneMatrix = mats.lightingSceneMatrix;
}
@@ -0,0 +1,32 @@
#include "flywheel:internal/common.vert"
#include "flywheel:internal/packed_material.glsl"
#include "flywheel:internal/instancing/light.glsl"
uniform uvec2 _flw_packedMaterial;
uniform int _flw_baseInstance = 0;
#ifdef FLW_EMBEDDED
uniform mat4 _flw_modelMatrixUniform;
uniform mat3 _flw_normalMatrixUniform;
uniform uint _flw_lightingSceneUniform;
uniform float _flw_lightingSkyLightScaleUniform;
uniform mat4 _flw_lightingSceneMatrixUniform;
#endif
uniform uint _flw_baseVertex;
void main() {
_flw_unpackMaterialProperties(_flw_packedMaterial.y, flw_material);
FlwInstance instance = _flw_unpackInstance(_flw_baseInstance + gl_InstanceID);
#ifdef FLW_EMBEDDED
_flw_modelMatrix = _flw_modelMatrixUniform;
_flw_normalMatrix = _flw_normalMatrixUniform;
_flw_lightingSceneMatrix = _flw_lightingSceneMatrixUniform;
_flw_lightingSceneId = _flw_lightingSceneUniform;
_flw_skyLightScale = _flw_lightingSkyLightScaleUniform;
#endif
_flw_main(instance, uint(gl_InstanceID), _flw_baseVertex);
}
@@ -0,0 +1,427 @@
const uint _FLW_BLOCKS_PER_SECTION = 18u * 18u * 18u;
const uint _FLW_LIGHT_SIZE_BYTES = _FLW_BLOCKS_PER_SECTION;
const uint _FLW_SOLID_SIZE_BYTES = ((_FLW_BLOCKS_PER_SECTION + 31u) / 32u) * 4u;
const uint _FLW_LIGHT_START_BYTES = _FLW_SOLID_SIZE_BYTES;
const uint _FLW_LIGHT_SECTION_SIZE_BYTES = _FLW_SOLID_SIZE_BYTES + _FLW_LIGHT_SIZE_BYTES;
const uint _FLW_SOLID_START_INTS = 0u;
const uint _FLW_LIGHT_START_INTS = _FLW_SOLID_SIZE_BYTES / 4u;
const uint _FLW_LIGHT_SECTION_SIZE_INTS = _FLW_LIGHT_SECTION_SIZE_BYTES / 4u;
const uint _FLW_COMPLETELY_SOLID = 0x7FFFFFFu;
const float _FLW_EPSILON = 1e-5;
const uint _FLW_LOWER_10_BITS = 0x3FFu;
const uint _FLW_UPPER_10_BITS = 0xFFF00000u;
const float _FLW_LIGHT_NORMALIZER = 1. / 16.;
uint _flw_indexLut(uint index);
uint _flw_indexLight(uint index);
/// Find the index for the next step in the LUT.
/// @param base The base index in the LUT, should point to the start of a coordinate span.
/// @param coord The coordinate to look for.
/// @param next Output. The index of the next step in the LUT.
/// @return true if the coordinate is not in the span.
bool _flw_nextLut(uint base, int coord, out uint next) {
// The base coordinate.
int start = int(_flw_indexLut(base));
// The width of the coordinate span.
uint size = _flw_indexLut(base + 1u);
// Index of the coordinate in the span.
int i = coord - start;
if (i < 0 || i >= int(size)) {
// We missed.
return true;
}
next = _flw_indexLut(base + 2u + uint(i));
return false;
}
bool _flw_chunkCoordToSectionIndex(uint sceneId, ivec3 sectionPos, out uint index) {
uint scene;
if (_flw_nextLut(0u, int(sceneId), scene) || scene == 0u) {
return true;
}
uint first;
if (_flw_nextLut(scene, sectionPos.y, first) || first == 0u) {
return true;
}
uint second;
if (_flw_nextLut(first, sectionPos.x, second) || second == 0u) {
return true;
}
uint sectionIndex;
if (_flw_nextLut(second, sectionPos.z, sectionIndex) || sectionIndex == 0u) {
return true;
}
// The index is written as 1-based so we can properly detect missing sections.
index = sectionIndex - 1u;
return false;
}
uvec2 _flw_lightAt(uint sectionOffset, uvec3 blockInSectionPos) {
uint byteOffset = blockInSectionPos.x + blockInSectionPos.z * 18u + blockInSectionPos.y * 18u * 18u;
uint uintOffset = byteOffset >> 2u;
uint bitOffset = (byteOffset & 3u) << 3;
uint raw = _flw_indexLight(sectionOffset + _FLW_LIGHT_START_INTS + uintOffset);
uint block = (raw >> bitOffset) & 0xFu;
uint sky = (raw >> (bitOffset + 4u)) & 0xFu;
return uvec2(block, sky);
}
bool _flw_isSolid(uint sectionOffset, uvec3 blockInSectionPos) {
uint bitOffset = blockInSectionPos.x + blockInSectionPos.z * 18u + blockInSectionPos.y * 18u * 18u;
uint uintOffset = bitOffset >> 5u;
uint bitInWordOffset = bitOffset & 31u;
uint word = _flw_indexLight(sectionOffset + _FLW_SOLID_START_INTS + uintOffset);
return (word & (1u << bitInWordOffset)) != 0u;
}
bool flw_lightFetch(uint scene, ivec3 blockPos, out vec2 lightCoord) {
uint lightSectionIndex;
if (_flw_chunkCoordToSectionIndex(scene, blockPos >> 4, lightSectionIndex)) {
return false;
}
// The offset of the section in the light buffer.
uint sectionOffset = lightSectionIndex * _FLW_LIGHT_SECTION_SIZE_INTS;
uvec3 blockInSectionPos = uvec3((blockPos & 0xF) + 1);
lightCoord = vec2(_flw_lightAt(sectionOffset, blockInSectionPos)) * _FLW_LIGHT_NORMALIZER;
return true;
}
uint _flw_fetchSolid3x3x3(uint sectionOffset, ivec3 blockInSectionPos) {
uint ret = 0u;
// The formatter does NOT like these macros
// @formatter:off
#define _FLW_FETCH_SOLID(x, y, z, i) { \
bool flag = _flw_isSolid(sectionOffset, uvec3(blockInSectionPos + ivec3(x, y, z))); \
ret |= uint(flag) << i; \
}
/// fori y, z, x: unrolled
_FLW_FETCH_SOLID(-1, -1, -1, 0)
_FLW_FETCH_SOLID(0, -1, -1, 1)
_FLW_FETCH_SOLID(1, -1, -1, 2)
_FLW_FETCH_SOLID(-1, -1, 0, 3)
_FLW_FETCH_SOLID(0, -1, 0, 4)
_FLW_FETCH_SOLID(1, -1, 0, 5)
_FLW_FETCH_SOLID(-1, -1, 1, 6)
_FLW_FETCH_SOLID(0, -1, 1, 7)
_FLW_FETCH_SOLID(1, -1, 1, 8)
_FLW_FETCH_SOLID(-1, 0, -1, 9)
_FLW_FETCH_SOLID(0, 0, -1, 10)
_FLW_FETCH_SOLID(1, 0, -1, 11)
_FLW_FETCH_SOLID(-1, 0, 0, 12)
_FLW_FETCH_SOLID(0, 0, 0, 13)
_FLW_FETCH_SOLID(1, 0, 0, 14)
_FLW_FETCH_SOLID(-1, 0, 1, 15)
_FLW_FETCH_SOLID(0, 0, 1, 16)
_FLW_FETCH_SOLID(1, 0, 1, 17)
_FLW_FETCH_SOLID(-1, 1, -1, 18)
_FLW_FETCH_SOLID(0, 1, -1, 19)
_FLW_FETCH_SOLID(1, 1, -1, 20)
_FLW_FETCH_SOLID(-1, 1, 0, 21)
_FLW_FETCH_SOLID(0, 1, 0, 22)
_FLW_FETCH_SOLID(1, 1, 0, 23)
_FLW_FETCH_SOLID(-1, 1, 1, 24)
_FLW_FETCH_SOLID(0, 1, 1, 25)
_FLW_FETCH_SOLID(1, 1, 1, 26)
// @formatter:on
return ret;
}
/// Premtively collect all light in a 3x3x3 area centered on our block.
/// Depending on the normal, we won't use all the data, but fetching on demand will have many duplicated fetches.
/// Only fetching what we'll actually use using a bitmask turned out significantly slower, but perhaps a less
/// granular approach could see wins.
///
/// The output is a 3-component vector <blockLight, skyLight, valid ? 1 : 0> packed into a single uint to save
/// memory and ALU ops later on. 10 bits are used for each component. This allows 4 such packed ints to be added
/// together with room to spare before overflowing into the next component.
uint[27] _flw_fetchLight3x3x3(uint sectionOffset, ivec3 blockInSectionPos, uint solidMask) {
uint[27] lights;
// @formatter:off
#define _FLW_FETCH_LIGHT(_x, _y, _z, i) { \
uvec2 light = _flw_lightAt(sectionOffset, uvec3(blockInSectionPos + ivec3(_x, _y, _z))); \
lights[i] = (light.x) | ((light.y) << 10) | (uint((solidMask & (1u << i)) == 0u) << 20); \
}
/// fori y, z, x: unrolled
_FLW_FETCH_LIGHT(-1, -1, -1, 0)
_FLW_FETCH_LIGHT(0, -1, -1, 1)
_FLW_FETCH_LIGHT(1, -1, -1, 2)
_FLW_FETCH_LIGHT(-1, -1, 0, 3)
_FLW_FETCH_LIGHT(0, -1, 0, 4)
_FLW_FETCH_LIGHT(1, -1, 0, 5)
_FLW_FETCH_LIGHT(-1, -1, 1, 6)
_FLW_FETCH_LIGHT(0, -1, 1, 7)
_FLW_FETCH_LIGHT(1, -1, 1, 8)
_FLW_FETCH_LIGHT(-1, 0, -1, 9)
_FLW_FETCH_LIGHT(0, 0, -1, 10)
_FLW_FETCH_LIGHT(1, 0, -1, 11)
_FLW_FETCH_LIGHT(-1, 0, 0, 12)
_FLW_FETCH_LIGHT(0, 0, 0, 13)
_FLW_FETCH_LIGHT(1, 0, 0, 14)
_FLW_FETCH_LIGHT(-1, 0, 1, 15)
_FLW_FETCH_LIGHT(0, 0, 1, 16)
_FLW_FETCH_LIGHT(1, 0, 1, 17)
_FLW_FETCH_LIGHT(-1, 1, -1, 18)
_FLW_FETCH_LIGHT(0, 1, -1, 19)
_FLW_FETCH_LIGHT(1, 1, -1, 20)
_FLW_FETCH_LIGHT(-1, 1, 0, 21)
_FLW_FETCH_LIGHT(0, 1, 0, 22)
_FLW_FETCH_LIGHT(1, 1, 0, 23)
_FLW_FETCH_LIGHT(-1, 1, 1, 24)
_FLW_FETCH_LIGHT(0, 1, 1, 25)
_FLW_FETCH_LIGHT(1, 1, 1, 26)
// @formatter:on
return lights;
}
#define _flw_index3x3x3(x, y, z) ((x) + (z) * 3u + (y) * 9u)
#define _flw_validCountToAo(validCount) (1. - (4. - (validCount)) * 0.2)
/// Calculate the light for a direction by averaging the light at the corners of the block.
///
/// To make this reusable across directions, c00..c11 choose what values relative to each corner to use.
/// e.g. (0, 0, 0) (0, 0, 1) (0, 1, 0) (0, 1, 1) would give you the light coming from -x at each corner.
/// In general, to get the light for a particular direction, you fix the x, y, or z coordinate of the c values, and permutate 0 and 1 for the other two.
/// Fixing the x coordinate to 0 gives you the light from -x, 1 gives you the light from +x.
///
/// @param lights The light data for the 3x3x3 area.
/// @param interpolant The position within the center block.
/// @param c00..c11 4 offsets to determine which "direction" we are averaging.
/// @param oppositeMask A bitmask telling this function which bit to flip to get the opposite index for a given corner
vec3 _flw_lightForDirection(uint[27] lights, vec3 interpolant, uint c00, uint c01, uint c10, uint c11, uint oppositeMask) {
// Sum up the light and number of valid blocks in each corner for this direction
uint[8] summed;
// @formatter:off
#define _FLW_SUM_CORNER(_x, _y, _z, i) { \
const uint corner = _flw_index3x3x3(_x, _y, _z); \
summed[i] = lights[c00 + corner] + lights[c01 + corner] + lights[c10 + corner] + lights[c11 + corner]; \
}
_FLW_SUM_CORNER(0u, 0u, 0u, 0)
_FLW_SUM_CORNER(1u, 0u, 0u, 1)
_FLW_SUM_CORNER(0u, 0u, 1u, 2)
_FLW_SUM_CORNER(1u, 0u, 1u, 3)
_FLW_SUM_CORNER(0u, 1u, 0u, 4)
_FLW_SUM_CORNER(1u, 1u, 0u, 5)
_FLW_SUM_CORNER(0u, 1u, 1u, 6)
_FLW_SUM_CORNER(1u, 1u, 1u, 7)
// @formatter:on
// The final light and number of valid blocks for each corner.
vec3[8] adjusted;
#ifdef _FLW_INNER_FACE_CORRECTION
// If the current corner has no valid blocks, use the opposite
// corner's light based on which direction we're evaluating.
// Because of how our corners are indexed, moving along one axis is the same as flipping a bit.
#define _FLW_CORNER_INDEX(i) ((summed[i] & _FLW_UPPER_10_BITS) == 0u ? i ^ oppositeMask : i)
#else
#define _FLW_CORNER_INDEX(i) i
#endif
// Division and branching (to avoid dividing by zero) are both kinda expensive, so use this table for the valid block normalization
const float[5] normalizers = float[](0., 1., 1. / 2., 1. / 3., 1. / 4.);
// @formatter:off
#define _FLW_ADJUST_CORNER(i) { \
uint corner = summed[_FLW_CORNER_INDEX(i)]; \
uint validCount = corner >> 20u; \
adjusted[i].xy = vec2(corner & _FLW_LOWER_10_BITS, (corner >> 10u) & _FLW_LOWER_10_BITS) * normalizers[validCount]; \
adjusted[i].z = float(validCount); \
}
_FLW_ADJUST_CORNER(0)
_FLW_ADJUST_CORNER(1)
_FLW_ADJUST_CORNER(2)
_FLW_ADJUST_CORNER(3)
_FLW_ADJUST_CORNER(4)
_FLW_ADJUST_CORNER(5)
_FLW_ADJUST_CORNER(6)
_FLW_ADJUST_CORNER(7)
// @formatter:on
// Trilinear interpolation, including valid count
vec3 light00 = mix(adjusted[0], adjusted[1], interpolant.x);
vec3 light01 = mix(adjusted[2], adjusted[3], interpolant.x);
vec3 light10 = mix(adjusted[4], adjusted[5], interpolant.x);
vec3 light11 = mix(adjusted[6], adjusted[7], interpolant.x);
vec3 light0 = mix(light00, light01, interpolant.z);
vec3 light1 = mix(light10, light11, interpolant.z);
vec3 light = mix(light0, light1, interpolant.y);
// Normalize the light coords
light.xy *= _FLW_LIGHT_NORMALIZER;
// Calculate the AO multiplier from the number of valid blocks
light.z = _flw_validCountToAo(light.z);
return light;
}
bool flw_light(uint scene, vec3 worldPos, vec3 normal, ivec3 renderOrigin, out FlwLightAo light) {
// Always use the section of the block we are contained in to ensure accuracy.
// We don't want to interpolate between sections, but also we might not be able
// to rely on the existence neighboring sections, so don't do any extra rounding here.
ivec3 blockPos = ivec3(floor(worldPos)) + renderOrigin;
uint lightSectionIndex;
if (_flw_chunkCoordToSectionIndex(scene, blockPos >> 4, lightSectionIndex)) {
return false;
}
// The offset of the section in the light buffer.
uint sectionOffset = lightSectionIndex * _FLW_LIGHT_SECTION_SIZE_INTS;
// The block's position in the section adjusted into 18x18x18 space
ivec3 blockInSectionPos = (blockPos & 0xF) + 1;
// Directly trilerp as if sampling a texture
#if _FLW_LIGHT_SMOOTHNESS == 1
// The lowest corner of the 2x2x2 area we'll be trilinear interpolating.
// The ugly bit on the end evaluates to -1 or 0 depending on which side of 0.5 we are.
uvec3 lowestCorner = blockInSectionPos + ivec3(floor(fract(worldPos) - 0.5));
// The distance our fragment is from the center of the lowest corner.
vec3 interpolant = fract(worldPos - 0.5);
// Fetch everything for trilinear interpolation
// Hypothetically we could re-order these and do some calculations in-between fetches
// to help with latency hiding, but the compiler should be able to do that for us.
vec2 light000 = vec2(_flw_lightAt(sectionOffset, lowestCorner));
vec2 light100 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(1, 0, 0)));
vec2 light001 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(0, 0, 1)));
vec2 light101 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(1, 0, 1)));
vec2 light010 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(0, 1, 0)));
vec2 light110 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(1, 1, 0)));
vec2 light011 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(0, 1, 1)));
vec2 light111 = vec2(_flw_lightAt(sectionOffset, lowestCorner + uvec3(1, 1, 1)));
vec2 light00 = mix(light000, light001, interpolant.z);
vec2 light01 = mix(light010, light011, interpolant.z);
vec2 light10 = mix(light100, light101, interpolant.z);
vec2 light11 = mix(light110, light111, interpolant.z);
vec2 light0 = mix(light00, light01, interpolant.y);
vec2 light1 = mix(light10, light11, interpolant.y);
light.light = mix(light0, light1, interpolant.x) * _FLW_LIGHT_NORMALIZER;
light.ao = 1.;
// Lighting and AO accurate to chunk baking
#elif _FLW_LIGHT_SMOOTHNESS == 2
uint solid = _flw_fetchSolid3x3x3(sectionOffset, blockInSectionPos);
if (solid == _FLW_COMPLETELY_SOLID) {
// No point in doing any work if the entire 3x3x3 volume around us is filled.
// Kinda rare but this may happen if our fragment is in the middle of a lot of tinted glass
light.light = vec2(0.);
light.ao = _flw_validCountToAo(0.);
return true;
}
// Fetch everything in a 3x3x3 area centered around the block.
uint[27] lights = _flw_fetchLight3x3x3(sectionOffset, blockInSectionPos, solid);
vec3 interpolant = fract(worldPos);
// Average the light in relevant directions at each corner, skipping directions that would have no influence
vec3 lightX;
if (normal.x > _FLW_EPSILON) {
lightX = _flw_lightForDirection(lights, interpolant, _flw_index3x3x3(1u, 0u, 0u), _flw_index3x3x3(1u, 0u, 1u), _flw_index3x3x3(1u, 1u, 0u), _flw_index3x3x3(1u, 1u, 1u), 1u);
} else if (normal.x < -_FLW_EPSILON) {
lightX = _flw_lightForDirection(lights, interpolant, _flw_index3x3x3(0u, 0u, 0u), _flw_index3x3x3(0u, 0u, 1u), _flw_index3x3x3(0u, 1u, 0u), _flw_index3x3x3(0u, 1u, 1u), 1u);
} else {
lightX = vec3(0.);
}
vec3 lightZ;
if (normal.z > _FLW_EPSILON) {
lightZ = _flw_lightForDirection(lights, interpolant, _flw_index3x3x3(0u, 0u, 1u), _flw_index3x3x3(0u, 1u, 1u), _flw_index3x3x3(1u, 0u, 1u), _flw_index3x3x3(1u, 1u, 1u), 2u);
} else if (normal.z < -_FLW_EPSILON) {
lightZ = _flw_lightForDirection(lights, interpolant, _flw_index3x3x3(0u, 0u, 0u), _flw_index3x3x3(0u, 1u, 0u), _flw_index3x3x3(1u, 0u, 0u), _flw_index3x3x3(1u, 1u, 0u), 2u);
} else {
lightZ = vec3(0.);
}
vec3 lightY;
if (normal.y > _FLW_EPSILON) {
lightY = _flw_lightForDirection(lights, interpolant, _flw_index3x3x3(0u, 1u, 0u), _flw_index3x3x3(0u, 1u, 1u), _flw_index3x3x3(1u, 1u, 0u), _flw_index3x3x3(1u, 1u, 1u), 4u);
} else if (normal.y < -_FLW_EPSILON) {
lightY = _flw_lightForDirection(lights, interpolant, _flw_index3x3x3(0u, 0u, 0u), _flw_index3x3x3(0u, 0u, 1u), _flw_index3x3x3(1u, 0u, 0u), _flw_index3x3x3(1u, 0u, 1u), 4u);
} else {
lightY = vec3(0.);
}
vec3 n2 = normal * normal;
vec3 lightAo = lightX * n2.x + lightY * n2.y + lightZ * n2.z;
light.light = lightAo.xy;
light.ao = lightAo.z;
// Entirely flat lighting, the lowest setting and a fallback in case an invalid option is set
#else
light.light = vec2(_flw_lightAt(sectionOffset, blockInSectionPos)) * _FLW_LIGHT_NORMALIZER;
light.ao = 1.;
#endif
return true;
}
@@ -0,0 +1,28 @@
void flw_shaderLight() {
vec2 embeddedLight;
uint sceneId = 0;
vec4 vertexLightingPos;
ivec3 renderOrigin;
#ifdef FLW_EMBEDDED
renderOrigin = flw_renderOrigin;
sceneId = flw_vertexLightingSceneId;
vertexLightingPos = flw_vertexLightingPos;
if (sceneId != 0) {
renderOrigin = ivec3(0);
}
#else
renderOrigin = flw_renderOrigin;
vertexLightingPos = flw_vertexPos;
#endif
if (flw_lightFetch(sceneId, ivec3(floor(vertexLightingPos.xyz)) + renderOrigin, embeddedLight)) {
flw_fragLight = max(flw_fragLight, embeddedLight);
}
#ifdef FLW_EMBEDDED
flw_fragLight.y *= flw_skyLightScale;
#endif
}
@@ -0,0 +1,31 @@
void flw_shaderLight() {
uint sceneId = 0;
vec4 vertexLightingPos;
ivec3 renderOrigin;
#ifdef FLW_EMBEDDED
renderOrigin = flw_renderOrigin;
sceneId = flw_vertexLightingSceneId;
vertexLightingPos = flw_vertexLightingPos;
if (sceneId != 0) {
renderOrigin = ivec3(0);
}
#else
renderOrigin = flw_renderOrigin;
vertexLightingPos = flw_vertexPos;
#endif
FlwLightAo light;
if (flw_light(sceneId, vertexLightingPos.xyz, flw_vertexNormal, renderOrigin, light)) {
flw_fragLight = max(flw_fragLight, light.light);
if (flw_material.ambientOcclusion) {
flw_fragColor.rgb *= light.ao;
}
}
#ifdef FLW_EMBEDDED
flw_fragLight.y *= flw_skyLightScale;
#endif
}
@@ -0,0 +1,20 @@
void flw_shaderLight() {
#ifdef FLW_EMBEDDED
ivec3 renderOrigin = flw_renderOrigin;
if (flw_vertexLightingSceneId != 0) {
renderOrigin = ivec3(0);
}
FlwLightAo light;
if (flw_light(flw_vertexLightingSceneId, flw_vertexLightingPos.xyz, flw_vertexNormal, renderOrigin, light)) {
flw_fragLight = max(flw_fragLight, light.light);
if (flw_material.ambientOcclusion) {
flw_fragColor.rgb *= light.ao;
}
}
flw_fragLight.y *= flw_skyLightScale;
#endif
}
@@ -0,0 +1,148 @@
{
"menu.savingSubLevels": "Saving sub-levels",
"commands.sable.helper.missing_sub_level_container": "Couldn't find sub-level container for this level!",
"commands.sable.helper.missing_physics_system": "Couldn't find sub-level physics system for this level!",
"commands.sable.sub_level": "sub-level",
"commands.sable.sub_levels": "%s sub-levels",
"commands.sable.physics.global": "global",
"commands.sable.physics.local": "local",
"commands.sable.spawn.success": "Spawned %s",
"commands.sable.spawn.clone.success": "Cloned sublevel",
"commands.sable.physics.impulse.angular.success": "Applied %s angular impulse to %s of %s",
"commands.sable.physics.impulse.linear.success": "Applied %s linear impulse to %s of %s",
"commands.sable.physics.rotation.add.success": "Added %s rotation to %s of %s",
"commands.sable.physics.rotation.set.success": "Set rotation of %s to %s",
"commands.sable.physics.translation.add.success": "Added %s translation to %s of %s",
"commands.sable.physics.translation.set.success": "Set translation of %s to %s",
"commands.sable.joint.missing_sublevel_target": "Failed to find sub-level for joint",
"commands.sable.joint.success": "Successfully created joint",
"commands.sable.sub_level.set_name.success_singular": "Set name of sub-level to %s",
"commands.sable.sub_level.set_name.success_multiple": "Set name of %s sub-levels to %s",
"commands.sable.sub_level.get_name.success": "Name of sub-level is %s",
"commands.sable.sub_level.get_name.failure_unnamed": "Sub-level has no name",
"commands.sable.sub_level.clear_name.success_singular": "Cleared name of sub-level",
"commands.sable.sub_level.clear_name.success_multiple": "Cleared name of %s sub-levels",
"commands.sable.sub_level.teleport_with_orientation.success": "Teleported %s to %.2f, %.2f, %.2f facing %.2f, %.2f",
"commands.sable.sub_level.teleport.success": "Teleported %s to %.2f, %.2f, %.2f",
"commands.sable.sub_level.remove.success": "Removed %s",
"commands.sable.sub_level.assemble.no_blocks": "Couldn't assemble sub-level, no valid blocks found",
"commands.sable.sub_level.assemble.connected.too_many_blocks": "Couldn't assemble sub-level, too many blocks (maximum %s)",
"commands.sable.sub_level.shatter.no_blocks": "Couldn't shatter into sub-levels, no valid blocks found",
"commands.sable.sub_level.shatter.connected.too_many_blocks": "Couldn't shatter into sub-levels, too many blocks (maximum %s)",
"commands.sable.sub_level.shatter.region.success": "Shattered a region with %s blocks into new sub-levels",
"commands.sable.sub_level.shatter.connected.success": "Shattered %s connected blocks into new sub-levels",
"commands.sable.sub_level.shatter.range.success": "Shattered a range with %s blocks into new sub-levels",
"commands.sable.sub_level.shatter.radius.success": "Shattered a radius with %s blocks into new sub-levels",
"commands.sable.sub_level.shatter.sub_level.success": "Shattered %s into %s new sub-levels",
"commands.sable.sub_level.shatter.sub_level.only_single_block": "Can't shatter single-block sub-levels",
"commands.sable.sub_level.assemble.region.success": "Assembled a region %s blocks to a new sub-level",
"commands.sable.sub_level.assemble.connected.success": "Assembled %s connected blocks to a new sub-level",
"commands.sable.sub_level.assemble.radius.success": "Assembled a radius with %s blocks to a new sub-level",
"commands.sable.sub_level.assemble.range.success": "Assembled a range with %s blocks to a new sub-level",
"commands.sable.physics.paused.success": "Set physics paused to be %s",
"commands.sable.physics.paused_toggled.success": "Toggled physics paused to be %s",
"commands.sable.place_schematic.failure": "Couldn't find schematic!",
"commands.sable.place_schematic.success": "Placed schematic!",
"commands.sable.fail.not_inside_sub_level": "Position outside of sub-level plot",
"commands.sable.fail.no_sub_levels": "No sub-levels found",
"commands.sable.fail.unmodified": "No sub-levels were modified",
"commands.sable.fail.no_axis_for_rotation": "No axis for rotation",
"commands.sable.info.count": "Found %s sub-levels:",
"commands.sable.info.name": "%s:",
"commands.sable.info.name.tooltip": "Serialization Pointer: %s",
"commands.sable.info.position": " Position: %.2f %.2f %.2f",
"commands.sable.info.orientation": " Orientation: %.2f %.2f %.2f %.2f",
"commands.sable.info.linear_velocity": " Linear Velocity: %.2f %.2f %.2f",
"commands.sable.info.angular_velocity": " Angular Velocity: %.2f %.2f %.2f",
"commands.sable.info.mass": " Mass: %.2f",
"commands.sable.info.world_bounds": " World Bounds: %.2f x %.2f x %.2f",
"commands.data.sub_level.get": "%s on sub-level %s after scale factor of %s is %s",
"commands.data.sub_level.modified": "Modified sub-level auxiliary data of %s",
"commands.data.sub_level.query": "%s has the following auxiliary sub-level data: %s",
"argument.sable.body.selector.all": "All sub-levels",
"argument.sable.body.selector.nearest": "Nearest sub-level",
"argument.sable.body.selector.random": "Random sub-level",
"argument.sable.body.selector.viewed": "Viewed sub-level",
"argument.sable.body.selector.latest": "Latest sub-level",
"argument.sable.body.selector.tracking": "Tracking sub-level",
"argument.sable.body.selector.inside": "Inside sub-level",
"argument.sable.body.static_world": "The static world",
"argument.sable.sub_level.modifier.distance": "Distance to sub-level",
"argument.sable.sub_level.modifier.x": "x position",
"argument.sable.sub_level.modifier.y": "y position",
"argument.sable.sub_level.modifier.z": "z position",
"argument.sable.sub_level.modifier.dx": "Sub-levels between x and x + dx",
"argument.sable.sub_level.modifier.dy": "Sub-levels between y and y + dy",
"argument.sable.sub_level.modifier.dz": "Sub-levels between z and z + dz",
"argument.sable.sub_level.modifier.vx": "x velocity",
"argument.sable.sub_level.modifier.vy": "y velocity",
"argument.sable.sub_level.modifier.vz": "z velocity",
"argument.sable.sub_level.modifier.speed": "Sub-level speed",
"argument.sable.sub_level.modifier.mass": "Sub-level weight",
"argument.sable.sub_level.modifier.volume": "Volume of sub-level bounding box",
"argument.sable.sub_level.modifier.width": "X axis size of sub-level bounding box",
"argument.sable.sub_level.modifier.height": "Y axis size of sub-level bounding box",
"argument.sable.sub_level.modifier.length": "Z axis size of sub-level bounding box",
"argument.sable.sub_level.modifier.limit": "Maximum number of sub-levels to return",
"argument.sable.sub_level.modifier.name": "Sub-level name",
"argument.sable.sub_level.modifier.sort": "Sort the sub-levels by distance",
"argument.sable.unexpected_end_of_input": "Unexpected end of input",
"argument.sable.single_sub_level_required": "Only one sub-level is allowed, but the provided selector allows more than one",
"argument.sable.sub_level.invalid": "Invalid sub-level selector",
"argument.sable.sub_level.expected_end_of_modifier": "Expected end of modifier",
"argument.sable.sub_level.expected_positive_integer": "Expected a positive integer",
"argument.sable.sub_level.expected_positive_decimal": "Expected a positive decimal",
"argument.sable.sub_level.expected_positive_range": "Expected a positive range",
"argument.sable.sub_level.expected_sorting": "Expected sorting type of either nearest or furthest",
"inspector.sable.sub_level_container.title": "Sub-level Container",
"attribute.name.player.sub_level_punch_strength": "Push Strength",
"attribute.name.player.sub_level_punch_cooldown": "Push Cooldown",
"options.sable_menu": "Sub-Level Settings... ",
"options.physics_steps": "Physics Steps",
"options.physics_steps_template": "%s steps / second",
"options.physics_steps.tooltip": "How many times the physics simulation is stepped in every second. Higher values will be significantly more performance intensive, but will have higher accuracy.",
"sub_level.toast.checkLog": "See log for more details",
"sub_level.toast.loadFailure": "Failed to load sub-level at %s",
"sub_level.toast.saveFailure": "Failed to save sub-level at %s",
"sub_level.toast.physicsFailure": "Physics failure for sub-level at %s",
"sub_level.toast.attemptingRecovery": "Attempting recovery",
"camera_type.sub_level_view": "Entering Contraption Camera",
"camera_type.sub_level_view_unlocked": "Entering Unlocked Contraption Camera",
"force_group.sable.gravity": "Gravity",
"force_group.sable.drag": "Drag",
"force_group.sable.levitation": "Levitation",
"force_group.sable.balloon_lift": "Balloon Lift",
"force_group.sable.propulsion": "Propulsion",
"force_group.sable.lift": "Lift",
"force_group.sable.magnetic_force": "Magnetic",
"schematic.sable.mirror_not_supported": "Cannot mirror schematics containing sub-levels!",
"death.attack.fall.from_sublevel": "%1$s fell from %2$s",
"sable.create.mechanical_arm.points_removed_sublevel_and_range": "%1$s selected interaction point(s) removed due to range limitations or not being anchored.",
"sable.create.remove.points_removed_sublevel" : "%1$s selected interaction point(s) removed due to not being anchored"
}
@@ -0,0 +1,61 @@
layout(location = 0) in vec3 QuadPosition;
layout(location = 1) in vec3 SableNormal;
layout(location = 2) in uvec2 SableData;
layout(std140) uniform SableSprites {
vec4 sableSprites[2 * SABLE_TEXTURE_CACHE_SIZE];
};
uniform mat4 SableTransform;
vec3 Position;
vec3 Normal;
vec4 Color;
vec2 UV0;
ivec2 UV2;
void _sable_unpack() {
uint vertexIndex = uint(gl_VertexID) & 0x3u;
// Packed data format:
// TTTTTTTTTTTTLLLLLLLLZZZZYYYYXXXX
// T = Texture ID
// L = Packed Light
// Z = Relative Z position
// Y = Relative Y position
// X = Relative X position
uint posX = SableData.x & 15u;
uint posY = (SableData.x >> 4) & 15u;
uint posZ = (SableData.x >> 8) & 15u;
uint packedLight = (SableData.x >> 12) & 255u;
uint textureId = SableData.x >> 20u;
// Packed data format:
// AAAAAAAAYYYYYYYYZZZZZZZZXXXXXXXX
// A = Ambient Occlusion
// Y = Section Y
// Z = Section Z
// X = Section X
uint xOffset = (SableData.y) & 0xFFu;
uint yOffset = (SableData.y >> 8) & 0xFFu;
uint zOffset = (SableData.y >> 16) & 0xFFu;
uint ambientOcclusion = (SableData.y >> (24u + (vertexIndex << 1u))) & 0x3u;
// 0,0 == 0b00
// 0,1 == 0b01
// 1,1 == 0b10
// 1,0 == 0b11
uint lower = uint(gl_VertexID) & 1u;
uint upper = (uint(gl_VertexID) >> 1) & 1u;
vec2 uv = vec2(float(upper), float(lower ^ upper));
uint textureOffset = vertexIndex << 3u;
vec4 textureU = sableSprites[(textureId << 1u)];
vec4 textureV = sableSprites[(textureId << 1u) + 1u];
Position = (SableTransform * vec4(QuadPosition + vec3(float((xOffset << 4u) + posX), float((yOffset << 4u) + posY), float((zOffset << 4u) + posZ)), 1.0)).xyz;
Normal = (SableTransform * vec4(SableNormal, 0.0)).xyz;
Color = vec4(1.0, 1.0, 1.0, 1.0) * vec4(vec3(1.0 - 0.2 * float(ambientOcclusion)), 1.0);
UV0 = vec2(textureU[vertexIndex], textureV[vertexIndex]);
UV2 = ivec2(packedLight & 0xF0u, (packedLight << 4) & 0xF0u);
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:end_stone"
]
}
@@ -0,0 +1,10 @@
{
"prevent_self_lift": true,
"scale_friction_with_gravity":true,
"lift_strength": 2,
"transition_speed": 2,
"slow_vertical_friction": 0.4,
"fast_vertical_friction": 0.02,
"slow_horizontal_friction": 0.3,
"fast_horizontal_friction": 0.01
}
@@ -0,0 +1,7 @@
{
"selector": "minecraft:bedrock",
"properties": {
"sable:mass": 1000.0
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:bouncy",
"properties": {
"sable:restitution": 0.5
}
}
@@ -0,0 +1,13 @@
{
"selector": "minecraft:end_stone_brick_slab",
"properties": {
"sable:floating_material": "sable:end_stone",
"sable:floating_scale": 0.5
},
"overrides": {
"type=double": {
"sable:floating_scale": 1.0
}
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:end_stones",
"properties": {
"sable:floating_material": "sable:end_stone"
}
}
@@ -0,0 +1,19 @@
{
"selector": "create:flywheel",
"properties": {
"sable:mass":4.0
},
"overrides":{
"axis=x": {
"sable:inertia": [2.25,1.125,1.125]
},
"axis=y": {
"sable:inertia": [1.125,2.25,1.125]
},
"axis=z": {
"sable:inertia": [1.125,1.125,2.25]
}
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:fragile",
"properties": {
"sable:fragile": true
}
}
@@ -0,0 +1,7 @@
{
"selector": "minecraft:grindstone",
"properties": {
"sable:friction": 0.05
}
}
@@ -0,0 +1,13 @@
{
"selector": "#sable:half_volume",
"properties": {
"sable:volume": 0.5
},
"overrides": {
"type=double": {
"sable:volume": 1.0
}
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:heavy",
"properties": {
"sable:mass": 2.0
}
}
@@ -0,0 +1,13 @@
{
"selector": "#sable:light",
"properties": {
"sable:mass": 0.5
},
"overrides": {
"type=double": {
"sable:mass": 1.0
}
}
}
@@ -0,0 +1,7 @@
{
"selector": "minecraft:mud",
"properties": {
"sable:friction": 0.25
}
}
@@ -0,0 +1,13 @@
{
"selector": "#sable:pistons",
"properties": {
"sable:mass": 1.0
},
"overrides": {
"extended=true": {
"sable:mass": 0.5
}
}
}
@@ -0,0 +1,13 @@
{
"selector": "#sable:quarter_volume",
"properties": {
"sable:volume": 0.25
},
"overrides": {
"type=double": {
"sable:volume": 0.5
}
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:slippery",
"properties": {
"sable:friction": 0.0
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:frictive",
"properties": {
"sable:friction": 1.65
}
}
@@ -0,0 +1,7 @@
{
"selector": "#sable:super_heavy",
"properties": {
"sable:mass": 4.0
}
}
@@ -0,0 +1,14 @@
{
"priority": 1001,
"selector": "#sable:super_light",
"properties": {
"sable:mass": 0.25
},
"overrides": {
"type=double": {
"sable:mass": 0.5
}
}
}
@@ -0,0 +1,14 @@
{
"replace": false,
"values": [
{ "id": "computercraft:monitor_normal", "required": false },
{ "id": "computercraft:monitor_advanced", "required": false },
{ "id": "computercraft:turtle_normal", "required": false },
{ "id": "computercraft:turtle_advanced", "required": false },
{ "id": "computercraft:computer_normal", "required": false },
{ "id": "computercraft:computer_advanced", "required": false },
{ "id": "computercraft:computer_command", "required": false }
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:slime_block"
]
}
@@ -0,0 +1,12 @@
{
"replace": false,
"values": [
"minecraft:repeater",
"minecraft:comparator",
{ "id": "create:powered_toggle_latch", "required": false },
{ "id": "create:powered_latch", "required": false },
{ "id": "create:pulse_timer", "required": false },
{ "id": "create:pulse_extender", "required": false },
{ "id": "create:pulse_repeater", "required": false }
]
}
@@ -0,0 +1,17 @@
{
"replace": false,
"values": [
"#c:end_stones",
"minecraft:end_stone_bricks",
"minecraft:end_stone_brick_stairs",
"minecraft:end_stone_brick_wall",
{ "id": "supplementaries:end_stone_lamp", "required": false },
{ "id": "architects_palette:choral_end_stone_bricks", "required": false },
{ "id": "architects_palette:cracked_end_stone_bricks", "required": false },
{ "id": "architects_palette:chiseled_end_stone_bricks", "required": false },
{ "id": "architects_palette:heavy_end_stone_bricks", "required": false },
{ "id": "architects_palette:heavy_cracked_end_stone_bricks", "required": false }
]
}
@@ -0,0 +1,13 @@
{
"replace": false,
"values": [
"#minecraft:leaves",
"minecraft:bamboo",
"minecraft:melon",
"minecraft:pumpkin",
"minecraft:cactus",
"minecraft:ice",
"minecraft:frosted_ice",
"minecraft:lily_pad"
]
}
@@ -0,0 +1,16 @@
{
"replace": false,
"values": [
"minecraft:soul_sand",
"minecraft:soul_soil",
"minecraft:honey_block",
"minecraft:cactus",
{ "id": "create:belt", "required": false },
{ "id": "architects_palette:tread_plate", "required": false },
{ "id": "architects_palette:tread_plate_slab", "required": false },
{ "id": "architects_palette:tread_plate_stairs", "required": false },
{ "id": "architects_palette:tread_plate_wall", "required": false }
]
}
@@ -0,0 +1,22 @@
{
"replace": false,
"values": [
"#minecraft:slabs",
"#minecraft:stairs",
{ "id": "decorative_blocks:chain", "required": false },
{ "id": "#decorative_blocks:palisades", "required": false },
{ "id": "quark:feeding_trough", "required": false },
{ "id": "#quark:vertical_slabs", "required": false },
{ "id": "#quark:hedges", "required": false },
{ "id": "supplementaries:blackboard", "required": false },
{ "id": "supplementaries:jar", "required": false },
{ "id": "#storagedrawers:half_drawers", "required": false },
{ "id": "#another_furniture:seats", "required": false }
]
}
@@ -0,0 +1,13 @@
{
"replace": false,
"values": [
"#c:stones",
"#c:cobblestones",
"minecraft:blackstone",
"minecraft:basalt",
"minecraft:smooth_basalt",
"minecraft:polished_basalt",
"minecraft:obsidian",
"minecraft:crying_obsidian"
]
}
@@ -0,0 +1,72 @@
{
"replace": false,
"values": [
"#minecraft:planks",
"#minecraft:logs",
"#minecraft:slabs",
"#minecraft:stairs",
"minecraft:piston_head",
"minecraft:barrel",
"minecraft:chest",
"#minecraft:bamboo_blocks",
"#c:clusters",
"#c:chests/wooden",
{ "id": "create:belt", "required": false },
{ "id": "create:track", "required": false },
{ "id": "create:nixie_tube", "required": false },
{ "id": "create:desk_bell", "required": false },
{ "id": "create:piston_extension_pole", "required": false },
{ "id": "create:turntable", "required": false },
{ "id": "create:andesite_funnel", "required": false },
{ "id": "create:brass_funnel", "required": false },
{ "id": "create:factory_gauge", "required": false },
{ "id": "create:display_link", "required": false },
{ "id": "create:stock_link", "required": false },
{ "id": "create:cardboard_block", "required": false },
{ "id": "create:bound_cardboard_block", "required": false },
{ "id": "create:andesite_encased_shaft", "required": false },
{ "id": "create:andesite_encased_cogwheel", "required": false },
{ "id": "create:andesite_encased_large_cogwheel", "required": false },
{ "id": "create:brass_encased_shaft", "required": false },
{ "id": "create:brass_encased_cogwheel", "required": false },
{ "id": "create:brass_encased_large_cogwheel", "required": false },
{ "id": "create:shaft", "required": false },
{ "id": "create:cogwheel", "required": false },
{ "id": "create:large_cogwheel", "required": false },
{ "id": "create:hand_crank", "required": false },
{ "id": "#create:valve_handles", "required": false },
{ "id": "#create:seats", "required": false },
{ "id": "farmersdelight:skillet", "required": false },
{ "id": "farmersdelight:cooking_pot", "required": false },
{ "id": "decorative_blocks:chain", "required": false },
{ "id": "#decorative_blocks:beams", "required": false },
{ "id": "#woodworks:wooden_boards", "required": false },
{ "id": "#quark:vertical_slabs", "required": false },
{ "id": "#quark:hollow_logs", "required": false },
{ "id": "supplementaries:blackboard", "required": false },
{ "id": "supplementaries:crystal_display", "required": false },
{ "id": "#supplementaries:presents", "required": false },
{ "id": "#supplementaries:trapped_presents", "required": false },
{ "id": "#architects_palette:boards", "required": false },
{ "id": "#storagedrawers:full_drawers", "required": false },
{ "id": "#storagedrawers:trim", "required": false },
{ "id": "#another_furniture:drawers", "required": false }
],
"remove": [
"#minecraft:wooden_slabs",
"#minecraft:wooden_stairs",
"#quark:wooden_vertical_slabs"
]
}
@@ -0,0 +1,6 @@
{
"values": [
"minecraft:piston",
"minecraft:sticky_piston"
]
}
@@ -0,0 +1,99 @@
{
"replace": false,
"values": [
"#minecraft:fences",
"#minecraft:fence_gates",
"#minecraft:trapdoors",
"#minecraft:doors",
"#minecraft:wool_carpets",
"#minecraft:candles",
"#c:glass_panes",
{ "id": "c:ladders", "required": false },
"minecraft:ladder",
"minecraft:iron_bars",
"#c:fence_gates",
"minecraft:cocoa",
"minecraft:moss_carpet",
"minecraft:bamboo",
"minecraft:sea_pickle",
"minecraft:chain",
"minecraft:lightning_rod",
"minecraft:flower_pot",
"minecraft:end_rod",
"minecraft:lantern",
"minecraft:soul_lantern",
{ "id": "create:clipboard", "required": false },
{ "id": "create:redstone_link", "required": false },
"#sable:diode",
{ "id": "create:andesite_ladder", "required": false },
{ "id": "create:copper_ladder", "required": false },
{ "id": "create:brass_ladder", "required": false },
{ "id": "create:andesite_bars", "required": false },
{ "id": "create:copper_bars", "required": false },
{ "id": "create:brass_bars", "required": false },
{ "id": "create:copycat_step", "required": false },
{ "id": "create:copycat_panel", "required": false },
{ "id": "#create:table_cloths", "required": false },
{ "id": "farmersdelight:cutting_board", "required": false },
{ "id": "farmersdelight:skillet", "required": false },
{ "id": "farmersdelight:cooking_pot", "required": false },
{ "id": "decorative_blocks:lattice", "required": false },
{ "id": "decorative_blocks:bar_panel", "required": false },
{ "id": "#decorative_blocks:seats", "required": false },
{ "id": "#decorative_blocks:supports", "required": false },
{ "id": "nomansland:tap", "required": false },
{ "id": "nomansland:spike_trap", "required": false },
{ "id": "nomansland:warding_effigy", "required": false },
{ "id": "quark:gold_bars", "required": false },
{ "id": "quark:iron_rod", "required": false },
{ "id": "quark:grate", "required": false },
{ "id": "quark:paper_wall", "required": false },
{ "id": "quark:paper_wall_big", "required": false },
{ "id": "quark:paper_wall_sakura", "required": false },
{ "id": "#quark:posts", "required": false },
{ "id": "supplementaries:stick", "required": false },
{ "id": "supplementaries:blaze_rod", "required": false },
{ "id": "supplementaries:gold_bars", "required": false },
{ "id": "supplementaries:gold_gate", "required": false },
{ "id": "supplementaries:iron_gate", "required": false },
{ "id": "supplementaries:wicker_fence", "required": false },
{ "id": "supplementaries:goblet", "required": false },
{ "id": "supplementaries:hourglass", "required": false },
{ "id": "supplementaries:flower_box", "required": false },
{ "id": "supplementaries:doormat", "required": false },
{ "id": "supplementaries:wind_vane", "required": false },
{ "id": "supplementaries:bamboo_spikes", "required": false },
{ "id": "supplementaries:crystal_display", "required": false },
{ "id": "#supplementaries:flags", "required": false },
{ "id": "#supplementaries:awnings", "required": false },
{ "id": "#supplementaries:globes", "required": false },
{ "id": "architects_palette:entwine_bars", "required": false },
{ "id": "architects_palette:sunmetal_bars", "required": false },
{ "id": "architects_palette:nether_brass_lantern", "required": false },
{ "id": "architects_palette:nether_brass_chain", "required": false },
{ "id": "architects_palette:hazard_sign", "required": false },
{ "id": "architects_palette:redstone_cage_lantern", "required": false },
{ "id": "architects_palette:glowstone_cage_lantern", "required": false },
{ "id": "architects_palette:algal_cage_lantern", "required": false },
{ "id": "#architects_palette:nubs", "required": false },
{ "id": "#another_furniture:shelves", "required": false },
{ "id": "#another_furniture:tables", "required": false },
{ "id": "#another_furniture:shutters", "required": false },
{ "id": "#another_furniture:flower_boxes", "required": false },
{ "id": "#another_furniture:curtains", "required": false },
{ "id": "#another_furniture:lamps", "required": false }
]
}
@@ -0,0 +1,13 @@
{
"replace": false,
"values": [
"#minecraft:ice",
{ "id": "architects_palette:polished_packed_ice", "required": false },
{ "id": "architects_palette:polished_packed_ice_slab", "required": false },
{ "id": "architects_palette:polished_packed_ice_stairs", "required": false },
{ "id": "architects_palette:polished_packed_ice_wall", "required": false },
{ "id": "architects_palette:chiseled_packed_ice", "required": false },
{ "id": "architects_palette:packed_ice_pillar", "required": false }
]
}
@@ -0,0 +1,14 @@
{
"replace": false,
"values": [
"#c:storage_blocks",
"#minecraft:anvil",
"minecraft:heavy_core"
],
"remove": [
{ "id": "create:cardboard_block", "required": false },
"minecraft:copper_block",
"minecraft:slime_block",
"minecraft:bone_block"
]
}
@@ -0,0 +1,118 @@
{
"replace": false,
"values": [
"#minecraft:wool",
"#minecraft:wooden_slabs",
"#minecraft:wooden_stairs",
"#minecraft:fences",
"#minecraft:fence_gates",
"#minecraft:trapdoors",
"#minecraft:doors",
"#minecraft:wool_carpets",
"#minecraft:leaves",
"#minecraft:saplings",
"#minecraft:candles",
"#c:glass_panes",
{ "id": "c:ladders", "required": false },
"minecraft:ladder",
"minecraft:iron_bars",
"#c:fence_gates",
"minecraft:cocoa",
"minecraft:lily_pad",
"minecraft:big_dripleaf",
"minecraft:turtle_egg",
"minecraft:moss_carpet",
"minecraft:snow",
"minecraft:bamboo",
"minecraft:sea_pickle",
"minecraft:chain",
"minecraft:lightning_rod",
"minecraft:flower_pot",
"minecraft:end_rod",
"minecraft:lantern",
"minecraft:soul_lantern",
"#sable:diode",
{ "id": "create:clipboard", "required": false },
{ "id": "create:redstone_link", "required": false },
{ "id": "create:andesite_ladder", "required": false },
{ "id": "create:copper_ladder", "required": false },
{ "id": "create:brass_ladder", "required": false },
{ "id": "create:andesite_bars", "required": false },
{ "id": "create:copper_bars", "required": false },
{ "id": "create:brass_bars", "required": false },
{ "id": "create:copycat_step", "required": false },
{ "id": "create:copycat_panel", "required": false },
{ "id": "#create:table_cloths", "required": false },
{ "id": "#create:windmill_sails", "required": false },
{ "id": "farmersdelight:cutting_board", "required": false },
{ "id": "#farmersdelight:straw_blocks", "required": false },
{ "id": "decorative_blocks:lattice", "required": false },
{ "id": "decorative_blocks:bar_panel", "required": false },
{ "id": "#decorative_blocks:seats", "required": false },
{ "id": "#decorative_blocks:supports", "required": false },
{ "id": "#decorative_blocks:palisades", "required": false },
{ "id": "nomansland:tap", "required": false },
{ "id": "nomansland:spike_trap", "required": false },
{ "id": "nomansland:warding_effigy", "required": false },
{ "id": "quark:gold_bars", "required": false },
{ "id": "quark:feeding_trough", "required": false },
{ "id": "quark:iron_rod", "required": false },
{ "id": "quark:grate", "required": false },
{ "id": "quark:paper_wall", "required": false },
{ "id": "quark:paper_wall_big", "required": false },
{ "id": "quark:paper_wall_sakura", "required": false },
{ "id": "quark:paper_lantern", "required": false },
{ "id": "quark:paper_lantern_sakura", "required": false },
{ "id": "#quark:wooden_vertical_slabs", "required": false },
{ "id": "#quark:posts", "required": false },
{ "id": "#quark:hedges", "required": false },
{ "id": "supplementaries:stick", "required": false },
{ "id": "supplementaries:blaze_rod", "required": false },
{ "id": "supplementaries:gold_bars", "required": false },
{ "id": "supplementaries:gold_gate", "required": false },
{ "id": "supplementaries:iron_gate", "required": false },
{ "id": "supplementaries:wicker_fence", "required": false },
{ "id": "supplementaries:goblet", "required": false },
{ "id": "supplementaries:hourglass", "required": false },
{ "id": "supplementaries:jar", "required": false },
{ "id": "supplementaries:flower_box", "required": false },
{ "id": "supplementaries:doormat", "required": false },
{ "id": "supplementaries:wind_vane", "required": false },
{ "id": "supplementaries:bamboo_spikes", "required": false },
{ "id": "#supplementaries:flags", "required": false },
{ "id": "#supplementaries:awnings", "required": false },
{ "id": "#supplementaries:globes", "required": false },
{ "id": "architects_palette:entwine_bars", "required": false },
{ "id": "architects_palette:sunmetal_bars", "required": false },
{ "id": "architects_palette:nether_brass_lantern", "required": false },
{ "id": "architects_palette:nether_brass_chain", "required": false },
{ "id": "architects_palette:hazard_sign", "required": false },
{ "id": "architects_palette:redstone_cage_lantern", "required": false },
{ "id": "architects_palette:glowstone_cage_lantern", "required": false },
{ "id": "architects_palette:algal_cage_lantern", "required": false },
{ "id": "#architects_palette:nubs", "required": false },
{ "id": "#storagedrawers:half_drawers", "required": false },
{ "id": "#another_furniture:seats", "required": false },
{ "id": "#another_furniture:shelves", "required": false },
{ "id": "#another_furniture:tables", "required": false },
{ "id": "#another_furniture:shutters", "required": false },
{ "id": "#another_furniture:flower_boxes", "required": false },
{ "id": "#another_furniture:curtains", "required": false },
{ "id": "#another_furniture:lamps", "required": false }
]
}
@@ -0,0 +1,10 @@
{
"replace": false,
"values": [
{ "id": "create:contraption", "required": false },
{ "id": "create:stationary_contraption", "required": false },
{ "id": "create:oriented_contraption", "required": false },
{ "id": "create:gantry_contraption", "required": false },
{ "id": "create:carriage_contraption", "required": false }
]
}
@@ -0,0 +1,12 @@
{
"replace": false,
"values": [
{ "id": "exposure:camera_stand", "required": false },
"minecraft:armor_stand",
"minecraft:minecart",
"minecraft:hopper_minecart",
"minecraft:chest_minecart",
"minecraft:furnace_minecart",
"minecraft:tnt_minecart"
]
}
@@ -0,0 +1,8 @@
{
"replace": false,
"values": [
"#sable:super_glue",
{ "id": "create:seat", "required": false },
"#sable:create_contraption"
]
}
@@ -0,0 +1,27 @@
{
"replace": false,
"values": [
"#sable:create_contraption",
"#sable:super_glue",
"#sable:wall_entities",
{ "id": "create:seat", "required": false },
{ "id": "blockbox:seat", "required": false },
{ "id": "botania:mana_burst", "required": false },
{ "id": "botania:corporea_burst", "required": false },
{ "id": "botania:spark", "required": false },
{ "id": "exposure:camera_stand", "required": false },
"minecraft:snow_golem",
"minecraft:armor_stand",
"minecraft:minecart",
"minecraft:hopper_minecart",
"minecraft:chest_minecart",
"minecraft:furnace_minecart",
"minecraft:tnt_minecart",
"minecraft:command_block_minecart",
"minecraft:block_display",
"minecraft:item_display",
"minecraft:text_display",
"minecraft:marker",
"minecraft:leash_knot"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
{ "id": "create:super_glue", "required": false }
]
}
@@ -0,0 +1,12 @@
{
"replace": false,
"values": [
"minecraft:painting",
"minecraft:item_frame",
"minecraft:glow_item_frame",
{ "id": "create:crafting_blueprint", "required": false },
{ "id": "exposure:glass_photograph_frame", "required": false },
{ "id": "exposure:photograph_frame", "required": false },
{ "id": "labels:label", "required": false }
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"#minecraft:shovels"
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 Sébastien Crozet
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
@@ -0,0 +1,2 @@
The natives in this folder are for Sable's Rapier physics pipeline.
They contain a slightly modified version of Rapier visible at https://github.com/ryanhcode/rapier (view LICENSE-RAPIER).
@@ -0,0 +1,174 @@
{
"required": true,
"package": "dev.ryanhcode.sable.neoforge.mixin",
"compatibilityLevel": "JAVA_21",
"minVersion": "0.8",
"mixinextras": {
"minVersion": "0.5.0"
},
"plugin": "dev.ryanhcode.sable.plugin.SableMixinPlugin",
"client": [
"block_entity_visible.LevelRendererMixin",
"block_outline_render.LevelRendererMixin",
"camera_rotation.CameraMixin",
"compatibility.create.behaviour_compatibility.harvester_block_entity.HarvesterRendererMixin",
"compatibility.create.belt.BeltRendererMixin",
"compatibility.create.big_outlines_interaction.BigOutlinesMixin",
"compatibility.create.blaze_burner.BlazeBurnerBlockEntityMixin",
"compatibility.create.contraptions.ContraptionControlsRendererMixin",
"compatibility.create.contraptions.ContraptionHandlerClientMixin",
"compatibility.create.contraptions.ContraptionVisualMixin",
"compatibility.create.contraptions.VisualizationEventHandlerMixin",
"compatibility.create.depot.DepotRendererMixin",
"compatibility.create.fluid_handling.PipeConnectionMixin",
"compatibility.create.frogports.ChainConveyorInteractionHandlerMixin",
"compatibility.create.frogports.ChainConveyorRidingHandlerMixin",
"compatibility.create.frogports.FrogportRendererMixin",
"compatibility.create.frogports.FrogportVisualMixin",
"compatibility.create.frogports.SmartBlockEntityRendererMixin",
"compatibility.create.particles.AirFlowParticleMixin",
"compatibility.create.particles.AirParticleMixin",
"compatibility.create.render_fixes.AABBOutlineMixin",
"compatibility.create.render_fixes.BeltRendererMixin",
"compatibility.create.render_fixes.BlockClusterOutlineMixin",
"compatibility.create.render_fixes.ChainConveyorRendererMixin",
"compatibility.create.render_fixes.ChasingAABBOutlineMixin",
"compatibility.create.render_fixes.ChasingAABBOutlinerMixin",
"compatibility.create.render_fixes.FilteringRendererMixin",
"compatibility.create.render_fixes.GhostBlockValueBoxMixin",
"compatibility.create.render_fixes.LineOutlineMixin",
"compatibility.create.render_fixes.LinkRendererMixin",
"compatibility.create.render_fixes.OutlineMixin",
"compatibility.create.render_fixes.PlacementClientMixin",
"compatibility.create.render_fixes.SafeBlockEntityRendererMixin",
"compatibility.create.render_fixes.ValueBoxMixin",
"compatibility.create.schematics.SchematicHandlerMixin",
"compatibility.create.schematics.SchematicRendererMixin",
"compatibility.create.schematics.SchematicTransformMixin",
"compatibility.create.stock_ticker.EntityHatsMixin",
"compatibility.create.tracks.TrackBlockOutlineMixin",
"compatibility.create.tracks.TrackTargetingClientMixin",
"compatibility.create.trains.CarriageContraptionVisualMixin",
"compatibility.create.wand_of_symmetry.SymmetryHandlerMixin",
"compatibility.flywheel.AbstractBlockEntityVisualMixin",
"compatibility.flywheel.BlockEntityStorageMixin",
"compatibility.flywheel.EmbeddedEnvironmentMixin",
"compatibility.flywheel.EngineImplMixin",
"compatibility.flywheel.EnvironmentStorageMixin",
"compatibility.flywheel.LightStorageAccessor",
"compatibility.flywheel.MatrixBufferMixin",
"compatibility.flywheel.RenderDispatcherImplMixin",
"compatibility.flywheel.ShaderSourcesMixin",
"compatibility.flywheel.VisualManagerImplMixin",
"compatibility.pmweather.RadarRendererMixin",
"compatibility.sodiumextras.EmbyToolsMixin",
"dynamic_directional_shading.SectionCompilerMixin",
"sound.MovingSoundInstanceDelegateMixin"
],
"mixins": [
"compatibility.backpacks.BackpackPickupEventsMixin",
"compatibility.create.airflow.AirCurrentMixin",
"compatibility.create.airflow.FanProcessingTypeMixin",
"compatibility.create.basin_interactions.BasinBlockEntityMixin",
"compatibility.create.basin_interactions.BasinOperatingBlockEntityMixin",
"compatibility.create.behaviour_compatibility.BlockEntityBehaviourMixin",
"compatibility.create.behaviour_compatibility.block_breaking_behaviour.BlockBreakingMovementBehaviourMixin",
"compatibility.create.behaviour_compatibility.block_breaking_behaviour.SawMovementBehaviourMixin",
"compatibility.create.behaviour_compatibility.harvester_behaviour.HarvesterMovementBehaviourMixin",
"compatibility.create.behaviour_compatibility.harvester_block_entity.HarvesterBlockEntityMixin",
"compatibility.create.behaviour_compatibility.harvester_block_entity.HarvesterBlockEntityUsageMixin",
"compatibility.create.behaviour_compatibility.harvester_block_entity.HarvesterBlockMixin",
"compatibility.create.belt.BeltBlockEntityMixin",
"compatibility.create.belt.BeltBlockMixin",
"compatibility.create.belt.BeltMovementHandlerMixin",
"compatibility.create.big_outlines_interaction.BigOutlinesMixin",
"compatibility.create.block_breakers.BlockBreakingKineticBlockEntityDamageMixin",
"compatibility.create.block_breakers.BlockBreakingKineticBlockEntityMixin",
"compatibility.create.blueprint.BlueprintEntityMixin",
"compatibility.create.chain_conveyor.ChainConveyorBlockEntityMixin",
"compatibility.create.chain_conveyor.ChainConveyorBlockMixin",
"compatibility.create.contraptions.AbstractContraptionEntityMixin",
"compatibility.create.contraptions.ContraptionColliderMixin",
"compatibility.create.contraptions.Matrix3dAccessor",
"compatibility.create.crushing_wheel.CrushingWheelBlockMixin",
"compatibility.create.crushing_wheel_entity_processing.CrushingWheelControllerBlockEntityMixin",
"compatibility.create.deployer.DeployerBlockEntityMixin",
"compatibility.create.display_link.ClickToLinkBlockItemMixin",
"compatibility.create.display_link.DisplayLinkBlockEntityMixin",
"compatibility.create.display_link.DisplayLinkBlockMixin",
"compatibility.create.ejector.EjectorBlockEntityMixin",
"compatibility.create.elevator_controls.ElevatorControlsHandlerMixin",
"compatibility.create.entity_falls_on_block.BasinBlockMixin",
"compatibility.create.entity_falls_on_block.BeltMillstoneBlocksMixin",
"compatibility.create.entity_falls_on_block.SawBlockMixin",
"compatibility.create.entity_falls_on_block.SeatBlockMixin",
"compatibility.create.factory_panel.FactoryPanelConnectionHandlerMixin",
"compatibility.create.fans_provide_force.EncasedFanBlockEntityMixin",
"compatibility.create.fluid_handling.OpenEndedPipeMixin",
"compatibility.create.fluid_tank_heating.BoilerDataMixin",
"compatibility.create.flywheel.FlywheelBlockEntityMixin",
"compatibility.create.frogports.ChainConveyorBlockEntityMixin",
"compatibility.create.frogports.ChainConveyorShapeAccessor",
"compatibility.create.frogports.ChainPackageInteractionHandlerMixin",
"compatibility.create.frogports.ChainPackageInteractionPacketMixin",
"compatibility.create.frogports.FrogportBlockEntityMixin",
"compatibility.create.frogports.FrogportBlockMixin",
"compatibility.create.frogports.PackagePortPlacementPacketMixin",
"compatibility.create.frogports.PackagePortTargetMixin",
"compatibility.create.frogports.PackagePortTargetSelectionHandlerMixin",
"compatibility.create.funnels.FunnelBlockMixin",
"compatibility.create.hose_pulley.HosePulleyBlockEntityMixin",
"compatibility.create.hose_pulley.HosePulleyFluidHandlerMixin",
"compatibility.create.impact.AbstractBellBlockAccessor",
"compatibility.create.impact.AbstractBellBlockMixin",
"compatibility.create.inventory_manipulation.CapManipulationBehaviourBaseMixin",
"compatibility.create.inventory_manipulation.ChuteBlockEntityMixin",
"compatibility.create.lectern_controller.LecternControllerBlockEntityMixin",
"compatibility.create.lectern_controller.LecternControllerBlockMixin",
"compatibility.create.mechnical_arm.MechanicalArmBlockEntity",
"compatibility.create.mechnical_arm.MechanicalArmSublevelFailure",
"compatibility.create.nozzle.NozzleBlockEntityAccessor",
"compatibility.create.nozzle.block_entity.NozzleBEFixesMixin",
"compatibility.create.nozzle.block_entity.NozzleHoveringMixin",
"compatibility.create.nozzle.block_entity.ValidNozzledirectionMixin",
"compatibility.create.raycast.RaycastHelperMixin",
"compatibility.create.redstone_contacts.AllBlockEntityTypesMixin",
"compatibility.create.redstone_contacts.RedstoneContactBlockMixin",
"compatibility.create.redstone_links.RedstoneLinkNetworkHandlerMixin",
"compatibility.create.sails_providing_lift.SailBlockMixin",
"compatibility.create.saw.SawBlockEntityMixin",
"compatibility.create.schematics.DeployToolMixin",
"compatibility.create.schematics.SchematicAndQuillHandlerMixin",
"compatibility.create.schematics.SchematicExportMixin",
"compatibility.create.schematics.SchematicLevelMixin",
"compatibility.create.schematics.SchematicPlacePacketMixin",
"compatibility.create.schematics.SchematicPrinterMixin",
"compatibility.create.schematics.SchematicToolBaseMixin",
"compatibility.create.schematics.StructureTemplateMixin",
"compatibility.create.sticker.StickerBlockEntityMixin",
"compatibility.create.sticker.StickerBlockMixin",
"compatibility.create.stock_ticker.StockTickerInteractionHandlerMixin",
"compatibility.create.super_glue.LevelAccessor",
"compatibility.create.super_glue.SuperGlueEntityMixin",
"compatibility.create.super_glue.SuperGlueRemovalPacketMixin",
"compatibility.create.super_glue.SuperGlueSelectionHandlerMixin",
"compatibility.create.toolbox.ToolBoxClientHandlerMixin",
"compatibility.create.toolbox.ToolboxHandlerMixin",
"compatibility.create.tracks.CurvedTrackDestroyPacketMixin",
"compatibility.create.tracks.TrackBlockItemMixin",
"compatibility.create.tracks.TrackBlockMixin",
"compatibility.create.tracks.TrackGraphVisualizerMixin",
"compatibility.create.tracks.TrackPlacementMixin",
"compatibility.create.turntable.TurntableBlockMixin",
"compatibility.create.vertical_gearbox.VerticalGearboxItemMixin",
"compatibility.create.zapper.ZapperItemMixin",
"compatibility.pmweather.AnemometerBlockEntityMixin",
"compatibility.pmweather.AnemometerBlockMixin",
"compatibility.pmweather.PMWeatherMixin",
"entities_stick_sublevels.effects.LivingEntityMixin",
"entity.entity_swimming.EntityMixin"
],
"injectors": {
"defaultRequire": 1
}
}
@@ -0,0 +1,118 @@
accessWidener v2 named
accessible class net/minecraft/client/multiplayer/ClientChunkCache$Storage
accessible field net/minecraft/server/level/ChunkHolder fullChunkFuture Ljava/util/concurrent/CompletableFuture;
accessible field net/minecraft/server/level/ChunkHolder tickingChunkFuture Ljava/util/concurrent/CompletableFuture;
accessible field net/minecraft/server/level/ChunkHolder entityTickingChunkFuture Ljava/util/concurrent/CompletableFuture;
accessible class net/minecraft/server/level/ServerChunkCache$ChunkAndHolder
accessible method net/minecraft/server/level/ServerChunkCache$ChunkAndHolder <init> (Lnet/minecraft/world/level/chunk/LevelChunk;Lnet/minecraft/server/level/ChunkHolder;)V
accessible field net/minecraft/server/network/ServerCommonPacketListenerImpl connection Lnet/minecraft/network/Connection;
accessible field net/minecraft/server/level/ChunkMap updatingChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap;
accessible field net/minecraft/server/level/ChunkMap visibleChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap;
accessible field net/minecraft/server/level/ChunkLevel ENTITY_TICKING_LEVEL I
accessible field net/minecraft/server/level/ChunkLevel BLOCK_TICKING_LEVEL I
accessible method net/minecraft/server/network/PlayerChunkSender sendChunk (Lnet/minecraft/server/network/ServerGamePacketListenerImpl;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/LevelChunk;)V
accessible field net/minecraft/world/level/ClipContext block Lnet/minecraft/world/level/ClipContext$Block;
accessible field net/minecraft/world/level/ClipContext fluid Lnet/minecraft/world/level/ClipContext$Fluid;
accessible field net/minecraft/world/level/ClipContext collisionContext Lnet/minecraft/world/phys/shapes/CollisionContext;
accessible method net/minecraft/server/level/ChunkMap onFullChunkStatusChange (Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/server/level/FullChunkStatus;)V
accessible field net/minecraft/client/particle/Particle xo D
accessible field net/minecraft/client/particle/Particle yo D
accessible field net/minecraft/client/particle/Particle zo D
accessible field net/minecraft/client/particle/Particle x D
accessible field net/minecraft/client/particle/Particle y D
accessible field net/minecraft/client/particle/Particle z D
accessible field net/minecraft/world/level/lighting/LevelLightEngine blockEngine Lnet/minecraft/world/level/lighting/LightEngine;
accessible field net/minecraft/world/level/lighting/LevelLightEngine skyEngine Lnet/minecraft/world/level/lighting/LightEngine;
accessible method net/minecraft/server/level/ThreadedLevelLightEngine runUpdate ()V
extendable method net/minecraft/server/level/GenerationChunkHolder rescheduleChunkTask (Lnet/minecraft/server/level/ChunkMap;Lnet/minecraft/world/level/chunk/status/ChunkStatus;)V
accessible method net/minecraft/server/level/ThreadedLevelLightEngine updateChunkStatus (Lnet/minecraft/world/level/ChunkPos;)V
accessible field net/minecraft/client/renderer/block/BlockRenderDispatcher modelRenderer Lnet/minecraft/client/renderer/block/ModelBlockRenderer;
accessible class net/minecraft/client/renderer/block/ModelBlockRenderer$AmbientOcclusionFace
accessible field net/minecraft/client/renderer/RenderStateShard name Ljava/lang/String;
# Assembly
accessible method net/minecraft/world/entity/decoration/HangingEntity calculateSupportBox ()Lnet/minecraft/world/phys/AABB;
# Directional Shading
accessible field net/minecraft/client/renderer/block/ModelBlockRenderer CACHE Ljava/lang/ThreadLocal;
accessible class net/minecraft/client/renderer/block/ModelBlockRenderer$Cache
# UDP Networking
accessible field net/minecraft/network/Connection channel Lio/netty/channel/Channel;
# Serialization
accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/io/File;
accessible method net/minecraft/server/level/ChunkMap getChunks ()Ljava/lang/Iterable;
accessible method net/minecraft/server/level/ChunkMap scheduleUnload (JLnet/minecraft/server/level/ChunkHolder;)V
accessible field net/minecraft/server/level/ChunkMap toDrop Lit/unimi/dsi/fastutil/longs/LongSet;
accessible field net/minecraft/server/level/ChunkMap modified Z
accessible field net/minecraft/server/level/ChunkMap unloadQueue Ljava/util/Queue;
accessible method net/minecraft/server/level/ChunkMap saveChunkIfNeeded (Lnet/minecraft/server/level/ChunkHolder;)Z
accessible field net/minecraft/server/level/ChunkMap chunkSaveCooldowns Lit/unimi/dsi/fastutil/longs/Long2LongMap;
# Shadows
accessible field net/minecraft/client/renderer/ShaderInstance samplerLocations Ljava/util/List;
# Particles
accessible field net/minecraft/client/particle/Particle xd D
accessible field net/minecraft/client/particle/Particle yd D
accessible field net/minecraft/client/particle/Particle zd D
# Attributes
accessible field net/minecraft/world/entity/ai/attributes/AttributeSupplier instances Ljava/util/Map;
mutable field net/minecraft/world/entity/ai/attributes/AttributeSupplier instances Ljava/util/Map;
# Entity Storage
accessible field net/minecraft/server/level/ServerLevel entityManager Lnet/minecraft/world/level/entity/PersistentEntitySectionManager;
accessible field net/minecraft/world/level/entity/PersistentEntitySectionManager sectionStorage Lnet/minecraft/world/level/entity/EntitySectionStorage;
# Lithum Compat
accessible class net/minecraft/server/level/ServerChunkCache$MainThreadExecutor
# Entity Kicking
accessible field net/minecraft/world/entity/Entity levelCallback Lnet/minecraft/world/level/entity/EntityInLevelCallback;
# Distance Manager
accessible class net/minecraft/server/level/ChunkMap$DistanceManager
# Gizmo
accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)D
# Sub-Level rendering
accessible method net/minecraft/client/renderer/chunk/SectionRenderDispatcher$RenderSection updateGlobalBlockEntities (Ljava/util/Collection;)V
accessible method net/minecraft/client/renderer/chunk/SectionRenderDispatcher$RenderSection setCompiled (Lnet/minecraft/client/renderer/chunk/SectionRenderDispatcher$CompiledSection;)V
accessible field net/minecraft/client/renderer/LevelRenderer cullingFrustum Lnet/minecraft/client/renderer/culling/Frustum;
accessible field net/minecraft/client/renderer/chunk/SectionRenderDispatcher bufferPool Lnet/minecraft/client/renderer/SectionBufferBuilderPool;
mutable field net/minecraft/client/renderer/chunk/SectionRenderDispatcher bufferPool Lnet/minecraft/client/renderer/SectionBufferBuilderPool;
# Entity Getting
accessible method net/minecraft/world/level/Level getEntities ()Lnet/minecraft/world/level/entity/LevelEntityGetter;
# Respawning
accessible class net/minecraft/server/level/ServerPlayer$RespawnPosAngle
accessible method net/minecraft/server/level/ServerPlayer$RespawnPosAngle <init> (Lnet/minecraft/world/phys/Vec3;F)V
accessible method net/minecraft/server/level/ServerPlayer findRespawnAndUseSpawnBlock (Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;FZZ)Ljava/util/Optional;
# Entity Riding
accessible method net/minecraft/world/entity/LivingEntity dismountVehicle (Lnet/minecraft/world/entity/Entity;)V
accessible field net/minecraft/world/entity/Entity removalReason Lnet/minecraft/world/entity/Entity$RemovalReason;
extendable method net/minecraft/world/entity/Entity getEyePosition (F)Lnet/minecraft/world/phys/Vec3;
extendable method net/minecraft/world/entity/Entity setRemoved (Lnet/minecraft/world/entity/Entity$RemovalReason;)V
#Abstract hurting projectile accel
accessible field net/minecraft/world/entity/projectile/AbstractHurtingProjectile accelerationPower D
@@ -0,0 +1,223 @@
{
"required": true,
"package": "dev.ryanhcode.sable.mixin",
"compatibilityLevel": "JAVA_21",
"minVersion": "0.8",
"plugin": "dev.ryanhcode.sable.plugin.SableMixinPlugin",
"client": [
"block_decal_render.LevelRendererMixin",
"camera.camera_rotation.CompassItemPropertyFunctionMixin",
"camera.camera_rotation.EntityMixin",
"camera.camera_rotation.GuiMixin",
"camera.camera_zoom.CameraMixin",
"camera.camera_zoom.MouseHandlerMixin",
"camera.new_camera_types.CameraTypeMixin",
"camera.new_camera_types.GameRendererMixin",
"camera.new_camera_types.MinecraftMixin",
"clip_overwrite.ClientLevelMixin",
"clip_overwrite.GameRendererMixin",
"compatibility.iris.ExtendedShaderMixin",
"config.GameRendererAccessor",
"debug_render.DebugRendererMixin",
"debug_render.DebugScreenOverlayMixin",
"debug_render.LevelRendererMixin",
"dynamic_directional_shading.AmbientOcclusionFaceMixin",
"dynamic_directional_shading.ModelBlockRendererCacheMixin",
"dynamic_directional_shading.ModelBlockRendererMixin",
"entity.entities_stick_sublevels.ClientPacketListenerMixin",
"entity.entities_stick_sublevels.EntityRenderDispatcherMixin",
"entity.entities_stick_sublevels.effects.LocalPlayerMixin",
"entity.entities_stick_sublevels.player.LocalPlayerMixin",
"entity.entities_stick_sublevels.player.RemotePlayerMixin",
"entity.entities_turn_with_sub_levels.GameRendererMixin",
"entity.entity_leashing.EntityRendererMixin",
"entity.entity_rendering.EntityRendererMixin",
"entity.entity_rendering.LevelRendererMixin",
"entity.entity_rendering.shadows.EntityRenderDispatcherMixin",
"entity.entity_rotations_and_riding.ClientPacketListenerMixin",
"entity.entity_rotations_and_riding.EntityRenderDispatcherMixin",
"entity.entity_rotations_and_riding.EntityRendererMixin",
"entity.entity_rotations_and_riding.LocalPlayerMixin",
"entity.entity_sublevel_collision.CameraMixin",
"entity.entity_swimming.CameraMixin",
"options.OptionsScreenMixin",
"particle.BlockMarkerMixin",
"particle.ClientLevelMixin",
"particle.FlameParticleMixin",
"particle.LevelRendererMixin",
"particle.ParticleEngineMixin",
"particle.ParticleMixin",
"particle.SuspendedParticleMixin",
"particle.TerrainParticleMixin",
"player_freezing.LocalPlayerMixin",
"plot.ClientChunkCacheMixin",
"plot.MinecraftMixin",
"plot.lighting.ClientPacketListenerMixin",
"plot.lighting.RenderChunkRegionMixin",
"punching.MinecraftMixin",
"punching.MultiPlayerGameModeMixin",
"respawn_point.sleeping.LivingEntityRendererMixin",
"sky_light_shadow.LevelRendererMixin",
"stop_rain.LevelRenderMixin",
"sublevel_render.BlockEntityRenderDispatcherMixin",
"sublevel_render.LevelRendererMixin",
"sublevel_render.RenderSectionAccessor",
"sublevel_render.RenderSectionMixin",
"sublevel_render.block_entity_render.LevelRendererMixin",
"sublevel_render.fancy.ProgramMixin",
"sublevel_render.impl.sodium.LevelRendererMixin",
"sublevel_render.impl.sodium.SodiumWorldRendererMixin",
"sublevel_render.impl.vanilla.LevelRendererMixin",
"sublevel_render.impl.vanilla.ViewAreaMixin",
"sublevel_render.impl.vanilla.water_occlusion.LevelRendererMixin",
"sublevel_sounds.AbstractSoundInstanceMixin",
"sublevel_sounds.ChannelAccessor",
"sublevel_sounds.ClientLevelMixin",
"sublevel_sounds.SoundEngineMixin",
"toast.IntegratedServerMixin",
"water_occlusion.CameraMixin",
"water_occlusion.FogRendererMixin",
"water_occlusion.GameRendererMixin"
],
"mixins": [
"assembly.AbstractFurnaceBlockEntityMixin",
"block_decal_render.ServerLevelMixin",
"block_placement.BlockPlaceContextMixin",
"block_placement.EntityGetterMixin",
"block_placement.UseOnContextMixin",
"block_properties.BlockStateMixin",
"chunk_container_replacement.LevelChunkSectionMixin",
"climbing_sub_levels.LivingEntityMixin",
"clip_overwrite.BlockGetterMixin",
"clip_overwrite.ClipContextMixin",
"clip_overwrite.EntityMixin",
"clip_overwrite.HitResultMixin",
"command.ArgumentTypeInfosMixin",
"command.DataCommandsMixin",
"command.ExecuteCommandMixin",
"compatibility.computercraft.WirelessNetworkMixin",
"compatibility.exposure.CameraPosesMixin",
"compatibility.exposure.CameraStandEntityMixin",
"compatibility.jade.BlockAccessorImplMixin",
"compatibility.jade.RayTracingMixin",
"compatibility.jadeaddons.CreatePluginMixin",
"compatibility.vista.LODMixin",
"compatibility.vista.ViewFinderAccessMixin",
"compatibility.vista.ViewFinderControllerMixin",
"death_message.CombatTrackerMixin",
"death_message.EntityMixin",
"enchanting_table.EnchantingTableBlockEntityMixin",
"entity.arrows_hit_blocks.AbstractArrowMixin",
"entity.entities_in_blocks.EntityMixin",
"entity.entities_stick_sublevels.EntityMixin",
"entity.entities_stick_sublevels.LivingEntityMixin",
"entity.entities_stick_sublevels.ServerEntityMixin",
"entity.entities_stick_sublevels.effects.EntityMixin",
"entity.entities_stick_sublevels.effects.LivingEntityMixin",
"entity.entities_stick_sublevels.packet_mixin.ClientboundMoveEntityPacketPosMixin",
"entity.entities_stick_sublevels.packet_mixin.ClientboundMoveEntityPacketPosRotMixin",
"entity.entities_stick_sublevels.packet_mixin.ClientboundTeleportEntityPacketMixin",
"entity.entities_stick_sublevels.player.ServerboundMovePlayerPacketMixin",
"entity.entities_stick_sublevels.player.ServerGamePacketListenerImplMixin",
"entity.entities_stick_sublevels.player.ServerPlayerMixin",
"entity.entity_aabb_lookup.LevelsMixin",
"entity.entity_ai.EatBlockGoalMixin",
"entity.entity_collision.CollisionContextMixin",
"entity.entity_collision.EntityMixin",
"entity.entity_interaction.ProjectileUtilMixin",
"entity.entity_kicking.BlockMixin",
"entity.entity_kicking.ServerLevelMixin",
"entity.entity_leashing.LeashableMixin",
"entity.entity_pathfinding.FlyNodeEvaluatorMixin",
"entity.entity_pathfinding.GroundPathNavigationMixin",
"entity.entity_pathfinding.PathfindingContextMixin",
"entity.entity_pathfinding.PathMixin",
"entity.entity_pathfinding.PathNavigationMixin",
"entity.entity_pathfinding.RandomPosMixin",
"entity.entity_pathfinding.WalkNodeEvaluatorMixin",
"entity.entity_rotations_and_riding.BlockMixin",
"entity.entity_rotations_and_riding.EntityMixin",
"entity.entity_rotations_and_riding.EntityTypeMixin",
"entity.entity_rotations_and_riding.LivingEntityMixin",
"entity.entity_rotations_and_riding.PlayerMixin",
"entity.entity_rotations_and_riding.ServerEntityMixin",
"entity.entity_rotations_and_riding.ServerPlayerMixin",
"entity.entity_sublevel_collision.AbstractMinecartMixin",
"entity.entity_sublevel_collision.EntityMixin",
"entity.entity_sublevel_collision.ItemEntityMixin",
"entity.entity_sublevel_collision.LevelMixin",
"entity.entity_sublevel_collision.LivingEntityMixin",
"entity.entity_sublevel_collision.PlayerMixin",
"entity.entity_sublevel_collision.ServerGamePacketListenerImplMixin",
"entity.entity_tracking.TrackedEntityMixin",
"entity.entity_unloading.PersistentEntitySectionManagerMixin",
"entity.falling_block.FallingBlockEntityMixin",
"entity.projectile.ProjectileMixin",
"entity.server_entities_tick.ChunkMapMixin",
"entity.server_entities_tick.ServerLevelMixin",
"entity.sublevels_block_sky.SubLevelsBlockSkyMixin",
"entity.tamed_teleport.TamableAnimalMixin",
"entity.teleport_players.ServerPlayerMixin",
"entity.tnt_jumps.PrimedTntMixin",
"entity.trident.ThrownTridentMixin",
"explosion.ExplosionMixin",
"explosion.ServerLevelMixin",
"extension.EntityMixin",
"fluids_on_sub_levels.FlowingFluidMixin",
"game_test.GameTestInfoMixin",
"game_test.StructureUtilsMixin",
"game_test.TestCommandMixin",
"impact.BeehiveBlockMixin",
"impact.BellBlockMixin",
"impact.TntBlockMixin",
"interaction_distance.EntityMixin",
"interaction_distance.PlayerMixin",
"level_accelerator.ServerChunkCacheAccessor",
"particle.ServerLevelMixin",
"physics.ServerLevelMixin",
"player_freezing.PlayerListMixin",
"player_freezing.PlayerMixin",
"player_freezing.ServerPlayerMixin",
"plot.ChunkMapMixin",
"plot.LevelChunkMixin",
"plot.LevelsMixin",
"plot.PlayerListMixin",
"plot.ServerChunkCacheMixin",
"plot.ServerLevelMixin",
"plot.lighting.BlockAndTintGetterMixin",
"plot.lighting.LevelChunkMixin",
"plot.serialization.ChunkMapMixin",
"plot.serialization.LevelChunkTicksMixin",
"portal.EntityMixin",
"portal.NetherPortalBlockMixin",
"prevent_freezing.BiomeMixin",
"prevent_overgrowth.VineBlockMixin",
"punching.ItemInvoker",
"recoil.ProjectileDispenseBehaviorMixin",
"respawn_point.ServerPlayerMixin",
"respawn_point.sleeping.LivingEntityMixin",
"respawn_point.sleeping.ServerPlayerMixin",
"sculk_vibrations.EuclideanGameEventListenerRegistryMixin",
"sculk_vibrations.GameEventDispatcherMixin",
"sculk_vibrations.VibrationSystemListenerMixin",
"sculk_vibrations.VibrationSystemTickerMixin",
"sign_interaction.SignBlockEntityMixin",
"tracking_points.EntityMixin",
"tracking_points.ServerPlayerMixin",
"udp.ConnectionMixin",
"udp.MinecraftServerMixin",
"udp.PlayerListMixin",
"udp.ServerConnectionListenerMixin",
"voxel_shape_iteration.BitSetDiscreteVoxelShapeAccessor",
"voxel_shape_iteration.DiscreteVoxelShapeAccessor",
"voxel_shape_iteration.VoxelShapeMixin",
"water_occlusion.EntityMixin",
"water_occlusion.LevelsMixin",
"water_occlusion.WaterFluidMixin",
"world_border.LevelMixin",
"world_border.WorldBorderMixin"
],
"injectors": {
"defaultRequire": 1
}
}