fixed nullpointer in serialization of broadcast packets in switch/access point; reworked a couple of textures

This commit is contained in:
Florian Nücke 2014-03-28 23:29:58 +01:00
parent e7d6666b68
commit 2c54b6ddd7
45 changed files with 241 additions and 54 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 494 B

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 699 B

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 652 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 B

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 657 B

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 688 B

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

View File

@ -0,0 +1,6 @@
{
"animation": {
"frametime": 2,
"frames": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 514 B

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

View File

@ -0,0 +1,6 @@
{
"animation": {
"frametime": 2,
"frames": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 B

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

View File

@ -42,6 +42,7 @@ class PacketHandler extends CommonPacketHandler {
case PacketType.RobotSelectedSlotChange => onRobotSelectedSlotChange(p) case PacketType.RobotSelectedSlotChange => onRobotSelectedSlotChange(p)
case PacketType.RobotXp => onRobotXp(p) case PacketType.RobotXp => onRobotXp(p)
case PacketType.RotatableState => onRotatableState(p) case PacketType.RotatableState => onRotatableState(p)
case PacketType.RouterActivity => onRouterActivity(p)
case PacketType.ScreenColorChange => onScreenColorChange(p) case PacketType.ScreenColorChange => onScreenColorChange(p)
case PacketType.ScreenCopy => onScreenCopy(p) case PacketType.ScreenCopy => onScreenCopy(p)
case PacketType.ScreenDepthChange => onScreenDepthChange(p) case PacketType.ScreenDepthChange => onScreenDepthChange(p)
@ -222,6 +223,12 @@ class PacketHandler extends CommonPacketHandler {
case _ => // Invalid packet. case _ => // Invalid packet.
} }
def onRouterActivity(p: PacketParser) =
p.readTileEntity[Router]() match {
case Some(t) => t.lastMessage = System.currentTimeMillis()
case _ => // Invalid packet.
}
def onScreenColorChange(p: PacketParser) { def onScreenColorChange(p: PacketParser) {
val buffer = p.readTileEntity[TileEntity]() match { val buffer = p.readTileEntity[TileEntity]() match {
case Some(t: TextBuffer) => t.buffer case Some(t: TextBuffer) => t.buffer

View File

@ -33,9 +33,12 @@ private[oc] class Proxy extends CommonProxy {
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Cable], CableRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Cable], CableRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Case], CaseRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Case], CaseRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Charger], ChargerRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Hologram], HologramRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Hologram], HologramRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.PowerDistributor], PowerDistributorRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.PowerDistributor], PowerDistributorRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Rack], RackRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Rack], RackRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Router], RouterRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.WirelessRouter], RouterRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.RobotProxy], RobotRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.RobotProxy], RobotRenderer)
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer)

View File

