Merge branch '1.21' into new-container-api

This commit is contained in:
DBotThePony 2025-03-07 11:46:21 +07:00
commit 45651d81b5
Signed by: DBot
GPG Key ID: DCC23B5715498507
69 changed files with 590 additions and 209 deletions

View File

@ -44,6 +44,26 @@ fun addChestLootTables(loot: LootTables) {
}
}
loot.builder(LootContextParamSets.VAULT, modLootTable("laboratory_vault")){
lootPool {
item(MItems.MATTER_DUST) {
chanceCondition(0.1)
setWeight(4)
apply(MatterDustItem.Randomizer(UniformDecimal(Decimal(100), Decimal(2_500))))
}
item(Items.IRON_INGOT) {
setCount(minimal = 1, maximal = 3)
setWeight(3)
}
}
}
loot.builder(LootContextParamSets.VAULT, modLootTable("laboratory_ominous_vault")){
}
loot.builder(LootContextParamSets.CHEST, modLootTable("frigate_cargo")) {
lootPool {
item(Items.IRON_INGOT) {

View File

@ -78,7 +78,7 @@ public class LoaderModel {
this.animate(entity.getIdleState(), LoaderAnimation.ATTACK, ageInTicks, 1.0F);
}
this.animateWalk(LoaderAnimation.MOVE, limbSwing, limbSwingAmount, 1.0F, 2.5F);
this.animateWalk(LoaderAnimation.MOVE, limbSwing, limbSwingAmount, 0.8F, 2.5F);
this.animate(entity.getIdleState(), LoaderAnimation.IDLE, ageInTicks, 1.0F);
}

View File

@ -5,6 +5,8 @@ import net.minecraft.client.Minecraft
import net.minecraft.core.BlockPos
import net.minecraft.core.HolderLookup
import net.minecraft.core.SectionPos
import net.minecraft.core.particles.DustParticleOptions
import net.minecraft.core.particles.ParticleTypes
import net.minecraft.nbt.CompoundTag
import net.minecraft.server.level.ServerLevel
import net.minecraft.server.level.ServerPlayer
@ -211,6 +213,31 @@ class BlackHoleBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Mattery
val distance = item.position().distanceTo(center)
setDeltaMovement(item, center, distance)
}
//no way null malware reference
val tempLevel = level
if (tempLevel?.otmRandom!!.nextFloat() < 0.8f) {
val size = gravitationStrength.pow(0.5)
val eventHorizonRadius = size / 2
val spawnRadius = 4 + eventHorizonRadius * (1.2 + tempLevel.otmRandom.nextDouble() * 0.6)
val theta = tempLevel.otmRandom.nextDouble() * Math.PI * 2
val phi = tempLevel.otmRandom.nextDouble() * Math.PI - Math.PI / 2
//мугек я не ощущаю центр
//хз нужно настроить
val x = blockPos.x + 0.5 + spawnRadius * Math.cos(theta) * Math.cos(phi)
val y = blockPos.y + 0.5 + spawnRadius * Math.sin(phi)
val z = blockPos.z + 0.5 + spawnRadius * Math.sin(theta) * Math.cos(phi)
val motionX = (blockPos.x + 0.5 - x) * 0.05
val motionY = (blockPos.y - 1.5 - y) * 0.05
val motionZ = (blockPos.z + 0.5 - z) * 0.05
tempLevel.addParticle(ParticleTypes.SMOKE, x, y, z, motionX, motionY, motionZ)
}
}
private val sphericalPositionsCache = ArrayList<BlockPos>()

View File

