init
This commit is contained in:
@@ -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"
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.ActiveSableCompanion
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SableAssemblyPlatformImpl
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SableChunkEventPlatformImpl
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SableEventPlatformImpl
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SableEventPublishPlatformImpl
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SableLoaderPlatformImpl
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SablePlatformImpl
|
||||
+1
@@ -0,0 +1 @@
|
||||
dev.ryanhcode.sable.neoforge.platform.SablePlotPlatformImpl
|
||||
+1
@@ -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);
|
||||
}
|
||||
+19
@@ -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
|
||||
}
|
||||
+20
@@ -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"
|
||||
}
|
||||
+61
@@ -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
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"selector": "minecraft:bedrock",
|
||||
|
||||
"properties": {
|
||||
"sable:mass": 1000.0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"selector": "#sable:bouncy",
|
||||
|
||||
"properties": {
|
||||
"sable:restitution": 0.5
|
||||
}
|
||||
}
|
||||
+13
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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 }
|
||||
]
|
||||
}
|
||||
+12
@@ -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).
|
||||
Binary file not shown.
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user