@ -23,7 +23,6 @@ object TexturePreloader extends ResourceManagerReloadListener {
val blockCable = new ResourceLocation(Settings.resourceDomain, "textures/blocks/cable.png") val blockCable = new ResourceLocation(Settings.resourceDomain, "textures/blocks/cable.png")
val blockCaseFrontOn = new ResourceLocation(Settings.resourceDomain, "textures/blocks/case_front_on.png") val blockCaseFrontOn = new ResourceLocation(Settings.resourceDomain, "textures/blocks/case_front_on.png")
val blockHologram = new ResourceLocation(Settings.resourceDomain, "textures/blocks/hologram_effect.png") val blockHologram = new ResourceLocation(Settings.resourceDomain, "textures/blocks/hologram_effect.png")
val blockPowerDistributorOn = new ResourceLocation(Settings.resourceDomain, "textures/blocks/power_distributor_on.png")
val blockRackFrontOn = new ResourceLocation(Settings.resourceDomain, "textures/blocks/rack_front_on.png") val blockRackFrontOn = new ResourceLocation(Settings.resourceDomain, "textures/blocks/rack_front_on.png")
val blockRobot = new ResourceLocation(Settings.resourceDomain, "textures/blocks/robot.png") val blockRobot = new ResourceLocation(Settings.resourceDomain, "textures/blocks/robot.png")
val blockScreenUpIndicator = new ResourceLocation(Settings.resourceDomain, "textures/blocks/screen/up_indicator.png") val blockScreenUpIndicator = new ResourceLocation(Settings.resourceDomain, "textures/blocks/screen/up_indicator.png")
@ -49,7 +48,6 @@ object TexturePreloader extends ResourceManagerReloadListener {
manager.getResource(blockCable) manager.getResource(blockCable)
manager.getResource(blockCaseFrontOn) manager.getResource(blockCaseFrontOn)
manager.getResource(blockPowerDistributorOn)
manager.getResource(blockRackFrontOn) manager.getResource(blockRackFrontOn)
manager.getResource(blockRobot) manager.getResource(blockRobot)
manager.getResource(blockScreenUpIndicator) manager.getResource(blockScreenUpIndicator)

View File

@ -10,7 +10,7 @@ import net.minecraftforge.common.ForgeDirection
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
object CaseRenderer extends TileEntitySpecialRenderer { object CaseRenderer extends TileEntitySpecialRenderer {
override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) = { override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) {
val computer = tileEntity.asInstanceOf[Case] val computer = tileEntity.asInstanceOf[Case]
if (computer.isRunning) { if (computer.isRunning) {
GL11.glPushAttrib(0xFFFFFF) GL11.glPushAttrib(0xFFFFFF)

View File

@ -0,0 +1,70 @@
package li.cil.oc.client.renderer.tileentity
import li.cil.oc.Blocks
import li.cil.oc.common.tileentity.Charger
import li.cil.oc.util.RenderState
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.tileentity.TileEntity
import net.minecraftforge.common.ForgeDirection
import org.lwjgl.opengl.GL11
object ChargerRenderer extends TileEntitySpecialRenderer {
override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) {
val charger = tileEntity.asInstanceOf[Charger]
if (charger.chargeSpeed > 0) {
GL11.glPushAttrib(0xFFFFFF)
RenderState.disableLighting()
RenderState.makeItBlend()
GL11.glPushMatrix()
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5)
charger.yaw match {
case ForgeDirection.WEST => GL11.glRotatef(-90, 0, 1, 0)
case ForgeDirection.NORTH => GL11.glRotatef(180, 0, 1, 0)
case ForgeDirection.EAST => GL11.glRotatef(90, 0, 1, 0)
case _ => // No yaw.
}
GL11.glTranslatef(-0.5f, 0.5f, 0.5f)
GL11.glScalef(1, -1, 1)
val t = Tessellator.instance
val frontIcon = Blocks.charger.iconFrontCharging
bindTexture(TextureMap.locationBlocksTexture)
t.startDrawingQuads()
val inverse = 1 - charger.chargeSpeed
t.addVertexWithUV(0, 1, 0.005, frontIcon.getMinU, frontIcon.getMaxV)
t.addVertexWithUV(1, 1, 0.005, frontIcon.getMaxU, frontIcon.getMaxV)
t.addVertexWithUV(1, inverse, 0.005, frontIcon.getMaxU, frontIcon.getInterpolatedV(inverse * 16))
t.addVertexWithUV(0, inverse, 0.005, frontIcon.getMinU, frontIcon.getInterpolatedV(inverse * 16))
val sideIcon = Blocks.charger.iconSideCharging
t.addVertexWithUV(-0.005, 1, -1, sideIcon.getMinU, sideIcon.getMaxV)
t.addVertexWithUV(-0.005, 1, 0, sideIcon.getMaxU, sideIcon.getMaxV)
t.addVertexWithUV(-0.005, 0, 0, sideIcon.getMaxU, sideIcon.getMinV)
t.addVertexWithUV(-0.005, 0, -1, sideIcon.getMinU, sideIcon.getMinV)
t.addVertexWithUV(1, 1, -1.005, sideIcon.getMinU, sideIcon.getMaxV)
t.addVertexWithUV(0, 1, -1.005, sideIcon.getMaxU, sideIcon.getMaxV)
t.addVertexWithUV(0, 0, -1.005, sideIcon.getMaxU, sideIcon.getMinV)
t.addVertexWithUV(1, 0, -1.005, sideIcon.getMinU, sideIcon.getMinV)
t.addVertexWithUV(1.005, 1, 0, sideIcon.getMinU, sideIcon.getMaxV)
t.addVertexWithUV(1.005, 1, -1, sideIcon.getMaxU, sideIcon.getMaxV)
t.addVertexWithUV(1.005, 0, -1, sideIcon.getMaxU, sideIcon.getMinV)
t.addVertexWithUV(1.005, 0, 0, sideIcon.getMinU, sideIcon.getMinV)
t.draw()
GL11.glPopMatrix()
GL11.glPopAttrib()
}
}
}

View File

@ -1,15 +1,16 @@
package li.cil.oc.client.renderer.tileentity package li.cil.oc.client.renderer.tileentity
import li.cil.oc.client.TexturePreloader import li.cil.oc.Blocks
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
import li.cil.oc.util.RenderState import li.cil.oc.util.RenderState
import net.minecraft.client.renderer.Tessellator import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.tileentity.TileEntity import net.minecraft.tileentity.TileEntity
import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11
object PowerDistributorRenderer extends TileEntitySpecialRenderer { object PowerDistributorRenderer extends TileEntitySpecialRenderer {
override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) = { override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) {
val distributor = tileEntity.asInstanceOf[tileentity.PowerDistributor] val distributor = tileEntity.asInstanceOf[tileentity.PowerDistributor]
if (distributor.globalBuffer > 0) { if (distributor.globalBuffer > 0) {
GL11.glPushAttrib(0xFFFFFF) GL11.glPushAttrib(0xFFFFFF)
@ -24,30 +25,36 @@ object PowerDistributorRenderer extends TileEntitySpecialRenderer {
GL11.glScalef(1.002f, -1.002f, 1.002f) GL11.glScalef(1.002f, -1.002f, 1.002f)
GL11.glTranslatef(-0.5f, -0.5f, -0.5f) GL11.glTranslatef(-0.5f, -0.5f, -0.5f)
bindTexture(TexturePreloader.blockPowerDistributorOn) bindTexture(TextureMap.locationBlocksTexture)
val t = Tessellator.instance val t = Tessellator.instance
t.startDrawingQuads() t.startDrawingQuads()
t.addVertexWithUV(1, 1, 0, 0, 1) val topOn = Blocks.powerDistributor.iconTopOn
t.addVertexWithUV(0, 1, 0, 1, 1) t.addVertexWithUV(0, 0, 1, topOn.getMinU, topOn.getMaxV)
t.addVertexWithUV(0, 0, 0, 1, 0) t.addVertexWithUV(1, 0, 1, topOn.getMaxU, topOn.getMaxV)
t.addVertexWithUV(1, 0, 0, 0, 0) t.addVertexWithUV(1, 0, 0, topOn.getMaxU, topOn.getMinV)
t.addVertexWithUV(0, 0, 0, topOn.getMinU, topOn.getMinV)
t.addVertexWithUV(0, 1, 1, 0, 1) val sideOn = Blocks.powerDistributor.iconSideOn
t.addVertexWithUV(1, 1, 1, 1, 1) t.addVertexWithUV(1, 1, 0, sideOn.getMinU, sideOn.getMaxV)
t.addVertexWithUV(1, 0, 1, 1, 0) t.addVertexWithUV(0, 1, 0, sideOn.getMaxU, sideOn.getMaxV)
t.addVertexWithUV(0, 0, 1, 0, 0) t.addVertexWithUV(0, 0, 0, sideOn.getMaxU, sideOn.getMinV)
t.addVertexWithUV(1, 0, 0, sideOn.getMinU, sideOn.getMinV)
t.addVertexWithUV(1, 1, 1, 0, 1) t.addVertexWithUV(0, 1, 1, sideOn.getMinU, sideOn.getMaxV)
t.addVertexWithUV(1, 1, 0, 1, 1) t.addVertexWithUV(1, 1, 1, sideOn.getMaxU, sideOn.getMaxV)
t.addVertexWithUV(1, 0, 0, 1, 0) t.addVertexWithUV(1, 0, 1, sideOn.getMaxU, sideOn.getMinV)
t.addVertexWithUV(1, 0, 1, 0, 0) t.addVertexWithUV(0, 0, 1, sideOn.getMinU, sideOn.getMinV)
t.addVertexWithUV(0, 1, 0, 0, 1) t.addVertexWithUV(1, 1, 1, sideOn.getMinU, sideOn.getMaxV)
t.addVertexWithUV(0, 1, 1, 1, 1) t.addVertexWithUV(1, 1, 0, sideOn.getMaxU, sideOn.getMaxV)
t.addVertexWithUV(0, 0, 1, 1, 0) t.addVertexWithUV(1, 0, 0, sideOn.getMaxU, sideOn.getMinV)
t.addVertexWithUV(0, 0, 0, 0, 0) t.addVertexWithUV(1, 0, 1, sideOn.getMinU, sideOn.getMinV)
t.addVertexWithUV(0, 1, 0, sideOn.getMinU, sideOn.getMaxV)
t.addVertexWithUV(0, 1, 1, sideOn.getMaxU, sideOn.getMaxV)
t.addVertexWithUV(0, 0, 1, sideOn.getMaxU, sideOn.getMinV)
t.addVertexWithUV(0, 0, 0, sideOn.getMinU, sideOn.getMinV)
t.draw() t.draw()

View File

@ -0,0 +1,60 @@
package li.cil.oc.client.renderer.tileentity
import li.cil.oc.Blocks
import li.cil.oc.common.tileentity
import li.cil.oc.util.RenderState
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.tileentity.TileEntity
import org.lwjgl.opengl.GL11
object RouterRenderer extends TileEntitySpecialRenderer {
override def renderTileEntityAt(tileEntity: TileEntity, x: Double, y: Double, z: Double, f: Float) {
val router = tileEntity.asInstanceOf[tileentity.Router]
val activity = math.max(0, 1 - (System.currentTimeMillis() - router.lastMessage) / 1000.0)
if (activity > 0) {
GL11.glPushAttrib(0xFFFFFF)
RenderState.disableLighting()
RenderState.makeItBlend()
RenderState.setBlendAlpha(activity.toFloat)
GL11.glPushMatrix()
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5)
GL11.glScalef(1.002f, -1.002f, 1.002f)
GL11.glTranslatef(-0.5f, -0.5f, -0.5f)
bindTexture(TextureMap.locationBlocksTexture)
val t = Tessellator.instance
t.startDrawingQuads()
val sideActivity = Blocks.router.iconSideActivity
t.addVertexWithUV(1, 1, 0, sideActivity.getMinU, sideActivity.getMaxV)
t.addVertexWithUV(0, 1, 0, sideActivity.getMaxU, sideActivity.getMaxV)
t.addVertexWithUV(0, 0, 0, sideActivity.getMaxU, sideActivity.getMinV)
t.addVertexWithUV(1, 0, 0, sideActivity.getMinU, sideActivity.getMinV)
t.addVertexWithUV(0, 1, 1, sideActivity.getMinU, sideActivity.getMaxV)
t.addVertexWithUV(1, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV)
t.addVertexWithUV(1, 0, 1, sideActivity.getMaxU, sideActivity.getMinV)
t.addVertexWithUV(0, 0, 1, sideActivity.getMinU, sideActivity.getMinV)
t.addVertexWithUV(1, 1, 1, sideActivity.getMinU, sideActivity.getMaxV)
t.addVertexWithUV(1, 1, 0, sideActivity.getMaxU, sideActivity.getMaxV)
t.addVertexWithUV(1, 0, 0, sideActivity.getMaxU, sideActivity.getMinV)
t.addVertexWithUV(1, 0, 1, sideActivity.getMinU, sideActivity.getMinV)
t.addVertexWithUV(0, 1, 0, sideActivity.getMinU, sideActivity.getMaxV)
t.addVertexWithUV(0, 1, 1, sideActivity.getMaxU, sideActivity.getMaxV)
t.addVertexWithUV(0, 0, 1, sideActivity.getMaxU, sideActivity.getMinV)
t.addVertexWithUV(0, 0, 0, sideActivity.getMinU, sideActivity.getMinV)
t.draw()
GL11.glPopMatrix()
GL11.glPopAttrib()
}
}
}

View File

@ -22,6 +22,7 @@ object PacketType extends Enumeration {
RobotSelectedSlotChange, RobotSelectedSlotChange,
RobotXp, RobotXp,
RotatableState, RotatableState,
RouterActivity,
ScreenColorChange, ScreenColorChange,
ScreenCopy, ScreenCopy,
ScreenDepthChange, ScreenDepthChange,

View File

@ -9,7 +9,7 @@ import li.cil.oc.{OpenComputers, Settings}
import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor} import mcp.mobius.waila.api.{IWailaConfigHandler, IWailaDataAccessor}
import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.client.renderer.texture.IconRegister
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.{EnumRarity, ItemStack} import net.minecraft.item.{ItemDye, EnumRarity, ItemStack}
import net.minecraft.util.{StatCollector, Icon} import net.minecraft.util.{StatCollector, Icon}
import net.minecraft.world.IBlockAccess import net.minecraft.world.IBlockAccess
import net.minecraft.world.World import net.minecraft.world.World
@ -105,19 +105,19 @@ object Case {
class Tier1(parent: SimpleDelegator) extends Case(parent) { class Tier1(parent: SimpleDelegator) extends Case(parent) {
def tier = 0 def tier = 0
override def color = 0x7F7F7F override def color = ItemDye.dyeColors(ItemDye.dyeColorNames.indexOf("silver"))
} }
class Tier2(parent: SimpleDelegator) extends Case(parent) { class Tier2(parent: SimpleDelegator) extends Case(parent) {
def tier = 1 def tier = 1
override def color = 0xFFFF66 override def color = 0xFFFF66 // ItemDye.dyeColors(ItemDye.dyeColorNames.indexOf("yellow"))
} }
class Tier3(parent: SimpleDelegator) extends Case(parent) { class Tier3(parent: SimpleDelegator) extends Case(parent) {
def tier = 2 def tier = 2
override def color = 0x66FFFF override def color = 0x66FFFF // ItemDye.dyeColors(ItemDye.dyeColorNames.indexOf("lightBlue"))
} }
} }

View File

@ -20,7 +20,8 @@ class Charger(val parent: SimpleDelegator) extends RedstoneAware with SimpleDele
val unlocalizedName = "Charger" val unlocalizedName = "Charger"
private val icons = Array.fill[Icon](6)(null) private val icons = Array.fill[Icon](6)(null)
private val iconsCharging = Array.fill[Icon](6)(null) var iconFrontCharging: Icon = _
var iconSideCharging: Icon = _
override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) {
tooltip.addAll(Tooltip.get(unlocalizedName)) tooltip.addAll(Tooltip.get(unlocalizedName))
@ -40,28 +41,19 @@ class Charger(val parent: SimpleDelegator) extends RedstoneAware with SimpleDele
override def icon(side: ForgeDirection) = Some(icons(side.ordinal())) override def icon(side: ForgeDirection) = Some(icons(side.ordinal()))
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
override def icon(world: IBlockAccess, x: Int, y: Int, z: Int, worldSide: ForgeDirection, localSide: ForgeDirection) = override def icon(world: IBlockAccess, x: Int, y: Int, z: Int, worldSide: ForgeDirection, localSide: ForgeDirection) = Some(icons(localSide.ordinal()))
world.getBlockTileEntity(x, y, z) match {
case charger: tileentity.Charger if charger.chargeSpeed > 0 => Some(iconsCharging(localSide.ordinal()))
case _ => Some(icons(localSide.ordinal()))
}
override def registerIcons(iconRegister: IconRegister) = { override def registerIcons(iconRegister: IconRegister) = {
icons(ForgeDirection.DOWN.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":generic_top") icons(ForgeDirection.DOWN.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":generic_top")
icons(ForgeDirection.UP.ordinal) = icons(ForgeDirection.DOWN.ordinal) icons(ForgeDirection.UP.ordinal) = icons(ForgeDirection.DOWN.ordinal)
icons(ForgeDirection.NORTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":charger") icons(ForgeDirection.NORTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":charger_side")
icons(ForgeDirection.SOUTH.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.SOUTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":charger_front")
icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
iconsCharging(ForgeDirection.DOWN.ordinal) = icons(ForgeDirection.DOWN.ordinal) iconFrontCharging = iconRegister.registerIcon(Settings.resourceDomain + ":charger_front_on")
iconsCharging(ForgeDirection.UP.ordinal) = icons(ForgeDirection.UP.ordinal) iconSideCharging = iconRegister.registerIcon(Settings.resourceDomain + ":charger_side_on")
iconsCharging(ForgeDirection.NORTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":charger_on")
iconsCharging(ForgeDirection.SOUTH.ordinal) = iconsCharging(ForgeDirection.NORTH.ordinal)
iconsCharging(ForgeDirection.WEST.ordinal) = iconsCharging(ForgeDirection.NORTH.ordinal)
iconsCharging(ForgeDirection.EAST.ordinal) = iconsCharging(ForgeDirection.NORTH.ordinal)
} }
override def createTileEntity(world: World) = Some(new tileentity.Charger()) override def createTileEntity(world: World) = Some(new tileentity.Charger())

View File

@ -46,10 +46,8 @@ class Item(id: Int) extends ItemBlock(id) {
keyboard.setFromFacing(ForgeDirection.getOrientation(side)) keyboard.setFromFacing(ForgeDirection.getOrientation(side))
case rotatable: tileentity.traits.Rotatable => case rotatable: tileentity.traits.Rotatable =>
rotatable.setFromEntityPitchAndYaw(player) rotatable.setFromEntityPitchAndYaw(player)
rotatable match { if (!rotatable.validFacings.contains(rotatable.pitch)) {
case _@(_: tileentity.traits.Computer | _: tileentity.DiskDrive | _: tileentity.Rack) => rotatable.pitch = rotatable.validFacings.headOption.getOrElse(ForgeDirection.NORTH)
rotatable.pitch = ForgeDirection.NORTH
case _ =>
} }
if (!rotatable.isInstanceOf[tileentity.RobotProxy]) { if (!rotatable.isInstanceOf[tileentity.RobotProxy]) {
rotatable.invertRotation() rotatable.invertRotation()

View File

@ -15,6 +15,8 @@ class PowerDistributor(val parent: SimpleDelegator) extends SimpleDelegate {
val unlocalizedName = "PowerDistributor" val unlocalizedName = "PowerDistributor"
private val icons = Array.fill[Icon](6)(null) private val icons = Array.fill[Icon](6)(null)
var iconSideOn: Icon = _
var iconTopOn: Icon = _
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
@ -26,12 +28,15 @@ class PowerDistributor(val parent: SimpleDelegator) extends SimpleDelegate {
override def registerIcons(iconRegister: IconRegister) = { override def registerIcons(iconRegister: IconRegister) = {
icons(ForgeDirection.DOWN.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":generic_top") icons(ForgeDirection.DOWN.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":generic_top")
icons(ForgeDirection.UP.ordinal) = icons(ForgeDirection.DOWN.ordinal) icons(ForgeDirection.UP.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":power_distributor_top")
icons(ForgeDirection.NORTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":power_distributor") icons(ForgeDirection.NORTH.ordinal) = iconRegister.registerIcon(Settings.resourceDomain + ":power_distributor_side")
icons(ForgeDirection.SOUTH.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.SOUTH.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
iconSideOn = iconRegister.registerIcon(Settings.resourceDomain + ":power_distributor_side_on")
iconTopOn = iconRegister.registerIcon(Settings.resourceDomain + ":power_distributor_top_on")
} }
override def luminance(world: IBlockAccess, x: Int, y: Int, z: Int) = 5 override def luminance(world: IBlockAccess, x: Int, y: Int, z: Int) = 5

View File

@ -16,6 +16,8 @@ class Router(val parent: SimpleDelegator) extends SimpleDelegate {
private val icons = Array.fill[Icon](6)(null) private val icons = Array.fill[Icon](6)(null)
var iconSideActivity: Icon = _
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) {
@ -32,6 +34,8 @@ class Router(val parent: SimpleDelegator) extends SimpleDelegate {
icons(ForgeDirection.SOUTH.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.SOUTH.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.WEST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal) icons(ForgeDirection.EAST.ordinal) = icons(ForgeDirection.NORTH.ordinal)
iconSideActivity = iconRegister.registerIcon(Settings.resourceDomain + ":router_side_active")
} }
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //

View File

@ -9,7 +9,7 @@ import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.ChatMessageComponent import net.minecraft.util.ChatMessageComponent
import net.minecraftforge.common.ForgeDirection import net.minecraftforge.common.ForgeDirection
class Charger extends traits.Environment with traits.RedstoneAware with Analyzable { class Charger extends traits.Environment with traits.RedstoneAware with traits.Rotatable with Analyzable {
val node = api.Network.newNode(this, Visibility.None). val node = api.Network.newNode(this, Visibility.None).
withConnector(). withConnector().
create() create()

View File

@ -12,6 +12,8 @@ import net.minecraftforge.common.ForgeDirection
class Keyboard(isRemote: Boolean) extends traits.Environment with traits.Rotatable with SidedEnvironment with Analyzable { class Keyboard(isRemote: Boolean) extends traits.Environment with traits.Rotatable with SidedEnvironment with Analyzable {
def this() = this(false) def this() = this(false)
override def validFacings = ForgeDirection.VALID_DIRECTIONS
val keyboard = if (isRemote) null val keyboard = if (isRemote) null
else new component.Keyboard { else new component.Keyboard {
override def isUseableByPlayer(p: EntityPlayer) = override def isUseableByPlayer(p: EntityPlayer) =

View File

@ -4,10 +4,14 @@ import cpw.mods.fml.common.{Loader, Optional}
import dan200.computer.api.{ILuaContext, IComputerAccess, IPeripheral} import dan200.computer.api.{ILuaContext, IComputerAccess, IPeripheral}
import li.cil.oc.api import li.cil.oc.api
import li.cil.oc.api.network.{Packet, Message} import li.cil.oc.api.network.{Packet, Message}
import li.cil.oc.server.PacketSender
import net.minecraftforge.common.ForgeDirection
import scala.collection.mutable import scala.collection.mutable
@Optional.Interface(iface = "dan200.computer.api.IPeripheral", modid = "ComputerCraft") @Optional.Interface(iface = "dan200.computer.api.IPeripheral", modid = "ComputerCraft")
class Router extends traits.Hub with traits.NotAnalyzable with IPeripheral { class Router extends traits.Hub with traits.NotAnalyzable with IPeripheral {
var lastMessage = 0L
private val computers = mutable.ArrayBuffer.empty[AnyRef] private val computers = mutable.ArrayBuffer.empty[AnyRef]
private val openPorts = mutable.Map.empty[AnyRef, mutable.Set[Int]] private val openPorts = mutable.Map.empty[AnyRef, mutable.Set[Int]]
@ -86,6 +90,15 @@ class Router extends traits.Hub with traits.NotAnalyzable with IPeripheral {
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
override protected def relayPacket(sourceSide: ForgeDirection, packet: Packet) {
super.relayPacket(sourceSide, packet)
val now = System.currentTimeMillis()
if (now - lastMessage > 250) {
lastMessage = now
PacketSender.sendRouterActivity(this)
}
}
override protected def onPlugMessage(plug: Plug, message: Message) { override protected def onPlugMessage(plug: Plug, message: Message) {
super.onPlugMessage(plug, message) super.onPlugMessage(plug, message)
if (message.name == "network.message" && Loader.isModLoaded("ComputerCraft")) { if (message.name == "network.message" && Loader.isModLoaded("ComputerCraft")) {

View File

@ -22,6 +22,8 @@ class Screen(var tier: Int) extends traits.TextBuffer with SidedEnvironment with
_isOutputEnabled = true _isOutputEnabled = true
override def validFacings = ForgeDirection.VALID_DIRECTIONS
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
override protected val _buffer = new component.Buffer(this) { override protected val _buffer = new component.Buffer(this) {

View File

@ -149,6 +149,8 @@ trait Rotatable extends RotationAware with api.Rotatable {
override def toGlobal(value: ForgeDirection) = cachedInverseTranslation(value.ordinal) override def toGlobal(value: ForgeDirection) = cachedInverseTranslation(value.ordinal)
def validFacings = Array(ForgeDirection.NORTH, ForgeDirection.SOUTH, ForgeDirection.WEST, ForgeDirection.EAST)
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
protected def onRotationChanged() { protected def onRotationChanged() {
@ -165,8 +167,12 @@ trait Rotatable extends RotationAware with api.Rotatable {
override def readFromNBT(nbt: NBTTagCompound) = { override def readFromNBT(nbt: NBTTagCompound) = {
super.readFromNBT(nbt) super.readFromNBT(nbt)
pitch = ForgeDirection.getOrientation(nbt.getInteger(Settings.namespace + "pitch")) if (nbt.hasKey(Settings.namespace + "pitch")) {
yaw = ForgeDirection.getOrientation(nbt.getInteger(Settings.namespace + "yaw")) pitch = ForgeDirection.getOrientation(nbt.getInteger(Settings.namespace + "pitch"))
}
if (nbt.hasKey(Settings.namespace + "yaw")) {
yaw = ForgeDirection.getOrientation(nbt.getInteger(Settings.namespace + "yaw"))
}
validatePitchAndYaw() validatePitchAndYaw()
updateTranslation() updateTranslation()
} }

View File

@ -198,6 +198,14 @@ object PacketSender {
pb.sendToNearbyPlayers(t) pb.sendToNearbyPlayers(t)
} }
def sendRouterActivity(t: tileentity.Router) {
val pb = new PacketBuilder(PacketType.RouterActivity)
pb.writeTileEntity(t)
pb.sendToNearbyPlayers(t, 64)
}
def sendScreenColorChange(b: common.component.Buffer, foreground: Int, background: Int) { def sendScreenColorChange(b: common.component.Buffer, foreground: Int, background: Int) {
val pb = new PacketBuilder(PacketType.ScreenColorChange) val pb = new PacketBuilder(PacketType.ScreenColorChange)

View File

@ -465,7 +465,7 @@ object Network extends api.detail.NetworkAPI {
override def newPacket(nbt: NBTTagCompound) = { override def newPacket(nbt: NBTTagCompound) = {
val source = nbt.getString("source") val source = nbt.getString("source")
val destination = val destination =
if (nbt.getBoolean("broadcast")) null if (nbt.hasKey("dest")) null
else nbt.getString("dest") else nbt.getString("dest")
val port = nbt.getInteger("port") val port = nbt.getInteger("port")
val ttl = nbt.getInteger("ttl") val ttl = nbt.getInteger("ttl")
@ -596,8 +596,7 @@ object Network extends api.detail.NetworkAPI {
override def save(nbt: NBTTagCompound) { override def save(nbt: NBTTagCompound) {
nbt.setString("source", source) nbt.setString("source", source)
nbt.setBoolean("broadcast", destination.isEmpty) if (destination != null && !destination.isEmpty) {
if (destination != null) {
nbt.setString("dest", destination) nbt.setString("dest", destination)
} }
nbt.setInteger("port", port) nbt.setInteger("port", port)