mirror of
https://github.com/GTNewHorizons/ForgeMultipart.git
synced 2026-11-14 01:14:19 +00:00
fix(microblock): prevent microblocks becoming blood rune slabs (#47)
This commit is contained in:
1 parent
faa052f70c
commit
09e2b847fc
5 files changed
+82
-5
No files matched your search
@@ -54,5 +54,7 @@ object DefaultContent {
|
||||
registerMaterial(new GrassMicroMaterial, materialKey(grass))
|
||||
MicroMaterialRegistry.remapName(oldKey(mycelium), materialKey(mycelium))
|
||||
registerMaterial(new TopMicroMaterial(mycelium), materialKey(mycelium))
|
||||
|
||||
registerMaterial(MissingMicroMaterial, MissingMicroMaterial.key)
|
||||
}
|
||||
}
|
||||
@@ -133,15 +133,18 @@ object ItemMicroPart {
|
||||
if (!stack.getTagCompound.hasKey("mat"))
|
||||
return null
|
||||
|
||||
return MicroMaterialRegistry.getMaterial(
|
||||
MicroMaterialRegistry.getMaterial(
|
||||
stack.getTagCompound.getString("mat")
|
||||
)
|
||||
) match {
|
||||
case null => MissingMicroMaterial
|
||||
case mat => mat
|
||||
}
|
||||
}
|
||||
|
||||
def getMaterialID(stack: ItemStack): Int = {
|
||||
checkTagCompound(stack)
|
||||
if (!stack.getTagCompound.hasKey("mat"))
|
||||
return 0
|
||||
return MicroMaterialRegistry.getMissingId
|
||||
|
||||
return MicroMaterialRegistry.materialID(
|
||||
stack.getTagCompound.getString("mat")
|
||||
|
||||
@@ -114,6 +114,7 @@ object MicroMaterialRegistry {
|
||||
private var maxCuttingStrength: Int = _
|
||||
|
||||
private val remap = HashMap[String, String]()
|
||||
private var missingId: Int = 0
|
||||
|
||||
/** Register a micro material with unique identifier name
|
||||
*/
|
||||
@@ -162,8 +163,17 @@ object MicroMaterialRegistry {
|
||||
nameMap.clear()
|
||||
for (i <- 0 until idMap.length)
|
||||
nameMap.put(idMap(i)._1, i)
|
||||
missingId = nameMap.getOrElse(
|
||||
MissingMicroMaterial.key,
|
||||
throw new IllegalStateException(
|
||||
"MissingMicroMaterial is not registered; the placeholder must never " +
|
||||
"fall back to id 0."
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
def getMissingId = missingId
|
||||
|
||||
private[microblock] def calcMaxCuttingStrength() {
|
||||
val it = Item.itemRegistry.iterator.asInstanceOf[JIterator[Item]]
|
||||
maxCuttingStrength = it.flatMap {
|
||||
@@ -216,7 +226,7 @@ object MicroMaterialRegistry {
|
||||
case Some(v) => v
|
||||
case None =>
|
||||
logger.error("Missing mapping for part with ID: " + name)
|
||||
0
|
||||
missingId
|
||||
}
|
||||
|
||||
def getMaterial(name: String) =
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package codechicken.microblock
|
||||
|
||||
import codechicken.lib.render.uv.IconTransformation
|
||||
import codechicken.lib.vec.{Cuboid6, Vector3}
|
||||
import codechicken.microblock.MicroMaterialRegistry.IMicroMaterial
|
||||
import codechicken.microblock.handler.MicroblockProxy
|
||||
import cpw.mods.fml.relauncher.{Side, SideOnly}
|
||||
import net.minecraft.block.Block
|
||||
import net.minecraft.block.Block.SoundType
|
||||
import net.minecraft.entity.Entity
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
import net.minecraft.init.Blocks
|
||||
import net.minecraft.item.ItemStack
|
||||
import net.minecraft.util.IIcon
|
||||
|
||||
/** Stand-in for a material whose name could not be resolved at load time.
|
||||
* Renders the vanilla missing texture (magenta/black checkerboard) and behaves
|
||||
* inertly. Resolving an unknown name to this placeholder keeps microblocks
|
||||
* from silently becoming material id 0 (Blood Rune in GTNH).
|
||||
*/
|
||||
object MissingMicroMaterial extends IMicroMaterial {
|
||||
val key = "forgemicroblock:missing"
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private var icon: IIcon = _
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
override def loadIcons(): Unit = {
|
||||
icon = MicroblockProxy.renderBlocks.getIconSafe(null)
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
override def getBreakingIcon(side: Int): IIcon = icon
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
override def renderMicroFace(
|
||||
pos: Vector3,
|
||||
pass: Int,
|
||||
bounds: Cuboid6
|
||||
): Unit = {
|
||||
MaterialRenderHelper
|
||||
.start(pos, pass, new IconTransformation(icon))
|
||||
.lighting()
|
||||
.render()
|
||||
}
|
||||
|
||||
override def isTransparent: Boolean = false
|
||||
override def getLightValue: Int = 0
|
||||
override def getStrength(player: EntityPlayer): Float = 1f
|
||||
override def getLocalizedName: String = "Missing Material"
|
||||
override def getItem: ItemStack = new ItemStack(Blocks.stone)
|
||||
override def getCutterStrength: Int = 0
|
||||
override def getSound: SoundType = Block.soundTypeStone
|
||||
override def explosionResistance(entity: Entity): Float = 6f
|
||||
}
|
||||
@@ -26,7 +26,14 @@ object MicroblockCPH extends MicroblockPH with IClientPacketHandler {
|
||||
netHandler: INetHandlerPlayClient
|
||||
) {
|
||||
packet.getType match {
|
||||
case 1 => handleMaterialRegistration(packet, netHandler)
|
||||
// In singleplayer the integrated server and this client share the one
|
||||
// static registry, so the id-map packet is redundant. Skipping it avoids
|
||||
// rebuilding (clearing) the shared maps on the netty thread while the
|
||||
// server thread reads them - the race that turned microblocks into Blood
|
||||
// Rune slabs.
|
||||
case 1 =>
|
||||
if (!mc.isSingleplayer)
|
||||
handleMaterialRegistration(packet, netHandler)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user