@ -3,6 +3,7 @@ package ru.dbotthepony.mc.otm.block.entity.cable
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
import it.unimi.dsi.fastutil.objects.ReferenceArraySet
import it.unimi.dsi.fastutil.objects.ReferenceLinkedOpenHashSet
import net.minecraft.core.Direction
import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.SERVER_IS_LIVE
import ru.dbotthepony.mc.otm.UNIVERSE_TICKS
@ -74,16 +75,20 @@ private class LinkedPriorityQueue<T : Comparable<T>> {
}
class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableGraph>() {
private val livelyNodes = HashSet<EnergyCableBlockEntity.Node>()
private val livelyNodesList = ArrayList<EnergyCableBlockEntity.Node>()
private val livelyNodes = HashSet<Pair<EnergyCableBlockEntity.Node, RelativeSide>>()
private val livelyNodesList = ArrayList<Pair<EnergyCableBlockEntity.Node, RelativeSide>>()
fun addLivelyNode(node: EnergyCableBlockEntity.Node) {
when (contains(node)) {
ContainsStatus.ABOUT_TO_BE_REMOVED, ContainsStatus.ABOUT_TO_BE_ADDED -> { } // do nothing
ContainsStatus.DOES_NOT_BELONG -> throw IllegalArgumentException("$node does not belong to $this")
ContainsStatus.CONTAINS -> {
if (livelyNodes.add(node)) {
livelyNodesList.add(node)
for (dir in RelativeSide.entries) {
val pair = node to dir
if (livelyNodes.add(pair)) {
livelyNodesList.add(pair)
}
}
}
}
@ -584,8 +589,12 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
}
override fun onNodeRemoved(node: EnergyCableBlockEntity.Node) {
if (livelyNodes.remove(node)) {
check(livelyNodesList.remove(node))
for (dir in RelativeSide.entries) {
val pair = node to dir
if (livelyNodes.remove(pair)) {
check(livelyNodesList.remove(pair))
}
}
val touchedSegments = HashSet<Segment>()
@ -608,8 +617,11 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
}
override fun onNodeAdded(node: EnergyCableBlockEntity.Node) {
check(livelyNodes.add(node))
livelyNodesList.add(node)
for (dir in RelativeSide.entries) {
val pair = node to dir
check(livelyNodes.add(pair))
livelyNodesList.add(pair)
}
notifyThroughputsChanged()
}
@ -622,98 +634,97 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
var residue = howMuch.coerceAtMost(fromNode.energyThroughput)
val snapshot = Reference2ObjectOpenHashMap<Segment, Decimal>()
for (node in itr) {
var hit = false
for (pair in itr) {
val (node, relSide) = pair
val side = node.sides[relSide]!!
for (side in node.sides.values) {
if (!side.isEnabled)
continue
else if (fromNode === node && side.side === fromSide) {
hit = true
continue
}
val it = side.neighbour.get() ?: continue
if (it is EnergyCableBlockEntity.CableSide) continue
val paths = getPath(fromNode, node, it.receiveEnergy(residue, true), !simulate)
hit = true
if (paths.size == 1) {
// Single path, fast scenario
val path = paths[0]
val pathTransferred = path.transfer(residue, simulate, snapshot)
if (pathTransferred <= Decimal.ZERO) continue
val thisReceived = it.receiveEnergy(pathTransferred, simulate)
// If cable transferred more than machine accepted, then "refund" energy
// so cables record actual value transferred through them
if (thisReceived != pathTransferred) {
path.refund(pathTransferred - thisReceived, simulate, snapshot)
if (!simulate && thisReceived != Decimal.ZERO) {
path.triggerBlockstateUpdates()
}
} else if (!simulate) {
path.triggerBlockstateUpdates()
}
received += thisReceived
residue -= thisReceived
if (!residue.isPositive) return received
} else if (paths.size >= 2) {
// Multiple paths, a bit more complicated
// Determine how much machine is likely to accept
val potentiallyAccepted = it.receiveEnergy(residue, true)
// Won't accept anything
if (potentiallyAccepted <= Decimal.ZERO) continue
// Now determine combined available throughput
// Make a copy of snapshot, so we can freely write into it
val copy = snapshot.clone()
var calcResidue = potentiallyAccepted
// TODO: Currently, all transfers cause Braess's paradox, because of greedy selection of "fastest" cable
// Need to implement heuristics to better distribute load across different paths/segments
for (path in paths) {
val passed = path.transfer(calcResidue, true, copy)
calcResidue -= passed
if (calcResidue <= Decimal.ZERO) break
}
if (calcResidue == potentiallyAccepted) {
// мда
continue
}
var thisReceived = it.receiveEnergy(potentiallyAccepted - calcResidue, simulate)
received += thisReceived
residue -= thisReceived
for (path in paths) {
val passed = path.transfer(thisReceived, simulate, snapshot)
if (!simulate)
path.triggerBlockstateUpdates()
thisReceived -= passed
if (thisReceived <= Decimal.ZERO) break
}
if (!residue.isPositive) return received
//check(thisReceived <= Decimal.ZERO) { "Путом, алло, Путом, какого чёрта Путом? Путом почему ты заблокировал логику, а Путом?" }
if (thisReceived > Decimal.ZERO) {
LOGGER.warn("Cable path from $fromNode to $node doesn't follow common sense, disabling.")
paths.forEach { it.shortCircuit = true }
}
}
if (!side.isEnabled) {
itr.remove()
check(livelyNodes.remove(pair)) { "Lively nodes Set does not contain $pair" }
continue
} else if (fromNode === node && side.side === fromSide) {
continue
}
if (!hit) {
val it = side.neighbour.get()
if (it == null || it is EnergyCableBlockEntity.CableSide) {
itr.remove()
check(livelyNodes.remove(node)) { "Lively nodes Set does not contain $node" }
check(livelyNodes.remove(pair)) { "Lively nodes Set does not contain $pair" }
continue
}
val paths = getPath(fromNode, node, it.receiveEnergy(residue, true), !simulate)
if (paths.size == 1) {
// Single path, fast scenario
val path = paths[0]
val pathTransferred = path.transfer(residue, simulate, snapshot)
if (pathTransferred <= Decimal.ZERO) continue
val thisReceived = it.receiveEnergy(pathTransferred, simulate)
// If cable transferred more than machine accepted, then "refund" energy
// so cables record actual value transferred through them
if (thisReceived != pathTransferred) {
path.refund(pathTransferred - thisReceived, simulate, snapshot)
if (!simulate && thisReceived != Decimal.ZERO) {
path.triggerBlockstateUpdates()
}
} else if (!simulate) {
path.triggerBlockstateUpdates()
}
received += thisReceived
residue -= thisReceived
if (!residue.isPositive) return received
} else if (paths.size >= 2) {
// Multiple paths, a bit more complicated
// Determine how much machine is likely to accept
val potentiallyAccepted = it.receiveEnergy(residue, true)
// Won't accept anything
if (potentiallyAccepted <= Decimal.ZERO) continue
// Now determine combined available throughput
// Make a copy of snapshot, so we can freely write into it
val copy = snapshot.clone()
var calcResidue = potentiallyAccepted
// TODO: Currently, all transfers cause Braess's paradox, because of greedy selection of "fastest" cable
// Need to implement heuristics to better distribute load across different paths/segments
for (path in paths) {
val passed = path.transfer(calcResidue, true, copy)
calcResidue -= passed
if (calcResidue <= Decimal.ZERO) break
}
if (calcResidue == potentiallyAccepted) {
// мда
continue
}
var thisReceived = it.receiveEnergy(potentiallyAccepted - calcResidue, simulate)
received += thisReceived
residue -= thisReceived
for (path in paths) {
val passed = path.transfer(thisReceived, simulate, snapshot)
if (!simulate)
path.triggerBlockstateUpdates()
thisReceived -= passed
if (thisReceived <= Decimal.ZERO) break
}
if (!residue.isPositive) return received
//check(thisReceived <= Decimal.ZERO) { "Путом, алло, Путом, какого чёрта Путом? Путом почему ты заблокировал логику, а Путом?" }
if (thisReceived > Decimal.ZERO) {
LOGGER.warn("Cable path from $fromNode to $node doesn't follow common sense, disabling.")
paths.forEach { it.shortCircuit = true }
}
}
}

View File

@ -331,8 +331,8 @@ object MNames {
const val LOADER = "loader"
const val ANDROID_MELEE = "android_melee"
const val ANDROID_RANGED = "android_melee"
const val ANDROID_OVERSEER = "android_melee"
const val ANDROID_RANGED = "android_ranged"
const val ANDROID_OVERSEER = "android_overseer"
const val PHANTOM_ATTRACTOR = "phantom_attractor"
const val JUMP_BOOST = "jump_boost"

View File

@ -2,6 +2,7 @@
"replace": false,
"values": [
"#c:is_desert",
"minecraft:plains"
"minecraft:plains",
"minecraft:taiga"
]
}

View File

@ -0,0 +1,61 @@
{
"processors": [
{
"processor_type": "minecraft:rule",
"rules": [
{
"input_predicate": {
"block": "overdrive_that_matters:tritanium_block_light_gray",
"predicate_type": "minecraft:random_block_match",
"probability": 0.2
},
"location_predicate": {
"predicate_type": "minecraft:always_true"
},
"output_state": {
"Name": "overdrive_that_matters:decorative_crate"
}
},
{
"input_predicate": {
"block": "overdrive_that_matters:metal_mesh",
"predicate_type": "minecraft:random_block_match",
"probability": 0.1
},
"location_predicate": {
"predicate_type": "minecraft:always_true"
},
"output_state": {
"Name": "minecraft:air"
}
},
{
"input_predicate": {
"block": "overdrive_that_matters:floor_tiles_stairs_white",
"predicate_type": "minecraft:random_block_match",
"probability": 0.1
},
"location_predicate": {
"predicate_type": "minecraft:always_true"
},
"output_state": {
"Name": "overdrive_that_matters:floor_tiles_slab_white"
}
},
{
"input_predicate": {
"block": "overdrive_that_matters:reinforced_redstone_lamp_inverted",
"predicate_type": "minecraft:random_block_match",
"probability": 0.3
},
"location_predicate": {
"predicate_type": "minecraft:always_true"
},
"output_state": {
"Name": "overdrive_that_matters:reinforced_redstone_lamp"
}
}
]
}
]
}

View File

@ -1,18 +1,24 @@
{
"type": "minecraft:jigsaw",
"biomes": "#overdrive_that_matters:laboratory",
"max_distance_from_center": 100,
"max_distance_from_center": 112,
"liquid_settings": "ignore_waterlogging",
"size": 7,
"size": 10,
"start_height": {
"absolute": -13
"type": "minecraft:uniform",
"max_inclusive": {
"absolute": 30
},
"min_inclusive": {
"absolute": -13
}
},
"spawn_overrides": {
"monster": {
"bounding_box": "piece",
"spawns": [
{
"type": "minecraft:pillager",
"type": "overdrive_that_matters:android_melee",
"weight": 1,
"minCount": 1,
"maxCount": 2
@ -21,7 +27,7 @@
}
},
"start_jigsaw_name": "overdrive_that_matters:laboratory_anchor",
"start_pool": "overdrive_that_matters:laboratory/center",
"start_pool": "overdrive_that_matters:laboratory/entrance",
"step": "underground_decoration",
"terrain_adaption": "encapsulate",
"use_expansion_hack": false

View File

@ -3,7 +3,7 @@
"type": "minecraft:random_spread",
"salt": 20803232,
"separation": 8,
"spacing": 24
"spacing": 12
},
"structures": [
{

View File

@ -1,24 +0,0 @@
{
"name": "overdrive_that_matters:center",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/center/lab_arena_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/center/lab_arena_1",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:crossroads",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/crossroads/vertical_a",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "overdrive_that_matters:laboratory/fallback_pool"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:entrance",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/entrance/entrance_a",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -4,7 +4,16 @@
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/dead_end",
"location": "overdrive_that_matters:laboratory/hall_fallback",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/hall_fallback_core",
"processors": "minecraft:empty",
"projection": "rigid"
},

View File

@ -0,0 +1,51 @@
{
"name": "overdrive_that_matters:fluff",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/fluff/chair",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/fluff/office",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/fluff/refinery",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/fluff/server",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/fluff/storage",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,48 @@
{
"name": "overdrive_that_matters:bridges",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/bridges/bridge",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/bridges/bridge_broken",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/bridges/bridge_repair",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/bridges/bridge_wood",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 2
},
{
"element": {
"element_type": "minecraft:empty_pool_element"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:center",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/center/center_a",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,33 @@
{
"name": "overdrive_that_matters:bridges",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/decor/camp_a",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/decor/junk_array",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/decor/stockpile",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:hall1",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/hall1/hall_overgrown",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "overdrive_that_matters:laboratory/fallback_pool"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:hall2",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/halls/hall1/hall_overgrown",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 4
}
],
"fallback": "overdrive_that_matters:laboratory/fallback_pool"
}

View File

@ -0,0 +1,42 @@
{
"name": "overdrive_that_matters:intersections",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/intersections/stairs_a",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/intersections/stairs_b",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/intersections/turn_a",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/intersections/lava",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "overdrive_that_matters:laboratory/fallback_pool"
}

View File

@ -1,78 +0,0 @@
{
"name": "overdrive_that_matters:main",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/corridor_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 4
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/corridor_1",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 4
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/corridor_turn_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 4
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/corrior_t_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/corridor_room_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 3
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/corridor_stairs_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 2
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/generator_room_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 2
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/main/portal_room_0",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "overdrive_that_matters:laboratory/fallback_pool"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:reward",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/reward/reward",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:reward_ominous_wall",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/reward/reward_ominous_wall",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:reward_wall",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/reward/reward_wall",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,24 @@
{
"name": "overdrive_that_matters:rooms",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/rooms/office_a",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
},
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/rooms/office_b",
"processors": "overdrive_that_matters:laboratory_weathering",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "overdrive_that_matters:laboratory/fallback_pool"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:s_heavy",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/spawner/s_loader",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}

View File

@ -0,0 +1,15 @@
{
"name": "overdrive_that_matters:s_heavy",
"elements": [
{
"element": {
"element_type": "minecraft:single_pool_element",
"location": "overdrive_that_matters:laboratory/spawner/s_android_melee",
"processors": "minecraft:empty",
"projection": "rigid"
},
"weight": 1
}
],
"fallback": "minecraft:empty"
}