Compare commits

...
10 Commits
13 changed files with 217 additions and 34 deletions

No files matched your search

+2 -2
View File
@@ -21,7 +21,7 @@ buildscript {
apply plugin: 'scala'
apply plugin: 'forge'
version = "1.6.2"
version = "1.6.4"
if (project.hasProperty('buildnum')) {
project.version = project.version + '.' + project.buildnum
@@ -34,7 +34,7 @@ archivesBaseName = "bdlib"
ext.versuffix = "mc1710"
minecraft {
version = "1.7.10-10.13.2.1231"
version = "1.7.10-10.13.2.1291"
replace("BDLIB_VER", project.version)
}
+18
View File
@@ -0,0 +1,18 @@
bdlib.multiblock.face.north=Nord
bdlib.multiblock.face.south=Sud
bdlib.multiblock.face.east=Est
bdlib.multiblock.face.west=Ouest
bdlib.multiblock.face.up=Haut
bdlib.multiblock.face.down=Bas
bdlib.multiblock.disabled=Désactivé(e)
bdlib.multiblock.incomplete=Cette machine est incomplète, elle requiert au moins :
bdlib.multiblock.notconnected=Pas connecté(e) à une machine valide
bdlib.multiblock.toomanyoutputs=Trop de sorties connectées, incapable d'attacher de nouvelles connexions
bdlib.rsmode.always=Toujours en marche
bdlib.rsmode.never=Désactivé(e)
bdlib.rsmode.rs_on=Activer par la redstone
bdlib.rsmode.rs_off=Désactiver par la redstone
bdlib.label.empty=Vide
+1
View File
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.Logger
object BdLib {
var log: Logger = null
def logDebug(msg: String, args: Any*) = log.debug(msg.format(args: _*))
def logInfo(msg: String, args: Any*) = log.info(msg.format(args: _*))
def logWarn(msg: String, args: Any*) = log.warn(msg.format(args: _*))
def logError(msg: String, args: Any*) = log.error(msg.format(args: _*))
+5 -3
View File
@@ -18,9 +18,11 @@ import net.minecraftforge.common.util.ForgeDirection
import scala.reflect.ClassTag
case class BlockRef(x: Int, y: Int, z: Int) {
def block(w: IBlockAccess) = Option(w.getBlock(x, y, z))
def tile(w: IBlockAccess) = Option(w.getTileEntity(x, y, z))
def meta(w: IBlockAccess) = w.getBlockMetadata(x, y, z)
def isValid(w: IBlockAccess) = y >= 0 && y < 256 // hardcoded because getHeight is unavailable on servers :(
def block(w: IBlockAccess) = if (isValid(w)) Option(w.getBlock(x, y, z)) else None
def tile(w: IBlockAccess) = if (isValid(w)) Option(w.getTileEntity(x, y, z)) else None
def meta(w: IBlockAccess) = if (isValid(w)) w.getBlockMetadata(x, y, z) else 0
def blockIs(w: IBlockAccess, other: Block) = block(w).contains(other)
@@ -0,0 +1,31 @@
/*
* Copyright (c) bdew, 2013 - 2015
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import net.bdew.lib.data.base.{TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.fluids.{Fluid, FluidRegistry}
case class DataSlotFluidOption(name: String, parent: TileDataSlots) extends DataSlotOption[Fluid] {
setUpdate(UpdateKind.SAVE, UpdateKind.GUI)
override def save(t: NBTTagCompound, kind: UpdateKind.Value) {
value map { x => t.setString(name, x.getName) }
}
override def load(t: NBTTagCompound, kind: UpdateKind.Value): Unit = {
if (t.hasKey(name)) {
val fluidName = t.getString(name)
if (FluidRegistry.isFluidRegistered(fluidName)) {
value = Option(FluidRegistry.getFluid(fluidName))
} else unset()
} else unset()
}
}
@@ -0,0 +1,63 @@
/*
* Copyright (c) bdew, 2013 - 2015
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.data
import java.io.{ByteArrayInputStream, ByteArrayOutputStream, DataInputStream, DataOutputStream}
import net.bdew.lib.data.base.{DataSlot, TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
import scala.collection.mutable
case class DataSlotMovingAverage(name: String, parent: TileDataSlots, size: Int) extends DataSlot {
val values = mutable.Queue.empty[Double]
var average: Double = 0
setUpdate(UpdateKind.GUI, UpdateKind.SAVE)
def reset() {
values.clear()
average = 0
}
def update(v: Double) = {
values += v
if (values.length > size)
values.dequeue()
average = values.sum / values.length
parent.dataSlotChanged(this)
}
override def save(t: NBTTagCompound, kind: UpdateKind.Value) {
if (kind == UpdateKind.GUI) {
t.setDouble(name, average)
} else {
val b = new ByteArrayOutputStream()
val o = new DataOutputStream(b)
o.writeByte(values.size)
values.foreach(o.writeDouble)
t.setByteArray(name, b.toByteArray)
o.close()
}
}
override def load(t: NBTTagCompound, kind: UpdateKind.Value) {
if (kind == UpdateKind.GUI) {
average = t.getDouble(name)
} else {
values.clear()
if (t.hasKey(name)) {
val i = new DataInputStream(new ByteArrayInputStream(t.getByteArray(name)))
val len = i.readByte()
values ++= (for (x <- 0 until Math.min(len, size)) yield i.readDouble())
i.close()
}
}
}
}
@@ -19,10 +19,13 @@ import scala.collection.mutable
trait TileDataSlots extends TileExtended {
val dataSlots = mutable.HashMap.empty[String, DataSlot]
var lastChange = 0L
var lastGuiPacket = 0L
final val TRACE = false
def doSave(kind: UpdateKind.Value, t: NBTTagCompound) {
if (kind == UpdateKind.GUI)
t.setLong("BDLib_TS", getWorldObj.getTotalWorldTime)
for ((n, s) <- dataSlots if s.updateKind.contains(kind)) {
s.save(t, kind)
if (TRACE) printf("%s: %s S=> %s\n".format(kind, n, t.getTag(n)))
@@ -30,6 +33,14 @@ trait TileDataSlots extends TileExtended {
}
def doLoad(kind: UpdateKind.Value, t: NBTTagCompound) {
if (kind == UpdateKind.GUI) {
val ts = t.getLong("BDLib_TS")
if (ts > lastGuiPacket) {
lastGuiPacket = ts
} else {
return
}
}
for ((n, s) <- dataSlots if s.updateKind.contains(kind)) {
if (TRACE) printf("%s: %s L<= %s\n".format(kind, n, t.getTag(n)))
s.load(t, kind)
+1 -1
View File
@@ -16,7 +16,7 @@ case class BaseRect[T: Numeric](x: T, y: T, w: T, h: T) {
def this(p: BasePoint[T], w: T, h: T) = this(p.x, p.y, w, h)
def contains(p: BasePoint[T]) = n.gteq(p.x, x) && n.gteq(p.y, y) && n.lteq(p.x, x2) && n.lteq(p.y, y2)
def contains(p: BasePoint[T]) = n.gteq(p.x, x) && n.gteq(p.y, y) && n.lt(p.x, x2) && n.lt(p.y, y2)
def origin = BasePoint(x, y)
@@ -0,0 +1,18 @@
/*
* Copyright (c) bdew, 2013 - 2015
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.multiblock.interact
import net.bdew.lib.multiblock.tile.TileController
import net.minecraft.inventory.IInventory
trait CIItemInput extends TileController {
def getItemInputInventory: IInventory
def canInputItemToSlot(slot: Int): Boolean
}
+26 -26
View File
@@ -172,7 +172,7 @@ class RecipeLoader {
if (l.size == 0) error("Concrete ItemStack requested for OD entry '%s' that is empty", id)
val s = l.get(0).copy()
s.stackSize = cnt
BdLib.logInfo("Concrete ItemStack for OD entry '%s' -> %s", id, s)
BdLib.logDebug("Concrete ItemStack for OD entry '%s' -> %s", id, s)
return s
case StackMacro(ch) => getConcreteStack(currCharMap(ch), cnt)
case StackGeneric(mod, id) =>
@@ -197,7 +197,7 @@ class RecipeLoader {
if (!currCharMap.contains(x)) error("Character %s is undefined", x)
val r = getRecipeComponent(currCharMap(x))
if (r.isInstanceOf[String]) needOd = true
BdLib.logInfo("%s -> %s", x, r)
BdLib.logDebug("%s -> %s", x, r)
comp += (x -> r)
}
return (comp, needOd)
@@ -213,7 +213,7 @@ class RecipeLoader {
list flatMap {
case x: CraftingStatement =>
if (res == x.result) {
BdLib.logInfo("Removing recipe %s", this)
BdLib.logDebug("Removing recipe %s", this)
None
} else Some(x)
case RsRecipes(inner) =>
@@ -248,15 +248,15 @@ class RecipeLoader {
def processConfigStatement(s: ConfigStatement): Unit = s match {
case CsConditionalConfig(cnd, thn, els) =>
if (resolveCondition(cnd)) {
BdLib.logInfo("Condition %s - TRUE", cnd)
BdLib.logDebug("Condition %s - TRUE", cnd)
processConfigStatementsSafe(thn)
} else {
BdLib.logInfo("Condition %s - FALSE", cnd)
BdLib.logDebug("Condition %s - FALSE", cnd)
processConfigStatementsSafe(els)
}
case CsClearRecipes(res) =>
BdLib.logInfo("Clearing recipes that produce %s", res)
BdLib.logDebug("Clearing recipes that produce %s", res)
recipeStatements = clearStatements(recipeStatements, res)
case CsRecipeBlock(lst) =>
@@ -273,19 +273,19 @@ class RecipeLoader {
def processRecipeStatement(st: RecipeStatement) = st match {
case RsCharAssign(c, r) =>
currCharMap += (c -> r)
BdLib.logInfo("Added %s = %s", c, r)
BdLib.logDebug("Added %s = %s", c, r)
case RsClassMacro(id, cls) =>
currClassMacros += (id -> cls)
BdLib.logInfo("Added def %s = %s", id, cls)
BdLib.logDebug("Added def %s = %s", id, cls)
case RsRecipeShaped(rec, res, cnt) =>
BdLib.logInfo("Adding shaped recipe %s => %s * %d", rec, res, cnt)
BdLib.logDebug("Adding shaped recipe %s => %s * %d", rec, res, cnt)
val (comp, needOd) = resolveRecipeComponents(rec.mkString(""))
val resStack = getConcreteStack(res, cnt)
if (resStack.getItemDamage == OreDictionary.WILDCARD_VALUE) {
BdLib.logInfo("Result meta is unset, defaulting to 0")
BdLib.logDebug("Result meta is unset, defaulting to 0")
resStack.setItemDamage(0)
}
@@ -294,16 +294,16 @@ class RecipeLoader {
else
Misc.addRecipe(resStack, rec, comp)
BdLib.logInfo("Done... result=%s, od=%s", resStack, needOd)
BdLib.logDebug("Done... result=%s, od=%s", resStack, needOd)
case RsRecipeShapeless(rec, res, cnt) =>
BdLib.logInfo("Adding shapeless recipe %s => %s * %d", rec, res, cnt)
BdLib.logDebug("Adding shapeless recipe %s => %s * %d", rec, res, cnt)
val (comp, needOd) = resolveRecipeComponents(rec)
val resStack = getConcreteStack(res, cnt)
val recTrans = rec.toCharArray.map(comp(_))
if (resStack.getItemDamage == OreDictionary.WILDCARD_VALUE) {
BdLib.logInfo("Result meta is unset, defaulting to 0")
BdLib.logDebug("Result meta is unset, defaulting to 0")
resStack.setItemDamage(0)
}
@@ -312,26 +312,26 @@ class RecipeLoader {
else
GameRegistry.addShapelessRecipe(resStack, recTrans: _*)
BdLib.logInfo("Done... result=%s, od=%s", resStack, needOd)
BdLib.logDebug("Done... result=%s, od=%s", resStack, needOd)
case RsRecipeSmelting(in, out, cnt, xp) =>
BdLib.logInfo("Adding smelting recipe %s => %s * %d (%f xp)", in, out, cnt, xp)
BdLib.logDebug("Adding smelting recipe %s => %s * %d (%f xp)", in, out, cnt, xp)
val outStack = getConcreteStack(out, cnt)
if (outStack.getItemDamage == OreDictionary.WILDCARD_VALUE) {
BdLib.logInfo("Result meta is unset, defaulting to 0")
BdLib.logDebug("Result meta is unset, defaulting to 0")
outStack.setItemDamage(0)
}
for (inStack <- getAllConcreteStacks(in, 1)) {
GameRegistry.addSmelting(inStack, outStack, xp)
BdLib.logInfo("added %s -> %s", inStack, outStack)
BdLib.logDebug("added %s -> %s", inStack, outStack)
}
case RsConditional(cnd, thn, els) =>
if (resolveCondition(cnd)) {
BdLib.logInfo("Condition %s - TRUE", cnd)
BdLib.logDebug("Condition %s - TRUE", cnd)
processRecipeStatementsInSubcontext(thn)
} else {
BdLib.logInfo("Condition %s - FALSE", cnd)
BdLib.logDebug("Condition %s - FALSE", cnd)
processRecipeStatementsInSubcontext(els)
}
@@ -339,13 +339,13 @@ class RecipeLoader {
processRecipeStatementsInSubcontext(list)
case RsRegOredict(id, spec, wildcard) =>
BdLib.logInfo("Registering ore dictionary entry: %s -> %s", spec, id)
BdLib.logDebug("Registering ore dictionary entry: %s -> %s", spec, id)
val stack = getConcreteStack(spec)
if (wildcard) {
BdLib.logInfo("Forcing wildcard damage (was %d)", stack.getItemDamage)
BdLib.logDebug("Forcing wildcard damage (was %d)", stack.getItemDamage)
stack.setItemDamage(OreDictionary.WILDCARD_VALUE)
}
BdLib.logInfo("Actual stack: %s", stack)
BdLib.logDebug("Actual stack: %s", stack)
OreDictionary.registerOre(id, stack)
case x =>
@@ -371,7 +371,7 @@ class RecipeLoader {
* Process main recipe statements list, clear the list afterwards
*/
def processRecipeStatements() {
BdLib.logInfo("Processing %d recipe statements", recipeStatements.size)
BdLib.logDebug("Processing %d recipe statements", recipeStatements.size)
processRecipeStatementsSafe(recipeStatements)
recipeStatements = List.empty
}
@@ -411,10 +411,10 @@ class RecipeLoader {
}
def load(f: Reader) {
BdLib.logInfo("Starting parsing")
BdLib.logDebug("Starting parsing")
val r = newParser().doParse(f)
BdLib.logInfo("Processing %d statements", r.size)
BdLib.logDebug("Processing %d statements", r.size)
processConfigStatementsSafe(r)
BdLib.logInfo("Done")
BdLib.logDebug("Done")
}
}
@@ -17,7 +17,7 @@ trait GenericConfigLoader extends RecipeLoader {
def processConfigStatement(section: ConfigSection, s: CfgEntry): Unit = s match {
case CfgVal(id, v) =>
BdLib.logInfo("Config: %s%s = %s", section.pfx, id, v)
BdLib.logDebug("Config: %s%s = %s", section.pfx, id, v)
section.set(id, v)
case CfgSection(id, st) => processConfigBlock(section.getOrAddSection(id), st)
case x =>
@@ -29,7 +29,7 @@ trait LootListLoader extends GenericConfigLoader {
None
} else {
if (itemStack.getItemDamage == OreDictionary.WILDCARD_VALUE) {
BdLib.logInfo("meta/damage is unset in %s, defaulting to 0", ref)
BdLib.logDebug("meta/damage is unset in %s, defaulting to 0", ref)
itemStack.setItemDamage(0)
}
Some((chance, itemStack))
@@ -0,0 +1,39 @@
/*
* Copyright (c) bdew, 2013 - 2015
* https://github.com/bdew/bdlib
*
* This mod is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://bdew.net/minecraft-mod-public-license/
*/
package net.bdew.lib.resource
import net.bdew.lib.Misc
import net.bdew.lib.data.DataSlotOption
import net.bdew.lib.data.base.{TileDataSlots, UpdateKind}
import net.minecraft.nbt.NBTTagCompound
case class DataSlotResourceKindOption(name: String, parent: TileDataSlots) extends DataSlotOption[ResourceKind] {
setUpdate(UpdateKind.SAVE, UpdateKind.GUI)
override def save(t: NBTTagCompound, kind: UpdateKind.Value) {
value map { r =>
t.setTag(name,
Misc.applyMutator(new NBTTagCompound) { tag =>
r.helperObject.saveToNBT(tag, r)
tag.setString("kind", r.helperObject.id)
}
)
}
}
override def load(t: NBTTagCompound, kind: UpdateKind.Value) {
if (t.hasKey(name)) {
val tag = t.getCompoundTag(name)
value = if (tag.hasKey("kind")) {
ResourceManager.resourceHelpers.get(tag.getString("kind")).flatMap(_.loadFromNBT(tag))
} else None
} else unset()
}
}